HomeMatic – Stromzähler auswerten Version 2 mit HM-ES-TX-WM – Bugfix 2 „Zählerüberlauf“

Workaround für das „Überlaufphänomen des HM-ES-TX-WM“ (vor 31.01.2016)


Das nachfolgende Vorgehen ist nur für Nutzer von Bedeutung, die das Auswerteskript aus diesem Tutorial bereits vor dem 31.01.2016 eingesetzt und zwischenzeitlich noch nicht angepasst haben!

Hintergrund

Aufgrund der technischen Eigenschaften des HM-ES-TX-WM (es wird intern nur ein 23 Bit-Zähler verwendet) läuft der Datenpunkt…


Energie-Zähler Gerät [ENERGY_COUNTER]

…des HM-ES-TX-WM bei Erreichen von 838860,7 Wh über und beginnt wieder bei NULL. Dies führt dazu, dass nach diesem Überlauf falsche negative Werte in den einzelnen Zählern angezeigt werden (siehe auch hier).

Vermieden wird dies nur durch eine vorzeitige Batterieentnahme, bei der der Datenpunkt wieder auf NULL zurück gesetzt wird und der Zähler von vorne beginnt.

Zur Korrektur kann z.B. die Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

…um eben diese 838,8607 kWh erhöht werden, sobald erkannt wird, dass der Wert im Datenpunkt „ENERGY_COUNTER“ kleiner ist als zuvor.

Lösung

Zunächst ist eine zusätzliche Systemvariable…


„Strom ENERGY_COUNTER“, Zahl

…anzulegen und als deren Maximalwert 999999.99 einzugeben…

SysVar

Anschließend ist das alte Auswerteskript durch die folgende Version zu ersetzen…

object oP = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.POWER");
object oE = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER");
var aC = dom.GetObject("Strom ENERGY_COUNTER");
var zR = dom.GetObject("Strom Referenz Zaehlerstand");
var zA = dom.GetObject("Strom Zaehlerstand");
var aA = dom.GetObject("Strom Leistungsaufnahme aktuell");
var vLz = dom.GetObject("Strom Referenz Verbrauch seit letzter Ablesung");
var vLg = dom.GetObject("Strom Verbrauch seit letzter Ablesung");
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	if ((oE.State() + 0.001) < aC.State()) {
	zR.State(zR.State() + 838.8607);
	}
aC.State(oE.State());
zA.State(zR.State() + (oE.State()/1000));
aA.State(oP.State());
vLg.State(zA.State() - vLz.State());
vTg.State(zA.State() - vTz.State());
vWg.State(zA.State() - vWz.State());
vMg.State(zA.State() - vMz.State());
vJg.State(zA.State() - vJz.State());

Das ist schon alles.

Zur Erläuterung:

Mit dem neuen Kodeschnipsel wird der Datenpunkt „ENERGY_COUNTER“ zwischengespeichert und mit dem aktuell ausgelesenen Wert verglichen.

object oE = dom.GetObject("BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER");
var aC = dom.GetObject("Strom ENERGY_COUNTER");
var zR = dom.GetObject("Strom Referenz Zaehlerstand");
	if ((oE.State() + 0.001) < aC.State()) {
	zR.State(zR.State() + 838.8607);
	}
aC.State(oE.State());

Sobald erkannt wird, dass der aktuelle Wert kleiner als der zwischengespeicherte Wert ist, werden zu der Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

838,8607 kWh addiert, wodurch die Zähler trotz Überlauf korrekt weitergeführt werden.

Wie sich gezeigt hat, wird der Datenpunkt „ENERGY_COUNTER“ jedoch nicht immer zwingend zusammen mit der Aktualisierung des Datenpunktes „POWER“ aktualisiert, weswegen es – wie in der Aufzeichnung um 09:05:21 ersichtlich – vorkommen kann, dass mehrmals die gleichen Werte für „ENERGY_COUNTER“ übertragen werden…

Fehler 3

Durch die Addition von 0.001 Wh auf den vom Datenpunkt „ENERGY_COUNTER“ ausgelesenen Wert wird vermieden, dass der Korrekturwert aufsummiert wird, wenn der übermittelte Wert gleich geblieben ist.

Ich habe hier selbst nicht nachvollzogen, ob das Phänomen beim Triggern auf den Datenpunkt „ENERGY_COUNTER“ an Stelle von „POWER“ nicht mehr auftritt, wer mag kann das ja zusätzlich ausprobieren.

Falls der „Batteriewechsel-Bug“ noch nicht korrigiert wurde, bitte daran denken, dass bei Verwendung dieses Skriptes zusätzlich einiges anzupassen ist.


Hinweis:

Bei einem Batteriewechsel sollte das Eintragen des aktuellen Zählerstandes von dem (Ferraris-)Zähler in die Referenz-Systemvariable…


„Strom Referenz Zaehlerstand“, Zahl

…erst nach der ersten Aktualisierung des HM-ES-TX-WM erfolgen, da ansonsten möglicherweise unbeabsichtigt gleich zu Beginn die 838,8607 kWh aufaddiert werden.

 

Bitte beachten...

Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung.
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN by sTeRn AV | smart-wohnen.org
  1. Mit nochmal einem Moment nachdenken, liegt die Ursache auf der Hand 😉 .

    Warum auch immer, wurde der Wert des Datenpunktes „ENERGY_COUNTER“ mit der Aktualisierung um 09:05:21 nicht erhöht (so etwas scheint hin und wieder mal vorzukommen).

    Damit ist „oE.State()“ nicht mehr kleiner als „aC.State()“ sondern gleich groß und der Korrekturwert wird addiert.

    Diese Anpassung sollte das Problem lösen.

    object oP = dom.GetObject(&quot;BidCos-RF.MEXXXXXXXX:1.POWER&quot;);
    object oE = dom.GetObject(&quot;BidCos-RF.MEXXXXXXXX:1.ENERGY_COUNTER&quot;);
    var aC = dom.GetObject(&quot;Strom ENERGY_COUNTER&quot;);
    var zR = dom.GetObject(&quot;Strom Referenz Zaehlerstand&quot;);
    var zA = dom.GetObject(&quot;Strom Zaehlerstand&quot;);
    var aA = dom.GetObject(&quot;Strom Leistungsaufnahme aktuell&quot;);
    var vLz = dom.GetObject(&quot;Strom Referenz Verbrauch seit letzter Ablesung&quot;);
    var vLg = dom.GetObject(&quot;Strom Verbrauch seit letzter Ablesung&quot;);
    var vTz = dom.GetObject(&quot;Strom Referenz Verbrauch heute&quot;);
    var vTg = dom.GetObject(&quot;Strom Verbrauch heute&quot;);
    var vWz = dom.GetObject(&quot;Strom Referenz Verbrauch laufende Woche&quot;);
    var vWg = dom.GetObject(&quot;Strom Verbrauch laufende Woche&quot;);
    var vMz = dom.GetObject(&quot;Strom Referenz Verbrauch laufender Monat&quot;);
    var vMg = dom.GetObject(&quot;Strom Verbrauch laufender Monat&quot;);
    var vJz = dom.GetObject(&quot;Strom Referenz Verbrauch laufendes Kalenderjahr&quot;);
    var vJg = dom.GetObject(&quot;Strom Verbrauch laufendes Kalenderjahr&quot;);
    	if ((oE.State() + 0.001) &lt; aC.State()) {
    	zR.State(zR.State() + 838.8607);
    	}
    aC.State(oE.State());
    zA.State(zR.State() + (oE.State()/1000));
    aA.State(oP.State());
    vLg.State(zA.State() - vLz.State());
    vTg.State(zA.State() - vTz.State());
    vWg.State(zA.State() - vWz.State());
    vMg.State(zA.State() - vMz.State());
    vJg.State(zA.State() - vJz.State());
    

    Ich lasse das jetzt mal so laufen und sehe mal, was passiert.

    Danke nochmal für deinen Input, der hat mich erst auf diese Überlegung gebracht.

Kommentare sind geschlossen.