Seite 1 von 2
Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 10:39
von Andy089
Hallo,
ich habe folgendes vorhaben und möchte sobald die Temperatur über 23° steigt eine E-Mail versendet wird oder ein Commondo an irgendein Gerät gesendet wird.
Hab jetzt zum Testen einfach mal eine Osram Steckdose Eingebunden.
Hab dazu auch eine passendes rules gefunden und diese mit meinen Geräten angepasst, jedoch klappt das nicht.
Kann mir jemand dabei helfen?
Hier mal die Rules:
Code: Alles auswählen
// Variable für Timer
var Timer tTemp = null
// Temperaturüberwachung in der Wohnung
rule "Temperatur"
when
Item Aqara_Temperatur changed
then
if(Aqara_Temperatur.state instance of Number) {
if((Aqara_Temperatur.state as Number) >= 23.00) {
if(tTemp === null)
tTemp = createTimer (now, [|
Osram_Steckdose_WZ.sendCommand(ON)
tTemp.reschedule(now.plusMinutes(1))
])
} else if((Aqara_Temperatur.state as Number) < 21.00) {
tTemp?.cancel
tTemp = null
}
}
end
Re: Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 11:47
von udo1toni
Hast Du denn verstanden, was die Rule tut?
Wie ist das Item Aqara_Temperatur
exakt definiert?
Es sind ein paar Schreibfehler in der Rule enthalten.
Code: Alles auswählen
// globale Variablen immer zu Beginn der Datei definieren!
var Timer tTemp = null // Variable für Timer
rule "Temperatur Überwachung"
when
Item Aqara_Temperatur changed
then
if(!(Aqara_Temperatur.state instanceof Number)) {
logWarn("tempcheck","Fühler liefert keine gültige Temperatur! ({})",Aqara_Temperatur.state)
return; // Rule abbrechen
}
var Number nTemp = (Aqara_Temperatur.state as Number).floatValue // Falls UoM
if(nTemp >= 23) { // Übertemperatur erkannt
if(tTemp === null) // falls noch kein Alarm
tTemp = createTimer(now, [ | // Alarm aktivieren
Osram_Steckdose_WZ.sendCommand(ON) // Alarmmeldung
tTemp.reschedule(now.plusMinutes(1)) // Alarm erneut in 1 Minute
])
} else if(nTemp < 21) { // Normaltemperatur
tTemp?.cancel // Alarmierung beenden
tTemp = null
}
end
Diese Rule ist auf den ersten Blick fast gleich.
Der erste Unterschied: Falls der Temperaturfühler keinen Messwert liefert, gibt es ein log dazu und die Rule wird beendet. (und es heißt
instanceof statt
instance of)
Falls es einen gültigen Wert gibt, wird der Wert in einer Variablen zwischengespeichert. Das hat zwei Gründe. Punkt 1: das mehrfach gebrauchte Statement ist kürzer.
Punkt 2: Es gibt in openHAB das UoM Modell (Units of Measurement), was bedeutet, dass ein Status eventuell einheitenbehaftet ist. 23 ist aber etwas anderes als 23°C. Deshalb wird jeder Vergleich eines UoM wertes mit einer bloßen Zahl scheitern.
Ich schlage hier also zwei Fliegen mit einer Klappe

