Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. In Node Red Informationen aus einen Script empfangen und auswerten

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    In Node Red Informationen aus einen Script empfangen und auswerten

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

      Hallo

      Danke für den Hinweiß.

      Ich habe es mal versucht ohne ioBroker API.

      Gebe ich im Browser fogendes ein

      "http://192.168.2.87:1880/test?temperature=22"

      dann empfängt Node Red mit "http in" und URL /test den Aufruf vom Browser.

      Unter DEBUG kann ich auch temperature: "22" sehen.

      Das geht sehr schnell.

      Rufe ich folgendes Node Js auf so dauert es lange das das Script durchläuft.

      NODE_DEBUG=request node request2.js

       var request = require('request');
      
      var value1=22;
      var URL = "http://192.168.2.87:1880/test?temperature=22";
      console.log (URL);
      
      request.put(URL, function (error, response, result) {
          if (result) {
             console.log(result);
          }
      }); 
      

      Die Ausgabe vom Script ist folgendes

       http://192.168.2.87:1880/test?temperature=22
      REQUEST { uri: 'http://192.168.2.87:1880/test?temperature=22',
        callback: [Function],
        method: 'PUT' }
      REQUEST make request http://192.168.2.87:1880/test?temperature=22
      REQUEST onRequestResponse http://192.168.2.87:1880/test?temperature=22 404 { 'x-powered-by': 'Express',
        'content-security-policy': 'default-src \'self\'',
        'x-content-type-options': 'nosniff',
        'content-type': 'text/html; charset=utf-8',
        'content-length': '143',
        date: 'Tue, 02 Jan 2018 12:07:01 GMT',
        connection: 'close' }
      REQUEST reading response's body
      REQUEST finish init function http://192.168.2.87:1880/test?temperature=22
      REQUEST response end http://192.168.2.87:1880/test?temperature=22 404 { 'x-powered-by': 'Express',
        'content-security-policy': 'default-src \'self\'',
        'x-content-type-options': 'nosniff',
        'content-type': 'text/html; charset=utf-8',
        'content-length': '143',
        date: 'Tue, 02 Jan 2018 12:07:01 GMT',
        connection: 'close' }
      REQUEST end event http://192.168.2.87:1880/test?temperature=22
      REQUEST has body http://192.168.2.87:1880/test?temperature=22 143
      REQUEST emitting complete http://192.168.2.87:1880/test?temperature=22
      
      <title>Error</title>
      
      ```
      Cannot PUT /test
      ```
      
      

      Das Script hat 404 Error Cannot PUT als Ausgabe.

      Wie bekomme ich das Sript Fehlfrei zum Laufen?

      Gruß NetFritz

      1 Reply Last reply Reply Quote 0
      • N
        nobody last edited by

        ja, das liegt an der method: 'PUT'.

        Es gibt bei Http unterschiedliche Methods, die unterschiedliche Aktionen auf dem HTTP-Server auslösen (https://developer.mozilla.org/en-US/doc … TP/Methods).

        Mit PUT kann man eine Datei auf dem Server speichern. Was hier nicht gewünscht ist. Da vom Testskript keine Daten im Body gesendet werden, wird halt bis zum Timeout gewartet und dann der Fehler erzeugt.

        Die HTTP-Methode, die für die Simple-API-Aufrufe verwendet werden muss, ist GET, da die Parameter direkt an der URL hängen. Aus HTTP-Sicht ist der REST-API-Aufruf wie ein Abruf einer Website vom Server.

        Versuche mal request.get (…) oder einfach nur request (...) wie in meinem Beispiel. Damit sollte es gehen. (Das Request-Object ist hier beschrieben https://github.com/request/request)

        1 Reply Last reply Reply Quote 0
        • N
          NetFritz last edited by

          Hallo

          Das habe ich mir schon gedacht das es an PUT liegt.

          Füge ich nun request.get ein dann braucht die Übertragung zu Node Red ca. 3 sekunden.

          Das Script bricht aber erst nach langer Zeit ab.

          Mache ich den curl Aufruf in der Konsole bricht der Aufruf in der Konsole nicht ab.

          Die Übertragung erfogt sofort.

          curl "http://192.168.2.87:1880/test?temperature=22"
          

          Ach ja der Browser Aufruf läuft auch lange bis zum Abbruch.

          Das wird sicherlich daran liegen das GET ein responde erwartet.

          Ich habe ja hinter "http in" eine "function" und dann ein "debug"

          In der "function" habe ich folgendes eingetragen:

          msg.payload.helloText = 'Hello World!';
          node.log('Hey There, World!');
          return msg;
          

          Es ging schon mal wenn ich den im Browser ausgeführt habe das ich als Rückmeldung im Browser

          "Hey There, World" stehen hatte.

          Gruß NetFritz

          1 Reply Last reply Reply Quote 0
          • N
            nobody last edited by

            Zeig mal deinen node-red-Flow. Hört sich danach an, dass es kein http-response gibt, der den Statuscode auf 200 (=OK) setzt.

            Der Request erwartet natürlich eine Antwort vom Server. Wenn du nur einen http-in-Node hast, bekommt das Request-Objekt im Testskript jedoch keine Antwort von node-red und wartet bis zum Timeout.

            Damit man den Request korrekt beantworten kann gibt es in node-red nicht nur einen http-in sondern auch einen http-out. Der http-response-Node muss mit dem in-Node verbunden werden, damit dieser die Verbindung übernehmen kann. Dazwischen kann z.B. durch einen Change-Node der zu sendende Inhalt festgelegt werden. In deinem Fall brauchst du das nicht, weil der body bereits leer ist und als statusCode per Default 200 gesendet wird.

            Sollte in etwa wie auf dem Bild aussehen.
            632_screenshot.png

            1 Reply Last reply Reply Quote 0
            • N
              NetFritz last edited by

              Hallo

              Habe jetzt hinter den "http in" noch ein "http request" gesetzt.

              Bekomme jetzt im Browser als Request "temperature: "22" " und im Node Red ist sofort nach dem Absenden

              die "temperature "22" " zu sehen.

              Auch in der Konsole mit "curl "http://192.168.2.87:1880/test?temperature=22" " sofort in Node Red

              die "temperature "22" " zu sehen.

              Blos das Node js braucht ca. 5 sekunden dafür.

               */
              var request = require('request');
              var URL = "http://192.168.2.87:1880/test?temperature=22";
              
              request.get(URL, function (error, response, result) {
                  if (error) {
                     //console.log(error);
                  }
              }); 
              

              Keine Ahnung warum.

              Hier noch die DEBUG Ausgabe:

               NODE_DEBUG=request node request2.js
              REQUEST { uri: 'http://192.168.2.87:1880/test?temperature=22',
                callback: [Function],
                method: 'GET' }
              REQUEST make request http://192.168.2.87:1880/test?temperature=22
              REQUEST onRequestResponse http://192.168.2.87:1880/test?temperature=22 200 { 'x-powered-by': 'Express',
                'x-content-type-options': 'nosniff',
                'content-type': 'application/json; charset=utf-8',
                'content-length': '20',
                etag: 'W/"14-0d4s4gMIkyPp/otqo6vG2W1Qf5M"',
                date: 'Tue, 02 Jan 2018 16:59:12 GMT',
                connection: 'close' }
              REQUEST reading response's body
              REQUEST finish init function http://192.168.2.87:1880/test?temperature=22
              REQUEST response end http://192.168.2.87:1880/test?temperature=22 200 { 'x-powered-by': 'Express',
                'x-content-type-options': 'nosniff',
                'content-type': 'application/json; charset=utf-8',
                'content-length': '20',
                etag: 'W/"14-0d4s4gMIkyPp/otqo6vG2W1Qf5M"',
                date: 'Tue, 02 Jan 2018 16:59:12 GMT',
                connection: 'close' }
              REQUEST end event http://192.168.2.87:1880/test?temperature=22
              REQUEST has body http://192.168.2.87:1880/test?temperature=22 20
              REQUEST emitting complete http://192.168.2.87:1880/test?temperature=22
              root@raspberrypi:/var/www/html/myhouse/nodejs#
              
              

              Gruß NetFritz

              1 Reply Last reply Reply Quote 0
              • N
                nobody last edited by

                @NetFritz:

                Hallo

                Habe jetzt hinter den "http in" noch ein "http request" gesetzt `
                Wieso http request? Der ist zum senden von requests.

                Nimm mal den http Response .

                Gesendet von meinem SM-G930F mit Tapatalk

                1 Reply Last reply Reply Quote 0
                • N
                  NetFritz last edited by

                  Hallo

                  Schon richtig ist ein "http response".

                  Habe mich verschrieben.

                  Gruß NetFritz

                  1 Reply Last reply Reply Quote 0
                  • N
                    nobody last edited by

                    Mal ausprobiert, ob node.js die 5 Sekunden zum starten braucht?

                    Gesendet von meinem SM-G930F mit Tapatalk

                    1 Reply Last reply Reply Quote 0
                    • N
                      NetFritz last edited by

                      Hallo

                      Mal am des Node js Script ein "console.log("start");" gesetzt.

                      Nach Return kommt "start" nach ca. 2sek. und dann nach ca. 3sek.

                      ist das Script durgelaufen und in Node Red unter DEBUG die Ausgabe.

                      Gruß NetFritz

                      1 Reply Last reply Reply Quote 0
                      • N
                        NetFritz last edited by

                        Hallo

                        Habe es mal mit

                         var get = require('simple-get');
                        
                        get('http://192.168.2.87:1880/test?temperature=22', function (err, res) {
                          if (err) throw err;
                          console.log(res.statusCode); // 200
                          res.pipe(process.stdout); // `res` is a stream
                        }); 
                        

                        versucht.

                        Geht viel schneller.

                        Start braucht auch ca 2sek., danach ist das Script sofort durchgelaufen

                        und Node Red reagiert auch sofort danach.

                        var request = require('request'); braucht wohl so lange.

                        Das ganze läuft auf einem RPi Zero W.

                        Gruß NetFritz

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        787
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        2
                        14
                        4521
                        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