Könnte mal wieder Hilfe gebrauchen :)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Könnte mal wieder Hilfe gebrauchen :)

Beitrag von Snatsch »

Hallo, da meine Innogy Zentrale immer mal wieder offline geht hatte ich bis jetzt immer folgende Rule laufen

Code: Alles auswählen

rule "Innogy Zentrale ist Offline"
when
    Thing "innogysmarthome:bridge:d79b954f20" changed
then
    val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20")
    if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ONLINE")) {
        logInfo("ThingStatus", "The thing is online.")
    } else {
        Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!")
    }
end
jetzt ist es aber so das die Zentrale ständig für ein paar Sekunden offline ist und ich mit Nachrichten zugemüllt werde :x
ich hätte gerne einen Timmer eingebaut, das die Benachrichtigung erst nach ca 3 Minuten kommt sollte die Zentrale so lange offline sein :o
vielleicht habt ihr einen Tipp für mich :)

Code: Alles auswählen

var Timer innogyzentrale = null

rule "Innogy Zentrale ist Offline"
when
    Thing "innogysmarthome:bridge:d79b954f20" changed
then

if"innogysmarthome:bridge:d79b954f20" .state == online )           
    return;

    innogyzentrale = createTimer(ZonedDateTime.now.plusMinutes(3), [|
    val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20")
    if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ONLINE")) {
        logInfo("ThingStatus", "The thing is online.")
        ])
    } else {
        Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!")
    }
end
vielen Dank im voraus
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

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

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von udo1toni »

Ja, aber nein. :) So wird ein Schuh draus:

Code: Alles auswählen

// Globale Variablen immer zu Anfang der Datei definieren!
var Timer tInnogyAlarm = null                                                     // Timer für Alarm Meldung

rule "Prüfung Innogy Zentrale"
when
    Thing "innogysmarthome:bridge:d79b954f20" changed                             // Thing hat Stataus geändert
then
    val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20") // hole aktuellen Status
    if(thingStatusInfo == "ONLINE") {                                             // falls online
        tInnogyAlarm?.cancel                                                      // falls existent, brich Timer ab
        if(tInnogyAlarm !== null) tInnogyAlarm = null                             // falls Zeiger auf Timer gesetzt, löschen
    } else if(tInnogyAlarm === null) {                                            // nicht online -> falls noch kein Timer definiert
        tInnogyAlarm = createTimer(ZonedDateTime.now.plusMinutes(3), [|           // lege Timer an. Wenn Timer abläuft
            Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!")    // Melde Offline Zustand
            tInnogyAlarm = null
        ])
    }
end
Der Punkt ist: Sobald die Zentrale Online ist, soll der Timer abgebrochen werden, der die Alarmmeldung bringt (das ist der erste Teil der Rule). Falls das Thing nicht Online ist, soll ein Timer gestartet werden (natürlich nur, wenn der Timer nicht bereits läuft).
Da wir außerhalb des Timers prüfen, ob das Thing Online ist, müssen wir diesen Test nicht im Timer selbst ausführen.

Die Rule sendet also genau dann einen Alarm, wen ndie Innogy Zentrale mehr als drei Minuten am Stück nicht Online ist.

Man kann das übrigens auch ohne DSL Timer erledigen, indem man ein Item als Timer definiert.
Gegeben: Switch Item tInnogyAlarm (weil sprechender Name...) mit Metadaten Expiration Timer:

Code: Alles auswählen

value: 0h3m0s,command=OFF
config:
  ignoreStateUpdates: "false"
Nun gibt es zwei Rules:

Code: Alles auswählen

rule "Prüfung Innogy Zentrale"
when
    Thing "innogysmarthome:bridge:d79b954f20" changed                             // Thing hat Stataus geändert
then
    val thingStatusInfo = getThingStatusInfo("innogysmarthome:bridge:d79b954f20") // hole aktuellen Status
    if(thingStatusInfo == "ONLINE") {                                             // falls online
        tInnogyAlarm.postUpdate(OFF)                                              // falls existent, brich Timer ab
    } else if(tInnogyAlarm.state != ON) {                                         // nicht online -> falls noch kein Timer definiert
        tInnogyAlarm.postUpdate(ON)
    }
end

rule "Sende Alarm Innogy Zentrale"
when
    Item tInnogyAlarm received command OFF
then
    Meldung.postUpdate ("Achtung die Innogy Zentrale ist Offline !!!")            // Melde Offline Zustand
end
Der Code ist weitgehend identisch. Die zweite Variante kann direkt über UI Rules definiert werden. Dafür ist aber die Expiration Time fix.
In der Rules DSL ist es ein Leichtes, je nach Bedarf unterschiedliche Ablaufzeiten zu verwenden (ich habe darüber z.B. meinen Dusch-WC Lüfter mit variablen Nachlaufzeiten ausgerüstet). Dafür muss die Rule aber zwingend über Textdatei angelegt werden, da ja eine globale Variable benötigt wird.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von Snatsch »

He udo1toni :) vielen Dank für deine Hilfe (wie so oft :D ) wie immer auch prima erklärt :D

nur ein paar zu viele Gleichzeichen :lol:

Code: Alles auswählen

else if(tInnogyAlarm === null)
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

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von int5749 »

