Script für Energiezähler und Jahresprognose - Verbrauch und Kosten V3.2

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

Moderator: Co-Administratoren

Benutzeravatar
GEVJan
Beiträge: 101
Registriert: 28.04.2021, 18:40
System: CCU und Access Point
Wohnort: Köln
Hat sich bedankt: 30 Mal
Danksagung erhalten: 16 Mal

Script für Energiezähler und Jahresprognose - Verbrauch und Kosten V3.2

Beitrag von GEVJan » 29.07.2021, 16:42

Hallo zusammen,

Auf Wunsch habe ich mein überarbeitetes Energiescript mit Jahresprognose, hier noch einmal mit überarbeiteter Erklärung in einem neuen Thread veröffentlicht.
Den ursprünglichen Thread von Sebastian65432 gibt es hier: viewtopic.php?f=60&t=44005

Dies ist V3.2 vom 11.05.2022
In V3.2 wurde ein Fehler behoben, welcher verhinderte, dass die Variable "XX letztes Jahr " korrekt befüllt wurde.


Mit dem Script können folgende Daten erfasst und in Systemvariablen geschrieben werden:

-Energieverbrauch in kWh und Kosten in € von:
-Heute
-gestern
-aktueller Woche
-letzter Woche
-aktuellem Monat
-letztem Monat
-aktuellem Jahr
-letztem Jahr
-Prognose des Energieverbrauchs und der Kosten für das laufende Jahr

Funktioniert mit HmIP-Messaktoren (HM-Aktoren konnte ich nicht ausprobieren).

Es wird ein funktionierender CUxD mit angelegtem CUxD.EXEC-Gerät vorrausgesetzt!

Vorbereitungen:

1.Strompreis einpflegen

Strompreis unter "Systemeinstellungen" -> "Allgemeine Einstellungen" einpflegen

2. Systemvariablen anlegen

Zu Beginn muss man sich für ein Kürzel entscheiden, welches den SV'n vorangestellt wird. Pro Messaktor wird natürlich ein eigenes Kürzel verwendet und eigene SV'n erstellt.
Folgende SV'n müssen angelegt werden (XX steht für das verwendete Kürzel. Auf die Schreibweise achten!):

XX aktuelle Woche Zahl -> Zahl, Einheit kWh
XX aktuelle Woche -> Zeichenkette
XX letzte Woche -> Zeichenkette
XX aktueller Monat Zahl -> Zahl, Einheit kWh
XX aktueller Monat -> Zeichenkette
XX letzter Monat -> Zeichenkette
XX aktuelles Jahr Zahl -> Zahl, Einheit kWh
XX aktuelles Jahr -> Zeichenkette
XX letztes Jahr -> Zeichenkette
XX Verbrauch heute -> Zeichenkette
XX Verbrauch gestern -> Zeichenkette
XX Aktualisierung -> Zeichenkette
XX Prognose aktuelles Jahr -> Zeichenkette
XX Zaehlerstand -> Zahl, Einheit kWh
XX Referenz Zaehlerstand -> Zahl, Einheit kWh

Aussehen müsste das unter "Status und Bedienung" dann etwa so:
Status.JPG

3. ISE-ID des Messaktors ermitteln

Folgendes Script gibt einem die ISE_ID's der Messaktoren. Einmal unter "Script testen" ausführen und die Ausgabe im nächsten Schritt weiterverwenden.

Code: Alles auswählen

string svId;
string list;
list="";
foreach(svId, dom.GetObject(ID_SYSTEM_VARIABLES).EnumIDs()) {
var oSV     = dom.GetObject(svId);
var nSV     = oSV.Name();
var svValue = "";
if (nSV.StartsWith("svEnergyCounter_")) {
svValue = oSV.Value();
list = list # nSV #" " #svValue #"\n";
}}
WriteLine(list);
4. Script individualisieren

Zeile 3, 6 und 9 müssen angepasst werden

Code: Alles auswählen

!Energiescript mit Prognose V3.2
!Individuelles Kürzel hier eintragen
string type = "XXXX"; 

!Bei YYYY die ISE_ID und bei XXXXXXXXXXXXXX:Z die Gerätenummer mit Kanal Z (Bei einer HmIP-PSM z.B. Kanal 6)
object counter = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("svEnergyCounter_YYYY_XXXXXXXXXXXXXX:Z");

! Installationsdatum dieses Skriptes
var instdate = "01.01.2000";

!Ab hier keine Einstellungen mehr

