Seite 1 von 13

Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 01.02.2013, 22:49
von JPS
Ich versuche, dieses Thema parallel auf meiner Hausautomations-Internetseite aktuell zu halten.

Bei Ölheizungsbrennern ist es sehr einfach möglich, anhand der Parameter der Brennerdüse und der Betriebszeit des Brenners, den Heizölverbrauch zu berechnen. Das wurde an anderen Stellen hier im Forum schon mehrfach erörtert. Mit recht wenig Aufwand lassen sich so umfangreiche Auswertungen bezüglich des Heizölverbrauchs vornehmen. In diesem Beitrag werden folgende Funktionen beschrieben:

1. Abgriff des Brennerzustandes (Stand-by / Feuerung) und Übertragung in die HomeMatic
2. Betriebsstunden- und Verbrauchszähler
- Tageszähler
- Wochenzähler
- Monatszähler
- Jahreszähler
- Zähler seit der letzten Tankung
- Füllstand im Vorratstank
3. Statusinformation und Ausfallwarnung für die Heizungsanlage

1. Abgriff des Brennerzustandes (Stand-by / Feuerung)

Um die Betriebsstunden des Brenners abzugreifen, gibt es grundsätzlich mehrere Möglichkeiten. Am genauesten ist wohl ein Sensor, der den Schaltzustand des Magnetventils der Heizölversorgung ermittelt. Bei Vernachlässigung der kurzen Aufwärmzeit, in der noch kein Heizöl verbraucht wird, kann auch Zustand des Brenners abgegriffen werden, z.B. parallel zur Brenner-Kontrollleuchte oder zum evtl. vorhandenen Betriebsstundenzähler.

Da ich nicht in die elektrische Anlage des Brenners bzw. der Heizungssteuerung eingreifen wollte, habe ich mich für einen ganz anderen Weg entschieden. Mit einem simplen Dämmerungsschalter (Bausatz) wird der Zustand einer an meiner Heizung vorhanden Brenner-Kontroll-LED ermittelt. Hierzu habe ich den Helligkeitssensor in eine schwarze Gummi-LED-Fassung gesteckt, über die Brenner-Kontroll-LED gestülpt und mit Isolierband fixiert...
IMAG1324.png
Das Relais des Dämmerungsschalters schaltet den Eingang eines "HomeMatic Schließerkontakt-Interface für Öffner und Schließerkontakte" (HM-SCI-3-FM). In ein Gehäuse verbaut, schaut das so aus....
IMAG1305.png
IMAG1305.png (316.99 KiB) 20357 mal betrachtet
...und liefert zuverlässig (z.B. über einen Wintertag) folgenden Ergebnis (0 = Brenner ein, 1 = Brenner aus)...
Bild01.png
Bild01.png (13.07 KiB) 20357 mal betrachtet
2. Betriebsstunden- und Verbrauchszähler

Bei der Umsetzung der Zähler-Scripte habe ich als Grundlage die hier (http://homematic-forum.de/forum/viewtop ... =31&t=4218) beschriebenen Scripte genommen, an dieser Stelle vielen Dank für die Vorarbeit.

Als Voraussetzung für das Funktionieren aller Funktionen des Zählers müssen zunächst einige Systemvariablen angelegt werden...
  • "Brenner Betriebsstunden heute", Zahl
    "Brenner Betriebsstunden laufende Woche", Zahl
    "Brenner Betriebsstunden laufender Monat", Zahl
    "Brenner Betriebsstunden laufendes Kalenderjahr", Zahl
    "Brenner Betriebsstunden seit letzter Fuellung", Zahl

    "Brenner Verbrauch heute", Zahl
    "Brenner Verbrauch laufende Woche", Zahl
    "Brenner Verbrauch laufender Monat", Zahl
    "Brenner Verbrauch laufendes Kalenderjahr", Zahl
    "Brenner Verbrauch seit letzter Fuellung", Zahl

    "Brenner letzte Ausschaltzeit", Zeichenkette
    "Brenner letzte Einschaltzeit", Zeichenkette
    "Brenner Tankinhalt aktuell", Zahl
    "Brenner Tankinhalt bei letzter Fuellung", Zahl

    "Brenner Status", Logikwert, wahr = Feuerung, falsch = Stand-by
Anstatt unmittelbar den Zustand des HM-SCI-3-FM zur Triggerung der Programme zu nutzen, gehe ich den Umweg über die Systemvariable "Brenner Status", da der HM-SCI-3-FM im Vergleich zu einer Systemvariablen nach einem Reboot der CCU nicht den ursprünglichen Status behält sondern bis zum nächsten Schalten immer den Zustand "geschlossen" anzeigt. Insbesondere bei längeren Pausen kann es dennoch zu falschen Ergebnissen kommen, die jedoch durch die Abfrage "auslösen auf Aktualisierung" anstatt "auslösen auf Änderung" für die meisten Fälle verhindert werden kann.
sysvarein.png
sysvarein.png (12.24 KiB) 20121 mal betrachtet
sysvaraus.png
sysvaraus.png (12.09 KiB) 20121 mal betrachtet
Ergänzend kann man zur Sicherheit parallel zum Relais des Dämmerungsschalters einen Taster schalten und über diesen nach einem CCU-Reboot bei ausgeschaltetem Brenner kurz den HM-SCI-3-FM triggern (im o.a. Bild des Gerätes fehlt dieser Taster noch)...
IMAG1317.png
Natürlich lässt sich dies bei Bedarf auch automatisieren, z.B. über einen HomeMatic-Schaltaktor für Batteriebetrieb, den man nach einem Reboot der CCU kurz den Eingang des HM-SCI-3-FM schalten lässt.

Zur Datenaufzeichnung wird mit diesem Programm...
Prg ein.png
Prg ein.png (12.39 KiB) 20357 mal betrachtet
... beim Einschalten des Brenners das folgende Script ausgeführt...

Code: Alles auswählen

var EinZeit= dom.GetObject("Brenner letzte Einschaltzeit");
EinZeit.State(system.Date("%F %T")); !Speichern der Einschaltzeit
... und beim Ausschalten des Brenners...
Prg aus.png
Prg aus.png (12.48 KiB) 20357 mal betrachtet
... dieses Script...

Code: Alles auswählen

var AusZeit= dom.GetObject("Brenner letzte Ausschaltzeit");
var EinZeit= dom.GetObject("Brenner letzte Einschaltzeit");
var TankGes= dom.GetObject("Brenner Tankinhalt bei letzter Fuellung").Value();
var KumTankAkt= dom.GetObject("Brenner Tankinhalt aktuell");
var KumZeitF= dom.GetObject("Brenner Betriebsstunden seit letzter Fuellung");
var KumVerbrauchF= dom.GetObject("Brenner Verbrauch seit letzter Fuellung");
var KumZeitJ= dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr");
var KumVerbrauchJ= dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr");
var KumZeitM= dom.GetObject("Brenner Betriebsstunden laufender Monat");
var KumVerbrauchM= dom.GetObject("Brenner Verbrauch laufender Monat");
var KumZeitW= dom.GetObject("Brenner Betriebsstunden laufende Woche");
var KumVerbrauchW= dom.GetObject("Brenner Verbrauch laufende Woche");
var KumZeitT= dom.GetObject("Brenner Betriebsstunden heute");
var KumVerbrauchT= dom.GetObject("Brenner Verbrauch heute");

! Speichern der Ausschaltzeit
AusZeit.State(system.Date("%F %T"));

! Den Einschaltzeit String aus der Systemvariablen in ein Zeitobjekt umwandeln
time t = EinZeit.Variable().ToTime();

! Die aktuelle (Ausschalt)Zeit String erzeugen und in ein Zeitobjekt umwandeln
time t1 = system.Date("%F %T").ToTime();

! Das Zeitobjekt Einschaltzeit in Sekunden seit 1.1.1970 umwandeln
var x = t.ToInteger();

! Das Zeitobjekt aktuelle Zeit in Sekunden seit 1.1.1970 umwandeln
var x1 = t1.ToInteger();

!Die Differenz ist die Einschaltdauer in Stunden umgerechnet
var x0 = 0.01*(x1-x)/36;

! Die Einschaltdauer seit der letzten Füllung kumulieren = Betriebsstunden seit der letzten Füllung
var gelaufenF = x0 + KumZeitF.Variable();

! Die Betriebsstunden seit der letzten Füllung in die Systemvariable einstellen
KumZeitF.State (gelaufenF);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h seit der letzten Füllung
var verbrauchtF = gelaufenF * 1.87 * 1.197;

! Verbrauch seit der letzten Füllung in die Systemvariable einstellen
KumVerbrauchF.State (verbrauchtF);

! Berechnung Tankinhalts in Litern
var tankinhalt = TankGes - verbrauchtF;

! Tankinhalt in die Systemvariable einstellen
KumTankAkt.State (tankinhalt);

! Die Einschaltdauer im laufenden Kalenderjahr kumulieren = Betriebsstunden
var gelaufenJ = x0 + KumZeitJ.Variable();

! Die Betriebsstunden im laufenden Kalenderjahr in die Systemvariable einstellen
KumZeitJ.State (gelaufenJ);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h im laufenden Kalenderjahr
var verbrauchtJ = gelaufenJ * 1.87 * 1.197;

! Verbrauch im laufenden Kalenderjahr in die Systemvariable einstellen
KumVerbrauchJ.State (verbrauchtJ);

! Die Einschaltdauer im laufenden Kalendermonat kumulieren = Betriebsstunden
var gelaufenM = x0 + KumZeitM.Variable();

! Die Betriebsstunden im laufenden Kalendermonat in die Systemvariable einstellen
KumZeitM.State (gelaufenM);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h im laufenden Kalendermonat
var verbrauchtM = gelaufenM * 1.87 * 1.197;

! Verbrauch im laufenden Kalendermonat in die Systemvariable einstellen
KumVerbrauchM.State (verbrauchtM);

! Die Einschaltdauer in der laufenden Kalenderwoche kumulieren = Betriebsstunden
var gelaufenW = x0 + KumZeitW.Variable();

! Die Betriebsstunden in der laufenden Kalenderwoche in die Systemvariable einstellen
KumZeitW.State (gelaufenW);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h in der laufenden Kalenderwoche
var verbrauchtW = gelaufenW * 1.87 * 1.197;

! Verbrauch in der laufenden Kalenderwoche in die Systemvariable einstellen
KumVerbrauchW.State (verbrauchtW);

! Die Einschaltdauer heute kumulieren = Betriebsstunden
var gelaufenT = x0 + KumZeitT.Variable();

! Die Betriebsstunden heute in die Systemvariable einstellen
KumZeitT.State (gelaufenT);

! Berechnung von Verbrauch in Liter mit 1,87 kg/h heute
var verbrauchtT = gelaufenT * 1.87 * 1.197;

! Verbrauch in der laufenden Kalenderwoche in die Systemvariable einstellen
KumVerbrauchT.State (verbrauchtT);
Das Ausschaltscript berechnet aus den Betriebsstunden den Verbrauch nach der Formel:
Verbrauch = Betriebsstunden (h) * Leistung der Brennerdüse beim angegebenen Druck (kg/h) * Umrechnungsfaktor (kg->l = 1.197)
Die bei mir verbaute Düse hat eine Leistung von 1.87 kg/h bei einem Betriebsdruck von 10 bar. Hier muss das Script ggf. auf die eigenen Werte angepasst werden.

Der Zustand der Aufzeichnungs-Systmvariablen aktualisiert sich immer erst mit dem Ausführen des Ausschaltscripts. In WebMatic sehen die Daten z.B. so aus...
WebMatic1.png
WebMatic2.png
Jetzt gehen mir die zugebilligten 10 Bilder aus, der zweite Teil folgt... :wink:

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 01.02.2013, 23:46
von JPS
... und hier der zweite Teil...

Zum Reset der Jahres-, Monats-, Wochen und Tageszähler auf "0" verwende ich Programme, die über das Zeitmodul der CCU nach Mitternacht ausgeführt werden. Hier ein Beispiel für den Tageszähler...
Res T.png
Res T.png (17.76 KiB) 20341 mal betrachtet
Über die erste Zeile des Programms wird eine Pushnachricht verschickt, mit der die Werte vor dem Reset übermittelt werden. Hierzu verwende ich Pushover, das ich hier (http://homematic-forum.de/forum/viewtop ... 31&t=11579) schon im Detail beschrieben habe. Bei Bedarf kann man die Daten aber natürlich auch per Mail oder über einen anderen Dienst verschicken. Die folgenden Scripte müssen dann entsprechend angepasst werden.

Code: Alles auswählen

string KumZeit= dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr").Value();
string KumVerbrauch= dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr").Value();
! Zeitwert um 1 subtrahieren
time t = system.Date("%Y").ToInteger();
var zeitraum = t - 1;
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung der Oelverbrauch-Jahreszaehler wird zurueckgesetzt. Verbrauchswerte " # sDate # " vor dem Reset: ";
MailText = MailText # "Betriebsstunden: " # KumZeit # ", Verbrauch: " # KumVerbrauch # "Liter.  ";
! Push-Variablen initialisieren
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}

Code: Alles auswählen

string KumZeit= dom.GetObject("Brenner Betriebsstunden laufender Monat").Value();
string KumVerbrauch= dom.GetObject("Brenner Verbrauch laufender Monat").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%m").ToInteger();
if (t == 1) {zeitraum = 12;}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung der Oelverbrauch-Monatszaehler wird zurueckgesetzt. Verbrauchswerte Monat " # sDate # " vor dem Reset: ";
MailText = MailText # "Betriebsstunden: " # KumZeit # ", Verbrauch: " # KumVerbrauch # "Liter.  ";
! Push-Variablen initialisieren
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}

