Steuern per Temperatur veränderung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Andy089
Beiträge: 59
Registriert: 16. Sep 2019 18:57
Answers: 0

Steuern per Temperatur veränderung

Beitrag 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

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Steuern per Temperatur veränderung

Beitrag 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 ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Andy089
Beiträge: 59
Registriert: 16. Sep 2019 18:57
Answers: 0

Re: Steuern per Temperatur veränderung

Beitrag 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 '{'

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Steuern per Temperatur veränderung

Beitrag 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]))

Andy089
Beiträge: 59
Registriert: 16. Sep 2019 18:57
Answers: 0

Re: Steuern per Temperatur veränderung

Beitrag 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)

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Steuern per Temperatur veränderung

Beitrag von udo1toni »

In Zeile 13 (Zählung nach dem Listing oben) ist eine öffnende Klammer zu viel. Bitte nicht in Zeile 8 etwas ändern!
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Andy089
Beiträge: 59
Registriert: 16. Sep 2019 18:57
Answers: 0

Re: Steuern per Temperatur veränderung

Beitrag von Andy089 »

hab ich so abgeändert, jedoch kommt seitdem die oben genannte fehlermeldung in der log

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Steuern per Temperatur veränderung

Beitrag 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

Code: Alles auswählen

if(!(Aqara_Temperatur.state instanceof Number))
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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Andy089
Beiträge: 59
Registriert: 16. Sep 2019 18:57
Answers: 0

Re: Steuern per Temperatur veränderung

Beitrag 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

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Steuern per Temperatur veränderung

Beitrag von Darkwin101 »

Dann wäre s gut wenn du auch das item dazu zeigst wie das deklariert ist


Gesendet von iPad mit Tapatalk

Antworten