Seite 1 von 3

Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 14. Dez 2019 10:24
von salamander070
Hallo,
habe es soweit hinbekommen, dass Openhab die Werte der Sonoffs per Telegram sendet. Tolle Sache, aber bei vielen Sonoffs bekomme ich einfach zu viele Nachrichten. So würde ich das gerne eingrenzen. z.B. wenn die Werte um 1 Steigen oder fallen, dann erst senden. Dieses würde das ständige Senden von geringen Schwankungen verhindern.
Leider fand ich konkret dazu im Forum nichts.
Aktuell habe ich eben nur
rule "schalt1"
when
Item mqtt_topic_Joshua_joshua1 changed
then
sendTelegram("bot1","Josh: " + mqtt_topic_Joshua_joshua1.state.toString)
end

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 14. Dez 2019 11:44
von udo1toni
Die Frage ist, wie das Item definiert ist. Ich vermute jetzt einfach mal frech, dass mqtt_topic_Joshua_joshua1 vom Typ Number ist. Eine einfache Einschränkung wäre dann z.B.:

Code: Alles auswählen

rule "schalt1"
when
    Item mqtt_topic_Joshua_joshua1 changed
then
    if(Math::abs((mqtt_topic_Joshua_joshua1.state as Number).floatValue -(previousState as Number).floatValue) > 1)
        sendTelegram("bot1","Josh: " + mqtt_topic_Joshua_joshua1.state.toString)
end
Nur, wenn der aktuelle Wert vom vorherigen Wert um mehr als 1 abweicht, wird das Telegramm gesendet.
Diese Rule wird zunächst fast sicher eine Exception auslösen, da previousState bei der ersten Änderung null enthält (sollte man abfangen...)


Falls Du eine Nachricht bekommen willst, wenn der Wert vom letzten Telegramm um mehr als 1 abweicht, musst Du den versendeten Wert speichern, um ihn verleichen zu können:

Code: Alles auswählen

//globale Variablen zu Beginn der Datei definieren!
var Number nJoshua1Sent = -99999

rule "schalt1"
when
    Item mqtt_topic_Joshua_joshua1 changed
then
    if(Math::abs((mqtt_topic_Joshua_joshua1.state as Number).floatValue - nJoshua1Sent) > 1) {
        sendTelegram("bot1","Josh: " + mqtt_topic_Joshua_joshua1.state.toString)
        nJoshua1Sent = (mqtt_topic_Joshua_joshua1.state as Number).floatValue
    }
end
Die Variable wird mit einem Wert initialisiert, der sicher um mehr als 1 vom gemessenen Wert abweicht. Somit wird auf jeden Fall ein initiales Telegramm gesendet. Wenn der Wert per Telegram verschickt wird, wird auch die Variable mit dem neuen Wert gefüllt.

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 14. Dez 2019 12:22
von salamander070
super udo1toni,
das werde ich ausprobieren, leider "trotz" Regenwetter komme nun nicht gleich mehr dazu :| muss leider los, aber werde berichten.
Hatte auch schon etwas für Flac gefunden um die Einstandswerte zu speichern, aber das in meine Fall nicht so wichtig. Es geht nur um Änderung, die nicht jedes mal hinterm Komma 43,45 auf 43,46 senden.

danke Dir schon mal.

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 15. Dez 2019 13:07
von salamander070
leider hatte ich hier die falsche Rule angeben, diese war einfach nur als Info für einen Istzustand eines Lichschalters.
Für die Sensoren habe ich
Rule "temp" when mqtt_topic_BAD_BAD: changed then sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C") end
then

Gebe ich den obersten Code von Dir ein, wird nicht mehr gesendet.

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 15. Dez 2019 15:24
von udo1toni
Bitte füge Code als Code ein, nicht als Zitat.

Du musst natürlich den Code entsprechend anpassen:

Code: Alles auswählen

rule "schalt1"
when
    Item mqtt_topic_BAD_BAD changed
then
    if(Math::abs((mqtt_topic_BAD_BAD.state as Number).floatValue -(previousState as Number).floatValue) > 1)
        sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C")
end
oder die andere Variante:

Code: Alles auswählen

//globale Variablen zu Beginn der Datei definieren!
var Number nBadTemp = -999

rule "schalt1"
when
    Item mqtt_topic_BAD_BAD changed
then
    if(Math::abs((mqtt_topic_BAD_BAD.state as Number).floatValue - nBadTemp) > 1) {
        sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C")
        nBadTemp = (mqtt_topic_BAD_BAD.state as Number).floatValue
    }
end

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 15. Dez 2019 20:11
von salamander070
ok, sorry mit dem Code, aber ich war nicht zu Hause und habe das an einem Linux Mint System gemacht und VPN hatte mich zur Verzweifelung gebracht. :( und Putty kopierte die Befehlszeilen nicht ins Forum.
Egal.
also du meinst so ändern?

Code: Alles auswählen

rule "schalt1"
when
    Item mqtt_topic_BAD_BAD changed
then
    if(Math::22((mqtt_topic_BAD_BAD.state as Number).floatValue -(previousState as Number).floatValue) > 1)
        sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C")
das würde z.B. Werte ab 22 +1 höher Senden? Nicht aber beim Verringern?

Code: Alles auswählen

//globale Variablen zu Beginn der Datei definieren!
var Number nBadTemp = -20     (oder wird durch -99999 der Istwert erst mal gespeichert?)

rule "schalt1"
when
    Item mqtt_topic_BAD_BAD changed
then
    if(Math::22((mqtt_topic_BAD_BAD.state as Number).floatValue - nBadTemp) > 1) {
        sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C")
        nBadTemp = (mqtt_topic_BAD_BAD.state as Number).floatValue
    }
end

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 16. Dez 2019 05:52
von udo1toni
Nein. Math::abs() ist eine mathematische Funktion, und zwar der Absolutwert.

Code: Alles auswählen

Math::abs(1) = 1
Math::abs(-1) = 1
Es ging ja um die Abweichung vom letzten gemessenen Wert (oder alternativ vom letzten gemeldeten Wert)
Wenn Du bei einer Abweichung von 22 eine Meldung haben willst, musst Du schauen, ob der Wert von 22 abweicht. Die Frage ist dann aber, wie Du bei einer dauerhaften Abweichung benachrichtigt werden willst.

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 17. Dez 2019 13:31
von salamander070
leider verstehe ich nicht, wo ich was anpassen muss.
habe beide Codes von dir probiert, aber dann wird gar nicht mehr gesendet.
Ich bekomme z.B. bei

Code: Alles auswählen

rule "schalt1"
when
    Item mqtt_topic_BAD_BAD changed
then
    if(Math::abs((mqtt_topic_BAD_BAD.state as Number).floatValue -(previousState as Number).floatValue) > 1)
        sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C")
end
folgenden Fehlerinfo in der Log

Code: Alles auswählen

2019-12-17 13:25:05.323 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'telegram6.rules'
2019-12-17 13:25:05.330 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'telegram6.rules' is either empty or cannot be parsed correctly!
2019-12-17 13:25:06.507 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'telegram6.rules' has errors, therefore ignoring it: [6,86]: missing ')' at 'C'
[6,87]: String literal is not properly closed

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 17. Dez 2019 13:56
von peter-pan
Ich denke, dass da ein Anführungszeichen fehlt.
Das

Code: Alles auswählen

sendTelegram("bot1","Badzimmer: * + mqtt_topic_BAD_BAD.state.toString + "C")
sollte so aussehen:

Code: Alles auswählen

sendTelegram("bot1","Badzimmer: *" + mqtt_topic_BAD_BAD.state.toString + "C")
Ich frage mich allerdings, warum du die Regel von Udo nicht übernehmen willst, die ist doch supergenial ?

Code: Alles auswählen

//globale Variablen zu Beginn der Datei definieren!
var Number nJoshua1Sent = -99999

rule "schalt1"
when
    Item mqtt_topic_Joshua_joshua1 changed
then
    if(Math::abs((mqtt_topic_Joshua_joshua1.state as Number).floatValue - nJoshua1Sent) > 1) {
        sendTelegram("bot1","Josh: " + mqtt_topic_Joshua_joshua1.state.toString)
        nJoshua1Sent = (mqtt_topic_Joshua_joshua1.state as Number).floatValue
    }
end
Da bekommst du doch genau was du willst. Du wirst erinnert, wenn sich deine Temperatur um 1 Grad ändert. Wenn du halt bei 2 Grad Änderung erinnert werden willst, dann machst du halt aus der 1 'ne 2 :) und das gilt sowohl für Änderungen im positiven als auch im negativen Bereich.
Du bekommst halt einmal eine Info mit einer Abweichung wegen der Anpassung der Variablen "nJoshua1Sent" von -9999" auf den letzten aktuellen Temperaturwert.

Re: Telegram /Sonoff Temperatur & Hydrowerte nur bei Änderung von Wert 1 senden

Verfasst: 17. Dez 2019 19:44
von salamander070
hallo peter-pan
natürlich würde ich die super gerne nehmen, er hatte mir schon einmal so klasse geholfen. Vielleicht ist auch Tippfehler drin ich arbeite gerade dran und schauen und werde berichten.
Das Anführungszeichen viel mit heute dann auch endlich auf. Aktuell habe ich getestet, das ich von allen Sensoren zu festen Zeiten die Istwerte gesendet bekomme. Das klappte auch schon mal.
Nun werde ich den 2. Code von udo1toni noch mal durchlaufen lassen.