Code: Alles auswählen

string KumZeit= dom.GetObject("Brenner Betriebsstunden laufende Woche").Value();
string KumVerbrauch= dom.GetObject("Brenner Verbrauch laufende Woche").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%V").ToInteger();
if (t == 1) {zeitraum = "Letzte KW im Vorjahr";}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung der Oelverbrauch-Wochenzaehler wird zurueckgesetzt. Verbrauchswerte KW " # sDate # " vor dem Reset: ";
MailText = MailText # "Betriebsstunden: " # KumZeit # ", Verbrauch: " # KumVerbrauch # "Liter.  ";
! Push-Variablen initialisieren
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}

Code: Alles auswählen

string KumZeit= dom.GetObject("Brenner Betriebsstunden heute").Value();
string KumVerbrauch= dom.GetObject("Brenner Verbrauch heute").Value();
var zeitraum;
! Zeitwert um 1 subtrahieren
time t = system.Date("%j").ToInteger();
if (t == 1) {zeitraum = "Letzter Tag im Vorjahr";}
else {zeitraum = t - 1;}
! Push-Text zusammensetzen
string MailText;
string sDate = zeitraum.ToString();
MailText = "Achtung der Oelverbrauch-Tageszaehler wird zurueckgesetzt. Verbrauchswerte am Tag " # sDate # " vor dem Reset: ";
MailText = MailText # "Betriebsstunden: " # KumZeit # ", Verbrauch: " # KumVerbrauch # "Liter.  ";
! Push-Variablen initialisieren
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}
Der Reset des Tankungszählers erfolgt manuell, nachdem der Tank gefüllt wurde, mit einem Schlüsselschalter, der in das o.g. Auswertegehäuse eingebaut ist und über einen freien Kanal des HM-SCI-3-FM das Reset-Programm triggert. Alternativ kann das Reset-Programm natürlich auch über andere Wege gestartet werden...
Res Tank.png
Res Tank.png (21.48 KiB) 20341 mal betrachtet
Auch hier lasse ich mir die Daten vor dem Reset schicken...

