Seite 1 von 2
Windwarnung über Cloudserver
Verfasst: 7. Mär 2019 11:51
von madmike
Hallo zusammen,
ich bräuchte einmal Eure Hilfe mit einer Rule.
Ich möchte gerne eine Windwarnung über den Cloudserver senden. Das senden funktioniert habe ich schon probiert.
Die abhängig Größe soll die Überschreitung des Wertes sein der mir Über OpenweatherMap ausgegeben wird.
Zusätzlich soll diese Warnmeldung nur alle 3 Stunden ausgegeben werden.
Ich tue mich damit etwas schwer die richtigen Begrifflichkeiten zuzuordnen.
Hier meine Items:
Code: Alles auswählen
Number:Speed localCurrentWindSpeed "Windgeschwindigkeit [%.1f km/h]" <wind> { channel="openweathermap:weather-and-forecast:api:local:current#wind-speed" }
und hier mein erster Versuch der rule:
Code: Alles auswählen
rule "Windwarnung"
when
localCurrentWindSpeed.valve >=49
then
sendBroadcastNotification("WINDWARNUNG !! Gartensachen sichern!")
createTimer(now.plusMinutes(180)) [|
sendBroadcastNotification("WINDWARNUNG !! Gartensachen sichern!")
]
end
das ist die Fehlermeldung:
Code: Alles auswählen
2019-03-07 11:54:04.411 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'windwarnung.rules' has errors, therefore ignoring it: [6,5]: no viable alternative at input 'localCurrentWindSpeed'
Irgendwie will das ganze aber noch nicht richtig auslösen. Hat jemand einen Tipp ??
mfg
Micha
Re: Windwarnung über Cloudserver
Verfasst: 7. Mär 2019 12:37
von PeterA
Hi,
müsste das nicht "localCurrentWindSpeed.value >=49" lauten ?
Re: Windwarnung über Cloudserver
Verfasst: 7. Mär 2019 12:41
von mamoel
Die rule ist zumindest hinsichtlich der Triggerbedingung falsch. Das muss so ähnlich aussehen:
Code: Alles auswählen
rule "Windwarnung"
when
Item localCurrentWindSpeed changed
then
if (localCurrentWindSpeed.state >=49) {
sendBroadcastNotification("WINDWARNUNG !! Gartensachen sichern!")
createTimer(now.plusMinutes(180)) [|
sendBroadcastNotification("WINDWARNUNG !! Gartensachen sichern!")
]
}
end
Ob die anderen Befehle und der Timer syntaktisch passen, kann ich nicht sagen. Das müsste ich selbst er testen.
Du würdest aber aktuell permanent die Warnung schicken also bei jeder Änderung der Windgeschwindigkeit - falls diese über 49 liegt. Zusätzlich mit 3h Versatz noch einmal. Das willst Du bestimmt nicht

