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

Re: Günstigste Tankstelle in der Umgebung

Beitrag von ldittmar » 16.06.2016, 15:16

Hi Alchy,

Bei mir gehts! Ich habe noch eine kleine Korrektur gemacht, weil die API verändert wurde. Ich muss nur noch die Umlaute anpassen. Sonst scheint es zu funktionieren...

Grüße,
ldittmar

P.S.: WebMatic nimmt wirklich viel Zeit in Anspruch... :roll:
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

Hofi90
Beiträge: 29
Registriert: 24.08.2016, 16:01
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Hofi90 » 24.08.2016, 16:09

Hallo Community,

ich lese in diesem Forum nun schon seit einiger Zeit mit und habe dadurch schon manches Projekt umsetzen können.

Auch dieses Skript läuft problemlos.

Nur bin ich mit der Funktionalität noch nicht ganz zufrieden.

Ich habe 3 Tankstellen, die ich per ID nach dem Preis für E10 abfrage.

Nun hätte ich aber gerne, dass mir nur die günstigste in einer Variable ausgegeben wird (z.B. Variable "guenstig" --> "Tankstelle B 1,20 EUR"). Die anderen interessieren mich nicht.

Könnte sich jemand von euch Profis diesem Thema annehmen?

Derzeit ist es so, dass dieses Skript 3mal (jeweils für eine Tanke) läuft und jeweils eine Variable befüllt (muss aber nicht bei der Arbeitsweise bleiben, wenn anderes günstiger ist):

Code: Alles auswählen

! Code auf Wunsch des Erstellers gelöscht 


Vielen Dank schonmal!!

Grüße

Hofi
Zuletzt geändert von Hofi90 am 30.08.2016, 08:23, insgesamt 1-mal geändert.

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von alchy » 25.08.2016, 16:01

Hofi90 hat geschrieben: Derzeit ist es so, dass dieses Skript 3mal (jeweils für eine Tanke) läuft und jeweils eine Variable befüllt (muss aber nicht bei der Arbeitsweise bleiben, wenn anderes günstiger ist):

Code: Alles auswählen

! Tankerkönig angepasst by Alchy 
...
Als erstes muss ich sagen, das das Script so nicht von mir veröffentlicht wurde ! :shock: oder doch?
Ich nehme an, das das Script modifiziert wurde?

Da ja oben im Kopf drin steht, das man mehrere Tankstellen in einem Rutsch abfragen kann in dem man die Tankstellen IDs kommasepariert einträgt, stellt sich die Frage, wieso du das nicht machst?
Aber dann wären wir bei den Änderungen im unteren Teil des Scriptes.

Leicht zurück modifiziert gibt das Script den Namen und den E10 Preis aller Tankstellen untereinander aus.

Code: Alles auswählen

! Tankerkönig angepasst by Alchy 

var apikey = "++++++++++++++++++"; !Ihr API-Key
var tankids = "fbfe3e46-9aab-4265-b16d-b7bf2b8aa775,879b061b-994d-40ab-9381-db98d44f4ec4,3c10e341-cc32-410a-93fd-34494f60309d,"  ; ! Alle gewünschten Tankstellen komma separiert. Auch nur eine geht natürlich !

! URL der tankerkoenig.de API
string tankerKoenigURL = "https://creativecommons.tankerkoenig.de/json/detail.php";
integer slist = "";
! Nun über alle ausgesuchten Tankstellen iterieren.
string tankid;
foreach(tankid, tankids.Split(",")) {
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 " # "-d id=" # tankid # " -d apikey=" # apikey # " " #tankerKoenigURL;
! curl Abfrage starten
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
! Name
var posValueStart = "name\":\"";
var posValueEnd = "\",\"";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var name = srueck.Substr(posValue, 100).StrValueByIndex(posValueEnd, 0);
! offen
var posValueStart = ",\"isOpen\":";
var posValueEnd = ",";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var off = srueck.Substr(posValue, 100).StrValueByIndex(posValueEnd, 0);
if (off == "true") { var offen = " offen "; } else { var offen = " geschlossen "; }
!Preis e10
var posValueStart = ",\"e10\":";
var posValueEnd = ",";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var e10 = srueck.Substr(posValue, 4).StrValueByIndex(posValueEnd, 0);
slist = slist #name #" : " #e10 #" Euro \n"; ! Beispielverwendung, alle Daten in eine Variable schreiben
}

