Home Center 2 och SONOS

Utvecklar du en smartphone-app? Datorprogramvara? Få hjälp av andra och bidra med dina egna erfaranheter.
Post Reply
forumadmin
Site Admin
Posts: 276
Joined: 10 Dec 2011, 11:43
12

Hej,
Här kommer kodsnuttar för uppspelningsfunktionerna i SONOS, både som LUA och TCP

Börja med att skapa en virtuell enhet med IP till din SONOS-enhet och port 1400.

TCP:

Play

Code: Select all

POST /MediaRenderer/AVTransport/Control HTTP/1.1 
Content-Length: 266 
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Play" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:Play></s:Body></s:Envelope>0x0D0x0A0x0D0x0A
Pause

Code: Select all

POST /MediaRenderer/AVTransport/Control HTTP/1.1 
Content-Length: 267 
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Pause" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Pause xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:Pause></s:Body></s:Envelope>0x0D0x0A0x0D0x0A 
Stop

Code: Select all

POST /MediaRenderer/AVTransport/Control HTTP/1.1 
Content-Length: 266 
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Stop" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Stop xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:Stop></s:Body></s:Envelope>0x0D0x0A0x0D0x0A 
Previous

Code: Select all

POST /MediaRenderer/AVTransport/Control HTTP/1.1 
Content-Length: 270 
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Previous" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Previous xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:Previous></s:Body></s:Envelope>0x0D0x0A0x0D0x0A 
Next

Code: Select all

POST /MediaRenderer/AVTransport/Control HTTP/1.1 
Content-Length: 266 
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Next" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Next xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><Speed>1</Speed></u:Next></s:Body></s:Envelope>0x0D0x0A0x0D0x0A 
Mute

Code: Select all

POST /MediaRenderer/RenderingControl/Control HTTP/1.1 
Content-Length: 314 
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetMute" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>1</DesiredMute></u:SetMute></s:Body></s:Envelope>0x0D0x0A0x0D0x0A 
Unmute

Code: Select all

POST /MediaRenderer/RenderingControl/Control HTTP/1.1 
Content-Length: 314 
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetMute" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetMute xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredMute>0</DesiredMute></u:SetMute></s:Body></s:Envelope>0x0D0x0A0x0D0x0A 
Volym

Code: Select all

POST /MediaRenderer/RenderingControl/Control HTTP/1.1 
Content-Length: 324 
SOAPACTION: "urn:schemas-upnp-org:service:RenderingControl:1#SetVolume" 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetVolume xmlns:u="urn:schemas-upnp-org:service:RenderingControl:1"><InstanceID>0</InstanceID><Channel>Master</Channel><DesiredVolume>_sliderValue_</DesiredVolume></u:SetVolume></s:Body></s:Envelope>0x0D0x0A0x0D0x0A
LUA:
(Glöm inte att ändra till rätt IP-adress i början på varje kommando nedan)

Play

Code: Select all

local IPaddress = '192.168.x.xx' 
local action = "Play" 
local server_url = IPaddress .. ':1400/MediaRenderer/AVTransport/Control' 
local servicetype = 'urn:schemas-upnp-org:service:AVTransport:1' 
local arguments = '<InstanceID>0</InstanceID>,<Speed>1</Speed>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 
local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
a = os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url)
Stop

Code: Select all

local IPaddress = '192.168.x.xx' 
local action = "Stop" 
local server_url = IPaddress .. ':1400/MediaRenderer/AVTransport/Control' 
local servicetype = 'urn:schemas-upnp-org:service:AVTransport:1' 
local arguments = '<InstanceID>0</InstanceID>,<Speed>1</Speed>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 
local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
a = os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url)
Pause

Code: Select all

local IPaddress = '192.168.x.xx' 
local action = "Pause" 
local server_url = IPaddress .. ':1400/MediaRenderer/AVTransport/Control' 
local servicetype = 'urn:schemas-upnp-org:service:AVTransport:1' 
local arguments = '<InstanceID>0</InstanceID>,<Speed>1</Speed>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 
local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
a = os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url)
Next

Code: Select all

local IPaddress = '192.168.x.xx' 
local action = "Next" 
local server_url = IPaddress .. ':1400/MediaRenderer/AVTransport/Control' 
local servicetype = 'urn:schemas-upnp-org:service:AVTransport:1' 
local arguments = '<InstanceID>0</InstanceID>,<Speed>1</Speed>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 
local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
a = os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url)
Previous

Code: Select all

local IPaddress = '192.168.x.xx' 
local action = "Previous" 
local server_url = IPaddress .. ':1400/MediaRenderer/AVTransport/Control' 
local servicetype = 'urn:schemas-upnp-org:service:AVTransport:1' 
local arguments = '<InstanceID>0</InstanceID>,<Speed>1</Speed>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 
local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
a = os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url)
Mute

Code: Select all

local IPaddress = '192.168.x.xx' 
local DesiredMute = "1" 
local action = "SetMute" 
local server_url = IPaddress .. ':1400/MediaRenderer/RenderingControl/Control' 
local servicetype = 'urn:schemas-upnp-org:service:RenderingControl:1' 
local arguments = '<InstanceID>0</InstanceID>,<Channel>Master</Channel>,<DesiredMute>' .. DesiredMute .. '</DesiredMute>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 

local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url )
Unmute

Code: Select all

local IPaddress = '192.168.x.xx' 
local DesiredMute = "0" 
local action = "SetMute" 
local server_url = IPaddress .. ':1400/MediaRenderer/RenderingControl/Control' 
local servicetype = 'urn:schemas-upnp-org:service:RenderingControl:1' 
local arguments = '<InstanceID>0</InstanceID>,<Channel>Master</Channel>,<DesiredMute>' .. DesiredMute .. '</DesiredMute>' 
local req = '<?xml version="1.0" encoding="utf-8"?>' .. 
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' .. 
'<s:Body>' .. 
'<u:' .. action .. ' xmlns:u="' .. servicetype .. '">' .. arguments .. 
'</u:' .. action .. '>' .. 
'</s:Body>' .. 
'</s:Envelope>' 

local file_req = io.open( "/tmp/req.lua", "w" ) 
file_req:write( req ) 
file_req:close() 
os.execute ('curl -s -X POST -H "SOAPAction: ' .. servicetype .. '#' .. action .. '" -d @/tmp/req.lua ' .. server_url )
jens
Medlem
Posts: 329
Joined: 22 Apr 2013, 17:09
10

Har klistrat in ett comando (Play) inget händer vad kan det vara för fel?
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Jonas, hur ser din konfig ut beträffande din virtuella knapp? Ge oss lite skärmdumpar så kan vi se om du har konfigurerat det rätt.
jens
Medlem
Posts: 329
Joined: 22 Apr 2013, 17:09
10

Så här ser koden ut för Play till Sonos
Skärmavbild 2013-05-05 kl. 09.20.48.png
Skärmavbild 2013-05-05 kl. 09.20.48.png (444.33 KiB) Viewed 26184 times
Skärmavbild 2013-05-05 kl. 09.20.55.png
Skärmavbild 2013-05-05 kl. 09.20.55.png (452.77 KiB) Viewed 26184 times
c14ym0re
Ny medlem
Posts: 9
Joined: 04 May 2013, 20:30
10

Jens, det är enormt viktigt, om du nu klistrar in koden rätt av, att det INTE kommer med några extra tecken/mellanslag i det du klistrat in.
Kika i slutet på alla rader, så ligger det säkerligen ett extra mellanslag där, ta bort det, så kommer det lira.

OBS, det verkar dock som att endast TCP fungerar i nuvarande version dock.
jens
Medlem
Posts: 329
Joined: 22 Apr 2013, 17:09
10

Hej, har inte lyckats få igång detta ännu, tänkte jag skulle få fart på det nu... Hjälp önska :)
PatrikB
Medlem
Posts: 29
Joined: 05 Sep 2012, 08:24
11
Location: Kullavik, Göteborg

Hej,

Kanon tack för dessa script (TCP) fungerar klockrent. LUA har jag inte testat.

Tipset att kontrollera sista tecknet på varje rad och se till att det inte ligger något mellanslag där gjorde susen. :)

Nu till mitt lilla "problem".

Tycker volym reglaget är lite oprecist, skulle gärna vilja ha en knapp som säger "Volym +" samt "Volym -"

Hur kan man skapa detta?

/Patrik
jens
Medlem
Posts: 329
Joined: 22 Apr 2013, 17:09
10

Hej För er som har problem med att få detta att fungera, på grund av mellanslag när man klistrar in den i HC2, kommer här ett program som jag använt (för windows) klistra in det i detta program och tag bort mellanrummen och sen in i HC2, funkar mycket bra...

http://notepad-plus-plus.org/

Lycka till...
Dukis
Ny medlem
Posts: 4
Joined: 19 Feb 2014, 12:55
10

Det här är ju pinsamt men jag kan inte för mitt liv få NÅGON av koderna att fungera i min HC2 och nu pratar vi ett gäng olika från en hög med forum.
Jag har följt alla tricks och tagit bort de mellanrum som copy/paste envisas med att lägga till, testat som LUA och string.
Jag har även koll på IP och Port till min Sonos (1440 eller hur...?) då jag kommer åt status tex via http från sonosen

Det är inte möjligtvis så att min Play1 enhet inte stöds på något sätt och man behöver en större modell alternativt Bridge?
Som test gör jag en simpel stop knapp, spelar musik från iphone / datorn och försöker stoppa utan resultat...

Alla andra enheter behöver man ju matcha mot systemet så inte vem som helst har kontroll, hur vet Sonos att den ska godkänna koder från tex HC2?
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Ska det inte vara port 1400?
Det står så i första posten i denna tråd

Skickat från min GT-I9100 via Tapatalk 2
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
Dukis
Ny medlem
Posts: 4
Joined: 19 Feb 2014, 12:55
10

typo från min sida, menade 1400 och den hatar även det... :)

edit:
Meh, en omstart av hc2 och sonos löste det... En hel kväll bortspolad rofl
KristianO
Medlem
Posts: 461
Joined: 10 Mar 2014, 09:50
10

Hut får man sonos Volym att fungera med LUA? Något nytt med slidern i 4.x? Min funkar inte alls....


Sent from my iPhone using Tapatalk
bobthebob
Medlem
Posts: 29
Joined: 24 Nov 2013, 18:14
10

Och volym +, - och "value" hade varit najs.
KristianO
Medlem
Posts: 461
Joined: 10 Mar 2014, 09:50
10

Testar Sonos via LUA men får följande fel:
[ERROR] 13:38:40: line 14: attempt to index global 'io' (a nil value)

Rad14 -> local file_req = io.open( "req.lua", "w" )

Har man ändrat något runt req.lua i version 4?

Det enda jag vill göra är att köra en mp3-fil (som ligger på min web-server) till mina Sonos
Post Reply