Binding for Samsung Multiroom?

You can play sounds with OpenHAB, you only need to add a speaker to your server.

To control your speaker, here is the code.
The first is for volume (number item)
The second is for command (these are not all available, you can find them on the internet)

In both cases Return will hold the xml answer of the speaker.
You can parse it if needed.

rule Samsung_Volume
when	
	Item Speaker_Volume changed
then
	var Volume = Speaker_Volume.state.toString
	var URL = 'http://SPEAKER_IP:PORT/UIC?cmd=%3Cname%3ESetVolume%3C/name%3E%3Cp%20type=%22dec%22%20name=%22volume%22%20val=%22' + Volume + '%22/%3E'
	var Return = sendHttpGetRequest(URL)
end

rule Samsung_Multiroom_Command
when
	Item Speaker_Command received command
then
	var Command = Speaker_Command .state.toString
	var URL = ""
	switch Command {
		//Input mode
		case "setOptical" : URL = '/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22optical%22/%3E'
		case "setBluetooth" : URL = '/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22bt%22/%3E'
		case "setWifi" : URL = '/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22wifi%22/%3E'
		case "setHDMI" : URL = '/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22hdmi%22/%3E'
		case "setAux" : URL = '/UIC?cmd=%3Cname%3ESetFunc%3C/name%3E%3Cp%20type=%22str%22%20name=%22function%22%20val=%22aux%22/%3E'
		
		case "setRadio1On" : URL = '/CPM?cmd=%3Cname%3ESetPlayPreset%3C/name%3E%3Cp%20type=%22dec%22%20name=%22presetindex%22%20val=0/%3E%3Cp%20type=%22dec%22%20name=%22presettype%22%20val=%221%22/%3E'
		case "setRadio1Off" : URL = '/CPM?cmd=%3Cname%3ESetPlayPreset%3C/name%3E%3Cp%20type=%22dec%22%20name=%22presetindex%22%20val=0/%3E%3Cp%20type=%22dec%22%20name=%22presettype%22%20val=%220%22/%3E'
		case "setRadio2On" : URL = '/CPM?cmd=%3Cname%3ESetPlayPreset%3C/name%3E%3Cp%20type=%22dec%22%20name=%22presetindex%22%20val=1/%3E%3Cp%20type=%22dec%22%20name=%22presettype%22%20val=%221%22/%3E'
		case "setRadio2Off" : URL = '/CPM?cmd=%3Cname%3ESetPlayPreset%3C/name%3E%3Cp%20type=%22dec%22%20name=%22presetindex%22%20val=1/%3E%3Cp%20type=%22dec%22%20name=%22presettype%22%20val=%220%22/%3E'
		case "setRadio3On" : URL = '/CPM?cmd=%3Cname%3ESetPlayPreset%3C/name%3E%3Cp%20type=%22dec%22%20name=%22presetindex%22%20val=2/%3E%3Cp%20type=%22dec%22%20name=%22presettype%22%20val=%221%22/%3E'
		case "setRadio3Off" : URL = '/CPM?cmd=%3Cname%3ESetPlayPreset%3C/name%3E%3Cp%20type=%22dec%22%20name=%22presetindex%22%20val=2/%3E%3Cp%20type=%22dec%22%20name=%22presettype%22%20val=%220%22/%3E'
		case "setAutoRadio" : URL = '/UIC?cmd=%3Cname%3ESetRadioAutoPlay%3C/name%3E%3Cp%20type=%22str%22%20name=%22cpname%22%20val=%22%s%22/%3E%3Cp%20type=%22dec%22%20name=%220%22%20val=%22%s%22/%3E'
		
		case "getMusic" : URL = '/CPM?cmd=%3Cname%3EGetRadioInfo%3C/name%3E'
		
		case "setNext" : URL = '/CPM?cmd=%3Cname%3ESetSkipCurrentTrack%3C/name%3E'
		case "setPrev" : URL = '/CPM?cmd=%3Cname%3ESetPreviousTrack%3C/name%3E'
		case "setPlay" : URL = '/CPM?cmd=%3Cname%3ESetPlaybackControl%3C/name%3E%3Cp%20type=%22str%22%20name=%22playbackcontrol%22%20val=%22play%22/%3E'
		case "setPause" : URL = '/CPM?cmd=%3Cname%3ESetPlaybackControl%3C/name%3E%3Cp%20type=%22str%22%20name=%22playbackcontrol%22%20val=%22pause%22/%3E'
		case "setReapeatOn" : URL = '/"UIC?cmd=%3Cname%3ESetRepeatMode%3C/name%3E%3Cp%20type=%22str%22%20name=%22repeatmode%22%20val=%22on%22/%3E%22'
		case "setReapeatOff" : URL = '/"UIC?cmd=%3Cname%3ESetRepeatMode%3C/name%3E%3Cp%20type=%22str%22%20name=%22repeatmode%22%20val=%22off%22/%3E%22'
		case "setShuffle" : URL = '/CPM?cmd=<name>SetToggleShuffle</name><p type=\"dec\" name=\"mode\" val=\"%s\"/>'
	}
	
	URL = "http://SPEAKER_IP:PORT" + URL
	var Return = sendHttpGetRequest(URL)
end

Volume can also be handled directly without a rule:

Dimmer Speaker_Volume  "SB_Bedroom_Volume [%d %%]"	{ http=">[CHANGED:GET:http://SPEAKER_IP:PORT/UIC?cmd=%3Cname%3ESetVolume%3C/name%3E%3Cp%20type=%22dec%22%20name=%22volume%22%20val=%22%2%d%22/%3E] <[http://SPEAKER_IP:PORT/UIC?cmd=%3Cname%3EGetVolume%3C/name%3E:5000:REGEX(.*?<volume>(.*?)</volume>.*)]" }

Other items like mute can handled this way too:

Switch SB_Bedroom_Mute		"SB_Bedroom_Mute"			{ http=">[ON:GET:http://SPEAKER_IP:PORT/UIC?cmd=%3Cname%3ESetMute%3C/name%3E%3Cp%20type=%22str%22%20name=%22mute%22%20val=%22on%22/%3E] >[OFF:GET:http://SPEAKER_IP:PORT/UIC?cmd=%3Cname%3ESetMute%3C/name%3E%3Cp%20type=%22str%22%20name=%22mute%22%20val=%22off%22/%3E] <[http://SPEAKER_IP:PORT/UIC?cmd=%3Cname%3EGetMute%3C/name%3E:5000:REGEX(.*?<mute>(.*?)</mute>.*)]" }

Addons needed:

  1. HTTP binding
  2. REGEX Transformation

I hope it will help you!

  • Jordo
1 Like