I only used the commands for the functions I want to control in Domoticz. Power On/Off, select inputs Dig1 and Tuner/DAB, Volume control and select DAB presets. For the basic commands I use a selector switch (idx 678) and another selector switch for the DAB presets (idx 693). The status of the radio is requested every minute by a timer. Power, Volume, Input and preset info are stored in user variables and send to a text sensor (idx 685). The name of levels in the selector switch (678) need to match the name in the script. For the preset selector the first 2 characters are used for the preset number, character 5 and further for the station name and can be set according your preset list. Furthermore I set different volume levels when switching inputs to match the source.
Create variables for:
inputname = domoticz.variables(1).value
volume = domoticz.variables(2).value
presetname = domoticz.variables(4).value
preset = domoticz.variables(6).value
presetinfo = domoticz.variables(7).value
power = domoticz.variables(8).value
and change the variables numbers in the script accordingly. Create 2 (dummy) selector switches
Switch to control with following levels:
- Off
- TV
- DAB
- Mute
- Vol-
- Vol+
Switch for DAB preset levelnames starting with preset number:
- 01
- 02
- 03
and so on. The rest of the levelname can be used for station name is and is discarded in the script.
Create a text sensor which is used as display and change the idx (685 in the code) to your idx numer.
Create a new script in DZvents with following code and change your idx numbers and ip adres of your Yamaha:
Code: Select all
return {
on = {
devices = {
678, 693
},
timer = { 'every minute' },
httpResponses = { 'statusresponse', 'statusplayinfo' }
},
logging = {
level = domoticz.LOG_DEBUG,
marker = "yamaha_script"
},
execute = function(domoticz, device)
inputname = domoticz.variables(1).value
volume = domoticz.variables(2).value
presetname = domoticz.variables(4).value
preset = domoticz.variables(6).value
presetinfo = domoticz.variables(7).value
power = domoticz.variables(8).value
yamahaip = '192.168.20.20/YamahaRemoteControl/ctrl'
head = {['Content-Type'] = 'application/xml; charset=UTF-8'}
xml_get_status = [[<YAMAHA_AV cmd="GET"><System><Basic_Status>GetParam</Basic_Status></System></YAMAHA_AV>]]
xml_get_playinfo = [[<YAMAHA_AV cmd="GET"><Tuner><Play_Info>GetParam</Play_Info></Tuner></YAMAHA_AV>]]
if device.idx == 678 then
xml_put_power_on = [[<YAMAHA_AV cmd="PUT"><System><Power_Control><Power>On</Power></Power_Control></System></YAMAHA_AV>]]
xml_put_power_standby = [[<YAMAHA_AV cmd="PUT"><System><Power_Control><Power>Standby</Power></Power_Control></System></YAMAHA_AV>]]
xml_put_vol_up = [[<YAMAHA_AV cmd="PUT"><System><Volume><Lvl>Up</Lvl></Volume></System></YAMAHA_AV>]]
xml_put_vol_down = [[<YAMAHA_AV cmd="PUT"><System><Volume><Lvl>Down</Lvl></Volume></System></YAMAHA_AV>]]
xml_put_vol_mute = [[<YAMAHA_AV cmd="PUT"><System><Volume><Mute>On</Mute></Volume></System></YAMAHA_AV>]]
xml_put_vol_level_12 = [[<YAMAHA_AV cmd="PUT"><System><Volume><Lvl>12</Lvl></Volume></System></YAMAHA_AV>]]
xml_put_vol_level_25 = [[<YAMAHA_AV cmd="PUT"><System><Volume><Lvl>25</Lvl></Volume></System></YAMAHA_AV>]]
xml_put_input_dig1 = [[<YAMAHA_AV cmd="PUT"><System><Input><Input_Sel>DIGITAL1</Input_Sel></Input></System></YAMAHA_AV>]]
xml_put_input_tuner = [[<YAMAHA_AV cmd="PUT"><System><Input><Input_Sel>TUNER</Input_Sel></Input></System></YAMAHA_AV>]]
xml_put_band_dab = [[<YAMAHA_AV cmd="PUT"><Tuner><Play_Control><Band>DAB</Band></Play_Control></Tuner></YAMAHA_AV>]]
if device.levelName == 'Vol +' and power == 'On' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_up})
volume = volume+1
end
if device.levelName == 'Vol -' and power == 'On' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_down})
volume = volume-1
end
if device.levelName == 'Mute' and power == 'On' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_mute})
end
if device.levelName == 'Off' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_level_12})
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_power_standby})
volume = 12
power = 'Standby'
end
if device.levelName == 'TV' then
if power == 'On' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_input_dig1})
end
if power == 'Standby' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_power_on})
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_input_dig1}).afterSec(1)
power = 'On'
end
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_level_25}).afterSec(1)
inputname = 'Digital 1 - TV'
volume = 25
end
if device.levelName == 'DAB' then
if power == 'On' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_level_12})
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_input_tuner})
end
if power == 'Standby' then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_power_on})
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_input_tuner}).afterSec(1)
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_vol_level_12}).afterSec(1)
power = 'On'
end
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_band_dab})
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_get_playinfo, callback = 'statusplayinfo'}).afterSec(10)
volume = 12
inputname = 'DAB'
end
end
if device.idx == 693 then
PresetPre = [[<YAMAHA_AV cmd="PUT"><Tuner><Play_Control><Preset><DAB><Preset_Sel>]]
PresetSuf = [[</Preset_Sel></DAB></Preset></Play_Control></Tuner></YAMAHA_AV>]]
preset = string.sub(device.levelName,1,2)
presetname = string.sub(device.levelName,5)
presetinfo = ' '
xml_put_tuner_preset = PresetPre .. preset .. PresetSuf
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_put_tuner_preset})
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_get_playinfo, callback = 'statusplayinfo'}).afterSec(3)
end
if (device.isTimer) then
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_get_status, callback = 'statusresponse'}).afterSec(1)
domoticz.openURL({url = yamahaip, method = 'POST', headers = head, postData = xml_get_playinfo, callback = 'statusplayinfo'}).afterSec(8)
end
if (device.isHTTPResponse) then
responsestatus = string.match(tostring(device.data), "<System><(%a+)_" )
responseplayinfo = string.match(tostring(device.data), "<Tuner><(%a+)_" )
if responsestatus == 'Basic' then
yamahastatus = tostring(device.data)
power = string.match(yamahastatus, "<Power>(%a+)</Power><" )
inputname = string.match(yamahastatus, "<Input><Input_Sel>(.*)</Input_Sel>" )
volume = string.match (yamahastatus, "<Lvl>(%d+)</Lvl>" )
mute = string.match(yamahastatus, "<Mute>(%a+)</Mute><" )
if inputname == 'TUNER' then
inputname = 'DAB'
end
if inputname == 'DIGITAL1' then
inputname = 'Digital 1 - TV'
end
end
if responseplayinfo == 'Play' then
yamahaplayinfo = tostring(device.data)
preset = string.match(yamahaplayinfo, "<DAB><Preset><Preset_Sel>(%d+)</Preset_Sel>" )
presetselector = string.sub(domoticz.devices(693).levelName,1,2)
-- domoticz.log('preset is ' .. tonumber(preset) .. ' presetselector is ' .. tonumber(presetselector) , domoticz.LOG_INFO)
if tonumber(preset) ~= tonumber(presetselector) then
domoticz.devices(693).switchSelector(preset*10).silent()
end
if power == 'On' then
presetname = string.match(yamahaplayinfo, "<Service_Label>(.*)</Service_Label>" )
presetinfo = string.match(yamahaplayinfo, "<DLS>(.*)</DLS>" )
end
end
end
if power == 'Standby' then
inputname = 'Standby'
end
domoticz.variables(1).set(inputname)
domoticz.variables(2).set(volume)
domoticz.variables(6).set(preset)
domoticz.variables(4).set(presetname)
domoticz.variables(7).set(presetinfo)
domoticz.variables(8).set(power)
input2 = inputname
if inputname == 'DAB' then
input2 = tostring(inputname .. ' ' .. preset .. ' ' .. presetname .. ' | ' .. presetinfo)
end
display = domoticz.utils.urlEncode('Vol ' .. tostring(volume) .. ' | ' .. input2)
domoticz.devices(685).setValues('0', display)
end
}