Hauptmenü

BenzinpreisMonitor

Begonnen von Phil__, 16 April 2014, 18:52:21

Vorheriges Thema - Nächstes Thema

derNeue

#405
Morgen zusammen, ich habe ein Problem mit dem Benzinpreismonitor.....

hier mein Code der in der fhem.cfg steht. Die Preise werden ausgelesen und es geht auch alles Ich bekomme nur kein Diagramm (Plot)

#Tankstelle Eschweiler HIT

##################################################################

#Tankstelle Eschweiler HIT

define Eschweiler_Hit HTTPMOD http://www.clever-tanken.de/tankstelle_details/21784 600
attr Eschweiler_Hit userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex
attr Eschweiler_Hit enableControlSet 1
attr Eschweiler_Hit group Spritpreise
attr Eschweiler_Hit icon gasoline
attr Eschweiler_Hit reading01Name SuperE10
attr Eschweiler_Hit reading01Regex <span>Super E10</span>[^0-9]+([0-9\.]+)
attr Eschweiler_Hit reading02Name SuperE5
attr Eschweiler_Hit reading02Regex <span>Super E5</span>[^0-9]+([0-9\.]+)
attr Eschweiler_Hit reading03Name aktZeit
attr Eschweiler_Hit reading03Regex 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))
attr Eschweiler_Hit reading04Name test
attr Eschweiler_Hit reading04Regex Letzte MTS-K Preisänderung: (([01]?\d|2[0-3]):([0-5]?\d))
attr Eschweiler_Hit room Spritpreise
attr Eschweiler_Hit stateFormat SuperE5 SuperE10 aktZeit-1
attr Eschweiler_Hit timeout 5

#Tankstelle Eschweiler Jet

define Markant_Aldenhoven HTTPMOD http://www.clever-tanken.de/tankstelle_details/10374 600
attr Markant_Aldenhoven userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex
attr Markant_Aldenhoven group Spritpreise
attr Markant_Aldenhoven icon gasoline
attr Markant_Aldenhoven reading01Name SuperE10
attr Markant_Aldenhoven reading01Regex <span>Super E10</span>[^0-9]+([0-9\.]+)
attr Markant_Aldenhoven reading02Name SuperE5
attr Markant_Aldenhoven reading02Regex <span>Super E5</span>[^0-9]+([0-9\.]+)
attr Markant_Aldenhoven reading03Name aktZeit
attr Markant_Aldenhoven reading03Regex 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))
attr Markant_Aldenhoven reading04Name test
attr Markant_Aldenhoven reading04Regex Letzte MTS-K Preisänderung: (([01]?\d|2[0-3]):([0-5]?\d))
attr Markant_Aldenhoven room Spritpreise
attr Markant_Aldenhoven stateFormat SuperE5 SuperE10 aktZeit-1
attr Markant_Aldenhoven timeout 5


define FileLog_Spritpreise FileLog /media/usblog/fhem/log/spritpreise-langen-%Y-%m.log (Eschweiler_Hit|Markant_Aldenhoven):(SuperE5|SuperE10).*
attr FileLog_Spritpreise alias Log Spritpreise
attr FileLog_Spritpreise group Logfile
attr FileLog_Spritpreise logtype text
attr FileLog_Spritpreise room Spritpreise



define Spritpreise readingsGroup (Eschweiler_Hit|Markant_Aldenhoven):(SuperE5|SuperE10).*
attr Spritpreise group Spritpreisuebersicht
attr Spritpreise notime 1
attr Spritpreise room Spritpreise
attr Spritpreise valueFormat {'%.2f €'}

define SVG_FileLog_Spritpreise_1 SVG FileLog_Spritpreise:SVG_FileLog_Spritpreise_1:CURRENT
attr SVG_FileLog_Spritpreise_1 group Spritpreisverlauf
attr SVG_FileLog_Spritpreise_1 room Spritpreise

in meiner SVG_FileLog_Spritpreise_1.gplot steht das .....

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 'Spritpreise'
set ytics
set y2tics
set grid
set ylabel "Preise (€/Liter)"
set y2label "Preise (€/Liter)"


