Step by step guide: Sonos integration

In this subforum you can show projects you have made, or you are busy with. Please create your own topic.

Moderator: leecollings

Holland
Posts: 179
Joined: Friday 12 July 2013 13:53
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta Ch
Location: The Netherlands
Contact:

Re: Step by step guide: Sonos integration

Post by Holland »

So the http api is running fine. You are running a recent version of the http api. Just to be sure, I made a few changes to the lua code, can you try the most recent version, see below.

Code: Select all

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()

local sonos=assert(io.popen('curl http://ip:5005/eetkamer/state'))
local status = sonos:read('*all')
sonos:close()
local jsonStatus = json:decode(status)

local tv_woonkamer_status = 'TV Woonkamer System Alive'
local sonos_woonkamer = 'Sonos Woonkamer/Eetkamer'

--print("Eerste JSON stappen met LUA")
--print(status)
print(jsonStatus)

playbackState = jsonStatus['playbackState']
artist = jsonStatus['currentTrack']['artist']
title = jsonStatus['currentTrack']['title']
album = jsonStatus['currentTrack']['album']
type = jsonStatus['currentTrack']['type']
--streaminfo = jsonStatus['currentTrack']['streamInfo']
	
commandArray = {}

if (playbackState == "STOPPED" or playbackState == "PAUSED_PLAYBACK" or playbackState == "PLAYING") then
	if (playbackState == "PLAYING") then
		if type == "radio" then
			print('Woonkamer/Eetkamer Sonos status: ' ..playbackState.. ' ' ..type.. ' Titel: '..title)
		else
			if artist ~= nil then
				print('Badkamer Sonos status: ' ..playbackState.. ' Artiest: ' ..artist.. ' Titel: '..title)
			else
				print('Badkamer Sonos status: ' ..playbackState.. ' Titel: '..title)
			end	
		end
		if (uservariables["SonosWoonkamerStatus"] == "PAUSED") then
			commandArray['Variable:SonosWoonkamerStatus']='PLAYING'
			print("Uservar SonosWoonkamer updated to PLAYING")
		end
	end
	if (playbackState == "STOPPED" or playbackState == "PAUSED_PLAYBACK") then
		print('Woonkamer/Eetkamer Sonos Status: ' ..playbackState)
		if (uservariables["SonosWoonkamerStatus"] == "PLAYING") then
			commandArray['Variable:SonosWoonkamerStatus']='PAUSED'
			print("Uservar SonosWoonkamer updated to PAUSED")
		end	
	end
else
	--print("2")
	print('<font color="red">Woonkamer/Eetkamer: SONOS-HTTP-API is off-line</font>')
end	

if (playbackState == "STOPPED" or playbackState == "PAUSED_PLAYBACK") then
	switch_status_sonos_woonkamer_eetkamer = otherdevices["Sonos Woonkamer/Eetkamer"]
	print('Sonos Woonkamer/Eetkamer Switch Status: ' ..switch_status_sonos_woonkamer_eetkamer)
	if otherdevices["Sonos Woonkamer/Eetkamer"] == 'Pauze' then
		print('Sonos Woonkamer/Eetkamer Switch Status is correct, should be PAUZE: ' ..switch_status_sonos_woonkamer_eetkamer)
	else
		print('Sonos Woonkamer/Eetkamer Switch Status not correct, should be PAUZE: ' ..switch_status_sonos_woonkamer_eetkamer)
		commandArray['UpdateDevice'] = '43|20|20'
	end
end	

if (playbackState == "PLAYING") then
	switch_status_sonos_woonkamer_eetkamer = otherdevices["Sonos Woonkamer/Eetkamer"]
	print('Sonos Woonkamer/Eetkamer Switch Status: ' ..switch_status_sonos_woonkamer_eetkamer)
	if otherdevices["Sonos Woonkamer/Eetkamer"] == 'Play' then
		print('Sonos Woonkamer/Eetkamer Switch Status is correct, should be PLAY: ' ..switch_status_sonos_woonkamer_eetkamer)
	else
		print('Sonos Woonkamer/Eetkamer Switch Status not correct, should be PLAY: ' ..switch_status_sonos_woonkamer_eetkamer)
		commandArray['UpdateDevice'] = '43|10|10'
	end
end	

if devicechanged[tv_woonkamer_status] == 'On' then 
 	print("TV Woonkamer is net aangezet, status Sonos Woonkamer onderzoeken")
	if (playerstate == "PLAYING" or playbackState == "PLAYING") then
		print("Sonos woonkamer heeft status PLAYING, Sonos Woonkamer/Eetkamer wordt uitgeschakeld")
		commandArray[sonos_woonkamer]='Set Level 20'
	end	
end


