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 = 1;
real vFaktor = 1;
}
! * Wenn der Wasser- oder Gartensensor aufgerufen hat, dann müssen wir die entsprechende
! * Variable für "XXX Verbrauch heute l" laden
if ( 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 == ( "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_neu" )
{
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 == ( "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="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 == ( "Garten") )
{
oVerbrauch_heute_l.State(0);
}
}
}
}
}
}