IF Verzweigung - Problem

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

SaschaQ
Beiträge: 202
Registriert: 2. Mär 2020 13:50
Answers: 0

Re: IF Verzweigung - Problem

Beitrag von SaschaQ »

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`?

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

Re: IF Verzweigung - Problem

Beitrag von BOP »

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. :D

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. :roll:

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: IF Verzweigung - Problem

Beitrag von udo1toni »

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:

Code: Alles auswählen

gSchlaf.members.filter[i|i.state == ON].size
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')
    ])
}
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten