Netatmo, Regen und Wind Regel

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Netatmo, Regen und Wind Regel

Beitrag von ThomyTP »

Moin zusammen,
ich scheitere z.Z. an zwei Regeln um Wind und Regen über Netatmo API zu erkennen.

Die Items sind als Number deklariert.

Hier meine Rules:

rule "Markise Rein fahren bei Wind"
when Item Outdoor_LastMessage received update
then
if (Wind_GustStrength.state != UNDEF){
logInfo("Markise", "Wind Update , Es liegen keine Werte vor ")
logInfo("Markise", "Wind Update " + Wind_GustStrength.state)
}
else
logInfo("Markise", "Wind Update, es liegen Werte vor " + Wind_GustStrength.state)
var Number wind = Wind_GustStrength.state as Number
if (wind.intValue() > 20) {
logInfo("Markise", "zu viel Wind")
logInfo("Markise", "Markise ist auf " + Rollo_EG_Markise.state)
if (Rollo_EG_Markise.state > 0) {
logInfo("Markise", "Sie ist über 0, Auto ist " + Markise_Auto.state)
if (Markise_Auto.state == ON ) {
sendCommand (Rollo_EG_Markise,'0')
logInfo("Markise", "Rein gefahren, zu viel Wind")
sendTelegram("bot", "Zu viel Wind, Markise reingefahren, Wind liegt in Böhen bei " + Wind_GustStrength.state)
}}}
end

rule "Regen"
when Item Outdoor_LastMessage received update
then
if (Rain_Hour.state != UNDEF){
logInfo("Regen", "Regen Update , Es liegen keine Werte vor ")
logInfo("Regen", "Regen Update " + Rain_Hour.state)
}
//logInfo("Garten", "Regen Update " + Rain_Hour.state)
var Number rain = Rain_Hour.state as Number
//logInfo("Regen", Rain_Hour.state)
//logInfo("Regen als Number", rain.state)
if (rain.floatValue() > 0.0 ) {
sendCommand (Regen.state,ON)
logInfo("Regen", "Es regnet")
sendTelegram("bot1","Es Regnet")
}
else
{
if (Regen.state == ON) {
sendCommand (Regen.state,OFF)
logInfo("Regen", "Es regnet nicht mehr")
sendTelegram("bot1","Es Regnet nicht mehr")
}}
end


Im Log bekomme ich folgende Meldunden:
2020-08-15 11:57:29.602 [INFO ] [lipse.smarthome.model.script.Markise] - Wind Update , Es liegen keine Werte vor

2020-08-15 11:57:29.602 [INFO ] [eclipse.smarthome.model.script.Regen] - Regen Update , Es liegen keine Werte vor

2020-08-15 11:57:29.612 [INFO ] [lipse.smarthome.model.script.Markise] - Wind Update 5.999995200003839666666666666666668 km/h

2020-08-15 11:57:29.612 [INFO ] [eclipse.smarthome.model.script.Regen] - Regen Update 6.7670001983642578125 mm

2020-08-15 11:57:29.653 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Regen': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(org.eclipse.smarthome.core.items.Item,org.eclipse.smarthome.core.types.Command) on instance: null


Ich habe nun so einiges Probiert, komme aber nicht zum Ziel..

Habt jemand von euch eine Idee??

Dank euch...
Gruß
Thomas

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

Re: Netatmo, Regen und Wind Regel

Beitrag von udo1toni »

Deine Logik ist verkehrt herum.

!= bedeutet ungleich.

Es wäre vermutlich auch besser, nicht auf UNDEV zu testen, sondern auf instanceof Number:

Code: Alles auswählen

if(!(myItem.state instanceof Number)) {
    logInfo(“markise“,“myItem hat keinen gültigen Wert: {}“,myItem.state)
    // weitere Reaktion...
}

Gesendet von iPad mit Tapatalk
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: Netatmo, Regen und Wind Regel

Beitrag von ThomyTP »

Stimmt, ich wollte ereichen das bei undefedinierten Zustand von der API keine Fehlermeldung erscheint...
Also wäre ja da = richtig..

Trotzdem komme ich mit dem Status der Items nicht klar, bei Regen wird das Item nie auf On geschaltet.
Ich denke da gibt es ein Problem mit dem Typen und der Umrechung..

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

Re: Netatmo, Regen und Wind Regel

Beitrag von udo1toni »

Da ich jetzt am Laptop sitze...

Code: Alles auswählen

rule "Markise Rein fahren bei Wind"
when 
    Item Wind_GustStrength changed
then
    if(!(Wind_GustStrength.state instanceof Number){
        logWarn("markise", "Wind Update, ungültiger Wert ({})!",Wind_GustStrength.state)
        return;
    }
    var Number nWind = (Wind_GustStrength.state as Number).floatValue
    logInfo("markise", "Wind Update, Böen bis {}. ", nWind)
    if(nWind > 20) {
        logInfo("markise", "Zu viel Wind! Markise auf {}%, Auto ist {}.", Rollo_EG_Markise.state, Markise_Auto.state)
        if((Rollo_EG_Markise.state as Number) > 0 && Markise_Auto.state == ON) {
            Rollo_EG_Markise.sendCommand(0)
            logInfo("markise", "Rein gefahren, zu viel Wind")
            sendTelegram("bot", "Zu viel Wind, Markise reingefahren, Wind liegt in Böen bei " + Wind_GustStrength.state.toString + "km/h")
        }
    }
end

rule "Regen"
when
    Item Rain_Hour changed
then
    if(!(Rain_Hour.state instanceof Number){
        logWarn("regen", "Regen Update, ungültiger Wert ({})!", Rain_Hour.state)
        return;
    }
    var Number nRain = (Rain_Hour.state as Number).floatValue
    logInfo("regen","Regenmenge {}", nRain)
    if (nRain > 0) {
        if(Regen.state != ON) {
            Regen.postUpdate(ON)
            logInfo("regen", "Es regnet")
            sendTelegram("bot1","Es regnet.")
        }
    } else if(Regen.state == ON) {
        Regen.postUpdate(OFF)
        logInfo("regen", "Es regnet nicht mehr")
        sendTelegram("bot1","Es regnet nicht mehr.")
    }
end
Es waren da noch ein paar weitere Fehler in der Regen-Rule.
Dein Hauptproblem war aber die fehlerhafte Abfrage. Ich habe beide Rules etwas abgeändert. Der von Dir gewählte Trigger erscheint mir ungünstig.
Zur Funktionsweise: enthält das jeweilige Item keinen gültigen Wert (! instanceof Number), so wird eine Warnmeldung mit dem aktuellen Status ausgegeben und die Rule wird beendet (return;). Beachte, dass in diesem Fall hinter return ein Semikolon stehen muss.
Nur falls das Item eine Zahl als Status hält, läuft die Rule weiter. Der Status wird in eine Variable geschrieben und dabei von einer eventuell vorhandenen Einheit befreit. (z.B. m/s oder km/h oder im Fall vom Regen z.B. mm)
Anschließend wird die Variable mit dem konkreten Wert vergleichen, um den es geht.
Im Fall von Wind geht es noch um zwei weitere Werte, die verglichen werden müssen. Es ist besser, die Methode zu nutzen, um die Markise auf Position zu fahren.
Im Fall von Regen wird das Item auf den neuen Status gesetzt (postUpdate). sendCommand wäre nur dann korrekt, wenn die Regenanzeige extern über ein Addon verfügbar gemacht werden soll.

Ich gehe mal davon aus, dass sowohl bot als auch bot1 zum Zeitpunkt der Ausführung der Rule initialisiert sind. ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ThomyTP
Beiträge: 41
Registriert: 8. Jan 2018 19:13
Answers: 1

Re: Netatmo, Regen und Wind Regel

Beitrag von ThomyTP »

Hallo,
was soll ich sagen, perfekt!! :-)
Vielen Dank, genau os klappt es.

Ich hatte da echt einen Denkfehler in der Abfrage, das eigetnliche Problem lag aber in der Konvertierung des Wertes.

Du hast nun meinen Skill Level für die Rules verbessert, vielen Dank !!

P.S natürlich waren die Boßt´s inititalisiert.. :-)

Gruß..

Antworten