Code: Alles auswählen

string KumZeit= dom.GetObject("Brenner Betriebsstunden seit letzter Fuellung").Value();
string KumVerbrauch= dom.GetObject("Brenner Verbrauch seit letzter Fuellung").Value();
! Push-Text zusammensetzen
string MailText;
string sDate = system.Date("Tag %j/%Y, %A, %d.%m.%Y, %T Uhr");
MailText = "Achtung der Oelverbrauch-Tankungszaehler wird zurueckgesetzt. Verbrauchswerte am " # sDate # " vor dem Reset: ";
MailText = MailText # "Betriebsstunden: " # KumZeit # ", Verbrauch: " # KumVerbrauch # "Liter. Der Tankinhalt wird auf 2800 Liter gesetzt, bitte pruefen und ggf. manuell anpassen! ";
! Push-Variablen initialisieren
string teilstr;
string sendmail = "";
! Mailtext erstellen (Wörter am Leerzeichen trennen)
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
! Eigentliche Mail absenden
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=pushover http://api.pushover.net/1/messages.json");
}
Das Programm setzt den Füllstand des Tanks automatisch auf 2800l, was bei mir einer realistischen Füllung nahe kommt. Der genaue Wert nach der Tankung kann danach manuell angepasst werden. Am bequemsten geht dies über die "Setzen-Funktion" in WebMatic...
Tankreset.png
Tankreset.png (13.29 KiB) 20341 mal betrachtet
3. Statusinformation und Ausfallwarnung für die Heizungsanlage

