[gelöst] Mehrere Bedingungen in einer Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Mawo94
Beiträge: 7
Registriert: 3. Sep 2020 19:11
Answers: 0

[gelöst] Mehrere Bedingungen in einer Rule

Beitrag von Mawo94 »

Hallo OpenHAB Gemeinde,

ich habe mich daran gewagt für mein Smart Home OpenHAb als Zentrale zu verwenden.
Zu Beginn habe ich mich an eien vermeindlich Leichte Aufgabe gewagt.
Die Aufgabenstellung sieht wie folgt aus:
Ein Sonoff POW ist mit Tasmota geflasht und in THhings und Items angelegt. Sie erscheint mit allen Werten als Gruppe im Control Fenster und läst sich bedienen. Diesen nutze ich um die Media Geräte zu schalten.
Nun habe ich versucht eine Rule zu erstellen, die den POW bei unterschreiten einer Leistung (alle Geräte in StdBy) nach eine Zeit ausschalten soll. Dies funktioniert auch.
Sobald der Timer läuft und jemand 1 Gerät wieder ein schaltet soll der Timer gestopt werden. Auch das funktioniert.
Der Code hierzu:

Code: Alles auswählen

var Timer MediaAus = null

rule "Media aus"
when
    Item Steckdose_Media_Leistung changed
then
    var Leistung = Steckdose_Media_Leistung.state as Number
    if  (Leistung < 28)  
        { logInfo("rules", "Media Power low")
             logInfo("rules", "Media Timer activated")
            MediaAus = createTimer(now.plusSeconds(90), [| Steckdose_Media_Power.sendCommand("OFF")
                logInfo("rules", "Media Timer triggered")])                                 
   }
end

rule "Media cancel"
when
    Item Steckdose_Media_Leistung changed
then 
    var Leistung = Steckdose_Media_Leistung.state as Number
    if  (Leistung > 30) { 
         logInfo("rules", "Media Power high")
            MediaAus = null
               logInfo("rules", "Media Timer canceled")
    }
end
Mit diesem Code wird aber ständig der Timer aktiviert und der POW ausgeschaltet wenn die Geräte oder soger der POW aus ist . ebenso wird der Timer gecancelt solange ein Gerät eingeschaltet ist.
Um dies zu vermeiden habe ich diverse Konstallationen versucht, um 2 Bedingung für die aAktivierung und das canceln des Timer zu setzen. Ich habe auf dieversen Seiten nach Lösungen gesucht, um 2 Bedingungen in einer Rule zu verknüpfen.

Hier mein Code Ansatz, den ich mir erarbeitethabe für die Funktionen:

Code: Alles auswählen

var Timer MediaAus = null

rule "Media aus"
when
    Item Steckdose_Media_Leistung changed
then
    var Leistung = Steckdose_Media_Leistung.state as Number
    if  (Leistung < 28)  
        { logInfo("rules", "Media Power low")
        if (Steckdose_Media_Power.state = "ON") {
            logInfo("rules", "Media Timer activated")
            MediaAus = createTimer(now.plusSeconds(90), [| Steckdose_Media_Power.sendCommand("OFF")
                logInfo("rules", "Media Timer triggered")])
        }                                     
    }
end
 
rule "Media cancel"
when
    Item Steckdose_Media_Leistung changed
then 
    var Leistung = Steckdose_Media_Leistung.state as Number
    if  (Leistung > 30) { 
         logInfo("rules", "Media Power high")
        if (MediaAus !== null) {
            MediaAus = null
               logInfo("rules", "Media Timer canceled")
        }
    }
end
Alternativ habe ich auch die folgen Zeilen versucht :

Code: Alles auswählen

if  ((Leistung < 28)  && (Steckdose_Media_Power.state = "ON")) {...Timer Ein...}

   if  ((Leistung > 30) && (MediaAus !== null) ){...Timer cancel...}
   
