Es ist Bool'sche Algebra.
a ODER b muss erfüllt sein -> es reicht, wenn eine der Bedingungen erfüllt ist.
a UND b muss erfüllt sein -> beide Bedingungen müssen erfüllt sein.
Auch wichtig für das Verständnis: if() erwartet in den Klammern einen Boolean Wert. Also if(true) oder if(false). Bei true wird der Teil hinter if() ausgeführt, bei false wird der Teil hinter if() nicht ausgeführt. Andere Ausdrücke als true oder false sind nicht erlaubt.
Ich möchte allerdings noch einen weiteren Tipp loswerden, der hier anders an die Aufgabe herangeht. Erstelle ein Group Item und packe alle Schlaf-Items in diese Gruppe (hier in Textform, Ballast weg gelassen):
Code: Alles auswählen
Group gSchlaf
Switch all_kind1_schlafen (gSchlaf)
Switch all_kind1_schlafen_prion_schalter (gSchlaf)
Switch all_kind2_schlafen (gSchlaf)
Switch all_kind2_schlafen_prion_schalter (gSchlaf)
Nun kannst Du in der Rule die Anzahl der Schalter zählen, welche auf ON stehen:
und kannst prüfen, ob diese Zahl größer als 0 ist.
Code: Alles auswählen
if(gSchlaf.members.filter[i|i.state == ON].size > 0)
return;
Diese Bedingung bricht einfach die weitere Bearbeitung der Rule ab. Natürlich kann man das auch anders nutzen. Nur, wenn die Anzahl der aktiven Schalter = 0 ist, wird der Block hinter if() ausgeführt:
Code: Alles auswählen
if(gSchlaf.members.filter[i|i.state == ON].size == 0) {
// mach, was nötig ist
}
Abgesehen davon wäre es allerdings besser, die Rule anders zu gestalten. Du legst einen oder zwei Timer an, die im Zweifel beide zur gleichen Zeit "zünden". Da einer davon auf jeden Fall ausgeführt wird, ist es sinnvoller, die Abfrage (und den entsprechenden Befehl) in den Timer zu packen:
Code: Alles auswählen
if (now.getHour() <= 22 && now.getHour() >= 6) {
createTimer(now.plusSeconds(3), [ |
echo_wohnzimmer_TTS_Volume.sendCommand(25)
if(gSchlaf.members.filter[i|i.state == ON].size == 0)
echo_wohnzimmer_TTS.sendCommand('Willkommen zuhause Person 1')
])
}