Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik mit persistenter Variable schreibt Itemwert nicht "richtig"; prev_value

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

    Logik mit persistenter Variable schreibt Itemwert nicht "richtig"; prev_value

    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:

    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
    Die Logik:
    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)
    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?
Lädt...
X