Füllstandsanzeige

Aus FHEMWiki
Version vom 26. Januar 2017, 23:35 Uhr von Krikan (Diskussion | Beiträge) (FHEM(R))
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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: Der Heizöltank ist immer "unerwartet" leer Auf Basis meiner Ölverbrauchsanzeige / Betriebsstundenzähler habe ich eine Füllstandsanzeige mit Warnfunktion programmiert, der laufend den Tankinhalt misst und bei einem eingestellten Wert eine eMail verschickt:

define oil_level notify fs_boiler {\
   $data{tank_level} = Value("tanklevel");;\
  if("$EVENT" eq "on") {\
   $data{tank_last} = time();;\
  } elsif("$EVENT" eq "off") {\
   $data{tank_level} -= (time()-$data{tank_last})/60*0.03626;;\
   fhem "trigger oil_level $data{tank_level}";;\
   fhem "set tanklevel $data{tank_level}";;\
  }\
 }

Dieser notify berechnet nach jedem Brennerlauf die Restmenge im Tank. Hierfür wird von der Variable $data{tank_level} der berechnete Verbrauch abgezogen und anschließend im Dummy tanklevel gespeichert.

Hieraus wird ein Plot generiert:

define oil_log FileLog ./log/oil-%Y-%m.log oil_level
define Oillevel weblink fileplot oil_log:tank:CURRENT
attr Oillevel label sprintf("Current Oillevel (l): %.2f", $data{currval1})

Gplot:

############################
# Display the tank level.
# 2012-12-24_14:48:31 oil_level 1082.99740933331
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 "Oillevel (l)"
set ylabel "Oillevel (l)"
#FileLog 3::0:
plot "<IN>" using 1:3 title 'Oillevel (l)' with lines

Dummy tanklevel:

define tanklevel dummy

Dummy, damit nur EINE eMail versandt wird:

define OilmailSent dummy

Der eigentliche Warnnotify:

define oil_warning notify tanklevel {\
 if($data{tank_level} <= "500" && Value("OilmailSent") ne "true") {\
  system("/sbin/mailer -s 'Oiltank (l): $data{tank_level}'");;\
  fhem("set OilmailSent true");;\
 }\
}

Fällt der Wert unter 500, wird eine eMail versandt (hierfür den Push service in der Fritz!Box aktivieren) und der mail Dummy auf true gesetzt.

Damit man den Dummy nicht manuell wieder auf false stellen muss, wird hierfür ein weiterer notify angelegt, der bei mehr als 500 auslöst:

define oil_warning_off notify tanklevel {\
 if($data{tank_level} > "500" && Value("OilmailSent") ne "false") {\
  fhem("set OilmailSent false");;\
 }\
}

Nachdem dies alles definiert wurde, muss der Ausgangswert über das Befehlsfeld eingegeben werden:

{ $data{tank_level} = 3000 }

Ausgangswert 3000 Liter

Dieser sollte idealerweise auch in den Dummy übertragen werden (Befehlsfeld):

{ fhem "set tanklevel $data{tank_level}" }

Ein weiterer Grund für den Dummy liegt darin, dass FHEM diesen Wert vor einem Neustart durch "save" speichert und nachher wieder lädt.

Füllt man seinen Tank auf, kann man einfach den Lieferschein nehmen und diese Menge der Variable hinzufügen (in der Kommandozeile):

{ $data{tank_level} += 2500 }

Auftanken von 2500 Liter