Na ja, Du prüfst innerhalb der Rule ja auch nur das eine Fenster...
Code: Alles auswählen
rule "Fenster Florian Zimmer"
when
Item FZimmer_Fenster_State changed or
Item FZimmer_DachFenster_State changed
then
if(FZimmer_Fenster_State.state == OPEN || FZimmer_DachFenster_State.state == OPEN)
{
FZimmer_Heizung_SetTemp.persist
FZimmer_Heizung_SetTemp.sendCommand(4.5) // Achtung! amerikaisches Komma!
}
else if(FZimmer_Fenster_State.state == CLOSED && FZimmer_DachFenster_State.state == CLOSED)
{
FZimmer_Heizung_SetTemp.sendCommand(FZimmer_Heizung_SetTemp.previousState.state as Number)
}
end
Allerdings ginge das Ganze auch etwas eleganter über eine Gruppe:
Code: Alles auswählen
Group:Contact:OR(OPEN,CLOSED) gFZimmer "FZimmer Fenster offen: [%s]"
Contact FZimmer_Fenster_State "FZimmer Fenster" (gFZimmer)
Contact FZimmer_DachFenster_State "FZimmer Dachfenster" (gFZimmer)
mit der passenden Rule:
Code: Alles auswählen
rule "Fenster Florian Zimmer"
when
Item gFenster changed
then
if(gFenster.state == OPEN)
{
FZimmer_Heizung_SetTemp.persist
FZimmer_Heizung_SetTemp.sendCommand(4.5) // Achtung! amerikaisches Komma!
}
else if(gFenster.state == CLOSED)
{
FZimmer_Heizung_SetTemp.sendCommand(FZimmer_Heizung_SetTemp.previousState.state as Number)
}
end
Die Gruppe geht auf Status OPEN, sobald eines der zugehörigen Items auf Status OPEN ist.
Eine alternative Rule sähe etwas komplexer aus:
Code: Alles auswählen
rule "Fenster Florian Zimmer"
when
Member of gFenster changed
then
if(gFenster.members.filter[i | i.state == OPEN].size > 0)
{
FZimmer_Heizung_SetTemp.persist
FZimmer_Heizung_SetTemp.sendCommand(4.5) // Achtung! amerikaisches Komma!
}
else if(gFenster.members.size == gFenster.members.filter[i|i.state == CLOSED].size)
{
FZimmer_Heizung_SetTemp.sendCommand(FZimmer_Heizung_SetTemp.previousState.state as Number)
}
end
Im Grunde kann man natürlich auf die zweite Bedingung verzichten, da sie ja das Gegenteil der ersten Bedingung darstellt. Der Vorteil der zweiten Variante liegt darin, dass die Gruppe nicht zwingend mit der OR-Funktion arbeiten muss.