Moin Ich habe dieses Script schon ein paar Tage am laufen, doch die auswertung passt bei mir überhaut nicht (siehe Bild)
Ich habe noch nicht mein Zähler PIN um den momentanen Verbrauch abzufragen, ich kann nur den Zählerstand auslesen. Könnte dies das Problem sein ?
Wie auf dem Bild zuerkennen ist, sind die Werte für Gestern, Woche usw. falsch bzw. deutlich zu wenig.
Das Programm schaut so aus
Dies ist mein Script
Code: Alles auswählen
! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
! Adaptiert Michael Hansen, 01/2021, V1.0; neue Kommentare sind mit ! * gekennzeichnet
! * V1.1 - Abfrage eingefügt, ob sich das Inkrement geändert hat. Nur dann wird gerechnet
! * Fehler in der Berechnung des aktuellen Verbrauchs beseitigt
! * V1.2 - Änderung, dass in den CCU internen Energiezähler der Verbrauch seit der letzten
! * Ablesung geschrieben wird (wie beim Originalskript von Jens)#
! * V1.3 - Zurücksetzen des täglichen Wasserverbrauchs in l ist ergänzt
! Version 1.4 (01.01.2018)
! Nun schauen wir wer uns aufgerufen hat (Device-Channel oder Timer) und welches Device
! es genau war (Nutzung der $src$ Variable) und danach entscheiden wir was wir
! zu tun haben.
object counter = dom.GetObject("$src$");
if(counter)
{
object sysvar = dom.GetObject(ID_SYSTEM_VARIABLES);
! Wenn TypeName vom Typ HSSDP ist dann wurde das Program durch ein Event
! eines Devices erzeugt, ansonsten durch ein CALENDARDP welches der
! Ausfuehrung durch das Zeitmodul entspricht
if(counter.TypeName() == "HSSDP")
{
! Nun holen wir unmittelbar am anfang alle counter relevanten Daten ab
! und speichern sie fuer spaeter zwischen und berechnen auch gleich
! noch differenzwerte
integer diffTime = counter.Timestamp().ToInteger() - counter.LastTimestamp().ToInteger();
real curValue = counter.Value();
real lastValue = counter.LastValue();
real vVeraenderung_Zaehlerstand = ( curValue - lastValue );
! * Wir prüfen, ob es überhaupt einen Energieverbrauch gegeben hat und nur dann geht es in die
! * Berechnungen
if (vVeraenderung_Zaehlerstand <> 0)
{
! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom) -> hier muss Garten erweitert werden
! aus dem Namen des Channel. Ein Device muss also immer mit "XXXXX-Gas"
! bzw. "XXXXXX-Wasser", etc. enden.
object channel = dom.GetObject(counter.Channel());
string type = channel.Name().StrValueByIndex("-",1);
! Nun holen wir alle notwendigen Systemvariablen zum Lesen und Speichern
! unserer verschiedenen Zaehlerwerte
object oAktueller_Zaehlerstand = sysvar.Get(type # " aktueller Zaehlerstand");
! * oZaehlerstand_Messgeraet_Log benötigt man nur für die Inkrementberechnung mit
! * interner Variable
object oZaehlerstand_Messgeraet_Log = sysvar.Get(type # " Zaehlerstand Messgeraet Log");
object oVerbrauch_Aktuell = sysvar.Get(type # " Verbrauch aktuell");
object oVerbrauch_Ablesung = sysvar.Get(type # " Verbrauch Ablesung");
object oLetzte_Ablesung = sysvar.Get(type # " Zaehlerstand letzte Ablesung");
object oZaehlerstand_gestern = sysvar.Get(type # " Zaehlerstand gestern");
object oVerbrauch_heute = sysvar.Get(type # " Verbrauch heute");
object oZaehlerstand_letzte_Woche = sysvar.Get(type # " Zaehlerstand letzte Woche");
object oVerbrauch_Woche = sysvar.Get(type # " Verbrauch Woche");
object oZaehlerstand_letzter_Monat = sysvar.Get(type # " Zaehlerstand letzter Monat");
object oVerbrauch_Monat = sysvar.Get(type # " Verbrauch Monat");
object oZaehlerstand_letztes_Jahr = sysvar.Get(type # " Zaehlerstand letztes Jahr");
object oVerbrauch_Jahr = sysvar.Get(type # " Verbrauch Jahr");
! * vUmrechnungsfaktor wird später nur geändert, wenn es der Stromzähler war (Wh vs. kWh)
real vUmrechnungsfaktor = 1.0;
! * vFaktor_l Für die Umrechnung von m3 in l für den Tagesverbrauch Wasser.
! * Falls Gas oder Strom, dann wird der Wert auf 1 gesetzt
real vFaktor_l = 1000.0;
! * Wenn der Gassensor aufgerufen hat, dann müssen wir die die Variable "Gas Verbrauch Jahr kWh"
! * für Gas laden
if ( type == ( "Gas" ) )
{
object oVerbrauch_Jahr_kWh = sysvar.Get(type # " Verbrauch Jahr kWh");
! * Damit wir die kWh berechnen können, werden die Faktoren für die Umrechnung bei Gas
! * m3 -> kWh benötigt
real vZustandszahl = 0.9639;
real vFaktor = 10.039;
}
! * Wenn der Wasser- oder Gartensensor aufgerufen hat, dann müssen wir die entsprechende
! * Variable für "XXX Verbrauch heute l" laden
if ( (type == "Wasser") || (type == "Garten"))
{
object oVerbrauch_heute_l = sysvar.Get(type # " Verbrauch heute l");
}
! Jetzt machen wir die Inkrementberechnung
! * Wenn die Variable "XXX Zaehlerstand Messgeraet Log" noch nicht gesetzt wurde (= 0), dann
! * wird der letzte Zaehlerstand des Messgerätes verwendet
if ( oZaehlerstand_Messgeraet_Log.Value() == 0 )
{
oZaehlerstand_Messgeraet_Log.State(lastValue);
}
real vInkrement_Geraetezaehler = ( curValue - oZaehlerstand_Messgeraet_Log.Value() );
! * Der Faktor wird für den aktuellen Verbrauch benötigt, da der bei Wasser nur als Angabe in
! * l Sinn macht
if ( (type == "Wasser") || (type == "Garten"))
{
vFaktor_l = 1000.0;
}
else
{
vFaktor_l = 1.0;
}
! Jetzt wird das Inkrement zum letzten Zaehlerstand berechnet
! * Dabei muss der Umrechnungsfaktor für die Wasserzaehlung identifiziert und gesetzt werden
! * Strom und Gas benötigen keine Umrechnung (Wasser = l; Strom = kWh; Gas = m3).
! * vUmrechnungsfaktor wird für den Fall des Batteriewechsels bzw. Zählerüberlaufs benötigt
! * (auch noch später)
if ( type == "Strom" )
{
vUmrechnungsfaktor = 1000.0;
vInkrement_Geraetezaehler = vInkrement_Geraetezaehler / vUmrechnungsfaktor;
}
! Aktuellen Verbrauch berechnen
if(diffTime > 0)
{
oVerbrauch_Aktuell.State(3600.0 * vFaktor_l * vInkrement_Geraetezaehler * vUmrechnungsfaktor / diffTime);
}
! Aktuellen Zaehlerstand berechnen
if (vInkrement_Geraetezaehler < 0)
{
! * Wenn Batteriewechsel, dann direkt den Zaehlerstand des Gerätes addieren
oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + curValue / vUmrechnungsfaktor));
}
else
{
! * Wenn kein Batteriewechsel stattgefunden hat, dann das Inkrement addieren
oAktueller_Zaehlerstand.State( (oAktueller_Zaehlerstand.Value() + vInkrement_Geraetezaehler ));
}
! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
! des Verbrauches da sind neu berechnen.
oVerbrauch_heute.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_gestern.Value()) );
oVerbrauch_Woche.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzte_Woche.Value()) );
oVerbrauch_Monat.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letzter_Monat.Value()) );
oVerbrauch_Jahr.State( ( oAktueller_Zaehlerstand.Value() - oZaehlerstand_letztes_Jahr.Value()) );
oVerbrauch_Ablesung.State( ( oAktueller_Zaehlerstand.Value() - oLetzte_Ablesung.Value()) );
! * Wenn es der Wasser- oder Gartewasserzähler ist, dann berechnen wir noch den Tagesverbrauch
! * in l
if (( type == "Wasser") || ( type == "Garten"))
{
oVerbrauch_heute_l.State(oVerbrauch_heute.Value() * vFaktor_l);
}
! * Wenn es der Gaszähler ist, dann berechnen wir den Jahresverbrauch für Gas in kWh
if (type == "Gas" )
{
oVerbrauch_Jahr_kWh.State( (oVerbrauch_Jahr.Value() * vZustandszahl * vFaktor) );
}
! * Jetzt schreiben wir den aktuellen Zaehlerstand des Sensors in unsere Log Variable
oZaehlerstand_Messgeraet_Log.State(curValue);
! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
! dem Wert der letzten Ablesung
if(counter.HssType() != "GAS_ENERGY_COUNTER")
{
object oSysVarEnergyCounter = sysvar.Get("svEnergyCounter_" # channel.ID() # "_" # channel.Address());
if(oSysVarEnergyCounter)
{
! * Aktueller Zaehlerstand ist kWh. Die Variable erwartet Wh und rechnet dies dann ggf. in der Anzeige
! * selbst in kWh um
oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() * 1000 );
}
}
else
{
object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
if(oSysVarEnergyCounter)
{
oSysVarEnergyCounter.State(oVerbrauch_Ablesung.Value() );
}
}
! Die aktuelle Zeit in eine separate Systemvariable schreiben
! damit man direkt sehen kann wann die Zaehelrstaende das letzte
! mal aktualisiert wurden.
sysvar.Get(type # " Aktualisierung").State(system.Date("%F %X"));
}
}
else
{
! Tageszaehleraktualisierung fuer alle Hausanschluss-Zaehler
! Hier wird mittels eines Timers der taeglich immer genau um 00:01
! dieses Programm ausfuehrt die Systemvariablen aktualisiert die
! die Tages/Wochen/Monat/Jahreswerte beinhalten.
! Nur weitermachen wenn es wirklich Mitternacht ist
if(system.Date("%H:%M") == "00:01")
{
string a="Gas,Strom,Wasser,Garten";
string b;
object oAktueller_Zaehlerstand;
object oZaehlerstand_letzte_Woche;
object oVerbrauch_Woche;
object oVerbrauch_letzte_Woche;
object oZaehlerstand_letzter_Monat;
object oVerbrauch_Monat;
object oVerbrauch_letzter_Monat;
object oZaehlerstand_letztes_Jahr;
object oVerbrauch_Jahr;
object oVerbrauch_letztes_Jahr;
object oZaehlerstand_gestern;
object oVerbrauch_heute;
object oVerbrauch_gestern;
! Nun ueber alle Hauszaehler iterieren
foreach(b, a.Split(","))
{
! momentaner Zaehlerstand
oAktueller_Zaehlerstand = sysvar.Get(b # " aktueller Zaehlerstand");
if(oAktueller_Zaehlerstand)
{
! Nach Wochenanfang pruefen
if(system.Date("%a") == "Mon")
{
oZaehlerstand_letzte_Woche = sysvar.Get(b # " Zaehlerstand letzte Woche");
oVerbrauch_Woche = sysvar.Get(b # " Verbrauch Woche");
oVerbrauch_letzte_Woche = sysvar.Get(b # " Verbrauch letzte Woche");
! Verbrauch der letzten Woche speichern
oVerbrauch_letzte_Woche.State( oVerbrauch_Woche.Value() );
! Referenzwert der Woche speichern
oZaehlerstand_letzte_Woche.State( oAktueller_Zaehlerstand.Value() );
! Wochenverbrauch auf 0 setzen
oVerbrauch_Woche.State(0);
}
! Nach Monatsanfang pruefen
if(system.Date("%d") == "01")
{
oZaehlerstand_letzter_Monat = sysvar.Get(b # " Zaehlerstand letzter Monat");
oVerbrauch_Monat = sysvar.Get(b # " Verbrauch Monat");
oVerbrauch_letzter_Monat = sysvar.Get(b # " Verbrauch letzter Monat");
! Verbrauch des letzten Monats speichern
oVerbrauch_letzter_Monat.State( oVerbrauch_Monat.Value() );
! Referenzwert des Monats speichern
oZaehlerstand_letzter_Monat.State( oAktueller_Zaehlerstand.Value() );
! Monatsverbrauch auf 0 setzen
oVerbrauch_Monat.State(0);
! Nach Jahresanfang pruefen
if(system.Date("%m") == "01")
{
oZaehlerstand_letztes_Jahr = sysvar.Get(b # " Zaehlerstand letztes Jahr");
oVerbrauch_Jahr = sysvar.Get(b # " Verbrauch Jahr");
oVerbrauch_letztes_Jahr = sysvar.Get(b # " Verbrauch letztes Jahr");
! Verbrauch des letzten Kalenderjahr speichern
oVerbrauch_letztes_Jahr.State( oVerbrauch_Jahr.Value() );
! Referenzwert des Kalenderjahr speichern
oZaehlerstand_letztes_Jahr.State( oAktueller_Zaehlerstand.Value() );
! Jahresverbrauch auf 0 setzen
oVerbrauch_Jahr.State(0);
}
}
! aktueller Tagesverbrauch speichern
oZaehlerstand_gestern = sysvar.Get(b # " Zaehlerstand gestern");
oVerbrauch_heute = sysvar.Get(b # " Verbrauch heute");
oVerbrauch_gestern = sysvar.Get(b # " Verbrauch gestern");
oVerbrauch_heute_l = sysvar.Get(b # " Verbrauch heute l");
! Verbrauch gestern speichern
oVerbrauch_gestern.State(oVerbrauch_heute.Value());
! Referenzwert des Tages speichern
oZaehlerstand_gestern.State(oAktueller_Zaehlerstand.Value());
! Tagesverbrauch auf 0 setzen
oVerbrauch_heute.State(0);
if (( b == "Wasser") || ( b == "Garten"))
{
oVerbrauch_heute_l.State(0);
}
}
}
}
}
}
Mein Zähler ist ein ISKRA MT175.
Habe ich irgendetwas übersehen ?