WriteLine(slist); ! Ausgabe auf dem Bildschirm
! dom.GetObject("TankenKaspar").State(slist); ! Speichern in Systemvariable

Ja ich weiß, das ist zwar auch NICHT 100% das was du gefordert hast, aber erstmal sind wir auf einen funktionierenden Stand. Um nur den niedrigsten preis zu erhalten musst du die Preise in eine Zahl umwandeln und dann vergleichen. Nur macht das Sinn?
Vielleicht ist ja die Zweitgünstigste Tanke näher dran und es lohnt sich nicht einen Umweg in Kauf zu nehmen, warum nicht die Ausgabe so in eine StringVariable schreiben?


Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Hofi90
Beiträge: 29
Registriert: 24.08.2016, 16:01
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Hofi90 » 29.08.2016, 14:53

Hallo,

danke für deine schnelle Antwort und sorry für meine späte Antwort.
Als erstes muss ich sagen, das das Script so nicht von mir veröffentlicht wurde ! :shock: oder doch?
Ich nehme an, das das Script modifiziert wurde?
Ja, das habe ich bereits etwas modifiziert.
Da ja oben im Kopf drin steht, das man mehrere Tankstellen in einem Rutsch abfragen kann in dem man die Tankstellen IDs kommasepariert einträgt, stellt sich die Frage, wieso du das nicht machst?
Naja, weil ich dann die Preise von allen Tankstellen in einer Variablen habe. Da ich ja nur den billigsten Preis haben will, dachte ich, es ist einfacher, wenn man die Preise gleich in separaten Variablen speichert.
Nur macht das Sinn?
Für mich definitiv: Ich fahre auf dem Weg zur Arbeit (und natürlich auch auf dem Heimweg) an 3 Tankstellen innerhalb von 15 Kilometern vorbei. Tanken möchte ich natürlich bei der billigsten, für mich ist es also irrelevant, ob die günstigste noch 5 Kilometer oder 8 Kilometer entfernt ist (sollte der Sprit schon so knapp sein, dass die relevant wäre, würde ich sowieso einfach bei der nächsten Tanke tanken :wink: )

Für mich ist also der billigste Preis von den 3 Tankstellen und der zugehörige Name der Tankstelle relevant.

Schonmal danke fürs reindenken!

Grüße

Hofi

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von alchy » 29.08.2016, 18:05

Hofi90 hat geschrieben: Ja, das habe ich bereits etwas modifiziert.
Dann lösch bitte das Script aus deinem Post, denn so sollte es nicht wirklich funktionieren.
Hofi90 hat geschrieben:
Alchy hat geschrieben:Nur macht das Sinn?
Für mich definitiv: Ich fahre auf dem Weg zur Arbeit (und natürlich auch auf dem Heimweg) an 3 Tankstellen innerhalb von 15 Kilometern vorbei. Tanken möchte ich natürlich bei der billigsten, für mich ist es also irrelevant, ob die günstigste noch 5 Kilometer oder 8 Kilometer entfernt ist (sollte der Sprit schon so knapp sein, dass die relevant wäre, würde ich sowieso einfach bei der nächsten Tanke tanken :wink: )
Und wenn der Preis von 3 Tankstellen in der Variablen steht, kannst du nicht selber den billigsten daraus auswählen?
Ich versteh es immer noch nicht. Liegt bestimmt an mir.
Hofi90 hat geschrieben: Für mich ist also der billigste Preis von den 3 Tankstellen und der zugehörige Name der Tankstelle relevant.
Dann musst du das machen,was ich oben schrieb. Preis in Zahl umwandeln und vergleichen.
So ungefähr sollte es mit dem Abstrich funktionieren, das wenn 2 Tanken den billigsten Preis haben, die erste Tanke aus der Liste gewinnt.

Code: Alles auswählen