string dd = instdate.StrValueByIndex(".",0);
string mm = instdate.StrValueByIndex(".",1);
string yy = instdate.StrValueByIndex(".",2);

integer startjahr = yy.ToInteger();

instdate = yy#"-"#mm#"-"#dd;

integer heute = system.Date("%j").ToInteger();
integer aktjahr = system.Date("%Y").ToInteger();

if (aktjahr == startjahr) {}
  else {instdate = aktjahr#"-01-01";}

integer tage = heute - instdate.ToTime().Format("%j").ToInteger();

!Ziehen des Strompreises aus der CCU
string stdout;string stderr;
string cmd = '/bin/sh -c \'cat /etc/config/energyPrice|sed -r "s/\\"//g\"\'';
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
string sep = "\n";
string part;
string price = (stdout.StrValueByIndex(":",2)).Substr(1,6);
price = price.ToFloat(); 


if(counter)
{

! Umrechnen von Wh in kWh:
  real curValue = counter.Value();
  curValue = curValue / 1000.0;
  
! Alle Variabeln laden:
  object c = dom.GetObject(type # " Zaehlerstand");
  object d = dom.GetObject(type # " Referenz Zaehlerstand");
  object e = dom.GetObject(type # " Verbrauch gestern");
  object f = dom.GetObject(type # " aktuelle Woche Zahl");
  object g = dom.GetObject(type # " letzte Woche");
  object h = dom.GetObject(type # " aktueller Monat Zahl");
  object i = dom.GetObject(type # " letzter Monat");
  object j = dom.GetObject(type # " aktuelles Jahr Zahl");
  object k = dom.GetObject(type # " letztes Jahr");
  object l = dom.GetObject(type # " Verbrauch heute");
  object m = dom.GetObject(type # " Prognose aktuelles Jahr");
  object o = dom.GetObject(type # " aktuelle Woche");
  object p = dom.GetObject(type # " aktueller Monat");
  object q = dom.GetObject(type # " aktuelles Jahr");


! Beschriftung noch nicht ermittelter Werte:
  if (e.State().EndsWith ("Euro")) {} else {e.State("noch keine Werte");}
  if (g.State().EndsWith ("Euro")) {} else {g.State("noch keine Werte");}
  if (i.State().EndsWith ("Euro")) {} else {i.State("noch keine Werte");}
  if (k.State().EndsWith ("Euro")) {} else {k.State("noch keine Werte");}
  if (l.State().EndsWith ("Euro")) {} else {l.State("noch keine Werte");}
  if (m.State().EndsWith ("Euro")) {} else {m.State("noch keine Werte");}
  if (o.State().EndsWith ("Euro")) {} else {o.State("noch keine Werte");}
  if (p.State().EndsWith ("Euro")) {} else {p.State("noch keine Werte");}
  if (q.State().EndsWith ("Euro")) {} else {q.State("noch keine Werte");}

! Aktueller Zähler aus der CCU in speichern:
  c.State(curValue);
! WriteLine("Zaehlerstand wurde gesetzt auf: " # curValue);

! Datum und Uhrzeit der Aktualisierung speichern
  dom.GetObject(type # " Aktualisierung").State(system.Date("%F %X"));

! Berechnungen durchführen. Nur weitermachen wenn es wirklich Mitternacht ist
    if(system.Date("%H:%M") == "00:00")
    {

!   Woche
    f.State(f.Value() + c.Value() - d.Value());
    var og = f.Value();
    var oeuro = price * og;
    var oausgabe = og.ToString(2) # " kWh, " # oeuro.ToString(2) # " Euro";
    o.State(oausgabe);

!   Monat
    h.State(h.Value() + c.Value() - d.Value());
    var pg = h.Value();
    var peuro = price * pg;
    var pausgabe = pg.ToString(2) # " kWh, " # peuro.ToString(2) # " Euro";
    p.State(pausgabe);

!   Jahr
    j.State(j.Value() + c.Value() - d.Value());
    var qg = j.Value();
    var qeuro = price * qg;
    var qausgabe = qg.ToString(2) # " kWh, " # qeuro.ToString(2) # " Euro";
    q.State(qausgabe);

!   Gestern            
    var vg1 = dom.GetObject(type # " Zaehlerstand").Value();
    var vg2 = dom.GetObject(type # " Referenz Zaehlerstand").Value();
    var vg = vg1 - vg2;
    var vgeuro = vg * price;
    var vgausgabe = vg.ToString(2) # " kWh, " # vgeuro.ToString(2) # " Euro";
    e.State(vgausgabe);

!   Zählerstand Heute auf Gestern übertragen
    d.State(c.Value());
    
!   Berechnung der Prognose für das Laufende Jahr:
    var mo = j.Value() * 365 / tage;
    var meuro = price * mo;
    var mausgabe = mo.ToString(2) # " kWh, " # meuro.ToString(2) # " Euro";
    m.State(mausgabe);


!       Weitermachen, wenn Mitternacht und zugleich Montag
        if(system.Date("%a") == "Mon")
        {
        var lw = dom.GetObject(type # " aktuelle Woche Zahl").Value();
        var lweuro = lw * price;
        var lwausgabe = lw.ToString(2) # " kWh, " # lweuro.ToString(2) # " Euro";
        g.State(lwausgabe); 
        f.State(0);
	o.State("noch keine Werte");
        }

!       Weitermachen, wenn Mitternacht und zugleich Monatsanfang
        if(system.Date("%d") == "01")
        {
        var lm = dom.GetObject(type # " aktueller Monat Zahl").Value();
        var lmeuro = lm * price;
        var lmausgabe = lm.ToString(2) # " kWh, " # lmeuro.ToString(2) # " Euro";
        i.State(lmausgabe);
        h.State(0);
	p.State("noch keine Werte");
        

!           Weitermachen, wnn Mitternacht, Monatsanfang und zugleich Jahresanfang
            if(system.Date("%m") == "01")
            {
            var lj = dom.GetObject(type # " aktuelles Jahr Zahl").Value();
            var ljeuro = lj * price;
            var ljausgabe = lj.ToString(2) # " kWh, " # ljeuro.ToString(2) # " Euro";
            k.State(ljausgabe);
            j.State(0);
            m.State(0);
	    q.State("noch keine Werte");
            }
	}
    }
}

! Verbrauch heute    

var vh1 = dom.GetObject(type # " Zaehlerstand").Value();
var vh2 = dom.GetObject(type # " Referenz Zaehlerstand").Value();
var vh = vh1 - vh2;
var vheuro = vh * price;
var vhausgabe =  vh.ToString(2) # " kWh, " # vheuro.ToString(2) # " Euro" ;
l.State(vhausgabe);

WriteLine(c.Value());
WriteLine(d.Value());
WriteLine(e.Value());
WriteLine(f.Value());
WriteLine(g.Value());
WriteLine(h.Value());
WriteLine(i.Value());
WriteLine(j.Value());
WriteLine(k.Value());
WriteLine(l.Value());
WriteLine(m.Value());
WriteLine(o.Value());
WriteLine(p.Value());
WriteLine(q.Value());
5.Programm anlegen

Zum Schluss noch ein Programm anlegen das wie folgt aussieht:
Programm.JPG
Zeitmodul.JPG

Das Programm enthält zwei Zeitmodule damit
1.Um 0:00Uhr das Script ausgelöst wird um die Messwerte vom Vortag in die entsprechenden SV'n zu schreiben.
2.Damit das Script um Punkt 0:00 Uhr nicht ausversehen doppelt ausgelöst wird.

Soo, Ich hoffe damit kann jemand was anfangen :wink:
Über Feedback und Verbesserungsvorschläge würde ich mich freuen!

Gruß, Jan
Zuletzt geändert von alchy am 23.05.2022, 17:43, insgesamt 2-mal geändert.
Grund: verschoben aus HomeMatic IP Aktoren und Sensoren
CCU3 mit Raspberrymatic -> Eingebunden: HUE-Bridge, Tasmota-Sonoffs, Alexa, Open Weather Map, Tasker, LG-TV

Benutzeravatar
GEVJan
Beiträge: 101
Registriert: 28.04.2021, 18:40
System: CCU und Access Point
Wohnort: Köln
Hat sich bedankt: 30 Mal
Danksagung erhalten: 16 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von GEVJan » 31.07.2021, 18:50

Der Fehlerteufel hatte sich ins Script geschlichen. In Zeile 146 wird die Variable "n" befüllt, die es in dieser Version gar nicht mehr gibt. Dies führte zu einem Fehler. Wurde nun korrigiert!

Gruß, Jan
CCU3 mit Raspberrymatic -> Eingebunden: HUE-Bridge, Tasmota-Sonoffs, Alexa, Open Weather Map, Tasker, LG-TV

Slice
Beiträge: 1192
Registriert: 03.02.2016, 14:44
System: Alternative CCU (auf Basis OCCU)
Wohnort: irgendwo aus Süd BaWü
Hat sich bedankt: 135 Mal
Danksagung erhalten: 82 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von Slice » 08.08.2021, 16:46

Hallo Jan,

ich versuche mich gerade daran das neue Script von diesem Beitrag hier bei mir einzurichten.
Die SV's waren ja schon von dem anderen Beitrag ausgehend angelegt.
Wenn ich das Script einfüge bekomme ich einen Fehler im Syslog:

Code: Alles auswählen

Error / local 0 Homematic-CCU3 (10.1.1.251)   Sonntag, 8. August 2021 16:39:58.705 
ERROR: ScriptRuntimeError: !Energiescript mit Prognose\0x0A!Individuelles Kürzel hier eintragen\0x0Astring type = "PV"; \0x0A\0x0A!Bei YYYY die ISE_ID und bei XXXXXXXXXXXXXX:Z die Gerätenummer mit Kanal Z (Bei einer HmIP-PSM z.B. Kanal 6)\0x0Aobject counter = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("svEnergyCounter_53047_000B9BE9A24789:5");\0x0A\0x0A! Installationsdatum dieses Skriptes\0x0Avar instdate = "27.07.2021";\0x0A\0x0A!Ab hier keine Einstellungen mehr\0x0A\0x0Astring dd = instdate.StrValueByIndex(".",0);\0x0Astring mm = instdate.StrValueByIndex(".",1);\0x0Astring yy = instdate.StrValueByIndex(".",2);\0x0A\0x0Ainteger startjahr = yy.ToInteger();\0x0A\0x0Ainstdate = yy#"-"#mm#"-"#dd;\0x0A\0x0Ainteger heute = system.Date("%j").ToInteger();\0x0Ainteger aktjahr = system.Date("%Y").ToInteger();\0x0A\0x0Aif (aktjahr == startjahr) {}\0x0A else {instdate = aktjahr#"-01-01";}\0x0A\0x0Ainteger tage = heute - instdate.ToTime().Format("%j").ToInteger();\0x0A\0x0A!Ziehen des Strompreises aus der CCU\0x0Astring stdout;string stderr;\0x0Astring cmd = '/bin/sh -c \'cat /etc/config/energyPrice|sed -r "s
Wie auch beim letzten mal werde ich dadurch nicht schlau. Hast Du eine Idee woran es hier klemmt?

Das alte Script funktioniert aus dem alten Beitrag wieder ohne Fehler! :?

EDIT:
Ich habe jetzt nochmal das alte Programm gelöscht und neu angelegt.
Dazu den Code nochmal neu rauskopiert und nun läuft es ohne Fehler!
Ich weiß das man nur mit einem gescheiten Editor arbeiten soll und habe keine Erklärung warum es nun auf einmal geht.
Vielleicht war das alte Programm defekt..

Grüße,
Slice
----------------------------------------------------------------------------------------
Raspi3B+ Bullseye mit HB-RF-ETH und RPI-RF-MOD auf piVCCU-FW 3.73.9 / Addons: CuxD v2.11 - E-Mail v1.7.6 - Patcher v1.0.0 - Philips Hue v3.2.5 - Programme drucken v2.6 - Scriptparser v1.11 - XML-API v2.3
Geräte: 141 / Kanäle: 791 / Datenpunkte: 6080 / SysVars: 275 / Programme: 161 / Regadom IDs: 14010 / 48 CUxD-Kanäle in 3 CUxD-Geräten
Intel NUC i3-5010U @ 2,1 GHz mit 16 GB RAM & 512 GB SSD für Proxmox mit ioBroker VM und CCU-Historian/InfluxDB/Grafana VM
----------------------------------------------------------------------------------------
Projekte im Forum: HomeHub v4.1 / Fritzbox-Anruferliste für HomeHub
----------------------------------------------------------------------------------------

Benutzeravatar
GEVJan
Beiträge: 101
Registriert: 28.04.2021, 18:40
System: CCU und Access Point
Wohnort: Köln
Hat sich bedankt: 30 Mal
Danksagung erhalten: 16 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von GEVJan » 08.08.2021, 17:23

Hi Slice,

Freut mich, dass es klappt!

Gruß, Jan
CCU3 mit Raspberrymatic -> Eingebunden: HUE-Bridge, Tasmota-Sonoffs, Alexa, Open Weather Map, Tasker, LG-TV

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von MichaelN » 08.08.2021, 17:37

Die \0x0A\0x0A im log deuten stark auf einen ungeeigneten Editor hin.
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 +++

Slice
Beiträge: 1192
Registriert: 03.02.2016, 14:44
System: Alternative CCU (auf Basis OCCU)
Wohnort: irgendwo aus Süd BaWü
Hat sich bedankt: 135 Mal
Danksagung erhalten: 82 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von Slice » 08.08.2021, 18:30

MichaelN hat geschrieben:
08.08.2021, 17:37
Die \0x0A\0x0A im log deuten stark auf einen ungeeigneten Editor hin.
Die werden mir so im Syslog Server unter Windows angezeigt:
SyslogError.JPG
Ich bleibe dabei und befürchte das das Programm durch das editieren hinüber war.
GEVJan hat geschrieben:
08.08.2021, 17:23
Freut mich, dass es klappt!
Mich auch, danke nochmal dafür!

Grüße,
Slice
----------------------------------------------------------------------------------------
Raspi3B+ Bullseye mit HB-RF-ETH und RPI-RF-MOD auf piVCCU-FW 3.73.9 / Addons: CuxD v2.11 - E-Mail v1.7.6 - Patcher v1.0.0 - Philips Hue v3.2.5 - Programme drucken v2.6 - Scriptparser v1.11 - XML-API v2.3
Geräte: 141 / Kanäle: 791 / Datenpunkte: 6080 / SysVars: 275 / Programme: 161 / Regadom IDs: 14010 / 48 CUxD-Kanäle in 3 CUxD-Geräten
Intel NUC i3-5010U @ 2,1 GHz mit 16 GB RAM & 512 GB SSD für Proxmox mit ioBroker VM und CCU-Historian/InfluxDB/Grafana VM
----------------------------------------------------------------------------------------
Projekte im Forum: HomeHub v4.1 / Fritzbox-Anruferliste für HomeHub
----------------------------------------------------------------------------------------

Hans Hannsen
Beiträge: 12
Registriert: 22.08.2021, 16:18
System: CCU
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von Hans Hannsen » 22.08.2021, 16:34

Hallo, benötige Hilfe bei folgendem Problem. Würde gerne über ein Script die Summe der Leistung von 8 Messteckdosen in eine Variable schreiben. Kann mir da jemand helfen?

Benutzeravatar
GEVJan
Beiträge: 101
Registriert: 28.04.2021, 18:40
System: CCU und Access Point
Wohnort: Köln
Hat sich bedankt: 30 Mal
Danksagung erhalten: 16 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von GEVJan » 28.08.2021, 16:09

Hi, das müsste in etwa so gehen:

Code: Alles auswählen

real a = dom.GetObject("HmIP-RF.XXXXXXXXXXXXXX:6.POWER").State();
real b = usw;
<alle Steckdosen auflisten>
real Summe = a + b + usw.; !alle Steckdosen auflisten
dom.GetObject("Speichervariable").State(Summe);
Einfach alle Steckdosen eintragen, addieren und die SV zum speichern anlegen - fertig.
CCU3 mit Raspberrymatic -> Eingebunden: HUE-Bridge, Tasmota-Sonoffs, Alexa, Open Weather Map, Tasker, LG-TV

gso
Beiträge: 45
Registriert: 15.05.2015, 11:29
Hat sich bedankt: 1 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von gso » 31.01.2022, 15:22

Könnte man dieses Programm auch mehrmals für verschiedene Waschmaschinen bzw Trockner duplizieren und ausführen?

Gruss
GSO

cmjay
Beiträge: 2373
Registriert: 19.09.2012, 10:53
System: CCU
Wohnort: Jottweedee
Hat sich bedankt: 250 Mal
Danksagung erhalten: 348 Mal

Re: Script für Energiezähler und Jahresprognose - Verbrauch und Kosten

Beitrag von cmjay » 31.01.2022, 15:32

gso hat geschrieben:
31.01.2022, 15:22
Könnte man dieses Programm auch mehrmals für verschiedene Waschmaschinen bzw Trockner duplizieren und ausführen?
Wenn du entsprechende Systemvariablen anlegst und das Skript entsprechend anpasst ...
Es kann leider nicht ganz ausgeschlossen werden, dass ich mich irre.
HmIP muss leider draussen bleiben. in Ausnahmefällen erlaubt
ACHTUNG! Per Portweiterleitung aus dem Internet erreichbare CCU-WebUI ist unsicher! AUCH MIT PASSWORTSCHUTZ! Daher: Portweiterleitung deaktivieren!

Antworten

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