Seite 2 von 2

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

Verfasst: 12. Jan 2020 00:40
von udo1toni
violine21 hat geschrieben: 6. Jan 2020 11:22 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.
Die Variable previousState ist eine implizite Variable, das heißt, sie steht zur Verfügung, weil die Rule durch den Trigger changed ausgelöst wurde. Ein Persistence Service ist dazu nicht notwendig.

Es gibt noch andere implizite Variablen, z.B. receivedCommand, falls die Rule durch received command getriggert wurde.
Man kann diese Variablen auch verwenden, um zu erkennen, welcher Trigger ausgelöst hat, falls man verschiedene Trigger nutzt (siehe oben).
Man muss sich im Zusammenhang mit received command auch klar machen, dass ein Item, welches ein Kommando empfangen hat, nicht zwingend dieses Kommando als Status hält, im Gegenteil ist das nur zufällig und vielleicht der Fall.
Die impliziten Variablen sind in der offiziellen Doku erläutert: https://www.openhab.org/docs/configurat ... tion-block

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

Verfasst: 23. Mai 2020 19:49
von Ambo
Nun - ist schon 2 Jahre her, sorry, dass ich jetzt hier nochmal anknüpfe.
Ich möchte über die OpenWeatherMap eine Windwarnung erhalten und habe versucht den Transfer aus euren Vorlagen dafür umzusetzen. Leider jedoch ohne Wirkung. Es tut sich nichts. Meine Diagramme zum Wind, die ich laufen habe erscheinen wie erwartet, d.h. die Daten von OWM sind ok.
Aber die Regel, die mir ab einer gewissen Windgeschwindikeit eine Warnung auf Telegram schickt macht einfach gar nichts. (im Test ist es jetzt mal der Wert 10 - der wird später noch erhöht) Weder eine Meldung auf Telegram, noch ein Eintrag in einer Log

Item:

Code: Alles auswählen

Number:Speed CurrentWindSpeed           "Windgeschwindigkeit"    <wind>   (grWetterChart) {channel="openweathermap:weather-and-forecast:local:local:current#wind-speed"}
Regel:

Code: Alles auswählen

rule "Windalarm"
when
    Item CurrentWindSpeed 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 >= 10 && newState < 10) 
        sendTelegram("bot1", "Windalarm")
    else if(previousState <= 10 && newState > 10)
        sendTelegram("bot1", "Windalarm")
        
    else if(previousState < 10 && newState > 10) 
        sendTelegram("bot1", "Wind flaut ab")
end
Fehlen da evtl bei else if die Klammern? { }
Hab ich was übersehen?

Würde mich über eure Unterstützung freuen.

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

Verfasst: 23. Mai 2020 23:22
von peter-pan
Das hängt damit zusammen, dass das Item "CurrentWindSpeed" ein UoM-Item ist, d.h es führt die Mass-Einheit im Wert (state) mit. Das musst du beim Vergleich berücksichtigen.

Hier ein paar Beispiele, wie man das machen kann:

Code: Alles auswählen

rule "Rain warning"

when
    Item Dummy4 changed

then
    if(localHourlyForecast3RainVolume.state<0.1 | "mm") {
       logInfo("RainVolume","RainVolume with Pattern: " + localHourlyForecast3RainVolume)
     } // works
     if( (localHourlyForecast3RainVolume.state as Number).floatValue < 0.01) {
       logInfo("RainVolume","RainVolume as Float for comparison: " + localHourlyForecast3RainVolume)
     } // works
     var vRainVol = (localHourlyForecast3RainVolume.state as Number).floatValue
     if( vRainVol < 4) {
       logInfo("RainVolume","RainVolume with changed Variable: " + vRainVol)
     } // works
end
Ich nehme mal an, dass die Einheit für das Item "km/h" ist. Für die erste Variante müsstest du dann "mm" durch "km/h" ersetzen. Die anderen beiden Versionen eliminieren sozusagen die Einheit aus dem Wert.

Zum testen würde ich auch noch ein paar LogInfos einbauen, damit man sieht, wo genau die Regel nicht mehr das macht, was man sich wünscht.

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

Verfasst: 24. Mai 2020 00:31
von PeterA
Diese Rule nutze ich schon sehr lange:

Code: Alles auswählen

 // globale Variablen müssen zu Beginn der rules Datei deklariert werden!
var Timer tWind = null

rule "Windwarnung"

when
    Item LocalWeatherAndForecast_Current_WindSpeed changed
    