Snatsch hat geschrieben: 7. Apr 2022 20:42 nur ein paar zu viele Gleichzeichen :lol:

Code: Alles auswählen

else if(tInnogyAlarm === null)
Ich behaupte mal: Nicht, wenn Udo dies so schreibt :)
Denn == ist anders als ===
Einmal aus dem englischen Forum.
== : equals to, it compares the data of the two operands for equivalency
!= : not equals, it compares the data of the two operands for non-equivalency
=== : identity, it compares the two Objects to see if they are the same (i.e. both variable point to the same space in RAM)
!== : not identity, it compares the two Objects to see if they are not the same (i.e. both point to different space in RAM)
VG
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von Snatsch »

ok vielen Dank :) kannte ich nicht und hab es auch noch nicht gesehen
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

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

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von udo1toni »

Ja, das ist gerne mal unbekannt.

Variablen und Konstanten sind ja in Wirklichkeit Zeiger auf Speicherbereiche. Wenn ich also in die Variable a einen Wert speichere, so schaut das System nach, auf welchen Speicherbereich a zeigt und speichert den Wert anschließend an dieser Stelle.
Wenn man a aber auf null setzt (nicht NULL oder 0), so wird der Zeiger selbst überschrieben, der Speicher wird freigegeben.
== liest für die linke und rechte Seite den Speicherbereich, auf den verwiesen wird und vergleicht die dort gefundenen Werte miteinander.
=== prüft, ob linke und rechte Seite den selben Speicherbereich adressieren.
Der DSL Parser beschwert sich, wenn man einen Vergleich mit null mit == ausführt (auch wenn der Vergleich selbst dennoch funktioniert). Andere Identitätsprüfungen als null kommen in der openHAB DSL meines Wissens nicht vor.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von scotty »

Hab den Vorschlag von Udo aufgegriffen und auf ein anderes Thing umgeschrieben. Leider mit dem Ergebnis, dass nach einigen Stunden etwa 7 oder 8 andere Things Offline waren.

Code: Alles auswählen

// Globale Variablen immer zu Anfang der Datei definieren!
var Timer tSpeedtestAlarm = null                                                  // Timer für Alarm Meldung

rule "speedtestReset"
when
    Thing "speedtest:speedtest:43ecbb5615" changed                                            // Thing hat Stataus geändert
then
    val thingStatusInfo = getThingStatusInfo("speedtest:speedtest:43ecbb5615")    // hole aktuellen Status
    if(thingStatusInfo == "ONLINE") {                                                                    // falls online
        tSpeedtestAlarm?.cancel                                                                          // falls existent, brich Timer ab
        if(tSpeedtestAlarm !== null) tSpeedtestAlarm = null                                  // falls Zeiger auf Timer gesetzt, löschen
    } else if(tSpeedtestAlarm === null) {                                                            // nicht online -> falls noch kein Timer definiert
        tSpeedtestAlarm = createTimer(ZonedDateTime.now.plusMinutes(3), [|   // lege Timer an. Wenn Timer abläuft
            tSpeedtestAlarm = null
            val mailActions = getActions("mail","mail:smtp:samplesmtp")
            val success = mailActions.sendMail("xxx@unity-mail.de", "Thing error", "Achtung, System meldet Speedtest Offline")
        ])
    }
end
Thing speedtest musste danach sogar neu installiert werden.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von udo1toni »

Nein.

Sorry, wenn ich das so sage, aber es ist schlicht unmöglich, dass eine Rule überhaupt solche Auswirkungen hat. Schon gar nicht mit den aufgeführten Befehlen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
scotty
Beiträge: 676
Registriert: 28. Apr 2020 04:44
Answers: 0

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von scotty »

Lieber Udo, du kannst es mir glauben. Die Rule habe ich wieder gelöscht, Speedtest neu installiert und alle Things sind wieder Online (habe gerade noch einmal nachgeschaut). Ich werde allerdings in den nächsten Tagen einen neuen Versuch starten.
OH 3.4.5 im Docker auf Synology DS918+ mit USV, Reolink-RLC-511WA, Philips Hue, AVM Fritz!Box 6591C, Alexa, Logitech Harmony und diversen Shelly's

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

Re: Könnte mal wieder Hilfe gebrauchen :)

Beitrag von udo1toni »

Wenn eine einfache Rule wie die aufgeführte zu dem von Dir beschriebenen Fehlerbild führen würde, dann könntest Du überhaupt keine Rules dauerhaft laufen lassen, die
  • auf ein Thing changed reagieren
  • den genauen Thing Status erfragen
  • einen Timer verwenden
  • eine eMail versenden
denn mehr passiert ja in der Rule nicht.

Thing changed ist jetzt nicht so exotisch; ich würde in entsprechenden Rules immer erwarten, dass auch der aktuelle Status erfragt wird.
e-Mail versenden kommt auch nicht selten vor.
Bleibt noch der Timer, das ist nun eine absolute Standardfunktion.
Jede Funktion für sich wird also keinesfalls als Ursache für Deinen Kollosalabsturz heranzuziehen sein.
Und selbst die Kombination ist jetzt nicht wirklich seltsam.
Allenfalls wäre das Thing (speedtest) in meinen Augen etwas ungewöhnlich.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten