Ölverbrauchsanzeige / Betriebsstundenzähler

Aus FHEMWiki
Version vom 6. Oktober 2016, 09:19 Uhr von Fabian (Diskussion | Beiträge) (Kategorien gesetzt)
Zur Navigation springen Zur Suche springen
Emblem-question-yellow.svgDie gezeigten (notify) Codebeispiele sind für die (nicht empfohlene) direkte Eingabe in die Konfigurationsdatei. Bei Eingabe über das Webinterface müssen entsprechende Anpassungen vorgenommen werden.

Problem: oft weiß man nicht, wie viel Öl man tatsächlich verbraucht und welche Veränderungen an der Heizung welche Auswirkungen haben.

Die Lösung: eine Ölverbrauchsanzeige direkt in FHEM.

Hierfür habe ich ein Relais (Finder 55.34.8.230.0040 ELV) so angeschlossen, dass wenn der Brenner einschaltet sich der Kontakt am anderen Ende öffnet, dadurch kein Strom mehr zum KSE fließt und der dann "on" an FHEM sendet. Logischerweise hätte ich gedacht, es muss so angeschlossen sein, dass Strom zum KSE fließt wenn der Brenner an ist, dies hat aber nicht funktioniert, daher andersrum. Das Relais ist ein Wechsler, daher kein Problem. FHEM erstellt durch autocreate automatisch ein neues Device, definiert sieht es bei mir so aus:

define fs_boiler FS20 1be4 00
attr fs_boiler devStateIcon on:HeizungOn off:HeizungOff
attr fs_boiler dummy 1
attr fs_boiler eventMap on:off off:on
attr fs_boiler icon icoHEIZUNG
attr fs_boiler model fs20kse

Und der entsprechende Plot:

define FileLog_fs_boiler FileLog ./log/fs_boiler-%Y.log fs_boiler
attr FileLog_fs_boiler logtype fs20:Window,text
define weblink_fs_boiler weblink fileplot FileLog_fs_boiler:fs20:CURRENT

Die Icons für die Heizung habe ich irgendwo aus dem Forum, weiß allerdings nicht mehr welcher Thread.

So, nun wird zumindest schonmal dargestellt, wann die Heizung an oder aus ist. Um den Ölverbauch zu messen werden einige weitere Definitionen benötigt.

Zuerst ein notify:

define boiler_consumption notify fs_boiler {\
  if("$EVENT" eq "on") {\
   $data{boiler_last} = time();;\
  } elsif("$EVENT" eq "off") {\
   $data{boiler_min} = (time()-$data{boiler_last})/60*0.03626;;\
   fhem "trigger boiler_consumption $data{boiler_min}";;\
  }\
 }

Dieser berechnet aus der Differenz zwischen on und off Minutengenau den Verbrauch. Hierfür muss man wissen, welche Düse verbaut ist und was für einen Durchsatz sie hat. Unsere hat 2,5kg/Stunde Durchsatz (steht auf der Düse) dies habe ich in Liter umgerechnet (laut Wikipedia besitzt Heizöl eine Dichte von 0,820–0,860 kg/l [1]) und dies anschließend durch 60 geteilt um es als Liter/Minute darzustellen. Daher kommt der Wert 0.03626 im notify. Hierzu nun der Log und Plot:

define boiler_log FileLog ./log/boiler-%Y-%m.log boiler_consumption
define Oilconsumption weblink fileplot boiler_log:oil:CURRENT
attr Oilconsumption label sprintf("Consumption (l) today: %.2f total %.2f avg/h", $data{sum1}, ($data{sum1}/$hour))

Der Gplot-Syntax folgt gleich. Zuerst eine kurze Erklärung. Ich lasse im Label den Tagesverbrauch auf 2 Nachkommastellen gerundet sowie den aktuellen Durschnittsverbrauch Anzeigen. Leider funktioniert der Durschnittsverbrauch nur für den aktuellen Tag und nicht für vorherige, da immer durch die Aktuelle Stunde geteilt wird, bei vorherigen Tagen müsste aber durch 24 geteilt werden. Habe ich noch nicht geschafft. Die gplot für den Plot:

############################
# Display the oil consumption.
# 2012-12-24_14:48:31 boiler_consumption 0.2634893333
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set ytics
set y2tics
set title '<L1>'
set grid xtics y2tics
set y2label "Oilconsumption (l)"
set ylabel "Oilconsumption (l)"
#FileLog 3::0:
plot "<IN>" using 1:3 title 'Oilconsumption (l)' with lines

Das wärs für die Verbrauchsanzeige. Das meiste hiervon basiert auf verschiedene Beiträge aus dem Forum und google-groups.

Zur Kontrolle oder Alternativ kann man auch einen Betriebsstundenzähler programmieren:

define boiler_time notify fs_boiler {\
  if("$EVENT" eq "on") {\
   $data{boiler_last} = time();;\
  } elsif("$EVENT" eq "off") {\
   $data{boiler_min} = (time()-$data{boiler_last})/60;;\
   fhem "trigger boiler_time $data{boiler_min}";;\
  }\
 }
define boiler_time_log FileLog ./log/boiler_time-%Y-%m.log boiler_time

Hier lasse ich nur ein Log schreiben, ich benötige keinen Plot, müsste aber mit leichter Anpassung der oben stehenden gplot-Definition leicht zu bewerkstelligen.

Zusätzlich binde ich noch eine Grafik mit dem Ölpreisverlauf direkt von Tecson ein:

define Heizoel weblink image http://www.tecson.de/tl_files/pepesale/bilder_inhalt/_hoel.gif
attr Heizoel htmlattr width="551" height="594"

Links