then
    if(tWind === null && (LocalWeatherAndForecast_Current_WindSpeed.state >30 | "km/h")) {
        tWind = createTimer(now.plusHours(3), [ |
            tWind = null
        ])
        sendBroadcastNotification("WINDWARNUNG !!  Gartensachen sichern!") //Allgemeine Warnung an alle 
        
        
    }
end

Gruß

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

Verfasst: 24. Mai 2020 17:10
von udo1toni
Man kann die Einheit auch über eine Formatwandlung weg bekommen:

Code: Alles auswählen

var myVal = (MyItem.state as Number).floatValue
oder

Code: Alles auswählen

var myVal = (MyItem.state as Number).intValue
Je nachdem, ob es sich um eine Gleitkommazahl oder ein Integer handelt. Vorteil der Angabe der Einheit mittels | ist, dass man nicht auf die eine Einheit beschränkt ist.
Wenn z.B. die Windgeschwindigkeit im m/s ankommt, kann man trotzdem mit km/h vergleichen, und die UoM Funktion in openHAB kümmert sich automatisch darum, den Wert mit 3,6 zu multiplizieren. Nachteilig ist halt, dass man die ganze Zeit die Einheiten mit herum schleppen muss, das ist beim Format wandeln nicht notwendig, dafür muss man wissen, in welcher Einheit der Wert als default vorliegt, ob m/s oder km/h, oder Knoten oder Miles/h oder was auch immer.

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

Verfasst: 23. Nov 2020 09:42
von Vero Beach
Hallo Allerseits

Ich habe versucht die Tipps und Hilfen in diesem nützlichen Thread auf meine Rule anzuwenden, die Rule als solches scheint zwar korrekt zu sein, aber dennoch funktioniert irgend etwas nicht richtig. Zwar erhalte ich meist nach einem Restart des Systems teilweise korrekte Benachrichtigungen, viele Benachrichtigungen entsprechen aber nicht den Trigger der Rule. Ich vermute entweder ein Problem mit der Formatumwandlung, der Variablenzuweisung oder bei der Rundung des Messwertes. Ich erhalte in Visual Studio Code zudem folgende Fehlerwarnung:

"Cannot reference the field 'ShellyhtWeinkellerSensorsTemperature' before it is defined(org.eclipse.xtext.xbase.validation.IssueCodes.illegal_forward_reference)"

Hier meine Rule, die stark an diesen Thread angelehnt ist:

var cellartemp = (ShellyhtWeinkellerSensorsTemperature.state as Number).floatValue

rule "Weinkeller Temperatur Warnung"
when
Item ShellyhtWeinkellerSensorsTemperature changed
then
if (cellartemp > 14.0) {
sendBroadcastNotification("Weinkeller Temperatur über 14° C: " + ShellyhtWeinkellerSensorsTemperature.state)
}
else if (cellartemp < 13.0) {
sendBroadcastNotification("Weinkeller Temperatur unter 13° C: " + ShellyhtWeinkellerSensorsTemperature.state)
}
end


Viele Dank für Eure Hilfe.

Beste Grüsse

Remo

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

Verfasst: 23. Nov 2020 12:48
von peter-pan
Du definierst die Variable "cellartemp" ausserhalb der Regel. Probier's mal so:

Code: Alles auswählen

rule "Weinkeller Temperatur Warnung"
 when
  Item ShellyhtWeinkellerSensorsTemperature changed
 then
  var cellartemp = (ShellyhtWeinkellerSensorsTemperature.state as Number).floatValue
  if (cellartemp > 14.0) {
     sendBroadcastNotification("Weinkeller Temperatur über 14° C: " + ShellyhtWeinkellerSensorsTemperature.state)
  }
  else if (cellartemp < 13.0) {
    sendBroadcastNotification("Weinkeller Temperatur unter 13° C: " + ShellyhtWeinkellerSensorsTemperature.state)
 }
end
Die erste Fehlermeldung nach dem Restart kommt vermutlich daher, dass die Rule auf den Change-Event triggered, aber das Item (ShellyhtWeinkellerSensorsTemperature) noch keinen gültigen Wert hat.

Du könntest es mal mit :

Code: Alles auswählen

if(!(ShellyhtWeinkellerSensorsTemperature.state instanceof Number)) return;
als erster Bedingung probieren.

Aber alles ohne Gewähr. ;)

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

Verfasst: 23. Nov 2020 18:07
von Vero Beach
Hallo "peter-pan",

mit Deiner Definition der Variablen innerhalb der Rule funktioniert alles prima.
Ganz herzlichen Dank für die super schnelle Hilfe.

Gruss

Remo

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

Verfasst: 23. Nov 2020 20:57
von peter-pan
immer gerne 👍🏻