Seite 1 von 8

Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 02:47
von ldittmar
Ein wunderschönen guten Morgen wünsche ich euch. Ich habe gestern mein erstes HM Skript geschrieben und das fand ich es so cool, dass ich nicht mehr aufhören konnte. Jetzt habe ich mir ein Skript geschrieben, das für mich die günstigsten Tankstellen in der Umgebung raus findet.

Man muss sich nur hier eine API-Key beantragen. Du Daten werden in Systemvariabeln gespeichert, die zuerst angelegt werden müssen. Systemvariabel-Typ kann aus dem Skript (Ab Zeile "!Alle Variabeln sind optional"). Variabeln die nicht angelegt wurden, werden einfach übersprungen.

Code: Alles auswählen

!-----------------------------------------------------------------------------
! Hier alle was man verändern kann/muss
! Voraussetzung: CUxD und ein API Zugang bei Tankkoenig.de
!-----------------------------------------------------------------------------
var apikey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; !Ihr API-Key
var lat = ""; !Breitengrad wird automatisch aus der CCU geholt, solange die Variabel "" ist (Format 49.5668)
var lng = ""; !Längengrad wird automatisch hier aus der CCU geholt, solange die Variabel "" ist (Format 8.3254)
var rad = "5"; !Suchradius in km; erlaubter Wert: ganze positive Zahl <= 25
var sort = "price"; !Sortierung; Werte 'price' oder 'dist'
var type = "e10"; !Spritsorte; erlaubte Werte; Werte: 'e5', 'e10' oder 'diesel'

var CUxD_Device = "CUxD.CUX2801001:2"; !CUxD Virtuelles Gerät

!Alle Variabeln sind optional
var tank1_adresse = "Tank_Adresse"; !Zeichenkette
var tank1_preis = "Tank_Preis"; !Zahl 0 - 5 Euro
var tank1_marke = "Tank_Typ"; !Zeichenkette
var tank1_entfernung = "Tank_Dist"; !Zahl 0 - 30 km

var tank2_adresse = "Tank2_Adresse"; !Zeichenkette
var tank2_preis = "Tank2_Preis"; !Zahl 0 - 5 Euro
var tank2_marke = "Tank2_Typ"; !Zeichenkette
var tank2_entfernung = "Tank2_Dist"; !Zahl 0 - 30 km

var tank3_adresse = "Tank3_Adresse"; !Zeichenkette
var tank3_preis = "Tank3_Preis"; !Zahl 0 - 5 Euro
var tank3_marke = "Tank3_Typ"; !Zeichenkette
var tank3_entfernung = "Tank3_Dist"; !Zahl 0 - 30 km

var tank4_adresse = "Tank4_Adresse"; !Zeichenkette
var tank4_preis = "Tank4_Preis"; !Zahl 0 - 5 Euro
var tank4_marke = "Tank4_Typ"; !Zeichenkette
var tank4_entfernung = "Tank4_Dist"; !Zahl 0 - 30 km

!-----------------------------------------------------------------------------
! Ab hier muss man nichts mehr beachten
!-----------------------------------------------------------------------------

if(lat == ""){
	lat = system.Latitude().ToString();
}
if(lng == ""){
	lng = system.Longitude().ToString();
}	
string tankenUrl = "https://creativecommons.tankerkoenig.de/json/list.php";
string params = "-d lat=" + lat + " -d lng=" + lng + " -d rad=" + rad  + " -d sort=" + sort + " -d type=" + type + " -d apikey=" + apikey;
string cmd = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -k -X GET -H \"Content-Type:application/json\" -G " + params + " " + tankenUrl;

var stdout;
var posStart;
var posEnd;
var adresse;
var preis;
var substring;
var posValueStart;
var posValueEnd;
var posValue;
    
dom.GetObject(CUxD_Device + ".CMD_SETS").State(cmd);
dom.GetObject(CUxD_Device + ".CMD_QUERY_RET").State(1);
stdout  = dom.GetObject(CUxD_Device + ".CMD_RETS").State();
   
!-----------------------------------------------------------------------------
! Tankstelle 1
!-----------------------------------------------------------------------------

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

!Adresse
if(dom.GetObject(tank1_adresse).IsTypeOf(OT_VARDP)){
	posValueStart = "\"name\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"street\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"houseNumber\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"postCode\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"place\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse  + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) ;

	dom.GetObject(tank1_adresse).State(adresse);
}

!Tankstellentyp
if(dom.GetObject(tank1_marke).IsTypeOf(OT_VARDP)){
	posValueStart = "\"brand\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank1_marke).State(adresse);
}

!Entfernung
if(dom.GetObject(tank1_entfernung).IsTypeOf(OT_VARDP)){
	posValueStart = "\"dist\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank1_entfernung).State(preis.ToFloat());
}

!Preis
if(dom.GetObject(tank1_preis).IsTypeOf(OT_VARDP)){
	posValueStart = "\"price\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank1_preis).State(preis.ToFloat());
}

!-----------------------------------------------------------------------------
! Tankstelle 2
!-----------------------------------------------------------------------------

posStart = "},{";
posEnd = "]}";
substring = substring.Substr(substring.Find(posStart) + posStart.Length(), substring.Find(posEnd));

!Adresse
if(dom.GetObject(tank2_adresse).IsTypeOf(OT_VARDP)){
	posValueStart = "\"name\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"street\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"houseNumber\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"postCode\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"place\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse  + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) ;

	dom.GetObject(tank2_adresse).State(adresse);
}

!Tankstellentyp
if(dom.GetObject(tank2_marke).IsTypeOf(OT_VARDP)){
	posValueStart = "\"brand\":";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank2_marke).State(adresse);
}

!Entfernung
if(dom.GetObject(tank2_entfernung).IsTypeOf(OT_VARDP)){
	posValueStart = "\"dist\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank2_entfernung).State(preis.ToFloat());
}

!Preis
if(dom.GetObject(tank2_preis).IsTypeOf(OT_VARDP)){
	posValueStart = "\"price\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank2_preis).State(preis.ToFloat());
}

!-----------------------------------------------------------------------------
! Tankstelle 3
!-----------------------------------------------------------------------------

posStart = "},{";
posEnd = "]}";
substring = substring.Substr(substring.Find(posStart) + posStart.Length(), substring.Find(posEnd));

!Adresse
if(dom.GetObject(tank3_adresse).IsTypeOf(OT_VARDP)){
	posValueStart = "\"name\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"street\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"houseNumber\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"postCode\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"place\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse  + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) ;

	dom.GetObject(tank3_adresse).State(adresse);
}

!Tankstellentyp
if(dom.GetObject(tank3_marke).IsTypeOf(OT_VARDP)){
	posValueStart = "\"brand\":";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank3_marke).State(adresse);
}

!Entfernung
if(dom.GetObject(tank3_entfernung).IsTypeOf(OT_VARDP)){
	posValueStart = "\"dist\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank3_entfernung).State(preis.ToFloat());
}

!Preis
if(dom.GetObject(tank3_preis).IsTypeOf(OT_VARDP)){
	posValueStart = "\"price\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank3_preis).State(preis.ToFloat());
}

!-----------------------------------------------------------------------------
! Tankstelle 4
!-----------------------------------------------------------------------------

posStart = "},{";
posEnd = "]}";
substring = substring.Substr(substring.Find(posStart) + posStart.Length(), substring.Find(posEnd));

!Adresse
if(dom.GetObject(tank4_adresse).IsTypeOf(OT_VARDP)){
	posValueStart = "\"name\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"street\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"houseNumber\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) + ", ";

	posValueStart = "\"postCode\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse + substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) + " ";

	posValueStart = "\"place\":\"";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = adresse  + substring.Substr(posValue, 50).StrValueByIndex(posValueEnd, 0) ;

	dom.GetObject(tank4_adresse).State(adresse);
}

!Tankstellentyp
if(dom.GetObject(tank1_marke).IsTypeOf(OT_VARDP)){
	posValueStart = "\"brand\":";
	posValueEnd = "\",\"";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	adresse = substring.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank4_marke).State(adresse);
}

!Entfernung
if(dom.GetObject(tank1_entfernung).IsTypeOf(OT_VARDP)){
	posValueStart = "\"dist\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank4_entfernung).State(preis.ToFloat());
}

!Preis
if(dom.GetObject(tank4_preis).IsTypeOf(OT_VARDP)){
	posValueStart = "\"price\":";
	posValueEnd = ",";
	posValue = substring.Find(posValueStart) + posValueStart.Length();
	preis = substring.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0) ;
	dom.GetObject(tank4_preis).State(preis.ToFloat());
}
Fragen und Anregungen sind immer willkommen :wink:

Soo... jetzt gehe ich mal ins Bett.

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 03:41
von Stoni
Nicht der Erste hier, der die Spritpreise implementiert, trotzdem wäre es schön, wenn du eine detaillierte Anleitung nachreichen könntest...

