Günstigste Tankstelle in der Umgebung

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

Moderator: Co-Administratoren

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

Günstigste Tankstelle in der Umgebung

Beitrag von ldittmar » 11.04.2015, 02:47

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.
Zuletzt geändert von ldittmar am 16.06.2016, 15:11, insgesamt 9-mal geändert.
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

Stoni
Beiträge: 560
Registriert: 05.12.2013, 13:38
Danksagung erhalten: 1 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Stoni » 11.04.2015, 03:41

Nicht der Erste hier, der die Spritpreise implementiert, trotzdem wäre es schön, wenn du eine detaillierte Anleitung nachreichen könntest...

Gruß Stoni

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, 08:49

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:
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

Benutzeravatar
Homoran
Beiträge: 8613
Registriert: 02.07.2013, 15:29
Wohnort: Köln
Danksagung erhalten: 4 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Homoran » 11.04.2015, 09:11

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
Alle meine Hinweise sind auf eigene Gefahr umzusetzen. Immer einen Fachmann zu Rate ziehen!

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, 09:36

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

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

Re: Günstigste Tankstelle in der Umgebung

Beitrag von MarcMatic » 11.04.2015, 10:13

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.

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, 10:20

Die Preis variable soll als Zahl und die Adresse als Zeichenkette erstellt werden?
Irgendetwas mache ich noch falsch, da bei mir nichts dargestellt wird...

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

Re: Günstigste Tankstelle in der Umgebung

Beitrag von MarcMatic » 11.04.2015, 10:31

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.

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

Re: Günstigste Tankstelle in der Umgebung

Beitrag von MarcMatic » 11.04.2015, 10:50

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 ;)

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, 11:24

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.
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

Antworten

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