import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import org.joda.time.*
import java.util.Random
import java.util.Date
import java.util.TimeZone
import java.text.SimpleDateFormat
import org.quartz.TriggerBuilder.*
import org.quartz.CronScheduleBuilder.*
import org.quartz.DateBuilder.*
var Timer stopptanz_firsttimer = null
var Timer stopptanz_secondtimer = null
var Timer stopptanz_thirdtimer = null
//
rule "Turn On Effektlicht when Bose turns on to TV at evening"
when
// Item So received update
Item WZ_Soundtouch300_Source changed to TV
then
if (now.getHourOfDay() >= 20 || now.getHourOfDay() <= 1) {
sendCommand(Wohnzimmer_Effektlicht, ON)
}
end
rule "Powerupdate - Member of Group changed its powerstate"
when
Member of gSoundtouch_Source changed from "STANDBY"
then
// logInfo("Soundtouch: Member of Soundtouch_Source changed from STANDBY", "Member: " + triggeringItem.name)
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Power = devicename + "_Power"
val devicename_AvailableForMultiroom = devicename + "_AvailableForMultiroom"
val devicename_AvailableForMaster = devicename + "_AvailableForMaster"
val devicename_MAC = devicename + "_MAC"
val devicename_Master = devicename + "_Master"
val devicename_Multiroom = devicename + "_Multiroom"
val devicename_Multiroom_item = gSoundtouch_Multiroom.members.findFirst[ d | d.name == devicename_Multiroom ]
val devicename_Master_item = gSoundtouch_Master.members.findFirst[ d | d.name == devicename_Master ]
val devicename_Power_item = gSoundtouch_Power.members.findFirst[ d | d.name == devicename_Power ]
val devicename_AvailableForMultiroom_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMultiroom ]
val devicename_AvailableForMaster_item = gSoundtouch_AvailableForMaster.members.findFirst[ d | d.name == devicename_AvailableForMaster ]
val devicename_MAC_item = gSoundtouch_MAC.members.findFirst[ d | d.name == devicename_MAC ]
val Number MACPlaying = gSoundtouch_MacPlaying.members.filter[ NumberItem i | i.state!="" ].size
val Number MastersCount = gSoundtouch_Master.members.filter[ NumberItem i | i.state==ON ].size
// logInfo("Soundtouch: Member of Soundtouch_Source changed from STANDBY", "Power_item ON: " + devicename_Power_item.name )
postUpdate(devicename_Power_item, ON)
// Add speaker to Master if only one Master exists - Feature for automatically adding speakers to Multiroom when turned on
if(MastersCount==1 && triggeringItem.state!="AIRPLAY" || Soundtouch_Multiroom_Master.state!="" && MastersCount==0 && triggeringItem.state!="AIRPLAY"){
// logInfo("Soundtouch: Member of Soundtouch_Source changed from STANDBY", "Add speaker to Master if only one Master exists - Feature for automatically adding speakers to Multiroom when turned on. Multiroom ON: " + devicename_Multiroom_item.name )
sendCommand(devicename_Multiroom_item,ON)
}
// logInfo("Soundtouch: Member of Soundtouch_Source changed from STANDBY", "Available For Master OFF: " + devicename_AvailableForMaster_item.name )
postUpdate(devicename_AvailableForMaster_item,OFF)
end
rule "Powerupdate - Member of Group changed its powerstate to STANDBY"
when
Member of gSoundtouch_Source changed to "STANDBY"
then
// logInfo("Soundtouch: Member of Soundtouch_Source changed to STANDBY", "Member: " + triggeringItem.name)
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Power = devicename + "_Power"
val devicename_AvailableForMultiroom = devicename + "_AvailableForMultiroom"
val devicename_AvailableForMaster = devicename + "_AvailableForMaster"
val devicename_MAC = devicename + "_MAC"
val devicename_Master = devicename + "_Master"
val devicename_Multiroom = devicename + "_Multiroom"
val devicename_Multiroom_item = gSoundtouch_Multiroom.members.findFirst[ d | d.name == devicename_Multiroom ]
val devicename_Master_item = gSoundtouch_Master.members.findFirst[ d | d.name == devicename_Master ]
val devicename_Power_item = gSoundtouch_Power.members.findFirst[ d | d.name == devicename_Power ]
val devicename_AvailableForMultiroom_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMultiroom ]
val devicename_AvailableForMaster_item = gSoundtouch_AvailableForMaster.members.findFirst[ d | d.name == devicename_AvailableForMaster ]
val devicename_MAC_item = gSoundtouch_MAC.members.findFirst[ d | d.name == devicename_MAC ]
val Number MACPlaying = gSoundtouch_MacPlaying.members.filter[ NumberItem i | i.state!="" ].size
val Number MastersCount = gSoundtouch_Master.members.filter[ NumberItem i | i.state==ON ].size
// logInfo("Soundtouch: Member of Soundtouch_Source changed to STANDBY", "Currently Devices Playing: " +MACPlaying + "MastersCount: " + MastersCount)
// logInfo("Soundtouch: Member of Soundtouch_Source changed to STANDBY", "Update Power Item to OFF:" + devicename_Power_item.name)
postUpdate(devicename_Power_item, OFF)
// logInfo("Soundtouch: Member of Soundtouch_Source changed to STANDBY", "Remove Device from Playing Group:" + triggeringItem.name)
gSoundtouch_MacPlaying.removeMember(devicename_MAC_item)
// logInfo("Soundtouch: Member of Soundtouch_Source changed to STANDBY", "Turn of Master if exists and make unavailable for Master :" + triggeringItem.name)
postUpdate(devicename_AvailableForMaster_item,NULL)
postUpdate(devicename_Master_item,OFF)
// Remove speaker from Multiroom when turned off
// logInfo("Soundtouch: Member of Soundtouch_Source changed to STANDBY", "Remove Speaker from Multiroom, when Multiroom is on: " + triggeringItem.name)
if(devicename_Multiroom_item.state==ON){
sendCommand(devicename_Multiroom_item,OFF)
}
end
rule "PlayControl - Member of Group changed to Play"
when
Member of gSoundtouch_Player changed
then
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_MAC = devicename + "_MAC"
val devicename_IP = devicename + "_IP"
val devicename_Source = devicename + "_Source"
val devicename_Source_item = gSoundtouch_Source.members.findFirst[ d | d.name == devicename_Source ]
val devicename_MAC_item = gSoundtouch_MAC.members.findFirst[ d | d.name == devicename_MAC ]
val devicename_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == devicename_IP ]
val Number MastersCount = gSoundtouch_Master.members.filter[ NumberItem i | i.state==ON ].size
// logInfo("Soundtouch: Member of gSoundtouchPlayer changed:", "MastersCount: " + MastersCount + " Multiroom_Master: " +Soundtouch_Multiroom_Master.state)
if(triggeringItem.state==PLAY){
if(devicename_Source_item.state!="PRODUCT"){
// logInfo("New Playing Member:", "MAC:" +triggeringItem.name)
gSoundtouch_MacPlaying.addMember(devicename_MAC_item)
}
if (MastersCount==0 && Soundtouch_Multiroom_Master.state=="" || Soundtouch_Multiroom_Master.state==NULL){
gSoundtouch_MacPlaying.members.filter[ NumberItem i | i.state!="" ].forEach[ i |
postUpdate(Soundtouch_Multiroom_Master,i.state)
// postUpdate(Soundtouch_Multiroom_Master_IP,i.state) ]
// postUpdate(Soundtouch_Multiroom_Master,devicename_MAC_item.state)
postUpdate(Soundtouch_Multiroom_Master_IP,devicename_IP_item.state) ]
// logInfo("New Master:", "MAC:" +Soundtouch_Multiroom_Master.state)
}
}
else {
gSoundtouch_MacPlaying.removeMember(devicename_MAC_item)
}
end
rule "Powerupdate - Member of Group received Powercommand"
when
Member of gSoundtouch_Power received command
then
// logInfo("Soundtouch: Member of gSoundtouch_Power received command", "Member: " +triggeringItem.name)
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Power = devicename + "_Power"
val devicename_Power_item = gSoundtouch_Power.members.findFirst[ d | d.name == devicename_Power ]
val devicename_IP = devicename + "_IP"
val devicename_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == devicename_IP ]
val devicename_Source = devicename + "_Source"
val devicename_Source_item = gSoundtouch_Source.members.findFirst[ d | d.name == devicename_Source ]
val url = "http://" + devicename_IP_item.state + ":8090/key"
val xmlstring = 'POWER'
if(receivedCommand==ON && devicename_Source_item.state=="STANDBY" || receivedCommand==OFF && devicename_Source_item.state!="STANDBY"){
logInfo("Soundtouch: Member of gSoundtouch_Power received command", "receivedCommand ON, Source Standby OR OFF and Source not Standby")
logInfo("Soundtouch: Member of gSoundtouch_Power received command","Power for: " +devicename + " "+ devicename_IP_item + "receivedCommand: " + receivedCommand)
sendHttpPostRequest(url , "application/xml", xmlstring)
}
// logInfo("Powertrigger","Power for: " +devicename + " "+ devicename_IP_item + "receivedCommand: " + receivedCommand)
// logInfo("Soundtouch: Member of gSoundtouch_Power received command", "Update Poweritem after pressing ON:" +devicename_Power_item.name)
postUpdate(devicename_Power_item,receivedCommand)
end
rule "Multiroom - Member of Group becomes master"
when
Member of gSoundtouch_AvailableForMaster changed to ON
then
// logInfo("Soundtouch: Member of gSoundtouch_AvailableForMaster changed to ON", "Member: " +triggeringItem.name)
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_AvailableForMultiroom = devicename + "_AvailableForMultiroom"
val devicename_Master = devicename + "_Master"
val devicename_Multiroom = devicename + "_Multiroom"
val devicename_MAC = devicename + "_MAC"
val devicename_AvailableForMaster = devicename + "_AvailableForMaster"
val devicename_AvailableForMultiroom_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMultiroom ]
val devicename_AvailableForMaster_item = gSoundtouch_AvailableForMaster.members.findFirst[ d | d.name == devicename_AvailableForMaster ]
val devicename_Master_item = gSoundtouch_Master.members.findFirst[ d | d.name == devicename_Master ]
val devicename_MAC_item = gSoundtouch_MAC.members.findFirst[ d | d.name == devicename_MAC ]
val devicename_Multiroom_item = gSoundtouch_Multiroom.members.findFirst[ d | d.name == devicename_Multiroom ]
val devicename_IP = devicename + "_IP"
val devicename_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == devicename_IP ]
// logInfo("ChangeToMaster","ChangeToMaster: " + devicename_AvailableForMaster_item)
// logInfo("Soundtouch: Member of gSoundtouch_AvailableForMaster changed to ON", " Update to Master: " +triggeringItem.name + " Write to Multiroom_Master: " + +triggeringItem.name + " Write Master IP to: " +triggeringItem.name + " Turn on Multiroom on For :" +triggeringItem.name + " Not Available for Multiroom anymore: " + triggeringItem.name)
sendCommand(devicename_Multiroom_item,OFF)
postUpdate(devicename_AvailableForMaster_item,ON)
postUpdate(Soundtouch_Multiroom_Master,devicename_MAC_item.state)
postUpdate(Soundtouch_Multiroom_Master_IP,devicename_IP_item.state)
postUpdate(devicename_Master_item,ON)
sendCommand(devicename_Multiroom_item,ON)
postUpdate(devicename_AvailableForMultiroom_item,OFF)
end
rule "Multiroom - Member of Group ends master"
when
Member of gSoundtouch_AvailableForMaster changed to OFF
then
// logInfo("Masterend","Master end: " + triggeringItem.name)
end
rule "Bose - Volume Up"
when
Member of gSoundtouch_VolumeUp changed to ON
then
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_VolumeUp = devicename + "_VolumeUp"
val devicename_VolumeUp_item = gSoundtouch_VolumeUp.members.findFirst[ d | d.name == devicename_VolumeUp ]
val devicename_Volume = devicename + "_Volume"
val devicename_Volume_item = gSoundtouch_Volume.members.findFirst[ d | d.name == devicename_Volume ]
val currentvol = devicename_Volume_item.state as Number
val setvol = currentvol + 5
sendCommand(devicename_Volume_item, setvol)
postUpdate(devicename_VolumeUp_item, OFF)
end
//
rule "Bose - Volume Down"
when
Member of gSoundtouch_VolumeDown changed to ON
then
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_VolumeDown = devicename + "_VolumeDown"
val devicename_VolumeDown_item = gSoundtouch_VolumeDown.members.findFirst[ d | d.name == devicename_VolumeDown ]
val devicename_Volume = devicename + "_Volume"
val devicename_Volume_item = gSoundtouch_Volume.members.findFirst[ d | d.name == devicename_Volume ]
val currentvol = devicename_Volume_item.state as Number
val setvol = currentvol - 5
sendCommand(devicename_Volume_item, setvol)
postUpdate(devicename_VolumeDown_item, OFF)
end
rule "Bose - Volume Limit"
when
Member of gSoundtouch_Volume changed
then
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Volume = devicename + "_Volume"
val devicename_Volume_item = gSoundtouch_Volume.members.findFirst[ d | d.name == devicename_Volume ]
if(devicename_Volume_item.state>50){
sendCommand(devicename_Volume_item, 30)
}
end
rule "Stopptanz Soundtouch10 Küche"
when
Item Kueche_Soundtouch10_Stopptanz changed from OFF to ON
then
stopptanz_thirdtimer = null
var i = 0
stopptanz_thirdtimer = createTimer(now.plusSeconds(900), [ |
if (stopptanz_thirdtimer!=null)
{
i=1
}
])
stopptanz_firsttimer = null
stopptanz_secondtimer = null
while(i != 1 ) {
var int stopptanz_StopRandom = 1+(Math::random * 30.0).intValue
var int stopptanz_PlayRandom = 3+(Math::random * 9.0).intValue
if (stopptanz_firsttimer==null)
{
// logInfo("FILE", "stopptanz_StopRandom : " + stopptanz_StopRandom + "stopptanz_PlayRandom : " + stopptanz_PlayRandom )
stopptanz_firsttimer = createTimer(now.plusSeconds(stopptanz_StopRandom), [ |
// logInfo("FILE", "stop")
sendCommand(Kueche_Soundtouch10_PlayerControl, PAUSE)
stopptanz_secondtimer = createTimer(now.plusSeconds(stopptanz_PlayRandom), [ |
if (stopptanz_secondtimer!=null)
{
// logInfo("FILE", "play")
sendCommand(Kueche_Soundtouch10_PlayerControl, PLAY)
stopptanz_firsttimer = null
stopptanz_secondtimer = null
}
])
])
}
if (Kueche_Soundtouch10_Stopptanz.state==OFF || Kueche_Soundtouch10_Power.state==OFF)
{
i=1
}
}
end
rule "Multiroom ON - Member of Group received Multiroom ON"
when
Member of gSoundtouch_Multiroom received command ON
then
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Power = devicename + "_Power"
val devicename_AvailableForMultiroom = devicename + "_AvailableForMultiroom"
val devicename_AvailableForMaster = devicename + "_AvailableForMaster"
val devicename_Power_item = gSoundtouch_Power.members.findFirst[ d | d.name == devicename_Power ]
val devicename_AvailableForMultiroom_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMultiroom ]
val devicename_AvailableForMaster_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMaster ]
val devicename_MAC = devicename + "_MAC"
val devicename_MAC_item = gSoundtouch_MAC.members.findFirst[ d | d.name == devicename_MAC ]
val devicename_IP = devicename + "_IP"
val devicename_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == devicename_IP ]
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command ON", "Multiroom ON for device:" + devicename + " Master: " + Soundtouch_Multiroom_Master.state + "Master_IP: " + Soundtouch_Multiroom_Master_IP.state +" IP: " + devicename_IP_item.state)
postUpdate(devicename_Power_item,ON)
val url_client = "http://" + devicename_IP_item.state + ":8090/setZone"
val url_master = "http://" + Soundtouch_Multiroom_Master_IP.state + ":8090/setZone"
val xmlstring_client = '"' + devicename_MAC_item.state +''
val xmlstring_master = '' + devicename_MAC_item.state +''
sendHttpPostRequest(url_client , "application/xml", xmlstring_client)
logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command ON", "Xml String für Client:" + xmlstring_client)
sendHttpPostRequest(url_master , "application/xml", xmlstring_master)
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command ON", "Xml String für Master:" + xmlstring_master)
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command ON", "AvailableForMultiroom OFF: "+ triggeringItem.name + " AvailableForMaster: NULL: " +triggeringItem.name )
postUpdate(devicename_AvailableForMultiroom_item,OFF)
postUpdate(devicename_AvailableForMaster_item,NULL)
end
rule "Multiroom OFF - Member of Group received Multiroom OFF"
when
Member of gSoundtouch_Multiroom received command OFF
then
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command OFF", "Member: " +triggeringItem.name)
//initialize variables from all needed groups
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Multiroom = devicename + "_Multiroom"
val devicename_AvailableForMultiroom = devicename + "_AvailableForMultiroom"
val devicename_AvailableForMaster = devicename + "_AvailableForMaster"
val devicename_MultiroomMaster = devicename + "_MultiroomMaster"
val devicename_Multiroom_item = gSoundtouch_Multiroom.members.findFirst[ d | d.name == devicename_Multiroom ]
val devicename_AvailableForMultiroom_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMultiroom ]
val devicename_AvailableForMaster_item = gSoundtouch_AvailableForMaster.members.findFirst[ d | d.name == devicename_AvailableForMaster ]
val devicename_MultiroomMaster_item = gSoundtouch_MultiroomMaster.members.findFirst[ d | d.name == devicename_MultiroomMaster ]
val devicename_IP = devicename + "_IP"
val devicename_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == devicename_IP ]
val url_getZoneString = 'http://' + devicename_IP_item.state + ':8090/getZone'
val url_removeZoneSlave = 'http://' + devicename_IP_item.state + ':8090/removeZoneSlave'
val getZoneString = sendHttpGetRequest(url_getZoneString)
val getZoneString_parsed = "<" + getZoneString.split('<').get(2) +"<" + getZoneString.split('<').get(3) + "<" + getZoneString.split('<').get(4) + "<" + getZoneString.split('<').get(5)
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command OFF", "Multiroom OFF for device:" + devicename + " Master: " + Soundtouch_Multiroom_Master.state)
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command OFF", "Zonestring that will be removed:" + getZoneString_parsed)
sendHttpPostRequest(url_removeZoneSlave , "application/xml", getZoneString_parsed)
// logInfo("Soundtouch: Member of gSoundtouch_Multiroom received command OFF", "Multiroom OFF: " + triggeringItem.name + " AvailableForMultiroom ON: " + triggeringItem.name + " AvailableForMaster: NULL: " +triggeringItem.name )
postUpdate(devicename_Multiroom_item,OFF)
postUpdate(devicename_AvailableForMultiroom_item,ON)
postUpdate(devicename_AvailableForMaster_item,NULL)
end
rule "Multiroom - MultiroomMaster changed in Group"
when
Member of gSoundtouch_MultiroomMaster changed
then
val devicename = triggeringItem.name.toString.split('_').get(0) +"_" +triggeringItem.name.toString.split('_').get(1)
val devicename_Power = devicename + "_Power"
val devicename_Multiroom = devicename + "_Multiroom"
val devicename_Master = devicename + "_Master"
val devicename_AvailableForMaster = devicename + "_AvailableForMaster"
val devicename_MultiroomMaster = devicename + "_MultiroomMaster"
val devicename_AvailableForMultiroom = devicename + "_AvailableForMultiroom"
val devicename_MAC = devicename + "_MAC"
val devicename_Power_item = gSoundtouch_Power.members.findFirst[ d | d.name == devicename_Power ]
val devicename_Multiroom_item = gSoundtouch_Multiroom.members.findFirst[ d | d.name == devicename_Multiroom ]
val devicename_Master_item = gSoundtouch_Master.members.findFirst[ d | d.name == devicename_Master ]
val devicename_AvailableForMaster_item = gSoundtouch_AvailableForMaster.members.findFirst[ d | d.name == devicename_AvailableForMaster ]
val devicename_MultiroomMaster_item = gSoundtouch_MultiroomMaster.members.findFirst[ d | d.name == devicename_MultiroomMaster ]
val devicename_AvailableForMultiroom_item = gSoundtouch_AvailableForMultiroom.members.findFirst[ d | d.name == devicename_AvailableForMultiroom ]
val devicename_MAC_item = gSoundtouch_MAC.members.findFirst[ d | d.name == devicename_MAC ]
val devicename_IP = devicename + "_IP"
val devicename_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == devicename_IP ]
///////////ERROR//////////
// //If Group is empty, it means no Multiroom is active. Reset any global items and set every soundtouch to available for multiroom
if(gSoundtouch_MultiroomMaster.state==""){
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "Group is empty, it means no Multiroom is active. Reset any global items and set every soundtouch to available for multiroom")
postUpdate(Soundtouch_Multiroom_Master,"")
postUpdate(Soundtouch_Multiroom_Master_IP,"")
sendCommand(gSoundtouch_AvailableForMultiroom, ON)
}
//If the new MultiroomMaster is the same as the Device, set the device as master
if (triggeringItem.state==devicename_MAC_item.state){
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "new MultiroomMaster is the same as the Device, set the device as master")
postUpdate(devicename_Master_item,ON)
postUpdate(devicename_AvailableForMaster_item,NULL)
}
//If empty it means that the device does not belong to any multiroom group anymore -> update multiroom, master, availability
if (triggeringItem.state==""){
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "empty it means that the device does not belong to any multiroom group anymore -> update multiroom, master, availability")
postUpdate(devicename_Multiroom_item,OFF)
postUpdate(devicename_Master_item,OFF)
postUpdate(devicename_AvailableForMultiroom_item,ON)
if(devicename_Power_item.state==OFF){
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "AvailableForMaster NULL: " + triggeringItem.name)
postUpdate(devicename_AvailableForMaster_item,NULL)
}
else {
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "AvailableForMaster OFF: " + triggeringItem.name)
postUpdate(devicename_AvailableForMaster_item,OFF)
}
}
//If not empty, update global variables
else {
val master_device_mac = gSoundtouch_MAC.members.findFirst[ d | d.state == devicename_MultiroomMaster_item.state ]
val master_device_IP = master_device_mac.name.toString.split('_').get(0) +"_" +master_device_mac.name.toString.split('_').get(1) + "IP"
val master_device_IP_item = gSoundtouch_IP.members.findFirst[ d | d.name == master_device_IP ]
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "Masterchange detected!triggeringItem triggered a Masterchange:" +triggeringItem.name + "TriggeringState: " + triggeringItem.state + " Update Global vars to Master of:" + triggeringItem.name)
postUpdate(Soundtouch_Multiroom_Master, devicename_MultiroomMaster_item.state)
postUpdate(Soundtouch_Multiroom_Master_IP, master_device_IP_item.state)
// logInfo("Soundtouch: Member of gSoundtouch_MultiroomMaster changed", "Update Multiroom to ON for: " + triggeringItem.name + " Update AvailableForMultiroom OFF for: " + triggeringItem.name)
postUpdate(devicename_Multiroom_item,ON)
postUpdate(devicename_AvailableForMultiroom_item,OFF)
}
end
rule "Multiroom - Partymode"
when
Item Soundtouch_Multiroom changed
then
if (Soundtouch_Multiroom.state==ON){
val Number MACPlaying = gSoundtouch_MacPlaying.members.filter[ NumberItem i | i.state!="" ].size
val Number MastersCount = gSoundtouch_Master.members.filter[ NumberItem i | i.state==ON ].size
// logInfo("Playing and Masters:", "CurrentPlaying: " +MACPlaying + "Masterscount: " + MastersCount)
if (MastersCount==1){
gSoundtouch_Multiroom.members.filter[ i | i.state != ON].forEach[ i | i.sendCommand(ON) ]
}
}
else{
postUpdate(Soundtouch_Multiroom_Master, "")
}
end