Re: Windwarnung über Cloudserver
Verfasst: 7. Mär 2019 14:22
von udo1toni
Grundsätzlich brauchst Du natürlich eine Rule, die bei jeder Änderung der Windgeschwindigkeit getriggert wird.
Weiterhin brauchst Du einen Timer, der verhindert, dass die Nachricht zu oft versendet wird.
Als Rahmen wäre das hier geeignet:
Code: Alles auswählen
// globale Variablen müssen zu Beginn der rules Datei deklariert werden!
var Timer tWind = null
rule "Wind Alarm"
when
Item localCurrentWindSpeed changed
then
if(tWind === null && (localCurrentWindSpeed.state as Number) > 49) {
tWind = createTimer(now.plusHours(3), [ |
tWind = null
])
sendBroadcastNotification("WINDWARNUNG !! Gartensachen sichern!")
}
end
Die Rule wird bei jeder Änderung der Windgeschwindigkeit getriggert. Wenn die Windgeschwindigkeit über dem Grenzwert liegt und der Timer nicht läuft, wird der Timer erzeugt und anschließend die Warnmeldung versendet.
Wenn der Timer gestartet wurde, passiert nichts weiter, denn die Rule prüft, ob der Timer läuft. Wenn der Timer abläuft, leert er die Variable und ist wieder "scharf".
Selbstverständlich kann man auch zuerst die Warnmeldung verschicken und den Timer anschließend starten, das spielt keine Rolle. Die gesamte Rule läuft vielleicht 4 Millisekunden.
Bei der Notification muss man natürlich noch einen Empfänger mitgeben
EDIT: Rule korrigiert.
Re: Windwarnung über Cloudserver
Verfasst: 7. Mär 2019 22:23
von madmike
Vielen lieben Dank an mamoel und Udo.
Ich werde beides morgen testen.
Laut dem Cloudserver Dienst würde bei dieser Angabe die Notification an jedes registriertes Gerät meiner Cloud gesendet.
Mal sehen ob es funzt.
Danke Danke
mfg
Micha
Re: Windwarnung über Cloudserver
Verfasst: 8. Mär 2019 02:51
von madmike
So, ich habe die Rule von Udo probiert und bekomme folgende Fehlermeldung:
Code: Alles auswählen
2019-03-08 02:44:47.726 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Windwarnung': Unknown variable or command '>'; line 10, column 26, length 27
die Rule lautet:
Code: Alles auswählen
/ globale Variablen müssen zu Beginn der rules Datei deklariert werden!
var Timer tWind = null
rule "Windwarnung"
when
Item localCurrentWindSpeed changed
then
if(tWind === null && (localCurrentWindSpeed) >40) {
tWind = createTimer(now.plusHours(3), [ |
tWind = null
])
sendBroadcastNotification("WINDWARNUNG !! Gartensachen sichern!")
}
end
Ich habe as number rausnehmen müssen da mir der Fehler angezeigt wurde das ein Number Item nicht als Number dargestellt werden kann und ich habe die Geschwindigkeit zu Testzwecken auf 40 runtergesetzt.
die >40 will er irgendwie nicht anerkennen.
mfg
Micha
Re: Windwarnung über Cloudserver
Verfasst: 8. Mär 2019 04:37
von udo1toni
Ups, da fehlt ein .state. korrekt muss die Zeile so aussehen:
Code: Alles auswählen
if(tWind === null && (localCurrentWindSpeed.state as Number) >40) {
Re: Windwarnung über Cloudserver
Verfasst: 8. Mär 2019 20:27
von madmike
Hallo Udo,
danke für deinen schnellen Tip.
Nach der Änderung war der fehler in der log weg.
Ich habe den Wert derzeit auf 20 gesetzt(echter wert liegt bei der Zeit 26) bekomme aber im log keine Anzeige das die Rule irgendetwas macht.
Weder das sie auslöst noch das eine Nachricht kommt.
mmh mal weiter testen.
hast du noch eine Idee?
mfg
Micha
Re: Windwarnung über Cloudserver
Verfasst: 8. Mär 2019 22:34
von peter-pan
Hallo Micha,
ich habe hier mal eine kleine Test-Rule zusammen gebastelt.
Code: Alles auswählen
rule "Windwarnung"
when
Item Dummy4x changed to ON or
Item localCurrentWindSpeed changed
then
if((localCurrentWindSpeed.state) >20) {
logInfo("windspeed","Windgeschwindigkeit ohne Pattern als Vergleich" + localCurrentWindSpeed)
} // geht nicht
if( (localCurrentWindSpeed.state as Number) > 20) {
logInfo("windspeed","Windgeschwindigkeit umgewandelt ohne Float: " + localCurrentWindSpeed)
} // geht nicht
if(localCurrentWindSpeed.state >20 | "km/h") {
logInfo("windspeed","Windgeschwindigkeit mit Pattern: " + localCurrentWindSpeed)
} // geht
if( (localCurrentWindSpeed.state as Number).floatValue > 20) {
logInfo("windspeed","Windgeschwindigkeit umgewandelt als Float für Vergleich: " + localCurrentWindSpeed)
} // geht
var vWindSpeed = (localCurrentWindSpeed.state as Number).floatValue
if( vWindSpeed > 20) {
logInfo("windspeed","Windgeschwindigkeit mit umgewandelter Variable: " + vWindSpeed)
} // geht
end
Die ersten 2 If-Bedingungen funktionieren nicht (bzw. erkennen den Vergleich nicht richtig).
Die letzten drei sollten aber für deinen Vergleich passen. Also z.B.:
Code: Alles auswählen
if(tWind === null && (localCurrentWindSpeed.state >20 | "km/h")) {
Gruss
Peter
Re: Windwarnung über Cloudserver
Verfasst: 9. Mär 2019 00:21
von madmike
Hallo Peter,
erstmal vielen Dank für deine Mühe.
Ich werde das ganze mal probieren und entsprechen einsetzen.
Melde mich morgen was passiert ist und ob alles erfolgreich abgeschlossen werden konnte.
mfg
Micha