Über ein mittels Zeitmodul getriggertes Programm können in regelmäßigen Abständen Statusinformationen der Heizung verschickt werden. Zusätzlich habe ich die Außentemperatur mit aufgenommen...

Code: Alles auswählen

string zE= dom.GetObject("Brenner letzte Einschaltzeit").Value();
string zA= dom.GetObject("Brenner letzte Ausschaltzeit").Value();
string tF= dom.GetObject("Brenner Tankinhalt bei letzter Fuellung").Value();
string tA= dom.GetObject("Brenner Tankinhalt aktuell").Value();
string sF= dom.GetObject("Brenner Betriebsstunden seit letzter Fuellung").Value();
string vF= dom.GetObject("Brenner Verbrauch seit letzter Fuellung").Value();
string sJ= dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr").Value();
string vJ= dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr").Value();
string sM= dom.GetObject("Brenner Betriebsstunden laufender Monat").Value();
string vM= dom.GetObject("Brenner Verbrauch laufender Monat").Value();
string sW= dom.GetObject("Brenner Betriebsstunden laufende Woche").Value();
string vW= dom.GetObject("Brenner Verbrauch laufende Woche").Value();
string sT= dom.GetObject("Brenner Betriebsstunden heute").Value();
string vT= dom.GetObject("Brenner Verbrauch heute").Value();
string Tau= (dom.GetObject("BidCos-RF.HEQ01XXXXX:1.TEMPERATURE").Value());
string MailText;
string sDate = system.Date("%d.%m.%Y, %T");
MailText = "Heizung okay, Status vom " # sDate # ", Tau: " # Tau # "C: ";
MailText = MailText # "zE: " # zE # ", zA: " # zA # ", tF: " # tF # "l, tA: " # tA # "l, vF: " # vF # "l, vJ: " # vJ # "l, vM: " # vM # "l, vW: " # vW # "l, vT: " # vT # "l, sF: " # sF # "h, sJ: " # sJ # "h, sM: " # sM # "h, sW: " # sW # "h, sT: " # sT # ".  ";
string teilstr;
string sendmail = "";
foreach(teilstr, MailText.Split(" "))
{
sendmail = sendmail # "+" # teilstr;
}
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=bike http://api.pushover.net/1/messages.json");
}
Hier nutze ich bewusst nur Abkürzungen für die Bezeichnungen der Werte, damit die Pushnachrichten nicht zu lang werden. Das kann natürlich individuell angepasst werden.

