Ah okay dann bin ich mit && ja richtig, weil ich ja genau das erreichen will. Also ein Item ON, dann soll die Rule ja nicht mehr abgearbeitet werden.
Ich muss aber nochmal nachfragen bei ODER also || . Wie läuft das dann da`?
IF Verzweigung - Problem
-
- Beiträge: 197
- Registriert: 23. Sep 2018 19:43
Re: IF Verzweigung - Problem
Das ist der Unterschied im alltäglichen Sprachgebrauch und einer Programmiersprache. Während wir im Sprachgebrauch gerne ODER sagen, aber eigentlich UND meinen, der gegenüber es aber trotzdem richtig versteht, will die Programmiersprache es gerne genau wissen.
Bei && (und) muss jeder Ausdruck erfüllt sein.
Bei || (oder) braucht nur einer der Ausdrücke erfüllt sein.
"Mies" wird es, wenn jetzt beide kombiniert werden. Dazu sollte man wissen, dass && stärker bindet als ||.
Item1 == OFF & Item2 == OFF || Item3 == ON
ist deswegen etwas anderes als
Item1 == OFF & (Item2 == OFF || Item3 == ON)
Und ich muss gestehen, ich habe mit && und || auch so meine Probleme. Gedanklich strengt mich das immer an, das "auf die Reihe" zu bekommen.

Bei && (und) muss jeder Ausdruck erfüllt sein.
Bei || (oder) braucht nur einer der Ausdrücke erfüllt sein.
"Mies" wird es, wenn jetzt beide kombiniert werden. Dazu sollte man wissen, dass && stärker bindet als ||.
Item1 == OFF & Item2 == OFF || Item3 == ON
ist deswegen etwas anderes als
Item1 == OFF & (Item2 == OFF || Item3 == ON)
Und ich muss gestehen, ich habe mit && und || auch so meine Probleme. Gedanklich strengt mich das immer an, das "auf die Reihe" zu bekommen.

- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: IF Verzweigung - Problem
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):
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.
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:
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:
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)
Code: Alles auswählen
gSchlaf.members.filter[i|i.state == ON].size
Code: Alles auswählen
if(gSchlaf.members.filter[i|i.state == ON].size > 0)
return;
Code: Alles auswählen
if(gSchlaf.members.filter[i|i.state == ON].size == 0) {
// mach, was nötig ist
}
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')
])
}
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet