da offenbar Bedarf nach einem detaillierten Tutorial für einen Öldurchflusszähler besteht möchte ich mein Projekt hier zusammenfassen und vorstellen.
Zunächst einmal vielen Dank an alle, die mir mit Rat und Tat beiseite gestanden haben!
Materialien:
1 x HM-ES-TX-WM Energiezähler
1 x RJ12-Anschlussstecker nebst Kabel
1 x 110kOhm Widerstand
1 x Installationsdose
1 x Ölzähler HZ 5DR
Zunächst zur Vorüberlegung:
Der Ölzähler liefert einen stetigen Impuls bei Durchfluss über den Reed-Kontakt. diesen greife ich mit dem Energiezähler ab und werte ihn aus.
Verbindung Ölzähler - Energiezähler
Hierbei hat mir dieser Post mit dem dazugehörigen Link geholfen. Die Kabel werden in der Installationsdose wie beschrieben verbunden und der Widerstand entsprechend eingelötet.
viewtopic.php?f=27&t=34344#p326297
Auswertung in der CCU:
Als Grundlage dient das Skript zur universellen Zählerstandberechnung von jMaus (viewtopic.php?f=27&t=31353). Dieses habe ich um die Variable Oel ergänzt. Jede angegebene Variable ist um die Präfix Oel ergänzt und auch im Skript angepasst.
Code: Alles auswählen
! Universelle Zaehlerstandberechnung fuer HM-ES-TX-WM
!
! Copyright (c) 2016 Jens Maus <mail@jens-maus.de>
!
! Version 1.1 (08.11.2016)
! Nun schauen wir wer uns aufgerufen hat (Device 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)
{
! 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();
! Wenn device NULL ist war die Ausloesung des Scripts durch den Timer verursacht
! wenn nicht dann durch ein echtes device.
object device = dom.GetObject(counter.Device());
if(device)
{
! Nun extrahieren wir den Zaehlertyp (Gas, Wasser, Strom)
! aus dem Namen des Devices. Ein Device muss also immer mit "XXXXX-Gas"
! bzw. "XXXXXX-Wasser", etc. enden.
string type = device.Name().StrValueByIndex("-",1);
! Nun holen wir alle notwendigen Systemvariablen zum Lesen und Speichern
! unserer verschiedenen Zaehlerwerte
object c = dom.GetObject(type # " Referenz Zaehlerstand");
object d = dom.GetObject(type # " Zaehlerstand");
object e = dom.GetObject(type # " Verbrauch aktuell");
object f = dom.GetObject(type # " Referenz Ablesung");
object g = dom.GetObject(type # " Verbrauch letzte Ablesung");
object h = dom.GetObject(type # " Referenz heute");
object i = dom.GetObject(type # " Verbrauch heute");
object j = dom.GetObject(type # " Referenz Woche");
object k = dom.GetObject(type # " Verbrauch Woche");
object l = dom.GetObject(type # " Referenz Monat");
object m = dom.GetObject(type # " Verbrauch Monat");
object n = dom.GetObject(type # " Referenz Kalenderjahr");
object o = dom.GetObject(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.State();
if(type == "Strom")
{
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(type == "Strom")
{
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.State() + curValue);
! Nun alle Systemvariablen die für die Berechnung/Darstellung
! des Verbrauches da sind neu berechnen.
g.State(d.State() - f.State());
if(h.State() != 0) { i.State(d.State() - h.State()); }
else { i.State(d.State() - c.State()); }
if(j.State() != 0) { k.State(d.State() - j.State()); }
else { k.State(d.State() - c.State()); }
if(l.State() != 0) { m.State(d.State() - l.State()); }
else { m.State(d.State() - c.State()); }
if(n.State() != 0) { o.State(d.State() - n.State()); }
else { o.State(d.State() - c.State()); }
! Wir aktualisieren auch noch den CCU internen Energiezaehler mit
! dem Wert der letzten Ablesung
if(type == "Strom")
{
object oSysVarEnergyCounter = dom.GetObject("svEnergyCounter_" # counter.Device() # "_" # device.Address());
if(oSysVarEnergyCounter)
{
oSysVarEnergyCounter.State((d.State() - f.State()) * 1000.0);
}
}
else
{
object oSysVarEnergyCounter = dom.GetObject("svEnergyCounterGas_" # counter.Device() # "_" # device.Address());
if(oSysVarEnergyCounter)
{
oSysVarEnergyCounter.State(d.State() - f.State());
}
}
! Die aktuelle Zeit in eine separate Systemvariable schreiben
! damit man direkt sehen kann wann die Zaehelrstaende das letzte
! mal aktualisiert wurden.
dom.GetObject(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="Gas,Strom,Wasser,Oel";
string b;
object c;
object d;
object e;
object f;
! Nun ueber alle Hauszaehler iterieren
foreach(b, a.Split(","))
{
! momentaner Zaehlerstand
c = dom.GetObject(b # " Zaehlerstand");
! Nach Wochenanfang pruefen
if(system.Date("%a") == "Mon")
{
d = dom.GetObject(b # " Referenz Woche");
e = dom.GetObject(b # " Verbrauch Woche");
f = dom.GetObject(b # " Verbrauch letzte Woche");
! Verbrauch der letzten Woche speichern
f.State(e.State());
! Referenzwert der Woche speichern
d.State(c.State());
! Wochenverbrauch auf 0 setzen
e.State(0);
}
! Nach Monatsanfang pruefen
if(system.Date("%d") == "01")
{
d = dom.GetObject(b # " Referenz Monat");
e = dom.GetObject(b # " Verbrauch Monat");
f = dom.GetObject(b # " Verbrauch letzter Monat");
! Verbrauch des letzten Monats speichern
f.State(e.State());
! Referenzwert des Monats speichern
d.State(c.State());
! Monatsverbrauch auf 0 setzen
e.State(0);
! Nach Jahresanfang pruefen
if(system.Date("%m") == "01")
{
d = dom.GetObject(b # " Referenz Kalenderjahr");
e = dom.GetObject(b # " Verbrauch Kalenderjahr");
f = dom.GetObject(b # " Verbrauch letztes Kalenderjahr");
! Verbrauch des letzten Kalenderjahr speichern
f.State(e.State());
! Referenzwert des Kalenderjahr speichern
d.State(c.State());
! Jahresverbrauch auf 0 setzen
e.State(0);
}
}
! aktueller Tagesverbrauch speichern
d = dom.GetObject(b # " Referenz heute");
e = dom.GetObject(b # " Verbrauch heute");
f = dom.GetObject(b # " Verbrauch gestern");
! Verbrauch der letzten Woche speichern
f.State(e.State());
! Referenzwert der Woche speichern
d.State(c.State());
! Tagesverbrauch auf 0 setzen
e.State(0);
}
}
}
}