Blog Tutorial

Homematic – Alle Zähler zusammen zurücksetzen

Zaehler Reset

Letzte Aktualisierung am 12. August 2023

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.

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)

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 bzw. Homematic – Stromzähler auswerten Version 3 mit HM-ES-TX-WM und Smart-Meter

!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);
}

Homematic – Wasserzähler auswerten

!Tageszaehler
var wTz = dom.GetObject("Wasser Referenz Verbrauch heute");
var wTm = dom.GetObject("Wasser Verbrauch heute");
var vTl = dom.GetObject("Wasser Verbrauch heute Liter");
wTz.State(wTm.State() + wTz.State());
wTm.State(0.000);
wTl.State(0.000);
!Wochenzaehler
if (system.Date("%u") == 7) {
	var wWz = dom.GetObject("Wasser Referenz Verbrauch laufende Woche");
	var wWm = dom.GetObject("Wasser Verbrauch laufende Woche");
	var wWl = dom.GetObject("Wasser Verbrauch laufende Woche Liter");
	wWz.State(wWm.State() + wWz.State());
	wWm.State(0.000);
	wWl.State(0.000);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var wMz = dom.GetObject("Wasser Referenz Verbrauch laufender Monat");
	var wMm = dom.GetObject("Wasser Verbrauch laufender Monat");
	var wMl = dom.GetObject("Wasser Verbrauch laufender Monat Liter");	
	wMz.State(wMm.State() + wMz.State());
	wMm.State(0.000);
	wMl.State(0.000);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var wJz = dom.GetObject("Wasser Referenz Verbrauch laufendes Kalenderjahr");
	var wJm = dom.GetObject("Wasser Verbrauch laufendes Kalenderjahr");
	wJz.State(wJm.State() + wJz.State());
        wJm.State(0.000);
}

Kombinationen

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);
}
Homematic Zähler zurücksetzen

…und das Ganze erweitert um einen Wasserzähler

!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");
var wTz = dom.GetObject("Wasser Referenz Verbrauch heute");
var wTm = dom.GetObject("Wasser Verbrauch heute");
var wTl = dom.GetObject("Wasser Verbrauch heute Liter");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
oTz.State(0.00);
oTg.State(0.00);
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
oTz.State(0.00);
oTg.State(0.00);
wTz.State(wTm.State() + wTz.State());
wTl.State(0.000);
wTm.State(0.000);
!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");
	var wWz = dom.GetObject("Wasser Referenz Verbrauch laufende Woche");
    var wWm = dom.GetObject("Wasser Verbrauch laufende Woche");
	var wWl = dom.GetObject("Wasser Verbrauch laufende Woche Liter");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
	oWz.State(0.00);
	oWg.State(0.00);
	wWz.State(wWm.State() + wWz.State());
	wWl.State(0.000);
	wWm.State(0.000);
}
!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 zAw = dom.GetObject("w_counter_3").Value();
	string vMw = dom.GetObject("Wasser 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, WASSER: Z%C3%A4hlerstand: " # zAw # " m3, Monatsverbrauch: " # vMw # " m3 %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=bike 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");
	var wMz = dom.GetObject("Wasser Referenz Verbrauch laufender Monat");
	var wMm = dom.GetObject("Wasser Verbrauch laufender Monat");
	var wMl = dom.GetObject("Wasser Verbrauch laufender Monat Liter");
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
	oMz.State(0.00);
	oMg.State(0.00);
	wMz.State(wMm.State() + wMz.State());
	wMl.State(0.000);
	wMm.State(0.000);
}
!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");
	var wJz = dom.GetObject("Wasser Referenz Verbrauch laufendes Kalenderjahr");
	var wJm = dom.GetObject("Wasser Verbrauch laufendes Kalenderjahr");
    vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
	oJz.State(0.00);
	oJg.State(0.00);
	wJz.State(wJm.State() + wJz.State());
    wJm.State(0.000);
}
Homematic Zähler zurücksetzen

…sowie mit Integration des Betriebsstundenzählers der Sauna, einer zusätzlichen jährlichen Pushnachricht und einigen optischen Anpassungen der Nachrichten…

