Hallo,
ich habe bei meiner Installation ein Problem mit dem Schreiben eines Wertes in ein dict-Item durch eine Logik mit dem Cache dieses Wertes bzw auch dem Zugriff auf die vorherigen Wertes.
Die Anwendung ist folgende:
Per Logik errechne ich die Tagesmitteltemperatur mit der 24 Punkt Methode. Im Item ....tagesmittelwert.digits mit dem Typ dict schreibe ich per Logik den jeweiligen Stundenwert im Format [stunde]:wert. Die Logik liest bei erstmaligen Start dieses Item ein und erstellt daraus eine persistente Variable. Beim Aufruf der Logik durch den Scheduler (jede Stunde) wird die persistente Variable um den aktuellen Stundenwert ergänzt und als Backup auch wieder ins Item geschrieben.
Meine Itemdefinition:
Die Logik:
Das Problem ist, dass beim Beschreiben des Items mit dem Inhalt der persistenten Variable zwar der Wert des Items geändert wird (im Admin Interface steht der neue Wert im Feld Wert), aber im Feld "letzter Wert" steht nicht der vorherige Wert sondern ein sehr alter Wert.
Gleiches passiert, wenn man shNG neu startet und der Wert des Items ....tagesmittelwert.digits aus dem cache gelesen wird. Auch hier wird ein sehr alter Wert gesetzt.
Es sieht so aus, als wenn der Wert des Items durch die Logik mit der persistenten Variable nicht richtig gesetzt wird.
Was mache ich falsch?
ich habe bei meiner Installation ein Problem mit dem Schreiben eines Wertes in ein dict-Item durch eine Logik mit dem Cache dieses Wertes bzw auch dem Zugriff auf die vorherigen Wertes.
Die Anwendung ist folgende:
Per Logik errechne ich die Tagesmitteltemperatur mit der 24 Punkt Methode. Im Item ....tagesmittelwert.digits mit dem Typ dict schreibe ich per Logik den jeweiligen Stundenwert im Format [stunde]:wert. Die Logik liest bei erstmaligen Start dieses Item ein und erstellt daraus eine persistente Variable. Beim Aufruf der Logik durch den Scheduler (jede Stunde) wird die persistente Variable um den aktuellen Stundenwert ergänzt und als Backup auch wieder ins Item geschrieben.
Meine Itemdefinition:
Code:
%YAML 1.1 --- raumtemp: aussen: nord: name: Außentemp Nordseite type: num visu_acl: ro knx_dpt: 9 knx_cache: 6/5/1 eval: value if value != 0 else None database: init struct: min_max tagesmittelwert: name: Außentemptagesmittelwert remark: wird von Logik gefüllt type: num database: init digits: name: Temperaturwerte des laufenden Tages zur vollen Stunde (UST) remark: wird von Logik gefüllt type: dict visu_acl: ro cache: yes
Code:
#!/usr/bin/env python3 # temperaturtagesmittel.py # Die Logik ermittelt die Tagesmitteltempertur mit der 24 Punkt Methode logger.info(f"Logik '{logic.id()}' ausgelöst durch: {trigger['by']} und {trigger['source']} mit Wert {trigger['value']}") from lib.item import Items items = Items.get_instance() # Speicher für Temperaturwerte einrichten if not hasattr(logic, 'stundentemperaturwerte'): logic.stundentemperaturwerte = {} logic.stundentemperaturwerte = sh.raumtemp.aussen.nord.tagesmittelwert.digits() logger.info(f"eingelesene Stundentemperturwerte: {logic.stundentemperaturwerte}") # Temperaturwert einlesen actual_temp=round(sh.raumtemp.aussen.nord(),1) if trigger['by'] == 'Scheduler': if sh.shtime.utcnow().hour == 0: # Auswertung, Tagesmittel berechnen, rücksetzen tempsumme = 0 tagesmittel = 0 if len(logic.stundentemperaturwerte) >= 21: for key in logic.stundentemperaturwerte: tempsumme += logic.stundentemperaturwerte[key] tagesmittel = round(tempsumme / len(logic.stundentemperaturwerte), 1) elif 0 in logic.stundentemperaturwerte and 6 in logic.stundentemperaturwerte and 12 in logic.stundentemperaturwerte and 18 in logic.stundentemperaturwerte: tagesmittel = round((logic.stundentemperaturwerte[0] + logic.stundentemperaturwerte[6] + logic.stundentemperaturwerte[12] + logic.stundentemperaturwerte[18]) / 4, 1) else: for key in logic.stundentemperaturwerte: tempsumme += logic.stundentemperaturwerte[key] tagesmittel = round(tempsumme / len(logic.stundentemperaturwerte), 1) logger.info(f"Berechnerte Tagesmitteltemperartur: {tagesmittel}°C") sh.raumtemp.aussen.nord.tagesmittelwert(tagesmittel) # dict leeren logic.stundentemperaturwerte.clear() logic.stundentemperaturwerte[sh.shtime.utcnow().hour]=actual_temp logger.info(f"Geloggte Stundentemperturwerte: {logic.stundentemperaturwerte}") sh.raumtemp.aussen.nord.tagesmittelwert.digits(logic.stundentemperaturwerte)
Gleiches passiert, wenn man shNG neu startet und der Wert des Items ....tagesmittelwert.digits aus dem cache gelesen wird. Auch hier wird ein sehr alter Wert gesetzt.
Es sieht so aus, als wenn der Wert des Items durch die Logik mit der persistenten Variable nicht richtig gesetzt wird.
Was mache ich falsch?