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

be.pe
Beiträge: 280
Registriert: 11.08.2019, 16:39

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

Beitrag von be.pe » 08.03.2023, 10:13

Hey danke funktioniert jetzt.

byfm
Beiträge: 36
Registriert: 14.11.2012, 21:45
Hat sich bedankt: 1 Mal

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

Beitrag von byfm » 24.03.2023, 17:50

GEVJan hat geschrieben:
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
Hallo,
ich kann machen, was ich will. Das Ding läuft einfach nicht bei mir. Fehler ist:

Mar 24 17:43:17 localhost local0.err ReGaHss: ERROR: ScriptRuntimeError: !Energiescript mit Prognose V3.2 !Individuelles Kürzel hier eintragen string type = "PV"; !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_10208_0001DD89A45F3C:6"); ! Installationsdatum dieses Skriptes var instdate = "01.03.2023"; !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

Ist mir unerklärlich. Ich habe mich strikt an die Anweisungen zu den Zeilen 3, 6 und 9 gehalten. Rest ist unbearbeitet übernommen. Das Programm weist bei mir leichte Formatierungsabweichungen auf, weiter unten die 4 eckiogen Klammern werden anders formatiert. Und ein paar Einrückungen. Aber das kann es doch nicht sein... Habe den Code aus dem Beitrag direkt in mein Skript übernommen und die entsprechenden Wert geändert.

Hat jemand eine Idee?

Besten Dank!

Balisto
Beiträge: 50
Registriert: 14.03.2016, 08:11
Hat sich bedankt: 10 Mal
Danksagung erhalten: 1 Mal

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

Beitrag von Balisto » 17.04.2023, 21:52

Script läuft super. Messe damit einen HmIP-PSM-2 für ein BKW.
Bekomme nur den Verbrauch heute nicht angezeigt.
Woran könnte das liegen?

be.pe
Beiträge: 280
Registriert: 11.08.2019, 16:39

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

Beitrag von be.pe » 20.05.2023, 12:36

Hey,
ich habe das Programm auch zur Zeit noch im Versuch.
Da ich nicht alle Werte bnötige, habe ich nur mal diese Systemvariablen angelegt:
B1.JPG
und gehofft das Programm befüllt es. Tut es leider nicht!
Kann das sein das alle Werte von einander abhängig sind
oder welchen Grund kann es noch haben.
Ich habe gestern den Trockner zweimal laufen lassen, leider hat sich
der Verbrauch heute nicht gefüllt!

djalexchrist
Beiträge: 1
Registriert: 02.06.2023, 07:18
System: CCU und Access Point

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

Beitrag von djalexchrist » 02.06.2023, 07:22

Guten Morgen

ich habe die SV und Script jetzt zum 3. mal installiert aber ich habe wohl noch einen Fehler.

Ich habe angeblich mit meinem 600W Balkonkraftwerk gestern 7033kWh und 1828,81€ Erzeugt.


Kann mir bitte jemand helfen :-D


Das ist der Script den ich eingefügt habe:

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

!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_1234_00000191919192939:6");

! Installationsdatum dieses Skriptes
var instdate = "30.05.2023";

!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());
Dateianhänge
Screenshot 2023-06-02 072038.jpg

NickHM
Beiträge: 3733
Registriert: 23.09.2017, 12:04
Hat sich bedankt: 66 Mal
Danksagung erhalten: 120 Mal

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

Beitrag von NickHM » 04.06.2023, 08:57

Hallo

das Programm nimmt offenbar den Zähler der WebUi, damit bei einem Reset im Gerät durch Spannungsunterbrechung nicht alles durcheinander kommt.
Hast Du vor der Installation des Scrips denn den Zähler in der WEbUi mit Reset mal auf 0,0 gestellt?
Wenn der auf 7000 steht und nach Installation des Scriptes der Referezwert von gestern 0,0 ist (weil das Script ja noch nie den tagesverbrauch berechnet hat) Dann ist der erste Verbrauch erst mal 7000. Ab dem zweiten Tag sollte es dann allerdings stimmen.

Gleiches problem tritt dann mit Monat und Jahr auf.

Also ein mal bei 0,0 in der WebUi anfangen.

wolf.heilbronn
Beiträge: 4
Registriert: 28.06.2023, 07:42
System: CCU

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

Beitrag von wolf.heilbronn » 01.07.2023, 18:04

Hallo,
auch ich versuche es schon seit Tagen dieses Skript für meine Klimaanlage zum laufen zu bringen. Ich habe alles so übernommen wie es die Herren freundlicherweise uns zu Verfügung gestellt haben. Die entsprechenden Zeilen abgeändert, Variablen 1zu1 angelegt und Programm geschrieben. Nix wird eingetragen! Immer noch Zählerstand Null usw.
Kann hier nochmals jemand drüberschauen? Ich finde dieses Skript einfach nur toll und möchte dass es endlich läuft.
Noch ne Info! Der Energiezähler CCU lässt sich auch nicht resetten, er zählt nicht und die versteckte Variable bzw. Programm ist auch nicht aufzufinden. Liegt hier der Hund begraben?

Code: Alles auswählen

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

!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_12522_MEQ0269871:2");

! Installationsdatum dieses Skriptes
var instdate = "28.06.2023";

!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
Ich würde mich freuen wenn jemand den Fehler findet.
Danke und Lg
Dateianhänge
WebUi.PNG
Variablen1.PNG
Variablen.PNG
Programm.PNG
Zuletzt geändert von Roland M. am 01.07.2023, 18:27, insgesamt 2-mal geändert.
Grund: Code-Tags eingefügt

Benutzeravatar
Roland M.
Beiträge: 9778
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 252 Mal
Danksagung erhalten: 1369 Mal

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

Beitrag von Roland M. » 01.07.2023, 18:29

Hallo und willkommen im Forum!
wolf.heilbronn hat geschrieben:
01.07.2023, 18:04

Code: Alles auswählen

[...]
WriteLine(m.Value());
WriteLine(o.Value());
WriteLine(p.Value());
WriteLine
Ich würde mich freuen wenn jemand den Fehler findet.
Wenn es nicht nur ein Fehler beim Kopiern ins Forum war, dann fehlt in der letzten Zeile so einiges... ;)


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
  • Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
  • Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
  • Fehlermeldungen genau abschreiben, besser noch...
  • Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!

-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...

wolf.heilbronn
Beiträge: 4
Registriert: 28.06.2023, 07:42
System: CCU

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

Beitrag von wolf.heilbronn » 01.07.2023, 19:01

Hallo Roland,
danke für die Aufnahme.
Ja da fehlt wirklich was. Ist beim Kopieren wohl verrutscht.

WriteLine(o.Value());
WriteLine(p.Value());
WriteLine(q.Value());
Mit diesem endet das Skript. Trotzdem will es nicht funktionieren.

Benutzeravatar
Baxxy
Beiträge: 10766
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 602 Mal
Danksagung erhalten: 2201 Mal

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

Beitrag von Baxxy » 02.07.2023, 11:55

wolf.heilbronn hat geschrieben:
01.07.2023, 18:04
Der Energiezähler CCU lässt sich auch nicht resetten, er zählt nicht und die versteckte Variable bzw. Programm ist auch nicht aufzufinden. Liegt hier der Hund begraben?
Sieht so aus.
Das Script hier nutzt diese interne Systemvariable als Datenquelle. Wenn die nicht vorhanden ist oder nicht funktioniert dann kann auch das Script nicht arbeiten.

Antworten

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