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.
1 Kommentar
Kevin · 27. Januar 2021 um 9:21
Hello, vielen Dank für den coolen „Trick“. Ich bin sehr neu dabei und versuche mich Schrittweise an Smarthome anzutasten. Ich habe deinen Code genommen und auf mich angepasst. Ich denke aber, dass ich was vergessen habe, den ich erhalte keinen Wert. Muss ich bei Maximum_Heute -> eval – sh….self <- was eingeben?
Bei mir sieht es so aus:
Temperatur_test:
Aktuell:
type: num
knx_dpt: 9
knx_listen: 1/6/6
database: init
visu_acl: ro
Maximum_Heute:
type: num
visu_acl: ro
eval: sh.Dach.Wetterstation.Temperatur_test.Aktuell() if value == 99.9 or float(sh..self()) < sh…Aktuell() else sh..self.property.value
eval_trigger: Dach.Wetterstation.Temperatur_test.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