Seite 1 von 3

Saunatemperatur

Verfasst: 13. Okt 2022 21:37
von Snatsch
Hallo :)
ich hatte immer eine Rule laufen die mir angesagt hatte wenn meine Sauna eine Temperatur von 85 Grad erreicht hatte.
unter Version 3.0.2 lief sie auch immer ohne Probleme ;) jetzt habe ich auf Version 3.3.0 aktualisiert und die Rule ging nicht mehr :( gestern war Saunaabend und als die Temperatur 85 Grad überschritten hatte bekam ich 1000 Meldungen das die 85 Grad erreicht sind.
Jetzt habe ich die Rule versucht umzuschreiben und bekomme aber immer folgende Fehlermeldung.

Code: Alles auswählen

2022-10-13 21:28:40.206 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'Saunatemperatur_85_Grad.rules', using it anyway:


Das ist die Rule

Code: Alles auswählen

rule "Sauna Temperatur 85 Grad"
when 
    Item Sauna_Temperatur changed 
then
    if(!(Sauna_Temperatur.state instanceof Number)) {
       logWarn("SaunaTemperatur", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val nNew = (Sauna_Temperatur.state as Number).floatValue
    if(nNew > 85 && nPrev <= 85) {
       logInfo("SaunaTemperatur", "Die Sauna Temperatur ist ueber 85 Grad")
      Meldung.postUpdate("Die Sauna hat die Temperatur von 85 Grad ereicht ")
    }  
vielleicht kann mir jemand sagen was verkehrt ist :?:

Re: Saunatemperatur

Verfasst: 14. Okt 2022 09:26
von Mclupo

Code: Alles auswählen

 if(nNew > 85 && nPrev <= 85)
Wo kommt denn nPrev her?

Re: Saunatemperatur

Verfasst: 14. Okt 2022 10:54
von peter-pan
...hast du es vielleicht schon mal so probiert(implizite Variablen):

Code: Alles auswählen

if(previousState <= 85 && newState > 85)

Re: Saunatemperatur

Verfasst: 14. Okt 2022 11:47
von Snatsch
:) He vielen Dank für eure Hilfe.
Ich habe meinen Raspi einmal neu gestartet seitdem ist die Fehlermeldung weg. Mal schauen wie es beim nächsten Saunaabend aussieht :lol:

Re: Saunatemperatur

Verfasst: 22. Okt 2022 23:35
von Snatsch
Hallo,
heute war mal wieder Saunaabend doch mit der Rule wollte es nicht funktionieren :(
Leider gab es keine Ausgabe mit folgender Rule

Code: Alles auswählen

rule "Sauna Temperatur 85 Grad"
when 
    Item Sauna_Temperatur changed 
then
    if(!(Sauna_Temperatur.state instanceof Number)) {
       logWarn("SaunaTemperatur", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val newState = (Sauna_Temperatur.state as Number).floatValue
    if(previousState <= 85 && newState > 85) {
       logInfo("SaunaTemperatur", "Die Sauna Temperatur ist ueber 85 Grad")
      Meldung.postUpdate("Die Sauna hat die Temperatur von 85 Grad ereicht ")
    }  
end

Re: Saunatemperatur

Verfasst: 22. Okt 2022 23:54
von udo1toni
Erst mal: newState ist eine implizite Variable, die darfst Du nicht setzen. newState enthält analog zu previousState den Status des triggernden Items.

Der Inhalt ist aber jeweils ein Status, keine Zahl. Es ist möglich, dass openHAB den Status automatisch als Zahl behandelt, aber es gibt verschiedene Möglichkeiten, warum das nicht passiert. Auch kann das Item ein UoM Item sein, womit dann der Vergleich mit Einheit stattfinden muss oder die Einheit, falls vorhanden, gestrippt werden muss.

Auf der sicheren Seite wärst Du mit folgender Regel:

Code: Alles auswählen

rule "Sauna Temperatur 85 Grad"
when
    Item Sauna_Temperatur changed
then
    if(!(newState instanceof Number)) {                                                         // Falls aktuell kein gültiger Wert
       logWarn("SaunaTemperatur", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")   // Meldung
       return;                                                                                  // und Abbruch
    }
    val newTemp = (newState as Number).floatValue                                               // übernimm Wert ohne Einheit
    var oldTemp = 20.1                                                                          // erzwinge eine Variable vom Typ Float
    if(!(previousState instanceof Number)) {                                                    // falls alter Wert ungültig
       logInfo("SaunaTemperatur", "Vorgängerwert ungültig. Setze Wert unter Grenzwert!")        // Meldung
       oldTemp = 80                                                                             // und default Wert setzen
    } else                                                                                      // falls alter Wert gültig
       oldTemp = (previousState as Number).floatValue                                           // übernimm diesen ohne Einheit

    if(oldTemp <= 85 && newTemp > 85) {                                                         // falls Temperatur gerade über 85 gestiegen
        logInfo("SaunaTemperatur", "Die Sauna Temperatur ist ueber 85 Grad")                    // Meldung
        Meldung.postUpdate("Die Sauna hat die Temperatur von 85 Grad ereicht")
    }
end

Re: Saunatemperatur

Verfasst: 23. Okt 2022 00:07
von Snatsch
He udo1toni :) wie immer bin ich dir für deine Hilfe sehr dankbar :)
wenn ich die Rule von dir per Hand anschiebe kommt die Fehlermeldung im Log

Code: Alles auswählen

2022-10-23 00:03:49.935 [WARN ] [ab.core.model.script.SaunaTemperatur] - Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!

Re: Saunatemperatur

Verfasst: 23. Okt 2022 01:55
von udo1toni
Die Warnmeldung ist in der Regel selbst codiert und völlig korrekt.

Man kann diese Regel nicht händisch starten, weil sie auf dem Trigger changed beruht und auch von den impliziten Variablen Gebrauch macht.
Du kannst natürlich newState mit itemname.state ersetzen, das nutzt Dir aber im Zusammenhang mit previousState nichts, denn auch dies steht nur im changed-Kontext zur Verfügung, aber im Gegensatz zu newState gibt es keinen Ersatz - es sei denn, Du hast das Item persistiert, dann könntest Du Itemname.previousState verwenden. Das sähe dann so aus:

Code: Alles auswählen

rule "Sauna Temperatur 85 Grad"
when
    Item Sauna_Temperatur changed
then
    if(!(Sauna_Temperatur.state instanceof Number)) {                                                         // Falls aktuell kein gültiger Wert
       logWarn("SaunaTemperatur", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")   // Meldung
       return;                                                                                  // und Abbruch
    }
    val newTemp = (Sauna_Temperatur.state as Number).floatValue                                               // übernimm Wert ohne Einheit
    var oldTemp = 20.1                                                                          // erzwinge eine Variable vom Typ Float
    if(!(Sauna_Temperatur.previousState.state instanceof Number)) {                                                    // falls alter Wert ungültig
       logInfo("SaunaTemperatur", "Vorgängerwert ungültig. Setze Wert unter Grenzwert!")        // Meldung
       oldTemp = 80                                                                             // und default Wert setzen
    } else                                                                                      // falls alter Wert gültig
       oldTemp = (Sauna_Temperatur.previousState.state as Number).floatValue                                           // übernimm diesen ohne Einheit

    if(oldTemp <= 85 && newTemp > 85) {                                                         // falls Temperatur gerade über 85 gestiegen
        logInfo("SaunaTemperatur", "Die Sauna Temperatur ist ueber 85 Grad")                    // Meldung
        Meldung.postUpdate("Die Sauna hat die Temperatur von 85 Grad ereicht")
    }
end
Allerdings ist es eher witzlos, die Rule so zu starten, denn sie wird niemals etwas tun (es sei denn, Du startest sie in dem Moment von Hand, wo sie ohnehin durch den Trigger gestartet wurde und den Kipppunkt <=85 -> > 85 detektiert.

Re: Saunatemperatur

Verfasst: 23. Okt 2022 14:42
von peter-pan
...vielleicht geht ja zur Manipulation des Items ein "kleiner Schubs" per Karaf-Konsole. Das könnte dann mit der von Udo ursprünglich erstellten Rule doch gehen.

Also zuerst schauen, wie die aktuelle Temperatur ist, und dann eine Wert, (1/2 Grad hoch/runter) an das Item senden(Beispiel):

Code: Alles auswählen

openhab> items list |grep -i gaszaehler_heute
Gaszaehler_Heute (Type=NumberItem, State=0.03, Label=Gaszählerstand heute, Category=null)

openhab> openhab:send Gaszaehler_Heute 0
Command has been sent successfully.
openhab>
Bei der Eingabe in der Konsole ist zu beachten, das nur über die "normale Tastatur" Eingaben erfolgen (auch Zahlen). Die Zehnertastatur darf nicht benutzt werden (zumindest bei mir).

Re: Saunatemperatur

Verfasst: 23. Okt 2022 17:23
von Snatsch
Vielen Dank udo1toni für die Erklärung :) Also auf den nächsten Saunaabend warten :) aber deine Sachen haben bis jetzt immer gepasst :D
peter-pan der Rule Schnipsel von dir würde mich auch sehr interessieren da das mein nächstes Objekt werden soll :lol: Ich habe eine Gastherme (Buderus) mit KM 200 Binding und würde mir gerne meinen Gasverbrauch für Tag, Monat und Jahr anzeigen lassen :D