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
Re: Saunatemperatur
Verfasst: 14. Okt 2022 10:54
von peter-pan
...hast du es vielleicht schon mal so probiert(
implizite Variablen):
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

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
peter-pan der Rule Schnipsel von dir würde mich auch sehr interessieren da das mein nächstes Objekt werden soll

Ich habe eine Gastherme (Buderus) mit KM 200 Binding und würde mir gerne meinen Gasverbrauch für Tag, Monat und Jahr anzeigen lassen