Gruß Stoni

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 08:49
von ldittmar
Bin auch nicht der erste der ein Skript schreibt. Es funktioniert wie alle andere auch... wie detailiert soll ich es noch beschreiben? Gut... ich könnte auch so beschreiben als wenn derjenige der das liest noch nie was von Homematic gehört hätte. Ich schreib einfach später noch ein paar Sätze dazu. :wink:

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 09:11
von Homoran
Aber anscheinend ist der Tankerkönig dann der erste der eine Weiterverarbeitung der Daten erlaubt. Bei fast allen anderen Websites war das ja sogar explizit untersagt.

Gesendet von meinem Cynus T7 mit Tapatalk

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 09:36
von oreider
Hallo,

würde mich auch über eine Anleitung freuen.
Fragen die sich mir stellen (da ich absolut nicht vom Fach bin):
Wie muss ich die Koordinaten eintragen?
Wie die Variablen benennen?

Danke

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 10:13
von MarcMatic
Breiten/Längengrad musst du nicht bestimmen. Die Funktion system. holt sich das aus den Daten der CCU. Der Kommentar in der jeweiligen Zeile ist ggf. etwas verwirrend und wirkt so, als müsste man da selber nen Wert eingeben. Die Systemvariablen der CCU (in welche die Preise geschrieben werden) kannst du selber benennen. In dem Beispiel hier heissen die Tank_Preis und Tank2_Preis. Musst du dann natürlich entsprechend anpassen und nach gleichem Schema der gesamten Codeblöcke kannst du auch weitere Tankstellen bzw. Spritsorten hinzufügen.

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 10:20
von oreider
Die Preis variable soll als Zahl und die Adresse als Zeichenkette erstellt werden?
Irgendetwas mache ich noch falsch, da bei mir nichts dargestellt wird...

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 10:31
von MarcMatic
Man darf bei der Adresseingabe keine Umlaute oder z.B. ß eingeben. Jedenfalls ging es bei mir erst, als ich das korrigiert habe. Allerdings wird mir gerade ein Wert ausgespuckt der mit den eigentlichen Werten der Tankstelle nicht übereinstimmt. Aber das könnte auch noch an ner falschen Adresse oder so liegen.

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 10:50
von MarcMatic
Also an der Adresse dürfte es nicht liegen, es kommen einfach komische Zahlen raus. Hab grad keine Zeit zu forschen, was der URL Aufruf mit den Parametern liefert und wo was falsch ausgelesen wird.

Ich gehe davon aus, dass über lat long eine Liste von Tankestellen zurück kommt aus der dann - über die Namen/Adresseingaben der folgenden Codezeilen - die relevanten rausfiltert und den Preis dann in die HM SysVar schreibt. Bei mir kommt da auch was an was nach einem Benzinpreis aussieht, allerdings verändert der sich je nach dem welchen KM Radius ich eingebe. So ganz hab ich die Logik noch nicht durchschaut.

Vielleicht könnte der Script Ersteller kurz helfen? Denn er wird es ja funktionsfähig am laufen haben ;)

Re: Günstigste Tankstelle in der Umgebung

Verfasst: 11.04.2015, 11:24
von ldittmar
MarcMatic hat geschrieben:Breiten/Längengrad musst du nicht bestimmen. Die Funktion system. holt sich das aus den Daten der CCU. Der Kommentar in der jeweiligen Zeile ist ggf. etwas verwirrend und wirkt so, als müsste man da selber nen Wert eingeben.
Genau... es wird automatisch geholt, aber man könnte auch was anderes angeben. Einfach bei Google Maps eine Adresse angeben und man bekommt in der URL-Zeile die Breitengrade: z.B. 49.5668293 und 8.325404 und genau so kann man auch als lat und lng eingeben.
oreider hat geschrieben:Die Preis variable soll als Zahl und die Adresse als Zeichenkette erstellt werden? Irgendetwas mache ich noch falsch, da bei mir nichts dargestellt wird...
Genau so.... Damit das Ding läuft brauch man aber CUxD und ein virtuelles Gerät. (bei mir CUxD.CUX2801001:2)
MarcMatic hat geschrieben:Ich gehe davon aus, dass über lat long eine Liste von Tankestellen zurück kommt aus der dann - über die Namen/Adresseingaben der folgenden Codezeilen - die relevanten rausfiltert und den Preis dann in die HM SysVar schreibt. Bei mir kommt da auch was an was nach einem Benzinpreis aussieht, allerdings verändert der sich je nach dem welchen KM Radius ich eingebe. So ganz hab ich die Logik noch nicht durchschaut.
Soo... die API holt alle Tankstellen im Umkreis und sortiert diese nach Preis. Aus der Liste nehme ich einfach die zwei ersten Tankstellen. Deswegen ändert sich auch der Preis, wenn man den Radius anpasst.