!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");
var wTz = dom.GetObject("Wasser Referenz Verbrauch heute");
var wTm = dom.GetObject("Wasser Verbrauch heute");
var wTl = dom.GetObject("Wasser Verbrauch heute Liter");
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
oTz.State(0.00);
oTg.State(0.00);
vTz.State(vTg.State() + vTz.State());
vTg.State(0.00);
oTz.State(0.00);
oTg.State(0.00);
wTz.State(wTm.State() + wTz.State());
wTl.State(0.000);
wTm.State(0.000);
!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");
	var wWz = dom.GetObject("Wasser Referenz Verbrauch laufende Woche");
    var wWm = dom.GetObject("Wasser Verbrauch laufende Woche");
	var wWl = dom.GetObject("Wasser Verbrauch laufende Woche Liter");
	vWz.State(vWg.State() + vWz.State());
	vWg.State(0.00);
	oWz.State(0.00);
	oWg.State(0.00);
	wWz.State(wWm.State() + wWz.State());
	wWl.State(0.000);
	wWm.State(0.000);
}
!Monatszaehler
time morgen = (system.Date("%F %X").ToTime().ToInteger() + 120).ToTime();
if (morgen.Day() == 1) {
	var zAs = dom.GetObject("Strom Zaehlerstand").Value().ToString(2);
	var vMs = dom.GetObject("Strom Verbrauch laufender Monat").Value().ToString(2);
	var hMo = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr").Value().ToString(2);
	var zAo = dom.GetObject("Brenner Tankinhalt aktuell").Value().ToString(2);
	var vMo = dom.GetObject("Brenner Verbrauch laufender Monat").Value().ToString(2);
	var zAw = dom.GetObject("w_counter_3").Value().ToString(2);
	var vMw = dom.GetObject("Wasser Verbrauch laufender Monat").Value().ToString(2);
	string MailText;
	string sDate = system.Date("%d.%m.%Y, %T");
	MailText = "Die Monatsz%C3%A4hler werden jetzt (" # sDate # ") zur%C3%BCck gesetzt: ";
	MailText = MailText # "%0A%0ASTROM: Z%C3%A4hlerstand: " # zAs # " kWh, Monatsverbrauch: " # vMs # " kWh, %0A%0AWASSER: Z%C3%A4hlerstand: " # zAw # " m3, Monatsverbrauch: " # vMw # " m3, %0A%0A%C3%96L: Tankinhalt: " # zAo # " l, Brenner Betriebsstunden: " # hMo # " h, 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=bike 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");
	var wMz = dom.GetObject("Wasser Referenz Verbrauch laufender Monat");
	var wMm = dom.GetObject("Wasser Verbrauch laufender Monat");
	var wMl = dom.GetObject("Wasser Verbrauch laufender Monat Liter");
    vMz.State(vMg.State() + vMz.State());
	vMg.State(0.00);
	oMz.State(0.00);
	oMg.State(0.00);
	wMz.State(wMm.State() + wMz.State());
	wMl.State(0.000);
	wMm.State(0.000);
}
!Jahreszaehler:
if ((system.Date("%m") == 12) && (system.Date("%d") == 31)) {
	var vJs = dom.GetObject("Strom Verbrauch laufendes Kalenderjahr").Value().ToString(2);
	var hJo = dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr").Value().ToString(2);
	var vJo = dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr").Value().ToString(2);
	var vJw = dom.GetObject("Wasser Verbrauch laufendes Kalenderjahr").Value().ToString(2);
	var hJs = dom.GetObject("Sauna Ofen Betriebsstunden Kalenderjahr").Value().ToString(2);
	var vJu = dom.GetObject("Sauna Ofen Verbrauch Kalenderjahr").Value().ToString(2);
	string MailText;
	string sDate = system.Date("%d.%m.%Y, %T");
	MailText = "Die Jahres%C3%A4hler werden jetzt (" # sDate # ") zur%C3%BCck gesetzt: ";
	MailText = MailText # "%0A%0ASTROM: Jahresverbrauch: " # vJs # " kWh, %0A%0AWASSER: Jahresverbrauch: " # vJw # " m3, %0A%0A%C3%96L: Brenner Betriebsstunden: " # hJo # " h, Jahresverbrauch: " # vJo # " l, %0A%0ASAUNA: Ofen Betriebsstunden: " # hJs # " h, Jahreskosten: " # vJu # " EUR, ";
	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=bike http://api.pushover.net/1/messages.json");
	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");
	var wJz = dom.GetObject("Wasser Referenz Verbrauch laufendes Kalenderjahr");
	var wJm = dom.GetObject("Wasser Verbrauch laufendes Kalenderjahr");
	var sJz = dom.GetObject("Sauna Ofen Betriebsstunden Kalenderjahr");
	var sJg = dom.GetObject("Sauna Ofen Verbrauch Kalenderjahr");
	vJz.State(vJg.State() + vJz.State());
    vJg.State(0.00);
	oJz.State(0.00);
	oJg.State(0.00);
	wJz.State(wJm.State() + wJz.State());
    wJm.State(0.000);
	sJz.State(0.00);
	sJg.State(0.00);
}
Homematic Zähler zurücksetzen

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 in Stern's Haus ist ein rein privates, nicht kommerzielles Projekt. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“, Support kann ich nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis.
Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung! Für die Einhaltung der einschlägigen technischen Vorschriften ist jeder Anwender selbst verantwortlich!
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN in Stern's Haus | sternshaus.de
  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

  3. Björn Heerde

    Hallo Jens,

    Erst einmal Danke – du machst klasse Beiträge, die wirklich gut beschrieben sind!

    Ich nutze die Verbrauchsberechnung für die Ölheizung von dir, zusammen mit dem og. Reset-Script um Mitternacht.
    Seit FW 3.41.11.20190126 funktioniert der Reset nicht mehr – auch nicht manuell getriggert.
    Schreibe ich das Script so um, das nur noch die Werte auf 0 gesetzt werden, klappt es manuell…

    (Bsp: var oTz = dom.GetObject(„Brenner Betriebsstunden heute“);
    var oTg = dom.GetObject(„Brenner Verbrauch heute“);
    oTz.State(0.00);
    oTg.State(0.00);)

    Ich finde aber auch im Changelog der FW keine Hinweise auf z.B. Änderungen in der Logikschicht wie damals 2017 als das Brenner-Script angpasst werden musste…

    Gruß, Björn

    • Hallo Björn,
      Ich nutze derzeit die FW 3.43.15.20190223 und habe vorher auch die 41.11er genutzt. Bei beiden Versionen funktioniert der Reset bei mir einwandfrei (habe ich gerade nochmal aktuell überprüft). Allerdings nutze ich auch das Skript aus dem Tutorial zum gemeinsamen Reset. Hast die diese Methode schon mal probiert?
      Liebe Grüße Jens

      • Ich sehe gerade erst, dass du deinen Kommentar ja in diesem Tutorial gepostet hast. Komisch, dass es bei dir plötzlich nicht mehr funktioniert. Da habe ich auch keine Idee. Wie gesagt, hier funktoniert es…


        Liebe Grüße Jens

Schreibe einen Kommentar

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

WordPress Cookie Plugin von Real Cookie Banner