NEWS
Node-red: Spritpreise einlesen
-
Ich habe den flow auf zwei Spritsorten erweitert und wollte mich jetzt mal wieder an etwas javascript wagen und noch den Zweit- und drittbilligsten auslesen.
Gibt es dazu so etwas wie next "name", oder so?
Störend kam noch dazu, dass der Dieselteil mir Werte anzeigte, die nicht nachprüfbar waren, da wurde eine geschlossene Tankstelle angegeben, mit einem vermutlich veralteten Preis.
Nach Verringerung des Radius war die dann raus.
Gruß
Rainer `
In der zweiten Variante von pix kannst Du die Objekte ganz einfach auslesen.
Bei mir sind die ersten beiden Treffer zwei Tankstellen mit einem Spritpreis von 0,00 EUR.
Also lese ich die dritte Tankstelle aus.
Den Preis der dritten Tankstelle auslesen.
msg.payload = msg.payload.stations[2].price; return msg;
stations[0] = 1. Tankstelle
…
stations[2] = 3. Tankstelle
Bei den Tankstellen wollte ich auch die Marke und die genaue Anschrift haben.
Das habe ich dann so im zweiten Wert ausgelesen:
msg.payload = msg.payload.stations[2].brand + ', ' + msg.payload.stations[2].street + ' ' + msg.payload.stations[2].houseNumber + ', ' + msg.payload.stations[2].postCode + ' ' + msg.payload.stations[2].place; return msg;
-
Habe inzwischen selber das System erkannt ([0]…) und weiter rumgebastelt.
Diese Tabelle ist Spitze, wie hast du die generiert. Das war das, was ich gestern suchte.
ich wollte auch mehr Infos rausholen.
lt.Tanklerkönig gibt es dafür aber zwei abfragen, einmal "list" und einmal "detail"
Gruß
Rainer
-
Ich habe nochmal weitergespielt und versucht bestimmte Tankstellen auszulesen.
irgendwie scheint es nicht zu klappen, wenn Tankstellen geschlossen sind.
Daraufhin habe ich mal einen anderen flow versucht:
[{"id":"f43c2035.0bc3e","type":"inject","name":"Abfrage alle 15min starten","topic":"","payload":"","payloadType":"date","repeat":"900","crontab":"","once":true,"x":152,"y":558,"z":"9e1279a2.61ed88","wires":[["85444a5a.7abbb8","ff83a1a3.007c6","a7ee9dc6.58116","5388aedb.ac775","7469e67a.8b9618","4cae17ec.b351e8"]]},{"id":"85444a5a.7abbb8","type":"http request","name":"Tankerkoenig mit API abfragen","method":"GET","ret":"obj","url":"https://creativecommons.tankerkoenig.de/json/list.php?lat=50.893151&lng=6.9657667&rad=1&sort=dist&type=diesel&apikey=K E Y","x":521,"y":95,"z":"9e1279a2.61ed88","wires":[["ebc81b8e.1437e8"]]},{"id":"1e693115.e196cf","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1042,"y":39,"z":"9e1279a2.61ed88","wires":[]},{"id":"ebc81b8e.1437e8","type":"function","name":"Daten extrahieren","func":"msg1 = {};\nmsg1.payload = msg.payload.stations[0].name;\n\nmsg2 = {};\nmsg2.payload = msg.payload.stations[0].street;\n\nmsg3 = {};\nmsg3.payload = msg.payload.stations[0].houseNumber;\n\nmsg4 = {};\nmsg4.payload = msg.payload.stations[0].price;\n\nreturn [msg1,msg2,msg3,msg4];","outputs":"4","x":769,"y":95,"z":"9e1279a2.61ed88","wires":[["1e693115.e196cf"],["f5204af4.0adfb8"],["dff4d929.200b28"],["7d69bcf0.829644","84d48ee.f7b2b7"]]},{"id":"84d48ee.f7b2b7","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1040,"y":148,"z":"9e1279a2.61ed88","wires":[]},{"id":"dff4d929.200b28","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1036,"y":111,"z":"9e1279a2.61ed88","wires":[]},{"id":"f5204af4.0adfb8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1039,"y":74,"z":"9e1279a2.61ed88","wires":[]},{"id":"ff83a1a3.007c6","type":"http request","name":"Tankerkoenig mit API abfragen","method":"GET","ret":"obj","url":"https://creativecommons.tankerkoenig.de/json/list.php?lat=50.8990027&lng=6.9540347&rad=1&sort=dist&type=diesel&apikey=K E Y","x":520,"y":258,"z":"9e1279a2.61ed88","wires":[["b9eb86a6.461478"]]},{"id":"9cb060b8.634fa","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1038,"y":204,"z":"9e1279a2.61ed88","wires":[]},{"id":"b9eb86a6.461478","type":"function","name":"Daten extrahieren","func":"msg1 = {};\nmsg1.payload = msg.payload.stations[0].name;\n\nmsg2 = {};\nmsg2.payload = msg.payload.stations[0].street;\n\nmsg3 = {};\nmsg3.payload = msg.payload.stations[0].houseNumber;\n\nmsg4 = {};\nmsg4.payload = msg.payload.stations[0].price;\n\nreturn [msg1,msg2,msg3,msg4];","outputs":"4","x":765,"y":258,"z":"9e1279a2.61ed88","wires":[["9cb060b8.634fa"],["dcf00ebb.230ff"],["5a2cafa1.a5d35"],["5015d0a5.afea3","a6e00459.591ff8"]]},{"id":"5015d0a5.afea3","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1034,"y":312,"z":"9e1279a2.61ed88","wires":[]},{"id":"5a2cafa1.a5d35","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1032,"y":276,"z":"9e1279a2.61ed88","wires":[]},{"id":"dcf00ebb.230ff","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1035,"y":239,"z":"9e1279a2.61ed88","wires":[]},{"id":"a7ee9dc6.58116","type":"http request","name":"Tankerkoenig mit API abfragen","method":"GET","ret":"obj","url":"https://creativecommons.tankerkoenig.de/json/list.php?lat=50.8580184&lng=6.9646159&rad=1&sort=dist&type=diesel&apikey=K E Y","x":514,"y":413,"z":"9e1279a2.61ed88","wires":[["795bad8d.86a454"]]},{"id":"790c1e85.86f3e","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1037,"y":358,"z":"9e1279a2.61ed88","wires":[]},{"id":"795bad8d.86a454","type":"function","name":"Daten extrahieren","func":"msg1 = {};\nmsg1.payload = msg.payload.stations[0].name;\n\nmsg2 = {};\nmsg2.payload = msg.payload.stations[0].street;\n\nmsg3 = {};\nmsg3.payload = msg.payload.stations[0].houseNumber;\n\nmsg4 = {};\nmsg4.payload = msg.payload.stations[0].price;\n\nreturn [msg1,msg2,msg3,msg4];","outputs":"4","x":764,"y":413,"z":"9e1279a2.61ed88","wires":[["790c1e85.86f3e"],["3203ed64.cdfc12"],["a7a536d2.585ac8"],["2867900c.d7987","16c04316.e93fbd"]]},{"id":"2867900c.d7987","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1033,"y":466,"z":"9e1279a2.61ed88","wires":[]},{"id":"a7a536d2.585ac8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1031,"y":430,"z":"9e1279a2.61ed88","wires":[]},{"id":"3203ed64.cdfc12","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1034,"y":393,"z":"9e1279a2.61ed88","wires":[]},{"id":"7d69bcf0.829644","type":"ioBroker out","name":"Diesel Verteilerkreis","topic":"Diesel_Verteilerkreis","ack":"true","autoCreate":"true","x":1262,"y":145,"z":"9e1279a2.61ed88","wires":[]},{"id":"a6e00459.591ff8","type":"ioBroker out","name":"Diesel Star Brühler Straße","topic":"Diesel_star","ack":"true","autoCreate":"true","x":1266,"y":313,"z":"9e1279a2.61ed88","wires":[]},{"id":"16c04316.e93fbd","type":"ioBroker out","name":"Diesel Metro","topic":"Diesel_metro","ack":"true","autoCreate":"true","x":1259,"y":464,"z":"9e1279a2.61ed88","wires":[]},{"id":"7469e67a.8b9618","type":"http request","name":"Tankerkoenig mit API abfragen","method":"GET","ret":"obj","url":"https://creativecommons.tankerkoenig.de/json/list.php?lat=50.893151&lng=6.9657667&rad=1&sort=dist&type=e5&apikey=K E Y","x":515,"y":608,"z":"9e1279a2.61ed88","wires":[["7746034c.88b9fc"]]},{"id":"c1604de1.3e9fb","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1037,"y":552,"z":"9e1279a2.61ed88","wires":[]},{"id":"7746034c.88b9fc","type":"function","name":"Daten extrahieren","func":"msg1 = {};\nmsg1.payload = msg.payload.stations[0].name;\n\nmsg2 = {};\nmsg2.payload = msg.payload.stations[0].street;\n\nmsg3 = {};\nmsg3.payload = msg.payload.stations[0].houseNumber;\n\nmsg4 = {};\nmsg4.payload = msg.payload.stations[0].price;\n\nreturn [msg1,msg2,msg3,msg4];","outputs":"4","x":768,"y":608,"z":"9e1279a2.61ed88","wires":[["c1604de1.3e9fb"],["fb673b92.0498c8"],["6752f2ef.98ad0c"],["d3dfa1cb.2c206","9947461b.66b8b8"]]},{"id":"9947461b.66b8b8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1035,"y":661,"z":"9e1279a2.61ed88","wires":[]},{"id":"6752f2ef.98ad0c","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1031,"y":624,"z":"9e1279a2.61ed88","wires":[]},{"id":"fb673b92.0498c8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1034,"y":587,"z":"9e1279a2.61ed88","wires":[]},{"id":"4cae17ec.b351e8","type":"http request","name":"Tankerkoenig mit API abfragen","method":"GET","ret":"obj","url":"https://creativecommons.tankerkoenig.de/json/list.php?lat=50.8990027&lng=6.9540347&rad=1&sort=dist&type=e5&apikey=K E Y","x":519,"y":764,"z":"9e1279a2.61ed88","wires":[["c95cc0bd.36a34"]]},{"id":"cbeeb167.34115","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1033,"y":710,"z":"9e1279a2.61ed88","wires":[]},{"id":"c95cc0bd.36a34","type":"function","name":"Daten extrahieren","func":"msg1 = {};\nmsg1.payload = msg.payload.stations[0].name;\n\nmsg2 = {};\nmsg2.payload = msg.payload.stations[0].street;\n\nmsg3 = {};\nmsg3.payload = msg.payload.stations[0].houseNumber;\n\nmsg4 = {};\nmsg4.payload = msg.payload.stations[0].price;\n\nreturn [msg1,msg2,msg3,msg4];","outputs":"4","x":770,"y":764,"z":"9e1279a2.61ed88","wires":[["cbeeb167.34115"],["b79b2d1c.4864d"],["2f01c3a8.d0fe3c"],["e5a2c197.1a5d4","10e313f5.ef1cec"]]},{"id":"e5a2c197.1a5d4","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1029,"y":818,"z":"9e1279a2.61ed88","wires":[]},{"id":"2f01c3a8.d0fe3c","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1027,"y":782,"z":"9e1279a2.61ed88","wires":[]},{"id":"b79b2d1c.4864d","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1030,"y":745,"z":"9e1279a2.61ed88","wires":[]},{"id":"5388aedb.ac775","type":"http request","name":"Tankerkoenig mit API abfragen","method":"GET","ret":"obj","url":"https://creativecommons.tankerkoenig.de/json/list.php?lat=50.8580184&lng=6.9646159&rad=1&sort=dist&type=e5&apikey=K E Y","x":521,"y":924,"z":"9e1279a2.61ed88","wires":[["565b7f0.fa9a48"]]},{"id":"46f30145.b90d","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1032,"y":867,"z":"9e1279a2.61ed88","wires":[]},{"id":"565b7f0.fa9a48","type":"function","name":"Daten extrahieren","func":"msg1 = {};\nmsg1.payload = msg.payload.stations[0].name;\n\nmsg2 = {};\nmsg2.payload = msg.payload.stations[0].street;\n\nmsg3 = {};\nmsg3.payload = msg.payload.stations[0].houseNumber;\n\nmsg4 = {};\nmsg4.payload = msg.payload.stations[0].price;\n\nreturn [msg1,msg2,msg3,msg4];","outputs":"4","x":770,"y":924,"z":"9e1279a2.61ed88","wires":[["46f30145.b90d"],["2f81f08e.d07e1"],["847629c1.7b89d8"],["2eb7227.fd148de","8dd45ac2.722ba8"]]},{"id":"2eb7227.fd148de","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1028,"y":975,"z":"9e1279a2.61ed88","wires":[]},{"id":"847629c1.7b89d8","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1026,"y":939,"z":"9e1279a2.61ed88","wires":[]},{"id":"2f81f08e.d07e1","type":"debug","name":"","active":true,"console":"false","complete":"false","x":1029,"y":902,"z":"9e1279a2.61ed88","wires":[]},{"id":"d3dfa1cb.2c206","type":"ioBroker out","name":"E5 Verteilerkreis","topic":"e5_Verteilerkreis","ack":"true","autoCreate":"true","x":1257,"y":658,"z":"9e1279a2.61ed88","wires":[]},{"id":"10e313f5.ef1cec","type":"ioBroker out","name":"E5 Star Brühler Straße","topic":"e5_star","ack":"true","autoCreate":"true","x":1261,"y":819,"z":"9e1279a2.61ed88","wires":[]},{"id":"8dd45ac2.722ba8","type":"ioBroker out","name":"E5 Metro","topic":"e5_metro","ack":"true","autoCreate":"true","x":1262,"y":977,"z":"9e1279a2.61ed88","wires":[]}]
Dazu habe ich für jede Tankstelle eine Abfrage beim Tankerkönig mit exakten Koordinaten und einem radius von 1 (geht es auch kleiner? 0 hat er nicht genommen) und sort=dist(ance).
Außerdem gibt er mir Name, Straße und Hausnummer mit aus, dadurch sehe ich ob es die Richtige Tanke ist, wobei das wichtiger ist, wenn man nach Preis sortiert.
Beim verwenden des Flows bitte euren apikey und die Koordinaten der gewünschten Tanke eingeben
Gruß
Rainer
-
Hallo Rainer,
schöner flow
Wenn Du gezielt Tankstellen abfragen willst, dann kannst Du das über die ID der Tankstelle und der Detailabfrage machen.
Beispiel, Abfrage der Tankstelle mit der ID 646a461e-2341-4b5f-8f8b-09edc8f7d22c
https://creativecommons.tankerkoenig.de … 5552056644
(funktioniert ohne den API-Key)
Dort findest Du dann auch die Öffnungszeiten der Tankstelle.
Folgende Datenfelder werden ausgegeben:
Viele Grüße nach Godorf
Michael
-
Viele Grüße nach Godorf ;-)
Knapp daneben [emoji6]
Womit und wie machst du die Tabellen?
Gruß
Rainer
-
Ich habe mir einen speziellen JSON Editor installiert.
In meinem Fall Cocoa JSON Editor für den Mac.
Und dann einfach "neue Datei aus Zwischenablage" auswählen.
-
-
-
Es gibt auch plugin für notepad++ - JSTool
-
so,
nachdem ich nun auch wieder ein TestSystem laufen habe wollte ich auch weiter mit NODE-RED testen
` > msg.payload = msg.payload.stations[1].price;
return msg; `
wenn ich diese function nehme bekomme ich immer eine Fehlermeldung
TypeError: Cannot read property '1' of undefined (line 1, col 35)
25 Apr 20:00:18 - [error] [function:Station 1] TypeError: Cannot read property '1' of undefined (line 1, col 35)
was mache ich falsch?
wie ist da der Stand bei euch?
Gruß
derAuge
-
Was kommt denn, wenn Du die URL, die Du im http response node eingetragen hast, direkt im Browser eingibst?
Kannst Du das Ergebnis hier posten.
stations[1] ist die zweite Tankstelle.
Vielleicht ergibt Dein eingestellter Radius ja weniger als eine Tankstelle.
-
{"license":"CC BY 4.0 - http:\/\/creativecommons.tankerkoenig.de","data":"MTS-K","stations":[{"name":"JET BORKEN NORDRING 46-48","lat":51.84667,"lng":6.84642,"brand":"JET","dist":1.7,"price":1.189,"id":"XXXX","street":"NORDRING 46-48","houseNumber":null,"postCode":46325,"place":"BORKEN"},{"name":"AVIA Tankstelle","lat":51.852592,"lng":6.864203,"brand":"AVIA","dist":0.4,"price":1.199,"id":"11652441-f3fc-4fc9-a87a-664db366b5af","street":"Ahauser Stra\u00dfe","houseNumber":"21","postCode":46325,"place":"Borken"},{"name":"AVIA Tankstelle","lat":51.85873,"lng":6.8657813,"brand":"AVIA","dist":0.8,"price":1.199,"id":"XXXX","street":"Ahauser Stra\u00dfe","houseNumber":"84","postCode":46325,"place":"Borken"},{"name":"A. Kuenstler GmbH","lat":51.86033,"lng":6.87505,"brand":"A. Kuenstler GmbH","dist":1,"price":1.199,"id":"XXXX","street":"Landwehr","houseNumber":"27","postCode":46325,"place":"Borken"},{"name":"AVIA Service Station","lat":51.857345,"lng":6.875487,"brand":"Freie Tankstelle","dist":0.8,"price":1.239,"id":"XXXX","street":"Otto-Hahn-Str.","houseNumber":"35","postCode":46325,"place":"Borken"},{"name":"Autozentrum Ebber GmbH & Co.KG","lat":51.83871,"lng":6.85797,"brand":"Westfalen","dist":1.6,"price":1.239,"id":"XXXX","street":"Raesfelder Str.","houseNumber":"24","postCode":46325,"place":"Borken"},{"name":"Aral Tankstelle","lat":51.844696,"lng":6.843055,"brand":"ARAL","dist":2,"price":1.239,"id":"XXXX","street":"Nordring","houseNumber":"178","postCode":46325,"place":"Borken"}]}
-
Um Deine zweite Frage zu beantworten… es funktioniert wunderbar.
Deine URL ermittelt sieben Tankstellen.
Deine Funktion müsste den Preis der 2. Tankstelle ermitteln (derzeit AVIA), 1,199 EUR.
Ich würde jetzt ein Debug node direkt hinter dem http response node setzen. Dann müsste die Ausgabe rauskommen, die Du vorhin gepostet hattest.
-
Um Deine zweite Frage zu beantworten… es funktioniert wunderbar.
Deine URL ermittelt sieben Tankstellen.
Deine Funktion müsste den Preis der 2. Tankstelle ermitteln (derzeit AVIA), 1,199 EUR.
Ich würde jetzt ein Debug node direkt hinter dem http response node setzen. Dann müsste die Ausgabe rauskommen, die Du vorhin gepostet hattest. `
genau das habe ich ja gemacht
ich schreich ja auch in eine Datei
Da kann ich ja sehen was abgeholt wurde
aber die Funktion (Station 1) bringt nur die Fehlermeldung
msg.payload = msg.payload.stations[1].price; return msg;
-
der Returntyp aus der http Abfrage ist falsch.
Du nutzt noch Text aus dem ersten Beispiel ganz oben.
Um JSON mit dem Script auszugeben muss der Returntyp auf Objekt stehen.
D.h. Deine erste Funktion wird dann nicht mehr korrekt funktionieren.
Gesendet von iPhone mit Tapatalk
-
Super
Danke für den Tipp
Wenn es als Objekt übergeben wird
dann funktioniert esGruß
derAuge
-
Hallo Rainer,
schöner flow
Wenn Du gezielt Tankstellen abfragen willst, dann kannst Du das über die ID der Tankstelle und der Detailabfrage machen.
Beispiel, Abfrage der Tankstelle mit der ID 646a461e-2341-4b5f-8f8b-09edc8f7d22c
https://creativecommons.tankerkoenig.de … 5552056644
(funktioniert ohne den API-Key)
Dort findest Du dann auch die Öffnungszeiten der Tankstelle.
Folgende Datenfelder werden ausgegeben:
filename="2015-04-23 Tankerkönig Detailabfrage.jpg" index="0">~~
Viele Grüße nach GodorfMichael `
Hallo Michael,
das möchte ich auch umsetzen.
nutze ein GET mit "https://creativecommons.tankerkoenig.de/json/detail.php + id + Key"
wird als JSON- Objekt übergeben
Das speichen in deiner Datei ergibt folgenden Inhalt:
{ "license" : "CC BY 4.0 - http://creativecommons.tankerkoenig.de", "data" : "MTS-K", "station" : { "id" : "51d4b6b0-a095-1aa0-e100-80009459e03a", "name" : "JET BORKEN NORDRING 46-48", "brand" : "JET", "street" : "NORDRING 46-48", "houseNumber" : null, "postCode" : 46325, "place" : "BORKEN", "overrides" : [], "openUntil" : 1430172000, "isOpen" : true, "e5" : 1.509, "e10" : 1.489, "diesel" : 1.279, "lat" : 51.84667, "lng" : 6.84642, "state" : null, "openingTimes" : [{ "text" : "Montag, Dienstag, Mittwoch, Donnerstag", "start" : "05:00:00", "end" : "00:00:00" }, { "text" : "Freitag, Sonntag", "start" : "07:00:00", "end" : "00:00:00" }, { "text" : "Samstag", "start" : "06:00:00", "end" : "00:00:00" } ] } }
nun möchte ich über eine Funktion ein einige Daten heraus filtern
z.B.:
msg1 = {}; msg1.payload = msg.payload.station[0].name; msg2 = {}; msg2.payload = msg.payload.station[0].diesel; msg3 = {}; msg3.payload = msg.payload.station[0].isOpen; msg4 = {}; msg4.payload = msg.payload.station[0].openUntil; return [msg1,msg2,msg3,msg4];
das funktioniert leider nicht. :oops: Ich habe da wohl noch einiges nicht verstanden
folgende Fehlermeldung:
- TypeError: Cannot read property '0' of undefined (line 1, col 39
- node-red-0 2015-04-26 13:12:57 error 26 Apr 13:12:57 - [error] [function:(detail) Daten extrahieren] TypeError: Cannot read property '0' of undefined (line 1, col 39)
Was mache ich falsch?
Gruß
derAuge
-
bin unterwegs
nimm mal bitte das [0] weg.
Gesendet von iPhone mit Tapatalk
-
bin unterwegs
nimm mal bitte das [0] weg. `
Danke für den Tipp.
So geht es:
msg1 = {}; msg1.payload = msg.payload.station.name; msg2 = {}; msg2.payload = msg.payload.station.diesel; msg3 = {}; msg3.payload = msg.payload.station.isOpen; msg4 = {}; msg4.payload = msg.payload.station.openUntil; return [msg1,msg2,msg3,msg4];
Dann kann ich nun weiter testen (lernen)
Gruß
derAuge
-
na, dann sind wir da ähnlich weit.
hab mit dem Thema auch gerade erst angefangen.
wie ich das verstanden habe hängt es von der Struktur des JSON ab, Ob du [] brauchst oder nicht.
wenn es mehrere Werte geben kann ist der Teil als Array (?) strukturiert. dann brauchst du die Klammern. Das erkennt man an der Baumstruktur
sorry für den chaotischer Text. Er ist per Spracheingabe diktiert.
Gesendet von iPhone mit Tapatalk