Füllstandsanzeige: Unterschied zwischen den Versionen

Aus FHEMWiki
Keine Bearbeitungszusammenfassung
K (Anpassung an Fhem V5.7 (% -> $EVENT) + kleinere sonstige Korrekturen)
Zeile 1: Zeile 1:
{{Randnotiz|RNTyp=y|RNText=Die 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
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:
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:
Zeile 4: Zeile 5:
  <nowiki>define oil_level notify fs_boiler {\
  <nowiki>define oil_level notify fs_boiler {\
   $data{tank_level} = Value(&quot;tanklevel&quot;);;\
   $data{tank_level} = Value(&quot;tanklevel&quot;);;\
   if(&quot;%&quot; eq &quot;on&quot;) {\
   if(&quot;$EVENT&quot; eq &quot;on&quot;) {\
   $data{tank_last} = time();;\
   $data{tank_last} = time();;\
   } elsif(&quot;%&quot; eq &quot;off&quot;) {\
   } elsif(&quot;$EVENT&quot; eq &quot;off&quot;) {\
   $data{tank_level} -= (time()-$data{tank_last})/60*0.03626;;\
   $data{tank_level} -= (time()-$data{tank_last})/60*0.03626;;\
   fhem &quot;trigger oil_level $data{tank_level}&quot;;;\
   fhem &quot;trigger oil_level $data{tank_level}&quot;;;\
Zeile 12: Zeile 13:
   }\
   }\
  }</nowiki>
  }</nowiki>
Dieser Notify brechnet nach jeden Brennerlauf die Restmenge im Tank. Hierfür wird von der Variable $data{tank_level} der berechnete Verbrauch (siehe erwähnter Wiki EIntrag) abgezogen und anschließend im Dummy tanklevel gespeichert.
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:
Hieraus wird ein Plot generiert:
Zeile 38: Zeile 39:
plot &quot;&lt;IN&gt;&quot; using 1:3 title 'Oillevel (l)' with lines</nowiki>
plot &quot;&lt;IN&gt;&quot; using 1:3 title 'Oillevel (l)' with lines</nowiki>
Dummy tanklevel:
Dummy tanklevel:
<nowiki>define tanklevel dummy</nowiki>


<nowiki>define tanklevel dummy</nowiki>
Dummy, damit nur EINE eMail versandt wird:
Dummy, damit nur EINE eMail versandt wird:
<nowiki>define OilmailSent dummy</nowiki>


<nowiki>define OilmailSent dummy</nowiki>
Der eigentliche Warnnotify:
Der eigentliche Warnnotify:
  <nowiki>define oil_warning notify tanklevel {\
  <nowiki>define oil_warning notify tanklevel {\
  if($data{tank_level} &lt;= &quot;500&quot; &amp;&amp; Value(&quot;OilmailSent&quot;) ne &quot;true&quot;) {\
  if($data{tank_level} &lt;= &quot;500&quot; &amp;&amp; Value(&quot;OilmailSent&quot;) ne &quot;true&quot;) {\
Zeile 51: Zeile 51:
  }\
  }\
}</nowiki>
}</nowiki>
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 hierfür ein weiterer notify der bei mehr als 500 auslöst:
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:


  <nowiki>define oil_warning_off notify tanklevel {\
  <nowiki>define oil_warning_off notify tanklevel {\
Zeile 60: Zeile 61:
  }\
  }\
}</nowiki>
}</nowiki>
Nachdem dies alles in der Config eingegeben wurde, muss der Ausgangswert durch die Kommandozeile eingegeben werden:
 
Nachdem dies alles definiert wurde, muss der Ausgangswert über das Befehlsfeld eingegeben werden:


  <nowiki>{ $data{tank_level} = 3000 }</nowiki>
  <nowiki>{ $data{tank_level} = 3000 }</nowiki>
Ausgangswert 3000 Liter
Ausgangswert 3000 Liter


Dieser sollte idealerweise auch im Dummy übertragen werden (Kommandozeile):
Dieser sollte idealerweise auch in den Dummy übertragen werden (Befehlsfeld):
<nowiki>{ fhem &quot;set tanklevel $data{tank_level}&quot; }</nowiki>


<nowiki>{ fhem &quot;set tanklevel $data{tank_level}&quot; }</nowiki>
Ein weiterer Grund für den Dummy liegt darin, dass Fhem diesen Wert vor einem Neustart durch "save" speichert und nachher wieder lädt.
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):
Füllt man seinen Tank auf, kann man einfach den Lieferschein nehmen und diese Menge der Variable hinzufügen (in der Kommandozeile):
<nowiki>{ $data{tank_level} += 2500 }</nowiki>


<nowiki>{ $data{tank_level} += 2500 }</nowiki>
Auftanken von 2500 Liter
Auftanken von 2500 Liter


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Version vom 18. Februar 2016, 09:53 Uhr

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