Alternativ kann mit einer Abfrage des Zeitraums zwischen dem letzten Einschalten und der aktuellen Zeit ermittelt werden, ob die Heizung ausgefallen ist. Hierzu verwende ich zusätzlich die folgenden Systemvariablen...
  • "Tageszeit" (nutze ich ohnehin für das Tageszeitscript http://www.homematic-inside.de/tecbase/ ... nterteilen)
    "Heizperiode" (nutze ich ohnehin für das Heizungsthermostatscript -> <15°C, >15°C )
    "Jahreszeit Rollladen" (nutze ich zur Steuerung der Rollladen -> <7°C, >7°C )
Das Ausfall-Script wird ebenfalls zyklisch mittels Zeitmodul (ca. alle zwei Stunden) ausgelöst. Es übermittelt zunächst nur die Statusmeldungen. Bei längerem Ausfall werden jedoch Warnungen und bei anhaltendem Ausfall Alarmmitteilungen gepusht. Die Referenz-Zeiten habe ich nach dem Grundsatz, dass die Heizung tagsüber öfter läuft als nachts und im Winter öfter als im Sommer nur grob an meine Erfahrungen angepasst. Hier ist dem eigenen Spieltrieb keine Grenze gesetzt. :wink:

Code: Alles auswählen

string referenz_zeit;
var EinZeit= dom.GetObject("Brenner letzte Einschaltzeit");
var AusZeit= dom.GetObject("Brenner letzte Ausschaltzeit");
string zE= dom.GetObject("Brenner letzte Einschaltzeit").Value();
string zA= dom.GetObject("Brenner letzte Ausschaltzeit").Value();
string tF= dom.GetObject("Brenner Tankinhalt bei letzter Fuellung").Value();
string tA= dom.GetObject("Brenner Tankinhalt aktuell").Value();
string sF= dom.GetObject("Brenner Betriebsstunden seit letzter Fuellung").Value();
string vF= dom.GetObject("Brenner Verbrauch seit letzter Fuellung").Value();
string sJ= dom.GetObject("Brenner Betriebsstunden laufendes Kalenderjahr").Value();
string vJ= dom.GetObject("Brenner Verbrauch laufendes Kalenderjahr").Value();
string sM= dom.GetObject("Brenner Betriebsstunden laufender Monat").Value();
string vM= dom.GetObject("Brenner Verbrauch laufender Monat").Value();
string sW= dom.GetObject("Brenner Betriebsstunden laufende Woche").Value();
string vW= dom.GetObject("Brenner Verbrauch laufende Woche").Value();
string sT= dom.GetObject("Brenner Betriebsstunden heute").Value();
string vT= dom.GetObject("Brenner Verbrauch heute").Value();
string Tau= (dom.GetObject("BidCos-RF.HEQ01XXXX:1.TEMPERATURE").Value());
var Tageszeit= dom.GetObject("Tageszeit").Value();
var Heizperiode= dom.GetObject("Heizperiode").Value();
var Jahreszeit= dom.GetObject("Jahreszeit Rollladen").Value();
real referenz_warnung;
real referenz_alarm;
var auszeit_aktuell;

! Den Einschaltzeit String aus der Systemvariablen in ein Zeitobjekt umwandeln
time te = EinZeit.Variable().ToTime();

! Den Ausschaltzeit String aus der Systemvariablen in ein Zeitobjekt umwandeln
time ta = AusZeit.Variable().ToTime();

! Die aktuelle Zeit String erzeugen und in ein Zeitobjekt umwandeln
time t1 = system.Date("%F %T").ToTime();

! Das Zeitobjekt Einschaltzeit in Sekunden seit 1.1.1970 umwandeln
var xe = te.ToInteger();

! Das Zeitobjekt Ausschaltzeit in Sekunden seit 1.1.1970 umwandeln
var xa = ta.ToInteger();

! Das Zeitobjekt aktuelle Zeit in Sekunden seit 1.1.1970 umwandeln
var x1 = t1.ToInteger();

!Die Differenz ist die Zeit seit dem letzten Ein/-Ausschalten in Stunden umgerechnet
var x0e = 0.01*(x1-xe)/36;
var x0a = 0.01*(x1-xa)/36;

! Winter (< 7°C) nachts
if ((Jahreszeit == 0) && (Tageszeit == 0)) {
		referenz_warnung = "9";
		referenz_alarm = "10";
		referenz_zeit = "Winter-Nacht";
		}
else { ! Winter (< 7°C) tagsüber
	if ((Jahreszeit == 0) && (Tageszeit <> 0)) {
		referenz_warnung = "1";
		referenz_alarm = "2";
		referenz_zeit = "Winter-Tag";
		}
else { ! Übergang (> 7°c < 15 °C) nachts
	if ((Heizperiode == false) && (Tageszeit == 0)) {
		referenz_warnung = "11";
		referenz_alarm = "12";
		referenz_zeit = "Uebergang-Nacht";
		}
else { ! Übergang (> 7°c < 15 °C) tagsüber
	if ((Heizperiode == false) && (Tageszeit <> 0)) {
		referenz_warnung = 3;
		referenz_alarm = 5;
		referenz_zeit = "Uebergang-Tag";
		}
else { ! Sommer (> 15°C) nachts 
	if ((Heizperiode == true) && (Tageszeit == 0)) {
		referenz_warnung = 13;
		referenz_alarm = 14;
		referenz_zeit = "Sommer-Nacht";
	}
else { ! Sommer (> 15°C) tagsüber
	if ((Heizperiode == true) && (Tageszeit <> 0)) {
		referenz_warnung = 6;
		referenz_alarm = 8;
		referenz_zeit = "Sommer-Tag";
		}
else {referenz_zeit = "undefiniert";}		
}}}}}
if (x0e > referenz_alarm)
	{
		string MailText;
		string sDate = system.Date("%d.%m.%Y, %T");
		MailText = "Heizungsausfall-ALARM, Status vom " # sDate # ", Tau: " # Tau # "C: ";
		MailText = MailText # "Referenzzeit: " # referenz_zeit # ",zE: " # zE # ", zA: " # zA # ", tF: " # tF # "l, tA: " # tA # "l, vF: " # vF # "l, vJ: " # vJ # "l, vM: " # vM # "l, vW: " # vW # "l, vT: " # vT # "l, sF: " # sF # "h, sJ: " # sJ # "h, sM: " # sM # "h, sW: " # sW # "h, sT: " # sT # ".  ";
		string teilstr;
		string sendmail = "";
		foreach(teilstr, MailText.Split(" "))
		{
		sendmail = sendmail # "+" # teilstr;
		}
		dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d priority=1 -d sound=siren http://api.pushover.net/1/messages.json");	
	}
else {
	if (x0e > referenz_warnung)
		{
		string MailText;
		string sDate = system.Date("%d.%m.%Y, %T");
		MailText = "Heizungsausfall-Warnung, Status vom " # sDate # ", Tau: " # Tau # "C: ";
		MailText = MailText # "Referenzzeit: " # referenz_zeit # ",zE: " # zE # ", zA: " # zA # ", tF: " # tF # "l, tA: " # tA # "l, vF: " # vF # "l, vJ: " # vJ # "l, vM: " # vM # "l, vW: " # vW # "l, vT: " # vT # "l, sF: " # sF # "h, sJ: " # sJ # "h, sM: " # sM # "h, sW: " # sW # "h, sT: " # sT # ".  ";
		string teilstr;
		string sendmail = "";
		foreach(teilstr, MailText.Split(" "))
		{
		sendmail = sendmail # "+" # teilstr;
		}
		dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d priority=1 -d sound=pushover http://api.pushover.net/1/messages.json");
		}
else {
	string MailText;
	string sDate = system.Date("%d.%m.%Y, %T");
	MailText = "Heizung okay, Status vom " # sDate # ", Tau: " # Tau # "C: ";
	MailText = MailText # "zE: " # zE # ", zA: " # zA # ", tF: " # tF # "l, tA: " # tA # "l, vF: " # vF # "l, vJ: " # vJ # "l, vM: " # vM # "l, vW: " # vW # "l, vT: " # vT # "l, sF: " # sF # "h, sJ: " # sJ # "h, sM: " # sM # "h, sW: " # sW # "h, sT: " # sT # ".  ";
	string teilstr;
	string sendmail = "";
	foreach(teilstr, MailText.Split(" "))
	{
	sendmail = sendmail # "+" # teilstr;
	}
	dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("curl -s -d token=TOKEN -d user=USER -d message='"#sendmail#"' -d sound=bike http://api.pushover.net/1/messages.json");
	}
	}
Statt der Systemvariablen "Heizperiode" und "Jahreszeit" kann natürlich z.B. auch die Außentemperatur abgefragt werden.

Abschließend noch ein paar "Impressionen":
PO.png
PO.png (95.12 KiB) 20341 mal betrachtet
CCUH heute V2.png
CCUH heute V2.png (11.55 KiB) 20341 mal betrachtet
CCUH heute V.png
CCUH heute V.png (11.88 KiB) 20341 mal betrachtet
CCUH monat.png
CCUH monat.png (12.04 KiB) 20341 mal betrachtet
CCUH Tank.png
CCUH Tank.png (13.09 KiB) 20341 mal betrachtet

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 02.02.2013, 05:28
von klassisch
Vielen Dank für diese sehr schöne Beschreibung und die Skripte. Sieht nach einer durchdachten, runden Lösung aus und macht Lust auf einen Nachbau!
RESPEKT!

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 02.02.2013, 11:16
von MaxWrestler
Hallo JPS,
tolles Projekt !
Das ist eine gute Grundlage für andere zum Nachbau !!

Die Probleme nach dem booten der CCU ...
JPS hat geschrieben: Anstatt unmittelbar den Zustand des HM-SCI-3-FM zur Triggerung der Programme zu nutzen, gehe ich den Umweg über die Systemvariable "Brenner Status", da der HM-SCI-3-FM im Vergleich zu einer Systemvariablen nach einem Reboot der CCU nicht ursprünglichen den Status behält sondern bis zum nächsten Schalten immer den Zustand "geschlossen" anzeigt. Insbesondere bei längeren Pausen kommt es so zu falschen Ergebnisen. Mit den minimalen Ungenauigkeiten, die durch den Umweg über die Systemvariable entstehen, kann ich leben.

Je nach Status des Brenners beim Reboot der CCU kann es aber auch bei Verwendung einer Systemvariablen unter bestimmten Umständen noch zu ungenauen Ergebnissen kommen, weswegen ich parallel zum Relais des Dämmerungsschalters einen Taster geschaltet habe, über den ich nach einem CCU-Reboot bei ausgeschaltetem Brenner zur Sicherheit den HM-SCI-3-FM kurz triggern kann (im o.a. Bild des Gerätes fehlt dieser Taster noch)...
Ändere doch mal im Programm "Auto HZ Brenner SysVar ein" und "Auto HZ Brenner SysVar aus"
das auslösen auf Änderung in auslösen auf Aktualisierung

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 02.02.2013, 11:33
von JPS
MaxWrestler hat geschrieben:Ändere doch mal im Programm "Auto HZ Brenner SysVar ein" und "Auto HZ Brenner SysVar aus"
das auslösen auf Änderung in auslösen auf Aktualisierung
Ja stimmt, da der HM-SCI-3-FM nur sendet, wenn er tatsächlich geschaltet wird, sollte er auch so keine falschen Impulse senden. Ich habe das gerade mal bei mir geändert.
Ob der Status nach dem Reboot aktualisiert wird, schaue ich mir beim nächsten Neustart der CCU mal an.
Vielen Dank

Re: AW: Verbrauchs- und Betriebsstundenzähler für Ölheizunge

Verfasst: 02.02.2013, 13:08
von Wildshunter
Vielen Dank fuer die ausfuehrliche Beschreibung! Welchen Daemmerungsbausatz oder Fertiggeraet hast Du verwendet?
Gruesse!

Gesendet von meinem Blade mit Tapatalk 2

Re: AW: Verbrauchs- und Betriebsstundenzähler für Ölheizunge

Verfasst: 02.02.2013, 13:32
von JPS
Wildshunter hat geschrieben:Welchen Daemmerungsbausatz oder Fertiggeraet hast Du verwendet?
Ich habe mir den "Präzisions-Dämmerungsschalter (Bausatz)" Best.-Nr.: 19 13 02 vom großen C ausgesucht, weil er sich mit Schwellwert und Hysterese recht vielfältig einstellen lässt. Damit kann man anstatt einer LED bestimmt auch den Status der Lampe direkt am Brenner (bei mir ist das ein grünes 230V Lämpchen) oder vielleicht auch die Helligkeit im Brennraum abgreifen, sofern man dort ein Sichtfenster hat und dieses nicht zu heiß wird.

http://www.voelkner.de/products/83005/H ... -V-DC.html
http://www.conrad.de/ce/de/product/1913 ... -12-15-VDC

Die gelieferte Version sieht bei mir etwas anders aus, als auf dem Foto aber das sollte egal sein. Meine Version ist identisch mit der in der pdf-Bedienungsanleitung gezeigten Variante...
http://www.produktinfo.conrad.com/daten ... AUSATZ.pdf

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 02.02.2013, 15:34
von Wildshunter
Hallo JPS,

klasse Sache, Danke, meinste dieses Fertiggerät wuerde auch funkionieren?

http://www.elv.de/gev-lightboy-mini-ein ... halter.htm

Danke und Gruss
Wildshunter

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 02.02.2013, 16:10
von JPS
Wildshunter hat geschrieben:dieses Fertiggerät wuerde auch funkionieren?
Der Link ist irgendwie kaputt aber du wirst diesen hier gemeint haben..

http://www.elv-downloads.de/service/man ... halter.pdf

Nein, den kannst du nicht ohne weiteres nehmen, weil der für 230V (Außenlicht) ausgelegt ist und auch 230V schaltet. Du brauchst für den HM-SCI-3-FM einen potentialfreien Schalter. Das könntest du zwar theoretisch mit einem Relais dazwischen realisieren aber warum mit 230V rumhantieren, wenn es auch mit Kleinspannung geht :wink:

Ein vergossenes Gerät, das mit 12V arbeitet ist z.B. der Kemo M122. Den kann ich aber auch nicht empfehlen, weil du bei dem nicht die Empfindlichkeit einstellen kannst und der Sensor fest im Gehäuse eingebaut ist. Von ELV gibt es auch noch den Bausatz DS 12, der ist aber aufgrund einer nicht beeinflussbaren Verzögerung ebenfalls eher ungeeignet,

Re: Verbrauchs- und Betriebsstundenzähler für Ölheizungen

Verfasst: 02.02.2013, 17:04
von klassisch
Bin zwar nicht JPS, aber ich denke, daß die 5lux reichen könnten. Allerdings braucht das Gerät 230V und es kommt am Ausgang auch wieder 230V raus. Bis das wieder in der HM ist, braucht man nochmals ein 230V betriebenes Relais - wenn man nichts basteln will.