#FileLog 4:Eschweiler_Hit.SuperE10\x3a:1:
#FileLog 4:Total.Diesel\x3a:1:
#FileLog 4:Eschweiler_Hit.SuperE5\x3a:1:
#FileLog 4:Shell.SuperE5\x3a:1:


plot "<IN>" using 1:2 axes x1y2 title 'Eschweiler_Hit SuperE10' ls l1 lw 1 with lines,\
     
     "<IN>" using 1:2 axes x1y2 title 'Eschweiler_Hit SuperE5' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Markant_Aldenhoven SuperE10' ls l4 lw 1 with lines,\
     
     "<IN>" using 1:2 axes x1y2 title 'Markant_Aldenhoven SuperE5' ls l4 lw 1 with lines, \

Mein Fehler
Can't open /media/usblog/fhem/log/spritpreise-langen-2016-11.log: No such file or Directory

aber warum nicht ????



Danke , ich komme einfach nicht weiter...   




kumue

Zitat von: derNeue am 18 November 2016, 08:46:16
define FileLog_Spritpreise FileLog /media/usblog/fhem/log/spritpreise-langen-%Y-%m.log (Eschweiler_Hit|Markant_Aldenhoven):(SuperE5|SuperE10).*

Can't open /media/usblog/fhem/log/spritpreise-langen-2016-11.log: No such file or Directory

Vermute, der Pfad ist aus dem Wiki. Du musst ihn an deine Gegebenheiten anpassen...
Oder einen Pfad /media/usblog/fhem/log anlegen mit den entsprechenden Rechten, wenn Du es so haben möchtest.

derNeue

ja, habe ich mir gedacht, das der Pfad falsch ist....soll ich denn mit Filezilla eine Log Datei anlegen dort wo ich möchte, oder kann ich das auch über Fhem....

Die angaben stehen in der Wiki, wenn das nicht stimmt sollte man das einmal anpassen....

Gruß
Danke

kumue

Du kannst ja mit dem Attribut logdir bei global einen Pfad für deine Logdateien angeben.
attr global logdir <DEIN_PFAD>

und bei der Definition von FileLog dich mit %L darauf beziehen...
siehe commandref http://fhem.de/commandref_DE.html#FileLog
ZitatFHEM ersetzt %L mit dem Wert des global logdir Attributes.

hartenthaler

Zitat von: hartenthaler am 21 Oktober 2016, 19:16:55
Ich habe auf die API von Tankerkönig umgestellt. Hier sind meine Definitionen für das API-Device, das Logfile, ein Plot und eine readingsGroup.
...

Ich war damals mit der readingsGroup noch nicht zufrieden. Inzwischen ist es weitgehend so wie ich es wollte, allerdings deutlich komplizierter als gedacht. Einen aktuellen Screenshot hänge ich an.

