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

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

salamander070
Beiträge: 40
Registriert: 16. Nov 2018 15:37
Answers: 0
Wohnort: S-H

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

Beitrag 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

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

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

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

salamander070
Beiträge: 40
Registriert: 16. Nov 2018 15:37
Answers: 0
Wohnort: S-H

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

Beitrag 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.

salamander070
Beiträge: 40
Registriert: 16. Nov 2018 15:37
Answers: 0
Wohnort: S-H

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

Beitrag 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.

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

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

Beitrag 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
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

salamander070
Beiträge: 40
Registriert: 16. Nov 2018 15:37
Answers: 0
Wohnort: S-H

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

Beitrag 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

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

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

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

salamander070
Beiträge: 40
Registriert: 16. Nov 2018 15:37
Answers: 0
Wohnort: S-H

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

Beitrag 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

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

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

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

salamander070
Beiträge: 40
Registriert: 16. Nov 2018 15:37
Answers: 0
Wohnort: S-H

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

Beitrag 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.

Antworten