Notification nur einmal erhalten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Notification nur einmal erhalten

Beitrag von lenschith »

Hallo zusammen,

ich nutze die OpenHAB App am Handy. Nun stehe ich vor dem Problem das ich ständig Notifications bekomme wenn ein Fehler auftritt.
Bei einige Regeln habe ich Items/Switch erzeugt die den Status setzen, bereits gesendet. Nun meine Frage, kann man das auch einfacher und schöner umsetzen? Ich hatte einen Beitrag von Udo gefunden der das Thema in den DSL Rules schon behandelt viewtopic.php?t=3540 aber mit ".previousState.state" klappt das in den Javascript Rules nicht.

So schaut mein Code im Augenblick aus, dieser setzt ein Item auf ON wenn die Temperatur unterschritten wird damit keine weitere Notification gesendet wird. Wenn die Temperatur wieder gestiegen ist wird das Item wieder auf OFF gesetzt.

Code: Alles auswählen


if ((itemRegistry.getItem(Frostschutz_Temperatur_previousState').getState() == 'OFF') && (itemRegistry.getItem('Sensorbox1_Wassertemperatur').getState() <= '10')) {
  this.timer = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(30), function() {
    if ((itemRegistry.getItem('Frostschutz_Temperatur_previousState').getState() == 'OFF') && (itemRegistry.getItem('Sensorbox1_Wassertemperatur').getState() <= '10')) {
    //logger.info(Wassertemperatur unter 10°C Timer durchgelaufen);
    //Schalter wird auf ON gesetzt damit Notification nur 1x gesendet wird
    events.postUpdate('Frostschutz_Temperatur_previousState', 'ON');
    //Notification werden versendet
      if (itemRegistry.getItem('notification').getState() == 'ON'){
      NotificationAction.sendNotification('aaa@xxx.de', 'Wasser unter 10°C', "temperature_cold", "Kritisch");
      //logger.info("Notification: Wasser weniger als 10°C");
      }
    }
  });
}

//Wassertemperatur wieder über 10°C
else if ((itemRegistry.getItem('Frostschutz_Temperatur_previousState').getState() == 'ON') && (itemRegistry.getItem('Sensorbox1_Wassertemperatur').getState() > '10')){
  this.timer = ScriptExecution.createTimer(ZonedDateTime.now().plusMinutes(30), function() {
    if ((itemRegistry.getItem('Frostschutz_Temperatur_previousState').getState() == 'ON') && (itemRegistry.getItem(Sensorbox1_Wassertemperatur').getState() > '10')) {
    //logger.info("Wassertemperatur über 10°C Timer durchgelaufen"); 
    //Schalter wird auf OFF gesetzt damit Notification wieder gesendet wird
    events.postUpdate('Frostschutz_Temperatur_previousState', 'OFF');
      if (itemRegistry.getItem('notification').getState() == 'ON'){
      //Notification werden versendet
      NotificationAction.sendNotification('aaa@xxx.de', 'Wasser über 10°C', "temperature", "Info");
      //logger.info("Notification: Wasser mehr als 10°C");                              
      }
    }
  });
}
Gibt es hier einen eleganteren Weg in Javascript?

Danke
Lenschi
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Notification nur einmal erhalten

Beitrag von udo1toni »

Du hast innerhalb von rules (speziell wenn sie über die UI erstellt sind) nur begrenzte Möglichkeiten.
Letztlich musst Du Dir merken, wenn Du eine Notification gesendet hast. Um zu verhindern, dass Du überhaupt nur ein einziges Mal eine Notification bekommst, wäre es sinnvoll, einen Zeitstempel zu nutzen. Dann kannst Du .innerhalb der Rule prüfen, wie lange der Zeitstempel in der Vergangenheit liegt.
Diese Zeitstempel musst Du nicht zwingend über Items speichern, da geht auch eine Variable, die aber global sein muss, oder aber (im Fall der UI Rules) nur einmalig initialisiert werden darf.

Kurzer Einschub hier:

In den klassischen Rules gibt es globale und lokale Variablen.
Lokale Variablen werden von der Rule selbst initialisiert, wenn die Rule ausgeführt wird. Da die selbe Rule auch zeitgleich mehrfach gestartet sein kann, werden jeweils lokale Versionen der Variablen erzeugt, die Variable existiert also pro ausgeführter Rule.
Dagegen werden globale Variablen exakt einmal initialisiert, nämlich wenn die *.rules Datei geladen wird. Danach stehen sie allen Rules (in dieser *.rules Datei) zur Verfügung.

Die neuen Rules kennen keine globalen Variablen. Allerdings kann eine Rule auch nicht mehrfach gleichzeitig ausgeführt werden, da jede Rule einen eigenen Thread hat. Wenn eine Variable initialisiert wurde, bleibt sie im Speicher erhalten, bis die Rule die Variable erneut initialisiert.
Man kann nun vor dem Initialisieren prüfen, ob die Variable noch existiert und in diesem Fall die Variable “importieren”, so dass der Wert aus dem vorigen Durchlauf wieder zur Verfügung steht.
Die Variable ist also nicht global, bleibt aber erhalten.
Wie das geht wurde im englischen Forum gezeigt, einen Link habe ich aber nicht zur Hand. Rlkoshak hat das aber sehr genau erläutert.
Diese Variante käme ohne extra Item aus, solange die Notification pro Rule betrachtet werden kann.


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

BOP
Beiträge: 197
Registriert: 23. Sep 2018 19:43
Answers: 1

Re: Notification nur einmal erhalten

Beitrag von BOP »

udo1toni hat geschrieben: 5. Aug 2021 13:22 Wie das geht wurde im englischen Forum gezeigt, einen Link habe ich aber nicht zur Hand. Rlkoshak hat das aber sehr genau erläutert.
Hier?
https://community.openhab.org/t/oh-3-ex ... les/108526

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

Re: Notification nur einmal erhalten

Beitrag von udo1toni »

Genau :)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten