Telegram

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Snatsch
Beiträge: 455
Registriert: 9. Jan 2021 22:55
Answers: 0

Telegram

Beitrag von Snatsch »

Hallo seit heute geht mein Telegram irgendwie nicht mehr :cry: ich bekomme zwar Nachrichten kann aber keine mehr an openhab schicken. Es kommt immer folgende Fehlermeldung.

Code: Alles auswählen

2022-03-10 21:06:09.195 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'telegram:telegramBot:8750e150c1' changed from UNKNOWN to OFFLINE (COMMUNICATION_ERROR): java.io.IOException: com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected an int but was 5108393702 at line 2 column 53 path $.result[0].message.from.id
kann da jemand was damit anfangen und mir einen Tipp geben ?
openhab4.3.1 auf Pi 5 8GB im Docker Portainer&Frontail /Grafana&InfluxDB und mosquitto auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung / Pi 4 4GB Portainer & Deconz

oszi
Beiträge: 4
Registriert: 22. Mär 2021 17:13
Answers: 0

Telegram sendet Status andauerd nicht nur 1 mal

Beitrag von oszi »

Hallo,

wie oder was muss ich bei der Regel änder damit ich nicht solange der Schwellwert < 1.5 ist andauernd die meldung bekomme?

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: ESPURNA4561CCSwitch_ESPURNA_4561CC_temperature
    type: core.ItemStateChangeTrigger
conditions:
  - inputs: {}
    id: "3"
    configuration:
      itemName: ESPURNA4561CCSwitch_ESPURNA_4561CC_temperature
      state: "1.5"
      operator: <
    type: core.ItemStateCondition
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-2
           val telegramAction = getActions("telegram","telegram:telegramBot:TelegramBot")
           telegramAction.sendTelegram("Garten Temp < 1.5 °C")
    type: script.ScriptAction
Ich möchte die Meldung nur 1 mal bekommen.
Kann mir da jemand einen Tipp geben?

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

Re: Telegram

Beitrag von udo1toni »

Du hast verschiedene Optionen. Wichtig ist aber, dass Du Code (und auch die Konfiguration ist Code) auch als Code markierst, z.B. hat bei yaml die Anzahl der Leerzeichen vorne eine Bedeutung :)
Ich habe das der Einfachheit halber mal nachgeholt, über den vollständigen Editor hast Du die nötigen Tags auf Buttons, ansonsten kannst Du aber die Tags auch einfach hinschreiben, in diesem Fall das Wort code in eckigen Klammern, am Ende des Blocks zusätzlich mit einem Slash vor dem Wort, also so: [/code]

Dein Problem ist, Du willst die Alarmierung nicht, wenn die Temperatur unter 1,5 °C ist, sondern, wenn die Temperatur unter 1,5 °C sinkt. Das bedeutet, Deine Prüfung auf < 1,5 °C reicht nicht, die Temperatur muss zuvor eben über 1,5 °C gewesen sein.

Dazu ist es sinnvoll, die impliziten Variablen der Rules zu verwenden. Beim Ereignis changed (das nutzt Du ja schon), gibt es zwei implizite Variablen, previousState und newState. ACHTUNG! previousState ist etwas anderes als Item.previousState. Ersteres ist die implizite Variable, Letzteres ist die Eigenschaft des Items, welches auf die Persistience zugreift (das tut die implizite Variable nicht!). previousState funktioniert immer bei changed, .previousState nur, wenn die Persistence auch läuft.

Der eigentliche Code sieht dann so aus:

Code: Alles auswählen

if(newState >= 1.5 || previousState < 1.5)
    return;

val telegramAction = getActions("telegram","telegram:telegramBot:TelegramBot")
telegramAction.sendTelegram("Garten Temp < 1.5 °C")
Alternativ auch so:

Code: Alles auswählen

if(newState < 1.5 && previousState >= 1.5) {
    val telegramAction = getActions("telegram","telegram:telegramBot:TelegramBot")
    telegramAction.sendTelegram("Garten Temp < 1.5 °C")
}
Unterschied: im ersten Fall wird die Rule abgebrochen, wenn die Temperatur größer oder gleich 1.5 ist oder die alte Temperatur unter 1.5 lag, im zweiten Fall werden die betreffenden Befehle ausgeführt, wenn die Temperatur unter 1.5 ist und die alte Temperatur über oder gleich 1.5. Die Logik ist also zu 100% komplementär.

Allerdings wirst Du auch Situationen haben, wo die Temperatur ständig um die 1.5 °C schwankt, so wird also trotzdem ab und zu ein Alarm ausgelöst.
Abhilfe schafft dann ein Flag für den Alarm. Mit der Alarmierung setzt Du ein Flag, dass der Alarm gesendet wurde. Die Rule kann dann auhc gleichzeitig verwendet werden, um das Flag auch wieder zu löschen, aber ebe nicht direkt, wenn die Temperatur über 1.5 °C steigt, sondern z.B. erst bei mehr als 2 °C. Durch die Hysterese (der Abstand zwischen Ein- und Ausschalten des Flags) werden dann die Alarmmeldungen recht zuverlässig nur einmal ausgelöst.
Das Flag realisierst Du am einfachsten über ein ungebundenes Item, das heiß0t, eines, welches nicht an einen Channel verlinkt ist (zumindest, wenn Du nicht den Zustand des Flags irgendwo außerhalb openHAB anzeigen willst). Switch als Typ reicht dazu, Dazu kommt dann in die Rule einfach eine zusätzliche Abfrage, in der Art

Code: Alles auswählen

if(MeinAlarmFlag.state != ON) {
// Hier Alarmierung plus Setzen des Items MeinAlarmFlag
}
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

oszi
Beiträge: 4
Registriert: 22. Mär 2021 17:13
Answers: 0

Re: Telegram

Beitrag von oszi »

Hallo udo1toni,

Funktioniert vielen Dank.
Ich muss mal suchen wo es Beispiele für Rules gibt. Bin da nicht besonders bewandert.

Antworten