Blockly vergleich vorher/nachher

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Blockly vergleich vorher/nachher

Beitrag von lenschith »

Hallo zusammen,
ich bin gerade dabei mir ein Blockly Script zu erstellen das mir Notification sendet, wenn Geräte in einer Gruppe offline sind. Das klappt mittlerweile auch sehr zuverlässig. Jetzt möchte ich aber gerne noch eine Benachrichtigung erhalten wenn ein Gerät wieder online kommt. Aber irgendwie fehlen mir die Ideen wie ich das umsetzten kann. Meine bisherigen Versuche sind gescheitet. Hat jemand einen Tipp?

Mein aktuelles Script.

Code: Alles auswählen

var strOffline, offlineCount, liste2, offline;


if (cache.private.exists('MyTimer') === false || cache.private.get('MyTimer').hasTerminated()) {
  cache.private.put('MyTimer', actions.ScriptExecution.createTimer('MyTimer', time.ZonedDateTime.now().plusSeconds(0), function () {

    strOffline = 'Netzwerkkomponente';
    if (items.getItem('gOnlineMonitor').state > '0') {
      offlineCount = 'true';
      if (items.getItem('gOnlineMonitor').state == '1') {
        console.info('OneOffline: ');
        var offline_list = items.getItem('gOnlineMonitor').members;
        for (var offline_index in offline_list) {
          offline = offline_list[offline_index];
          if (offline.state == 'ON') {
            if (items.getItem('gOnlineMonitor').state == '1') {
              strOffline += String(' ' + String(offline.label));
            }
          }
        }
      } else {
        strOffline += 'n';
        var offline_list2 = items.getItem('gOnlineMonitor').members;
        for (var offline_index2 in offline_list2) {
          offline = offline_list2[offline_index2];
          if (offline.state == 'ON') {
            strOffline += String(' ' + String(offline.label));
          }
        }
      }
      strOffline += ' ausgefallen!';
    } else {
      if (items.getItem('gOnlineMonitor').state == '0' && offlineCount == 'true') {
        offlineCount = 'false';
      }
    }
    console.info(('OfflineListe:' + String(liste2)));
    }));
};
Screenshot 2024-01-14 102355.png
Die deaktivierten Blöcke sind nur die SendNotification.

Danke Gruß
Lenschi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Blockly vergleich vorher/nachher

Beitrag von Harka »

Moin,
sieht mir zu kompliziert aus.
Eine Rule mit Member_of_Group_changed als Auslöser und dem contextual_info-Block erledigt die Aufgabe imho einfacher. Du hast damit den neuen Status (new state of item) plus den Verursacher (triggering item name) und kannst daraus Deine Meldung generieren.

Ansonsten: vermeide unbedingt Vergleiche mit Zahlen als String ("1"). Nimm lieber get_numeric_State und eine blaue Zahl aus dem Math-Menü. Der neue Unterbau von Blockly (GraalJS) mag diesen Fehler nicht.
Du hast innerhalb von "if (items.getItem('gOnlineMonitor').state == '1')" den gleichen Vergleich noch einmal :lol:

E: contextual_info funktioniert innerhalb von einem Timer nicht. Du musst diese Werte vor dem Timer in Variablen speichern.

weiteres E: habe mal versucht die Aufgabe ohne contextual_info ähnlich Deiner Lösung nachzubauen
ForumNetzwerkgruppe.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Harka am 14. Jan 2024 13:30, insgesamt 1-mal geändert.

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

Re: Blockly vergleich vorher/nachher

Beitrag von udo1toni »

Meine Variante als DSL Rule:

Code: Alles auswählen

rule "Wechsel On- Offline melden"
when
    Member of gOnlineMonitor changed // Zustand gewechselt
then
    val StringBuilder strMeldung = new StringBuilder()
    if(gOnlineMonitor.members.filter[i|i.state != 0].size == 0)
        strMeldung.append("Alle Geräte wieder online!")
    else {
        strMeldung.append("Folgende Geräte sind Offline: ")
        gOnlineMonitor.members.filter[i|i.state != 0].forEach[g,c|
            strMeldung.append(g.label)
            if(g.name == triggeringItem.name)
                strMeldung.append(" (war Online)")
            if(c + 1 < gOnlineMonitor.members.filter[i|i.state != 0].size)
                strMeldung.append(", ")
            else
                strMeldung.append(" und ")
        ]
        strMeldung.append(".)
        if(gOnlineMonitor.members.filter[i|i.state == 0].size > 0) {
            strMeldung.append(" Folgende Geräte sind Online: ")
            gOnlineMonitor.members.filter[i|i.state == 0].forEach[g,c|
                strMeldung.append(g.label)
                if(g.name == triggeringItem.name)
                    strMeldung.append(" (war Offline)")
                if(c + 1 < gOnlineMonitor.members.filter[i|i.state != 0].size)
                    strMeldung.append(", ")
                else
                    strMeldung.append(" und ")
            ]
            strMeldung.append(".)
        }
    }
    logInfo("online","{}",strMeldung.toString)
end
Falls alle Geräte Online sind, lautet die Meldung "Alle Geräte wieder online!"
Falls mindestens ein Gerät Offline ist, folgt eine Liste der Geräte, die Offline sind. Ist dabei das Gerät, welches die Rule ausgelöst hat, so war dies vorher Online, was mit angezeigt wird. Falls es Geräte gibt, die Online sind, wird anschließend auch für diese eine Liste generiert, welche gegebenenfalls auch das Gerät ausweist, welches von Offline zu Online gewechselt hat.

Die Rule kann man genauso auch in Blockly erstellen (nur halt nicht mit StringBuilder, sondern nur mit normaler Stringverknüpfung).

Ich gehe hier davon aus, dass jedes Item der Gruppe gOnlineMonitor entweder 0 oder 1 als Zustand hat. Es wäre sinnvoller, hier Switch Items zu verwenden und ON/OFF als Zustand zu nutzen.

Was ich nicht so ganz verstehe, ist der Timer. Wozu soll der gut sein? Willst Du damit die Menge der Meldungen begrenzen? Das widerspräche der Natur der Rule, die ja eigentlich unmittelbar Meldung machen soll, und zwar bei jeder Änderung. Abgesehen davon macht der Timer ja nichts...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Blockly vergleich vorher/nachher

Beitrag von lenschith »

Harka hat geschrieben: 14. Jan 2024 11:23 Moin,
sieht mir zu kompliziert aus.
Eine Rule mit Member_of_Group_changed als Auslöser und dem contextual_info-Block erledigt die Aufgabe imho einfacher. Du hast damit den neuen Status (new state of item) plus den Verursacher (triggering item name) und kannst daraus Deine Meldung generieren.

Ansonsten: vermeide unbedingt Vergleiche mit Zahlen als String ("1"). Nimm lieber get_numeric_State und eine blaue Zahl aus dem Math-Menü. Der neue Unterbau von Blockly (GraalJS) mag diesen Fehler nicht.
Du hast innerhalb von "if (items.getItem('gOnlineMonitor').state == '1')" den gleichen Vergleich noch einmal :lol:

E: contextual_info funktioniert innerhalb von einem Timer nicht. Du musst diese Werte vor dem Timer in Variablen speichern.

weiteres E: habe mal versucht die Aufgabe ohne contextual_info ähnlich Deiner Lösung nachzubauen
ForumNetzwerkgruppe.png
Danke, dein Script ist natürlich wesentlich einfacher als meines. Das ist viel übersichtlicher.
Hab ich auch gleich so übernommen.

Danke noch mal für die Tipps bzgl. der NumberStates, war mir so nicht bewusst. Auch das habe ich in meine Scripts gleich umgebaut.

@Udo, den Timer habe ich eingebaut, da ich gerne 2min warten möchte bis eine Störung ausgelöst wird, damit nicht bei jedem Reboot die Meldungen rausgesendet werden.

Nochmal zu meiner Frage zurück. Ich würde gerne eine Nachricht erhalten wenn ein Gerät wieder Online geht, kann ich das mit dem contextual_info umsetzten?
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

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Blockly vergleich vorher/nachher

Beitrag von Harka »

lenschith hat geschrieben: 14. Jan 2024 17:35 Nochmal zu meiner Frage zurück. Ich würde gerne eine Nachricht erhalten wenn ein Gerät wieder Online geht, kann ich das mit dem contextual_info umsetzten?
Wen Du, wie von Udo und mir empfohlen, den Trigger auf Member_of_changed stehen hast, bekommst Du je schon mit "alle online" - hatte ich vorhin schnell noch von Udo GeGutenbergt :D
Ansonsten kannst Du auch mit Deinem Timer arbeiten aber bestehenden immer abbrechen. Ich habe mal noch so eine Idee mit einer Protokollierung eingearbeitet. Sonst bekommst Du eine Meldung - alles online - weißt aber nicht warum. Beim If habe ich was aus Platzgründen raus gelassen und die 10 sek noch auf eine sinnvolle Zeit setzen ...
ForumNetzwerkgruppe2.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Blockly vergleich vorher/nachher

Beitrag von lenschith »

Danke für die Tipps,
das hat mich weiter gebracht. So hatte ich mir das vorgestellt.
Screenshot 2024-01-14 210002.png
Screenshot_2024-01-14-21-06-31-576.jpg
Gruß Lenschi
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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

Antworten