Nach den Vorlagen, die ich gefunden habe sollten beide Möglichkeiten funktionieren. Leider funktioniert keine der Möglichkeiten. Ich habe alles mehrfach umgestellt und versucht, aber irgendwie habe ich ein Brett vor dem Kopf und finde keinen Fehler.
Kann mir evtl. jemand eien Tip geben wo mein Denkfehler ist.

Mit freundlichen Grüßen
Markus
Zuletzt geändert von Mawo94 am 6. Sep 2020 14:19, insgesamt 1-mal geändert.

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

Re: Mehrer Bedingungen in einer Rule

Beitrag von udo1toni »

Du warst schon auf dem richtigen Weg :)

Aber zuerst mal die Frage: Warum überhaupt zwei Rules? Beide Rules verwenden den identischen Trigger, weshalb es sinnlos ist, für diese Aufgabe zwei Rules zu verwenden.
Dein Problem ist der Item Status. Ich gehe davon aus, dass Steckdose_Media_Power ein Switch Item ist. Ein Status ist kein String!

So sollte es funktionieren:

Code: Alles auswählen

var Timer MediaAus = null

rule "Media"
when
    Item Steckdose_Media_Leistung changed
then
    var Leistung = Steckdose_Media_Leistung.state as Number
    if(Leistung < 28 && Steckdose_Media_Power.state == ON) {
        logInfo("media", "Media Power low, Timer activated.")
        MediaAus = createTimer(now.plusSeconds(90), [| 
            Steckdose_Media_Power.sendCommand(OFF)
            logInfo("media", "Media Timer triggered, Media_Power OFF.")
            MediaAus = null
        ])
    } else if(Leistung > 30 && MediaAus !== null) { 
        logInfo("media", "Media Power high, cancel Timer.")
        MediaAus?.cancel
        MediaAus = null
    }
end
Ein laufender Timer muss mit der Methode .cancel beendet werden, den Handle zu löschen, führt nur dazu, dass man den Handle verliert.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Mawo94
Beiträge: 7
Registriert: 3. Sep 2020 19:11
Answers: 0

Re: Mehrer Bedingungen in einer Rule

Beitrag von Mawo94 »

Danke für die schnelle Antwort.

Ich habe es geändert und werde sehen ob es klappt. Ich denke es wird keine ständigen Befehle mehr geben.
Ich habe es auch mit else versucht - damit hat es aber garnicht funktioniert (warum auch immer).
Beim MediaAus?.cancel macht mich das ' ? ' ein wenig stutzig. Ich kann diese Variante in keiner Vorlage, die ich mir angesehen habe finden. Welche Funktion hat das ' ? ' ?.

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

Re: Mehrer Bedingungen in einer Rule

Beitrag von udo1toni »

Das ? bedeutet: nur falls nicht null. Also

Code: Alles auswählen

MediaAus?.cancel
ist das gleiche wie

Code: Alles auswählen

if(MediaAus !== null)
    MediaAus.cancel
Bei der Gelegenheit: == prüft auf gleich, === prüft auf identisch. Der Unterschied kommt vor allem bei Vergleichen auf null (nicht NULL!) zum Tragen.
Der Wert null wird durch einen Zeiger auf eine bestimmte Speicherzelle repräsentiert. === null prüft nun, ob der Zeiger auf diese eine Speicherzelle verweist, nicht, ob der Wert der Zelle übereinstimmt. also

Code: Alles auswählen

var a = 5
var b = 5
if(a == b)
    logInfo("test","a = b")
if(a === b)
    logInfo("test","a identisch mit b")
Die erste Bedingung ist erfüllt, die zweite nicht. Das ! steht für "nicht", also != "nicht gleich" und !== "nicht identisch".
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Mawo94
Beiträge: 7
Registriert: 3. Sep 2020 19:11
Answers: 0

Re: Mehrer Bedingungen in einer Rule

Beitrag von Mawo94 »

Danke nochmals
- wieder richtig was gelernt - Das mit den 2 bzw. 3 = wußte ich auch noch nicht.

Antworten