Jemand (ich glaube Mirko oder Hendrik?) hatte sich die Tage schon ein "last_value" bei den Items gewünscht. Heute hatte ich jüngst auch den Wunsch nach so etwas:
Meine Wärmepumpe bestimmt den korrekten Rücklaufwert nur wenn die Umwälzpumpe läuft (bzw. gerade gelaufen ist). Der Pumpenzustand und die "rohe" Rücklauftemperatur sind in Modbus-Register encodiert. Um jetzt elegant ohne Logik das zu erschlagen möchte ich jetzt einfach ein drittes Item mit eval benutzen:
(pseudo)
eval_trigger = Pumpenzustand
eval = sh.temp_raw() if ((sh.Pumpenzustand = 0) and (sh.Pumpenzustand.last_value = 4)) else self()
Zudem Vorschlag last_age() nur on-demand zu berechnen, analog zu age(). Verhindert Inkonsistenzen und der gesparte Speicher/gesparte Rechenleistung kann für last_value() benutzt werden. ;-)
PHP-Code:
diff --git a/lib/item.py b/lib/item.py
index 2521a89..f86ca2e 100755
--- a/lib/item.py
+++ b/lib/item.py
@@ -256,6 +256,7 @@ class Item():
except:
logger.error("Item {}: value {} does not match type {}.".format(self._path, self._value, self._type))
raise
+ self.__last_value = self._value
#############################################################
# Crontab/Cycle
#############################################################
@@ -350,9 +351,9 @@ class Item():
if value != self._value:
_changed = True
self._value = value
- self.__prev_age = (self._sh.now() - self.__last_change).total_seconds()
self.__prev_change = self.__last_change
self.__last_change = self._sh.now()
+ self.__last_value = self._value
self.__changed_by = "{0}:{1}".format(caller, source)
if caller != "fader":
self._fading = False
@@ -420,11 +421,15 @@ class Item():
return self.__last_update
def prev_age(self):
- return self.__prev_age
+ delta = self.__last_change - self.__prev_change
+ return delta.total_seconds()
def prev_change(self):
return self.__prev_change
+ def last_value(self):
+ return self.__last_value
+
def return_children(self):
Robert


Einen Kommentar schreiben: