Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. Node-red: Spritpreise einlesen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Node-red: Spritpreise einlesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • derAuge
      derAuge last edited by

      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

      1 Reply Last reply Reply Quote 0
      • ruhr70
        ruhr70 last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • derAuge
          derAuge last edited by

          {"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"}]}
          
          

          1620_betriebsstundenzaehler_097.js

          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            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.

            1 Reply Last reply Reply Quote 0
            • derAuge
              derAuge last edited by

              @ruhr70:

              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
              315_tanker.png

              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;
              
              1 Reply Last reply Reply Quote 0
              • ruhr70
                ruhr70 last edited by

                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

                1 Reply Last reply Reply Quote 0
                • derAuge
                  derAuge last edited by

                  Super

                  Danke für den Tipp

                  Wenn es als Objekt übergeben wird
                  315_node-red_json-objekt.png
                  dann funktioniert es

                  Gruß

                  derAuge

                  1 Reply Last reply Reply Quote 0
                  • derAuge
                    derAuge last edited by

                    @ruhr70:

                    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 Godorf 😉

                    Michael `

                    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

                    1 Reply Last reply Reply Quote 0
                    • ruhr70
                      ruhr70 last edited by

                      bin unterwegs

                      nimm mal bitte das [0] weg.

                      Gesendet von iPhone mit Tapatalk

                      1 Reply Last reply Reply Quote 0
                      • derAuge
                        derAuge last edited by

                        @ruhr70:

                        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

                        1 Reply Last reply Reply Quote 0
                        • ruhr70
                          ruhr70 last edited by

                          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

                          1 Reply Last reply Reply Quote 0
                          • P
                            pix last edited by

                            Hallo,

                            mich hat bei der Ausgabe der Spritpreise die dritte Stelle nach dem Komma (Hoch 9) gestört. In Deutschland wird sie zur Berechnung herangezogen,im Sprachgebrauch aber nie genannt. Zur Anzeige in VIS habe ich deshalb ein kleines Skript geschrieben, dass den Preis auf zwei Nachkommastellen setzt, ohne zu runden.

                            /* System VIS Spritpreis
                            
                            Skript kürzt Spritpreis aus Node Red um eine Stelle (von drei auf zwei Stellen nach dem Komma)
                            in Vis Widget wird die Entität ⁹ (hoch 9) bzw mit <sup>9</sup> angehängt.
                            (aus 1.119 wird 1.11hoch9)
                            
                            erstellt: 28.04.2015 von pix
                            */
                            
                            // Erstellen der Variablen
                            createState('Sprit_Preis_kurz');
                            
                            var idPreis = "node-red.0.sprit_preis"/*sprit_preis*/
                                idPreis_kurz = "javascript.0.Sprit_Preis_kurz";
                            
                            // Preis kürzen
                            on( {
                                id: idPreis,
                                valGt: 0
                            }, function (data) {
                                var rechenwert = data.newState.val * 100; // 100facher Preis jetzt mit einer Nachkommastelle
                                rechenwert = Math.floor(rechenwert); // Nachkommastelle (.9) wird abgeschnitten
                                rechenwert = rechenwert/100; // es bleiben zwei Nachkommastellen
                                setState(idPreis_kurz, rechenwert);
                            
                            });
                            

                            261_bildschirmfoto_2015-04-28_um_15.49.52.jpg

                            Voranstellen HTML:````
                            Diesel

                            HTML anhängen:````
                            <sup>9</sup> €
                            

                            Font-Size: 30px

                            261_bildschirmfoto_2015-04-28_um_15.53.35.jpg

                            Gruß

                            Pix

                            1 Reply Last reply Reply Quote 0
                            • Homoran
                              Homoran Global Moderator Administrators last edited by

                              Das ist eine gute Idee. Die Optik ist super, aber….

                              Es gibt tatsächlich Tankstellen, die mit halben cent arbeiten und z.b. den Diesel dann für 1.184 anbieten.

                              Gruß

                              Rainer

                              Gesendet von meinem Cynus T7 mit Tapatalk

                              1 Reply Last reply Reply Quote 0
                              • ruhr70
                                ruhr70 last edited by

                                @Homoran:

                                Das ist eine gute Idee. Die Optik ist super, aber….

                                Es gibt tatsächlich Tankstellen, die mit halben cent arbeiten und z.b. den Diesel dann für 1.184 anbieten. `

                                Da würde ich mir das Leben dann sehr einfach machen…

                                Prüfen, ob der Preis auf 4 oder 9 endet.

                                Dementsprechend in eine Steuervariable eine 4 oder 9 schreiben.

                                Zwei Widgets übereinander legen (eins mit hoch 4 und eins mit hoch 9).

                                Das entsprechende Widget anzeigen, je nach dem Wert der Steuervariable (Sichtbarkeit).

                                1 Reply Last reply Reply Quote 0
                                • ruhr70
                                  ruhr70 last edited by

                                  So, die super Idee von pix geklaut und umgearbeitet. :roll:

                                  • alles in Node-red, benötigt kein Script im Javascript Adapter

                                  • node kann einfach hinter weiteren Preisen kopiert werden

                                  • berücksichtigt 3. Nachkommastelle mit 4 oder 9

                                  Einfach hinter der function node für den ermittelten Spritpreis eine weitere function node (mit zwei Ausgängen) mit folgenden Code einsetzen:

                                  // Preis kürzen
                                      var rechenwert = msg.payload * 100;   // 100facher Preis jetzt mit einer Nachkommastelle
                                      var rechenwert2 = msg.payload * 1000; // 1000facher Preis ohne Nachkommastelle
                                      rechenwert = Math.floor(rechenwert);  // Nachkommastelle (.x) wird abgeschnitten
                                      rechenwert = rechenwert/100;          // es bleiben zwei Nachkommastellen
                                      msg1 = {};
                                      msg1.payload = rechenwert;            // Preis mit 2 Nachkommastellen ausgeben (abgeschnitten)
                                      msg2 = {};
                                      msg2.payload = rechenwert2 - (rechenwert * 1000); // Dritte Nachommastelle einzeln ermitteln
                                  
                                  return [msg1,msg2];
                                  

                                  327_2015-04-28_node_spritpreis_zerlegen.jpg
                                  Node hinter dem Spritpreis, um diesen zu zerlegen.

                                  Ausgang 1 enthält den Spritpreis mit zwei Nachkommastellen (abgeschnitten, nicht gerundet), z.B. 1,19

                                  Ausgang 2 enthält die dritte Nachkommestellen (z.B. 4 oder 9), z.B. 9

                                  Beide Ausgänge einer Node-red Variable zuweisen (die blaue ioBroker out node).

                                  In VIS nun zwei Widgets übereinanderlegen.

                                  1. Widget, wie von pix beschrieben, mit der Endung hoch 4

                                  2. Widget, wie von pix beschrieben, mit der Endung hoch 9

                                  Die Variable mit der 3. Nachkommastelle wird nun für die Sichtbarkeit verwendet.

                                  Steht dort eine 4, wird das erste Widget angezeigt. Bei eine 9 das 2. Widget.

                                  1 Reply Last reply Reply Quote 0
                                  • ruhr70
                                    ruhr70 last edited by

                                    Kleine Aufgabe ist noch drin…

                                    Wenn ein Spritpreis an der zweiten Stelle nach dem Komma eine 0 hat, wird diese als Zahl nicht dargestellt (das dürfte beim Script von pix auch der Fall sein).

                                    D.h. 1,409 wird als 1,4 und 9 ausgegeben.

                                    [EDIT] -gelöst-

                                    Kleine Anpassung im Script. Der auf zwei Stellen gerundete Spritpreis wird nun als String ausgegeben.

                                    Für Rickshaw usw. verwende ich weiterhin den originalen Spritpreis mir drei Nachkommastellen.

                                    Für die VIS Ausgabe von pix nehme ich die zwei Nachkomatellen als String

                                    // Preis kürzen
                                        var rechenwert = msg.payload * 100;   // 100facher Preis jetzt mit einer Nachkommastelle
                                        var rechenwert2 = msg.payload * 1000; // 1000facher Preis ohne Nachkommastelle
                                        rechenwert = Math.floor(rechenwert);  // Nachkommastelle (.x) wird abgeschnitten
                                        rechenwert = rechenwert/100;          // es bleiben zwei Nachkommastellen
                                        msg1 = {};
                                        msg1.payload = rechenwert.toFixed(2); // Preis mit 2 Nachkommastellen ausgeben (abgeschnitten)
                                        msg2 = {};
                                        msg2.payload = rechenwert2 - (rechenwert * 1000); // Dritte Nachommastelle einzeln ermitteln
                                    
                                    return [msg1,msg2];
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • ruhr70
                                      ruhr70 last edited by

                                      327_tankstellen.jpg

                                      Tankstellen per Detailabfrage.

                                      Design der Preisangaben von pix.

                                      Dritte Stelle hinter Komma nach Angaben von von Homoran berücksichtigt (4 und 9).

                                      Script für zwei Stellen hinterm Komma und separate dritte Stelle von pix angepasst.

                                      1 Reply Last reply Reply Quote 0
                                      • Homoran
                                        Homoran Global Moderator Administrators last edited by

                                        Super Design!

                                        Haben wollen 😉 flow, script und view! Als sorglospaket:-)

                                        Das sind jetzt aber fixe Tankstellen, oder ändert sich das Logo etwa auch?

                                        Gruß

                                        Rainer

                                        PS oder direkt als Adapter.

                                        1 Reply Last reply Reply Quote 0
                                        • P
                                          pix last edited by

                                          Hallo ruhr70,

                                          sieht spitze aus. Da muss ich bei mir definitiv noch nacharbeiten.
                                          @ruhr70:

                                          Wenn ein Spritpreis an der zweiten Stelle nach dem Komma eine 0 hat, wird diese als Zahl nicht dargestellt (das dürfte beim Script von pix auch der Fall sein). ` Habe ich heute erst gemerkt. Schön, dass du das schon verbessert hast (rechenwert.toFixed(2);)

                                          Viele Grüße

                                          pix

                                          1 Reply Last reply Reply Quote 0
                                          • ruhr70
                                            ruhr70 last edited by

                                            @Homoran:

                                            Haben wollen 😉 flow, script und view! Als sorglospaket:-) `

                                            Die Berechnung zur Aufteilung der beiden Nachkommastellen und der dritten Nachkommastelle mit 4 oder 9 ist wirklich nur eine Funktion hinter der Funktion, in der der Preis ermittelt wird. Das kurze Script in der Funktion steht oben beschrieben. Alles in Node-red. Ein JavaScript im JavaScript-Adapter wird nicht benötigt.

                                            Das Styling in VIS basiert auf der Beschreibung von pix oben. Hier wüsste ich gar nicht, wie ich die zur Verfügung stellen sollte. Wobei… es ist echt nur dreimal die Preisanzeige von pix, ein paar Zusatzinfos aus der Detailabfrage und ein Widget als Hintergrund.

                                            @Homoran:

                                            Das sind jetzt aber fixe Tankstellen, oder ändert sich das Logo etwa auch? `

                                            Ja, das sind fixe Tankstellen. Dynamisch geht aber auch. Wenn Du die Infos "geöffnet, Text zu den Öffnungszeiten und von/bis" nicht benötigst, dann ist es recht einfach möglich auch dynamisch die drei Tankstellen mit dem besten Preis, inkl. Logo anzuzeigen. Solltest Du die Infos auch benötigen, wäre das ein Thema für eine Javascript Profi (anhand der Tankstellen ID, die richtige Detailabfrage zuzuordnen) oder für ganz viel übereinanderliegende Widgets.

                                            Das Logo bekommt man dynmamisch hin, indem man eine Varibale mir dem Inhalt des Felds stations[x].name für die Sichtbarkeit des Logos verwendet. Einfach alle Logos als Widget übereinanderlegen. Die Sichtbarkeit wird über den Inhalt einer Variable (z.B. TankstellenLogo), Inhalt z.B. "Esso Tankstelle" gesteuert.

                                            @Homoran:

                                            PS oder direkt als Adapter. `

                                            Für mich… keine Chance. Ich stehe ganz am Anfang. Ich kann nur Beispiele adaptieren und anpassen. Lerne hier aber unheimlich viel 😉 Danke dafür!

                                            @pix: danke für Deine hervorragende Beschreibung!

                                            @homoran: eigentlich ist im Threat alles beschrieben. Was kann ich für Dich genau tun?

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            427
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            24
                                            125
                                            34423
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo