Ich möchte ein Item Switch einer Gruppe per anderen Switch deaktivieren.
Hintergrund:
Ich nutze eine Gruppe wo alle Lampen hinterlegt sind, und diese beinhalten auch die Lampen vom Kinderzimmer.
Nun ist das Kind ja auch manchmal Zuhause und ich dachte mir, man kann das irgendwie per Switch deaktivieren damit die Lampen im Kinderzimmer nicht ausgehen..
Im 2ten step will ich versuchen das ganze per rule zu Steuern aber dazu später... (Soweit bin ich noch nicht )
Ich dachte mir irgendwie: wenn Item "Kind Zuhause on" dann Item Kinderzimmer Lampe in Gruppe deaktiviert....
Nein, das geht nicht. Andersrum geht es aber: Du definierst eine Rule, um alle Lichter auszuschalten (ist ohnehin zuverlässiger als über das Group Item einen Befehl an alle zu senden).
In der Rule hast Du nun mehrere Möglichkeiten, entweder Du durchläufst die Gruppe und prüfst (falls "deaktiviert") jeweils, ob das Item nicht berücksichtigt werden soll:
var Timer tZentralAus = null // ein Zeiger für einen Timer
var Integer iZentralAus // ein Zähler
val Integer iMio = 1000000
rule "Zentral_off"
when
Channel "shelly:shelly25-relay:784c5f2ecc:relay2#button" triggered SHORT_PRESSED or // Taster - Haustür
Item Zentral_taster changed to ON // APP
then
tZentralAus?.cancel // Falls Timer existiert, weg damit
iZentralAus = 5 // Zähler initialisieren
tZentralAus = createTimer(now.plusNanos(10*iMio), [| // Timer anlegen und fast sofort starten
iZentralAus-=1 // Zähler runterzählen
if(iZentralAus < 1) { // falls am Ende angekommen
Lampe.sendCommand(OFF) // Gruppe OFF
HTTPURLThing_km7.sendCommand(ON) // Relais ON
Zentral_taster.sendCommand(OFF) // APP Schalter
} else { // ansonsten
Shelly107_Betrieb.sendCommand(if(Shelly107_Betrieb.state != ON) ON else OFF) // toggle Relais
tZentralAus.reschedule(now.plusNanos((if(iZentralAus > 1) 500 else 1000)*iMio)) // plane den Timer erneut ein
}
])
end
Nun hatte ich versucht den teil mit ""Lampe.sendCommand(OFF)"" durch deinen Teil oben zu ersetzen... Aber irgendwie bin ich gescheitert.
var Timer tZentralAus = null // ein Zeiger für einen Timer
var Integer iZentralAus // ein Zähler
val Integer iMio = 1000000
rule "Zentral_off"
when
Channel "shelly:shelly25-relay:784c5f2ecc:relay2#button" triggered SHORT_PRESSED or // Taster - Haustür
Item Zentral_taster changed to ON // APP
then
tZentralAus?.cancel // Falls Timer existiert, weg damit
iZentralAus = 5 // Zähler initialisieren
tZentralAus = createTimer(now.plusNanos(10*iMio), [| // Timer anlegen und fast sofort starten
iZentralAus-=1 // Zähler runterzählen
if(iZentralAus < 1) { // falls am Ende angekommen
Lampe.members.filter[i|i.state == ON].forEach[licht| // für jedes eingeschaltete Item der Gruppe
if(!(licht.name == "Constantin" && active.state == OFF)) // prüfe, ob Name == Constantin und gleichzeitig Item active OFF)
list.sendCommand(OFF) // falls nicht, sende OFF ans Item
]
HTTPURLThing_km7.sendCommand(ON) // Relais ON
Zentral_taster.sendCommand(OFF) // APP Schalter
} else { // ansonsten
Shelly107_Betrieb.sendCommand(if(Shelly107_Betrieb.state != ON) ON else OFF) // toggle Relais
tZentralAus.reschedule(now.plusNanos((if(iZentralAus > 1) 500 else 1000)*iMio)) // plane den Timer erneut ein
}
])
end
Der Punkt ist, dass nicht die Gruppe den Befehl bekommt (und dann stellvertretend an die einzelnen Items weiterreicht), sondern die Gruppe wird durchlaufen, für jedes Item der Gruppe wird das Lambda ausgeführt (das Lambda ist der Inhalt zwischen [ und ]).
Ob man die Gruppe zunächst nach den ITems filtert, die eingeschaltet sind, ist erst mal unerheblich.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet