Ankündigung

Einklappen
Keine Ankündigung bisher.

Item Überwachung / Monitor für Timeout / Safety-Item?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Item Überwachung / Monitor für Timeout / Safety-Item?

    Moin,

    ich habe ein paar Items (Temperaturwerte), die per MQTT oder 1-Wire regelmäßig updates erhalten sollten.
    Ein Ausfall, d.h. das Ausbleiben von regelmäßigen Aktualisierungen, bemerke ich erst wenn ich in Grafana mir die Visu ansehe.

    ❓Frage an die SmarthomeNG-community: Was ist der beste / einfachste Weg Items zu monitoren?

    Zwei Konsequenzen beim Ausfall sind wünschenswert:
    a) Neben dem Wert ein Gütligkeits-Status zu setzen ("Alive-Status"); ggf. den Wert mit einem "Default"-Wert belegen.
    b) Per Telegram-Broadchat alarm zu melden

    Mein Ansatz wäre direkt in den Items "Eval" zu verwenden ohne zusätzliche Logik,
    wobei mir die Syntax für die Ausdrücke in den spitzen Klammern nicht klar sind.

    Code:
    temp_item:
        messwert1:
            type: num
            ow_addr: 28.FFFFFFFF0000
            ow_sensor: T​
            crontab: '*/3 * * *'
            eval_trigger: <Crontab-Timer?>
            eval: value if <Aktuell> else 255
            enforce_update: True
        AliveStatus:
            type:bool
            eval_trigger: sh..messwert <Oder Timeout-Erkennung>
            eval: <getriggerte Value = 255>
            telegram_message: 'Fehler: Items Messewert1 nicht mehr aktuell'
            telegram_value_match_regex: (1|true|True)​
    ​

    #2
    Hier die Variante, die bei mir seit mehreren Jahren stabil läuft:
    • Gemessen werden Temperatur/Feuchte/Luftdruck auf ESP's mit ESPEasy; der Taupunkt wird vom ESP berechnet.
    • Alle x Minuten (im ESP einstellbar) liefert jeder Messpunkt von sich aus die Daten direkt per WLAN an shNG ('push'). Für MQTT bzw 1-Wire müsstest Du also die entsprechenden Attribute an den Items einbinden (statt 'nw: yes').
    • Werden von einem der ESP's 1800s (=30 Minuten) keine Daten empfangen, färbt sich die zugehörige LED-Statusanzeige auf diesem Button in der Visu rot, da das zugehörige 'isOnline' Item über das eval auf False gefallen ist (Zustand wird mit cycle alle 30s ermittelt).
    • Jeder Temperatur-Button ist klickbar; es erscheint dann in der Mitte des Bildschirms ein Popup mit einem zoombaren Plot mit Temp/Feuchtigkeit der vergangenen 7 Tage für diesen Sensor.
    Die Items-Datei:
    Code:
    eg: # Erdgeschoss
        Sensor:
            Temperature:
                type: num
                database: 'init'
                nw: 'yes'
            Humidity:
                type: num
                database: 'init'
                nw: 'yes'
            Pressure:
                type: num
                database: 'init'
                nw: 'yes'
        Calculations:
            Dewpoint:
                type: num
                database: 'init'
                nw: 'yes'
            Uptime_Unix:              # Delivered from ESP as %unixtime% (sec since 1970/01/01)
                type: num
                nw: 'yes'
            Dummy:                    # Placeholder for the 2 remaining 'dummy' Items
                type: num
                nw: 'yes'
        isOnline:                     # Online within the last 30 minutes?
            type: bool
            database: 'init'
            eval: True if (__import__('time').time()-1800 < sh...Calculations.Uptime_Unix()) else False
            cycle: 30
    HTML für die Visu:
    Code:
    /** ********* EG ********************* **/
    <div class="infobutton temp_eg">
        <a href="#eg_temphum_popup" data-rel="popup">
            <div class="infobutton_temphum_LED">{{basic.symbol('', 'klima.eg.isOnline', ['•','•'],'',[1,0],'',['lime','red'])}}</div>
            {{basic.print('','klima.eg.Sensor.Temperature','%.1f °C','','[20,25]',['deepskyblue,lime,orange'])}}<br/>
            {{basic.print('','klima.eg.Sensor.Humidity',   ' %','','[40,60]',['deepskyblue,lime,orange'])}}
        </a>
    </div>
    <div id="eg_temphum_popup" class="centerbox" data-role="popup" data-overlay-theme="c" style="width: 75%;">
        <a href="#" class="ui-btn-right" data-rel="back" data-role="button" data-icon="delete" data-iconpos="notext" >Close</a>
        <div data-role="header" class="centerbox_header"> Erdgeschoss - Wochenansicht </div>
        <br/>
        {{ plot.period('', ['klima.eg.Sensor.Humidity','klima.eg.Sensor.Temperature'], 'raw', '1w', 'now', [30,20], [80,27], '', ['Feuchte','Temperatur'], ['chocolate','yellow'], ['area','line'], ['','%','°C'], 'advanced', ['1','2'], ['0','1'], ['chocolate','yellow'], '', ['%','°C']) }}
        <br/>
    </div>

    Ergebnis:

    temps.png

    Hoffe, das hilft weiter - viel Erfolg!

    /tom
    Angehängte Dateien
    Zuletzt geändert von Tom Bombadil; 17.11.2023, 21:53.

    Kommentar


      #3
      Bekommst du unter uptime_unix tatsächlich die uptime des ESP? Dann dürfte das bei einem reboot des ESP durcheinanderkommen...?
      Oder schickt der ESP da "seine" aktuelle Zeit? Dann wäre das relativ simpel.

      Ansonsten könnte man auch eval: sh.<item>.property.last_update_age > <max_sekunden> als "online"-Item nehmen.

      also (ungetestet)

      Code:
      item:
          data:
              remark: Das ist das eigentliche Daten-Item mit den notwendigen Plugin-Attributen
              type: num
              plugin_attr: foo
      
              online:
                  type: bool
                  eval_trigger: ..
                  eval: sh...self.property.last_update_age > 30
      Dann sollte das online-Item auf "false" gehen, wenn über 30 Sekunden kein Update auf dem ursprünglichen Item kommt.
      Die relative Adressierung müsste man prüfen

      Kommentar


        #4
        Jeder ESP bekommt seine Zeit genauso wie die shNG-Maschine vom lokalen Router (=alle synchron) und schickt zusammen mit den Daten die aktuelle Zeit im Unix-Format. Also alles ganz simpel gehalten. Der Reboot spielt für mich nur eine akademische Rolle - die Daten kommen im Minutentakt rein, und ob das Item jetzt nach 29, genau 30 oder erst 31 Minuten auf Alarm fällt, ist mir relativ Wumpe.

        Wenn ich mich richtig erinnere, war damals der Zugriff auf last_update samt relativer Adressierung noch nicht so einfach, daher dieser Ansatz. Structs gab es auch noch nicht (der Item-Baum ist also relativ gross), und MQTT war damals auch noch in den Kinderschuhen. Ist Jahre her ...

        /tom
        Zuletzt geändert von Tom Bombadil; 17.11.2023, 22:04.

        Kommentar


          #5
          Auf den Reboot komme ich nur, weil "uptime" normalerweise die Zeit seit dem letzten Reboot ist. Und die wäre als Timer ... fragwürdig. Wenn er da immer die aktuelle Zeit sendet, passt es, hatte ich ja auch geschrieben.

          Kommentar


            #6
            Moin,

            vielen Dank Morg / Tom Bombadil für Eure Lösungen.
            Die letzten Tagen habe ich einige Versuche gestartet - mit teilweisem Erfolg.
            Ich scheitere aktuell am safedata. Der folgende Code funktioniert daher NICHT wie gewünscht.

            Meine Item-Definition
            Code:
            test:
                data:
                    name: data with cycle 30 seconds expected, timeout is 60 sec.
                    type: num
                    enforce_updates: true
                    # ow_addr: 28.FFFFFFFF0000
                    # ow_sensor: T
                    value : -99
                    monitorseconds:
                        name: Seconds to raise a timeout
                        type: num
                        cache: true
                        value: 60
                    alivestatus:
                        name: Alive Status is checked cyclically, and just reported once
                        type: bool
                        cycle: 30
                        eval_trigger: ..
                        eval: False if ((sh...property.last_update_age > sh...monitorseconds()) or (sh...property.value != -99)) else True
                        telegram_message: 'Error: Items Data not updated anymore'
                        telegram_value_match_regex: (0|false|False)
                        value: 1
                    safedata:
                        type: num
                        enforce_updates: true
                        cache: true
                        eval_trigger:
                         - ...alivestatus
                         - ..
                        eval: sh...property.value if ( sh...alivestatus() == True) else -100
            
            ​
            Der Alivestatus funktioniert teileweise logisch richtig.
            Als Fehler hatte ich cache:true aktiviert, was wiederum dazu führte, dass der Wert -99 nicht gesetzt wurde.
            (Nun behoben, jedoch mußte ich noch in /var/cache die Variable löschen)

            Beim safedata habe ich wohl noch ein Syntax-Problem, das Element aktualisiert nicht wie gewünscht.

            Bei meiner Fehlersuche bin ich auf folgenden Eintrag gekommen.
            Als Lösungsansätze wird autotimer verwendet und der Hinweis einer Userfunktion Watchdog gegeben sowie ein Struct genutzt - um den Reuse zu gewährleisten.

            https://knx-user-forum.de/forum/supp...zeitkomponente

            Cannon : Läuft Deine Implementierung stabil und nutzt Du nun UserFunctions & Structs?​

            Kommentar

            Lädt...
            X