Benzinpreis Adapter

WebUIs (DashUI, yahui, ...), Adapter (Hue, IRTrans, Sonos, ...), Logging, Scripting

Moderator: Co-Administratoren

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

Re: Benzinpreis Adapter

Beitrag von alchy » 02.05.2016, 22:26

newbie2007 hat geschrieben: Noch eine Frage: wenn bei mir die Tankstelle geschlossen ist, dann geht's auch nicht.
Wenn geschlossen, dann Anzeige: html
Kann das noch korrekt angezeigt werden, wie vorher auch?

Gruß
newbie2007
Das ist das Problem beim Parsen von Websites. Der Entwickler ändert den Code, und schon ists halt Essig mit dem Verwenden von Scripten. Aber egal. Möglich ist alles, aber was willst du?
Wenn die Tanke zu ist, interessieren natürlich auch die Preis nicht. :roll:
Du kannst natürlich eine Abfrage reinnehmen, wenn Tanke zu dann Preis uninteressant - ergo nicht überschreiben.

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.

womber
Beiträge: 256
Registriert: 18.05.2014, 14:42

Re: Benzinpreis Adapter

Beitrag von womber » 04.05.2016, 06:43

alchy hat geschrieben:
newbie2007 hat geschrieben:Funktioniert leideer nicht!
Kann mal bitte jemand draufschauen?

Gruß
Uwe
Kurz mal angepasst, so sollte es wieder funktionieren

Code: Alles auswählen

Copy des Scriptes entfernt

Url anpassen, Variable "Benzinpreise" anlegen. Fertig? Irgendwie bleibt die bei mir immer leer :shock:
Zuletzt geändert von alchy am 28.01.2017, 21:45, insgesamt 1-mal geändert.
Grund: Copy des Scriptes entfernt
CCU2 * CCU.IO + DashUI + CCUHistorian auf Raspi 1 und 2 * * iPad 2 als Wandtablet * PocketControl HM (iPhone 6 + iPad Pro) * CUxD * Apple watch mit PocketControl HM * * 4x Amazon Alexa mit Homematic Steuerung

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

Re: Benzinpreis Adapter

Beitrag von alchy » 04.05.2016, 14:53

Das Ausrufezeichen vor der letzten Zeile hast du aber schon entfernt?

Wenn du KEINE Ausgabe im Executer oder unter Script testen wünschst, sondern nur ein Speichern in die Variable,
dann müssen die letzten beiden Zeilen so aussehen:

Code: Alles auswählen