Re: Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 17:22
von Andy089
Hallo udo1toni,
danke für das fertige Rule, allerdings kann diese von Openhab nicht ausgeführt werden.
hier die meldung aus der log:
2020-03-14 17:18:01.946 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'temperatur - luftfäuchtigkeit.rules' has errors, therefore ignoring it: [13,22]: missing ')' at '{'
Re: Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 17:35
von Darkwin101
if((nTemp >= 23) {
Die Meldung besagt das in Zeile 13 eine geschlossen Klammer Fehlt in diesem fall sollte eine ( Zuviel sein oder sie fehlt in der Zeile 18 also so]))
Re: Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 18:37
von Andy089
vielen dank,
wenn ich in Zeile 13 die eine Klammer wegnehme klappt es, wenn ich in Zeile 18 eine klammer dazu mache klappt es nicht.
allerdings steht jetzt im log:
Code: Alles auswählen
[pse.smarthome.model.script.tempcheck] - Fühler liefert keine gültige Temperatur! (24.45)
Re: Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 20:13
von udo1toni
In Zeile 13 (Zählung nach dem Listing oben) ist eine öffnende Klammer zu viel. Bitte nicht in Zeile 8 etwas ändern!
Re: Steuern per Temperatur veränderung
Verfasst: 14. Mär 2020 20:29
von Andy089
hab ich so abgeändert, jedoch kommt seitdem die oben genannte fehlermeldung in der log
Re: Steuern per Temperatur veränderung
Verfasst: 15. Mär 2020 05:36
von udo1toni
Nein, das ist keine Fehlermeldung, vielmehr stammt sie von diesen Zeilen:
Code: Alles auswählen
if(!(Aqara_Temperatur.state instanceof Number)) {
logWarn("tempcheck","Fühler liefert keine gültige Temperatur! ({})",Aqara_Temperatur.state)
return;
}
Die erste Zeile
bedeutet: Falls Aqara_Temperatur.state nicht vom Typ Number ist, führe den Codeblock innerhalb der {} aus.
Die zweite Zeile gibt die Meldung aus, die dritte Zeile beendet die Rule.
In der Meldung siehst Du hinten den Status, der sehr wohl ausgegeben wird, also muss ein Fehler in der Bedingung sein (die Zeile ist so wie angegeben aber korrekt).
Erleuchtung:

ODER Du hast Aqara_Temperatur nicht als Number Item angelegt. In diesem Fall wäre der Status nicht vom Typ Number, sondern vom Typ String. Optisch kann man diese beiden nicht unterscheiden.
Re: Steuern per Temperatur veränderung
Verfasst: 15. Mär 2020 13:14
von Andy089
Danke für den Tipp, ich hatte die Aqara_Temperatur nicht als Number Item angelegt. habe ich jetzt abgeändert.
Jetzt funktioniert das Ganze auch
Sollte das jetzt auch mit der Luftfeuchtigkeit genau so funktionieren?
hab die Rules soweit mit der Luftfeuchtigkeit Sensor angepasst, jetzt erscheint in der log das diese keine richtige werte liefert.
Code: Alles auswählen
// globale Variablen immer zu Beginn der Datei definieren!
var Timer tTemp = null // Variable für Timer
rule "Luftfeuchtigkeit Überwachung"
when
Item Luftfeuchtigkeit_Aqara_Sensor changed
then
if(!(Luftfeuchtigkeit_Aqara_Sensor instanceof Number)) {
logWarn("tempcheck","Fühler liefert keine gültige Luftfeuchtigkeit! ({})",Luftfeuchtigkeit_Aqara_Sensor.state)
return; // Rule abbrechen
}
var Number nTemp = (Luftfeuchtigkeit_Aqara_Sensor.state as Number).floatValue // Falls UoM
if(nTemp >= 60.00) { // Übertemperatur erkannt
if(tTemp === null) // falls noch kein Alarm
tTemp = createTimer(now, [ | // Alarm aktivieren
playSound("A-Tone-His_Self-1266414414.mp3") // Alarmmeldung
tTemp.reschedule(now.plusMinutes(30)) // Alarm erneut in 1 Minute
])
} else if(nTemp < 59.00) { // Normaltemperatur
tTemp?.cancel // Alarmierung beenden
tTemp = null
}
end
Re: Steuern per Temperatur veränderung
Verfasst: 15. Mär 2020 14:15
von Darkwin101
Dann wäre s gut wenn du auch das item dazu zeigst wie das deklariert ist
Gesendet von iPad mit Tapatalk