Rule mit größer gleich kleiner und Benachrichtigung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Sigi
Beiträge: 15
Registriert: 4. Jan 2020 23:50
Answers: 0

Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von Sigi »

Guten Morgen allerseits,

ich bin neu hier im Forum, beschäftige mich seit über eine Jahr relativ intensiv mit openHAB und habe auch schon einiges erreicht.

Jetzt stoße ich trotz guten Foren und Beispielen an meine Grenzen:
Ich möchte auf meinem iPhone-App via myopenhab.org mittels Notification darüber benachrichtigt werden, wenn es im Garten meines Wochenendhauses unter Null Grad kalt wird sowie wenn die Temperatur wieder über Null Grad steigt.

Folgende Rules habe ich angelegt, ich erhalte jedoch keine Benachrichtigungen.

Code: Alles auswählen

rule "unter Null außen"

when
		Item outTemperatur changed from > 0 to <= 0
then
		sendBroadcastNotification("Temperatur im Garten unter Null.")		
end


rule "über Null außen"

when
		Item outTemperatur changed from <= 0 to > 0
then
		sendBroadcastNotification("Temperatur im Garten über Null.")		
end
Wo liegt mein Fehler? Ähnliche Regeln mit "Item X changed from y to z" Funktionieren ohne Probleme.
Über Hilfe wäre ich sehr dankbar.

Schönen Tag,
Sigi

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von violine21 »

Hallo,
ich würde in der when-Bedingung nur

Code: Alles auswählen

Item outTemperatur changed
schreiben und im then-Teil die Überprüfung durchführen:

Code: Alles auswählen

If (Temperatur im Bereich X
sendBroadcast....)
If (Temperatur im Bereich Y
sendBroadcast....)
Damit kannst du beides dann in einer Rule abhandeln.

Viele Grüße
Zuletzt geändert von violine21 am 5. Jan 2020 11:58, insgesamt 1-mal geändert.

Benutzeravatar
alkaline
Beiträge: 173
Registriert: 20. Apr 2017 13:25
Answers: 0

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von alkaline »

Versuche es mal mit dem hier:

Code: Alles auswählen

if (TempAussen < 0.0 && TempAussen <= 0.9){ \\hier deinen Schalter / deinen Messfühler angeben
sendBroadcastNotification("ist kalt draußen" )
}	 

Sigi
Beiträge: 15
Registriert: 4. Jan 2020 23:50
Answers: 0

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von Sigi »

Hallo,

vielen Dank schonmal für eure Hilfe.
Wenn ich euch richtig verstehe, sollte meine Regel in etwa wie folgt aussehen:

Code: Alles auswählen

val oTemp = outTemperatur.state as Number

rule "unter Null außen"

when
		Item outTemperatur changed
then
		if (oTemp <= 0){
		sendBroadcastNotification("Temperatur im Garten unter Null.")
		}
		else if (oTemp > 0){
		sendBroadcastNotification("Temperatur im Garten über Null.")
		}	
end
Diese funktioniert auch und sendet mir die gewünschten Mittelungen.
Das Problem das ich jedoch damit habe ist, dass bei jeder Änderung der Temperatur (also jede Minute) eine Mitteilung gesendet wird. Dies will ich aber auf keinen Fall.
Deshalb hatte ich auch Anfangs den Ansatz verfolgt, dass das Über- oder Unterschreiten des Schwellenwertes "Null Grad" entscheidet, ob und welche Nachricht gesendet wird.
Wahrscheinlich sehe ich aber auch vor lauter Bäumen den Wald nicht mehr.

Liebe Grüße,
Sigi

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von violine21 »

Du kannst doch ein "virtuelles" Item einbauen, welches jeweils von der anderen Seite abgefragt wird:

Code: Alles auswählen

if (oTemp <= 0 && virtuelesItem == 0){
sendBroadcastNotification("Temperatur im Garten unter Null.")
virtuelles Item.postUpdate(1)
}
else if (oTemp > 0 && virtuellesItem == 1){
sendBroadcastNotification("Temperatur im Garten über Null.")
virtuelles Item.postUpdate(0)
}	
Damit wird die Nachricht nur einmal gesendet, bevor es von der anderen Bedingung wieder "freigeschaltet" wird.

Sigi
Beiträge: 15
Registriert: 4. Jan 2020 23:50
Answers: 0

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von Sigi »

Hallo violine21,

ich habe deinen Code noch etwas angepasst/ergänzt:

Code: Alles auswählen

val oTemp = outTemperatur.state as Number

rule "unter Null außen"

when
		Item outTemperatur received update
then
		if (oTemp <= 0 && v_A.state == 0){
			sendBroadcastNotification("FROST im Garten!")
			v_A.postUpdate(1)
		}
		else if (oTemp > 0 && v_A.state == 1){
			sendBroadcastNotification("Kein Frost mehr.")
			v_A.postUpdate(0)
		}		
