NEWS
Skripten des E-Control Spritpreisrechners
-
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
Ich glaube due verstehst die Funktion eines RegEx noch nicht ganz
Da geb ich dir zu 100% Recht!
Bis vor 2 Tagen hatte ich noch nie davon gehört. -
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
Ich glaube due verstehst die Funktion eines RegEx noch nicht ganz
Hallo Rainer,
ja und nein, die Kollegen haben einfach immer den für DE möglichen Tankerkönigadapter als das Ziel gesehen. Das geht leider so nicht. RegEx ist eine super Geschichte, nur machte ich mir im Verlauf dieses Threads schon meine Gedanken darüber was passiert, wenn dann alle paar Minuten 30 Serverabfragen zum gleichen Zeitpunkt von x Usern kommen.Ich bin dran, das Script (Ursprung vom Eingangspost) weiter zu entwickeln. Leider habe ich keine JS Kenntnisse oder Erfahrung und bin grad dabei mühsam zusammenzutragen und verstehen, wie was funktioniert.
@Negalein sagte in Skripten des E-Control Spritpreisrechners:
Dafür würd ich sogar bezahlen wenns funktioniert.
Darüber läßt sich reden
Im Ernst, gib mir noch paar Tage, ich bin am Lernen und Schauen wie ich es rasch und verständlich umsetzen kann. Die einzelnen DP anlegen lassen, dass kann das Bastelscript schon, Ich weiß, brauchst nicht. Aber eventuell jemand Anderer.Tankstellennamen einkürzen, bringe ich sicher nicht zusammen. Da gibt es zuviele kreative Auswüchse.
-
Name separat, ok
-
Preis seperat, ok
-
PLZ und Ort separat, ok
-
Strasse separat optional, ok
Was wäre noch von Interesse?
LG und bitte um etwas Geduld, mxa
-
-
@metaxa sagte in Skripten des E-Control Spritpreisrechners:
-
Name separat, ok
-
Preis seperat, ok
-
PLZ und Ort separat, ok
-
Strasse separat optional, ok
Das wäre toll!
Was wäre noch von Interesse?
Am allerwichtigsten ist, dass alle Daten zueinander passen.
Jetzt mit Parser und Regex ist es so, dass oft zB Ort 1 mit PLZ 3 und Preis 5 verheiratet sind.Funktionieren muss es mit der API, da auch alle anderen Apps (Android sowie das angebissene Äpfelchen) darauf zugreifen.
Darüber läßt sich reden
melde dich einfach, dann machen wir was
-
-
@Negalein sagte in Skripten des E-Control Spritpreisrechners:
melde dich einfach, dann machen wir was
Vergiss es, ich habe dich erst beim 2. mal Lesen verstanden.
@Negalein sagte in Skripten des E-Control Spritpreisrechners:
Am allerwichtigsten ist, dass alle Daten zueinander passen.
Tun sie jetzt auch im Script das du einsetzt, da die Quelle ein und der selbe String (JSON) sind. Was eventuell die API durcheinander bringt kann niemand abfangen.
-
@metaxa sagte in Skripten des E-Control Spritpreisrechners:
Was wäre dein Part von wir?
Ich zitiere mich mal selber
Dafür würd ich sogar bezahlen wenns funktioniert.
-
erl. Siehe oben, hab frech meinen Beitrag editiert.
Ich mach mal was ich zusammenbringe, dann stelle ich es hier ein. Bitte um Geduld, JS lernst ned in 48 Std., auch nicht am WIFI oder so, glaub ich.
Ich melde mich.@Homoran: Danke dass du dich so viel hier einbringst!
LG, mxa
-
Einfach so einen Kurznamen aus dem kompletten Namen extrahieren geht so einfach nicht, da jeder vollständige Name komplett anders aufgebaut ist.
Im besten Fall muss man eine Übersetzungstabelle anlegen, was bei hunderten von verschiedenen tankstellennamen nicht vertretbar ist.
Was zu häufige Abfragen angeht, ist das Skript schon die beste Lösung. Leider kann ich es auch nicht.
Gerade heute ist ein regex block für Blockly dazugekommen dann schaffe ich es vielleicht doch.Die idee hinter dem skript ist es nur einmal das gesamte json über den parser abzurufen (obwohl das auch über das skript selbst gehen müsste) und anschließend dieses json offline zu zerlegen.
Der parser adapter kann zwar auch aus einer datei parsen, aber imho nicht aus einem Datenpunkt.
Natürlich ist der Tankerkönig adapter das Maß aller Dinge. Leider bietet die api nicht den datenumfang des tankerkönigs. Daher kann man auch nur das auswerten was angeboten wird.
Auch geld als lockmittel ändert das nichts. Was nicht da ist kann man nicht herzaubern.
-
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
Auch geld als lockmittel ändert das nichts. Was nicht da ist kann man nicht herzaubern.
Das hast du falsch verstanden!
Soll kein Lockmittel sein.
Aber gute Arbeit darf ruhig auch mal belohnt werden! -
Ich hab einen anderen Ansatz gewählt.
Es ist bis jetzt nur ein Anfang um zu schauen ob es so geht.on({id: "parser.0.Tanken", change: 'any'}, function(obj) { var index = 0; /*var gasStation = JSON.parse('parser.0.Tanken');*/ var gasStation = JSON.parse(obj.state.val); /*if (gasStation.length === 0) return;*/ console.log((String('Durchlauf'))); createState("javascript.0.Sprit.Tankstelle_Test.Index", false,{type: 'number',name: 'index', read: true,write: true}); for (index = 0; index < gasStation.length; ++index) { createState("javascript.0.Sprit.Tankstelle_"+index+".Index", 0,{type: 'number',name: 'index', read: true,write: true}); setState("javascript.0.Sprit.Tankstelle_"+index+".Index", gasStation[index].id); createState("javascript.0.Sprit.Tankstelle_"+index+".name", 0,{type: 'string',name: 'name', read: true,write: true}); setState("javascript.0.Sprit.Tankstelle_"+index+".name", gasStation[index].name); } });
Was nicht geht ist das man den Datenpunkt gleich nach dem erstellen füllen kann. Dann kommt ein "Warn" im Protokoll und die Punkte werden nicht gefüllt.
Ist mein 1. JS-Programm. Bin also für Verbesserungen sehr dankbar.
Warum ich die Datenpunkte in der Schleife definiere ist, dass wenn zB.12 Tankstellen den gleichen Preis haben werden 12 Tankstellen zurückgegeben.
-
@Negalein
Ich fürchte du verstehst es nicht!- Sieh dir mal ALLE Tankstellenbezeichnungen die von der api ausgegeben werden an.
- überlege dir zu jedem eine dir genehme Kurzbezeichnung
- dann nenne mir EINE allgemeingültige Formel diese Kurzbezeichnungen zu extrahieren.
Ich bin auf diese Formel gespannt.
-
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
Ich fürchte du verstehst es nicht!
Nein, ich fürchte du hast es falsch verstanden!
Ich bezog mich einzig auf
Auch geld als lockmittel ändert das nichts.
Nicht mehr und nicht weniger!!
Sollte auch im Verlauf ersichtlich sein!
Namen kürzen wäre ein Wunsch. Aber wenns nicht geht, dann gehts halt nicht.
C’est la vieSo, und jetzt Schluß mit der i-Tüpferl Reiterei
Ich kann kein JS und hab es auch nie behauptet. -
@Negalein sagte in Skripten des E-Control Spritpreisrechners:
Ich bezog mich einzig auf
Dieser Satz war aber in einem Zusammenhang genannt. Den habe ich versucht wieder herzustellen
-
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
Dieser Satz war aber in einem Zusammenhang genannt. Den habe ich versucht wieder herzustellen
Ja, da hab ich den unbewusst mitzitiert!
Egal, konzentrieren wir uns wieder auf die Funktion!
-
@Negalein sagte in Skripten des E-Control Spritpreisrechners:
Egal, konzentrieren wir uns wieder auf die Funktion!
WIR haben uns konzentriert
Rausgekommen ist Folgendes:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // "Spritpreise_AT v.0.5" // // e-control Spritpreise // // ursprüngl. Script von steinejo_io vom // // // // Zwingend erforderlich sind der Parser Adapter und die URL aus der API. Links und Hilfe zum Erstellemn findet ihr im Folgenden Lnk: // // https://forum.iobroker.net/topic/20314/skripten-des-e-control-spritpreisrechners // // Das manuelle Anlegen von Daenpunkten ist nicht mehr notwendig. erledigt das Script beim ersten Aufruf. // // Auf das "E" Zeichen habe ich verzichtet, da es in VIS genz einfach an der jeweils gewünschten Stelle produzierbar ist. // // // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// on({id: "parser.0.Spritpreisrechner"/*Spritpreisrechner*/, change: 'any'}, function(obj) { log("Start Spritvergleich"); var gasStation = JSON.parse(obj.state.val); if (gasStation.length === 0) return; var i = 0; for (var i = 1; i <= 5; i++) { // console.log(i); // console.log("scriptDatenPunkte.Sprit_AT.name_"+i); createState("scriptDatenPunkte.Sprit_AT.Treffer_"+i+".Name_"+i, {type: "string", name: "Platz "+i, read: true, write: true}); createState("scriptDatenPunkte.Sprit_AT.Treffer_"+i+".Preis_"+i, {type: "string", name: "Platz "+i, read: true, write: true}); createState("scriptDatenPunkte.Sprit_AT.Treffer_"+i+".Strasse_"+i, {type: "string", name: "Platz "+i, read: true, write: true}); createState("scriptDatenPunkte.Sprit_AT.Treffer_"+i+".PLZ_Ort_"+i, {type: "string", name: "Platz "+i, read: true, write: true}); } var index = 0; //for (index = 0; index < gasStation.length; ++index) { for (index = 0; index <= 4; ++index) { setState("scriptDatenPunkte.Sprit_AT.Treffer_"+(index+1)+".Name_"+(index+1), gasStation[index].name); setState("scriptDatenPunkte.Sprit_AT.Treffer_"+(index+1)+".Preis_"+(index+1), (gasStation[index].prices[0].amount).toString().replace(".",",")); setState("scriptDatenPunkte.Sprit_AT.Treffer_"+(index+1)+".Strasse_"+(index+1), (gasStation[index].location.address)); setState("scriptDatenPunkte.Sprit_AT.Treffer_"+(index+1)+".PLZ_Ort_"+(index+1), (gasStation[index].location.postalCode) + " " + (gasStation[index].location.city)); } log("Ende Spritvergleich"); });
Die Datenpunkte werden beim ersten Auslösen erstellt, jedoch erst beim ZWEITEN Auslösen befüllt. Helfen kann man sich, indem man im Parser den Feldtyp von JSON verstellt, speichert, und wieder auf JSON umstrellt und wieder speichert.
Leider bekomme ich bei den ersten beiden Auslösern im Log paar Fehlermeldungen, das Script tut aber trotzem. Ich habe schon alles versucht, ich krieg sie nicht weg. Im Regelbetrieb gibt es keine Fehlermeldungen (bei mir).javascript.0 2019-04-04 19:01:43.905 error at Manager.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) javascript.0 2019-04-04 19:01:43.905 error at Manager.<anonymous> (/opt/iobroker/node_modules/component-bind/index.js:21:15) javascript.0 2019-04-04 19:01:43.905 error at Socket.onpacket (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:228:12) javascript.0 2019-04-04 19:01:43.905 error at Socket.onevent (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:270:10) javascript.0 2019-04-04 19:01:43.904 error at Socket.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20) javascript.0 2019-04-04 19:01:43.904 error at Socket.<anonymous> (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:52:30) javascript.0 2019-04-04 19:01:43.904 error at Object.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3705:37) javascript.0 2019-04-04 19:01:43.904 error at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:364:25) javascript.0 2019-04-04 19:01:43.904 error at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:963:38) javascript.0 2019-04-04 19:01:43.904 error at Object.<anonymous> (script.js.010_Testen.Vorlage_Spritpreisrechner_best_five_mit_Strasse_separat:29:100) javascript.0 2019-04-04 19:01:43.903 error Error in callback: TypeError: Cannot read property 'name' of undefined
Wenn jemand bitte einen Rat hat, unbedingt her damit.
LG, mxa
-
@metaxa sagte in Skripten des E-Control Spritpreisrechners:
WIR haben uns konzentriert
Mann muss doch mit einem Script das json jolen - in eine Variable schreiben - und diese dann zerlegen können, oder?
Habe leider keine Zeit mich in js einzuarbeiten und dann das zu probieren
-
-
Das Problem ist ja leider komplexer.
Da sich die Reihenfolge (und damit eventuell sogar as Vorhandensein von Preisen) dauernd ändert muss alles zusätzlich "übersetzt" werden.
Es kann ja sogar passieren, dass die Lieblingstanke nicht unter den Top 5 landet, weil sie in dem Moment zu teuer ist
-
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
Es kann ja sogar passieren, dass die Lieblingstanke nicht unter den Top 5 landet, weil sie in dem Moment zu teuer ist
Genau, darum ist es für Vis so nicht Richtig bzw. schwierig darstellbar.......
-
@sigi234
Da müsste man vielleicht mit 2-4 Abfragen von unterschiedlichem geografischen Mittelpunkt arbeiten, in der Hoffnung, dass die Tanke dann in einem dieser 10er-Pakete unter den Top5 liegt.Habe da zwar viele Ideen, aber mir mangelts am Handwerkszeug
-
@Homoran sagte in Skripten des E-Control Spritpreisrechners:
@sigi234
Das Problem ist ja leider komplexer.
Da sich die Reihenfolge (und damit eventuell sogar as Vorhandensein von Preisen) dauernd ändert muss alles zusätzlich "übersetzt" werden.
Es kann ja sogar passieren, dass die Lieblingstanke nicht unter den Top 5 landet, weil sie in dem Moment zu teuer istJa Rainer, da hast du durchaus recht. Deswegen hat der Kollege im Einstiegspost seine Lösung für seine Lieblingstankstelle gepostet. Funktioniert soweit einwandfrei, sofern die Tankstelle nicht geschlossen hat oder/und in der API die Option "geschlossene Tankstellen anzeigen: AN" gewählt wurde.
Nur was hilft es mir, wenn ich vielleicht sehe was der Sprit vor dem Schließen gekostet hat.Ich für mich denke eher daran beide Lösungen zu kombinieren. Heißt ein eigenes Script, dass meine bevorzugte Tankstelle anzeigt und die "Top 5" ergänzend zur reinen Info. Ob ich die Info dann umsetze und eine andere Tankstelle praktisch verwende, kann ich dann immer noch entscheiden.
LG, mxa