Läuft der Gefrierschrank noch? OH3 UI only

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
kannznichkaufen
Beiträge: 38
Registriert: 11. Mär 2021 16:44
Wohnort: Wiege des Ruhrbergbaus
Kontaktdaten:

Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von kannznichkaufen »

Nach einem hektischen Wochenende mit Verarbeitung einer großen Menge angetauten Gefrierguts habe ich entschieden, dass unser Gefrierschrank im Keller engmaschiger Überwachung Bedarf.
Das Gerät habe ich dazu an einem Shelly Plug mit Verbrauchsmessung gehängt.
Die Beobachtung hat ergeben, dass er im "Erhaltungsbetrieb" (also wenn der Inhalt bereits eingefroren ist, nicht gerade Gefriergut neu eingelegt wurde) immer noch spätestens nach einer guten Viertelstunde wieder anspringt und dann mit ca. 30 W für ein Weilchen läuft. Die Leistungsaufnahme wird vom Shelly während dieser Phase alle paar Sekunden aktualisiert.

Ich habe bislang alles über die UI angelegt und möchte auch gerne dabei bleiben. Ich habe hier nach Anregungen gesucht und einige Beispiele gefunden, wie man das über Rules lösen kann. Das Problem ist, dass bei über die UI erstellten Rules kein Timer initialisiert werden kann.
Bei einer textbasierten Rule würde man "var Timer meinTimer = null" zu Beginn der Regeldatei schreiben.

Die gefundene Lösung möchte ich zur Diskussion stellen und bin für Anregungen dankbar.

Ich habe ein nicht an ein Thing gebundenes Item "Watchdog" vom Typ Switch angelegt und ihm mit "Add Metadata" einen Expiration Timer von 30 Minuten zugewiesen. (Falls es später Fehlalarme gibt, kann ich diese Spanne noch hochsetzen.) In dem Dialog zum Setzen des Timers habe ich unter "Do" die Option "Send Command" gewählt und in der Zeile Command "OFF" eingegeben.

Den Shelly Plug habe ich im semantischen Modell als Equipment angelegt, weil ich den Verbrauch und die Zählerstände persitieren lasse. (Hierzu läuft gerade ein interessanter Thread, den tanzehn gestartet hat.)
Meine erste Rule wird getriggert von einer Statusänderung des Items, das die Leistungsaufnahme des Shelly Plug angibt.
Sie sendet das Kommando ON an mein Watchdog-Item. Dessen Expiration Timer beginnt zu laufen, wird aber bei jeder Statusänderung zurückgesetzt.
Eine weitere Rule wird getriggert, wenn das Watchdog-Item ein Update nach "OFF" erfährt. Sie schickt mir eine Mail oder lässt das Licht blinken.
Diese Lösung fängt sowohl den Fall ab, dass der Strom ausfällt, als auch den Fall, dass der TK-Schrank aufgrund eines Defekts keine Leistung mehr aufnimmt. (Natürlich nur solange OH noch weiterläuft; einen Ausfall im gesamten Haus müsste ich anders behandeln. Bespw. mit einer zweiten OH-Instanz an einem anderen Ort, der per VPN angebunden ist.)

Da sich die Shelly Plugs nicht gegen unbeabsichtigte Fehlbedienung sperren lassen, habe ich zusätzlich eine Rule angelegt, die benachrichtigt, sobald das Item "Betrieb" des Geräts auf "OFF" wechselt.

Allen einen schönen Feiertag.
openHAB 3.01 im Docker Container auf Unraid 6.9.1

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

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von udo1toni »

Ich hoffe mal, dass Deine Rule nicht bei jedem Update das Timer Item zurücksetzt, sondern nur dann, wenn die Stromaufnahme auch über einem Mindestwert liegt :) Der Weg ist jedenfalls genau richtig für das beschriebene Problem.

Ansonsten: openHAB überwachen wird eher schwierig. Ein Raspberry als Heim könnte mit einem Batteriesatz als Notstromversorgung versehen sein (da gibt es entsprechende HATs zum Aufstecken). Fällt der Strom aus, werden Scripte zum geordneten Herunterfahren des Systems ausgeführt. Dort könnte man auch das Absetzen einer Nachricht über ein batteriegestütztes Mobilfunk Modem auslösen. Und da der Pi auch einen Hardware Watchdog eingebaut hat, kann man mit diesem Script auch andere Fehler wie Kernel Panic usw. detektieren und melden.
Ob der notwendige Aufwand dazu gerechtfertigt ist, muss man abwägen. Immerhin kann auch die Funkzelle kaputt gehen, womit dann das Mobilfunk Modem nutzlos ist (es sei denn, man hat zwei solche Modems, die in unterschiedliche Netze eingebucht sind...)
Mit nötiger Hardware wird sowas schnell vierstellig. Und nur, damit man bei Stromausfall noch eine Nachricht auf das Handy bekommt, dass der Strom ausgefallen ist? das wird man im Zweifel ohnehin mitbekommen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
kannznichkaufen
Beiträge: 38
Registriert: 11. Mär 2021 16:44
Wohnort: Wiege des Ruhrbergbaus
Kontaktdaten:

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von kannznichkaufen »

