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
Netatmo, Regen und Wind Regel
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Netatmo, Regen und Wind Regel
Deine Logik ist verkehrt herum.
!= bedeutet ungleich.
Es wäre vermutlich auch besser, nicht auf UNDEV zu testen, sondern auf instanceof Number:
Gesendet von iPad mit Tapatalk
!= 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
-
- Beiträge: 41
- Registriert: 8. Jan 2018 19:13
Re: Netatmo, Regen und Wind Regel
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..
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..
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Netatmo, Regen und Wind Regel
Da ich jetzt am Laptop sitze...
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.
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
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
-
- Beiträge: 41
- Registriert: 8. Jan 2018 19:13
Re: Netatmo, Regen und Wind Regel
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ß..
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ß..