Günstigste Tankstelle in der Umgebung

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Frank Loecken
Beiträge: 72
Registriert: 15.11.2014, 15:34

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Frank Loecken » 11.04.2015, 11:25

Tolles Script, läuft bestens!

Frank Loecken
Beiträge: 72
Registriert: 15.11.2014, 15:34

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Frank Loecken » 11.04.2015, 11:59

Frage, kann man bei den Preisen auch die Uhrzeit der letzten Aktualisierung anzeigen, innerhalb der Systemvariablen?

oreider
Beiträge: 173
Registriert: 28.12.2013, 16:23
Hat sich bedankt: 4 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von oreider » 11.04.2015, 14:05

ldittmar hat geschrieben:
Genau so.... Damit das Ding läuft brauch man aber CUxD und ein virtuelles Gerät. (bei mir CUxD.CUX2801001:2)
Danke... das wars. Meine System Exec war anders bezeichnet.
Jetzt läufts auch bei mir!

Benutzeravatar
ldittmar
Beiträge: 467
Registriert: 07.03.2015, 12:21
System: CCU
Danksagung erhalten: 1 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von ldittmar » 11.04.2015, 14:12

Frank Loecken hat geschrieben:Frage, kann man bei den Preisen auch die Uhrzeit der letzten Aktualisierung anzeigen, innerhalb der Systemvariablen?
Leider wird die Zeit der Aktualisierung nicht mitgeliefert.
Download: WebMatic 2.2.3. Für den Kauf von HM Geräte zur schnellere Weiterentwicklung von Webmatic, werden auch gerne SPENDEN entgegen genommen. Danke! Und hier geht es zur WebMatic Homepage

oreider
Beiträge: 173
Registriert: 28.12.2013, 16:23
Hat sich bedankt: 4 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von oreider » 11.04.2015, 14:22

Was muss ich jetzt noch anpassen um eine weitere Spritsorte einzufügen...?

Benutzeravatar
ldittmar
Beiträge: 467
Registriert: 07.03.2015, 12:21
System: CCU
Danksagung erhalten: 1 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von ldittmar » 11.04.2015, 14:45

oreider hat geschrieben:Was muss ich jetzt noch anpassen um eine weitere Spritsorte einzufügen...?
Leider geht das nicht. Man kann nur jeweils nach eine Sorte suchen. Es gibt aber die Möglichkeit alle Sorten einer bestimmten Tankstelle zu finden. Man könnte also diesen Skript so erweitern, dass er sich die restlichen Daten aus den 2 günstigsten Tankstellen holt. Wäre das ok? Oder halt die Suche einmal mit Benzin und einmal mit Diesel ausführen :wink:
Download: WebMatic 2.2.3. Für den Kauf von HM Geräte zur schnellere Weiterentwicklung von Webmatic, werden auch gerne SPENDEN entgegen genommen. Danke! Und hier geht es zur WebMatic Homepage

oreider
Beiträge: 173
Registriert: 28.12.2013, 16:23
Hat sich bedankt: 4 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von oreider » 11.04.2015, 15:07

Dann lasse ich die Suche mit Diesel und Benzin durchführen.
Vielen Dank für das Script...

MarcMatic
Beiträge: 322
Registriert: 02.03.2014, 10:06
Danksagung erhalten: 2 Mal

ALTERNATIVES SKRIPT FÜR EINZELNE TANKSTELLEN

Beitrag von MarcMatic » 12.04.2015, 08:24

Guten Morgen!
Vielen Dank an ldittmar für das tolle Skript und den Hinweis, das bei tankerkoenig eine API vorhanden ist.

Da ich das Auslesen via Lat/Long & Radius persönlich etwas ungenau finde bzw. "schwammig" (es könnte sich z.B. mal etwas in der Art der Sortierung oder Darstellung durch die API ändern) , habe ich das Skript als Basis genommen und eine Variante erstellt mit der man gezielt von einer bestimmten Tankstelle alle Preise abfragen kann. So ist man sicher, dass die abgerufenen Daten definitiv von genau dieser einen Tankstelle kommen (das ist in meinen Augen die "robustere" Abfrage der Daten). Ich verwende dabei die detail.php Seite anstatt der im Originalskript verwendeten list.php.

Des weiteren habe ich das Skript für mich so "verschlankt", dass es nur die Preise in Variablen speichert, Adresse/Name etc. sind mir egal, da ich die Tankstellen ja einerseits kenne und andererseits mir die Variablen in PocketControl o.ä. Interfaces anzeigen lassen in denen sie eine eindeutige Bezeichnung haben.

Anleitung für das Script:

Generell: Es muss CUxD installiert und Exec als Gerät angelegt sein (zu finden unter 28 System > Funktion Exec, für Details zur Installation etc. bitte entsprechend hier im Forum oder CUxD Dokumentation informieren).

1. API bei tankerkoenig.de beantragen (https://creativecommons.tankerkoenig.de)

2. Die ID für die gewünschte Tankstelle rausfinden. Dazu diese Seite aufrufen: https://creativecommons.tankerkoenig.de/#demo
Dort dann LISTE MIT AKTUELLER POSITION auswählen. In der Liste kann man dann die ID für jede Tankstelle finden. Wenn man den Radius etc. anpassen möchte, so kann man auch die rote URL kopieren und die Werte vorher ändern (ebenso Lat/Long, kann man z.B. hier rausfinden: http://www.latlong.net) für die Umkreissuche. Auf jeden Fall muss man irgendwie an die gewünschten IDs kommen, alles andere ist hier nicht relevant. ACHTUNG: Die Preise in dieser Abfrage sind teilweise bewusst falsch, da die Demoabfrage mit einem API Code arbeitet, der nur für Demozwecke ist. Ihr müsst also definitv für das Skript einen eigenen Code beantragen.

3. CCU Variablen anlegen: Je nachdem wie viele Tankstellen und Spritsorten man abfragt müssen entsprechend viele Variablen angelegt werden. Die Benennung ist jedem selber überlassen. Ich habe z.B. Tanken_E10_Jet / Tanken_Diesel_Jet etc. Variablen als Typ ZAHL anlegen!

4. Skript in CCU Programm einfügen und folgende Werte anpassen (sind im Skript auch mit XXX und GROSSBUCHSTABEN angegeben):
- API KEY
- Tankstellen ID
- Die unter 3. angelegten CCU Variablen eintragen (Sind im Skript als Platzhalter mit EIGENE VARIABLE gekennzeichnet)

Das Skript ist so vorbereitet, dass es alle drei Sorten immer abruft. Wenn jetzt nur E10 interessant sein sollte, so kann man einfach die anderen Codeblöcke aus dem Skript löschen (immer mit ! --- SORTENNAME am Anfang und ! --------- am Ende gekennzeichnet), oder einfach auskommentieren, indem vor die jeweiligen 5 Zeilen ein ! gesetzt wird.

Wenn man von einer weitere Tankstelle Daten abrufen möchte, so kann man das Skript einfach erneut dem Programm hinzufügen. Ggf. mit VERZÖGERT UM XXX SEKUNDEN, damit sich da nichts in die Quere kommt.

Code: Alles auswählen

!-----------------------------------------------------------------------------
! Basisdaten definieren
!-----------------------------------------------------------------------------

var apikey = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; !API KEY EINTRAGEN
var tankid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"; !TANKSTELLEN ID EINTRAGEN

!-----------------------------------------------------------------------------
! Werte von tankerkoenig holen
!-----------------------------------------------------------------------------
   
string tankenUrl = "https://creativecommons.tankerkoenig.de/json/detail.php";
string params = "-d id=" + tankid + " -d apikey=" + apikey; 
string cmd = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl --trace trace.txt -k -X GET -H \"Content-Type:application/json\" -G " + params + " " + tankenUrl;

var stdout;
var posStart;
var posEnd;
var preis;
var substring;
var posValueStart;
var posValueEnd;
var posValue;
    
dom.GetObject("CUxD.CUX2801001:2.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:2.CMD_QUERY_RET").State(1);
stdout  = dom.GetObject("CUxD.CUX2801001:2.CMD_RETS").State();
   
!-----------------------------------------------------------------------------
! Preise aus Daten von tankerkoenig auslesen und in CCU Variablen schreiben
!-----------------------------------------------------------------------------

posStart = "{";
posEnd = "}";
substring = stdout.Substr(stdout.Find(posStart), stdout.Find(posEnd));

! --- Preis E10
posValueStart = "\"e10\":";
posValueEnd = ",";
posValue = substring.Find(posValueStart) + posValueStart.Length();
preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
dom.GetObject("EIGENE VARIABLE").Variable(preis.ToFloat());                     !EIGENE VARIABLE EINTRAGEN
!-----------

! --- Preis E5
posValueStart = "\"e5\":";
posValueEnd = ",";
posValue = substring.Find(posValueStart) + posValueStart.Length();
preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
dom.GetObject("EIGENE VARIABLE").Variable(preis.ToFloat());                     !EIGENE VARIABLE EINTRAGEN
!-----------

! --- Preis Diesel
posValueStart = "\"diesel\":";
posValueEnd = ",";
posValue = substring.Find(posValueStart) + posValueStart.Length();
preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
dom.GetObject("EIGENE VARIABLE").Variable(preis.ToFloat());                     !EIGENE VARIABLE EINTRAGEN
!-----------
Zuletzt geändert von MarcMatic am 13.05.2015, 14:21, insgesamt 1-mal geändert.

Benutzeravatar
derAuge
Beiträge: 94
Registriert: 02.02.2014, 09:58
Wohnort: Münsterland

Re: Günstigste Tankstelle in der Umgebung

Beitrag von derAuge » 12.04.2015, 10:16

Das ist ein guter Script. Danke für die Idee

Habe ihn eingebaut und es funktioniert.

Nun habe ich bei dem Anlegen der Systemvariabeln gleich 3 Päärchen angelegt. Danach stellte ich fest, dass der Sript nur für 2 Tankstellen ausgelegt ist.
Dann packte mich der Ehrgeitz und ich habe mich genauer mit dem Script beschäftigt.

nachdem ich herausgefunden hatte was bei der Abfrage zurück kommt (stdout) habe ich folgendes Überlegt:
~~~ ausschnitt ~~~~

Code: Alles auswählen

WriteLine(stdout);
!------------------------------------------------------------------------------------------
!-- Die Tankstellen stehen zwischen [{"name": ......},{"name": .......},{"name": .....}]}
!------------------------------------------------------------------------------------------
    posStart = "[{";
    posEnd = "]}";
    tankstellen = stdout.Substr(stdout.Find(posStart), stdout.Find(posEnd));
WriteLine(tankstellen);
!-- Nun müssen wir die Positionen von {"name": suchen
    string wordStart = "{\"name\":";
    string wordEnde = "},";

    integer tankstelle01_posStart = tankstellen.Find(wordStart);
    integer tankstelle01_posEnde = tankstellen.Find(wordEnde);
WriteLine(tankstelle01_posStart);
WriteLine(tankstelle01_posEnde);

    string tankstelle02 = tankstellen.Substr((tankstelle01_posEnde +1), 10000);
WriteLine(tankstelle02);
    integer tankstelle02_posStart = tankstelle02.Find(wordStart);
    integer tankstelle02_posEnde = tankstelle02.Find(wordEnde);
WriteLine(tankstelle02_posStart);
WriteLine(tankstelle02_posEnde);

    string tankstelle03 = tankstellen.Substr((tankstelle02_posEnde +1), 10000);
WriteLine(tankstelle03);
    integer tankstelle03_posStart = tankstelle03.Find(wordStart);
    integer tankstelle03_posEnde = tankstelle03.Find(wordEnde);
WriteLine(tankstelle03_posStart);
WriteLine(tankstelle03_posEnde);
Also wollte ich die Start/Ende-Positionen der Tankstellen herausfinden um danach die Adressen / Preise zu ermitteln
Da komme ich leider nicht wirklich weiter.
Hat jemand eine einfachere Idee um die Positionen heraus zu finden?

Gruß
derAuge
CCU2 # 3xHM-CC-RT-DN # 1x HM-CC-TC mit HM-CC-VD # HM-WDS30-T-O # 2x HM-LC-Sw2-FM # HM-Sen-MDIR-O-2 # HM-Sen-MDIR # HQ WebUI Version 2.5.1 # CUxD-V0.67 # CUxD-Highcharts 1.4.3 # HCS 0.0.3.2 # CCU.IO 1.0.47 # DashUI 0.9beta121

MarcMatic
Beiträge: 322
Registriert: 02.03.2014, 10:06
Danksagung erhalten: 2 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von MarcMatic » 12.04.2015, 10:23

Schau dir mal mein alternatives Script an (siehe Post vor deinem). Das ist in meinen deutlichen einfacher und eindeutiger, weil man die Tankstellen gezielter abfragen kann via ID. Das Skript dann einfach so oft in ein Programm als einzelne DANN Schritte einfügen wie man es eben benötigt (also ein Skript pro Tankstelle).

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“