Hallo,
ich versuche mich gerade anhand der verschiedenen Anleitungen an das Thema Spritpreise in FHEM heranzuarbeiten.
Ich habe mir die URL von www.clever-tanken.de näher angeschaut und finde leider keinen Weg, wie ich automatisch den aktuellen Dieselpreis aussortieren kann.
Schaut man die Suchkriterien der Vorlagen, als Beispiel sei die "Hausautomatiserungsanleitung von Matthias Kleine" genannt, so gibt es dort einfache Suchkriterien, die Diesel und Preis herausfischen lassen. Im aktuellen html von www.clever-tanken.de sehe ich hier keine Chance. www.clever-tanken.de scheint es so umgestellt zu haben, dass dies nicht mehr möglich ist. Sehe ich dies richtig und was macht ihr hier? Gibt es einen anderen Weg?
Vielen Dank
Moin Uwe,
ich lese schon seit Jahren clever-tanken per Regex aus, was einwandfrei funktioniert.
Die URL, die du auslesen musst, schaut wie folgt aus:
https://www.clever-tanken.de/tankstelle_liste?spritsorte=7&r=5&ort=Hamburg
Bedeutung:
spritsorte=7
1 = Autogas
2 = LKW-Diesel
3 = Diesel
4 = Bioethanol
5 = SuperE10
6 = SuperPlus
7 = SuperE5
8 = Erdgas
Sprich um Diesel Ergebnisse zu bekommen benötigst du:
https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=5&ort=Ortsname_oder_PLZ
https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=5&ort=22111 (Abfrage für Diesel mit einem Radius 5KM und der PLZ: 22111
Am besten ein HTTPMOD Device mit dem Link anlegen, nun fehlt nur noch die RegEx, meine schauen wie folgt aus:
attr $device reading01Name Tankstellenname ;
attr $device reading01Regex <div class=\"row fuel-station-location-name\">(.*)<\\/div> ;
attr $device reading01RegOpt g ;
attr $device reading02Name Preis ;
attr $device reading02Regex <div class=\"price\">(.*)<sup> ;
attr $device reading02RegOpt g ;
attr $device reading03Name Strasse ;
attr $device reading03Regex <div id=\"fuel-station-location-street\">(.*)<\\/div> ;
attr $device reading03RegOpt g ;
attr $device reading04Name Ort ;
attr $device reading04Regex <div id=\"fuel-station-location-city\"> (.*)<\\/div> ;
attr $device reading04RegOpt g ;
attr $device reading05Name Entfernung ;
attr $device reading05Regex <div >(.*)<\\/div> ;
Dies dient nur als Beispiel! UNGETESTET! Habe mir eine Steuerung für Telegram programmiert.
Gruß
Mathze
ich hab es nach dem hier eingerichtet:
https://waschto.eu/spritmonitor-und-tankalarm-spritpreise-der-umgebung-per-fhem-ueberwachen
Hallo t1me2die
danke für die schnelle Antwort,
ich bin direkt nach deiner Antwort ans Werk gegangen und auch auf einem guten Weg.
Die URL müsste richtig sein, da ich bei Eingabe der URL die richtigen Daten angezeigt bekomme:
https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152
auch die attr habe ich eingefügt (mein device heisst: Draussen_Spritpreis).
==> Ich vermuste, dass es noch ein reading05REGEX geben müsste, das ich aber egänzt habe.
Meine Attr heissen:
attr DRAUSSEN_SPRITPREIS reading01Name Tankstellenname
attr DRAUSSEN_SPRITPREIS reading01Regex <div class=\"row fuel-station-location-name\">(.*)<\\/div>
attr DRAUSSEN_SPRITPREIS reading01RegOpt g
attr DRAUSSEN_SPRITPREIS reading02Name Preis ;
attr DRAUSSEN_SPRITPREIS reading02Regex <div class=\"price\">(.*)<sup>
attr DRAUSSEN_SPRITPREIS reading02RegOpt g
attr DRAUSSEN_SPRITPREIS reading03Name Strasse ;
attr DRAUSSEN_SPRITPREIS reading03Regex <div id=\"fuel-station-location-street\">(.*)<\\/div>
attr DRAUSSEN_SPRITPREIS reading03RegOpt g
attr DRAUSSEN_SPRITPREIS reading04Name Ort
attr DRAUSSEN_SPRITPREIS reading04Regex <div id=\"fuel-station-location-city\"> (.*)<\\/div>
attr DRAUSSEN_SPRITPREIS reading04RegOpt g
attr DRAUSSEN_SPRITPREIS reading05Name Entfernung
attr DRAUSSEN_SPRITPREIS reading05Regex <div >(.*)<\\/div>
attr DRAUSSEN_SPRITPREIS reading05RegOpt g
Die letzte Zeile habe ich ergänzt. Jetzt sehe ich aber im device nur die Spritpreise. Ist schon mal was:
Event monitor zeigt:
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-1: 1.24
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-2: 1.26
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-3: 1.29
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-4: 1.29
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-5: 1.29
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-6: 1.30
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-7: 1.30
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-8: 1.30
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-9: 1.31
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-10: 1.31
2018-12-19 13:36:23 HTTPMOD DRAUSSEN_SPRITPREIS Preis-11: 1.32
Readings sehen so aus:
Preis-1 1.24 2018-12-19 13:38:23
Preis-10 1.31 2018-12-19 13:38:23
Preis-11 1.32 2018-12-19 13:38:23
Preis-2 1.26 2018-12-19 13:38:23
Preis-3 1.29 2018-12-19 13:38:23
Preis-4 1.29 2018-12-19 13:38:23
Preis-5 1.29 2018-12-19 13:38:23
Preis-6 1.30 2018-12-19 13:38:23
Preis-7 1.30 2018-12-19 13:38:23
Preis-8 1.30 2018-12-19 13:38:23
Preis-9 1.31 2018-12-19 13:38:23
Jetzt fehlt noch Ort, Strasse.. was mache ich falsch.
Nochmals vielen Dank...
Moin Uwe,
gib uns bitte mal ein
list Draussen_Spritpreise
Ich bin mir nicht sicher, ob deine RegEx so korrekt sind.
Probier mal:
attr DRAUSSEN_SPRITPREIS reading04Regex <div id=\"fuel-station-location-city\"> (.*)<\/div>
Kleiner Tipp:
Öffne die o.g. URL, kopiere Dir den Seitenquelltext und rufe die Seite: https://regex101.com/
auf.
Kopiere nun den Seitenquelltext dort hinein und teste dein RegEx selber.
So kann man einfach prüfen, ob der RegEx korrekt ist.
Gruß
Mathze
PS.: Ich lege dynamisch mithilfe der myUtils Geräte an, weshalb ich manche Zeichen escapen muss, daher kommt wohl der Fehler.
Probier es mal wie folgt:
attr DRAUSSEN_SPRITPREIS reading01Name Tankstellenname
attr DRAUSSEN_SPRITPREIS reading01Regex <div class=\"row fuel-station-location-name\">(.*)<\/div>
attr DRAUSSEN_SPRITPREIS reading01RegOpt g
attr DRAUSSEN_SPRITPREIS reading02Name Preis ;
attr DRAUSSEN_SPRITPREIS reading02Regex <div class=\"price\">(.*)<sup>
attr DRAUSSEN_SPRITPREIS reading02RegOpt g
attr DRAUSSEN_SPRITPREIS reading03Name Strasse ;
attr DRAUSSEN_SPRITPREIS reading03Regex <div id=\"fuel-station-location-street\">(.*)<\/div>
attr DRAUSSEN_SPRITPREIS reading03RegOpt g
attr DRAUSSEN_SPRITPREIS reading04Name Ort
attr DRAUSSEN_SPRITPREIS reading04Regex <div id=\"fuel-station-location-city\"> (.*)<\/div>
attr DRAUSSEN_SPRITPREIS reading04RegOpt g
attr DRAUSSEN_SPRITPREIS reading05Name Entfernung
attr DRAUSSEN_SPRITPREIS reading05Regex <div >(.*)<\/div>
attr DRAUSSEN_SPRITPREIS reading05RegOpt g
Hi,
ohne Ort und Strasse, dafür mit FileLog :)
Abfrage einer Tankstelle:
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:.*
Anpassen: Einfach Tankstellennummer ändern
Gruß Otto
Hallo t1me2die und Otto
@t1me2die
das sieht sehr sehr gut aus, die Entfernungen fehlen noch. Ich glaube aber, dass ich den Fehler gefunden habe. Ich füge ihn an, falls noch ein weiterer User darauf zurückgreifen will.
attr DRAUSSEN_SPRITPREIS reading05Regex <div id=\"fuel-station-location-street\">(.*)<\/div>
==> dein Paste und Copy .. ;D ;D Toller Support. Jetzt muss ich es "nur noch" verstehen.
@ Otto: heute Abend schaue ich jetzt mal die Lösung mit dem filelog an.
Nochmals vielen Dank für den support.
Danke
Moin Uwe,
das freut mich.
Pauschal gesagt liest HTTPMOD den Seitenquelltext von der jeweiligen URL aus.
Du legst dann mit verschiedenen RegEx einen Suchfilter fest.
Das Matching also das Ergebnis aus dem RegEx wird dann dein Reading.
Daher sagte ich ja, öffne von der jeweiligen URL den Quelltext (rechte Maustaste -> Seitenquelltext öffnen) kopiere alles und klatsche es bei: https://regex101.com/ rein.
Nimm Dir nun eins deiner RegEx und trage dies oben bei regulare Ausdrücke ein. Das "Match" (Reading) siehst du dann direkt auf der rechten Seite :)
Falls noch Fragen sind, immer raus damit.
Gruß
Mathze
Hallo t1me2die,
ist es vermessen zu fragen, ob du noch den Codeschnipsel für "TelegrammBot" zuschickst.
TelegramBot habe ich funktionsfähig integriert in FHEM.
Merci
Moin Uwe,
was möchtest du genau haben?
Gruß
Mathze
Hallo Mathze,
danke für die Rückantwort. Über TelegramBot möchte ich mir diese aktuellen Spritpreise für meine Region bei Bedarf zuschicken lassen. Es geht mir hier um 2 Dinge. Zum einen um genau diesen Service "einfach" auf Knopfdruck "TelegramBot" über "Favorites" nutzen zu können und zum anderen noch darum, eine Vorlage zur weiteren Verarbeitung in FHEM von solchen Daten an Beispielen nachvollziehen zu können. Ich bin nicht der Programmierer, möchte aber eine Alarmanlage in FHEM. Aktuell versuche ich die verschiedenen Dienste zu lernen: TelegramBot, Gerfancy, Notifies, Filelog, Graphen, Events..
Die Spitpreise der Umgebung bei Bedarf auf das Handy als Überblick zu haben ist aber ein toller Gack. Man kann natürlich immer auch über Clever-Tanken gehen, aber das kann jeder..
Uwe
Moin Uwe,
dazu benötigst du nicht viel.
Du brauchst zuerst einmal ein Notify oder Doif (je nachdem was dir mehr zusagt), mit welches du auf eingehende Telegram Nachrichten reagierst.
z.B.
define getMessageTelegram notify Telegram:msgId:.* { checkMessage() }
Nun legst du in der 99_myUtils eine Routine an, wo du die eingehenden Nachrichten prüfst:
sub checkMessage()
{
my $id = ReadingsVal("TelegramBot_DeviceName","msgPeerId","");
my $alias = ReadingsVal("TelegramBot_DeviceName","msgPeer","");
my $message = ReadingsVal("TelegramBot_DeviceName","msgText","");
my $horn = ReadingsVal("Star_Horn","SuperE5","");
my $rahlstedt = ReadingsVal("Star_Rahlstedt","SuperE5","");
if ($message =~ /Spritpreise/)
{
fhem "set Telegram message \@$id " Der Spritpreis für SuperE5 beträgt: \n* Horn: $horn€ \n* Rahlstedt: $rahlstedt€";
}
}
Du musst hier natürlich den "TelegramBot_DeviceName" durch deinen Telegrambotnamen ersetzen.
Ich habe zwei Haupttankstelle, einmal "Star_Horn" und einmal "Star_Rahlstedt", aus diesen beiden HTTPMOD Geräten hole ich mir den aktuellen Preis für das Reading "SuperE5".
In dieser sehr stark verkürzten Sub wird die eingehende Telegram Nachricht $message geprüft auf den Inhalt "Spritpreise", als Ergebnis wird eine Telegramnachricht an den Verfasser zurückgeschickt mit den Preisen.
Das o.g. Beispiel wurde von mir stark verkürzt und nicht getestet, es soll lediglich ein Gedankenanstoß sein.
Außerdem habe ich mir eine kleine Routine geschrieben, die bei einer Preisunterschreitung eine automatische Nachricht via Telegram verschickt.
Dazu benötigst du wieder ein Notify, welches auf deine HTTPMOD Gerät reagiert, z.B.:
define n_Spritpreise notify Star_Horn:SuperE5:.*|Star_Rahlstedt:SuperE5:.* { checkSpritpreise($NAME,$EVTPART0,$EVTPART1) }
Hier siehst du wieder meine beiden Haupttankstellen.
Das Notify ruft nun eine Routine auch in der 99_myUtils auf um die Preise zu prüfen.
Auch diese Routine habe ich stark verkürzt und nicht getestet.
sub checkSpritpreise($$$)
{
my ($tankstelle, $benzin, $preis) = @_;
my $id = ReadingsVal("TelegramBot_DeviceName","msgPeerId","");
$tankstelle =~ s/_/ /g;
if (($tankstelle eq "Star Horn" or $tankstelle eq "Star Rahlstedt") && (($preis * 100) <= 130))
{ fhem "set Telegram message \@$id $tankstelle \n$benzin $preis€";
}
}
Im Anhang siehst du ein Screenshot, wie das ungefähre Ergebnis bei mir ausschaut :)
Ich hoffe, ich konnte Dir bisschen auf die Sprünge helfen.
Gruß
Mathze
Hallo,
habe mich mal mit dem Modul HTTPMOD und den beinhalteten Verweisen beschäftigt und mir ist noch was aufgefallen:
Bei meinen Spritpreisen, besser Distanzen aus" clever-tanken " werden die Entfernungen durch mein Gerät nicht ausgelesen. Dies wollte ich verstehen und verbessern.
Die HTML Stelle für die Distanz auf der Webseite "clever-tanken" lautet:
<div class="fuel-station-location-address-distance">
<div>9.0 km</div>
das dazugehörige Attribut habe ich mir so überlegt:
attr DRAUSSEN_SPRITPREIS reading05Regex <div id=\"fuel-station-location-address-distance\"><div>(.*)<\/div>
Erklärung: es soll nach reading05 geschrieben werden. REGEX sucht nach fuel-station-location-address-distance. Wie man auf die "<div id=\" und die "\" kommt, konnte ich nicht ergünden. Anschliessend liest Regex alles ein, was nach dem String "><div>" kommt. Hier muss aber ein Fehler sein.
Zum Vergleich, es funktioniert das Einlesen der Adresse aus clever-tanken korrekt:
Die HTML Stelle für die Adresse auf clever-tanken lautet:
<div id="fuel-station-location-street">Bundesstr. 58</div>
das dazugehörige/funktionierende) Attribut:
attr DRAUSSEN_SPRITPREIS reading03Regex <div id=\"fuel-station-location-street\">(.*)<\/div>
meine Erklärung für diese Attribut : REGEX sucht nach "fuel-station-location-street": Warum im attr nach "street" der "\" folgt, konnte ich nicht sagen. Auch intensivstes Suchen brachte hinsichtlich der Syntax nicht weiter. .. Dann liest er (.*) ein, was hinter einem > nach dem Ende der Suckkriteriums steht, also was hinter street steht.
So habe ich auch mein Attribut für Distanz aufgesetzt.
Die Stelle mit der Distanz ist im HTML unterschiedlich zu street. Hier ist noch ein <div> dazwischen. Oder mache ich hier einen Denkfehler. Deshalb ein anderes Regex.
Zur besseren Verdeutlichung , doer falls ich an einer anderen Stelle einen Fehler habe, habe ich noch ein list angehängt
Internals:
BUSY 0
DEF https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152 60
Interval 60
LASTSEND 1545309740.98119
MainURL https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152
ModuleVersion 3.5.4 - 9.11.2018
NAME DRAUSSEN_SPRITPREIS
NR 125
STATE ???
TRIGGERTIME 1545309800.98045
TRIGGERTIME_FMT 2018-12-20 13:43:20
TYPE HTTPMOD
addr https://www.clever-tanken.de:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152
header
host www.clever-tanken.de
httpheader HTTP/1.1 200 OK
Date: Thu, 20 Dec 2018 12:42:21 GMT
Server: Apache/2.4.18 (Ubuntu)
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 14719
Content-Type: text/html; charset=utf-8
Set-Cookie: spritsorte=3; expires=Fri, 20-Dec-2019 12:42:21 GMT; Max-Age=31536000; Path=/
Set-Cookie: search_city=; expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/
Connection: close
httpversion 1.0
hu_blocking 0
hu_filecount 11
hu_port 443
hu_portSfx
ignoreredirects 0
loglevel 4
path /tankstelle_liste?spritsorte=3&r=10&ort=52152
protocol https
redirects 0
timeout 2
url https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152
value 0
QUEUE:
READINGS:
2018-12-19 14:42:23 Entfernung 10.4 km
2018-12-20 13:00:00 Entfernung-1 Nideggener Str. 25
2018-12-20 13:00:00 Entfernung-10 Bundesstr. Haus Nr. 7
2018-12-20 13:00:00 Entfernung-11 Hauptstr. 144
2018-12-20 13:00:00 Entfernung-2 Germeter 135
2018-12-20 13:00:00 Entfernung-3 In den Bremen 20
2018-12-20 13:00:00 Entfernung-4 Triererstr. 112
2018-12-20 13:00:00 Entfernung-5 Bergstr. 2
2018-12-20 13:00:00 Entfernung-6 Schmiedstr. 4-6
2018-12-20 13:00:00 Entfernung-7 Bundesstr. 58
2018-12-20 13:00:00 Entfernung-8 Bundesstr. 1
2018-12-20 13:00:00 Entfernung-9 Trierer Str. 232
2018-12-20 13:42:21 Ort-1 52159 Roetgen
2018-12-20 13:42:21 Ort-10 52159 Roetgen
2018-12-20 13:42:21 Ort-11 52156 Monschau
2018-12-20 13:42:21 Ort-2 52385 Nideggen
2018-12-20 13:42:21 Ort-3 52393 Hürtgenwald
2018-12-20 13:42:21 Ort-4 52152 Simmerath
2018-12-20 13:42:21 Ort-5 52152 Simmerath
2018-12-20 13:42:21 Ort-6 52156 Monschau
2018-12-20 13:42:21 Ort-7 52152 Simmerath
2018-12-20 13:42:21 Ort-8 52152 Simmerath
2018-12-20 13:42:21 Ort-9 52156 Monschau
2018-12-19 14:40:23 Preis 1.24
2018-12-20 13:42:21 Preis-1 1.26
2018-12-20 13:42:21 Preis-10 1.30
2018-12-20 13:42:21 Preis-11 1.31
2018-12-20 13:42:21 Preis-2 1.28
2018-12-20 13:42:21 Preis-3 1.28
2018-12-20 13:42:21 Preis-4 1.28
2018-12-20 13:42:21 Preis-5 1.28
2018-12-20 13:42:21 Preis-6 1.29
2018-12-20 13:42:21 Preis-7 1.29
2018-12-20 13:42:21 Preis-8 1.29
2018-12-20 13:42:21 Preis-9 1.30
2018-12-20 13:42:21 Strasse-1 Bundesstr. 58
2018-12-20 13:42:21 Strasse-10 Bundesstr. Haus Nr. 7
2018-12-20 13:42:21 Strasse-11 Hauptstr. 144
2018-12-20 13:42:21 Strasse-2 Nideggener Str. 25
2018-12-20 13:42:21 Strasse-3 Germeter 135
2018-12-20 13:42:21 Strasse-4 Bundesstr. 1
2018-12-20 13:42:21 Strasse-5 In den Bremen 20
2018-12-20 13:42:21 Strasse-6 Triererstr. 112
2018-12-20 13:42:21 Strasse-7 Bergstr. 2
2018-12-20 13:42:21 Strasse-8 Schmiedstr. 4-6
2018-12-20 13:42:21 Strasse-9 Trierer Str. 232
2018-12-20 13:42:21 Tankstellenname-1 bft
2018-12-20 13:42:21 Tankstellenname-10 TOTAL
2018-12-20 13:42:21 Tankstellenname-11 ARAL
2018-12-20 13:42:21 Tankstellenname-2 bft
2018-12-20 13:42:21 Tankstellenname-3 BFT Tankstelle
2018-12-20 13:42:21 Tankstellenname-4 bft
2018-12-20 13:42:21 Tankstellenname-5 Markant (Tankautomat)
2018-12-20 13:42:21 Tankstellenname-6 Tankstelle Huppertz
2018-12-20 13:42:21 Tankstellenname-7 bft
2018-12-20 13:42:21 Tankstellenname-8 Shell
2018-12-20 13:42:21 Tankstellenname-9 T
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&ort=52152
value 0
defptr:
readingBase:
Ort-1 reading
Ort-10 reading
Ort-11 reading
Ort-2 reading
Ort-3 reading
Ort-4 reading
Ort-5 reading
Ort-6 reading
Ort-7 reading
Ort-8 reading
Ort-9 reading
Preis-1 reading
Preis-10 reading
Preis-11 reading
Preis-2 reading
Preis-3 reading
Preis-4 reading
Preis-5 reading
Preis-6 reading
Preis-7 reading
Preis-8 reading
Preis-9 reading
Strasse-1 reading
Strasse-10 reading
Strasse-11 reading
Strasse-2 reading
Strasse-3 reading
Strasse-4 reading
Strasse-5 reading
Strasse-6 reading
Strasse-7 reading
Strasse-8 reading
Strasse-9 reading
Tankstellenname-1 reading
Tankstellenname-10 reading
Tankstellenname-11 reading
Tankstellenname-2 reading
Tankstellenname-3 reading
Tankstellenname-4 reading
Tankstellenname-5 reading
Tankstellenname-6 reading
Tankstellenname-7 reading
Tankstellenname-8 reading
Tankstellenname-9 reading
readingNum:
Ort-1 04
Ort-10 04
Ort-11 04
Ort-2 04
Ort-3 04
Ort-4 04
Ort-5 04
Ort-6 04
Ort-7 04
Ort-8 04
Ort-9 04
Preis-1 02
Preis-10 02
Preis-11 02
Preis-2 02
Preis-3 02
Preis-4 02
Preis-5 02
Preis-6 02
Preis-7 02
Preis-8 02
Preis-9 02
Strasse-1 03
Strasse-10 03
Strasse-11 03
Strasse-2 03
Strasse-3 03
Strasse-4 03
Strasse-5 03
Strasse-6 03
Strasse-7 03
Strasse-8 03
Strasse-9 03
Tankstellenname-1 01
Tankstellenname-10 01
Tankstellenname-11 01
Tankstellenname-2 01
Tankstellenname-3 01
Tankstellenname-4 01
Tankstellenname-5 01
Tankstellenname-6 01
Tankstellenname-7 01
Tankstellenname-8 01
Tankstellenname-9 01
readingOutdated:
readingSubNum:
Ort-1 -1
Ort-10 -10
Ort-11 -11
Ort-2 -2
Ort-3 -3
Ort-4 -4
Ort-5 -5
Ort-6 -6
Ort-7 -7
Ort-8 -8
Ort-9 -9
Preis-1 -1
Preis-10 -10
Preis-11 -11
Preis-2 -2
Preis-3 -3
Preis-4 -4
Preis-5 -5
Preis-6 -6
Preis-7 -7
Preis-8 -8
Preis-9 -9
Strasse-1 -1
Strasse-10 -10
Strasse-11 -11
Strasse-2 -2
Strasse-3 -3
Strasse-4 -4
Strasse-5 -5
Strasse-6 -6
Strasse-7 -7
Strasse-8 -8
Strasse-9 -9
Tankstellenname-1 -1
Tankstellenname-10 -10
Tankstellenname-11 -11
Tankstellenname-2 -2
Tankstellenname-3 -3
Tankstellenname-4 -4
Tankstellenname-5 -5
Tankstellenname-6 -6
Tankstellenname-7 -7
Tankstellenname-8 -8
Tankstellenname-9 -9
requestReadings:
update:
Ort-1 reading 04-1
Ort-10 reading 04-10
Ort-11 reading 04-11
Ort-2 reading 04-2
Ort-3 reading 04-3
Ort-4 reading 04-4
Ort-5 reading 04-5
Ort-6 reading 04-6
Ort-7 reading 04-7
Ort-8 reading 04-8
Ort-9 reading 04-9
Preis-1 reading 02-1
Preis-10 reading 02-10
Preis-11 reading 02-11
Preis-2 reading 02-2
Preis-3 reading 02-3
Preis-4 reading 02-4
Preis-5 reading 02-5
Preis-6 reading 02-6
Preis-7 reading 02-7
Preis-8 reading 02-8
Preis-9 reading 02-9
Strasse-1 reading 03-1
Strasse-10 reading 03-10
Strasse-11 reading 03-11
Strasse-2 reading 03-2
Strasse-3 reading 03-3
Strasse-4 reading 03-4
Strasse-5 reading 03-5
Strasse-6 reading 03-6
Strasse-7 reading 03-7
Strasse-8 reading 03-8
Strasse-9 reading 03-9
Tankstellenname-1 reading 01-1
Tankstellenname-10 reading 01-10
Tankstellenname-11 reading 01-11
Tankstellenname-2 reading 01-2
Tankstellenname-3 reading 01-3
Tankstellenname-4 reading 01-4
Tankstellenname-5 reading 01-5
Tankstellenname-6 reading 01-6
Tankstellenname-7 reading 01-7
Tankstellenname-8 reading 01-8
Tankstellenname-9 reading 01-9
sslargs:
Attributes:
icon gasoline
reading01Name Tankstellenname
reading01RegOpt g
reading01Regex <div class=\"row fuel-station-location-name\">(.*)<\/div>
reading02Name Preis
reading02RegOpt g
reading02Regex <div class=\"price\">(.*)<sup>
reading03Name Strasse
reading03RegOpt g
reading03Regex <div id=\"fuel-station-location-street\">(.*)<\/div>
reading04Name Ort
reading04RegOpt g
reading04Regex <div id=\"fuel-station-location-city\"> (.*)<\/div>
reading05Name Entfernung
reading05RegOpt g
reading05Regex <div id=\"fuel-station-location-address-distance\">(.*)<\/div>
room DRAUSSEN
userattr reading01Name reading01RegOpt reading01Regex reading02Name reading02RegOpt reading02Regex reading03Name reading03RegOpt reading03Regex reading04Name reading04RegOpt reading04Regex reading05Name reading05RegOpt reading05Regex
Moin Uwe,
probiere es mal wie folgt:
attr DRAUSSEN_SPRITPREIS reading05Name Entfernung
attr DRAUSSEN_SPRITPREIS reading05Regex <div >(.*)<\/div>
attr DRAUSSEN_SPRITPREIS reading05RegOpt g
Gruß
Mathze
Hallo Mathze,
super, das wars, das Attribut
attr DRAUSSEN_SPRITPREIS reading05Regex <div >(.*)<\/div>
kann ich mir nicht erklären. Und ich hab leider auch keine Doku gefunden, die mir das erklärt. Liegt sicherlich an mir.
Trotzdem ganz toller support.
Danke
Uwe
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.
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 :)
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
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;
Hallo inoma,
schaue ich mir gleich über das Wochende an. Vielen Dank und auch Schöne Weichnachten..
Uwe
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.
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
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 (https://forum.fhem.de/index.php/topic,22554.0.html)
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
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.
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 ?
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
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
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.
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
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 ;) .
Hallo Christoph Morrisson ,
das ist doch genau das, was ich mir wünsche. Kannst du dies bitte mal darstellen, schicken?
Das wäre prima.
Uwe
Hallo Mathze,
zwischenzeitlich war ich anderweitig tätig, leider.
Jetzt habe ich mich um deinen Vorschlag gekümmert:
Zitatdazu benötigst du nicht viel.
Du brauchst zuerst einmal ein Notify oder Doif (je nachdem was dir mehr zusagt), mit welches du auf eingehende Telegram Nachrichten reagierst.
z.B.
Code: [Auswählen]
define getMessageTelegram notify Telegram:msgId:.* { checkMessage() }
Nun legst du in der 99_myUtils eine Routine an, wo du die eingehenden Nachrichten prüfst:
Hat prima geklammt, die Tele-Bot abfragen zu den Spritpreisen laufen nun problemlos für alle angemeldeten Nutzer.
Den Code hab ich auch verstanden, es ist von verstanden immer noch ein grosser Weg zu selbst generierter Code. Ist mir sehr klar.
Merci nochmals, werde auch noch dein 2.Beispiel mit dem Benzinpreisalarm näher betrachten.
Moin Uwe, dass freut mich, falls du Fragen hast oder irgendwas nicht verstehst, melde Dich einfach mit einem konkreten Beispiel, dann kann ich es Dir erklären.
Gruß
Mathze
Hallo,
ich habe folgende Fehlermeldung:
Unrecognized character \xC3; marked by <-- HERE after ritpreis f<-- HERE near column 66 at ./FHEM/99_myUtils.pm line 22.
Meine 99_myUtils.pm sieht folgendermassen aus:
sub checkMessage()
{
my $id = ReadingsVal("TelegramFS","msgPeerId","");
my $alias = ReadingsVal("TelegramFS","msgPeer","");
my $message = ReadingsVal("TelegramFS","msgText","");
my $Trebsen = ReadingsVal("TankeTrebsen","SuperE5","");
my $Globus = ReadingsVal("TankeGlobus","SuperE5","");
if ($message =~ /Sprit/)
{
fhem "set TelegramFS message \@$id " Der Spritpreis für Diesel beträgt: \n* Trebsen: $Trebsen€ \n* Globus: $Globus€";
}
}
Wo könnte der Fehler sein?
Dankeschön
schreib mal fuer statt für ;)
Dankeschön Otto,
aber nun:
ERROR:
Unrecognized character \xE2; marked by <-- HERE after : $Trebsen<-- HERE near column 108 at ./FHEM/99_myUtils.pm line 22.
sub checkMessage()
{
my $id = ReadingsVal("TelegramFS","msgPeerId","");
my $alias = ReadingsVal("TelegramFS","msgPeer","");
my $message = ReadingsVal("TelegramFS","msgText","");
my $Trebsen = ReadingsVal("TankeTrebsen","SuperE5","");
my $Globus = ReadingsVal("TankeGlobus","SuperE5","");
if ($message =~ /Sprit/)
{
fhem "set TelegramFS message \@$id " Der Spritpreis fuer Diesel betraegt: \n* Trebsen: $Trebsen€ \n* Globus: $Globus€";
}
}
bin ratlos...
Liebe Grüße
Moin,
naja immer dasselbe Schema ;D
Ich dachte Du schnallst es beim ersten ;D
Es steht doch exakt im Text:
Unrecognized character \xE2; marked by <--
HERE after : $Trebsen<-- HERE ...
Was steht dort? Ein €
Dein Telegram oder wer auch immer auf dieser Reise kommt mit Sonderzeichen nicht klar. Vielleicht muss man die "schützen" bzw. "escapen" oder erstmal weglassen.
Eigentlich kann Perl an sich an der Stelle mit Sonderzeichen umgehen. Aber vielleicht ist irgendwo ein falscher Zeichensatz eingestellt oder so was.
Also lass erstmal alles an Sonderzeichen weg.
Gruß Otto
Oh Mann,
Du hast beim nächsten Treffen ein Bier gut. ;D
Dennoch 2 weitere Fragen.
Wo muß/kann ich den Zeichensatz wohin umstellen?
Und das Ganze für zwei Nutzer mit verschiedenen Spritarten, geht das? Ich habs probiert, in die 99_myUtils.pm das Ganze 2 mal mit angepassten TelegrammDevices, da sendet er nichts mehr.
Dankeschön
Probier mit \x{20AC} statt €
Zitat von: FHEM-User22 am 06 April 2019, 16:17:14
Dennoch 2 weitere Fragen.
Wo muß/kann ich den Zeichensatz wohin umstellen?
Und das Ganze für zwei Nutzer mit verschiedenen Spritarten, geht das? Ich habs probiert, in die 99_myUtils.pm das Ganze 2 mal mit angepassten TelegrammDevices, da sendet er nichts mehr.
zur 1.
Ich bin mir noch nicht ganz sicher, wieso dieser Fehler auftritt. Ich kann bei mir durchaus Umlaute usw. verwenden.
Deswegen müsstest Du mal drei Stellen testen.
in der FHEM Kommandozeile
set irgendeinDummy Müller
set TelegramFS message ?? "Müller" (ich weiß nicht wie das mit Telegram wirklich geht, deswegen die ??)
in der 99_myUtils in einer Testsub
sub testmueller {fhem ("set irgendeinDummy Müller") }
Kommt der Perlfehler immer?
zur 2. da müsstes Du mal den Code posten, ich verstehe nicht, warum das nicht gehen soll.
Gruß Otto
Hallo Otto,
Zitat von: Otto123 am 07 April 2019, 19:00:22
zur 1.
Ich bin mir noch nicht ganz sicher, wieso dieser Fehler auftritt. Ich kann bei mir durchaus Umlaute usw. verwenden.
Bei der Neuinstallation (auf Proxmox):
# Konfigurieren lokale Sprache deutsch
sudo sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen
sudo locale-gen
sudo localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE
soll ich hier irgend was anderes eintagen?
Zitat von: Otto123 am 07 April 2019, 19:00:22
Deswegen müsstest Du mal drei Stellen testen.
in der FHEM Kommandozeile
set irgendeinDummy Müller
Ich kann einen Dummy "Lampe02" auf "Müller" schalten. Das klappt.
Zitat von: Otto123 am 07 April 2019, 19:00:22
set TelegramFS message ?? "Müller" (ich weiß nicht wie das mit Telegram wirklich geht, deswegen die ??)
set TelegramFS message Müller
kommt an. Passt auch.
Zitat von: Otto123 am 07 April 2019, 19:00:22
in der 99_myUtils in einer Testsub
sub testmueller {fhem ("set irgendeinDummy Müller") }
Kommt der Perlfehler immer?
sub testmueller {fhem ("set Lampe02 Müller") }
geht ohne Fehler
Gaaaaanz seltsam, jetzt kann ich in der 99_myUtils plötzlich € eingeben und es werden keine Fehler angezeigt.
Ob das €-Zeichen durch PlugandPlay "verwurschtelt" war? Jetzt habe ich es über Tastatur eingegeben.
Auch "beträgt" macht keine Fehler mehr.
Ich habe sonst nichts geändert!
Zitat von: Otto123 am 07 April 2019, 19:00:22
zur 2. da müsstes Du mal den Code posten, ich verstehe nicht, warum das nicht gehen soll.
Das mache nachher...
Dankeschön aus Grimma
Hallo nochmal,
Zitat von: Otto123 am 07 April 2019, 19:00:22
zur 2. da müsstes Du mal den Code posten, ich verstehe nicht, warum das nicht gehen soll.
Es wird immer seltsamer, jetzt habe ich alles 2 mal (Für 2 Telegramme) angelegt, und siehe da, es klappt. Ich weiss nicht, was gestern los war. Jetzt klappt alles.
Supi, Freu.
Jetzt nur noch 2 Wünsche.... schnellwechduck....
Spritpreise im Telegram auf 2 Stellen runden, die 0,009 bleibt ja meist gleich.
und in der 99_myUtils:
my $id = ReadingsVal("TelegramFS","msgPeerId","");
my $alias = ReadingsVal("TelegramFS","msgPeer","");
my $message = ReadingsVal("TelegramFS","msgText","");
my $Trebsen = ReadingsVal("TankeTrebsen","SuperE5","");
my $TankeAralGrimmaAB = ReadingsVal("TankeAralGrimmaAB","SuperE5","");
my $TankeStarNHF = ReadingsVal("TankeStarNHF","SuperE5","");
my $Globus = ReadingsVal("TankeGlobus","SuperE5","");
if ($message =~ /Sprit/)
{
fhem "set TelegramFS message \@$id Der Spritpreis fuer Super beträgt: \n* Trebsen: $Trebsen € \n* ARAL oben: $TankeAralGrimmaAB € \n* Star NHF: $TankeStarNHF € \n* Globus: $Globus €";
Könnte man das zusammenfassen, also nur eine Zeile mit "Tanke*" nötig ist und natürlich beim Ausdruck der Telegramzeile den Devicenamen?
Ansonsten Alles Super! Dankeschön für Eure Hilfen.
Grüße aus Grimma
Hi,
runden: https://forum.fhem.de/index.php/topic,98746.msg928246.html#msg928246 ;)
Gruß Otto
Ich bekomme seit ein paar Tagen bei Clever-tanken immer nur noch eine Fehlermeldung:
"Read response to Update didn't match any Reading(s)"
Hat das auch einer? Oder hat einer viell. eine Idee?
Der Spritpreismonitor ist wie im Wiki definiert, z.B. "SHELL" https://wiki.fhem.de/wiki/Spritpreismonitor
Schau mal hier, da ist ein neuer Thread aufgemacht worden: https://forum.fhem.de/index.php/topic,99939.msg933292.html#msg933292
Danke, das habe ich jetzt gerade auch gesehen. Ich habe auch ein zusätzlichen Monitor, den ich nach Vorgabe von Matze aus Antwort #1 in diesem Thread eingerichtet habe,
wenn ich die Änderungen so mache, wie in https://forum.fhem.de/index.php/topic,99939.msg933292.html#msg933292 vorgeschlagen,
bekomme ichtrotzdem keine Readings :-(
Der link und meine RegEx wie bei Matze aus Antwort #1
https://www.clever-tanken.de/tankstelle_liste?spritsorte=7&r=10&lat=47.875943&lon=10.550710 1200
attr $device reading01Name Tankstellenname ;
attr $device reading01Regex <div class=\"row fuel-station-location-name\">(.*)<\\/div> ;
attr $device reading01RegOpt g ;
attr $device reading02Name Preis ;
attr $device reading02Regex <div class=\"price\">(.*)<sup> ;
attr $device reading02RegOpt g ;
attr $device reading03Name Strasse ;
attr $device reading03Regex <div id=\"fuel-station-location-street\">(.*)<\\/div> ;
attr $device reading03RegOpt g ;
attr $device reading04Name Ort ;
attr $device reading04Regex <div id=\"fuel-station-location-city\"> (.*)<\\/div> ;
attr $device reading04RegOpt g ;
attr $device reading05Name Entfernung ;
attr $device reading05Regex <div >(.*)<\\/div> ;
Clever Tanken hat seine Webseite umgestellt, versuche mal folgendes (ohne Gewähr):
attr $device reading01Regex <span class=\"fuel-station-location-name\">(.*)<\\/span> ;
attr $device reading02Regex <div class=\"price-text price text-color-ct-blue\">(?>\s*)(\d.*)<sup> ;
attr $device reading03Regex <div class=\"fuel-station-location-street\">(.*)<\\/div> ;
attr $device reading04Regex <div class=\"fuel-station-location-city\"> (.*)<\\/div> ;
attr $device reading05Regex <span class=\"fuel-station-location-distance d-flex justify-content-end\">(?>\s*)<span>(\d.\d) ;
(getestet mit https://regex101.com/)
Danke Danke, Preis und Distanz gehen schon wieder, aber fuel-station-location-name, fuel-station-location-street, und fuel-station-location-city liefern noch keine Readings. Wie kann ich das debuggen?
Debuggen geht indem du deinen clever-tanken Link (https://www.clever-tanken.de/tankstelle_liste?spritsorte=7&r=10&lat=47.875943&lon=10.550710) öffnest, Quelltext anzeigen lässt und diesen dann in das Textfeld auf https://regex101.com (https://regex101.com) kopierst. Das RegEx kommt in die Eingabezeile ganz oben und rechts siehst du das Ergebnis.
Allerdings bekomme ich Werte für
- fuel-station-location-name mit <span class="fuel-station-location-name">(.*)<\/span>
- fuel-station-location-street mit <div class="fuel-station-location-street">(.*)<\/div>
- fuel-station-location-city mit <div class="fuel-station-location-city">(.*)<\/div>
geliefert.
DANKE, jetzt gehts, Du hast mich in die richtige Richtung geschubst!
Mein Beitrag in Antwort#18 habe ich dann auch gleich korrigiert!
Ich schalte mal noch den Querverweis
https://forum.fhem.de/index.php/topic,99939.0.html
Aus dem Post von yersinia Antwort #46:
ZitatClever Tanken hat seine Webseite umgestellt, versuche mal folgendes (ohne Gewähr):
Code: [Auswählen]
attr $device reading01Regex <span class=\"fuel-station-location-name\">(.*)<\\/span> ;
attr $device reading02Regex <div class=\"price-text price text-color-ct-blue\">(?>\s*)(\d.*)<sup> ;
attr $device reading03Regex <div class=\"fuel-station-location-street\">(.*)<\\/div> ;
attr $device reading04Regex <div class=\"fuel-station-location-city\"> (.*)<\\/div> ;
attr $device reading05Regex <span class=\"fuel-station-location-distance d-flex justify-content-end\">(?>\s*)<span>(\d.\d) ;
(getestet mit https://regex101.com/)
Clever Tanken hat seine Webseite schon wieder umgestellt, das letzte Regex muss jetzt wie folgt geändert werden, also 'span' -> 'div':
attr $device reading05Regex <div class=\"fuel-station-location-distance d-flex justify-content-end\">(?>\s*)<span>(\d.\d) ;
Ich verwende jetzt mehr-tanken.de. Hier am Beispiel mit "63150+Heusenstamm". Müsst ihr natürlich ändern.
define AGIPBenzinpreis HTTPMOD https://mehr-tanken.de/tankstellen?searchText=63150+Heusenstamm&brand=1&fuel=2 3600
attr AGIPBenzinpreis userattr readingsName_SuperE5 readingsRegex_SuperE5
attr AGIPBenzinpreis readingsName_SuperE5 SuperE5
attr AGIPBenzinpreis readingsRegex_SuperE5 <span class="PriceList__itemPrice h1">[^0-9]+([0-9\.]+)
attr AGIPBenzinpreis room 10_Draußen
attr AGIPBenzinpreis stateFormat Preis: SuperE5 €
Die Variante von hier (https://forum.fhem.de/index.php/topic,99939.msg933304.html#msg933304)funktioniert nach wie vor :D
Ja, ich habe aber einen Monitor nach Vorgabe von Matze aus Antwort #1 in diesem Thread eingerichtet, der andere RegEx.
Ich benutze Lat/Lon um mir die Spritpreise in Abhängigkeit von meiner Parkposition anzuzeigen.