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:
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);
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());
Zum Schluss noch ein Programm anlegen das wie folgt aussieht:
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
Über Feedback und Verbesserungsvorschläge würde ich mich freuen!
Gruß, Jan