HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

HMIP lokale Installation

Moderator: Co-Administratoren

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

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von Baxxy » 08.12.2023, 18:15

So, nach den Hinweisen von Micha und Jérôme habe ich mich ans Testsystem gesetzt und eine Methode entwickelt wie man das ohne eQ-3 Holzhammer-Methode hinbekommt. Dazu gleich mehr.

Man sollte sich aber überlegen ob man das wirklich braucht.
Da es (erstmal) keine Systemvariablen für die Daten gibt kann man diese nur über die WebUI sehen bzw. per Script auslesen.
(da wir eine CCU/RM haben ließe sich das natürlich ändern)
Pro IP-Messaktor wir ein zusätzliches Programm angelegt was (per default) immer um 00:00 ausgeführt wird. Ich bin da kein Freund von x-Programme samt Script "zeitgleich" zu triggern. Auch das kann man natürlich ändern indem man Trigger-Zeitpunkt oder Script-Verzögerung variiert.
(oder man packt alle "Mitternachts-Berechnungs-Scripte" in ein Programm)

Durchführung Teil 1:
  • A: man geht in seine Geräteliste (> Einstellungen > Geräte), sucht sich den Messaktor, klappt die Kanäle über das + aus und kopiert den Namen des "Messwertkanals" (Statusmeldung Messwertkanal) in eine Zwischenablage
  • B: man kopiert folgendes Script und fügt es in das "Script testen" Fenster (> Programme und Verknüpfungen > Programme --> Button "Script testen" in der unteren Leiste) ein.
  • C: man holt den Namen des Messwertkanals aus der Zwischenablage und fügt ihn in Zeile 10 bei "string NameMesswertkanal" innerhalb der einfachen Anführungszeichen ein
    Script:

    Code: Alles auswählen

    !- HmIP Messaktoren FSM/PSM/BSM usw.
    !- Hinzufügen von Verbrauchszähleranzeige Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage zur WebUI
    !- Hinzufügen des 00:00 WebUI-Programms 'prgSetEnergyValuesAtMidnight' für die Berechnungen
    !- v1.1 by Baxxy / 08.12.23
    !- Forum-Link: https://homematic-forum.de/forum/viewtopic.php?f=60&t=80952&start=10#p788494
    !- ab CCU3/RM-Firmware 3.73.9, ältere Versionen können die Verbrauchszähleranzeigen nicht anzeigen
    
    
    !- Name des Messwertkanals wie in der WebUI vergeben einfügen!
    string NameMesswertkanal = 'Beleuchtung Balkon PSM DCD:6 - Messwertkanal';
    
    !- Ab hier bitte die Finger weg !!!
    !- ----------------------------
    object oChnPM = channels.Get (NameMesswertkanal);
    if (oChnPM) {
    if (oChnPM.HssType() == "ENERGIE_METER_TRANSMITTER") {
    integer iChnID = oChnPM.ID();
    WriteLine("Kanal-ID: --> "#iChnID);
    string meta0_key = "energy0"; var meta0_val = 0;
    string meta1_key = "energy1"; var meta1_val = 0;
    string meta2_key = "energy30"; var meta2_val = 0;
    string meta3_key = "energy7"; var meta3_val = 0;
    string meta4_key = "energyCounter30Days";
    var meta4_val = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0";
    oChnPM.AddMetaData (meta0_key,meta0_val);
    oChnPM.AddMetaData (meta1_key,meta1_val);
    oChnPM.AddMetaData (meta2_key,meta2_val);
    oChnPM.AddMetaData (meta3_key,meta3_val);
    oChnPM.AddMetaData (meta4_key,meta4_val);
    WriteLine ("Metadaten angelegt!");
    
    string sPRGName= "prgSetEnergyValuesAtMidnight_"#iChnID;
    WriteLine ("Backup/Restore CCU Programme by Black 2023");
    WriteLine ("Backup erstellt vom SDV V5.03.01D-HF1 LCL am 08.12.2023 15:45:45");
    WriteLine ("CCU ProgrammName: \"" # sPRGName # "\"");
    WriteLine ("----------------------------");
    object oPRG= dom.GetObject (ID_PROGRAMS).Get (sPRGName);
    if (oPRG) {WriteLine ("Programm existiert schon mit dem Namen \"" # oPRG.Name () # "\" --> Abbruch"); quit;}
    oPRG= dom.CreateObject (OT_PROGRAM,sPRGName);
    if (!oPRG) {WriteLine ("Programm konnte nicht angelegt werden. --> Abbruch"); quit; }
    dom.GetObject (ID_PROGRAMS).Add (oPRG.ID () );
    oPRG.PrgInfo ("Mitternachtsberechnungen für: "#NameMesswertkanal);
    oPRG.Active (false);
    oPRG.Enabled  (true);
    oPRG.Visible  (true);
    oPRG.Internal (true);
    object oCND; object oSCND; object oDST; object oSDST; object oOBJ; string sScript;
    !-------- MainCondition
    oCND= oPRG.MainCondition();
    oCND.CndOperatorType (1);
    object oRULE= oPRG.Rule ();
    !-------- Rule 0
    oRULE.RuleOperatorType (0);
    oRULE.ElseIfFlag (true);
    oCND=oRULE.RuleAddCondition(); !- Condition 0
    oCND.CndOperatorType (0);
    oSCND=oCND.CndAddSingle (); !- Single Condition 0
    string sVal=^0^;
    if (!oSCND.AddMetaData("SDV_OperatorType",sVal)){oSCND.MetaData("SDV_OperatorType",sVal);}
    oSCND.ConditionType(3);
    oSCND.ConditionType2(13);
    oSCND.OperatorType(0);
    oSCND.NegateCondition(false);
    oSCND.ConditionChannel(65535);
    oSCND.LeftValType(24);
    oSCND.LeftVal(@2023-12-08 14:45:45@);
    oSCND.RightVal1ValType(18);
    oSCND.RightVal2ValType(0);
    oOBJ= dom.CreateObject (OT_CALENDARDP,"Zeitmodul");
    dom.GetObject(ID_CALENDARDPS).Add(oOBJ);
    oOBJ.TimerType(9);
    oOBJ.Time(@2000-01-01 00:00:00@);
    oOBJ.CalDuration(0);
    oOBJ.TimeSeconds(946681200);
    oOBJ.CalRepeatTime(@1970-01-01 01:00:00@);
    oOBJ.Weekdays(0);
    oOBJ.Period(0);
    oOBJ.Begin(@2000-01-01 00:00:00@);
    oOBJ.End(@1970-01-01 01:00:00@);
    oOBJ.CalRepetitionCount(0);
    oOBJ.CalRepetitionValue(0);
    oOBJ.SunOffsetType(0);
    oSCND.RightVal1 (oOBJ.ID () );
    !-------- Rule Destination
    oDST=oRULE.RuleDestination();
    oDST.BreakOnRestart (true);
    oSDST=oDST.DestAddSingle (); !- Single Destination 0
    oSDST.DestinationParam(20);
    oSDST.DestinationValueType(20);
    oSDST.DestinationChannel(65535);
    oSDST.DestinationDP(65535);
    oSDST.DestinationValueParamType(0);
    sScript = "integer loop = 0;\nstring last30Days = '';\nstring val;\nreal energy7 = 0.0;\nreal energy30 = 0.0;\nobject chn = dom.GetObject('"#iChnID#"');\n! Retrieve energyCounter30Days\nstring energyCounter30Days = chn.MetaData('energyCounter30Days');\n! Retrieve todays value\nreal energy0 = chn.MetaData('energy0').ToFloat();\n! Move the values of the array energyCounter30Days one position to the right\nforeach (val, energyCounter30Days.Split(',')) {\nif (loop <= 28 ) {\nlast30Days = last30Days + val + ',';\n} else {\nif (loop == 29) {\nlast30Days = last30Days + val;\n}\n}\nloop = loop + 1;\n}\n! Set the first position of the array energyCounter30Days to todays value.\nlast30Days = energy0.ToString(1) + ',' + last30Days;\n!Store energyCounter30Days as meta data\nchn.MetaData('energyCounter30Days', last30Days);\n! Set the meta data of energy1 (yesterday), energy7 (week) and energy30 (months)\nloop = 0;\nforeach (val, last30Days.Split(',')) {\nval = val.ToFloat();\nif (loop == 0) {chn.MetaData('energy1', val);}\nif (loop <= 6) {\nenergy7 = energy7 + val;\n}\nenergy30 = energy30 + val;\nloop = loop +1;\n}\nchn.MetaData('energy7', energy7);\nchn.MetaData('energy30', energy30);\n! Reset energy0 (today) - a new day begins\nchn.MetaData('energy0', 0.0);\n";
    oSDST.DestinationValue(sScript);
    oPRG.Active (true);
    dom.RTUpdate (0);
    WriteLine ("Restore Programm von Program \"" # sPRGName # "\" erfolgreich durchgelaufen");
    }
    else {WriteLine("Kanal gefunden, aber es ist kein Energiezähler-Messwertkanal!\nHss-Typ vom Kanal ist: '"#oChnPM.HssType()#"'");}
    }
    else {WriteLine("Kanal mit Namen: '"#NameMesswertkanal#"' nicht gefunden!");}
  • D: nun drückt man "Ausführen" und kopiert idealerweise die Scriptausgabe wieder in eine Zwischenablage. Die angezeigte Kanal-ID ist gleich noch hilfreich.
    Beispielausgabe:

    Code: Alles auswählen

    Kanal-ID: --> 3171
    Metadaten angelegt!
    Backup/Restore CCU Programme by Black 2023
    Backup erstellt vom SDV V5.03.01D-HF1 LCL am 08.12.2023 15:45:45
    CCU ProgrammName: "prgSetEnergyValuesAtMidnight_3171"
    ----------------------------
    Restore Programm von Program "prgSetEnergyValuesAtMidnight_3171" erfolgreich durchgelaufen
Damit wären der halbautomatische Teil 1 abgeschlossen, nun zum manuellen Teil 2:

Durchführung Teil 2:
  • E: ihr geht in eure Programm-Übersicht (> Programme und Verknüpfungen > Programme) und klickt in der unteren Leiste auf "Systeminterne Programme einblenden"
  • F: ihr geht in der Spalte "Name" auf "Filter" und gebt die ID aus der Scriptausgabe ein, dann sollten nur noch 2 Programme aufgelistet werden.
    das "Neue": 'prgSetEnergyValuesAtMidnight_xxxx* und das "Alte": 'prgEnergyCounter_xxxx_SN_DES_AKTORS:KANALNUMMER'
  • G: ihr bearbeitet das "Alte" Programm und darin das einzige Script. Hier müssen effektiv 2 Codezeilen und eine optionale Kommentarzeile hinzugefügt werden.
  • G1: 1. Stelle, aus...

    Code: Alles auswählen

    integer tmp_oldDevVal = (oldDevVal.ToString().ToFloat() * 1000).ToInteger();
    if (overFlowFlag == false) {
  • G2: ...wird:

    Code: Alles auswählen

    integer tmp_oldDevVal = (oldDevVal.ToString().ToFloat() * 1000).ToInteger();
    real energy0 = chn.MetaData('energy0').ToFloat();
    if (overFlowFlag == false) {
  • G3: 2. Stelle, aus...

    Code: Alles auswählen

    if (tmp_devVal != 0) {oSysVarEnergyCounterOldVal.State(devVal);
    oSysVarEnergyCounter.State(sysVarVal + diffVal);
    }
    G4: ...wird:

    Code: Alles auswählen

    if (tmp_devVal != 0) {oSysVarEnergyCounterOldVal.State(devVal);
    oSysVarEnergyCounter.State(sysVarVal + diffVal);
    ! Save todays energy consumption
    chn.MetaData('energy0',energy0 + diffVal);
    }
  • H: nun das geänderte Script mit "OK" speichern, dann noch das Programm mit "OK" speichern
  • I: Fertig... 8)
Viel Erfolg...

PS:
Ohne den SDV von @Black wären solche "One-Klick-Restore-Scripte" quasi unmöglich.
Danke Micha... :)
Zuletzt geändert von Baxxy am 08.12.2023, 18:45, insgesamt 2-mal geändert.

MichaelN
Beiträge: 9710
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 701 Mal
Danksagung erhalten: 1634 Mal

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von MichaelN » 08.12.2023, 18:35

Super ausgearbeitet! Hat perfekt geklappt.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

FreakyDaddy
Beiträge: 3
Registriert: 20.09.2021, 17:20
System: CCU

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von FreakyDaddy » 23.04.2024, 12:49

Hallo,

ich habe das Problem mit einer HmIP-FSM16, dass die Verbrauchswerte "energy0", "energy1", "energy7" und "energy30" anfangs korrekt ermittelt werden, aber nach einiger Zeit völlig falsche und unbrauchbare Werte liefern.
Der Fehler kann schon nach wenigen Stunden auftreten, manchmal aber auch erst nach wenigen Tagen. Aber er kommt ganz sicher irgendwann...
Dasselbe Problem habe ich teilweise auch mit den HMIP-PSMs.

Plötzlich stehen Werte in Metadaten/ Zählern, die nicht plausibel sind und mit einem Balkonkraftwerk (max 800W) nicht erreichbar sind.
Im beigefügten Screenshot steht z.B. bei "Gestern" ein Wert von 718kWh. Real waren es aber 3,16kWh gestern, ausgelesen aus der PV-App.
Auch die Werte von den letzten 7Tagen (735kWh) und letzten 30Tagen (1977kWh) sind nicht plausibel.
HmIP-FSM16_Photovoltaik_BKW_Fehler.jpg
Ich habe die internen Skripte schon kontrolliert. Diese scheinen aber meiner Ansicht nach korrekt zu sein. Zumindest sind sie (abgesehen von der ID) identisch zu den Skripts, die beim automatischen Einbinden generiert werden.

Dieses interne Skript ist absolut unverändert und steht so als internes PRogramm in der CCU:
CCU-Programm:
prgEnergyCounter.jpg
Skript:
prgEnergyCounter_77997_000B9F29A72A2E_5.txt
(1.52 KiB) 7-mal heruntergeladen
Das zweite interne Skript ist im Prinzip auch unverändert, nur habe ich am Ende noch ein paar Ergänzungen (Berechnungen und Schreiben in SysVaiablen) hinzugefügt, um bei mir weitere SysVariablen zu beschreiben:
CCU-Programm:
prgSetEnergyValuesAtMidnight.jpg
Skript:
prgSetEnergyValuesAtMidnight_77997.txt
(2.33 KiB) 9-mal heruntergeladen
Außerdem gibt es dann noch ein weiteres Skript, welches alle 55 Sekunden ausgeführt wird. Hier werden vielen Dinge berechnet und in SysVariablen geschrieben. Aber hier finden lediglich Berechnungen statt. Und es wird der Wert aus dem HMIP-FSM16 ausgelesen.
Dieses Skript habe ich an die systeminternen Skripte angelehnt, weil ich diese nicht bis ins letzte Detail nachvollziehen kann (trotz Programmier-Grundkenntnissen)

Hier der Auszug für die Photovoltaikanlage (PV) aus dem 55 Sekunde Skript:
Auslesen_alle55Sekunden_Schreiben_in_SysVar.txt
(2.64 KiB) 9-mal heruntergeladen

Sieht jemand hier auch dasselbe Problem?
Und nun die Frage:
Mache ich irgendetwas falsch oder ist das ein generelles Problem mit den neuen Features der Geräte?
Und hat vielleicht jemand einen Tipp, was bei mir falsch ist oder was man besser/ anders machen kann bzw. sollte...

Ich hätte fast vermutet, dass ich irgendwo Werte auslese, falsch berechne und den falschen Wert wieder zurückschreibe. Aber das kann ich mittlerweile meines Erachtens nach ausschließen, weil ich ja nur die internen Skripte nutze und in dem 55 Sekunden Calc-Skript nur die Werte auslesen und Berechnungen ausführe... Oder ist in den Skripten doch etwas drin, was die Werte automatisch zurückschreibt?

Oder muss man in den CCU-Programmen vielleicht zwingend auf das Flag "Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden (z.B. Retriggern)" bei Aktivitäten (Skriptausführung) beachten? Ist das massgebend, weil eventuell die Werte in unterschiedlichen Skripten abgerufen werden? Nicht dass ein anderes Skript mittendrin abgebrochen wird und so irgendwelche Fehler entstehen?

Ich selber möchte die Werte eigentlich nur auslesen und dann in SysVariablen speichern und daraus selber berechnen...

Ich habe zwar grundlegende Programmierkenntnisse, aber verstehe diese nicht bis ins letzte Detail...

Vielleicht kann mir hier jemand helfen... DANKE!!!

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

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von Baxxy » 23.04.2024, 15:33

FreakyDaddy hat geschrieben:
23.04.2024, 12:49
Oder muss man in den CCU-Programmen vielleicht zwingend auf das Flag "Vor dem Ausführen alle laufenden Verzögerungen für diese Aktivitäten beenden (z.B. Retriggern)" bei Aktivitäten (Skriptausführung) beachten?
Nein. Grundsätzlich ist das genau so wie es eQ-3 programmiert hat.
Was du mal machen kannst... den Trigger von >= 0.0 auf > 0.0 ändern.
FreakyDaddy hat geschrieben:
23.04.2024, 12:49
Ich selber möchte die Werte eigentlich nur auslesen und dann in SysVariablen speichern und daraus selber berechnen...
Da hatte ich gestern ein HowTo zu gepostet.
viewtopic.php?f=31&t=82352

Dein 55s Script habe ich mir erstmal nicht angesehen.

andrzejgilas
Beiträge: 202
Registriert: 16.01.2021, 00:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 19 Mal

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von andrzejgilas » 24.04.2024, 16:56

Danke Baxxy !

Bei mir funktioniert es seit gestern auf 9 Geräten hervorragend
5x HmIP-FSM, 3x HmIP-PSM-CH, HmIP-FSM16
2.png
CCU3 (rpi5) RaspberryMatic + 49 Gerate (HmIP-HAP, HmIP-HAP JS1, 3xHmIP-BWTH, 3xHmIP-PCBS, 2xHmIP-PCBS2, HmIP-SMO, 2xHmIP-SWDO-PL, 3xHmIP-PSM-CH, HmIP-FCI6, 4xHmIP-SRH, 3xHmIP-SWDO-I, HmIP-KRC4, HmIP-RC8, 7xHmIP-FBL, HmIP-FDT, HmIP-FSI16, 5xHmIP-FSM, 2xHmIP-STHO, HmIP-WRC6, 2xHmIP-SWDM, HmIP-FSM16, HmIP-WTH-1, 2xHMIP-WRC2) , CCU-Historian, Mediola App, VPN - Synology RT2600ac

Benutzeravatar
rhiermei
Beiträge: 6
Registriert: 11.10.2017, 15:37
System: CCU
Wohnort: Ulm

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von rhiermei » 27.04.2024, 10:15

Hallo Baxxy,

erst einmal vielen Dank für die Super Anleitung.
Wer lesen kann, kann auch alle Schritte nachvollziehen.

Ich habe das Script gestern ohne Fehlermeldung installieren können, habe aber noch eine Nachfrage:
- unter den Systemvsriablen finde ich keine enstprechenden neuen Variablen-
- ich stehe gewissermasen blind auf dem Schlauch und hätte gerne einen Tipp, woch ich die um Mitternacht erzeugten Werte für den Verbrauch finden kann.

Ich verwende eine Stromzähler-Leseeinheit "HmIP-ESI" welche mir ordnungsgemäß die aktuelle Leistung und den Verbrauch als Zahl unter den Geräteinformationen anzeigt.

Ich wäre für eine Unterstützung sehr dankbar.
Zusatzfrage: "Hast Du ein Spendenkonto?"
Wenn es funktioniert, hast Du mir sehr viel Arbeit erspart.

Viele Grüße - Reiner aus Ulm

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

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von Baxxy » 27.04.2024, 10:30

rhiermei hat geschrieben:
27.04.2024, 10:15
unter den Systemvsriablen finde ich keine enstprechenden neuen Variablen
Diese Anleitung erzeugt erstmal nur die erweiterten Verbrauchszähler.
Für zusätzliche Systemvariablen gibt's eine extra Anleitung:
viewtopic.php?f=31&t=82352&p=802652&hil ... er#p802652

Benutzeravatar
rhiermei
Beiträge: 6
Registriert: 11.10.2017, 15:37
System: CCU
Wohnort: Ulm

Re: HmIP-PSM / FSM usw. - Verbrauchszähler Heute / Gestern / vergangene 7 Tage / vergangene 30 Tage

Beitrag von rhiermei » 27.04.2024, 10:33

Hallo Baxxy,
wirklich super der Support.
Ich werde mich gleich daran machen es aus zu probieren.
Aber, hast Du am Samstag bei dem schönen Wetter auch nichts besseres zu tun als den Laien wie mir zu helfen?
Viel Grüße aus Ulm - Reiner

- Spendenkonto???

Antworten

Zurück zu „HomeMatic IP mit CCU“