Jeder Autofahrer unter euch hatte bestimmt schonmal das Problem, nicht zu wissen, ob es sich nun lohnt tanken zu fahren oder nicht. Zwar gibt es schon einige Online-Portale oder Apps, die einen über den aktuellen Benzinpreis informieren.
Aber wäre es nicht entspannter, einfach nur einen Blick auf das Tablet im Flur werfen zu müssen und direkt die Benzinpreise der Tankstellen in der Umgebung ablesen zu können? Oder bei einem niedrigen Preisniveau eine Art "Tankalarm" auf das Handy zu bekommen? Ich finde schon, deswegen werde ich euch in diesem Beitrag erklären, wie ihr die Preise der umliegenden Tankstellen in FHEM einbindet und übersichtlich darstellt. Des Weiteren zeige ich euch, wie ihr euch einen eigenen Tankalarm definiert und die Preise ansprechend in TabletUI anzeigen könnt.
Inhaltsverzeichnis
Vorbereitung
Die Einbindung erfolgt über das Hilfsmodul HTTPMOD. Mit Hilfe dieses Moduls lassen sich Daten aus dem Internet abfragen und für FHEM in Readings umwandeln. Die benötigten Benzinpreise werden davon vom Portal www.clever-tanken.de abgerufen.
Damit man auch die richtigen Daten bekommt, ist es notwendig, sich die ID der gewünschten Tankstelle herauszusuchen. Dazu einfach das Portal besuchen und über das Suchfeld die gewünschte Tankstelle heraussuchen. In der URL findet ihr nun die Tankstellen-ID:
http://www.clever-tanken.de/tankstelle_details/11133
In diesem Fall ist die Tankstellen-ID 11133. Wollt ihr mehrere Tankstellen in FHEM einbinde, dann sucht euch nun alle benötigten IDs raus.
Definition in FHEM
Wie oben schon erwähnt, erfolgt die Definition über das Hilfsmodul HTTPMOD. Benötigt wird dazu die Tankstellen-ID bzw. die URL.
define TankstelleOWM HTTPMOD http://www.clever-tanken.de/tankstelle_details/11133 600

Das definierte Hilfsmodul HTTPMOP liefert jedoch zunächst keine Daten. Damit man nun die gewünschten Werte erhält, sind einige Attribute notwendig. Um genau zu sein, definiert man sich nun durch das Attribut "userReadings" die Readings selbst.
attr TankstelleOWM group Benzinpreis;
attr TankstelleOWM icon gasoline;
attr TankstelleOWM alias OWM;
attr TankstelleOWM room Spritpreise;
attr TankstelleOWM readingsName_Diesel Diesel;
attr TankstelleOWM readingsName_SuperE5 SuperE5;
attr TankstelleOWM readingsRegex_Diesel <span>Diesel</span>[^0-9]+([0-9.]+);
attr TankstelleOWM readingsRegex_SuperE5 <span>Super E5</span>[^0-9]+([0-9.]+);
attr TankstelleOWM timeout 5;
Sollte die Tankstelle noch weitere Kraftstoffe anbieten, so lassen sich diese ebenfalls durch ein userReading hinzufügen. INFO: Es lassen sich mit diesem Vorgehen nur Kraftstoffe hinzufügen, welche mit <span> bzw. </span> arbeiten. Gekennzeichnet mit MTS unter dem Kraftstoffnamen.
attr TankstelleOWM readingsName_SuperE10 SuperE10
attr TankstelleOWM readingsRegex_SuperE10 <span>Super E10</span>[^0-9]+([0-9.]+)
Nicht-MTS-Kraftstoffarten (wie zum Beispiel Total Excellium Diesel) sind mit <div> abgeschlossen. Dies erfordert eine andere Definition des Reading-Attributs.
attr TankstelleWB readingsName__Total_Excellium_Diesel _Total Excellium Diesel
attr TankstelleWB readingRegex_Total_Excellium_Diesel <span>Total Excellium Diesel</div>[^0-9]+([0-9.]+)
Je nach Wunsch kann dann noch das stateFormat angepasst werden:
attr TankstelleOWM stateFormat {sprintf("Diesel: %.2f € - Super: %.2f € - E10: %.2f €",ReadingsVal("TankstelleOWM","Diesel",0),ReadingsVal("TankstelleOWM","SuperE5",0),ReadingsVal("TankstelleOWM","SuperE10",0))}
Da die oben aufgezählten Anweisungen noch auf eine alte Version des HTTPMOD-Moduls basieren, ist das Umstellen auf die neue Struktur notwendig. Dies geschieht über das Setzen eines Attributes und das anschließende updaten der Readings:
attr TankstelleOWM enableControlSet 1
set TankstelleOWM upgradeAttributes
Nun sollten die Spritpreise als Reading angezeigt werden.

Zum Schluss dann noch das stateFormat anpassen, damit in der Device-Übersicht die Preise direkt abgelesen werden können. Hier könnt ihr natürlich auch nur den von euch getankten Kraftstoff anzeigen lassen. Folgendes Attribut zeigt den Literpreis aller drei definierten Kraftstoffe an:
attr TankstelleOWM stateFormat {
sprintf("Diesel: %.2f € - Super: %.2f € - E10: %.2f €",
ReadingsVal("TankstelleOWM","Diesel",0),
ReadingsVal("TankstelleOWM","SuperE5",0),
ReadingsVal("TankstelleOWM","SuperE10",0))}

Um den Spritpreis vergleichen zu können, ist es natürlich sinnvoll sich mehrere Tankstellen aus der Umgebung zu definieren. Ich habe mir insgesamt vier Tankstellen in FHEM eingerichtet.

Einrichtung einer readingsGroup
Mit Hilfe einer readingsGroup lassen sich die Spritpreise noch ein bisschen komfortabler anzeigen. Dazu definieren wir uns eine readingsGroup mit vier Spalten - den Namen und je eine Spalte für Diesel, Super und E10.
define GroupSpritpreise readingsGroup
<Tankstelle>,<Diesel>,<Super>,<E10>
TankstelleOWM:Diesel,SuperE5,SuperE10
TankstelleREAL:Diesel,SuperE5,SuperE10
TankstelleESSO:Diesel,SuperE5,SuperE10
TankstelleARAL:Diesel,SuperE5,SuperE10
attr GroupSpritpreise room Spritpreise
Anschließend kann man sich daran machen, diese readingsGroup etwas visuell aufzupeppen.
attr GroupSpritpreise valueFormat {"%.2f €"}
attr GroupSpritpreise style style="font-size:18px"

Wer möchte kann dann noch über das Attribut "alias" die Überschrift der readingsGroup anpassen.
attr GroupSpritpreise alias Spritpreise
Statistik über die Spritpreise
Das Anzeigen der Spritpreise ist alleine gesehen schon eine coole Sache, aber interessant wird es erst, wenn man sich zusätzlich eine Art Tankalarm definiert.
Die Idee ist, dass man die Spritpreise über einen längeren Zeitpunkt beobachtet und bei einem Preisniveau unter den Durchschnittswerten sich eine Nachricht auf das Hnady zukommen lässt.
define SpritpreiseStatistik statistics Tankstelle.*
attr SpritpreiseStatistik minAvgMaxReadings Diesel,SuperE5,SuperE10
Absofort werden für die Readings Diesel, SuperE5 und SuperE10 der Minimal-, Maximal- und der Durchschnittswert von unterschiedlichen Zeiträumen ermittelt. Zur Verfügung steht ein Stunden-, Tages-, Monats- und Jahreszeitraum.

Diese Readings machen wir uns zu Nutzen und ermitteln daraus, ob es sich aktuell lohnt, tanken zu fahren. Damit wir jedoch mit diesen Readings arbeiten können, erstellen wir uns aus den Min-, Max- und Avg-Werten einzelne Readgings.
attr SpritpreiseStatistik singularReadings
Tankstelle.*:.*:(Min|Avg|Max):(Hour|Day|Month)
Absofort erhält man nun einzelne Readings für die ermittelten statistischen Werte. Nach einer gewissen Zeit beinhalten diese auch sinnvolle Werte. Die Monats-Werte brauchen natürlich etwas länger um sinnvolle Werte liefern zu können.

Tankalarm
INFO: Ich habe mit der Version 2.0 einen verbesserten Spritalarm erstellt, der mehr Einstellmöglichkeiten bietet --> Spritmonitor 2.0
Mit den oben erstellen statistischen Werte kann man sich nun einen eigenen Tankalarm definieren. Ich habe mir dazu ein kleine SubRoutine erstellt und rufe sie mit Hilfe eines Notifys auf.
Für die SzbRoutine werden folgende statistische Readings benötigt:

