Seite 1 von 2

Rule mit größer gleich kleiner und Benachrichtigung

Verfasst: 5. Jan 2020 09:58
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

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

Verfasst: 5. Jan 2020 11:14
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

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

Verfasst: 5. Jan 2020 11:27
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" )
}	 

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

Verfasst: 5. Jan 2020 15:56
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

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

Verfasst: 5. Jan 2020 16:08
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.

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

Verfasst: 5. Jan 2020 19:57
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

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

Verfasst: 5. Jan 2020 23:16
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.

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

Verfasst: 6. Jan 2020 11:22
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.

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

Verfasst: 6. Jan 2020 14:53
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 :)

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

Verfasst: 11. Jan 2020 23:07
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.")