Vielen Dank!!
Dann bin ich gespannt was ich morgen lesen kann Bzw. jetzt schon...
Muss ich dann auch nochmal den aktuellen Zählerstand einlesen?
Moderator: Co-Administratoren
Vielen Dank!!
Das kann man so nicht pauschal sagen. Selbst nutze ich das seit vielen vielen Jahren so das ich dem "Hauptkanal" eines Gerätes den gleichen Namen gebe wie dem Gerät selbst. Funktioniert bisher tadellos, ist aber natürlich auch davon abhängig ob und wie man eventl. Skriptbefehle dann aufruft!
Code: Alles auswählen
! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016-2018 Jens Maus <mail@jens-maus.de>
!
! 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();
! Nun extrahieren wir den Zaehlertyp (Gartenwasser, Gas, Wasser, Strom, Strom_HZG, Strom_Bezug)
! 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 c = sysvar.Get(type # " Referenz Zaehlerstand");
object d = sysvar.Get(type # " Zaehlerstand");
object e = sysvar.Get(type # " Verbrauch aktuell");
object f = sysvar.Get(type # " Referenz Ablesung");
object g = sysvar.Get(type # " Verbrauch letzte Ablesung");
object h = sysvar.Get(type # " Referenz heute");
object i = sysvar.Get(type # " Verbrauch heute");
object j = sysvar.Get(type # " Referenz Woche");
object k = sysvar.Get(type # " Verbrauch Woche");
object l = sysvar.Get(type # " Referenz Monat");
object m = sysvar.Get(type # " Verbrauch Monat");
object n = sysvar.Get(type # " Referenz Kalenderjahr");
object o = sysvar.Get(type # " Verbrauch Kalenderjahr");
! Nun schauen wir ob der Zaehler uebergelaufen ist (diffValue < 0) weil
! die Zaehlervariablen des HM-ES-TX-WM gerade beim Stromzaehler regelmaessig
! ueberlaufen.
real diffValue = curValue - lastValue;
if(diffValue < 0.0)
{
! Der Zaehler scheint uebergelaufen zu sein -> ValueMax hinzuaddieren
diffValue = diffValue + counter.ValueMax();
! "Referenz Zaehlerstand" dann um ValueMax erhoehen. Beim Stromzaehler
! muss aber erst das ganze noch in Watt umgerechnet werden.
real a = c.Value().ToFloat().ToString(3);
if(counter.HssType() != "GAS_ENERGY_COUNTER")
{
a = a * 1000.0;
a = a + counter.ValueMax();
c.State(a / 1000.0);
}
else
{
c.State(a + counter.ValueMax());
}
}
! Wenn dies ein Stromzaehler ist muessen wir die Werte von
! Watt zu Kilowatt konvertieren
if(counter.HssType() != "GAS_ENERGY_COUNTER")
{
diffValue = diffValue / 1000.0;
curValue = curValue / 1000.0;
}
! Aktuellen Verbrauch berechnen
if(diffTime > 0) { e.State(3600.0 * diffValue / diffTime); }
! Aktuellen Zaehlerstand berechnen
d.State(c.Value() + curValue);
! Nun alle Systemvariablen die fuer die Berechnung/Darstellung
! des Verbrauches da sind neu berechnen.
g.State(d.Value() - f.Value());
if(h.Value() != 0) { i.State(d.Value() - h.Value()); }
else { i.State(d.Value() - c.Value()); }
if(j.Value() != 0) { k.State(d.Value() - j.Value()); }
else { k.State(d.Value() - c.Value()); }
if(l.Value() != 0) { m.State(d.Value() - l.Value()); }
else { m.State(d.State() - c.State()); }
if(n.Value() != 0) { o.State(d.Value() - n.Value()); }
else { o.State(d.Value() - c.Value()); }
! 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)
{
oSysVarEnergyCounter.State((d.Value() - f.Value()) * 1000.0);
}
}
else
{
object oSysVarEnergyCounter = sysvar.Get("svEnergyCounterGas_" # channel.ID() # "_" # channel.Address());
if(oSysVarEnergyCounter)
{
oSysVarEnergyCounter.State(d.Value() - f.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:00
! 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:00")
{
string a="Strom_Bezug,Gartenwasser,Gas,Strom,Strom_HZG,Wasser";
string b;
object c;
object d;
object e;
object f;
! Nun ueber alle Hauszaehler iterieren
foreach(b, a.Split(","))
{
! momentaner Zaehlerstand
c = sysvar.Get(b # " Zaehlerstand");
if(c)
{
! Nach Wochenanfang pruefen
if(system.Date("%a") == "Mon")
{
d = sysvar.Get(b # " Referenz Woche");
e = sysvar.Get(b # " Verbrauch Woche");
f = sysvar.Get(b # " Verbrauch letzte Woche");
! Verbrauch der letzten Woche speichern
f.State(e.Value());
! Referenzwert der Woche speichern
d.State(c.Value());
! Wochenverbrauch auf 0 setzen
e.State(0);
}
! Nach Monatsanfang pruefen
if(system.Date("%d") == "01")
{
d = sysvar.Get(b # " Referenz Monat");
e = sysvar.Get(b # " Verbrauch Monat");
f = sysvar.Get(b # " Verbrauch letzter Monat");
! Verbrauch des letzten Monats speichern
f.State(e.Value());
! Referenzwert des Monats speichern
d.State(c.Value());
! Monatsverbrauch auf 0 setzen
e.State(0);
! Nach Jahresanfang pruefen
if(system.Date("%m") == "01")
{
d = sysvar.Get(b # " Referenz Kalenderjahr");
e = sysvar.Get(b # " Verbrauch Kalenderjahr");
f = sysvar.Get(b # " Verbrauch letztes Kalenderjahr");
! Verbrauch des letzten Kalenderjahr speichern
f.State(e.Value());
! Referenzwert des Kalenderjahr speichern
d.State(c.Value());
! Jahresverbrauch auf 0 setzen
e.State(0);
}
}
! aktueller Tagesverbrauch speichern
d = sysvar.Get(b # " Referenz heute");
e = sysvar.Get(b # " Verbrauch heute");
f = sysvar.Get(b # " Verbrauch gestern");
! Verbrauch der letzten Woche speichern
f.State(e.Value());
! Referenzwert der Woche speichern
d.State(c.Value());
! Tagesverbrauch auf 0 setzen
e.State(0);
}
}
}
}
}
Eine mögliche Ursache ...Suenzihome hat geschrieben: ↑04.11.2022, 01:04
Aber immer wieder haut es mir gewaltige Minuswerte in die Zählerstände aber auch in ungewöhnlichen Abständen mal funktioniert es ein halbes Jahr dann wieder nur 2 Monate.
Meinst du damit den Zähler der raspberrymatic? So wie es aussieht war der auf 0 den der ist identisch mit dem errechneten Strom Zählerstand.Wenn der Fehler auftritt, schau dir mal den Stand des internen Zählers an. Der springt entweder auf Null, wenn ein bestimmter Stand erreicht ist, was das Programm dann eigentlich abfängt.
Also die Spannungsversorgung vom HM-ES-TX-WM ist nicht zusammen gebrochen.Oder der springt auf Null, wenn die Spannungsversorgung unterbrochen wurde. In dem Fall funktioniert die Kompensation im Programm nicht, weil der Zählerstand vor dem Neustart nicht bekannt ist.
Wenn es der "normale" Überlauf ist, wird das im Programm kompensiert. Da dürfte es keinen Fehler geben.
Code: Alles auswählen
! Nun schauen wir ob der Zaehler uebergelaufen ist (diffValue < 0) weil
! die Zaehlervariablen des HM-ES-TX-WM gerade beim Stromzaehler regelmaessig
! ueberlaufen.
real diffValue = curValue - lastValue;
if(diffValue < 0.0)
{
! Der Zaehler scheint uebergelaufen zu sein -> ValueMax hinzuaddieren
diffValue = diffValue + counter.ValueMax();
! "Referenz Zaehlerstand" dann um ValueMax erhoehen. Beim Stromzaehler
! muss aber erst das ganze noch in Watt umgerechnet werden.
real a = c.Value();
if(counter.HssType() != "GAS_ENERGY_COUNTER")
{
a = a * 1000.0;
a = a + counter.ValueMax();
c.State(a / 1000.0);
}
else
{
c.State(a + counter.ValueMax());
}
}