Seite 1 von 1

Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 17:50
von DonMarcello
Hallo zusammen,

ich habe eine Frage zu Skripten mit zwei Bedingungen zur Ausführung, welche mit der AND-Funktion gekoppelt sind.

Folgender Code wurde mit Blockly geschrieben:

Code: Alles auswählen

if (itemRegistry.getItem('PingMarcelHandy_Online').getState() == 'OFF' && itemRegistry.getItem('PingMelanieHandy_Online').getState() == 'OFF') {
  events.sendCommand('Statusschalter_SchalterfurStatusAusserHaus', 'ON');
}
Ziel soll es sein, dass wenn die Pingerreichbarkeit zu dem Handy von meiner Frau UND die Pingerreichbarkeit zum Handy von mir den Status "OFF" hat, (also durch Ping nicht erreichbar), soll der Schalter für den "Außer Haus"-Modus auf ON geschaltet werden.

Drücke ich auf "Run now" funktioniert es. Aber auch nur dann. Sonst verweilt das Script im Modus IDLE. Muss ich dieses noch irgendwie zur Dauerüberprüfung der Stati einrichten?

Ich hoffe ihr könnt mir ein wenig auf die Sprünge helfen.

Vielen Dank im Voraus für eure Hilfe!

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 18:36
von int5749
Wie wird dies denn getriggert? Generell funktionieren solche Vergleiche, aber die Rule muss eben irgendwie getriggert werden.
itemRegistry ist ja sicher nicht das item, sondern z.B. PingMarcelHandyOnline??
Dann würde eine DSL Rule wie folgt aussehen

Code: Alles auswählen

rule "GhostMode"
when
    Item PingMarcelHandy_Online changed or
    Item PingMelanieHandy_Online changed
then
    if (itemRegistry.getItem('PingMarcelHandy_Online').getState() == 'OFF' && itemRegistry.getItem('PingMelanieHandy_Online').getState() == 'OFF') {
        events.sendCommand('Statusschalter_SchalterfurStatusAusserHaus', 'ON');
    }
end
ggfs auch OFF anstatt 'OFF'

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 19:58
von DonMarcello
Also der Auslöser/Trigger sollten die Stati der Ping-Erreichbarkeiten sein.

Also wenn PingMarcel... UND PingMelanie... gleich OFF sind, dann soll die Rule ausgelöst werden. Ich vermute, ich habe hier noch ein grundsätzliches Verständnisproblem bei den OpenHab-Skripten. Ich vergleiche das aktuell wie eine normale Programmiersprache. Da sind ja UND-Operatoren kein Problem.

Geht das überhaupt? In deinem Beispiel hast du

Code: Alles auswählen

when
    Item PingMarcelHandy_Online changed or
    Item PingMelanieHandy_Online changed
verwendet. Hier soll ja eigentlich nicht or sondern and. Kann man das 1:1 austauschen?

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 20:12
von DonMarcello
Kommando zurück ... ich hatte tatsächlich einen Denkfehler bzgl. des Triggers.

Der Trigger ist, wenn sich ein Status ändert. Dann wird die UND-Funktion ausgeführt. Jetzt habe ich das System begriffen :D

Danke dir int5749!

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 20:52
von udo1toni
Anmerkung hierzu:

Gewöhnlich brauchst Du dazu keine Rule! Stattdessen reicht es, eine Gruppe zu definieren, in der die beiden Items enthalten sind. Die Gruppe definierst Du mit dem Members Base Type Switch und der Aggregation Function All OFF then ON else OFF.

Ab sofort wird der Status der Group abgängig von den Status der Member gesteuert werden. Falls noch weitere Smartphones dazu kommen, packst Du sie einfach ebenfalls in die Group, den Rest erledigt openHAB.

Wichtig ist noch, dass die Group kein received command triggern wird, sie wird lediglich ihren Status ändern, also changed triggern. Das spielt aber gewöhnlich keine Rolle.

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 21:56
von DonMarcello
Hallo udo1toni,

danke für deine Ergänzung. Ich muss gestehen, dass ich dir gerade nicht folgen kann. Ich bin noch recht neu in Openhab und mache gerade die ersten Schritte auf der GUI. Ich weiß noch nicht, wo ich Gruppen definieren kann. Das muss ich mir mal in Ruhe anschauen.

Vielleicht trotzdem darauf aufbauend eine weitere Frage:
Ich baue gerade die Zentralheizungsfunktion. Ein Schalter, der bei allen Heizungen die Solltemperatur ändert. Wenn ich nun das Item Zentralheizung auf die Solltemperatur 20 Grad ändere, wie übertrage ich diesen Wert dann an die anderen Solltemperaturen der Heizungen? Gibt es vielleicht ein Blockly-Beispiel? Aktuell kann ich nur vordefinierte Werte als Text senden. Aber ich habe noch nicht herausgefunden, wie ich den Wert der Solltemperatur des Items A an als State der Solltemperatur bei den Items B und C setzen kann.

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 22:01
von DonMarcello
Ich schreibe heute etwas schneller als ich anschließend die Lösung finde ... man kann das Text Feld gegen das State austauschen ... hat sich auch erledigt ... sorry :)

Re: Script mit zwei Bedingungen "AND"

Verfasst: 22. Apr 2022 23:59
von udo1toni
Gruppen sind auch nur eine besondere Art Items, entsprechend definiert man sie über die Items.
Man kann in openHAB3 die Items sowohl über die Gruppe zuordnen (Direct Group Members, nachdem die Gruppe angelegt wurde, es können mehrere Items auf einmal der aktuellen Gruppe zugeordnet werden), als auch im Item selbst (Group Membership, es können beliebig viele Gruppen auf einmal für das aktuelle Item selektiert werden).

Gruppen können auch Gruppen enthalten. Das Semantic Model nutzt ebenfalls Gruppen.
Wenn man Gruppen anderen Gruppen zuweist, sollte man darauf achten, keinen Zirkelbezug zu erzeugen :)

Ansonsten sind Gruppen eine der mächtigeren Funktionen in openHAB :) Beispiel Heizung: Du packst alle Thermostaten in eine Gruppe. Anschließend reicht ein Befehl an die Gruppe, um alle Thermostaten auf einen Schlag auf die gleiche Temperatur zu setzen. Dazu braucht es also eigentlich keine Rule. Möchte man Rules generalisieren (eine Rule, die sich um viele gleichartige Items kümmert) sind Gruppen quasi unentbehrlich.

Re: Script mit zwei Bedingungen "AND"

Verfasst: 23. Apr 2022 13:55
von DonMarcello
Ich hab es gefunden. Das kannte ich noch gar nicht. Vielen dank für den Hinweis!

Das macht es definitiv in der Rules-Sektion übersichtlicher :)