return commandArray
markiemajax
Posts: 17
Joined: Monday 18 May 2015 15:45
Target OS: Raspberry Pi / ODroid
Domoticz version: 3.4834
Contact:

Re: Step by step guide: Sonos integration

Post by markiemajax »

Hello,

I changed the lua to yours.
I changed:
- ip to the ip of my domoticz (http://10.100.75.113:5005/woonkamer/state)
- line 32, i changed badkamer to Woonkamer/Eetkamer

I get this message in de log:
2017-03-20 08:06:16.879 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_device_sonos_tv_woonkamer.lua: ...omoticz/scripts/lua/script_device_sonos_tv_woonkamer.lua:32: attempt to concatenate global 'title' (a nil value)

Is the number "32"' the line where the error is?
2017-03-20 16_04_23-10.100.75.113_5005_woonkamer_state.png
2017-03-20 16_04_23-10.100.75.113_5005_woonkamer_state.png (20.37 KiB) Viewed 7077 times
2017-03-20 16_03_58-Domoticz.png
2017-03-20 16_03_58-Domoticz.png (49.84 KiB) Viewed 7077 times
Holland wrote:So the http api is running fine. You are running a recent version of the http api. Just to be sure, I made a few changes to the lua code, can you try the most recent version, see below.

Code: Select all

json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()

local sonos=assert(io.popen('curl http://ip:5005/eetkamer/state'))
local status = sonos:read('*all')
sonos:close()
local jsonStatus = json:decode(status)

local tv_woonkamer_status = 'TV Woonkamer System Alive'
local sonos_woonkamer = 'Sonos Woonkamer/Eetkamer'

--print("Eerste JSON stappen met LUA")
--print(status)
print(jsonStatus)

playbackState = jsonStatus['playbackState']
artist = jsonStatus['currentTrack']['artist']
title = jsonStatus['currentTrack']['title']
album = jsonStatus['currentTrack']['album']
type = jsonStatus['currentTrack']['type']
--streaminfo = jsonStatus['currentTrack']['streamInfo']
	
commandArray = {}

if (playbackState == "STOPPED" or playbackState == "PAUSED_PLAYBACK" or playbackState == "PLAYING") then
	if (playbackState == "PLAYING") then
		if type == "radio" then
			print('Woonkamer/Eetkamer Sonos status: ' ..playbackState.. ' ' ..type.. ' Titel: '..title)
		else
			if artist ~= nil then
				print('Badkamer Sonos status: ' ..playbackState.. ' Artiest: ' ..artist.. ' Titel: '..title)
			else
				print('Badkamer Sonos status: ' ..playbackState.. ' Titel: '..title)
			end	
		end
		if (uservariables["SonosWoonkamerStatus"] == "PAUSED") then
			commandArray['Variable:SonosWoonkamerStatus']='PLAYING'
			print("Uservar SonosWoonkamer updated to PLAYING")
		end
	end
	if (playbackState == "STOPPED" or playbackState == "PAUSED_PLAYBACK") then
		print('Woonkamer/Eetkamer Sonos Status: ' ..playbackState)
		if (uservariables["SonosWoonkamerStatus"] == "PLAYING") then
			commandArray['Variable:SonosWoonkamerStatus']='PAUSED'
			print("Uservar SonosWoonkamer updated to PAUSED")
		end	
	end
else
	--print("2")
	print('<font color="red">Woonkamer/Eetkamer: SONOS-HTTP-API is off-line</font>')
end	

if (playbackState == "STOPPED" or playbackState == "PAUSED_PLAYBACK") then
	switch_status_sonos_woonkamer_eetkamer = otherdevices["Sonos Woonkamer/Eetkamer"]
	print('Sonos Woonkamer/Eetkamer Switch Status: ' ..switch_status_sonos_woonkamer_eetkamer)
	if otherdevices["Sonos Woonkamer/Eetkamer"] == 'Pauze' then
		print('Sonos Woonkamer/Eetkamer Switch Status is correct, should be PAUZE: ' ..switch_status_sonos_woonkamer_eetkamer)
	else
		print('Sonos Woonkamer/Eetkamer Switch Status not correct, should be PAUZE: ' ..switch_status_sonos_woonkamer_eetkamer)
		commandArray['UpdateDevice'] = '43|20|20'
	end
end	

if (playbackState == "PLAYING") then
	switch_status_sonos_woonkamer_eetkamer = otherdevices["Sonos Woonkamer/Eetkamer"]
	print('Sonos Woonkamer/Eetkamer Switch Status: ' ..switch_status_sonos_woonkamer_eetkamer)
	if otherdevices["Sonos Woonkamer/Eetkamer"] == 'Play' then
		print('Sonos Woonkamer/Eetkamer Switch Status is correct, should be PLAY: ' ..switch_status_sonos_woonkamer_eetkamer)
	else
		print('Sonos Woonkamer/Eetkamer Switch Status not correct, should be PLAY: ' ..switch_status_sonos_woonkamer_eetkamer)
		commandArray['UpdateDevice'] = '43|10|10'
	end
end	

if devicechanged[tv_woonkamer_status] == 'On' then 
 	print("TV Woonkamer is net aangezet, status Sonos Woonkamer onderzoeken")
	if (playerstate == "PLAYING" or playbackState == "PLAYING") then
		print("Sonos woonkamer heeft status PLAYING, Sonos Woonkamer/Eetkamer wordt uitgeschakeld")
		commandArray[sonos_woonkamer]='Set Level 20'
	end	
end


return commandArray
markiemajax
Posts: 17
Joined: Monday 18 May 2015 15:45
Target OS: Raspberry Pi / ODroid
Domoticz version: 3.4834
Contact:

Re: Step by step guide: Sonos integration

Post by markiemajax »

Hello,

I found out that the error is only when the sonos is active. If it is in pause, there is no error.

The switch is not reacting to the sonos. It stays in pause.

Can anyone tell me how to resolve this?
Holland
Posts: 179
Joined: Friday 12 July 2013 13:53
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta Ch
Location: The Netherlands
Contact:

Re: Step by step guide: Sonos integration

Post by Holland »

The reason that it errors out is that your stream or mp3 does not contain any meta data.

About the selector switch, the first value should be changed into your idx of the sonos switch
markiemajax
Posts: 17
Joined: Monday 18 May 2015 15:45
Target OS: Raspberry Pi / ODroid
Domoticz version: 3.4834
Contact:

Re: Step by step guide: Sonos integration

Post by markiemajax »

Hello,

Thanx. What value do you mean?

Holland wrote:The reason that it errors out is that your stream or mp3 does not contain any meta data.

About the selector switch, the first value should be changed into your idx of the sonos switch
Holland
Posts: 179
Joined: Friday 12 July 2013 13:53
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta Ch
Location: The Netherlands
Contact:

Re: Step by step guide: Sonos integration

Post by Holland »

commandArray['UpdateDevice'] = '43|10|10'
Heursqem
Posts: 18
Joined: Sunday 20 March 2016 14:31
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Heursqem »

This is what I would love to achieve

#1 - Someone pushes my doorbell
#2 - I capture the current state of my sonos player (medium, song, volume etc) and save this for later
#3 - I play my own sound through the sonos player (ding-dong)
#4 - I go back to to captured/saved state and listen to original music again

Would all of this be possible with this solution?
Holland
Posts: 179
Joined: Friday 12 July 2013 13:53
Target OS: Raspberry Pi / ODroid
Domoticz version: Beta Ch
Location: The Netherlands
Contact:

Re: Step by step guide: Sonos integration

Post by Holland »

Try this, just an example, but it does the trick :lol:


http://ip of raspberry running sonos http api:5005/name of sonos player/say/dingdong/nl
FaddieB
Posts: 2
Joined: Friday 28 April 2017 11:58
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by FaddieB »

Heursqem wrote:This is what I would love to achieve

#1 - Someone pushes my doorbell
#2 - I capture the current state of my sonos player (medium, song, volume etc) and save this for later
#3 - I play my own sound through the sonos player (ding-dong)
#4 - I go back to to captured/saved state and listen to original music again

Would all of this be possible with this solution?
This will be super! Is this already coded by someone? :)
Asterixenobelix
Posts: 5
Joined: Thursday 18 May 2017 10:20
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Asterixenobelix »

I followed every step, have the latest versions of everything installed and still a strange error:
After entering http://192.168.1.14:5005/Keuken/state (ip-adress of one of my Sonos-devices), I receive the message:
-bash http etc: bestandsnaam of map bestaat niet (file or directory don't exist).

Using the ip-adres of another device, or of my Raspberry, doesn't change anyting: same message.

Seems like my Pi doesn't know the command "http".

I can't find anything about this on Google.

Anyone any idea?
Trigun
Posts: 390
Joined: Wednesday 30 November 2016 11:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.10717
Contact:

Re: Step by step guide: Sonos integration

Post by Trigun »

Do you see the sonos menu when entering IP-adres:5005?


Sent from my iPhone using Tapatalk
Asterixenobelix
Posts: 5
Joined: Thursday 18 May 2017 10:20
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Asterixenobelix »

No. Just the error-message.

As the Raspberry doesn't recognise the command, it can't show the Sonos-page.

I can see the sonos-api is running. But I think the cause is something else, something in the OS.
Trigun
Posts: 390
Joined: Wednesday 30 November 2016 11:58
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.10717
Contact:

Step by step guide: Sonos integration

Post by Trigun »

If you re not seeing anything it means the sonos integration was not successful
I'll have a look at it when I'm at home.

Sent from my iPhone using Tapatalk
Asterixenobelix
Posts: 5
Joined: Thursday 18 May 2017 10:20
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Asterixenobelix »

Ok, thanks.

I was surprised by the bash-error: http:// etc., file or directory doesn't exist (in Dutch), as if "http" was not recognised. I hope I'm mistaken.

Is there a way to uninstall everything en re-install the sonos-http-api stuff?
Asterixenobelix
Posts: 5
Joined: Thursday 18 May 2017 10:20
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Asterixenobelix »

Anyone else any suggestions about my above mentioned problem? Is there a way to uninstall the sonos-api and install it again? I keep getting the error message when entering the right http-command.
User avatar
leecollings
Posts: 167
Joined: Tuesday 30 June 2015 18:09
Target OS: Raspberry Pi / ODroid
Domoticz version:
Location: United Kingdom
Contact:

Re: Step by step guide: Sonos integration

Post by leecollings »

Heursqem wrote:This is what I would love to achieve

#1 - Someone pushes my doorbell
#2 - I capture the current state of my sonos player (medium, song, volume etc) and save this for later
#3 - I play my own sound through the sonos player (ding-dong)
#4 - I go back to to captured/saved state and listen to original music again

Would all of this be possible with this solution?
Hey, you can already do this with the clipall command (if you want to play the announcement through all Sonos devices on your network).

You can handle all of the above by using:

Code: Select all

http://localhost:5005/clipall/name-of-your-mp3.mp3
(store your mp3 file in /static/clips/)
rjpost
Posts: 1
Joined: Monday 29 May 2017 10:59
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by rjpost »

Hello Guys,

I was wondering if you could provide me with some guidance in regards to getting this Sonos integration to work the way i would like to.

I have the following objective. I want to use a sonos connect ( not the amp version). When I select play on that specific sonos I want my to turn my receiver on and set it to input AUX. I want to achieve this through the Harmony HUB. I can control that perfectly through domoticz however I need to determine whether or not a specific sonos player is playing music.
I wanted to create an event with blocky to sent a command to the harmony hub when the sonos switch is set to status playing.

In order to do that I wanted to use this script to update the switch status to playing, pause, stopped.
I I have been playing around with it but I cant seem to get it to work properly and show the playing or pauze status in the switch.
I can control Sonos fine through domoticz so the api is running as it should.

So what have I done.
- Placed the Lua file in the domoticz scripts folder.
- added a lua script there to with the name Sonos_Kitchen.lua.
- in domoticz I added a dummy device called Sonos_Kitchen
- based on this dummy switch I created a selector switch with the name Sonos_Kitchen (idx 166)
- The script is a copy from the one that is posted on the 19th of march 2017.
- I have changed the Curl adres to : http://localhost:5005/kitchen/state.
- I have changed the commandArray to commandArray['UpdateDevice'] = '166|20|20' where the 166 is the idx of my switch sonos_kitchen.

I think am stuck with the script and the naming conventions that are used. I'm either interpreting them wrong of I'm mis using them.
Can some explain to me where I should change the variables so it will work in my setup.
any help is appreciated.
Thanks a lot.

- Ronald-
Heursqem
Posts: 18
Joined: Sunday 20 March 2016 14:31
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Heursqem »

leecollings wrote:
Heursqem wrote:This is what I would love to achieve

#1 - Someone pushes my doorbell
#2 - I capture the current state of my sonos player (medium, song, volume etc) and save this for later
#3 - I play my own sound through the sonos player (ding-dong)
#4 - I go back to to captured/saved state and listen to original music again

Would all of this be possible with this solution?
Hey, you can already do this with the clipall command (if you want to play the announcement through all Sonos devices on your network).

You can handle all of the above by using:

Code: Select all

http://localhost:5005/clipall/name-of-your-mp3.mp3
(store your mp3 file in /static/clips/)
But how could I store the actual state, so I can resume after the clipall command?
User avatar
leecollings
Posts: 167
Joined: Tuesday 30 June 2015 18:09
Target OS: Raspberry Pi / ODroid
Domoticz version:
Location: United Kingdom
Contact:

Re: Step by step guide: Sonos integration

Post by leecollings »

It stores the current state within the command. Try it out and you'll see.

I've tested it, with a Play 1 playing a song, it pauses, plays the mp3 file, and then resumes the previously playing song.
Heursqem
Posts: 18
Joined: Sunday 20 March 2016 14:31
Target OS: Raspberry Pi / ODroid
Domoticz version:
Contact:

Re: Step by step guide: Sonos integration

Post by Heursqem »

ok, great, will try it out

I can only address all Players at the same time - I can't just choose 1?
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest