Hauptmenü

BenzinpreisMonitor

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

Vorheriges Thema - Nächstes Thema

Phil__

Hallo,

ich habe schon seit längerem ein kleines PHP-Skript am laufen, welches mir beliebige (je nach Konfiguration) Tankstellen Preise loggt und einen Verlauf darstellt. Siehe Anhang!
Dies werden in einem File in folgendem Format gespeichert:
2014-01-01_13:31:48 Aral_xy 1.359
2014-01-01_13:31:48 Shel_xy 1.369
2014-01-01_13:31:48 Total_xy 1.349

Habe da schonmal ein Format gewählt, wie die Fhem eigenen Logs.

Gibt es eine Möglichkeit das Logfile in Fhem einzubinden ??

Mit folgendem könnte ich schonmal das Logfile aufrufen

define FileLog_Tanken FileLog /media/usblog/fhem/log/benzinpreis.log BENZIN_PREIS
attr FileLog_Tanken logtype text
attr FileLog_Tanken room Uebersicht,Technik



Gibt es eine Möglichkeit die Aktuellen Preise aus dem File auszulesen und in Fhem darzustellen??
zB. readingsGroup?

-----===== UPDATE =====-----

Hier mal eine Zusammenfassung bzw. Beispiel, zusammengestellt aus dem nachfolgenden Thread:

Ersteinmal einen Dank an alle die sich hier so rege beteiligt haben. Ich habe das ganze bei mir auch mal umgesetzt und will hier mal ein komplettes Beispiel zur verfügung stellen, da der Thread schon ziemlich lang und unübersichtlich ist. Werde das Ganze dann auch auf Seite 1 im ersten Post einfügen. Für Ergänzungen, einfach hier schreiben oder eine kurze PN an mich.
Angefangen von Tankstellen define, über ReadingsGroup, Filelog, bis hin zum Plot ist hier mal alles zusammengefasst:

#########################################################
###                   Spritpreise                    ####
#########################################################
#########################################################



#########################################################
###       Spritpreise Diesel/SuperE5 - Langen        ####
#########################################################

#########################################################
###          Tankstellen - Langen             ####
#########################################################


define Shell HTTPMOD http://www.clever-tanken.de/tankstelle_details/4871 600
attr Shell group Spritpreise
attr Shell icon tanken
attr Shell readingsName_Diesel Diesel
attr Shell readingsName_SuperE5 SuperE5
attr Shell readingsRegex_Diesel <div class="fuel_type">Diesel[^0-9]+([0-9\.]+)
attr Shell readingsRegex_SuperE5 <div class="fuel_type">Super E5[^0-9]+([0-9\.]+)
attr Shell room Spritpreise
attr Shell stateFormat Liter_Diesel: Diesel
attr Shell timeout 5


define Total HTTPMOD http://www.clever-tanken.de/tankstelle_details/4870 600
attr Total group Spritpreise
attr Total icon tanken
attr Total readingsName_Diesel Diesel
attr Total readingsName_SuperE5 SuperE5
attr Total readingsRegex_Diesel <div class="fuel_type">Diesel[^0-9]+([0-9\.]+)
attr Total readingsRegex_SuperE5 <div class="fuel_type">Super E5[^0-9]+([0-9\.]+)
attr Total room Spritpreise
attr Total stateFormat Liter_Diesel: Diesel
attr Total timeout 5


define Aral HTTPMOD http://www.clever-tanken.de/tankstelle_details/4869 600
attr Aral group Spritpreise
attr Aral icon tanken
attr Aral readingsName_Diesel Diesel
attr Aral readingsName_SuperE5 SuperE5
attr Aral readingsRegex_Diesel <div class="fuel_type">Diesel[^0-9]+([0-9\.]+)
attr Aral readingsRegex_SuperE5 <div class="fuel_type">Super E5[^0-9]+([0-9\.]+)
attr Aral room Spritpreise
attr Aral stateFormat Liter_Diesel: Diesel
attr Aral timeout 5

#########################################################
###            Filelog                 ####
#########################################################

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


#########################################################
###            ReadingsGroup                 ####
#########################################################

define Spritpreise readingsGroup (Shell|Total|Aral):(SuperE5|Diesel).*
attr Spritpreise group Spritpreisuebersicht
attr Spritpreise notime 1
attr Spritpreise room Spritpreise
attr Spritpreise style style="font-size:16px"
attr Spritpreise valueFormat {'%.2f €'}
attr Spritpreise valueStyle {Werte($READING,$VALUE)}

#########################################################
###            Plot                   ####
#########################################################

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 die 99_myUtils.pm muss folgendes eingefügt werden um in der ReadingsGroup die Preis unterschiedlich farblich darzustellen, je nach Preisniveau.
Die genauen Preisgrenzen muss natürlich jeder für sich selbst festlegen:

