HowTo - erweiterte CCU3/RM Verbrauchszähler (heute/gestern/letzte 7 Tage/letzte 30 Tage) in eigene SysVars schreiben

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Baxxy
Beiträge: 10890
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 615 Mal
Danksagung erhalten: 2241 Mal

HowTo - erweiterte CCU3/RM Verbrauchszähler (heute/gestern/letzte 7 Tage/letzte 30 Tage) in eigene SysVars schreiben

Beitrag von Baxxy » 22.04.2024, 17:18

Vorwort:
Seitdem der HmIP-ESI auf dem Markt ist gibt es für alle energiemessenden HmIP-Geräte die erweiterten Verbrauchszähler.
(Verbrauch heute / Verbrauch gestern / Verbrauch vergangene 7 Tage / Verbrauch vergangene 30 Tage)
Man bekommt sie indem man die (energiemessenden) HmIP-Geräte aus der Zentrale löscht und neu anlernt oder indem man >> meiner Anleitung << folgt.

Umgesetzt wird das auf der Zentrale über 2 systeminterne Programme (pro Mess-Kanal).
Das altbekannte 'prgXXXCounter' wurde etwas erweitert und ein neues 'prgSetEnergyValuesAtMidnight' kam hinzu.

Die erweiterten Verbrauchszähler sind recht nett, leider hat sich eQ-3 entschlossen die Daten nicht in Systemvariablen zu schreiben sondern diese als Metadaten an den jeweiligen Mess-Kanal zu hängen. Somit kommt man da erstmal nur mittels HM-Script ran.

Inzwischen kam in einem Thread der Wunsch auf diese erweiterten Verbrauchszähler (sowie den Zählerstand eines ESI-GAS) in Systemvariablen zu haben um diese z.B. in einer Visu anzeigen zu können. Man kann diese SysVar's dann natürlich auch als Trigger in WebUI-Programmen nutzen.

Also habe ich mich mal drangesetzt...
(und das beispielhaft für einen ESI-GAS umgesetzt)

Vorbereitung:
  • A: wir legen uns (bis zu) 5 Systemvariablen (Typ: Zahl) an die dann die 4 erweiterten Verbrauchszähler (und bei Bedarf den Zählerstand) beinhalten.
    Wie sie genannt werden ist egal, der Wertebereich sollte grob zum Inhalt passen. Die vergebenen Namen kopieren wir für später in eine Zwischenablage ('Notepad')
    Hier ein Entwurf:
    RM_Gaszähler_SysVars_Entwurf.JPG
Durchführung Teil 1:
  • B: wir speichern/notieren die Seriennummer vom ESI-GAS in eine Zwischenablage und merken/speichern uns auch die Kanalnummer vom Mess-Kanal. (:2 beim ESI-GAS)
  • C: wir gehen in die Programm-Übersicht, drücken unten auf den Button "systeminterne Programme einblenden" und filtern die Ansicht anschließend über den Namensfilter (oben links) mit der Seriennummer vom ESI-GAS. Es sollte(n) ein/oder mehrere Programme übrig bleiben, wir öffnen (bearbeiten) das Programm welches die korrekte Kanalnummer am Ende hat (:2 beim ESI-GAS)
  • D: wir "öffnen" das (im DANN) enthaltene Script und notieren uns als erstes die ID die in der ersten Zeile abgefragt wird. (Beispielhaft: 8396)
  • E: wir gehen zum Ende des Scripts und fügen folgende Zeilen (noch innerhalb der schließenden geschweiften Klammer) ein.

    Code: Alles auswählen

    object oOwnZaehlerstand_SysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Zählerstand");
    object oOwnVerbrauchHeuteSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch heute");
     if (oOwnZaehlerstand_SysVar) { oOwnZaehlerstand_SysVar.State(sysVarVal + diffVal); }
     if (oOwnVerbrauchHeuteSysVar) { oOwnVerbrauchHeuteSysVar.State(energy0 + diffVal); } 
    Der Block muss dann so aussehen:

    Code: Alles auswählen

    if (tmp_devVal != 0) {oSysVarEnergyCounterOldVal.State(devVal);
    oSysVarEnergyCounter.State(sysVarVal + diffVal);
    ! Save todays energy consumption
    chn.MetaData('energy0',energy0 + diffVal);
    object oOwnZaehlerstand_SysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Zählerstand");
    object oOwnVerbrauchHeuteSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch heute");
     if (oOwnZaehlerstand_SysVar) { oOwnZaehlerstand_SysVar.State(sysVarVal + diffVal); }
     if (oOwnVerbrauchHeuteSysVar) { oOwnVerbrauchHeuteSysVar.State(energy0 + diffVal); }
    }
    :!: Die Objektnamen müssen dann ggf. noch durch eure vergebenen SysVar-Namen ersetzt werden!
    Beispiel: Die SysVar für Verbrauch heute heißt "Mein heutiger Gasverbrauch", also muss die entsprechende Object-Zeile wie folgt aussehen:

    Code: Alles auswählen

    object oOwnVerbrauchHeuteSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Mein heutiger Gasverbrauch");
    :!:
  • F: Wir schließen das Scriptfenster und anschließend das Programm mit "OK" und ab jetzt sollten die beiden SysVars (bei Aktualisierung des ESI) mit Daten gefüllt werden.
Durchführung Teil 2:
  • G: wir gehen wieder zu C, nur dieses mal nutzen wir als Namensfilter die ID aus D. Es sollte ein Programm übrig bleiben ('prgSetEnergyValuesAtMidnightID') was wir wieder öffnen (bearbeiten) und das darin enthaltenen Script bearbeiten.
  • H: Hier müssen nun folgende Zeilen nach der letzten schließenden geschweiften Klammer, aber vor dem Rest des Scriptes eingefügt werden:

    Code: Alles auswählen

    object oOwnVerbrauchHeuteSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch heute");
    object oOwnVerbrauchGesternSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch gestern");
    object oOwnVerbrauchLetzte7SysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch letzte 7 Tage");
    object oOwnVerbrauchLetzte30SysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch letzte 30 Tage");
    if (oOwnVerbrauchLetzte7SysVar) { oOwnVerbrauchLetzte7SysVar.State(energy7); }
    if (oOwnVerbrauchLetzte30SysVar) { oOwnVerbrauchLetzte30SysVar.State(energy30); }
    if (oOwnVerbrauchGesternSysVar) { oOwnVerbrauchGesternSysVar.State(energy0); }
    if (oOwnVerbrauchHeuteSysVar) { oOwnVerbrauchHeuteSysVar.State(0.0); }
    Der Block muss dann so aussehen:

    Code: Alles auswählen

    energy30 = energy30 + val;
    loop = loop +1;
    }
    object oOwnVerbrauchHeuteSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch heute");
    object oOwnVerbrauchGesternSysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch gestern");
    object oOwnVerbrauchLetzte7SysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch letzte 7 Tage");
    object oOwnVerbrauchLetzte30SysVar = dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Gaszähler - Verbrauch letzte 30 Tage");
    if (oOwnVerbrauchLetzte7SysVar) { oOwnVerbrauchLetzte7SysVar.State(energy7); }
    if (oOwnVerbrauchLetzte30SysVar) { oOwnVerbrauchLetzte30SysVar.State(energy30); }
    if (oOwnVerbrauchGesternSysVar) { oOwnVerbrauchGesternSysVar.State(energy0); }
    if (oOwnVerbrauchHeuteSysVar) { oOwnVerbrauchHeuteSysVar.State(0.0); }
    chn.MetaData('energy7', energy7);
    chn.MetaData('energy30', energy30);
    ! Reset energy0 (today) - a new day begins
    chn.MetaData('energy0', 0.0);
    Auch hier müssen die Objektnamen ggf. noch durch eure vergebenen SysVar-Namen ersetzt werden!
  • I: Wir schließen das Scriptfenster und anschließend das Programm mit "OK". Nun sollten um 00:00 die3 SysVars mit den berechneten Daten gefüllt werden und die "Gaszähler - Verbrauch heute" auf 0.0 gesetzt werden.
Hinweise:
Das Beispiel ist jetzt für den ESI-GAS.
Grundsätzlich sollte das auch für den ESI-LED und ESI-IEC funktionieren, wobei man beim IEC die 'Zählerstand-SysVar' nicht bräuchte.
Für die altbekannten HmIP-Messaktoren (PSM/FSM/BSM/USBSM) sollte das auch nutzbar sein.

Da ich keinen ESI zum testen habe kann es sein das die Daten ggf. noch umgerechnet werden müssen. Da würde ich dann Anhand von Feedback die Scriptzeilen bei Bedarf aktualisieren.

Nur Systemvariablen die anhand ihres Namens gefunden werden, werden auch beschrieben. Man kann also problemlos SysVars die man nicht braucht weglassen. Der SysVar-Name und der Name des jeweiligen Objekts im Script muss übereinstimmen, ansonsten wird halt nichts gefüllt.

Auch wenn wir hier im "Keine Fragen" - Bereich sind darf natürlich nachgefragt und auch Feedback gegeben werden.

Viel Erfolg!

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“