HomeMatic Tutorial

HomeMatic – Alle Zähler zusammen zurücksetzen

Zaehler Reset

Der Nutzer DanielP aus dem HomeMatic-Forum hat mich neulich mal gefragt, warum in den Zähler Tutorials die Zeitraumzähler mit einzelnen Programmen und nicht gemeinsam über ein zentrales Skript zurückgesetzt werden.

Eine gute Frage. Das liegt wohl daran, weil das Ursprungstutorial noch aus CCU 1-Zeiten stammt und ich damals aus Gründen der CCU-Performance die Aufgaben (Programmabläufe) gerne zeitlich einige Sekunden entzerrt programmiert habe.

Zudem waren in den Rücksetzprogrammen ursprünglich Skripte zum Pushen von Pushover-Nachrichten enthalten. Da bot es sich an, auch gleich die Zähler in diesen Programmen auf NULL zu setzen.

Wie auch immer, man kann es natürlich auch über nur ein Skript zusammen erledigen und dabei auch gleich alle genutzten Zähler (Strom, Öl, Gas, Wasser etc.) berücksichtigen.

1. Exemplarische Beschreibung zum Reset des Stromzählers

Am einfachsten lässt sich das realisieren, indem man über das Zeitmodul der CCU oder noch besser einen CUxD-Timer kurz nach Mitternacht das folgende Rücksetz-Skript triggern lässt…

!Tageszaehler
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 1) {
	var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
}
!Monatszaehler
if (system.Date("%d") == 1) {
	var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
        vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
}
!Jahreszaehler:
if ((system.Date("%m") == 1) && (system.Date("%d") == 1)) {
	var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
        vJz.State(vJg.State() + vJz.State());
        vJg.State(0.00);
} 

Die Platzhalter für die Zeiten in den Bedingungen stehen in der HomeMatic Script-Dokumentation. Hierbei bedeuten…

    %u: Wochentag (Montag = 1)
    %d: Monatstag (z.B. 24)
    %m: Monatsnummer (z.B. 12)

Bei dieser Lösung erhalten die Daten für gestern, letzte Woche, etc. beim Reset jedoch den Zeitstempel des Folgetages, was bei einer Visualisierung, z.B. mit dem CCU-Historian oder in iobroker nicht sehr schön ist.

Also sollte das Skript besser schon vor Mitternacht ablaufen. Für Wochenzähler und Jahreszähler ist das sehr einfach anzupassen:

!Wochenzaehler
if (system.Date("%u") == 7) {
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {

Schwieriger wird es beim Monatszähler, da der letzte Tag im Monat naturgemäß wechselt und auch Schaltjahre zu beachten sind.

Daniel hat sich hierzu eine schöne Lösung einfallen lassen, indem das Skript immer genau um 23:59 Uhr getriggert und dann geprüft wird, ob 120 Sekunden später schon der Tag 1 des nächsten Monats ist…

!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {

Dabei sind…

    %F: Datum (z.B. 2016-10-01)
    %X: Uhrzeit (z.B. 18:30:00)

2. Beispielskripte


Allen Skripten ist gemein, dass sie über das Zeitmodul der CCU oder noch besser einen CUxD-Timer jeden Tag um 23:59 Uhr getriggert werden müssen.

HomeMatic – Stromzähler auswerten Version 2 mit HM-EM-TX-WM bzw. HomeMatic – Zähler mit Hilfe der FAST EnergyCam auswerten

!Tageszaehler
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
}

HomeMatic – Gaszähler auswerten mit HM-EM-TX-WM

!Tageszaehler
var vTz = dom.GetObject("Gas Referenz Verbrauch heute");
var vTg = dom.GetObject("Gas Verbrauch heute");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var vWz = dom.GetObject("Gas Referenz Verbrauch laufende Woche");
	var vWg = dom.GetObject("Gas Verbrauch laufende Woche");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var vMz = dom.GetObject("Gas Referenz Verbrauch laufender Monat");
	var vMg = dom.GetObject("Gas Verbrauch laufender Monat");
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var vJz = dom.GetObject("Gas Referenz Verbrauch laufendes Kalenderjahr");
	var vJg = dom.GetObject("Gas Verbrauch laufendes Kalenderjahr");
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
}

HomeMatic – Verbrauchs- und Betriebsstundenzähler für Ölheizungen

!Tageszaehler
var oTz = dom.GetObject("Brenner Betriebsstunden heute");
var oTg = dom.GetObject("Brenner Verbrauch heute");
oTz.State(0.00);
oTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var oWz = dom.GetObject("Brenner Betriebsstunden laufende Woche");
	var oWg = dom.GetObject("Brenner Verbrauch laufende Woche");
	oWz.State(0.00);
	oWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var oMz = dom.GetObject("Brenner Betriebsstunden laufender Monat");
	var oMg = dom.GetObject("Brenner Verbrauch laufender Monat");
	oMz.State(0.00);
	oMg.State(0.00);	
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var oJz = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
	var oJg = dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
	oJz.State(0.00);
	oJg.State(0.00);
}

Natürlich lassen sich auch mehrere Zähler in einem Skript kombinieren. Hier z.B. Strom und Öl…

!Tageszaehler
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var oTz = dom.GetObject("Brenner Betriebsstunden heute");
var oTg = dom.GetObject("Brenner Verbrauch heute");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
oTz.State(0.00);
oTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
	var oWz = dom.GetObject("Brenner Betriebsstunden laufende Woche");
	var oWg = dom.GetObject("Brenner Verbrauch laufende Woche");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
	oWz.State(0.00);
	oWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
	var oMz = dom.GetObject("Brenner Betriebsstunden laufender Monat");
	var oMg = dom.GetObject("Brenner Verbrauch laufender Monat");
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
	oMz.State(0.00);
	oMg.State(0.00);	
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	var oJz = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
	var oJg = dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
	oJz.State(0.00);
	oJg.State(0.00);
}

