Spritpreismonitor: Unterschied zwischen den Versionen
Rince (Diskussion | Beiträge) K (→Code für fhem) |
DeeSPe (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
(49 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Die hier vorgestellten Geräte-Definitionen ermöglichen es, mit Hilfe von [[HTTPMOD]] bei [http://www.clever-tanken.de clever-tanken.de] die Kraftstoffpreise von gewünschten Tankstellen zu protokollieren. Die Credits dafür gehen an Forum-Benutzer {{Link2FU|1774|Phil__}}. Die Original Diskussion im Forum ist {{Link2Forum|Topic=22554|Message=210795|LinkText=hier}}. | |||
Alternativ dazu können die Kraftstoffpreise auch über die Webseite [https://www.tankerkoenig.de tankerkoenig.de] bezogen werden. Die Vorgehensweise dafür ist im Detail in [http://www.cyberwulf.de/2016/fhem-spritpreise-von-tankerkoenig-de/ diesem Blog] beschrieben. | |||
== Einleitung == | |||
Im Folgenden wird mit Hilfe des Moduls HTTPMOD der Kraftstoffpreis von ausgewählten Tankstellen abgerufen. Die Daten werden [[Regulärer Ausdruck|gefiltert]], gespeichert und als Diagramm aufbereitet. | |||
Im | |||
Zum Nachbau ist es erforderlich, die persönlich gewünschten Tankstellen bei Clever-Tanken zu suchen. Jede Tankstelle hat eine eigene Nummer: | |||
Zum Nachbau ist es erforderlich, | :<code>/tankstelle_details/0815</code> | ||
< | |||
Die 600 in den Beispielen gibt das Abrufintervall in Sekunden an. | Die ''600'' in den Beispielen gibt das Abrufintervall in Sekunden an. | ||
== Konfiguration == | |||
Die erforderlichen Definitionen in der FHEM [[Konfiguration]] bestehen aus mehreren Teilen. Zunächst die erforderlichen Einstellungen um die Daten der gewünschten Tankstellen abzuholen. | |||
Beispielkonfiguration für eine Shell Tankstelle inkl. Sondersorten: | |||
<pre> | <pre> | ||
define | define Tankstelle_Shell HTTPMOD http://www.clever-tanken.de/tankstelle_details/4871 600 | ||
attr | attr Tankstelle_Shell enableControlSet 1 | ||
attr | attr Tankstelle_Shell reading01Name Diesel | ||
attr | attr Tankstelle_Shell reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr | attr Tankstelle_Shell reading02Name SuperE5 | ||
attr | attr Tankstelle_Shell reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr Shell | attr Tankstelle_Shell reading03Name SuperE10 | ||
attr | attr Tankstelle_Shell reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr | attr Tankstelle_Shell reading04Name SuperPlus | ||
attr | attr Tankstelle_Shell reading04Regex "price-type-name">SuperPlus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr Tankstelle_Shell reading05Name ShellVPowerRacing | |||
attr Tankstelle_Shell reading05Regex "price-type-name">Shell.V-Power.Racing<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Shell reading06Name ShellVPowerDiesel | |||
attr Tankstelle_Shell reading06Regex "price-type-name">Shell.V-Power.Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Shell reading07Name street | |||
attr Tankstelle_Shell reading07Regex "streetAddress">(.*)< | |||
attr Tankstelle_Shell reading08Name zip | |||
attr Tankstelle_Shell reading08Regex "http://schema.org/postalCode">(.*)< | |||
attr Tankstelle_Shell reading09Name city | |||
attr Tankstelle_Shell reading09Regex "http://schema.org/addressCountry">(.*)< | |||
attr Tankstelle_Shell readingOExpr $val =~ s/<[\d\D]+>//;;$val | |||
attr Tankstelle_Shell stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel | |||
attr Tankstelle_Shell timeout 10 | |||
</pre> | |||
Beispielkonfiguration für eine Total Tankstelle: | |||
<pre> | |||
define Tankstelle_Total HTTPMOD http://www.clever-tanken.de/tankstelle_details/4870 600 | |||
attr Tankstelle_Total enableControlSet 1 | |||
attr Tankstelle_Total reading01Name Diesel | |||
attr Tankstelle_Total reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Total reading02Name SuperE5 | |||
attr Tankstelle_Total reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Total reading03Name SuperE10 | |||
attr Tankstelle_Total reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Total reading04Name SuperPlus | |||
attr Tankstelle_Total reading04Regex "price-type-name">Total.Excellium.Super.Plus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Total reading05Name street | |||
attr Tankstelle_Total reading05Regex "streetAddress">(.*)< | |||
attr Tankstelle_Total reading06Name zip | |||
attr Tankstelle_Total reading06Regex "http://schema.org/postalCode">(.*)< | |||
attr Tankstelle_Total reading07Name city | |||
attr Tankstelle_Total reading07Regex "http://schema.org/addressCountry">(.*)< | |||
attr Tankstelle_Total readingOExpr $val =~ s/<[\d\D]+>//;;$val | |||
attr Tankstelle_Total stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel | |||
attr Tankstelle_Total timeout 10 | |||
</pre> | |||
define | Beispielkonfiguration für eine Aral Tankstelle inkl. Sondersorten: | ||
attr | <pre> | ||
attr | define Tankstelle_Aral HTTPMOD http://www.clever-tanken.de/tankstelle_details/4869 600 | ||
attr | attr Tankstelle_Aral enableControlSet 1 | ||
attr | attr Tankstelle_Aral reading01Name Diesel | ||
attr | attr Tankstelle_Aral reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr | attr Tankstelle_Aral reading02Name SuperE5 | ||
attr | attr Tankstelle_Aral reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr | attr Tankstelle_Aral reading03Name SuperE10 | ||
attr | attr Tankstelle_Aral reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr Tankstelle_Aral reading04Name Ultimate102 | |||
attr Tankstelle_Aral reading04Regex "price-type-name">ARAL.Ultimate.102<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Aral reading05Name UltimateDiesel | |||
attr Tankstelle_Aral reading05Regex "price-type-name">ARAL.Ultimate.Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Aral reading06Name street | |||
attr Tankstelle_Aral reading06Regex "streetAddress">(.*)< | |||
attr Tankstelle_Aral reading07Name zip | |||
attr Tankstelle_Aral reading07Regex "http://schema.org/postalCode">(.*)< | |||
attr Tankstelle_Aral reading08Name city | |||
attr Tankstelle_Aral reading08Regex "http://schema.org/addressCountry">(.*)< | |||
attr Tankstelle_Aral readingOExpr $val =~ s/<[\d\D]+>//;;$val | |||
attr Tankstelle_Aral stateFormat E5: SuperE5, E10: SuperE10, SP: Ultimate102, D: Diesel | |||
attr Tankstelle_Aral timeout 10 | |||
</pre> | |||
Beispielkonfiguration für eine Esso Tankstelle inkl. Sondersorten: | |||
<pre> | |||
define Tankstelle_Esso HTTPMOD http://www.clever-tanken.de/tankstelle_details/17413 600 | |||
attr Tankstelle_Esso enableControlSet 1 | |||
attr Tankstelle_Esso reading01Name Diesel | |||
attr Tankstelle_Esso reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Esso reading02Name SuperE5 | |||
attr Tankstelle_Esso reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Esso reading03Name SuperE10 | |||
attr Tankstelle_Esso reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Esso reading04Name SuperPlus | |||
attr Tankstelle_Esso reading04Regex "price-type-name">Esso.Superplus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Esso reading05Name Autogas | |||
attr Tankstelle_Esso reading05Regex "price-type-name">Autogas<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Esso reading06Name street | |||
attr Tankstelle_Esso reading06Regex "streetAddress">(.*)< | |||
attr Tankstelle_Esso reading07Name zip | |||
attr Tankstelle_Esso reading07Regex "http://schema.org/postalCode">(.*)< | |||
attr Tankstelle_Esso reading08Name city | |||
attr Tankstelle_Esso reading08Regex "http://schema.org/addressCountry">(.*)< | |||
attr Tankstelle_Esso readingOExpr $val =~ s/<[\d\D]+>//;;$val | |||
attr Tankstelle_Esso stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel | |||
attr Tankstelle_Esso timeout 10 | |||
</pre> | |||
define | Beispielkonfiguration für eine Agip Tankstelle: | ||
attr | <pre> | ||
attr | define Tankstelle_Agip HTTPMOD http://www.clever-tanken.de/tankstelle_details/34459 600 | ||
attr | attr Tankstelle_Agip enableControlSet 1 | ||
attr | attr Tankstelle_Agip reading01Name Diesel | ||
attr | attr Tankstelle_Agip reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr | attr Tankstelle_Agip reading02Name SuperE5 | ||
attr | attr Tankstelle_Agip reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr | attr Tankstelle_Agip reading03Name SuperE10 | ||
attr | attr Tankstelle_Agip reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | ||
attr Tankstelle_Agip reading04Name SuperPlus | |||
attr Tankstelle_Agip reading04Regex "price-type-name">SuperPlus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) | |||
attr Tankstelle_Agip reading05Name street | |||
attr Tankstelle_Agip reading05Regex "streetAddress">(.*)< | |||
attr Tankstelle_Agip reading06Name zip | |||
attr Tankstelle_Agip reading06Regex "http://schema.org/postalCode">(.*)< | |||
attr Tankstelle_Agip reading07Name city | |||
attr Tankstelle_Agip reading07Regex "http://schema.org/addressCountry">(.*)< | |||
attr Tankstelle_Agip readingOExpr $val =~ s/<[\d\D]+>//;;$val | |||
attr Tankstelle_Agip stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel | |||
attr Tankstelle_Agip timeout 10 | |||
</pre> | </pre> | ||
Eine [[readingsGroup]] mit farblicher Hervorhebung des Tiefstpreises der jeweiligen Kraftstoffsorte und hochgestellter letzter Ziffer beim Kraftstoffpreis: | |||
<pre> | <pre> | ||
define | define rg_Kraftstoffpreise readingsGroup <Tankstelle>,<Diesel>,<Super E5>,<Super E10>,<Super Plus>,<PLZ>,<Ort>,<Straße> Tankstelle_.*:Diesel,SuperE5,SuperE10,SuperPlus,zip,city,street | ||
attr rg_Kraftstoffpreise alias Kraftstoffpreisübersicht | |||
attr rg_Kraftstoffpreise cellStyle {"r:1" => 'style="font-weight:bold"'} | |||
attr rg_Kraftstoffpreise valueFormat {"$1<sup>$2</sup> €" if ($READING=~/^Super|Diesel/ && $VALUE=~/^(\d\.\d\d)(\d)$/)} | |||
attr rg_Kraftstoffpreise valueStyle {'style="color:green;;font-weight:bold"' if ($READING=~/^Super|Diesel/ && $VALUE eq KraftstoffLP($READING))} | |||
</pre> | </pre> | ||
Hier noch eine mögliche Definition für das [[FileLog]]. Es werden von allen definierten Tankstellen (Namen beginnend mit "Tankstelle_") die Werte für Super (E5, E10 und Plus) und Diesel gespeichert: | |||
<pre> | <pre> | ||
define | define FileLog_Kraftstoffpreise FileLog ./log/Kraftstoffpreise-%Y-%m.log Tankstelle_.*:(Super|Diesel).* | ||
</pre> | </pre> | ||
Und eine Plotdefinition | Und eine [[SVG|Plotdefinition]] | ||
<pre> | <pre> | ||
define | define SVG_FileLog_Kraftstoffpreise_1 SVG FileLog_Kraftstoffpreise:SVG_FileLog_Kraftstoffpreise_1:CURRENT | ||
</pre> | </pre> | ||
== Farbliche Hervorhebung == | == Farbliche Hervorhebung == | ||
Folgender Code | Folgender Code kommt in [[99 myUtils anlegen|99_myUtils.pm]] | ||
<pre> | <pre> | ||
################################################### | ########################################################################################### | ||
### | ### Funktion für Ermittlung vom niedrigsten Preis für readingsGroup rg_Kraftstoffpreise ### | ||
################################################### | ########################################################################################### | ||
# damit die Funktion richtig funktioniert müssen alle Tankstellennamen mit "Tankstelle_" | |||
# beginnen oder entsprechend devspec2array auf die eigenen Namen anpassen | |||
sub | sub KraftstoffLP($) { | ||
my ($ | my ($r) = @_; | ||
return (sort map {ReadingsNum($_,$r,999)} devspec2array("Tankstelle_.*"))[0]; | |||
} | } | ||
</pre> | </pre> | ||
=== Die zugehörige .gplot Datei === | === Die zugehörige .gplot Datei === | ||
SVG_FileLog_Kraftstoffpreise_1.gplot | |||
<pre> | <pre> | ||
# Created by FHEM/98_SVG.pm, 2014-10-22 12:57:34 | # Created by FHEM/98_SVG.pm, 2014-10-22 12:57:34 | ||
Zeile 114: | Zeile 184: | ||
set timefmt "%Y-%m-%d_%H:%M:%S" | set timefmt "%Y-%m-%d_%H:%M:%S" | ||
set xlabel " " | set xlabel " " | ||
set title ' | set title 'Kraftstoffpreise' | ||
set ytics | set ytics | ||
set y2tics | set y2tics | ||
Zeile 134: | Zeile 204: | ||
"<IN>" using 1:2 axes x1y2 title 'Shell Super' ls l4 lw 1 with lines,\ | "<IN>" using 1:2 axes x1y2 title 'Shell Super' ls l4 lw 1 with lines,\ | ||
"<IN>" using 1:2 axes x1y2 title 'Total Super' ls l5 lw 1 with lines | "<IN>" using 1:2 axes x1y2 title 'Total Super' ls l5 lw 1 with lines | ||
</pre> | |||
== Tricks für HTTPMOD == | |||
Je nach Internetverbindung und Geschwindigkeit des FHEM Rechners kann das Modul manchmal Probleme haben, die Daten schnell genug zu verarbeiten. | |||
Eine Lösung dazu wäre, die Daten vorher mit wget auf einem eigenen Webserver zu speichern (z.B. ein lokaler Apache) und HTTPMOD auf diesen zugreifen zu lassen. | |||
== Links == | == Links == | ||
* Vorstellung und Diskussion [http:// | * Vorstellung und Diskussion im {{Link2Forum|Topic=22554|LinkText=FHEM Forum}} | ||
* [http://www. | * Der "Datenlieferant": [http://www.clever-tanken.de/ Clever Tanken] | ||
* Eine Anleitung, wie man das mit wget macht, gibt es {{Link2Forum|Topic=28123|Message=216228|LinkText=hier}} (ist aber noch nicht ganz fertig) | |||
* Umsetzung für [http://www.cyberwulf.de/2016/fhem-spritpreise-von-tankerkoenig-de/ Tankerkönig API] | |||
[[Kategorie:Code Snippets]] | [[Kategorie:Code Snippets]] | ||
[[Kategorie:Examples]] |
Aktuelle Version vom 10. Februar 2021, 10:12 Uhr
Die hier vorgestellten Geräte-Definitionen ermöglichen es, mit Hilfe von HTTPMOD bei clever-tanken.de die Kraftstoffpreise von gewünschten Tankstellen zu protokollieren. Die Credits dafür gehen an Forum-Benutzer Phil__ . Die Original Diskussion im Forum ist hier.
Alternativ dazu können die Kraftstoffpreise auch über die Webseite tankerkoenig.de bezogen werden. Die Vorgehensweise dafür ist im Detail in diesem Blog beschrieben.
Einleitung
Im Folgenden wird mit Hilfe des Moduls HTTPMOD der Kraftstoffpreis von ausgewählten Tankstellen abgerufen. Die Daten werden gefiltert, gespeichert und als Diagramm aufbereitet.
Zum Nachbau ist es erforderlich, die persönlich gewünschten Tankstellen bei Clever-Tanken zu suchen. Jede Tankstelle hat eine eigene Nummer:
/tankstelle_details/0815
Die 600 in den Beispielen gibt das Abrufintervall in Sekunden an.
Konfiguration
Die erforderlichen Definitionen in der FHEM Konfiguration bestehen aus mehreren Teilen. Zunächst die erforderlichen Einstellungen um die Daten der gewünschten Tankstellen abzuholen.
Beispielkonfiguration für eine Shell Tankstelle inkl. Sondersorten:
define Tankstelle_Shell HTTPMOD http://www.clever-tanken.de/tankstelle_details/4871 600 attr Tankstelle_Shell enableControlSet 1 attr Tankstelle_Shell reading01Name Diesel attr Tankstelle_Shell reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Shell reading02Name SuperE5 attr Tankstelle_Shell reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Shell reading03Name SuperE10 attr Tankstelle_Shell reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Shell reading04Name SuperPlus attr Tankstelle_Shell reading04Regex "price-type-name">SuperPlus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Shell reading05Name ShellVPowerRacing attr Tankstelle_Shell reading05Regex "price-type-name">Shell.V-Power.Racing<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Shell reading06Name ShellVPowerDiesel attr Tankstelle_Shell reading06Regex "price-type-name">Shell.V-Power.Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Shell reading07Name street attr Tankstelle_Shell reading07Regex "streetAddress">(.*)< attr Tankstelle_Shell reading08Name zip attr Tankstelle_Shell reading08Regex "http://schema.org/postalCode">(.*)< attr Tankstelle_Shell reading09Name city attr Tankstelle_Shell reading09Regex "http://schema.org/addressCountry">(.*)< attr Tankstelle_Shell readingOExpr $val =~ s/<[\d\D]+>//;;$val attr Tankstelle_Shell stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel attr Tankstelle_Shell timeout 10
Beispielkonfiguration für eine Total Tankstelle:
define Tankstelle_Total HTTPMOD http://www.clever-tanken.de/tankstelle_details/4870 600 attr Tankstelle_Total enableControlSet 1 attr Tankstelle_Total reading01Name Diesel attr Tankstelle_Total reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Total reading02Name SuperE5 attr Tankstelle_Total reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Total reading03Name SuperE10 attr Tankstelle_Total reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Total reading04Name SuperPlus attr Tankstelle_Total reading04Regex "price-type-name">Total.Excellium.Super.Plus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Total reading05Name street attr Tankstelle_Total reading05Regex "streetAddress">(.*)< attr Tankstelle_Total reading06Name zip attr Tankstelle_Total reading06Regex "http://schema.org/postalCode">(.*)< attr Tankstelle_Total reading07Name city attr Tankstelle_Total reading07Regex "http://schema.org/addressCountry">(.*)< attr Tankstelle_Total readingOExpr $val =~ s/<[\d\D]+>//;;$val attr Tankstelle_Total stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel attr Tankstelle_Total timeout 10
Beispielkonfiguration für eine Aral Tankstelle inkl. Sondersorten:
define Tankstelle_Aral HTTPMOD http://www.clever-tanken.de/tankstelle_details/4869 600 attr Tankstelle_Aral enableControlSet 1 attr Tankstelle_Aral reading01Name Diesel attr Tankstelle_Aral reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Aral reading02Name SuperE5 attr Tankstelle_Aral reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Aral reading03Name SuperE10 attr Tankstelle_Aral reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Aral reading04Name Ultimate102 attr Tankstelle_Aral reading04Regex "price-type-name">ARAL.Ultimate.102<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Aral reading05Name UltimateDiesel attr Tankstelle_Aral reading05Regex "price-type-name">ARAL.Ultimate.Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Aral reading06Name street attr Tankstelle_Aral reading06Regex "streetAddress">(.*)< attr Tankstelle_Aral reading07Name zip attr Tankstelle_Aral reading07Regex "http://schema.org/postalCode">(.*)< attr Tankstelle_Aral reading08Name city attr Tankstelle_Aral reading08Regex "http://schema.org/addressCountry">(.*)< attr Tankstelle_Aral readingOExpr $val =~ s/<[\d\D]+>//;;$val attr Tankstelle_Aral stateFormat E5: SuperE5, E10: SuperE10, SP: Ultimate102, D: Diesel attr Tankstelle_Aral timeout 10
Beispielkonfiguration für eine Esso Tankstelle inkl. Sondersorten:
define Tankstelle_Esso HTTPMOD http://www.clever-tanken.de/tankstelle_details/17413 600 attr Tankstelle_Esso enableControlSet 1 attr Tankstelle_Esso reading01Name Diesel attr Tankstelle_Esso reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Esso reading02Name SuperE5 attr Tankstelle_Esso reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Esso reading03Name SuperE10 attr Tankstelle_Esso reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Esso reading04Name SuperPlus attr Tankstelle_Esso reading04Regex "price-type-name">Esso.Superplus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Esso reading05Name Autogas attr Tankstelle_Esso reading05Regex "price-type-name">Autogas<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Esso reading06Name street attr Tankstelle_Esso reading06Regex "streetAddress">(.*)< attr Tankstelle_Esso reading07Name zip attr Tankstelle_Esso reading07Regex "http://schema.org/postalCode">(.*)< attr Tankstelle_Esso reading08Name city attr Tankstelle_Esso reading08Regex "http://schema.org/addressCountry">(.*)< attr Tankstelle_Esso readingOExpr $val =~ s/<[\d\D]+>//;;$val attr Tankstelle_Esso stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel attr Tankstelle_Esso timeout 10
Beispielkonfiguration für eine Agip Tankstelle:
define Tankstelle_Agip HTTPMOD http://www.clever-tanken.de/tankstelle_details/34459 600 attr Tankstelle_Agip enableControlSet 1 attr Tankstelle_Agip reading01Name Diesel attr Tankstelle_Agip reading01Regex "price-type-name">Diesel<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Agip reading02Name SuperE5 attr Tankstelle_Agip reading02Regex "price-type-name">Super.E5<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Agip reading03Name SuperE10 attr Tankstelle_Agip reading03Regex "price-type-name">Super.E10<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Agip reading04Name SuperPlus attr Tankstelle_Agip reading04Regex "price-type-name">SuperPlus<[\S\s\r\n]*?"current-price-\d+">(\d.\d{2}<[\S\s\r\n]*?"suffix-price-\d">\d) attr Tankstelle_Agip reading05Name street attr Tankstelle_Agip reading05Regex "streetAddress">(.*)< attr Tankstelle_Agip reading06Name zip attr Tankstelle_Agip reading06Regex "http://schema.org/postalCode">(.*)< attr Tankstelle_Agip reading07Name city attr Tankstelle_Agip reading07Regex "http://schema.org/addressCountry">(.*)< attr Tankstelle_Agip readingOExpr $val =~ s/<[\d\D]+>//;;$val attr Tankstelle_Agip stateFormat E5: SuperE5, E10: SuperE10, SP: SuperPlus, D: Diesel attr Tankstelle_Agip timeout 10
Eine readingsGroup mit farblicher Hervorhebung des Tiefstpreises der jeweiligen Kraftstoffsorte und hochgestellter letzter Ziffer beim Kraftstoffpreis:
define rg_Kraftstoffpreise readingsGroup <Tankstelle>,<Diesel>,<Super E5>,<Super E10>,<Super Plus>,<PLZ>,<Ort>,<Straße> Tankstelle_.*:Diesel,SuperE5,SuperE10,SuperPlus,zip,city,street attr rg_Kraftstoffpreise alias Kraftstoffpreisübersicht attr rg_Kraftstoffpreise cellStyle {"r:1" => 'style="font-weight:bold"'} attr rg_Kraftstoffpreise valueFormat {"$1<sup>$2</sup> €" if ($READING=~/^Super|Diesel/ && $VALUE=~/^(\d\.\d\d)(\d)$/)} attr rg_Kraftstoffpreise valueStyle {'style="color:green;;font-weight:bold"' if ($READING=~/^Super|Diesel/ && $VALUE eq KraftstoffLP($READING))}
Hier noch eine mögliche Definition für das FileLog. Es werden von allen definierten Tankstellen (Namen beginnend mit "Tankstelle_") die Werte für Super (E5, E10 und Plus) und Diesel gespeichert:
define FileLog_Kraftstoffpreise FileLog ./log/Kraftstoffpreise-%Y-%m.log Tankstelle_.*:(Super|Diesel).*
Und eine Plotdefinition
define SVG_FileLog_Kraftstoffpreise_1 SVG FileLog_Kraftstoffpreise:SVG_FileLog_Kraftstoffpreise_1:CURRENT
Farbliche Hervorhebung
Folgender Code kommt in 99_myUtils.pm
########################################################################################### ### Funktion für Ermittlung vom niedrigsten Preis für readingsGroup rg_Kraftstoffpreise ### ########################################################################################### # damit die Funktion richtig funktioniert müssen alle Tankstellennamen mit "Tankstelle_" # beginnen oder entsprechend devspec2array auf die eigenen Namen anpassen sub KraftstoffLP($) { my ($r) = @_; return (sort map {ReadingsNum($_,$r,999)} devspec2array("Tankstelle_.*"))[0]; }
Die zugehörige .gplot Datei
SVG_FileLog_Kraftstoffpreise_1.gplot
# Created by FHEM/98_SVG.pm, 2014-10-22 12:57:34 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 title 'Kraftstoffpreise' set ytics set y2tics set grid set ylabel "Preise (€/Liter)" set y2label "Preise (€/Liter)" #FileLog 4:Aral.Diesel\x3a:1: #FileLog 4:Shell.Diesel\x3a:1: #FileLog 4:Total.Diesel\x3a:1: #FileLog 4:Aral.SuperE5\x3a:1: #FileLog 4:Shell.SuperE5\x3a:1: #FileLog 4:Total.SuperE5\x3a:1: plot "<IN>" using 1:2 axes x1y2 title 'Aral Diesel' ls l2 lw 1 with lines,\ "<IN>" using 1:2 axes x1y2 title 'Shell Diesel' ls l1 lw 1 with lines,\ "<IN>" using 1:2 axes x1y2 title 'Total Diesel' ls l0 lw 1 with lines,\ "<IN>" using 1:2 axes x1y2 title 'Aral Super' ls l3 lw 1 with lines,\ "<IN>" using 1:2 axes x1y2 title 'Shell Super' ls l4 lw 1 with lines,\ "<IN>" using 1:2 axes x1y2 title 'Total Super' ls l5 lw 1 with lines
Tricks für HTTPMOD
Je nach Internetverbindung und Geschwindigkeit des FHEM Rechners kann das Modul manchmal Probleme haben, die Daten schnell genug zu verarbeiten.
Eine Lösung dazu wäre, die Daten vorher mit wget auf einem eigenen Webserver zu speichern (z.B. ein lokaler Apache) und HTTPMOD auf diesen zugreifen zu lassen.
Links
- Vorstellung und Diskussion im FHEM Forum
- Der "Datenlieferant": Clever Tanken
- Eine Anleitung, wie man das mit wget macht, gibt es hier (ist aber noch nicht ganz fertig)
- Umsetzung für Tankerkönig API