! Tankerkönig angepasst by Alchy v0.4
! entweder alle oder nur die billigste von x Tankstellen ausgeben

    var apikey = "+++++++++++++++++++"; !Ihr API-Key
    var tankids = "fbfe3e46-9aab-4265-b16d-b7bf2b8aa775,a314d76c-c570-4a87-8efe-fa3d4488a847,6b2bd0b8-22db-424e-8547-c2abcfe06a6c"  ; ! Alle gewünschten Tankstellen komma separiert. Auch nur eine geht natürlich !
    var te10 = 5.0;
    ! URL der tankerkoenig.de API
    string tankerKoenigURL = "https://creativecommons.tankerkoenig.de/json/detail.php";
    integer slist = "";
    ! Nun über alle ausgesuchten Tankstellen iterieren.
    string tankid;
    foreach(tankid, tankids.Split(",")) {
    string cmd = "/usr/local/addons/cuxd/curl --trace trace.txt -k -X GET -H \"Content-Type:application/json\" -G " # "-d id=" # tankid # " -d apikey=" # apikey # " " #tankerKoenigURL;
    ! curl Abfrage starten
    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
    dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
    var srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
    ! Name
    var posValueStart = "name\":\"";
    var posValueEnd = "\",\"";
    var posValue = srueck.Find(posValueStart) + posValueStart.Length();
    var name = srueck.Substr(posValue, 100).StrValueByIndex(posValueEnd, 0);
    ! offen
    var posValueStart = ",\"isOpen\":";
    var posValueEnd = ",";
    var posValue = srueck.Find(posValueStart) + posValueStart.Length();
    var off = srueck.Substr(posValue, 100).StrValueByIndex(posValueEnd, 0);
    if (off == "true") { var offen = " offen "; } else { var offen = " geschlossen "; }
    !Preis e10
    var posValueStart = ",\"e10\":";
    var posValueEnd = ",";
    var posValue = srueck.Find(posValueStart) + posValueStart.Length();
    var e10 = srueck.Substr(posValue, 5).StrValueByIndex(posValueEnd, 0).ToFloat();
   if (e10 < te10) { string billig = name #" : " #e10.ToString(3) #" Euro ";
   var te10 = e10; }
   slist = slist #name #" : " #e10.ToString(3) #" Euro  -  ";
   }
    
    WriteLine("Billigste Tankstelle: \n    "#billig);! Ausgabe billigster Preise auf dem Bildschirm
    WriteLine("Alle Preise: \n"#slist); ! Ausgabe aller Preise auf dem Bildschirm

   ! dom.GetObject("TankenKaspar").State(slist); ! Speichern in Systemvariable entweder slist für alle oder billig für billigste
Jedenfalls theoretisch. Probier es einfach aus, ich kann es nicht.
Da solche Script mehrere Sekunden laufen, vorsichtig mit dem Intervall des Aufrufs umgehen.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Hofi90
Beiträge: 29
Registriert: 24.08.2016, 16:01
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Hofi90 » 30.08.2016, 08:29

Dann lösch bitte das Script aus deinem Post, denn so sollte es nicht wirklich funktionieren.
ist erledigt!
So ungefähr sollte es mit dem Abstrich funktionieren, das wenn 2 Tanken den billigsten Preis haben, die erste Tanke aus der Liste gewinnt. [...]
Jedenfalls theoretisch. Probier es einfach aus, ich kann es nicht.
Habs probiert, funktioniert: DAS ist genaus das, was ich wollte :D :D :)

Vielen Vielen Vielen Dank für die schnelle Hilfe! Wirklich Klasse hier!
Werde mir heute Abend das Skript nochmal genauer anschauen, wie du das gelöst hast, damit ich beim nächsten Mal nicht mehr fragen muss! :P

Danke nochmal!

Grüße

Hofi

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von alchy » 30.08.2016, 18:01

Hofi90 hat geschrieben: Werde mir heute Abend das Skript nochmal genauer anschauen, wie du das gelöst hast
Geht bestimmt auch anders, aber der einfachste Weg erschien mir der schon von mir Beschriebene:
Alchy hat geschrieben:....musst du die Preise in eine Zahl umwandeln und dann vergleichen....
Meist sind ja die ersten auch die besten Gedanken.
Viel Spass noch

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Greenstorm80
Beiträge: 5
Registriert: 30.10.2021, 21:33
System: CCU

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Greenstorm80 » 30.10.2021, 21:45

Hallo zusammen,
das Thema ist zwar schon älter aber ich möchte mich auch mal in die Reihe der "Problemkinder" einordnen. Ich habe heute versucht die Anleitung von Alchy nachzumachen und stand vor dem Problem, dass das Script nicht funktioniert hatte. Inzwischen sind 6 Jahre vergangen aber das Script auf Seite 6 hatte funktioniert.

Code: Alles auswählen

var apikey = "MEINE API"; !Ihr API-Key
    var tankids = "eaabfae1-5c23-4195-b8aa-5d5572ceb112,51c16fbf-3c91-46c4-9712-2b28fc1d568a,38e61a6e-83c2-4c9b-94fe-794db37db591,69f766eb-c497-491d-8a92-b99b799c94dc"  ; ! Alle gewünschten Tankstellen komma separiert. Auch nur eine geht natürlich !
    var te10 = 5.0;
    ! URL der tankerkoenig.de API
    string tankerKoenigURL = "https://creativecommons.tankerkoenig.de/json/detail.php";
    integer slist = "";
    ! Nun über alle ausgesuchten Tankstellen iterieren.
    string tankid;
    foreach(tankid, tankids.Split(",")) {
    string cmd = "/usr/local/addons/cuxd/curl --trace trace.txt -k -X GET -H \"Content-Type:application/json\" -G " # "-d id=" # tankid # " -d apikey=" # apikey # " " #tankerKoenigURL;
    ! curl Abfrage starten
    dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
    dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
    var srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
    ! Name
    var posValueStart = "name\":\"";
    var posValueEnd = "\",\"";
    var posValue = srueck.Find(posValueStart) + posValueStart.Length();
    var name = srueck.Substr(posValue, 100).StrValueByIndex(posValueEnd, 0);
    ! offen
    var posValueStart = ",\"isOpen\":";
    var posValueEnd = ",";
    var posValue = srueck.Find(posValueStart) + posValueStart.Length();
    var off = srueck.Substr(posValue, 100).StrValueByIndex(posValueEnd, 0);
    if (off == "true") { var offen = " offen "; } else { var offen = " geschlossen "; }
    !Preis e10
    var posValueStart = ",\"e10\":";
    var posValueEnd = ",";
    var posValue = srueck.Find(posValueStart) + posValueStart.Length();
    var e10 = srueck.Substr(posValue, 5).StrValueByIndex(posValueEnd, 0).ToFloat();
   if (e10 < te10) { string billig = name #" : " #e10.ToString(3) #" Euro ";
   var te10 = e10; }
   slist = slist #name #" : " #e10.ToString(3) #" Euro  -  ";
   }
    
    WriteLine("Billigste Tankstelle: \n    "#billig);! Ausgabe billigster Preise auf dem Bildschirm
    WriteLine("Alle Preise: \n"#slist); ! Ausgabe aller Preise auf dem Bildschirm

   ! dom.GetObject("Benzinpreise").State(slist); ! Speichern in Systemvariable entweder slist für alle oder billig für billigste

Ich habe CuxD angelegt und auch eine Systemvariable und ich habe auch versucht mich in die Doku von Cux einzulesen aber scheinbar bin ich zu blöd dafür :-/ In der Anleitung wird der Schritt mit Cux ausgelassen und auf Beiträge im Forum verwiesen aber ich komme damit einfach nicht weiter.

Ich bekomme immer 0,00 € angezeigt wenn ich in der Systemvariablen schaue. Wie gesagt Script an sich funzt:
Bei Script testen, erhalte ich:

Billigste Tankstelle:
Autohaus Kemper GmbH : 1.629 Euro
Alle Preise:
Aral Tankstelle : 1.659 Euro - Autohaus Kemper GmbH : 1.629 Euro - Globus Handelshof GmbH & Co. KG Betriebsst\u00e4tte Gensingen - TS II : 1.659 Euro - TotalEnergies Bingen : 1.659 Euro -


Kann mir jemand helfen bzw. sagen was ich falsch mache?

LG Greeny
Zuletzt geändert von alchy am 30.10.2021, 22:33, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von Tyfys » 30.10.2021, 22:40

Entferne mal aus dieser Zeile das Ausrufezeichen an der ersten Stelle.:

Code: Alles auswählen

  ! dom.GetObject("Benzinpreise").State(slist); ! Speichern in Systemvariable entweder slist für alle oder billig für billigste
Dadurch ist die Zeile auskommentiert worden.
Die Systemvariable Benzinpreise muss natürlich angelegt sein.
Gruß
Harry

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: Günstigste Tankstelle in der Umgebung

Beitrag von alchy » 30.10.2021, 22:45

Die Sytemvariable namens Benzinpreise muss in der CCU angelegt sein.
Das Ausrufezeichen in Zeile

Code: Alles auswählen

 
 ! dom.GetObject("Benzinpreise").State(slist); ! Speichern in Systemvariable entweder slist für alle oder billig für billigste
muss entfernt werden.

Erstaunlich das ein ein so altes Script von mir grundsätzlich aber noch funktioniert.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Antworten

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