###################################################
###     Spritpreisübersicht - Farbsortierung    ###
###################################################

sub Werte($$) {
  my ($name, $wert) = @_;
# Log(3,"$name $wert");
  if ($name eq "Diesel") {
    return 'style="color:red"' if($wert >= 1.39);
    return 'style="color:blue"' if(($wert >= 1.33) && ($wert < 1.39));
    return 'style="color:green;;font-weight:bold"' if($wert <= 1.32);
  }elsif ($name eq "SuperE10") {
    return 'style="color:crimson"' if($wert >= 1.70);
    return 'style="color:yellow"' if(($wert >= 1.55) && ($wert < 1.70));
    return 'style="color:lightgreen;;font-weight:bold"' if($wert < 1.55);
  }elsif ($name eq "SuperE5") {
    return 'style="color:red"' if($wert >= 1.59);
    return 'style="color:blue"' if(($wert >= 1.49) && ($wert < 1.59));
    return 'style="color:green;;font-weight:bold"' if($wert <= 1.48);
  } 
}



Hier eine verbesserte Alternative zur farblichen Markierung der Preis-Levels:

#------------------------------------------------------------------------------
# FuelFormat:
# sets the valueStyle of the fuel monitor:
# lowest value: green bold
# biggest value: red bold
# $DEVICE contains the station
# $REDING contains the fuel type
# $VALUE contains the price
#
# calling in fhem:
# attr <name> valueStyle {FuelFormat($DEVICE,$READING,$VALUE)}
#
# version/programming:
# 0.1/Peter Mühlbeyer
#
# bugs/improvements:
#  - in case of same max. or min. values only one value will be marked
#------------------------------------------------------------------------------
sub FuelFormat($$$)
{
  my ($DEVICE, $READING, $VALUE) = @_;
  my @device_list = ("Gehring","Jet","Shell","Shell_Loe");
  my $lowprice1 = 99; my $lowdevice1;
  my $highprice1 = -99; my $highdevice1;
  my $actprice1;
  my $lowprice2 = 99; my $lowdevice2;
  my $highprice2 = -99; my $highdevice2;
  my $actprice2;

  if ($READING eq "Diesel")
  {
    foreach (@device_list)
    {
      $actprice1 = ReadingsVal($_,"Diesel",99);
      #Log 3, "Schleife: $_ $actprice1";
      if ($actprice1 > $highprice1)
      {
        $highprice1 = $actprice1;
        $highdevice1 = $_;
      }
      elsif ($actprice1 < $lowprice1)
      {
        $lowprice1 = $actprice1;
        $lowdevice1 = $_;
      }
    }
    if ($DEVICE eq $lowdevice1) { return 'style="color:lightgreen;;font-weight:bold"'; }
    elsif ($DEVICE eq $highdevice1) { return 'style="color:red"'; }
    else { return 'style="color:yellow;;font-weight:bold"'; }
  }
  elsif ($READING eq "SuperE10")
  {
    foreach (@device_list)
    {
      $actprice2 = ReadingsVal($_,"SuperE10",99);
      if ($actprice2 > $highprice2)
      {
        $highprice2 = $actprice2;
        $highdevice2 = $_;
      }
      elsif ($actprice2 < $lowprice2)
      {
        $lowprice2 = $actprice2;
        $lowdevice2 = $_;
      }
    }
    if ($DEVICE eq $lowdevice2) { return 'style="color:lightgreen;;font-weight:bold"'; }
    elsif ($DEVICE eq $highdevice2) { return 'style="color:red"'; }
    else { return 'style="color:yellow;;font-weight:bold"'; }
  }
  elsif ($READING eq "SuperE5")
  {
    foreach (@device_list)
    {
      $actprice2 = ReadingsVal($_,"SuperE5",99);
      if ($actprice2 > $highprice2)
      {
        $highprice2 = $actprice2;
        $highdevice2 = $_;
      }
      elsif ($actprice2 < $lowprice2)
      {
        $lowprice2 = $actprice2;
        $lowdevice2 = $_;
      }
    }
    if ($DEVICE eq $lowdevice2) { return 'style="color:lightgreen;;font-weight:bold"'; }
    elsif ($DEVICE eq $highdevice2) { return 'style="color:red"'; }
    else { return 'style="color:yellow;;font-weight:bold"'; }
  }
}
#----- FuelFormat -------------------------------------------------------------




Die .gplot Datei sieht in diesem Beispiel wie nachfolgend aus:
SVG_FileLog_Spritpreise_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 'Spritpreise'
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



--== Update 2 ==--