end
Jetzt klappt alles wie es soll.

VIELEN VIELEN LIEBEN DANK.

Schönen Abend,
Sigi

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

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von udo1toni »

Nein, das kann so nicht klappen!
In jeder der gezeigten vollständigen Rules bestehen Verstöße gegen die Regeln, wie eine Rule geschrieben wird.
Erstes Posting:

Code: Alles auswählen

when
    Item outTemperatur changed from > 0 to <= 0
then
from und to müssen gegen Status prüfen, Vergleiche (größer, kleiner, ist gleich) sind nicht erlaubt.
Weitere Postings:

Code: Alles auswählen

val oTemp = outTemperatur.state as Number
Außerhalb einer Rule dürfen nur konkrete (fixe) Werte zugewiesen werden.
Weiterhin geht es ja um einen veränderlichen Wert, es ist also sinnlos, hier eine Konstante (val) zu verwenden.
Korrekt sieht die Rule eher so aus:

Code: Alles auswählen

rule "unter Null außen"
when
    Item outTemperatur changed
then
    if(!(previousState instanceof Number)) {
        logWarn("outtemp","previousState keine gültige Zahl! ({})",previousState)
        return;
    }
    if(!(newState instanceof Number)) {
        logWarn("outtemp","newState keine gültige Zahl! ({})",newState)
        return;
    }
    if(previousState >= 0 && newState < 0) 
        sendBroadcastNotification("FROST im Garten!")
    else if(previousState < 0 && newState >= 0) 
        sendBroadcastNotification("Kein Frost mehr.")
end
Die implizite Variable newState steht erst seit 2.5 zur Verfügung, für OH-Versionen <=OH2.4 muss es stattdessen outTemperatur.state heißen.
Die Prüfung zu Beginn der Rule stellt sicher, dass die Rule beim Systemstart oder unterwegs nicht mit einer Nullpointer Exception abbricht, nur weil eine der beiden Variablen keine Zahl enthält.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von violine21 »

Wieder was gelernt!
Kann ich mir das so vorstellen, das OpenHAB bis zu dieser Zeile, bzw. bis zur Abarbeitung der Rule:

Code: Alles auswählen

if(previousState >= 0 && newState < 0)
den alten Wert im Speicher hat, was ja durch diese Abfrage erkannt wird:

Code: Alles auswählen

Item outTemperatur changed
?
Oder benötige ich dazu evtl. eine Persistence für

Code: Alles auswählen

outTemperatur
?

Das wäre dann ja super geeignet, um aus Schaltersignalen Impulse zu formen.

Sigi
Beiträge: 15
Registriert: 4. Jan 2020 23:50
Answers: 0

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von Sigi »

Dem "Wieder was gelernt!" kann ich mich nur dankend anschließen.

Die Rule von Udo funtioniert wunderbar bis auf ein kleines Problem:
Sobald die Temperatur auf Null springt, erhalte ich zwei sich wiedersprechende Benachrichtigungen.
Mein Ansatz dies zu lösen lautet folgendermaßen:

Code: Alles auswählen

rule "unter Null außen"
when
    Item outTemperatur changed
then
    if(!(previousState instanceof Number)) {
        logWarn("outtemp","previousState keine gültige Zahl! ({})",previousState)
        return;
    }
    if(!(newState instanceof Number)) {
        logWarn("outtemp","newState keine gültige Zahl! ({})",newState)
        return;
    }
    if(previousState > 0 && newState <= 0) 
        sendBroadcastNotification("FROST im Garten!")
        
    else if(previousState < 0 && newState = 0) 
        sendBroadcastNotification("FROST im Garten!")
        
    else if(previousState < 0 && newState > 0) 
        sendBroadcastNotification("Kein Frost mehr.")
end
Ich hoffe, nicht wieder allzuviel falsch gemacht zu haben :)

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

Re: Rule mit größer gleich kleiner und Benachrichtigung

Beitrag von udo1toni »

Sigi hat geschrieben: 6. Jan 2020 14:53 Die Rule von Udo funtioniert wunderbar bis auf ein kleines Problem:
Sobald die Temperatur auf Null springt, erhalte ich zwei sich wiedersprechende Benachrichtigungen.
Hmm...
kleiner Denkfehler, große Wirkung.

Code: Alles auswählen

if(previousState >= 0 && newState < 0) 
        sendBroadcastNotification("FROST im Garten!")
    else if(previousState < 0 && newState >= 0) 
        sendBroadcastNotification("Kein Frost mehr.")
Vermutlich sollte es besser so aussehen:

Code: Alles auswählen

if(previousState >= 0 && newState < 0)
        sendBroadcastNotification("FROST im Garten!")
    else if(previousState <= 0 && newState > 0)
        sendBroadcastNotification("Kein Frost mehr.")
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten