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. [gelöst] Output eines externen Modules in msg.payload

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Output eines externen Modules in msg.payload

    This topic has been deleted. Only users with topic management privileges can see it.
    • mickym
      mickym Most Active @Steff75 last edited by

      @steff75 Na ich habs gerade ausprobiert - da kommen doch super viele INformationen, die Du weiter verarbeiten kannst:

      76ca59b2-4b48-477f-ab82-379dba9b2372-image.png

      Du brauchst Dir doch nur aussuchen, was Du in Deiner payload haben willst oder nimmst halt das ganze Objekt in Deine Payload aber das macht doch keinen Sinn.

      S 1 Reply Last reply Reply Quote 0
      • S
        Steff75 @mickym last edited by

        @mickym Ja, aber genau da steh ich ja auf'm Schlauch. Wie bekomme ich die Daten in die msg.payload rein. Mit einem Change Node hat's bei mir nicht funktioniert. Bin gerade mit dem Handy unterwegs, kann deshalb gerade nichts testen.

        mickym 1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active @Steff75 last edited by mickym

          @steff75 Also meines Erachtens macht es keinen Sinn, das gesamte Objekt in eine Payload zu übertragen, sondern nur einzelne Teile. Habe es Dir aber in allen Variationen gemacht und auch mal das ganze Objekt in eine payload gepackt-

          8c85de0b-8f67-46e4-8bfb-f6183699cb60-image.png

          [{"id":"f5a791ab593792aa","type":"function","z":"9fcb0a617a8859ec","name":"youtube-dl-exec","func":"youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => node.send(output));","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"youtubeDlExec","module":"youtube-dl-exec"}],"x":400,"y":260,"wires":[["1202dfee1cb84604","0f8f4167b7967ab8","52da2783f79bf177"]]},{"id":"75e224aee8b98c7f","type":"inject","z":"9fcb0a617a8859ec","name":"BkJRS9Z-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJRS9Z-tgY","payloadType":"str","x":200,"y":260,"wires":[["f5a791ab593792aa"]]},{"id":"1202dfee1cb84604","type":"debug","z":"9fcb0a617a8859ec","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":590,"y":260,"wires":[]},{"id":"0f8f4167b7967ab8","type":"change","z":"9fcb0a617a8859ec","name":"Views","rules":[{"t":"set","p":"payload","pt":"msg","to":"view_count","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":340,"wires":[["a5672b26088ab4b3"]]},{"id":"a5672b26088ab4b3","type":"debug","z":"9fcb0a617a8859ec","name":"direkter Zugriff (empfohlen)","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":810,"y":340,"wires":[]},{"id":"52da2783f79bf177","type":"change","z":"9fcb0a617a8859ec","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":400,"wires":[["d38033480368b3ca","6c18dcd99f1063ed"]]},{"id":"d38033480368b3ca","type":"debug","z":"9fcb0a617a8859ec","name":"ganzes Objekt in payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":810,"y":400,"wires":[]},{"id":"6c18dcd99f1063ed","type":"change","z":"9fcb0a617a8859ec","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.view_count","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":460,"wires":[["ee414a30cdf37df0"]]},{"id":"ee414a30cdf37df0","type":"debug","z":"9fcb0a617a8859ec","name":"view_count aus payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1030,"y":460,"wires":[]}]
          

          S 1 Reply Last reply Reply Quote 1
          • S
            Steff75 @mickym last edited by

            @mickym Super, danke. Ich werde es nachher mal ausprobieren.

            mickym 1 Reply Last reply Reply Quote 0
            • mickym
              mickym Most Active @Steff75 last edited by mickym

              @steff75 Alternativ kannst Du auch die function Node modifizieren, so dass das Objekt in eine payload geschrieben wird.
              Aber wie gesagt, man kann auch mit dem Objekt arbeiten und dort die Werte ermitteln und braucht es deshalb nicht.

              915a337a-06ae-431c-8e64-e9c4dffbfdfc-image.png

              youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {
                  var newMsg = {payload:output};
                  node.send(newMsg);
                  });
              
              S 1 Reply Last reply Reply Quote 1
              • S
                Steff75 @mickym last edited by

                @mickym sagte in Output eines externen Modules in msg.payload:

                                                                                                                                            youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {                                                                                                                                                                                var newMsg = {payload:output};                                                                                                                                                                                node.send(newMsg);                                                                                                                                                                                });                                            
                

                Ok, das in deiner zweiten Lösung ist das, was ich eigentlich die ganze Zeit versucht hatte und nicht hinbekommen habe. Das nehme ich als Basis und hole mir von da die benötigten Daten raus.

                Warum das bei mir mit dem Change-Node damals nicht funktioniert hatte, kann ich jetzt gar nicht mehr nachvollziehen. Evt. ein Buchstabenverdreher, weil ich ja normalerweise schon mit dem Change-Node zurecht komme. Egal, dank deiner Hilfe funktioniert es ja nun.

                Vielen Dank nochmal! 👍

                mickym 1 Reply Last reply Reply Quote 0
                • mickym
                  mickym Most Active @Steff75 last edited by

                  @steff75
                  Man kann auch das existierende Nachrichtenobjekt nutzen. Habs gerade probiert.

                  youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {msg.payload = output;node.send(msg);});
                  
                  S 1 Reply Last reply Reply Quote 1
                  • S
                    Steff75 @mickym last edited by

                    @mickym Das werde ich morgen mal testen. Danke 👍

                    Noch was. Als ich vorhin das andere probiert hatte, habe ich auch mal eine absichtlich nicht existierende Youtube Video-Url verwendet, um zu sehen, ob dann auch ein Output kommt. Momentan passiert bei so einer Url dann einfach nix. Kann ich da noch was einbauen, dass mir in so einem Fall im Output eine Fehlermeldung ausgegeben wird? Dann könnte ich im weiteren Flowverlauf darauf reagieren.

                    mickym 3 Replies Last reply Reply Quote 0
                    • mickym
                      mickym Most Active @Steff75 last edited by mickym

                      @steff75 sagte in Output eines externen Modules in msg.payload:

                      @mickym Das werde ich morgen mal testen. Danke 👍

                      Noch was. Als ich vorhin das andere probiert hatte, habe ich auch mal eine absichtlich nicht existierende Youtube Video-Url verwendet, um zu sehen, ob dann auch ein Output kommt. Momentan passiert bei so einer Url dann einfach nix. Kann ich da noch was einbauen, dass mir in so einem Fall im Output eine Fehlermeldung ausgegeben wird? Dann könnte ich im weiteren Flowverlauf darauf reagieren.

                      Ich hab mir zwar mal die API von dem Teil angeschaut - aber diese Warnings funktionieren nicht - man bekommt auch nichts, wenn man noWarnungs auf false stellt.

                      001c36e8-1c9f-4948-a6fd-605dcc3220f5-image.png

                      Die einzige Möglichkeit die ich sehe ist einen TimeOut Timer in Deiner Function Node zu setzen, der einen Fehler erzeugt:

                      const myTimeout = setTimeout(() => node.error("Error: Keine Antwort",msg), 5000);
                      
                      youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {
                              msg.payload = output;
                              clearTimeout(myTimeout);
                              node.send(msg);
                              node.done();
                          });
                      
                      

                      Ich hab den mal auf 5 s gesetzt.

                      die 1. Node ergibt das Objekt:

                      ed749911-de7e-4f9c-ac83-cb15e2b9533c-image.png

                      die 2. Node erzeugt nun einen Fehler:

                      ea60a8b2-1644-4efb-992d-a724f2ae1fbc-image.png

                      Nachricht geht nicht! EDIT: Doch geht schon - habe wieder die Asynchronität vergessen. Mit node.send() gehts aber - siehe nächstes Posting.

                      Den Fehler kann man aber mit einer Catch Node abfangen, dann gibts keinen Fehler mehr, sondern Du kannst den Flow weiterbearbeiten und das Error-Objekt auswerten:

                      b1594b4a-f65e-4def-bf83-86894d3ee590-image.png

                      [{"id":"f5a791ab593792aa","type":"function","z":"cb05e14b.326a9","name":"youtube-dl-exec","func":"const myTimeout = setTimeout(() => node.error(\"Error: Keine Antwort\",msg), 5000);\n\nyoutubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {\n        msg.payload = output;\n        clearTimeout(myTimeout);\n        node.send(msg);\n        node.done();\n    });\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"youtubeDlExec","module":"youtube-dl-exec"}],"x":620,"y":1260,"wires":[["1202dfee1cb84604"]]},{"id":"75e224aee8b98c7f","type":"inject","z":"cb05e14b.326a9","name":"BkJRS9Z-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJRS9Z-tgY","payloadType":"str","x":430,"y":1240,"wires":[["f5a791ab593792aa"]]},{"id":"1202dfee1cb84604","type":"debug","z":"cb05e14b.326a9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":1260,"wires":[]},{"id":"29008fa6b5e17efb","type":"inject","z":"cb05e14b.326a9","name":"Error URL: BkJRS-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJRS-tgY","payloadType":"str","x":400,"y":1280,"wires":[["f5a791ab593792aa"]]},{"id":"84d1592163f9765b","type":"catch","z":"cb05e14b.326a9","name":"","scope":["f5a791ab593792aa"],"uncaught":false,"x":560,"y":1360,"wires":[["6d23f7d365575c5e"]]},{"id":"6d23f7d365575c5e","type":"debug","z":"cb05e14b.326a9","name":"Fehlerhafte URL","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":770,"y":1360,"wires":[]}]
                      

                      1 Reply Last reply Reply Quote 1
                      • mickym
                        mickym Most Active @Steff75 last edited by mickym

                        @steff75 So manchmal bin ich einfach blöd, das Problem warum im Fehlerfall vorher keine normale Nachricht versendet wurde, liegt an der Asynchronität.

                        Also, wenn man einfach eine Meldung im Fehlerfall ausgeben will, dann kann man das auch wie folgt machen:

                        const myTimeout = setTimeout(NoReturn, 5000);
                        
                        youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {
                            msg.payload = output;
                            clearTimeout(myTimeout);
                            node.send(msg);
                            node.done();
                         });
                        
                        function NoReturn(){
                            msg.payload = "Keine Rückantwort";
                            node.send(msg);
                            node.done();
                        }
                        
                        

                        2cb370bc-9ef1-4501-9900-e58b7e4f327e-image.png

                        [{"id":"6452b757c45baa7c","type":"function","z":"84ce2b17a7e60da8","name":"youtube-dl-exec","func":"const myTimeout = setTimeout(NoReturn, 5000);\n\nyoutubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => {\n msg.payload = output;\n clearTimeout(myTimeout);\n node.send(msg);\n node.done();\n });\n\nfunction NoReturn(){\n msg.payload = \"Keine Rückantwort\";\n node.send(msg);\n node.done();\n}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"youtubeDlExec","module":"youtube-dl-exec"}],"x":660,"y":680,"wires":[["68d5040203c27b4d"]]},{"id":"6c856e483f45a597","type":"inject","z":"84ce2b17a7e60da8","name":"BkJRS9Z-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJRS9Z-tgY","payloadType":"str","x":470,"y":660,"wires":[["6452b757c45baa7c"]]},{"id":"68d5040203c27b4d","type":"debug","z":"84ce2b17a7e60da8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":870,"y":680,"wires":[]},{"id":"11b80ade27c10608","type":"inject","z":"84ce2b17a7e60da8","name":"Error URL: BkJRS-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJRS-tgY","payloadType":"str","x":440,"y":700,"wires":[["6452b757c45baa7c"]]}]
                        

                        Man kann auch die alte payload in die Rückmeldung einbeziehen:

                        function NoReturn(){
                            msg.payload = "Keine Rückantwort von" + msg.payload;
                            node.send(msg);
                            node.done();
                        }
                        

                        a7415458-ad47-47ec-a941-4f6a5ff4c9c9-image.png

                        S 1 Reply Last reply Reply Quote 1
                        • mickym
                          mickym Most Active @Steff75 last edited by

                          @steff75
                          Da ich eigentlich keine Freund von Function Nodes bin, das Ganze auch mal als reinen Flow mit der ursprünglichen Function Node realisiert.

                          6d11c364-af60-49e4-8ecc-24a6f45b0065-image.png

                          [{"id":"f5a791ab593792aa","type":"function","z":"fc80e101f528680b","name":"youtube-dl-exec","func":"youtubeDlExec(msg.payload, { dumpSingleJson: true }).then(output => { var newMsg = {payload:output}; node.send(newMsg); });","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"youtubeDlExec","module":"youtube-dl-exec"}],"x":660,"y":300,"wires":[["5be3e24da46c8976","9b7a107317314c41"]]},{"id":"5be3e24da46c8976","type":"debug","z":"fc80e101f528680b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":930,"y":300,"wires":[]},{"id":"5f4d16b8fe1a7254","type":"trigger","z":"fc80e101f528680b","name":"Timeout nach 5s","op1":"","op2":"Keine Rückmeldung","op1type":"nul","op2type":"str","duration":"5","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":680,"y":420,"wires":[["f9925be5d5cde4eb"]]},{"id":"9b7a107317314c41","type":"change","z":"fc80e101f528680b","name":"","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":360,"wires":[["5f4d16b8fe1a7254"]]},{"id":"f9925be5d5cde4eb","type":"debug","z":"fc80e101f528680b","name":"Fehlerbehandlung","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":950,"y":420,"wires":[]},{"id":"877305d6a938a5c3","type":"inject","z":"fc80e101f528680b","name":"BkJRS9Z-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJRS9Z-tgY","payloadType":"str","x":230,"y":340,"wires":[["e0188791c1247d42"]]},{"id":"56903b042b7df479","type":"inject","z":"fc80e101f528680b","name":"Error BkJR-tgY","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"https://www.youtube.com/watch?v=BkJR-tgY","payloadType":"str","x":220,"y":400,"wires":[["e0188791c1247d42"]]},{"id":"e0188791c1247d42","type":"function","z":"fc80e101f528680b","name":"Input","func":"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":360,"wires":[["f5a791ab593792aa","5f4d16b8fe1a7254"]]}]
                          

                          1 Reply Last reply Reply Quote 2
                          • S
                            Steff75 @mickym last edited by

                            @mickym Super, so kann ich das verwenden 🙂
                            Du hättest aber nicht die halbe Nacht dafür wach bleiben müssen wegen meinem Problem. Tausend Dank! 👍

                            Wenn es um den reinen Code geht, wie man ihn im Function Node braucht, kann ich leider nur einfache Sachen. Deswegen benutze ich ja solche Software wie Tasker, EventGhost oder Node-Red, wo ich den Ablauf dann einfach visuell abbilden kann. Damit und mit ein bisschen Googlen kann ich die meisten Probleme in der Regel selbst umschiffen. Manchmal, wie in diesem Fall, muss ich dann aber doch nachfragen.

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            1.0k
                            Online

                            31.7k
                            Users

                            79.7k
                            Topics

                            1.3m
                            Posts

                            2
                            15
                            666
                            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