Ein Hauptgrund für die Entwicklung der hier vorgestellten Lösung war, dass ich keine regulären Ausdrücke verwenden wollte um die passenden Angaben aus einer Webseite herauszusuchen. Jedes Mal wenn sich die Webseite ändert, muss man dann nacharbeiten. Eine Schnittstelle im XML-Format, wie sie Tankerkönig bietet, ist da viel stabiler (um diese Lösung zu nutzen, muss man sich auf der Tankerkönig-Seite https://creativecommons.tankerkoenig.de/ registrieren und einen API-Key besorgen). Dann wollte ich für die Benzinpreise nur ein Device haben in dem alles zusammen gefasst ist. Und ich wollte eine Struktur wo ich beim Hinzufügen oder Ändern von Tankstellen diese Änderung nur an einer Stelle machen muss und alles andere sich dann automatisch danach ausrichtet (dieses Ziel habe ich fast, aber nicht ganz erreicht). Ob diese Vorteile gegenüber der gestiegenen Komplexität meiner Lösung im Vergleich zu bisher hier diskutierten Lösungen wirklich überwiegen, muss jeder selbst beurteilen.

Kernelement ist eine Routine in der 99_myUtils.pm, denn dort ist u.a. die Liste der abzufragenden Tankstellen hinterlegt:

#################################################################
###       Benzinpreis und Tankstellen (Tankerkönig)           ###
#################################################################

# 1. parameter $required is "icon" or "address" or "valueStyle" or "valueFormat" or "list" or "userReadings"
# 2. parameter $device is the Tankerkönig device
# 3. parameter $reading has the format "prices_<tankerkoenig-id>_<type of fuel>" like "prices_e1a15081-255b-9107-e040-0b0a3dfe563c_e10" (parameter not needed if $required is "list" or "userReadings" or "address")
#
# icon: returns the brand icon (diese Funktion wird aktuell nicht verwendet!)
# address: returns the station name and address
# valueStyle: returns the style for the prices as html code: lowest value: green bold, highest value: red
# valueFormat: returns "%.3f €/l" for prices, translations for open/closed etc.
# list: returns the station list (part of URL to call Tankerkönig) - this function must be called once to additionally set the userReadings icon and address for each station
# userReadings: returns a list of userReadings for timestamps

sub myPetrolStationInfo($$;$) {

   my ($required, $device, $reading) = @_;
   # Log3 undef, 3, "device $device";
   my $icon        = "unknown\@red";
   my $folder      = "/opt/fhem/www/images/default/";
   my $prefix      = "prices_";
   my $prefix_icon = "tankstelle_";
   my %tankstellen = (
     'e1a15081-255b-9107-e040-0b0a3dfe563c' => {sort => 3, brand => 'hem',     address => 'HEM, 13467 Berlin, Berliner Str. 140'},
     'a2f96cc4-b858-463d-bd93-b3056e81fcaa' => {sort => 4, brand => 'esso',    address => 'ESSO, 13467 Berlin, Hermsdorfer Damm 221'},
     '0ab14657-b01e-4827-a5d4-311ad444b887' => {sort => 5, brand => 'spreves', address => 'SPREVES, 13467 Berlin, Hermsdorfer Damm 180'},
     '45936520-e830-4578-a3cb-188053b90765' => {sort => 2, brand => 'shell',   address => 'Shell, 13467 Berlin, Hermsdorfer Damm 141-143'},
     '005056ba-7cb6-1ee5-b791-639597361b11' => {sort => 6, brand => 'star',    address => 'STAR, 10585 Berlin, Otto-Suhr-Allee 132'},
     'f3c0c60e-7709-486b-a7d8-eea21ad0c2d9' => {sort => 7, brand => 'sb',      address => 'SB, 10587 Berlin, Fraunhofer Straße 33-36'},
     '09c46b5b-20c0-4dcf-a4d4-e6c67f6d5bb0' => {sort => 8, brand => 'aral',    address => 'ARAL, 10625 Berlin, Bismarckstraße 2'},
     '29462a90-0092-437c-a287-ea4aa611c1c3' => {sort => 1, brand => 'shell',   address => 'Shell, 13503 Berlin, Ruppiner Chaussee 339'}
   );

   sub rgSortPetrolStation {
      return $tankstellen{@{$a}[1]}{'sort'} cmp $tankstellen{@{$b}[1]}{'sort'};
   };

   my ($prices, $tankerkoenig, $fuel_type) = split(/_/, $reading) if ($required ne "list" && $required ne "address");
   #Log3 undef, 3, "required=$required, device=$device, reading=$reading, prices=$prices, tankerkoenig=$tankerkoenig, fuel_type=$fuel_type";
   
   if ($required eq "icon") {
     # falls $reading keine "_" enthält, kann es sein, dass $reading nur die tankerkoenig id enthält; dann diese nehmen
     #if ($tankerkoenig eq "") {$tankerkoenig = $prices;}
     my $brand = $tankstellen{$tankerkoenig}{'brand'};
     if (! -e $folder . $prefix_icon . $brand . ".png" ) {
       return $icon;
     }
     $icon = $prefix_icon . $brand;
     return $icon;

   } elsif ($required eq "address") {
     return $tankstellen{$tankerkoenig}{'address'};

   } elsif ($required eq "valueStyle") {
     my $lowprice = 99;
     my $highprice = -99;
     my $actprice;

my $value = ReadingsVal($device, $reading, 99);
if ($value =~ m/\d\.\d/o) {
   my $status = $prefix . $tankerkoenig . "_status";
   if (ReadingsVal($device, $status, "") ne "open") {
     return 'style="color:black"';
   } else {  # compare with all open petrol stations
     while (each %tankstellen) {
   $status = $prefix . $_ . "_status";
       if (ReadingsVal($device, $status, "") eq "open") {
             $actprice = ReadingsVal($device, $prefix . $_ . "_" . $fuel_type, 99);
             if ($actprice > $highprice) { $highprice = $actprice; }
             if ($actprice < $lowprice)  { $lowprice = $actprice; }
   }
         }

         if ($value == $lowprice)     { return 'style="color:lightgreen;;font-weight:bold"'; }
         elsif ($value == $highprice) { return 'style="color:red"'; }
         else                         { return 'style="color:black"'; }
   }
     } else { # $value is a string, not a real number
   if ($value eq "open")      { return 'style="color:lightgreen;;text-align: center;;"'; }
       elsif ($value eq "closed") { return 'style="color:red;;font-weight:bold;;text-align: center;;"'; }
   else                       { return 'style="color:black"'; }
}

   } elsif ($required eq "valueFormat") {
my $value = ReadingsVal($device, $reading, 0);
if ($value =~ m/\d\.\d/o)       { return '%.3f €/l'; }
     elsif ($reading =~ "icon")      { return $value; }
elsif ($value eq "open")        { return 'offen'; }
elsif ($value eq "closed")      { return 'geschlossen'; }
elsif ($reading =~ "timestamp") { return substr($value,8,2).".".substr($value,5,2).".".substr($value,0,4)." ".substr($value,11,5)." Uhr"; }
elsif ($reading =~ "address")   { return '<a href="https://creativecommons.tankerkoenig.de/json/detail.php?id='.$tankerkoenig.'&apikey='.AttrVal($device, "replacement1Value", "<apikey>").'">'.$value.'</a>'; }
else { return ''; }

   } elsif ($required eq "list") {
my $list = "";
while (each %tankstellen) {
       $list .= '"'.$_.'",';
   #fhem("setreading $device $prefix".$_."_address ".latin1ToUtf8($tankstellen{$_}{'address'}));
   fhem("setreading $device $prefix".$_."_address ".$tankstellen{$_}{'address'});
   my $brand = $tankstellen{$_}{'brand'};
       # Log3 undef, 3, "brand=$brand";
       if (-e $folder . $prefix_icon . $brand . ".png" ) {
my $cmd = 'setreading '.$device.' '.$prefix.$_.'_icon <img src="fhem/images/default/'.$prefix_icon.$brand.'.png">';
fhem($cmd);
       }
     }
     return substr($list,0,length($list)-1);

   } elsif ($required eq "userReadings") {
    my $ur = "";
while (each %tankstellen) {
       $ur .= $prefix . $_ . '_timestamp {ReadingsTimestamp($name,"' . $prefix . $_ . '_status",0)}' . ',';
     }
     return substr($ur,0,length($ur)-1);

   } else {
     Log3 undef, 3, "error in calling myPetrolStationInfo with parameter $required";
     return "error in calling myPetrolStationInfo with parameter $required"
   }
}


In der Tabelle der abzufragenden Tankstellen wird als Schlüssel die ID von Tankerkönig verwendet. Diese konnte man bislang recht einfach finden, wenn man nach einer Suche auf der Landkarte von Tankerkönig mit den Treffern auf ein Tankstellenfähnchen klickte und dann dort auf das gelbe Feld "Meldung" klickte. In der aktuellen Version der Webseite habe ich so eine Möglichkeit nicht mehr gefunden. Aber man kann nun stattdessen im Browser eine Umkreissuche starten:
https://creativecommons.tankerkoenig.de/json/list.php?lat=52.1&lng=13.5&rad=25&type=diesel&apikey=xxx&sort=dist
Dort muss man die ungefähren Koordinaten der gesuchten Tankstellen bei lat/lng eingeben, den Suchradius (in km) bei rad setzen und den eigenen apikey statt der xxx einsetzen. In der Trefferliste kann man dann die gewünschten Tankstellen raussuchen und deren "id" notieren.

Die Schlüssel mit den IDs in der Tankstellenliste verweisen auf die Felder "sort", "brand" und "address". Das erste Feld "sort" dient zur Festlegung der Reihenfolge bei der Darstellung in der readingsGroup, "brand" wird verwendet um auf ein Icon mit der Tankstellen-Marke zu verweisen (tankstelle_<brand>.png), also etwa tankstelle_shell.png; diese Icons habe ich selbst erstellt und unter /opt/fhem/www/images/default abgelegt (ich vermute, dass es da rechtliche Probleme geben könnte, so dass ich die Icons hier nicht einstellen möchte). Unter "address" ist der Name und die Adresse der jeweiligen Tankstelle hinterlegt. Dies sind ja statische Informationen und Tankerkönig hat etwas dagegen, wenn man sich solche Informationen ständig über die Web-Schnittstelle neu zieht, daher sind sie hier direkt abgelegt. Die Angaben zu den Icons und den Adressen werden automatisch in entsprechende Readings des Benzinpreis-Devices kopiert.

Das Device sieht bei mir dann so aus

define Benzinpreise HTTPMOD https://creativecommons.tankerkoenig.de/json/prices.php?ids=[%stationlist%]&apikey=%apikey% 1200
attr Benzinpreise userattr getHeader1 getHeader2 getURL replacement0Mode:reading,internal,text,expression,key replacement0Regex replacement0Value replacement1Mode:reading,internal,text,expression,key replacement1Regex replacement1Value
attr Benzinpreise devStateIcon true:gasoline2@green false:gasoline2@red
attr Benzinpreise enableControlSet 1
attr Benzinpreise extractAllJSON 1
attr Benzinpreise getHeader1 Content-Type: application/json
attr Benzinpreise getHeader2 Accept: */*
attr Benzinpreise group Benzinpreis
attr Benzinpreise icon gasoline2
attr Benzinpreise replacement0Mode expression
attr Benzinpreise replacement0Regex (%stationlist%)
attr Benzinpreise replacement0Value { myPetrolStationInfo("list",$name) }
attr Benzinpreise replacement1Mode text
attr Benzinpreise replacement1Regex (%apikey%)
attr Benzinpreise replacement1Value xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
attr Benzinpreise room Preis
attr Benzinpreise stateFormat ok
attr Benzinpreise timestamp-on-change-reading prices_.*
attr Benzinpreise userReadings prices_29462a90-0092-437c-a287-ea4aa611c1c3_timestamp {ReadingsTimestamp($name,"prices_29462a90-0092-437c-a287-ea4aa611c1c3_status",0)},prices_005056ba-7cb6-1ee5-b791-639597361b11_timestamp {ReadingsTimestamp($name,"prices_005056ba-7cb6-1ee5-b791-639597361b11_status",0)},prices_09c46b5b-20c0-4dcf-a4d4-e6c67f6d5bb0_timestamp {ReadingsTimestamp($name,"prices_09c46b5b-20c0-4dcf-a4d4-e6c67f6d5bb0_status",0)},prices_45936520-e830-4578-a3cb-188053b90765_timestamp {ReadingsTimestamp($name,"prices_45936520-e830-4578-a3cb-188053b90765_status",0)},prices_0ab14657-b01e-4827-a5d4-311ad444b887_timestamp {ReadingsTimestamp($name,"prices_0ab14657-b01e-4827-a5d4-311ad444b887_status",0)},prices_a2f96cc4-b858-463d-bd93-b3056e81fcaa_timestamp {ReadingsTimestamp($name,"prices_a2f96cc4-b858-463d-bd93-b3056e81fcaa_status",0)},prices_f3c0c60e-7709-486b-a7d8-eea21ad0c2d9_timestamp {ReadingsTimestamp($name,"prices_f3c0c60e-7709-486b-a7d8-eea21ad0c2d9_status",0)},prices_e1a15081-255b-9107-e040-0b0a3dfe563c_timestamp {ReadingsTimestamp($name,"prices_e1a15081-255b-9107-e040-0b0a3dfe563c_status",0)}

Im Attribut replacement1Value habe ich den API-Key hinterlegt, den ich bei der Registrierung auf der Tankerkönig-Seite https://creativecommons.tankerkoenig.de/ erhalten habe. Die beiden Platzhalter in der URL %apikey% und %stationlist% werden vor dem Aufruf der URL dann entsprechend der Angaben in den Attributen replacement1Value und replacement2Value ersetzt. Im Attribut userReadings stehen Angaben, die dafür sorgen dass jedes Mal, wenn eine Tankstelle ausgelesen wird, ein Zeitstempel gesetzt wird, so dass man ggf. erkennen kann, wenn Werte nicht mehr aktuell sind, etwa weil es die Tankstelle inzwischen nicht mehr gibt. Diese Liste muss man bei jeder Änderung der Tankstellenliste anpassen, also auch beim ersten Mal nach der Definition. Das kann man tun indem man in der fhem-Kommandozeile folgendes eingibt (der zweite Parameter ist der Name des fhem-Devices):
{ myPetrolStationInfo("userReadings","Benzinpreise") }
Die Ausgabe dieses Befehls kopiert man dann in das Attribut userReadings.

Ergänzend kann man ein Logfile anlegen und den Preisverlauf plotten:

## Logfile Benzinpreise
define FileLog_Benzinpreise FileLog %L/benzinpreise-%Y-%m.log Benzinpreise:.*_e10.*
attr FileLog_Benzinpreise logtype text
attr FileLog_Benzinpreise room log

## Plot Tagespreisübersicht
define SVG_FileLog_Benzinpreise SVG FileLog_Benzinpreise:SVG_FileLog_Benzinpreise:CURRENT
attr SVG_FileLog_Benzinpreise group Benzinpreis
attr SVG_FileLog_Benzinpreise label "Preise für Super E10 an ausgewählten Tankstellen"
attr SVG_FileLog_Benzinpreise room Preis,Plots


Und hier noch das Plotfile SVG_FileLog_Benzinpreise.gplot

# Created by FHEM/98_SVG.pm, 2016-10-17 07:17:36
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 '<L1>'
set ytics
set y2tics
set grid
set ylabel "Preis / (€/l)"
set y2label "Preis / (€/l)"

#FileLog_Benzinpreise 4:Benzinpreise.prices_e1a15081-255b-9107-e040-0b0a3dfe563c_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_a2f96cc4-b858-463d-bd93-b3056e81fcaa_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_0ab14657-b01e-4827-a5d4-311ad444b887_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_45936520-e830-4578-a3cb-188053b90765_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_005056ba-7cb6-1ee5-b791-639597361b11_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_f3c0c60e-7709-486b-a7d8-eea21ad0c2d9_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_09c46b5b-20c0-4dcf-a4d4-e6c67f6d5bb0_e10\x3a::
#FileLog_Benzinpreise 4:Benzinpreise.prices_29462a90-0092-437c-a287-ea4aa611c1c3_e10\x3a::

plot "<IN>" using 1:2 axes x1y2 title 'HEM, 13467 Berlin, Berliner Str. 140' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'ESSO, 13467 Berlin, Hermsdorfer Damm 221' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'SPREVES, 13467 Berlin, Hermsdorfer Damm 180' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Shell, 13467 Berlin, Hermsdorfer Damm 141-143' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'STAR, 10585 Berlin, Otto-Suhr-Allee 132' ls l4 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'SB, 10587 Berlin, Fraunhofer Straße 33-36' ls l5 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'ARAL, 10625 Berlin, Bismarckstraße 2' ls l6 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Shell, 13503 Berlin, Ruppiner Chaussee 339' ls l7 lw 1 with lines

Das muss bei anderen Tankstellen dann natürlich entsprechend anders aussehen. Hier interessiere ich mich nur für E10; wer Diesel möchte, muss es entsprechend anpassen. Und wenn man Tankstellen hinzufügt/löscht/ändert muss man das Plotfile auch anfassen.

Und zu guter letzt die etwas trickreiche readingsGroup

defmod rg_Benzinpreise readingsGroup <>,<Tankerkoenig ID>,<Marke>,<Adresse>,<offen/geschlossen>,<SuperE10>,<Diesel>,<Zeitstempel> Benzinpreise:@2,<#1>,prices_(.*)_icon,prices_#1_address,prices_#1_status,prices_#1_e10,prices_#1_diesel,prices_#1_timestamp
attr rg_Benzinpreise group Benzinpreis
attr rg_Benzinpreise mapping &nbsp;;
attr rg_Benzinpreise room Preis
attr rg_Benzinpreise sortFn rgSortPetrolStation
attr rg_Benzinpreise valueFormat { myPetrolStationInfo("valueFormat",$name,$READING) }
attr rg_Benzinpreise valueStyle { myPetrolStationInfo("valueStyle",$name,$READING) }


Abschliessende Bemerkungen:

  • Das Standard-fhem-Icon gasoline.svg lässt sich nicht grün/rot einfärben. Das nun modifizierte gasoline2.svg läßt sich rot und grün einfärben und liegt hier bei.
  • Die Adressen in der readingsGroup enthalten einen Link, der zu Details der Tankstelle wie Geokoordinaten und Öffnungszeiten führt. Allerdings im nicht so nutzerfreundlichen XML-Format. Das könnte man auf einer Web-Seite natürlich schöner präsentieren und gleich einen Link zur Navigation zur Tankstelle hinterlegen. Man könnte den Link statt unter die Adresse auch unter das Icon der Tankstelle legen.
  • Man könnte statt offen/geschlossen auch Icons für diesen Zustand darstellen, was die Tabelle etwas kompakter machen würde.
  • In der ersten Spalte der Tabelle stehen die Tankerkönig-IDs, die man eigentlich nicht braucht, aber ich habe sie nicht wegbekommen. Wenn da jemand eine Lösung hat, bitte gerne hier nachtragen (bitte keine Ideen, die habe ich wohl fast alle durch)
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

bele2000

Hi, allen ein gutes neues Jahr
ist der Benzinpreismonitor auch mit mehrTanken möglich
https://mehr-tanken.de/tankstelle/0869d04b/superu-25-rue-du-tramway-67114#s95_e5
ich bekomme keine Preise angezeigt.
Hintergrund ist der Preis aus Frankreich.

Amenophis86

Nein, die Seite ist nicht integriert. Da musst du den Modul Ersteller fragen, ob er es umbaut. Alternativ kannst du dir die Preise mit HTTPMOD oder mit JSONList / JSON2List (Sollten Daten im JSON Format vorliegen) holen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

rohlande

Hallo Zusammen,

@Phil__ : kannst Du bitte im WIKI eine Ergänzung für die RegExp bezüglich "AUTOGAS" machen?

Ich habe bemerkt, dass unter Verwendung der Seite "http://www.clever-tanken.de/tankstelle_details/......." die Daten nicht richtig ausgelesen werden, da auf der Seite der Code für z.B. "Autogas" anders aufgebaut ist.

Vergleich:

<span>Diesel</span>[^0-9]+([0-9\.]+)
<span>Autogas</div>[^0-9]+([0-9\.]+)

Ich bin mir nicht sicher ob das jemand überhaupt benutzt. Ich tanke nur diese Sorte und finde das Modul echt super.

Gruss Denny



HostSystem: Synology DS918 | FHEM im Docker Version: 6.0-s22528_v2.2.4 (dedizierte IP Adresse) | MQTT_Broker auf DS918 NAS | MQTT_FHEM | TASMOTA_DEVICE | SSChatBot | SSCam | LaMetric | FBAHAHTTP | CUL | SONOS | HUEBridge (deCONZ) Zigbee | FB_CALLMONITOR | InfluxDBLogger

betateilchen

#413
Zitat von: rohlande am 26 Januar 2017, 10:52:40
<span>Autogas</div>[^0-9]+([0-9\.]+)

wenn das wirklich so ist, dann ist das ein Fehler auf der Webseite, über den man den Anbieter ggf. mal informieren sollte.

Edit: Das ist nicht nur bei Autogas falsch, sondern auch bei SuperPlus:



<div class="fuel-price-type"><span>SuperPlus</div>
<div class="fuel-price-type"><span>Autogas</div>

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rohlande

Da bin ich mir halt nicht sicher. Denn die Tankstellen welche ich verwendet habe (2.Stck) sind beide so aufgebaut.
Nachdem ich mir die Code Blöcke der Seiten angeschaut habe, ist mir das aufgefallen.

Gruss Denny

HostSystem: Synology DS918 | FHEM im Docker Version: 6.0-s22528_v2.2.4 (dedizierte IP Adresse) | MQTT_Broker auf DS918 NAS | MQTT_FHEM | TASMOTA_DEVICE | SSChatBot | SSCam | LaMetric | FBAHAHTTP | CUL | SONOS | HUEBridge (deCONZ) Zigbee | FB_CALLMONITOR | InfluxDBLogger

ph1959de

Zitat von: betateilchen am 26 Januar 2017, 10:57:41
wenn das wirklich so ist, dann ist das ein Fehler auf der Webseite, über den man den Anbieter ggf. mal informieren sollte.

Edit: Das ist nicht nur bei Autogas falsch, sondern auch bei SuperPlus:



<div class="fuel-price-type"><span>SuperPlus</div>
<div class="fuel-price-type"><span>Autogas</div>


Scheint bei allen "Kraftstoffsorten" falsch zu sein, die nicht als "MTS-K Preis" gekennzeichnet sind.

<div class="fuel-price-type"><span>Super E5</span><span class="mtsk-label"> MTS-K Preis </span></div>
<div class="fuel-price-type"><span>SuperPlus</div>

Für diese Fälle wird wohl definitiv fehlerhaftes html generiert.
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

szoller

Gibt es auch die Möglichkeit, Daten aus Luxemburg einzubinden?

Als Datenquelle könnte man http://www.petrol.lu/Prix/ nehmen, das sind die staatlich (?) vorgegebenen Maximalpreise, die nutzen wohl alle Marken-Tankstellen, die Freien liegen da hier und da mal ein paar Cent drunter.
Alternativ stehen die Preise auch auf der Webseite von ARAL Luxemburg: http://www.aral.de/de_lu/luxembourg/kraftstoffe-und-preise/aktuelle-kraftstoffpreise.html

Ich wohne recht nah an der Grenze, für mich wäre es interessant zu wissen, ob es sich lohnt "rüber" zu fahren...

ares

Zitat von: szoller am 01 März 2017, 13:46:59
Gibt es auch die Möglichkeit, Daten aus Luxemburg einzubinden?

Am besten Du nimmst den Quelltext der Seite und probierst die Reges z.B. auf https://regex101.com/ - anbei mögliche Beispiele:

Zitat
http://www.petrol.lu/Prix/
reading01Name Super 98 oct.
reading01Regex (?s)line1.*?\/span[^0-9]+([0-9,]+)

reading02Name Super 95 oct.
reading02Regex (?s)line1.*?\/span.*?\/span[^0-9]+([0-9,]+)

reading03Name Diesel
reading03Regex (?s)line1.*?\/span.*?\/span.*?\/span[^0-9]+([0-9,]+)


Zitat
http://www.aral.de/de_lu/luxembourg/kraftstoffe-und-preise/aktuelle-kraftstoffpreise.html
reading01Name EuroSuper 95
reading01Regex (?s)text">EuroSuper 95.*?text">([0-9.]+)

reading02Name Ultimate 98
reading02Regex (?s)text">Ultimate 98.*?text">([0-9.]+)

reading03Name Diesel
reading03Regex (?s)text">Diesel.*?text">([0-9.]+)


Viele Grüße
Manfred

ares

Ach ja, die dritte Stelle hinter dem Komma erhältst Du bei http://www.clever-tanken.de z.B. wie folgt:
reading01Name Diesel
reading01Regex (?s)(.*)
reading01OExpr $val =~ /<span>Diesel<\/span>[^0-9]+([0-9\.]+).*"suffix">([0-9])/;;return$1.$2;;

reading02Name SuperE5
reading02Regex (?s)(.*)
reading02OExpr $val =~ /<span>Super E5<\/span>[^0-9]+([0-9\.]+).*"suffix">([0-9])/;;return$1.$2;;


Viele Grüße
Manfred

stromer-12

Ich suche mir so die Werte mit 3.Stelle:

attr Tankstelle_Aral reading01Name Diesel
attr Tankstelle_Aral reading01Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Diesel
attr Tankstelle_Aral reading02Name SuperE10
attr Tankstelle_Aral reading02Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E10
attr Tankstelle_Aral reading03Name SuperE5
attr Tankstelle_Aral reading03Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E5
attr Tankstelle_Aral readingOExpr $val =~ tr/,/./;;$val
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL