[Gelöst] Spritpreise und www.clever-tanken.de

Begonnen von UweUwe, 19 Dezember 2018, 11:14:39

Vorheriges Thema - Nächstes Thema

Jamo

https://www.clever-tanken.de/tankstelle_liste?spritsorte=7&r=10&lat=47.875943&lon=10.550710 1200
in abhängigkeit von den Geokoordinaten latitude und longitude geht auch.
Falls man owntracks oder geofancy benutzt, kann man sich z.B. die Tankstellen im Umkreis um die Parkposition des Autos ausgeben lassen.

Ein Notify auf die sich ändernde Geokoordinaten lat/lon.
Dazu eine sub in der 99_MyUtils.pm, die das clever-tanken HTTPMOD device dynamisch mit den neuen Geokoordinaten neu anlegt.


Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

t1me2die

#16
Zitat von: inoma am 20 Dezember 2018, 22:30:31
https://www.clever-tanken.de/tankstelle_liste?spritsorte=7&r=10&lat=47.875943&lon=10.550710 1200
in abhängigkeit von den Geokoordinaten latitude und longitude geht auch.
Falls man owntracks oder geofancy benutzt, kann man sich z.B. die Tankstellen im Umkreis um die Parkposition des Autos ausgeben lassen.

Ein Notify auf die sich ändernde Geokoordinaten lat/lon.
Dazu eine sub in der 99_MyUtils.pm, die das clever-tanken HTTPMOD device dynamisch mit den neuen Geokoordinaten neu anlegt.

Man könnte auch seinen Standort via Telegram an FHEM senden, aus diesem dann "latitude: " und "longitude: " nehmen um die URL diesbezüglich anzupassen  :)

UweUwe

Hallo,

gerade die letzte Möglichkeit, man übermittelt seine GPS Daten an FHEM und bekommt die billigsten Spritpreise der Umgebung zurück. Das ist ja super. Ich werde dies versuchen mal umzusetzen, sehe aber da schon Schwierigkeiten auf mich zukommen. Ich habe einfach nicht die Erfahrung. Aber darin liegt mein Reiz. Eventl. frage ich dann wieder im Forum nach. Ich brauche aber für die Umsetzung eine Stande Stunden ab Stück, Weihnachten könnte hier sehr gut passen.. Danke für Ideen.
Falls jemand einen Codeschnipsel hat.. gerne.

Uwe

Jamo

#18
Hier mal die Codeschnipsel
1) sub createHTTPMODTanke($$$$$), damit wird ein HTTPMOD device CleverTanken dynamisch neu mit den neuen Geokoordinaten anlegt.
    das muss aufgerufen werden, wenn sich die Geokordinaten ändern (also ein notify auf lat/lon)
2) sub getTanke, erzeugt die Readings und den Pushtext fuer Telegram, die wird mit einem notify aufgerufen, etc:
   define CleverTanken_n notify CleverTanken:Entfernung-1:.* {getTanke("CleverTanken")}

Der Text für Telegram steht dann im device CleverTanken im Reading "Pushtext".
Die Fuel.. readings sind nur, damit man alles übersichtlich im Modul in einer Tabelle hat.

Weitere Erklärungen im Code Header.

################################## #
# $Id: 99_MyUtilsTanken.pm 2014-8 by Inoma $
# Version 1.0 11/12/2018 by Inoma


package main;

use strict;
use warnings;
use POSIX;
sub MyUtilsTanken_Initialize($$)
{
  my ($hash) = @_;
}


##################################################################################################
# if (defined($defs{"CleverTanken"})) {fhem("delete CleverTanken")}
# fhem("sleep 2; {createHTTPMODTanke(\"CleverTanken\",$Spritsorte,$TankRadius,$startLat,$startLng)}; sleep 5; set CleverTanken reread");
#                {createHTTPMODTanke("CleverTanken","7","5","47.1234","12.1234")}
# Errormeldungen:
# -1 = Device konnte nicht angelegt werden #  0 = Device ist schon vorhanden #  1 = Device wurde erfolgreich angelegt
##################################################################################################

sub createHTTPMODTanke($$$$$)
{
    my($name,$spritsorte,$radius,$lat,$lon) = @_;
    my $sub    = "createHTTPMODTanke";
    my $error  = "";
    my $device = $name;
    my $link   = "https://www.clever-tanken.de/tankstelle_liste?spritsorte=$spritsorte&r=$radius&lat=$lat&lon=$lon";

   
    # Device ist noch nicht angelegt

    if (!defined($defs{$device}))
    {
        Log 3,"[$sub] Create device: $link";
            fhem "define $device HTTPMOD $link 0 ;
                  attr $device room Verkehr ;
                  attr $device enableControlSet 1 ;
                  attr $device userattr TankstellenAnzahl:20,30,40,50,60 TankRadius:5,6,7,8,9,10 Spritsorte:5,7 ;
                  attr $device Spritsorte 7 ;
                  attr $device TankRadius 10 ;
                  attr $device event-on-update-reading Tankstellenname-1 ;
                  attr $device reading01Name Tankstellenname ;
                  attr $device reading01Regex <span class=\\\"fuel-station-location-name\\\">(.*)<\\\/span> ;
                  attr $device reading01RegOpt g ;
                  attr $device reading01DeleteIfUnmatched 1 ;
                  attr $device reading02Name Preis ;
                  attr $device reading02RegOpt g  ;
                  attr $device reading02Regex <div class=\\\"price-text price text-color-ct-blue\\\">(?>\\\s*)(\\\d.*)<sup> ;
                  attr $device reading02DeleteIfUnmatched 1 ;
                  attr $device reading03Name Strasse ;
                  attr $device reading03Regex <div class=\\\"fuel-station-location-street\\\">(.*)<\\\/div> ;
                  attr $device reading03RegOpt g ;
                  attr $device reading03DeleteIfUnmatched 1 ;
                  attr $device reading04Name Ort ;
                  attr $device reading04RegOpt g ;
                  attr $device reading04Regex <div class=\\\"fuel-station-location-city\\\">(.*)<\\\/div> ;
                  attr $device reading04DeleteIfUnmatched 1 ;
                  attr $device reading05Name Entfernung ;
                  attr $device reading05RegOpt g  ;
                  attr $device reading05Regex <div class=\\\"fuel-station-location-distance d-flex justify-content-end\\\">(?>\\\s*)<span>(\\\d.\\\d);
                  attr $device reading05DeleteIfUnmatched 1 ;
                  attr $device group HTTPMOD ;
                  attr $device timeout 10 ;
                  attr $device comment Debuggen geht indem du deinen clever-tanken Link öffnest, \
Quelltext anzeigen lässt und diesen dann in das Textfeld auf https://regex101.com kopierst. \
Das RegEx kommt in die Eingabezeile ganz oben und rechts siehst du das Ergebnis.\
spritsorte=7\
1 = Autogas\
2 = LKW-Diesel\
3 = Diesel\
4 = Bioethanol\
5 = SuperE10\
6 = SuperPlus\
7 = SuperE5\
8 = Erdgas";   
       
        if (Value("$device") eq "")
        { $error = -1;
          return ($error, "");
        }
        else
        { $error = 1;
          return ($error, $device);
        }   
    }
    # Device ist schon vorhanden
    else
    {
        $error = 0;
        return ($error, $device);
    }

}



##################################################################################################
# getTanke
# Aufruf: CleverTanken:Entfernung-1:.* {getTanke("CleverTanken","LocationCar")}
#
# Schreibt 19 individuelle readings "Fuel01" bis "Fuel19" in das device "LocationCar"
# Fuel01 1,35 € - ALLGUTH | ABCdestr 19, 12345 12345 | 3.4 km 2018-12-21 11:48:32
# Fuel02 1,35 € - ALLGUTH | ABCfgstr 15, 12345 12345 | 3.7 km 2018-12-21 11:48:32
# Fuel03 1,35 € - Bavaria | ABChystr 7, 12345 12345 | 5.2 km 2018-12-21 11:48:32
# Fuel04 1,35 € - ALLGUTH | ABCwestr 120, 12345 12345 | 1.4 km 2018-12-21 11:48:32
#
# Schreibt zusaetzlich einen Einzeiligen Pushtext mit Zeilenumbruch für Telegram in folgenden Format ins Device "CleverTanken"
# PushText
# 1,35 € - ALLGUTH | ABCdestr 19, 12345 12345 | 3.4 km
# 1,35 € - ALLGUTH | ABCfgstr 15, 12345 Dortmund | 3.7 km
# 1,35 € - Bavaria | ABChystr 7, 12345 Dortmund | 5.2 km
# 1,35 € - ALLGUTH | ABCwestr 120, 12345 Dortmund | 1.4 km
##################################################################################################
sub getTanke($$){
    my($httpDev,$CarDev) = @_;
    my $sub              = "getTanke";
    my $TankenAnzahl     = AttrNum ("LocationCar","TankstellenAnzahl",20);
    # Maximum 20 anzeigen lassen
    my @Liste;
#Log 3,"[$sub] getTanke entered";
for(my $num=1;$num<$TankenAnzahl;$num++){
        #for(my $i=1;$i<10;$i++){
        #my $num = sprintf("%02d", $i);
        Log 5,"[$sub] Tankstellenanzahl: $num";
#Log 3,"[$sub] getTanke Tankstellenanzahl: $num";
        my $Tankname   = ReadingsVal($httpDev,"Tankstellenname-".$num,"undef")." ";
        last if !defined $Tankname;
  $Tankname   =~ s/ .*//;
  $Tankname   =~ s/-/ /g;
  $Tankname   =~ s/.Tankstelle//g;
  $Tankname   =~ s/.Markttankstelle//g;
  $Tankname   = $Tankname."       ";
  $Tankname   = substr($Tankname,0,7);
        my $Entfernung = ReadingsVal($httpDev,"Entfernung-".$num,"undef");
  $Entfernung =~ s/ km/km/g;
        my $Ort        = ReadingsVal($httpDev,"Ort-".$num,"undef");
my $Strasse    = ReadingsVal($httpDev,"Strasse-".$num,"undef").",";
  $Strasse    =~ s/\.//g;
my $Preis      = ReadingsNum($httpDev,"Preis-".$num,undef);
  #$Preis   =~ s/\./,/;
if ($num==1){fhem("setreading $CarDev minPreis1 $Preis")}
   if ($num==2){fhem("setreading $CarDev minPreis2 $Preis")}
        last if !defined $Entfernung;
        last if !defined $Preis;
        Log 5,"[$sub] Tankname/Preis: $Tankname $Preis";
#Log 3,"[$sub] Tankname/Preis: $Tankname $Preis";
my $Tankinfo = $Preis." ".$Entfernung." ".$Tankname." ".$Strasse."\n                   ".$Ort;
        Log 5,"[$sub] Tankinfo=$Tankinfo";
#Log 3,"[$sub] Tankinfo=$Tankinfo";
        push @Liste, $Tankinfo;

    }

    my $out = join(", ", @Liste)."\n";
    Log 5,"[$sub] out=$out"; 

    my $PushText = "";
    my $Anzahl = scalar(@Liste);
    for (my $num=0;$num<$Anzahl;$num++) {
        Log 5,"[$sub] Num: $num $Liste[$num]";
my $i = sprintf("%02d", $num+1);
$PushText = $PushText.$Liste[$num]."\n";

    }
chomp $PushText;      ## wird verwendet um das letzte \n zu entfernen
    if ($PushText ne "") {fhem("setreading $httpDev PushText $PushText;setreading $CarDev Tanken $PushText")}
}


1;
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

UweUwe

Hallo inoma,

schaue ich mir gleich über das Wochende an. Vielen Dank und auch Schöne Weichnachten..

Uwe

UweUwe

Hallo Otto123,

nochmals vielen Dank für die Zusendung deines Vorschlages für die Spritpreise.
Ich habe versucht, den Code zu verstehen, bevor ich ihn bei mir einbaue.

Da habe ich 2 grundsätzliche Fragen:

Hier nochmals dein Vorschlag:

defmod TankeStarMarkrans HTTPMOD http://www.clever-tanken.de/tankstelle_details/29092 1800
attr TankeStarMarkrans userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex readingOExpr
attr TankeStarMarkrans enableControlSet 1
attr TankeStarMarkrans reading01Name Diesel
attr TankeStarMarkrans reading01Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Diesel
attr TankeStarMarkrans reading02Name SuperE10
attr TankeStarMarkrans reading02Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E10
attr TankeStarMarkrans reading03Name SuperE5
attr TankeStarMarkrans reading03Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Super E5
attr TankeStarMarkrans readingOExpr $val =~ tr/,/./;;$val
attr TankeStarMarkrans room 2_6_Spritpreise
attr TankeStarMarkrans stateFormat E5: SuperE5 € / E10: SuperE10 € / D: Diesel €
attr TankeStarMarkrans timeout 10
attr TankeStarMarkrans verbose 2

defmod FileLogSpritE5 FileLog ./log/SpritE5-%Y.log TankeJetRueckmarsdorfer:SuperE5:.*|TankeStarMarkrans:SuperE5:.*


Zuerst geht es mir um das attr reading01Regex

attr TankeStarMarkrans reading01Regex SpritsortenController[^0-9]+([0-9,]+)[^0-9]+Diesel

Ich habe mir die

www.clever-tanken.de

angeschaut und keinen string "SpritsortenController" gefunden, nachdem du wohl suchst und die Werte anschliessend abholst.

Dann mit dem defmod

defmod FileLogSpritE5 FileLog ./log/SpritE5-%Y.log TankeJetRueckmarsdorfer:SuperE5:.*|TankeStarMarkrans:SuperE5:.*

Aus welchem Hut  :) :) bringst du die Tanke : "TankeJetRueckmarsdorfer"?

Vielen Dank für die Antwort.



Paul

Warum macht ihr das alles so kompliziert?

ich habe mir gestern innerhalb von 10 Minuten ohne Tankstellen suchen, nur mit HTTPmod und einem atrribut einen Benzinmonitor zusammengebaut.

1. Auf TankerKönig ein API-KEY geholt https://creativecommons.tankerkoenig.de/

2. in Fhem:

define Tanken HTTPMOD https://creativecommons.tankerkoenig.de/json/list.php?lat=<a>&lng=<b>&rad=<c>&sort=<D>&type=<e>&apikey=00000000-0000-0000-0000-000000000000 <f>


<a> lat    geographische Breite des Standortes
<b>lng    geographische Länge
<c>rad    Suchradius in km  (max. 25)
<d>type    Spritsorte    'e5', 'e10', 'diesel' oder 'all'
<e>sort    Sortierung    price, dist
<f> interval in Sekunden

Attribut setzen

attr axtractALLJSON 1


Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

Otto123

#22
Zitat von: UweUwe am 27 Dezember 2018, 12:55:41
Aus welchem Hut  :) :) bringst du die Tanke : "TankeJetRueckmarsdorfer"?

Vielen Dank für die Antwort.
Hi,

ehrlich, der Code ist auch nicht original von mir - aber funktioniert. War hier irgendwo im Forum... Ich glaube hier
TankeJetRueckmarsdorfer ist einfach eine analoge zweite Definition, also ein zweites Devices. Ich logge aber in ein Logfile.

Ich gebe zu: mit HTTPMOD eine Seite zu analysieren und dabei alles zu verstehen fällt mir sehr schwer bzw.ich kann es selbst nicht. Manche Sachen kann ich an Hand von "Schablonen" anpassen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Paul

Zitat von: Otto123 am 27 Dezember 2018, 18:55:33
Ich gebe zu: FHTTKs HTTPMOD eine Seite zu analysieren und dabei alles zu verstehen fällt mir sehr schwer bzw.ich kann es selbst nicht. Manche Sachen kann ich an Hand von "Schablonen" anpassen.

Gruß Otto

Hallo, du super Experte, der mir schon oft geholfen hat.

Vielleicht kannst du mir helfen. Vielleicht nicht hier sondern per PM.

Wollte eigentlich ein Benzinpreis-Modul schreiben, aber nachdem ich im Wiki den Development Bereich gelesen habe, habe  ich es sofort aufgegeben habe. Du kannst mir aber sicherlich weiterhelfen, wie ich ich im HTTPMOD die http-Seite über attr schreiben kann.
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

Otto123

Du meinst weil ich HTTP nicht lesen kann -  kann ich HTTP schreiben?  ;D
Nee tut mir leid, da bin ich der Falsche.

Gruß Otto

BTW: heisst das nicht aextractALLJSON 1 ?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Paul

Klar so heißt das  :) hab ich gestern in 10 Minuten rausgefunden.

Wollte von dir nur wissen wie man

http:www.xyz.de/<a><b>

In HTTPMOD

mit attr a=...
attr b=...

darstellt
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

UweUwe

Hallo Paul,

deine Lösung mit dem TankerKoenig ist schon smart.

in Fhem:
Code: [Auswählen]

define Tanken HTTPMOD https://creativecommons.tankerkoenig.de/json/list.php?lat=<a>&lng=<b>&rad=<c>&sort=<D>&type=<e>&apikey=00000000-0000-0000-0000-000000000000 <f>


<a> lat    geographische Breite des Standortes
<b>lng    geographische Länge
<c>rad    Suchradius in km  (max. 25)
<d>type    Spritsorte    'e5', 'e10', 'diesel' oder 'all'
<e>sort    Sortierung    price, dist
<f> interval in Sekunden

Attribut setzen

Code: [Auswählen]

attr axtractALLJSON 1


Aber wie bekomme ich die Daten in ein filelog bzw. dblog, sodass ich die Daten abfragen kann, z.B. mit TelegramBot.
So eine Schablone, wie Otto sie erwähnt hat, für die Umsetzung in ein dblog wäre ganz tolle.

API hab ich schon geholt ;D, GPS Daten möchte ich entweder fest vorgeben :-[, besser noch den lokalen Standort verwenden ::).
Geht sowas. Es interessiert eigentlich nur Diesel. Mehr wünsche hab ich nicht  :) :) 8). Wenn es nicht geht, auch gut..
;D ;D


Christoph Morrison

Zitat von: UweUwe am 27 Dezember 2018, 22:00:00
API hab ich schon geholt ;D, GPS Daten möchte ich entweder fest vorgeben :-[, besser noch den lokalen Standort verwenden ::).
Geht sowas. Es interessiert eigentlich nur Diesel. Mehr wünsche hab ich nicht  :) :) 8). Wenn es nicht geht, auch gut..
;D ;D

Ich hab mir sowas gebaut: Positionsdaten kommen über Owntracks, Tankpreise über clever-tanken und das Auto aus einem eigenen Device (dummy mit ein paar Readings, insb. Treibstoffart). Schicke ich eine Nachricht mit "tanken" über den Telegram-Bot an mein FHEM, meldet FHEM die nächste Tankstelle mit dem günstigsten Preis mit Link auf Apple Maps/Google Maps.

Ich stelle die Lösung bei Gelegenheit mal vor, bzw. schreibe (schon eine Weile) an einem Modul dafür. Nächste Ausbaustufe wäre dann, dass FHEM gleich Routen berechnet und mir nicht die geographisch nächste, sondern die am schnellsten zu erreichende Tankstelle meldet.

martins

Bevor noch jemand ein Spritpreismonitor Modul programmiert ...
Modul-Fingerübung: Spritpreis
https://forum.fhem.de/index.php/topic,64610.0.html
https://github.com/pljakobs/fhem_spritpreis_module

Läuft seit "Jahren" ausgezeichnet stabil

Beta-User

Zitat von: martins am 27 Dezember 2018, 23:39:24
Bevor noch jemand ein Spritpreismonitor Modul programmiert ...
Kein Modul, aber dafür vermutlich bald im svn: https://forum.fhem.de/index.php/topic,45176.0.html

Wenn jemand Anregungen hat, wie die templates ergänzt oder verbessert werden sollen/können: Her damit ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors