Meine Aufgabenstellung war die folgende: Speichern des höchsten gemessenen Temperaturwertes eines Tages und diesen einmal pro Tag zurücksetzten.

Das ursprüngliche Item dessen Maximalwert ich speichern hat folgenden Aufbau.


Wetterstation:
    Temperatur:
        type: num
        visu_acl: ro

Um jetzt zusätzlich zum aktuellen Messwert den maximalen Messwert zu speichern habe ich das Item etwas angepasst:


Wetterstation:
    Temperatur:
        Aktuell:
            type: num
            visu_acl: ro
        Maximum_Heute:
            type: num
            visu_acl: ro

Für Wetterstation.Tempertatur.Maximum_Heute müssen jetzt noch folgende Dinge hinzufefügt werden:

  • Überprüfen auf Änderungen
    Immer wenn sich der Wert von Wetterstation.Temperatur.Aktuell ändert, soll überprüft werden, ob Wetterstation.Temperatur.Maximum_Heute aktualisiert werden muss.
  • Aktualisieren des Wertes
    Wenn bei dieser Überprüfung der aktuelle Wert höher ist als der bisher in Wetterstation.Temperatur.Maxiumum_Heute gespeicherte Wert, soll der Wert aktualisiert werden.
  • Zurücksetzen des Wertes
    Einmal am Tag muss Wetterstation.Temperatur.Maximum_Heute zurückgesetzt werden.

Überprüfen auf Änderungen

Das überprüfen, ob sich die aktuelle Temperatur ändert, geht ganz einfach indem man Wetterstation.Temperatur.Maximum_Heute einen eval_trigger auf das Item Wetterstation.Temperatur.Aktuell hinzufügt. Seit SmartHomeNG kann man das Item auch relativ angeben: ..Aktuell.
es entsteht also folgender eval_trigger:

eval_trigger: ..Aktuell

Aktualisieren des Wertes

Wenn bei der Überprüfung der aktuelle Wert höher ist als der bisher in Wetterstation.Temperatur.Maxiumum_Heute gespeicherte Wert, soll der Wert aktualisiert werden.
Das geht über ein eval:

eval: sh...Aktuell() if float(sh..self()) > sh...Aktuell() else sh..self.property.value

Zurücksetzen des Wertes

Der Wert soll einmal pro Tag und bei einem Neustart zurückgesetzt werden. Das wird über ein crontab und ein Magic Value (99.9) erledigt. Es wird davon ausgegangen, dass ein Temperaturwert von 99.9 nie vorkommt und deshalb zum Zurücksetzen verwendet werden kann.

Verzögerung bei der Initialisierung: Meine Wetterstation liefert nur alle 5 Minuten (alle 300 Sekunden) einen neuen Temperaturwert. Das heisst nach einem Neustart von SmartHomeNG steht also für maximal 5 Minuten kein aktueller Messwert in Wetterstation.Temperatur.Aktuell sondern 0.0. Deshalb wird nach 5 Minuten und 10 Sekunden Wetterstation.Temperatur.Maximum_Heute auf die aktuelle Temperatur zurückgesetzt.

crontab:
 -init+310 = 99.9
 -0 0 * *  = 99.9

Auch der eval Ausdruck muss für das Zurücksetzen erweitert werden:

eval: sh...Aktuell() if value == 99.9 or float(sh..self()) > sh...Aktuell() else sh..self.property.value

Natürlich kann dieses Prinzip Minimal-Werte angewendet werden. Dafür muss nur der Vergleich im eval Ausdruck angepasst werden.

Das endgültige Item sieht dann so aus:


Wetterstation:
    Temperatur:
        Aktuell:
            type: num
            visu_acl: ro
        Maximum_Heute:
            type: num
            visu_acl: ro
            eval: sh...Aktuell() if value == 99.9 or float(sh..self()) < sh...Aktuell() else sh..self.property.value
            eval_trigger: ..Aktuell
            # Reset am Ende des Tages durch "MagicValue" 99.9. Es wird angenommen, 
            # dass dieser Temperaturwert in der Praxis niemals auftritt. 
            crontab: 
             - 0 3 * * = 99.9
             # +310 weil die Wetterstation mindestens alle 300 Sekunden einen aktualisierten Temperatur Wert sendet
             # dadurch wird sichergestellt, dass nach einem Neustart von SmartHomeNG in ..Aktuell auf jeden Fall ein gültiger Wert steht. 
             - init+310 = 99.9

Wenn etwas anderes als Temperaturwerte gespeichert werden sollen, kann es auch sein, dass als Magic Value eine andere Zahl verwendet werden muss.


0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.