Hallo zusammen,
ich habe folgendes Problem. Es läuft im Hintergrund (nicht in Openhab) ein Cronjob, der alle paar Minuten Daten vom Auto ausliest und via REST Openhab übergibt.
Ich habe eine Rule gebaut, die eine Info verschicken soll, wenn der Kilometerstand eine bestimmte Schwelle unterschritten hat.
var Number counter = 0
rule "RenaultZEService_Zoe_send_broadcast_if_under_certain_limit"
when
Item RenaultZEServices_Zoe_RemainingRange changed or
System started
then
if ((RenaultZEServices_Zoe_RemainingRange.state >= 100) && (RenaultZEServices_Zoe_Charging.state == "Not charging")){
counter = 0
logInfo("RemainingRange", "Remaining Range über 100km : " + counter)
}
if ((RenaultZEServices_Zoe_RemainingRange.state <= 100) && (counter == 0) && (RenaultZEServices_Zoe_Charging.state == "Not charging") ){
sendBroadcastNotification("Achtung! Restreichweite: " + RenaultZEServices_Zoe_RemainingRange.state +"km Ladestatus: " + RenaultZEServices_Zoe_ChargeLevel.state + "%" )
counter = 1
logInfo("RemainingRange", "Remaining Range unter 100 km: " + counter)
}
if ((RenaultZEServices_Zoe_RemainingRange.state <= 50) && (counter == 1) && (RenaultZEServices_Zoe_Charging.state == "Not charging") ){
sendBroadcastNotification("Kritisch! Restreichweite: " + RenaultZEServices_Zoe_RemainingRange.state +"km Ladestatus: " + RenaultZEServices_Zoe_ChargeLevel.state + "%" )
counter = 2
logInfo("RemainingRange", "Remaining Range unter 50 km : " + counter)
}
end
Den Counter habe ich eingebaut, damit ich nicht ständig Nachrichten bekomme. Aber irgendwie habe ich ein Fehler. Ich bekomme immer in unregelmäßigen Abständen Nachrichten und verstehe nicht warum. Habt ihr eine Idee wo ich noch suchen könnte?
WhatsApp Image 2020-08-14 at 20.49.35.jpeg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Darkwin101 hat geschrieben: ↑14. Aug 2020 21:28
Versuche den Counter mal auf 1.0 usw. zu setzen und abzufragen
Oder setze die Variable auf Integer oder auch int.
Mache ich gleich mal. Sollte doch aber eigentlich nichts ausmachen, oder?
thomas_w hat geschrieben: ↑14. Aug 2020 21:34
Wäre nicht ein Timer sinnvoll (alle 5 min.) anstatt einen Counter zu verwenden oder ein Old-/NewValue. Nur bei Veränderungen senden?
Das habe ich nicht ganz verstanden. Ich will ja einfach nur, dass die Nachricht "einmal" kommt und nicht mehrmals verwendet wird. Daher ein flag das auf "Nachricht gesendet" gesetzt wird (counter).
shuo hat geschrieben: ↑15. Aug 2020 09:04
Was ich auch nicht verstehe ist, warum die rule überhaupt ausgeführt wird. Das Item ändert sich ja überhaupt nicht....
Mindestens 1x wird die Rules ausgeführt da System started angegeben ist
Darkwin101 hat geschrieben: ↑14. Aug 2020 21:28
Versuche den Counter mal auf 1.0 usw. zu setzen und abzufragen
Oder setze die Variable auf Integer oder auch int.
Mache ich gleich mal. Sollte doch aber eigentlich nichts ausmachen, oder?
Manchmal frage ich mich wie "Changed" genau auslöst wird.
Beispiel: Wenn der "alte" Wert 1,005 ist und der neue 1,0054 wird dann "Changed" ausgelöst? Integer Zahlen haben kein Nachkomma. Dann gibt es kein Rundungsproblem.
Ich habe die Rules etwas umgeschrieben und vereinfach (erst mal ohne den Broadcast). Ich hoffe das keine Syntaxfehler drin sind, hab hier nur einen einfachen Editor. Ich verwende xx.state.toString() für die Vergleiche
rule "RenaultZEService_Zoe_send_broadcast_if_under_certain_limit"
when
Item RenaultZEServices_Zoe_RemainingRange changed or
System started
then
if (RenaultZEServices_Zoe_Charging.state.toString == "Not charging") {
if (RenaultZEServices_Zoe_RemainingRange.state.toString) < '50' {
logInfo("RemainingRange", "Remaining Range unter 50 km " + RenaultZEServices_Zoe_RemainingRange.state.toString)
}
if ((RenaultZEServices_Zoe_RemainingRange.state.toString) >= '50') && (RenaultZEServices_Zoe_RemainingRange.state.toString) <= '100')) {
logInfo("RemainingRange", "Remaining Range zwischen 50 km und 100 km " + RenaultZEServices_Zoe_RemainingRange.state.toString )
}
if (RenaultZEServices_Zoe_RemainingRange.state.toString) > '100') {
logInfo("RemainingRange", "Remaining Range über 100 km " + RenaultZEServices_Zoe_RemainingRange.state.toString)
}
} else {
// Test
logInfo("RemainingRange", RenaultZEServices_Zoe_Charging.state.toString)
}
end
Also wenn ich den counter als Integer definiere, geht es auch nicht. Bekomme immer wieder die Nachricht.
thomas_w hat geschrieben: ↑15. Aug 2020 09:28
Mindestens 1x wird die Rules ausgeführt da System started angegeben ist
Mein Server läuft seiten Tagen durch...Uptime ist derzeit bei 26953,7 Minutes
thomas_w hat geschrieben: ↑15. Aug 2020 10:25
Ich habe die Rules etwas umgeschrieben und vereinfach (erst mal ohne den Broadcast). Ich hoffe das keine Syntaxfehler drin sind, hab hier nur einen einfachen Editor. Ich verwende xx.state.toString() für die Vergleiche
Danke für den Ansatz. Das Problem hier wäre, dass ich jedesmal eine Nachricht bekommen würde, wenn der Km-Stand sich ändert. Und genau das will ich ja nicht. Es soll ja eben immer nur einmal die Nachricht verschickt werden....
shuo hat geschrieben: ↑15. Aug 2020 10:33
Danke für den Ansatz. Das Problem hier wäre, dass ich jedesmal eine Nachricht bekommen würde, wenn der Km-Stand sich ändert. Und genau das will ich ja nicht. Es soll ja eben immer nur einmal die Nachricht verschickt werden....
Einmal pro was genau?
Dann ist vielleicht ein Timer die Lösung:
anstatt:
rule "RenaultZEService_Zoe_send_broadcast_if_under_certain_limit"
when
System started or
Time cron "0 0 0/2 * * ?" // alle 2 Stunden Source: http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
ein Timer wird mein Problem nicht wirklich lösen. Ich möchte eine Nachricht rausschicken immer dann, wenn die Restreichweite unter 100 km kommt. Wenn Sie unter 100km ist, dann soll eben einmal die Nachricht verschickt werden.
Daher habe ich hier einen counter-flag eingebaut. Wenn die Nachricht einmal verschickt wurde, wird ein Flag gesetzt, sodass ich nicht mehr in die Bedingung reinkomme.
Sobald ich das Auto auflade und Restreichweite wieder über 100km ist wird das Flag wieder auf Null gesetzt und das Spiel beginnt wieder von vorne....