Bei der Rule, die dem Watchdog-Item die ON-Signale schickt, hatte ich unter "But only if" "If ShellyPlug2_Leistungsaufnahme > 2" eingetragen. Du bringst mich da aber zum Nachdenken: Bei intaktem Gerät beobachte ich, dass das Gerät, während der Kompressor läuft, zwischen 30 und 45 Watt aufnimmt und in den Ruhephasen der Shelly zwischen 0,00 und 0,5 Watt anzeigt. Was ich noch nicht beobachten konnte, ist der gemessene Verbrauch des Geräts im defekten Zustand einer seiner diversen Komponenten.
Es sind ja durchaus Fälle denkbar, in denen das Ding zwar noch Leistung aufnimmt, aber nicht mehr effektiv kühlt. bis 30 Watt könnte ich die Schwelle raufsetzen. Alle denkbaren Arten von Defekten werde ich ohne Überwachung der Innentemperatur nicht registrieren können.

Den entsprechenden Tenor Deiner weiterführenden Überlegungen teile ich. Alle Eventualitäten wird man nich abfangen können und ab einer bestimmten Größenordnung bekommt man ja mit, dass auch andere Dinge nicht funktionieren. Ich setze gerade einen zweiten Rechner auf, der einer Bekannten und mir wechselseitig Offsite Backup ermöglicht. Anderer Netzbetreiber, anderer ISP. Die könnten sich gegenseitig "Lebenszeichen" senden, bei deren Ausbleiben eine Nachricht abgesetzt wird. Die Nachricht alleine gibt dann noch keinen Aufschluss, an welcher der denkbaren Ursachen es liegt, aber ich kann versuchen, es einzugrenzen, oder mich auf den Heimweg machen.
Das Auftauen des TK-Schranks hat mir jedenfalls die Komplexität des Ganzen vor Augen geführt. In diesem Fall hatten wir ja noch Strom und Gas, um die angetauten Sachen zu retten und dann erneut wieder einzufrieren. Bei einem längeren flächendeckenden Ausfall wäre das gar nicht gegangen bzw. es wären andere Dinge vorrangig gewesen.
openHAB 3.01 im Docker Container auf Unraid 6.9.1

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

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von udo1toni »

kannznichkaufen hat geschrieben: 1. Nov 2022 14:13 Alle Eventualitäten wird man nich abfangen können
Genau. Natürlich ist Überwachung sinnvoll, aber in welchem Umfang? z.B. bei wochenlanger Abwesenheit sind sicher weitere Maßnahmen interessant, auf der anderen Seite wird man dann auch nicht "mal eben" vorbei kommen können, um das Problem zu beseitigen.
Früher (tm) hat man dem Nachbarn des Vertrauens dafür einen Wohnungsschlüssel gegeben, mit der Bitte, Pflanzen zu gießen, Post zu leeren und ab und zu einen Kontrollgang zu machen.

Das meiste davon lässt sich je nach Gegebenheiten recht effizient automatisieren (kommt auch etwas auf die Postboten an, ob man da einen aktiven Einzug nachrüsten muss...), aber sicher nicht alles, also braucht es doch wieder jemanden, der nach dem rechten schaut, und wenn es nur auf Zuruf ist ("openHAB gibt keine tägliche Meldung mehr, dass alles in Ordnung ist...")
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Sharki
Beiträge: 21
Registriert: 20. Feb 2022 13:56

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von Sharki »

Moin

dies scheint genau mein Thema zu sein.
Allerdings interessiert mich wirklich nur der Stromausfall durch versehentliches Ausschalten des Gefrierschranks (ja haben wir bei unserem Modell schon zweimal geschafft) bzw. das der FI im Keller auslöst.

Das wäre meine Rule :

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: Gefrierschrank_shellyplus1pm4855199d1840192168156_Stromstarke
    type: core.ItemStateChangeTrigger
conditions:
  - inputs: {}
    id: "2"
    configuration:
      itemName: Gefrierschrank_shellyplus1pm4855199d1840192168156_Stromstarke
      state: 0,00 A
      operator: =
    type: core.ItemStateCondition
actions:
  - inputs: {}
    id: "3"
    configuration:
      type: application/javascript
      script: >-
        var HttpUtil = Java.type("org.openhab.core.io.net.http.HttpUtil")

        var urlmessage = encodeURI("Alarm ! Gefrierschrank ist ohne Strom") 

        HttpUtil.executeUrl("GET", "https://api.callmebot.com/whatsapp.php?source=openHAB&phone=+49xxxxxxxxxxxx&apikey=xxxxxxxxxx&text=" + urlmessage , 2000)
    type: script.ScriptAction

Leider hat Sie das Problem das der Gefrierschrank doch tatsächlich Sekunden ohne Strom auskommt. Keine Ahnung warum.
Ich habe mir jetzt gedacht ich frage als zweite (But only if) Bedingung den Durchschnitt der letzten 5 min ab.
Nur lässt sich das wohl nicht mit der UI lösen, oder ?

LG Hajo
Zuletzt geändert von Sharki am 21. Nov 2023 20:58, insgesamt 1-mal geändert.
openHAbian auf einem Raspi 4
openHAB 4.1.1

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

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von udo1toni »

Sharki hat geschrieben: 18. Nov 2023 14:13 Leider hat Sie das Problem das der Gefrierschrank doch tatsächlich Sekunden ohne Strom auskommt. Keine Ahnung warum.
Was meinst Du damit? Falls das Gerät eine elektronische Steuerung hat und den Kompressor zeitweise komplett ausschaltet, wird es vermutlich beim Ausschalten zu Überschwingern kommen. Wenn die Steuerung stromsparend ausgelegt ist, kann die Last unter 1 Watt liegen, das ist mit vielen Messgeräten gar nicht mehr zuverlässig erfassbar.
Sharki hat geschrieben: 18. Nov 2023 14:13 Ich habe mir jetzt gedacht ich frage als zweite (But only if) Bedingung den Durchschnitt der letzten 5 min ab.
Nur lässt sich das wohl nicht mit der UI lösen, oder ?
Doch, warum nicht? Du nutzt hier aber eh schon eine JavaScript Rule, hast also eh alle Möglichkeiten.
Aber bevor Du lange rumprobierst, möchte ich einen alternativen Weg vorschlagen, die Rule triggert jedes Mal, wenn der Messwert sich ändert. Wenn ide Rule läuft, wird geprüft, ob der Messwert über 0 ist. Ist das nicht der Fall, so wird ein Timer gestartet. Ist der Messwert über 0, so wird ein bestehender Timer entfernt.

Läuft der Timer ab, so wird Alarm ausgelöst. Nun musst Du Dich nur entscheiden, wie lange der Strombezug auf 0 stehen darf, bevor der Alarm los geht.

Umsetzung rein über minimale UI Rules:
1. Ein Switch Item FreezerAlarm, bei dem als Expiration Timer z.B. 5 Minuten Command OFF eingetragen ist
2. Eine Rule triggert aus Werteänderung des Strombedarfs, but only if steht auf Strombedarf 0. Action ist FreezerAlarm.postUpdate(ON)
3. Eine weiter Rule triggert aus Werteänderung des Strombedarfs, but only if steht auf Strombedarf > 0. Action ist FreezerAlarm.postUpdate(OFF)
4. Eine Rule triggert auf FreezerAlarm received command OFF, als Action wird der Alarm versandt.

Alternativ als DSL Rule:

Code: Alles auswählen

// Globale Variablen vor der ersten Rule
var Timer tFreezer = null

rule "Freezer Alarm"
when
    Item FreezeCurrent changed
then
    var nCurrent = 0
    if(newState instanceof Number)
        nCurrent = (newState as Number).flöoatValue
    if(nCurrent != 0) {
        tFreezer?.cancel
        tFreezer = null
    }
    else if(tFreezer === null)
        tFreezer = createTimer(now.plusMinutes(5), [|
            // Alarm generieren
        ])
end
In diesem Fall kann man gut auf das extra Expiration Timer Item verzichten :)
Die Rule ermittelt bei Werteänderung den gemessenen Wert, falls dieser keine gültige Zahl enthält wird 0 als Wert angenommen.
Falls der gemessene Wert von 0 abweicht, wird ein eventuell laufender Timer entfernt. Außerdem wird die Timer Variable auf null initialisiert.
Ist der Wert aber 0, so wird, falls noch kein Timer existiert, ein Timer angelegt, der nach 5 Minuten abläuft.

Läuft der Timer ab, so gab es seit 5 Minuten keinen Strombezug mehr (sonst wäre der Timer ja gelöscht worden) und es kann einfach die Alarmierung erfolgen.

Man kann diese Rule in ähnlicher Form auch über die UI eingeben, allerdings stehen keine globalen Variablen zur Verfügung, stattdessen muss man dann mit dem private Cache arbeiten, um den Timer über die Lebensdauer der Rule hinaus zu erhalten. Und weil ich grundsätzlich faul bin :) spare ich mir hier den Code dazu...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Sharki
Beiträge: 21
Registriert: 20. Feb 2022 13:56

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von Sharki »

Moin Udo

und danke für die Rule.
Ich habe jetzt ein Script in der IDE angelegt.

Code: Alles auswählen

// Globale Variablen vor der ersten Rule
var Timer tFreezer = null

rule "FreezerAlarm"
when
    Item Gefrierschrank_shellyplus1pm4855199d1840192168156_Stromstarke changed
then
    var nCurrent = 0
    if(newstate instanceof Number)
        nCurrent = (newstate as Number).floatValue
    if(nCurrent != 0) {
        tFreezer?.cancel
        tFreezer = null
    }
    else if(tFreezer === null)
        tFreezer = createTimer(now.plusMinutes(5), [|
            var HttpUtil = Java.type("org.openhab.core.io.net.http.HttpUtil")
            var urlmessage = encodeURI("Alarm ! Gefrierschrank ist ohne Strom") 
            HttpUtil.executeUrl("GET", "https://api.callmebot.com/whatsapp.php?source=openHAB&phone=+49xxxxxxxxxx&apikey=xxxxxxxxx&text=" + urlmessage , 2000)
        ])
Leider bringt das log folgendes :

Code: Alles auswählen

org.graalvm.polyglot.PolyglotException: SyntaxError: <eval>:2:10 Expected ; but found tFreezer
var Timer tFreezer = null
          ^
<eval>:4:6 Expected ; but found FreezerAlarm
rule "FreezerAlarm"
      ^
<eval>:6:9 Expected ; but found Gefrierschrank_shellyplus1pm4855199d1840192168156_Stromstarke
    Item Gefrierschrank_shellyplus1pm4855199d1840192168156_Stromstarke changed
         ^
<eval>:10:29 Expected ) but found as
        nCurrent = (newstate as Number).floatValue
                             ^
<eval>:16:52 Expected an operand but found |
        tFreezer = createTimer(now.plusMinutes(5), [|
                                                    ^
<eval>:20:8 Expected ; but found ]
        ])

Sieht für mich so aus als ob die Namen schon vergeben sind ?
Und wofür ist der "|" hinter der Eckigen Klammer im createTimer ? Habe ich nicht herausgefunden.
Zuletzt geändert von Sharki am 21. Nov 2023 20:59, insgesamt 1-mal geändert.
openHAbian auf einem Raspi 4
openHAB 4.1.1

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

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von peter-pan »

Wenn ich die Fehlermeldungen richtig interpretiere, hast du die Rule in JavaScript angelegt.

Udo hat aber ausdrücklich geschrieben, dass es sich um eine DSL-Rule handelt.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Sharki
Beiträge: 21
Registriert: 20. Feb 2022 13:56

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von Sharki »

Jo das ist mir dann auch aufgefallen.
Aktuell habe ich das so gelöst wie unter Rules im Openhab Doc.

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      startlevel: 100
    type: core.SystemStartlevelTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        var Timer tFreezer = null
          
        rule "FreezerAlarm" when
            Item Gefrierschrank_shellyplus1pm4855199d1840192168156_Stromstarke changed
        then
            var nCurrent = 0
            if(newstate instanceof Number)
                nCurrent = (newstate as Number).floatValue
            if(nCurrent != 0) {
                tFreezer?.cancel
                tFreezer = null
            }
            else if(tFreezer === null)
                tFreezer = createTimer(now.plusMinutes(5), [|
                    var HttpUtil = Java.type("org.openhab.core.io.net.http.HttpUtil")
                    var urlmessage = encodeURI("Alarm ! Gefrierschrank ist ohne Strom") 
                    HttpUtil.executeUrl("GET", "https://api.callmebot.com/whatsapp.php?source=openHAB&phone=+49xxxxxxxxx&apikey=xxxxxxx&text=" + urlmessage , 2000)
                ])
    type: script.ScriptAction
Aktueller Fehler

Code: Alles auswählen

2023-11-20 20:13:37.248 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'f742e371a4' failed: var Timer tFreezer = null
Zuletzt geändert von Sharki am 21. Nov 2023 21:00, insgesamt 1-mal geändert.
openHAbian auf einem Raspi 4
openHAB 4.1.1

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

Re: Läuft der Gefrierschrank noch? OH3 UI only

Beitrag von peter-pan »

Die Regel kannst du auch nicht über die MainUI/Rules anlegen, sonder musst sie mittels Text-Editor (z.B. VSC) direkt im Rules-Ordner (bei mir = /etc/openhab/rules) als Textdatei mit der Endung .rules ablegen.
Die globalen Variablen lassen sich leider nicht mit dem UI-Editor anlegen, da diese ausserhalb der eigentlichen Regel ganz am Anfang der Rule-Datei liegen müssen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Antworten