....
! WriteLine("Diesel: "#diesel #" - E10: " #e10 #" - Super: " #super);
dom.GetObject("Benzinpreise").State("Diesel: "#diesel #" - E10: " #e10 #" - Super: " #super);
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.

derhomematicneuling
Beiträge: 146
Registriert: 18.10.2013, 20:40

Re: Benzinpreis Adapter

Beitrag von derhomematicneuling » 04.05.2016, 21:07

Hallo,
seit gestern um 6:30 bekomme ich keine Preise vom Tankerkönig.
Ich habe gelesen, dass sie einen Serverumzug hatten.
Hat noch jemand das Problem?
Ich habe den Tankerkönig mal angeschrieben. Mal sehen was sie antworten.


ipa

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

Re: Benzinpreis Adapter

Beitrag von Stoni » 05.05.2016, 00:50

derhomematicneuling hat geschrieben:Hallo,
seit gestern um 6:30 bekomme ich keine Preise vom Tankerkönig.
Ich habe gelesen, dass sie einen Serverumzug hatten.
Hat noch jemand das Problem?
Ich habe den Tankerkönig mal angeschrieben. Mal sehen was sie antworten.


ipa
Ja ist bei mir auch so. Geht sicher allen so...

infor.tankerkoenig
Beiträge: 2
Registriert: 26.04.2015, 00:50

Re: Benzinpreis Adapter

Beitrag von infor.tankerkoenig » 05.05.2016, 12:03

Hallo,

wir (tankerkönig) haben uns das angeschaut:

- der neue Server erzeugt korrektes JSON mit identischem Inhalt im Vergleich zum alten Server
- die Reihenfolge der JSON-Objekte ist anders

Die Reihenfolge ist bei JSON aber egal, wir haben auch keinen Einfluss darauf (JSON wird über eine Library erzeugt). Der aktuelle Client (Homematic) geht offenbar davon aus, dass die einzelnen JSON-Objekte in einer bestimmten Reihenfolge vorliegen. Das darf er nicht, er muss die JSON-Struktur parsen.

Das Problem muss auf Homematic-Seite gelöst werden, wir haben hier leider keinen Einfluss.

Kann sich bitte einer von euch Homematic-Spezialisten drum kümmern?

Gruß

Tankerkönig-Support

womber
Beiträge: 256
Registriert: 18.05.2014, 14:42

Re: Benzinpreis Adapter

Beitrag von womber » 05.05.2016, 12:33

alchy hat geschrieben:Das Ausrufezeichen vor der letzten Zeile hast du aber schon entfernt?

Wenn du KEINE Ausgabe im Executer oder unter Script testen wünschst, sondern nur ein Speichern in die Variable,
dann müssen die letzten beiden Zeilen so aussehen:

Code: Alles auswählen

....
! WriteLine("Diesel: "#diesel #" - E10: " #e10 #" - Super: " #super);
dom.GetObject("Benzinpreise").State("Diesel: "#diesel #" - E10: " #e10 #" - Super: " #super);
Alchy

Oh man bin ich doof.... :roll: Da passt das Sprichwort mit dem Wald und Bäumen mal wieder :D

Danke Alchy

Aber bräuchte nochmal Hilfe. Hätte gerne die Preise einzeln in einer Variable. So geht's leider nicht. was mache ich falsch?

Code: Alles auswählen

Copy des Scriptes entfernt
Grüße
Alex
Zuletzt geändert von alchy am 28.01.2017, 21:46, insgesamt 1-mal geändert.
Grund: Copy des Scriptes entfernt
CCU2 * CCU.IO + DashUI + CCUHistorian auf Raspi 1 und 2 * * iPad 2 als Wandtablet * PocketControl HM (iPhone 6 + iPad Pro) * CUxD * Apple watch mit PocketControl HM * * 4x Amazon Alexa mit Homematic Steuerung

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

Re: Benzinpreis Adapter

Beitrag von alchy » 05.05.2016, 15:53

womber hat geschrieben: Oh man bin ich doof.... :roll: Da passt das Sprichwort mit dem Wald und Bäumen mal wieder :D
Danke Alchy
Bitte, keine Ursache. Hatte gestern auch so einen Blackout. :cry:
womber hat geschrieben: Aber bräuchte nochmal Hilfe. Hätte gerne die Preise einzeln in einer Variable.
So sollte es gehen , gleich für Speichern ohne Ausgabe :lol:

Code: Alles auswählen

! kleiner Ansatz zum Auslesen einer Website mit Rückgabe in die Homematic
! als Script Benzinpreise auslesen (c) by Alchy v 0.2
var url = "http://www.benzinpreis-aktuell.de/tanken-hem-tankstelle-datteln-45711-11cd.html";
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -q -O - '"#url#"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
string srueck = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
var posValueStart = "id=\"price0\"";
var posValueEnd = "/div";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var super = srueck.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0);
var posValueStart = "id=\"price1\"";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var e10 = srueck.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0);
var posValueStart = "id=\"price2\"";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var diesel = srueck.Substr(posValue, 6).StrValueByIndex(posValueEnd, 0);
!WriteLine("Diesel: "#diesel #" - E10: " #e10 #" - Super: " #super);
dom.GetObject("Preis_Real_Diesel").State(diesel);
dom.GetObject("Preis_Real_Super_E10").State(e10);
dom.GetObject("Preis_Real_Super_Benzin").State(super);
Übertreib es nicht mit den Scripten :!:

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.

Benutzeravatar
Sprite01
Beiträge: 488
Registriert: 16.10.2011, 10:11
Wohnort: Dessau
Kontaktdaten:

Re: Benzinpreis Adapter

Beitrag von Sprite01 » 05.05.2016, 22:49

Habt ihr das Script von Tankerkönig als CCU.IO - Adapter ?
Ich hatte es bisher in der CCU als Programm.

Bei mir kommt im Moment auch nur "0" als Ausgabe es Dieselpreises, die anderen Sorten benötige ich nicht.
Wo kann man da eine Reihenfolge ändern ?

Code: Alles auswählen

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

    var apikey = "xxxxxxx-xxxxx-xxxx-xxxxxxxxxxx"; !API KEY EINTRAGEN
    var tankid = "xxxxxxxxxx-xxxxxx-xxxxxx-xxxxxxxxxxx"; !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:1.CMD_SETS").State(cmd);
    dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
    stdout  = dom.GetObject("CUxD.CUX2801001:1.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("Tank_Jet_Diesel").Variable(preis.ToFloat());                     !EIGENE VARIABLE EINTRAGEN
    !-----------
Gruß
Dirk

HomeMatic CCU2 mit CUxD, XML-API und Email-Addon, Visualisierung mittels ioBroker auf Android 22"-Wandtablet
http://www.DessauWetter.de

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

Re: Benzinpreis Adapter

Beitrag von alchy » 06.05.2016, 10:10

Hab auf die Schnelle auch mal auch Tankerkönig wieder zum Laufen gebracht.
Das muss natürlich nicht lange funktionieren, falls wieder was geändert wird.
Es besteht die Möglichkeit mehrere Tankstellen abzufragen, dazu die TankID kommasepariert eintragen.

Code: Alles auswählen

! Tankerkönigscript (c) angepasst by Alchy
var apikey = "++++++++++++++++++++++++"; ! Ihr API-Key
var tankids = "XXX-XXXX-XXXXX-XXX,YYY-YYYY-YYYYY-YYY,ZZZ-ZZZZ-ZZZZZ-ZZZ,"  ; ! Alle gewünschten Tankstellen komma separiert

! URL der tankerkoenig.de API
string tankerKoenigURL = "https://creativecommons.tankerkoenig.de/json/detail.php";
string 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, 10).StrValueByIndex(posValueEnd, 0);
if (off == "true") { var offen = " offen "; } else { var offen = " geschlossen "; }


! Preis e5
var posValueStart = ",\"e5\":";
var posValueEnd = ",";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var e5= srueck.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0);
!Preis e10
var posValueStart = ",\"e10\":";
var posValueEnd = ",";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var e10= srueck.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0);
! Preis Diesel
var posValueStart = ",\"diesel\":";
var posValueEnd = ",";
var posValue = srueck.Find(posValueStart) + posValueStart.Length();
var diesel = srueck.Substr(posValue, 10).StrValueByIndex(posValueEnd, 0);

slist = slist #name #" hat "#offen #" E5 kostet "#e5 #"Euro - E10 kostet "#e10 #"Euro - DIESEL kostet "#diesel # "Euro \n";
}
WriteLine(slist);

Wer Fragen hat, einfach fragen

Auch hier der Hinweis, übertreibt es nicht mit dieser Art von Scripten !

Alchy
Zuletzt geändert von alchy am 28.01.2017, 21:48, insgesamt 3-mal geändert.
Grund: Hinweis hinzugefügt

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 „CCU.IO“