Hier der Link zum Wiki: http://www.fhemwiki.de/wiki/Spritpreismonitor
Einen Dank an Rince!

Viele Grüße

Philipp

Server: Intel DH77EB + Core i3-2120 mit Ubuntu Server 14.04
Backup: Beaglebone Black
Homematic: HM-LAN-Adapter, HM-CC-RT-DN, HM-CC-TC, HM-LC-SW1-PL2, HM-SEC-RHS, HM-SEC-SC, HM-TC-IT-WM-W-EU, HM-WDS10-TH-O
Weitere: Denon-AVR, PhilipsTV, PhilipsHue, Raspi+XBMC
Nexus 7 (WebViewControl + FTUI)

rudolfkoenig

Mit FHEM kann man das ganze auch einfach plotten: im FileLog Detail-Ansicht "Create SVG plot" anklicken, und Editor ausfuellen. Das direkte Anzeigen der einzelnen Werte ist aufwendiger: man muesste ein at definieren, der mit FileLog get Zeilen aus der Datei rausfischt (leider muss man hier einen Zeitraum definieren), Aus diesen Werten den letzten bestimmt, und sie dann per trigger an einem dummy oder aehnliches weitergibt.
Das alles erfordert aber ein bisschen perl Know-How.

Ich wuerde es anders angehen: Statt die Werte in eine Datei zu schreiben wuerde ich diese direkt an FHEM weitergeben. z.Bsp. per Unix-Befehl 'perl fhem.pl localhost:7072 "set Aral 1.72"'. FHEM uebernimmt Anzeige/Logging/Plotten/etc.

AndreR

Würdest du das PHP Script zur Verfügung stellen?
Ich find die Idee echt gut, da könnte man z.b. Mit nem notify reagieren wenn der spritpreis mal ungewöhnlich niedrig sein sollte...
FHEM auf Raspberry Pi
CUL868
diverse FS20 Aktoren, Somfy Markisensteuerung

Markus Bloch

würde mich ebenfalls interessieren. evtl. lässt sich daraus ein FHEM Modul bauen, was das ganze direkt als Readings ausspuckt.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

P.A.Trick

Finde ich auch interessant!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

mi.ke

Ich find die Idee sensationell.

In Verbindung mit z.B.
http://forum.fhem.de/index.php/topic,20151.0.html
und/oder einer Wetterabfrage im Winter "Hats Heute geschneit, Schnee schippen, würgt"
und anderen Google-Kalenderplanungen (Handwerker, ebay-Käufen, whatever) . . .

wäre die Fahrzeit zur Arbeit optimal berechnet,
der Wecker zur rechten Zeit gestellt,
und dazu noch preiswert getankt.

Klasse ! ! !



FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Phil__

Zitat von: AndreR am 16 April 2014, 23:43:48
Würdest du das PHP Script zur Verfügung stellen?
Ich find die Idee echt gut, da könnte man z.b. Mit nem notify reagieren wenn der spritpreis mal ungewöhnlich niedrig sein sollte...

Ja klar,

vielleicht können wir da ja zusammen was erarbeiten.
Wenn ich heute von der Arbeit zuhause bin, werde ich den Code hier zur Verfügung stellen.

Grüsse

Gesendet von meinem Nexus 5 mit Tapatalk

Server: Intel DH77EB + Core i3-2120 mit Ubuntu Server 14.04
Backup: Beaglebone Black
Homematic: HM-LAN-Adapter, HM-CC-RT-DN, HM-CC-TC, HM-LC-SW1-PL2, HM-SEC-RHS, HM-SEC-SC, HM-TC-IT-WM-W-EU, HM-WDS10-TH-O
Weitere: Denon-AVR, PhilipsTV, PhilipsHue, Raspi+XBMC
Nexus 7 (WebViewControl + FTUI)

Phil__

Hallo,

bin zur Zeit leider ziemlich beschäftigt, deshalb erst jetzt das php script für das einsammeln der Benzin/diesel Preise.
Das "get" Script selbst stammt nicht von mir, sondern wurde mir von einem Freund (Marcel) zur verfügung gestellt und gab mir auch die Erlaubnis es hier zu Entwicklungszwecken zur verfügung zu stellen.

Ich bin leider sehr kurz angebunden, falls Fragen sind nur zu ich werde versuchen Zeitnah zu antworten.
Ganz kurz:
- get_data.php: Ganz am ende der Datei unter "fetchPricelData" euren entsprechenden Link von www.clever-tanken.de einfügen. (Nach euren Tankstellen suchen und den Link kopieren) Anschließend das Script am besten per Cronjob in regelmäßigen Abständen ausführen lassen. (Bei mir alle 10 min)

config.ini: Die Daten werden aktuell bei dem Script noch in eine Mysql Datenbank geloggt. in der ini datei die Daten eurer Datenbank eintragen.

preis-monitor.sql: Am besten in eure Datenbank importieren da hier Beispieltabellen enthalten sind.


So, hoffe das war verständlich!

Vielleicht kann ja von euch jemand das Ganze in ein Fhem Modul umsetzen, meine perl Kenntnisse sind leider noch sehr limitiert.
Freue mich über rege Beteiligung und sorry für die Verspätung der versprochenen Files.

Viele Grüße

Philipp



Server: Intel DH77EB + Core i3-2120 mit Ubuntu Server 14.04
Backup: Beaglebone Black
Homematic: HM-LAN-Adapter, HM-CC-RT-DN, HM-CC-TC, HM-LC-SW1-PL2, HM-SEC-RHS, HM-SEC-SC, HM-TC-IT-WM-W-EU, HM-WDS10-TH-O
Weitere: Denon-AVR, PhilipsTV, PhilipsHue, Raspi+XBMC
Nexus 7 (WebViewControl + FTUI)

wuppermann

Hallo zusammen,

ich finde es ebenfalls eine interessante Idee.
Hat sich schon jemand näher mit der Verwendung in FHEM beschäftigt oder hat sogar schon etwas laufen?
MTHPRD
Grüße aus Wuppertal

Jörg

Wuppi68

Coole Idee

Danke



Gesendet von meinem iPad mit Tapatalk
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

no_Legend

Finde sie auch sau gut
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

frankbeckers

Die Idee hat mich sofort begeistert. Habe direkt versucht es mit Bordmitteln umzusetzen.

Mit HTTPMOD ist als erster Versuch folgendes herausgekommen:

define Benzinpreis HTTPMOD http://www.clever-tanken.de/tankstelle_details/642 60
attr Benzinpreis readingsName_Diesel Diesel
attr Benzinpreis readingsName_SuperE10 SuperE10
attr Benzinpreis readingsName_SuperE5 SuperE5
attr Benzinpreis readingsRegex_Diesel <div class="fuel_type">Diesel[^0-9]+([0-9\.]+)
attr Benzinpreis readingsRegex_SuperE10 <div class="fuel_type">Super E10[^0-9]+([0-9\.]+)
attr Benzinpreis readingsRegex_SuperE5 <div class="fuel_type">Super E5[^0-9]+([0-9\.]+)
attr Benzinpreis room Benzinpreis
attr Benzinpreis timeout 5


Damit hat man die Benzinpreise in eigenen Readings und kann diese dann weiter verarbeiten. Das ganze lässt sich bestimmt noch weiter ausbauen.

Gruß
Frank
FHEM 5.7 auf Raspberry Pi 2 Jessy 4.1.16-v7+
CCU2 --> hm2mqtt --> MQTT --> Fhem
ehz361z5 --> RPi --> MQTT --> Fhem
Lightify
Fritz!DECT 200

wuppermann

Das hört sich doch schon mal super an....werde mich morgen mal mit deiner Lösung beschäftigen.  Gruß und allerseits gute Nacht....Jörg

P.A.Trick

Zitat von: frankbeckers am 17 Juli 2014, 23:05:37
Die Idee hat mich sofort begeistert. Habe direkt versucht es mit Bordmitteln umzusetzen.

Mit HTTPMOD ist als erster Versuch folgendes herausgekommen:

define Benzinpreis HTTPMOD http://www.clever-tanken.de/tankstelle_details/642 60
attr Benzinpreis readingsName_Diesel Diesel
attr Benzinpreis readingsName_SuperE10 SuperE10
attr Benzinpreis readingsName_SuperE5 SuperE5
attr Benzinpreis readingsRegex_Diesel <div class="fuel_type">Diesel[^0-9]+([0-9\.]+)
attr Benzinpreis readingsRegex_SuperE10 <div class="fuel_type">Super E10[^0-9]+([0-9\.]+)
attr Benzinpreis readingsRegex_SuperE5 <div class="fuel_type">Super E5[^0-9]+([0-9\.]+)
attr Benzinpreis room Benzinpreis
attr Benzinpreis timeout 5


Damit hat man die Benzinpreise in eigenen Readings und kann diese dann weiter verarbeiten. Das ganze lässt sich bestimmt noch weiter ausbauen.

Gruß
Frank

Super funktioniert bei mir! danke Frank!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

fh168

#14
Ich habe mal versucht, die Filterung vom Regex mit dem regexr.com zu verstehen, ich komme da nicht mit klar. Der wirft mir nicht den Preis raus. Man hätte ja das als Vorlage für andere Projekte nehmen können.

Egal, das frankBeckers-Beispiel klappt bei mir, Daumen hoch.
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-