Wer sich die Zählerstände vor dem Reset zusenden lassen will, findet hier einen exemplarischen Lösungsansatz für einen kombinierten Strom und Öl-Monatszähler mit Pushover

!Tageszaehler
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var oTz = dom.GetObject("Brenner Betriebsstunden heute");
var oTg = dom.GetObject("Brenner Verbrauch heute");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
oTz.State(0.00);
oTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
	var oWz = dom.GetObject("Brenner Betriebsstunden laufende Woche");
	var oWg = dom.GetObject("Brenner Verbrauch laufende Woche");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
	oWz.State(0.00);
	oWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	string zAs = dom.GetObject("Strom Zaehlerstand").Value();
	string vMs = dom.GetObject("Strom Verbrauch laufender Monat").Value();
	string zAo = dom.GetObject("Brenner Tankinhalt aktuell").Value();
	string vMo = dom.GetObject("Brenner Verbrauch laufender Monat").Value();
	string MailText;
	string sDate = system.Date("%d.%m.%Y, %T");
	MailText = "Die Monatsz%C3%A4hler werden jetzt (" # sDate # ") zur%C3%BCck gesetzt: ";
	MailText = MailText # "STROM: Z%C3%A4hlerstand: " # zAs # " kWh, Monatsverbrauch: " # vMs # " kWh, %C3%96L: Tankinhalt: " # zAo # " l, Monatsverbrauch: " # vMo # " l.  ";
	string teilstr;
	string sendmail = "";
	foreach(teilstr, MailText.Split(" ")) {
		sendmail = sendmail # "+" # teilstr;
	}
	dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("extra/curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
	var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
	var oMz = dom.GetObject("Brenner Betriebsstunden laufender Monat");
	var oMg = dom.GetObject("Brenner Verbrauch laufender Monat");
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
	oMz.State(0.00);
	oMg.State(0.00);	
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	var oJz = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
	var oJg = dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
	oJz.State(0.00);
	oJg.State(0.00);
}

Abschließend noch das Beispiel eines Stromzähler-Reset mit Speicherung der Werte von Vortag, Vorwoche etc. …

!Tageszaehler
var vTz = dom.GetObject("Strom Referenz Verbrauch heute");
var vTg = dom.GetObject("Strom Verbrauch heute");
var vTv = dom.GetObject("Strom Verbrauch gestern");
vTv.State(vTg.State());
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var vWz = dom.GetObject("Strom Referenz Verbrauch laufende Woche");
	var vWg = dom.GetObject("Strom Verbrauch laufende Woche");
	var vWv = dom.GetObject("Strom Verbrauch letzte Woche");
	vWv.State(vWg.State());
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var vMz = dom.GetObject("Strom Referenz Verbrauch laufender Monat");
	var vMg = dom.GetObject("Strom Verbrauch laufender Monat");
	var vMv = dom.GetObject("Strom Verbrauch letzter Monat");
	vMv.State(vMg.State());	
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var vJz = dom.GetObject("Strom Referenz Verbrauch laufendes Kalenderjahr");
	var vJg = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr");
	var vJv = dom.GetObject("Strom Verbrauch letztes Kalenderjahr");
	vJv.State(vJg.State());	
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
}

Falls jemand seine Zähler auf die zentrale Lösung umstellen möchte bitte daran denken, anschließend die „alten“ Rücksetzprogramme zu deaktivieren oder zu löschen.

 

Bitte beachten...

SMART WOHNEN by sTeRn AV ist ein rein privates Projekt. Support kann ich daher nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“. Die Verwendung 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. Hallo Jens,

    Frohes Neues 2017!

    Eine Anemrkung von meiner Seite, weil meine Skripte heute Nacht nicht funktioniert haben. Hintergrund: Ich lasse sie zehn Sekunden nach Mitternacht laufen und berechne welcher Tag vor zwei Minuten war.

    ! Zeitwert um 2 min. verkleinern
    integer t = system.Date(„%F %X“).ToTime().ToInteger() – 120;

    Somit waren meine Abfragen der Gestalt. (z.B. Monatsanfang):

    if (system.Date(„%d“) == 1) {

    }

    system.Date(„%d“) liefert aber „01“ und nicht „1“ weil es ein String ist; ebenso system.Date(„%m“) für den Monat. Also muss man erst eine Typkonvertiertung nach Integer machen.

    if (system.Date(„%d“).ToInteger() == 1) {

    }

    Mit der Änderung passt alles. Übrigens %u liefert keine führende „0“, gibt ja auch nur 1..7.

    Gruß

    Stefan

    • Hallo Stefan,

      ebenso ein gutes neues Jahr und danke für deinen Hinweis, der einigen Anwendern sicher hilfreich ist.

      Ich nutze die Variante aus den Beispielskripten mit dem Reset um 23:59 Uhr, funktioniert prima…

      Liebe Grüße Jens

  2. Hallo,
    ich verwende das Script von dir seit letztem Jahr und nun ist mir aufgefallen, dass mir unter „Strom Verbrauch letztes Kalenderjahr“ der Wert Null angezeigt wird. Hab mich nun auf die Fehlersuche begeben und bin auf folgendes gestoßen: Kann es sein dass du im letzten Script, Zeile 32 einen Fehler hast?
    Müsste vJv.State(vMg.State()); nicht vJv.State(vJg.State()); heißen?
    Liebe Grüße,
    Daniel

    • Hallo Daniel,

      in der Tat, da hatte sich ein Fehler eingeschlichen. Ich habe das im Skript gerade korrigiert.

      Besten Dank für den Hinweis

      Liebe Grüße Jens

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere