Hi, i have an automation which uses my blinds, my windowsensors and some buttons for the blinds. It is all in one rule. That rule works perfectly for my items.
I am defining my items as this:
<Binding>_<DeviceType>_<Position>_<Room>
Example for blinds:
Rollershutter Z2M_Rollladen_links_Wohnzimmer (Member of gRollladen)
Example for Buttons:
String Z2M_Rollladenschalter_links_Wohnzimmer (Member of gRollladenschalter)
Example for windowsensors:
Contact Z2M_Fenster_links_Wohnzimmer (Member of gFenster)
Since most of my rooms have more than one window, i used this to tell them apart. But now i encountered a problem. In my kitchen, and in my guest toilet, theres only one window each. So i changed the item syntax for them to this:
<Binding>_<DeviceType>_<Room>
Rollershutter Z2M_Rollladen_Kueche (Member of gRollladen)
As far as good, but now i am using a rule to determine which device triggered the rule and therefore rename some variables. I am using these variables throughout the rule to make it easier to read and understand for me. Each variable is an item which i can do .sendCommand, .state, .postUpdate with.
rule "Rollladen: Gesamte Steuerung"
when
Member of gRolllaeden received command or
Member of gRollladenschalter changed or
Member of gMaximaltiefeRolllaeden received command or
Member of gFenster changed
then
var triggeringItemType = triggeringItemName.split('_').get(1)
var maximaltiefeRollladen = ScriptServiceUtil.getItemRegistry.getItem("Rollladen_Maximaltiefe_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
var rollladen = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Rollladen_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
var fenster = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Fenster_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
// do some stuff with it
Unfortunately this does not work with my new blinds in the kitchen and the guest toilet. Because it has no <Position>
in its names. Therefore i changed the rule to this:
then
if (triggeringItemName.split('_').length == 4) {
var triggeringItemType = triggeringItemName.split('_').get(1)
var maximaltiefeRollladen = ScriptServiceUtil.getItemRegistry.getItem("Rollladen_Maximaltiefe_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
var rollladen = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Rollladen_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
var fenster = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Fenster_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
}
else if (triggeringItemName.split('_').length == 3) {
var triggeringItemType = triggeringItemName.split('_').get(1)
var maximaltiefeRollladen = ScriptServiceUtil.getItemRegistry.getItem("Rollladen_Maximaltiefe_" + triggeringItemName.split('_').get(2))
var rollladen = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Rollladen_" + triggeringItemName.split('_').get(2))
var fenster = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Fenster_" + triggeringItemName.split('_').get(2))
}
// do some stuff with it
This rule should change the variables value, depending on the length of the triggeringItemName. Normally this should work, but i read that variables are only visible to its own block/brackets and its child blocks/brackets.
So using the variables outside the if-statements does not work. So i tried this:
then
var triggeringItemType
var maximaltiefeRollladen
var rollladen
var fenster
if (triggeringItemName.split('_').length == 4) {
triggeringItemType = triggeringItemName.split('_').get(1)
maximaltiefeRollladen = ScriptServiceUtil.getItemRegistry.getItem("Rollladen_Maximaltiefe_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
rollladen = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Rollladen_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
fenster = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Fenster_" + triggeringItemName.split('_').get(2) + "_" + triggeringItemName.split('_').get(3))
}
else if (triggeringItemName.split('_').length == 3) {
triggeringItemType = triggeringItemName.split('_').get(1)
maximaltiefeRollladen = ScriptServiceUtil.getItemRegistry.getItem("Rollladen_Maximaltiefe_" + triggeringItemName.split('_').get(2))
rollladen = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Rollladen_" + triggeringItemName.split('_').get(2))
fenster = ScriptServiceUtil.getItemRegistry.getItem("Z2M_Fenster_" + triggeringItemName.split('_').get(2))
}
// do some stuff with it
But this does not work either, because i think the variable gets a specification (int or something) outside of the blocks. And it cannot store an item-type into an int-variable (This is just guessing, i dont know much about programming languages)
So how do i fix my issue? Is there anything else i can do? Maybe .split('_').get(2)
and anything similar is not a smart solution?