Mit diesen drei Readings habe ich mir einen kleinen "Abfragemarathon" erstellt um herauszufinden, ob es momentan sinvoll ist zu tanken. Dabei habe ich den aktuellen Spritpreis genommen und mit den Stunden-, Tages- und Monatsdurchschnittswerten verglichen. Um das Ergebnis dieser Abfrage zu bewerten, habe ich mir ein Bewertungssystem überlegt.
Ergebnis | Bewertung |
---|---|
größer aller Durchschnittswerte | |
kleiner als Stundendurchschnitt | |
kleiner als Tagesdurchschnittswert | |
kleiner als Stunden- und Tagesdurchschnittswert | |
kleiner als Monatsdurchschnittswert | |
kleiner als Stunden- und Monatsdurchschnittswert | |
kleiner als Tages- und Monatsdurchschnittswert | |
kleiner als Stunde,- Tages- und Monatsdurchschnittswert |
Im Grunde baut das Bewertungsystem auf eine unterschiedliche Bewertung der Durchschnittswerte auf. Ein aktueller Preis kleiner als der Stundendurchschnittswert ist nicht so viel wert, wie das Unterschreiten des Tagesdurchschnittswertes. Ein Unterschreiten des Monatsdurchschnittswertes ist dabei natürlich noch besser. Weiter besser wird es entsprechend bei einer Kombination.
Natürlich lässt sich auch ein anderes Bewertungssystem aufbauen. Des Weiteren lassen sich auch die Max- und Minwerte anstelle der Durchschnittswerte nehmen. Wer also ein anderes Bewertungssystem bevorzugt, kann dieses mir gerne in den Kommentaren wissen lassen. Ich bin für jede Möglichkeit offen.
Die dazu benötigte SubRoutine wird einfach in die "99_myUtils.pm" eingetragen. Achtet beim Erstellen der Datei, dass sie in der richtigen Formatierung angelegt wird. Benötigt wird eine Datei im UTF-8 Format. Andernfalls gibt es Darstellungsfehler bei den Sternen und dem Euro-Zeichen.
sub Tankalarm($$) {
# Variablen definieren
my ($Tankstelle, $Kraftstoff) = @_;
my $ALIAS = AttrVal($Tankstelle,"alias",$Tankstelle);
my $aktuell = ReadingsVal("$Tankstelle","$Kraftstoff",0);
my $alt = ReadingsVal("$Tankstelle","Backup",0);
my $stunde = "stat".$Kraftstoff."HourAvg";
my $tag = "stat".$Kraftstoff."DayAvg";
my $monat = "stat".$Kraftstoff."MonthAvg";
my $hourAVG = ReadingsVal("$Tankstelle","$stunde",0);
my $dayAVG = ReadingsVal("$Tankstelle","$tag",0);
my $monthAVG = ReadingsVal("$Tankstelle","$monat",0);
my $msg = 0;
if($aktuell != $alt)
{
if($aktuell < $hourAVG)
{
if($aktuell < $dayAVG)
{
if($aktuell < $monthAVG)
{$msg = "$ALIAS: ★★★★★ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Stunden- ($hourAVG €), Tages- ($dayAVG €) und Monatsdurchschnitt ($monthAVG €)";}
else
{$msg = "$ALIAS: ★★★☆☆ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Stunden- ($hourAVG €) und Tagesdurchschnitt ($dayAVG €)";}
}
else
{
if($aktuell < $monthAVG)
{$msg = "$ALIAS: ★★★★☆ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Stunden- ($hourAVG €) und Monatsdurchschnitt ($monthAVG €)";}
else
{$msg = "$ALIAS: ★☆☆☆☆ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Stundendurchschnitt ($hourAVG €)";}
}
}
else
{
if($aktuell < $dayAVG)
{
if($aktuell < $monthAVG)
{$msg = "$ALIAS: ★★★★☆ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Tages- ($dayAVG €) und Monatsdurchschnitt ($monthAVG €)";}
else
{$msg = "$ALIAS: ★★☆☆☆ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Tagesdurchschnitt ($dayAVG €)";}
}
else
{
if($aktuell < $monthAVG)
{$msg = "$ALIAS: ★★★☆☆ - $Kraftstoff: $aktuell € - Aktueller Spritpreis liegt unter dem Monatsdurchschnitt ($monthAVG €)";}
else
{$msg = "$ALIAS: ☆☆☆☆☆ - $Kraftstoff: $aktuell € - Kraftstoff aktuell sehr teuer";}
}
}
}
else
{$msg = "keineAenderung";}
fhem("setreading $Tankstelle Backup $aktuell");
return $msg;
}
Der SubRoutine wird das Tankstellen-Device ($Tankstelle) und der zu überwachende Kraftstoff ($Kraftstoff) übergeben. Anschließend werden einige Variablen definiert. Zum Einen die Variablen "stunde,tag,monat" erhalten den Namen der benötigten Readings. Zum Anderen die Variablen "hourAVG,dayAVG,monthAVG", welche die benötigten Readings beinhalten - z.B. für SuperE10: statSuperE10HourAVG, statSuperE10DayAVG, statSuperE10MonthAVG.
Zuerst wird nun überprüft, ob der aktuelle Kraftstoffpreis unterschiedlich zum vorherigen Preis ($alt) ist. Ist dies der Fall, wird in den darauf folgenden if-Abfragen die Variable "msg" mit der entsprechenden Nachricht beschrieben.
Liegt keine Preisänderung vor, so wird die Nachricht auf "keineAenderung" gesetzt.
Zum Schluss wird dann noch der aktueller Preis als Backup in das entsprechende Tankstellen-Device geschrieben und die Nachricht als Rückgabewert zurückgegeben.
Das Aufrufen der SubRoutine erfolgt nun über ein Notify, welches bei einer Preisänderung auslöst.
define SpritkostenNotify notify Tankstelle.*:SuperE10:.* {
my $Nachricht = Tankalarm("$NAME","SuperE10");
if($Nachricht ne "keineAenderung"){
fhem("set Telegram message $Nachricht");}
}
Dieses Notify löst jetzt bei einer Preisänderung des Kraftstoffes "SuperE10" aus. Überwacht werden dabei alle Tankstellen-Devices (Tankstelle.*). Der überwachte Kraftstoff kann natürlich je nach Wunsch angepasst werden.

Beim Auslösen wird dann die SubRoutine aufgerufen und die Variable "Nachricht" mit der entsprechenden Nachricht beschrieben. Liegt eine Tankempfehlung vor, so wird über Telegram der Tankalarm gesendet. Hier lassen sich natürlich auch andere Kommunikationswege einsetzen. Bei der oben beschriebenen Definition des Notify-Devices muss dem Telegram-Device die Empfänger-ID mitgeteilt werden:
attr Telegram defaultPeer 24xxxxxxx
Wurde alles definiert, erhält man absofort eine Nachricht über Telegram, ob es sich aktuell lohnt, tanken zu fahren. Es kann ein paar Tagen dauern bis die Durchschnittswerte aussagekräftig werden. Erst recht die Monatsdurchschnittswerte brauchen ein paar Tage bis sich ein aussagekräftiger Wert gebildet hat.

Der eingerichtete Tankalarm kann natürlich auch getestet werden. Dazu einfach über "setreading" den Preis für SuperE10 manuell auf einen niedrigen Wert festlegen.
setreading TankstelleESSO SuperE10 1.10
Da der Literpreis von 1.10 höchstwahrscheinlich alle Durchschnittswerte unterbietet, solltet ihr nun eine 5-Sterne-Tankempfehlung auf euer Handy bekommen. Beim nächsten Aktualisieren der Spritpreise wird der manuell gesetzte Wert wieder durch den richtigen Wert überschrieben. Wer möchte, kann die Aktualisierung auch manuell starten:
set TankstelleESSO reread
Manuelles Abfragen der Preissituation
Neben dem automatischen Tankalarm, kann man sich eine kleine SubRoutine schreiben, um auch ein manuelles Abfragen der Preissituation über Telegram zu ermöglichen. Dazu einfach in der "99_myUtils.pm" eine weitere SubRoutine erstellen.
sub Telegram($$) { my ($Device, $msgText) = @_; my $Nachricht = ReadingsVal($Device,$msgText,"0"); my @array = split(/ /,$Nachricht); if(@array[0] eq "Spritkosten") { my $Device = "Tankstelle".@array[1]; my $aktuell = ReadingsVal("$Device","@array[2]",0); fhem("set Telegram message Aktueller Preis für @array[2] an der @array[1]-Tankstelle: $aktuell €"); }
}
Damit die erstellte SubRoutine auch die empfangene Nachricht erhält, ist das Definieren eines weiteren Notifys nötig:
define TelegramNotify notify Telegram:msgText:.* { Telegram("Telegram","msgText")}
Der SubRoutine "Telegram" wird nun beim Empfangen einer Nachricht der Inhalt dieser übergeben. Innerhalb der Routine wird der empfangende Nachrichtenstring aufgeteilt und in ein Array abgespeichert. Das erste Wort beinhaltet das Steuerungswort "Spritkosten". Das zweite Wort dann die gewünschte Tankstelle und das dritte den gewünschten Kraftstoff. So lassen sich zum Beispiel durch senden der Nachricht "Spritkosten ESSO SuperE10 der entsprechende Preis ausgeben.

Nachrichten nur zu bestimmten Zeiten
Wem die vielen Nachrichten etwas nerven, bzw. nur welche zu bestimmten Zeitpunkten haben möchte, der kann natürlich das Notify nur zu bestimmten Zeitpunkten aktivieren. Dazu kann man sehr gut den WeekdayTimer verwenden, mehr dazu auf meinem Blogbeitrag zum Modul.
define TimerSprit WeekdayTimer SpritkostenNotify Mo-Fr|16:00|active Mo-Fr|19:00|inactiv
Jetzt wird das Notify, welches für das Versenden der Nachrichten verantwortlich ist, nur von Montag bis Freitag zwischen 16 und 19 Uhr aktiviert. Außerhalb dieser Zeiträume ist es deaktiviert und versendet somit keine Nachrichten.
Spritmonitor in TabletUI einbinden
Neben der readingsGroup und dem Tankalarm lässt der Spritmonitor auch im alternativen FrontEnd TabletUI einbinden.
Der Aufbau ist im Grunde nichts anderes als eine Tabelle. Ähnlich wie ich sie bereits im Abfahrtsmonitor verwende. Den benötigten Code könnt ihr auf meinem Blog-Beitrag über mein TabletUI nachlesen.

Ich hoffe ich konnte euch das Einrichten eines Tankalarms verständlich erklären und euch inspirieren diesen selber umzusetzen. Wie oben schon erwähnt, solltet ihr für das Bewertungssystem eine bessere Idee haben, so lasst sie mir diese gerne über die Kommentare zukommen.
Hinterlasse einen Kommentar
51 Kommentare auf "Spritpreismonitor und Tankalarm – Spritpreise der Umgebung per FHEM überwachen"
Hallo Daniel
Wenn man noch wissen möchte wann die letzte Preisänderung war.
attr TankstelleOWM readingsName_aktZeit aktZeit
attr TankstelleOWM readingsRegex_aktZeit Letzte MTS-K Preisänderung: ((31|30|[012]\d|\d)\.(0\d|1[012]|\d)\.(\d{1,6}) ([01]?\d|2[0-3]):([0-5]?\d))
vielleicht für einige interesant.
Gruß Peter
Hey Daniel,
hab deine Anleitung nachgebaut. Danke erstmal.
Dabei sind mir zwei kleine Fehler aufgefallen:
Bei define SpritkostenNotify
fehlt einmal das Wort notify und
bei attr SpritpreiseStatistik minAvgMaxReadings Diesen,SuperE5,SuperE10
sollte es wohl Diesel und nicht Diesen heißen
Gruß
Gordon
Einen hab ich noch gefunden:
Das define
define SpritkostenNotify Tankstelle.*:SuperE10:.* {
my $Nachricht = Tankalarm("$NAME","SuperE10");
if($Nachricht ne "keineAenderung"){
fhem("set Telegram message $Nachricht");}
}
braucht am Ende noch eine geschweifte Klammer mehr.
Hallo Gordon,
das mit der fehlende Klammer sehe ich jetzt nicht. Da passt doch alles. Einmal die offene Klammer nach SuperE10:.* und die nach der if-Abfrage. Am Ende werden beide dann wieder geschlossen.
Zweimal also offene geschweifte Klammer und dann zweimal wieder schließen. Oder übersehe ich etwas?
Gruß Daniel
Stimmt da hab ich mich verguckt…
Hallo Gordon,
Danke für den Hinweis, habe es im Beitrag verbessert.
Gruß Daniel
Hallo,
habe gerade gesehen, dass in deiner Routine einige falschen „Gänsefüßchen“ sind. Kann sein, dass dies nur aufgrund der Formatierung im Kommentarfeld so ist, aber überprüf das nochmal.
Es muss immer ein
"
. Manchmal hast du „ oder “ –> wie zum Beispiel: my $aktuell = ReadingsVal(„$Tankstelle“,“$Kraftstoff“,0);Richtig ist:
my $aktuell = ReadingsVal("$Tankstelle","$Kraftstoff",0);
Gruß Daniel
DANKE DIR VORAB! Bin hier etwas am verzweifeln.
Hallo Daniel,
Danke für die schnelle Antwort. Die Gänsefüßchen sind richtig. Das scheint im Kommentarfeld falsch formatiert zu sein. Wenn ich die Subrountine teste, bekomme ich folgende Meldung:
Undefined subroutine &main::Tankalarm called at (eval 24818) line 1.
Also scheint hier wohl schonmal was falsch zu sein. Sorry, aber ich bin noch Anfänger und kenne mich da noch nicht so aus.
LG
Tobias
Ok, dann haben wir ja schon mal den Ort des Fehlers eingeschränkt,
habe nochmal deine Routine angeschaut. Du hast ja die Variablen geändert:
my $stunde = "stat".$Kraftstoff."statSuperE5HourAvg";
my $tag = "stat".$Kraftstoff."statSuperE5DayAvg";
my $monat = "stat".$Kraftstoff."statSuperE5MonthAvg";
my $hourAVG = ReadingsVal("$Tankstelle","$statSuperE5Hour",0);
my $dayAVG = ReadingsVal("$Tankstelle","$statSuperE5Day",0);
my $monthAVG = ReadingsVal("$Tankstelle","$statSuperE5Month",0);
Das muss wie folgt heißen:
my $stunde = "stat".$Kraftstoff."HourAvg";
my $tag = "stat".$Kraftstoff."DayAvg";
my $monat = "stat".$Kraftstoff."MonthAvg";
my $hourAVG = ReadingsVal("$Tankstelle","$stunde",0);
my $dayAVG = ReadingsVal("$Tankstelle","$tag",0);
my $monthAVG = ReadingsVal("$Tankstelle","$monat",0);
Die erstellten Readings heißen dann wie folgt: „statSuperE5HourAvg“ –> Zusammensetzung aus stat+$Kraftstoff+HourAvg
Bei dir würden die Readings wie folgt lauten: „statSuperE10statSuperE5HourAvg“ — Zusammensetzung aus stat+$Kraftstoff+statSuperE5HourAvg
Gruß Daniel
Hallo Daniel,
danke erst mal für die gute Anleitung. Wollte nun auch Autogas einbinden.
wie wäre der Regex für Autogas?
z.B. bei folgender Tankstelle:
http://www.clever-tanken.de/tankstelle_details/35621
über diese Syntax wird es nicht erkannt: Autogas[^0-9]+([0-9.]+)
Danke
Gruß
Alex
Hallo Alex,
habe es mal probiert, auch mit anderen Tankstellen und Kraftstoffen. So wie es aussieht, lassen sich nur Kraftstoffe einbinden, welche über die MTS-K Schnittstelle bereitgestellt werden. Diese sind durch eine entsprechende Kennzeichnung unter dem Namen des Kraftstoffes erkennbar.
Gruß Daniel
Hallo Daniel.
Vielen Dank für die schnelle Antwort.
Schön das Dir die Idee gefällt, mußt sie aber nicht sofort umsetzen. Ich bin schon froh, das diese Erweiterung in Erwägung gezogen wird.
Auch Dir, und Euch anderen, ein schönes Wochenende.
Gruß,
Friedhelm.
Hallo Daniel.
Den Beitrag hab ich erst auf den zweiten Blick gefunden und habs gleich ausprobiert.
Ich muß sagen: PERFEKT !!! SUPER !!! DANKE !!!
Genau das was ich wollte. Jetzt sieht man auf einen Blick, welche Tankstelle die günstigste ist.
Ich persönlich bin mit dem Ergebnis sehr zufrieden. Ich bin mal gespannt was passiert, wenn zwei Tankstellen denselben Preis haben.
Nochmals vielen Dank für die Lösung.
Gruß,
Friedhelm.
Hallo Daniel.
Wenn alle Tankstellen den gleichen billigen Preis haben, werden sie alle grün.
PERFEKT !!!
Da muß man nix mehr verändern.
Gruß,
Friedhelm.
Das freut mich 😉
Hallo Daniel,
hier die abgewandelte Routine:
sub lowestprice($)
{
my ($Kraftstoff) = @_;
my @Tankstellen = devspec2array("NAME=Tankstelle.*");
my @Kraftstoffpreise = ();
foreach(@Tankstellen){
my $Kraftstoffpreis = ReadingsVal("$_",$Kraftstoff,0);
push (@Kraftstoffpreise,$Kraftstoffpreis);
}
my $minKraftstoffpreis = (sort @Kraftstoffpreise)[0];
return $minKraftstoffpreis;
}
Dann ist auch das attr GroupSpritpreise valueStyle anzupassen
attr GroupSpritpreise valueStyle { if($READING eq "SuperE5" && $VALUE eq lowestprice("SuperE5")) { 'style="color:green"' }elsif($READING eq "SuperE10" && $VALUE eq lowestprice("SuperE10")) { 'style="color:green"' }elsif($READING eq "Diesel" && $VALUE eq lowestprice("Diesel")) { 'style="color:green"' } }
Gruß
Gordon
Hallo Daniel.
Wer beim Benzinpreis die obligatorische „9“ am Schluß haben möchte, muß folgendes ändern:
attr TankstelleOWM stateFormat {
sprintf("Diesel: %.2f € - Super: %.2f € - E10: %.2f €",
ReadingsVal("TankstelleOWM","Diesel",0),
ReadingsVal("TankstelleOWM","SuperE5",0),
ReadingsVal("TankstelleOWM","SuperE10",0))}
in
attr TankstelleOWM stateFormat {
sprintf("Diesel: %.2f9 € - Super: %.2f9 € - E10: %.2f9 €",
ReadingsVal("TankstelleOWM","Diesel",0),
ReadingsVal("TankstelleOWM","SuperE5",0),
ReadingsVal("TankstelleOWM","SuperE10",0))}
Statt 1.10 € wird dann 1.109 € angezeigt.
Auch bei der readingsGroup muss folgendes geändert werden:
attr GroupSpritpreise valueFormat {"%.2f €"}
in
attr GroupSpritpreise valueFormat {"%.2f9 €"}
Auch hier wird statt 1.10 € dann 1.109 € angezeigt.
Gruß,
Friedhelm.
Hallo Friedhelm,
am einfachsten geht das über eine readingsGroup. Die Definition ist dann zum Beispiel wie folgt:
define GroupSpritpreiseStatistik readingsGroup
,,
TankstelleOWM:statDieselDay,statSuperE5Day
TankstelleREAL:statDieselDay,statSuperE5Day
TankstelleESSO:statDieselDay,statSuperE5Day
Das würde jetzt eine readingsGruppe erstellen mit den ganzen Tankstellen und die Tages-Statistik-Werte der Kraftstoffe. Ich persönlich würde dann für jeden Zeitraum eine eigene Gruppe erstellen – Tag, Monat, Jahr.
Gruß Daniel
Hallo Daniel.
Vielen Dank für die Hilfe bzw. Info.
Gruß,
Friedhelm.
Hallo, erstmal vielen Dan k für die vielen schönen Ideen und Anleitungen.
Ich habe leider ein Problem beim „SpritkostenNotify“.
Das manuelle Aufrufen klappt.
Beim Anlegen des notify habe ich schon einige „Schreibweisen“ versucht.
So kommt z.B. die Fehlermeldung: Unknown module Tankstelle.*:SuperE10:.*
Eigentlich habe ich mich komplett an der Anleitung orientiert. ;-(
Hallo Jens,
auf den ersten Blick würde ich sagen, dass du das „notify“ beim Definieren vergessen hast.
define SpritkostenNotify notify Tankstelle.*:SuperE10:.* {...
Es wird also ein Device vom Typ „notify“ erstellt. So wie es aussieht hast du es wie folgt definiert:
define SpritkostenNotify Tankstelle.*:SuperE10:.* {
Deswegen will er ein Device vom Typ Tankstelle.*:SuperE10:.*
erstellen. Was natürlich eine Fehlermeldung zur Folge hat.
Du kannst auch sonst erstmal ein „Rohling“ definieren:
define SpritkostenNotify notify a b
Und dann über den DEF-Editor die finale Definition eintragen.
Gruß Daniel
Danke für die schnelle Hilfe!
Hab glatt das „notify“ vergessen 😉
Hallo Daniel,
vielen Dank für das tolle HowTo, das hat alles wunderbar funktioniert, jetzt bin ich allerdings noch Anfänger was FHEM angeht, vllt. deshalb meine Frage:
Gibt es die Möglichkeit, das Skript nur zu bestimmten Zeiten ausführen zu lassen? z.B. in der Woche von 16:00 – 19:00 Uhr? (Tanke meist nach Feierabend)
Gibt es alternativ die Möglichkeit, KEINE Benachrichtigung über eine Verschlechterung des Spritpreises zu bekommen? Wenn das Benzin in der Woche Spät Abends oder früh Morgens deutlich teurer wird, benötige ich idR keine Info.
Vielen Dank für deine Hilfe
viele Grüße
Sebastian
Hallo Daniel,
das ist super nett von DIr, dass du dir das anguckst, das mit dem define Timer probiere ich mal aus. Vielen Dank schonmal im Voraus, ich freue mich schon jetzt auf die größere Flexibiltät beim Einstellen der Zeiten und der Alarme.
Ich wünsche dir ein schönes langes Wochenende!
Viele Grüße
Sebastian
Hallo,
ich habe nun eine zweite Version des Spritmonitors erstellt. Sie bietet einige mehr Funktionen und lässt sich besser individualisieren.
Nach wochenlanger Testphase glaube ich, dass sie nun stabil genug läuft um sie der „große Masse“ vorzustellen.
–> Spritmonitor 2.0
Gruß Daniel
Hallo Peer,
die Sache mit dem „Spamming“ bzw. die Anzahl an Nachrichten werde ich mir am Wochenende mal zu Gemüte führen. Will das irgendwie so hinbekommen, dass man relativ simpel konfigurieren kann wann und wie viel Nachrichten man bekommen möchte. Da kommt das lange Wochenende gerade richtig 😉
Die Sache mit den Log-Einträgen müsstest du mit folgenden Befehlen hinbekommen:
attr Tankstelle_aral enableControlSet 1
set Tankstelle_aral upgradeAttributes
Das Aktualisiert den Syntax der Readings.
Gruß Daniel
Moin Moin
Leider komme ich beim erstellen des notify nicht weiter
ich gebe das oben in der Befehlleiste FHEM ein :
define SpritkostenNotify notify Tankstelle.*:SuperE10:.* { my $Nachricht = Tankalarm(„$NAME“,“SuperE10″); if($Nachricht ne „keineAenderung“){ fhem(„set teleBot message $Nachricht“);} }
und bekomme diese Fehlermeldung:
Missing right curly or square bracket at (eval 31371) line 1, at end of line
syntax error at (eval 31371) line 1, at EOF
Unknown command if($Nachricht, try help.
Unknown command }, try help.
was übersehe ich, wo liegt der fehler?
Vielleicht kannst du mir ja weiterhelfen, oder jemand anderes? 🙂
Gruß
Sven
Hallo Sven,
der Befehl sieht auf den ersten Blick richtig aus. Versuch einfach mal erstmal das Notrify als Rohling anzulegen:
define SpritkostenNotify notify a b
und dann über den DEF-Editor die finale Definition eintragen.
Gruß Daniel
klasse danke das hat funktioniert
Hallo,
ich habe heute den Spritpreismonitor integriert.
Da ich keine Benachrichtigung brauche habe ich auch nur die erste Version übernommen. Jetzt wollte ich mit Hilfe des Statistikmodul die Tendenz auslesen und in der TabletUI mittels Klimatrend anzeigen.
Nur leider werden die Tendenzen nicht als Reading angelegt.
Hallo Daniel,
wo definiere ich denn das SpritkostenNotify am besten? Wenn ich es in der FHEM GUI oben in die Kommandozeile kopiere kommt folgende Fehlermeldung:
Missing right curly or square bracket at (eval 115) line 1, at end of line
syntax error at (eval 115) line 1, at EOF
Unknown command if($Nachricht, try help.
Unknown command }}, try help.
Hallo Holger,
FHEM hat manchmal Probleme wenn man ein Definition über die Eingabezeile macht, wenn die Definition über mehrer Zeilen geht. Also entweder die komplette Definition erstmal in ein Rexreditor kopieren und alle Zeilenumbrüche entfernen oder erstmal nur als Platzhalter definieren:
define SpritkostenNotify notify a b
und dann über den DEF-Editor die Definition anpassen:
Tankstelle.*:SuperE10:.* {
my $Nachricht = Tankalarm("$NAME","SuperE10");
if($Nachricht ne "keineAenderung"){
fhem("set Telegram message $Nachricht");}
}
Gruß Daniel
Das hat sich erledigt. Geht nur um die darunter geschriebenen Einträge im Log.
Hallo Marcel,
so wie es aussieht hat es etwas mit den Sternen in der Nachricht zu tun.
message text must be encoded in UTF-8:) for msg 200003307 : Tankstelle: ????? - SuperE5: 1.10 � - Aktueller Spritpreis liegt unter dem Stunden- (1.31 �), Tages- (1.31 �) und Monatsdurchschnitt (1.31 �)
Nach „Tankstelle:“ müsste ja dann die Sternebewertung stehen. Und die Euro-Zeichen gehen wohl auch nicht.
Teste mal ob du ganz normal eine Telegram-Nachricht mit diesen Zeichen senden kannst.
set Telegram message ★★★☆☆ - €
Gruß Daniel
Okay, ich hab es. Es lag an WinSCP – welcher die Datei 99_myUtils.pm in 1252 ANSI angelgegt hat. Ist mir grade aber nur durch Zufall aufgefallen. Neue Datei in UTF-8 erstellt und nun klappt die Benachrichtigung.
Hallo Marcel,
puhhhh, da wäre ich auch nie drauf gekommen 😄 aber gut zu wissen. Werde es im Beitrag erwähnen, dass man beim Erstellen der Datei darauf achten sollte.
Gruß Daniel