Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. warten auf exec befehl [resolved]

    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

    warten auf exec befehl [resolved]

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fastfoot @MarkusK last edited by

      @markusk

      function some_execAsync() {
          return new Promise((resolve, reject) => {
              exec("sleep 5", function (error, stdout, stderr) {
                  log("1 exec ist fertig");
                  resolve();
              });
          })
      }
      async function main() {
          await some_execAsync();
          log("2 exec ist fertig");
      }
      
      main()
      
      M 1 Reply Last reply Reply Quote 1
      • M
        MarkusK @fastfoot last edited by

        @fastfoot Danke

        1 Reply Last reply Reply Quote 0
        • Karel Puhli
          Karel Puhli last edited by Karel Puhli

          Nabend!
          Das Thema ist schon etwas älter, aber passt so ziemlich genau auf meinen Anwendungsfall. Ich möchte mir per Telegram Bilder von der Cam zuschicken.
          Folgendes Script liegt zu Grunde:

          const idTestTrigger = "0_userdata.0.Fenster1";
          
          
          async function fotoMachen() {
              return new Promise ((resolve) => {
                  exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/");
                  exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg http://10.146.26.135:8765/picture/1/current/");
                  resolve();
              });
          }
          
          
          async function fotoSenden() {
              await fotoMachen();
              sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Garten.jpg`);
              sendTo(`telegram`, `/home/iobroker/IP_Cam/Snapshots/Wintergarten.jpg`);
          }
          
          on({id: idTestTrigger, change: "any"}, async function () {
              await fotoSenden();
          })
          

          Es funktioniert trotz promise, trotz await und sonst was leider nicht. Die Lösung mit einem Timeout vor dem sendTo kenne ich, sie funktioniert auch. Nur wollte ich es etwas eleganter machen. Leider habe ich wohl einen Nagel im Kopf. Hat jemand ne Idee

          Log:

          elegram.0	2023-06-15 20:22:02.837	error	Cannot send photo [chatId - 1271149145]: Error: ETELEGRAM: 400 Bad Request: file must be non-empty
          

          LG Karel

          T 1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @Karel Puhli last edited by ticaki

            @karel-puhli

            Hatte erst was mit callbacks geschrieben aber geht auch komplizierter 🙂 Code hab ich bei fastfood geklaut

            function some_execAsync() {
                return new Promise((resolve, reject) => {
                    exec("wget --output-document /home/iobroker/IP_Cam/Snapshots/Garten.jpg http://10.146.26.135:8765/picture/2/current/", function (error, stdout, stderr) {
                        log("1 exec ist fertig");
                        resolve();
                    });
                })
            }
            
            Karel Puhli F 3 Replies Last reply Reply Quote 1
            • Karel Puhli
              Karel Puhli @ticaki last edited by

              @ticaki
              Oh man, so hatte ich es vorhin tatsächlich schon mal stehen. Anscheinend war irgendwo doch ein "Schreibfehler" oder so drin...
              Trotzdem vielen Dank natürlich an Dich!!!

              1 Reply Last reply Reply Quote 0
              • F
                fastfoot @ticaki last edited by

                @ticaki sagte in warten auf exec befehl [resolved]:

                bei fastfood geklaut

                das geht garnicht, ich schenk' ihn dir 🙂
                hier noch eine Alternative:

                const util = require("util");
                const execAsync = util.promisify(require("child_process").exec);
                
                const test = async (cmd) => {
                    let erg = await execAsync(cmd);
                
                    log('1 ' + erg.stdout)
                    log('2 ' + erg.stderr)
                }
                
                test('ls')
                
                T 1 Reply Last reply Reply Quote 0
                • T
                  ticaki Developer @fastfoot last edited by

                  @fastfoot
                  den will ich auch geschenkt haben 🙂

                  F 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @ticaki last edited by

                    @ticaki sagte in warten auf exec befehl [resolved]:

                    @fastfoot
                    den will ich auch geschenkt haben 🙂

                    nur zu 🙂 wichtiger als diese Schnipsel ist aber die Tatsache dass man mit beiden Methoden fast alles was einen callback nutzt in ein Promise wandeln kann, auf welches man dann ganz bequem mit await warten kann. Gut für ältere Tools welche callbacks verwenden, neuere bieten ja fast immer auch eine Version mit Promise an. Auch wichtig, eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet

                    1 Reply Last reply Reply Quote 0
                    • Karel Puhli
                      Karel Puhli @ticaki last edited by

                      @ticaki sagte in warten auf exec befehl [resolved]:

                      erst was mit callbacks geschrieben aber geht auch komplizierter

                      Naja, ich finde callbacks eher kompliziert zum Lesen. 😉

                      @fastfoot sagte in warten auf exec befehl [resolved]:

                      eine async function zu erstellen macht nur dann Sinn wenn man darin auch await verwendet

                      Blockly bildet ja eigentlich immer async ab, ob await vorkommt, oder nicht. Ist ja auch nicht schädlich, oder?

                      F 1 Reply Last reply Reply Quote 0
                      • F
                        fastfoot @Karel Puhli last edited by

                        @karel-puhli in JS schadet es der Lesbarkeit bzw Verständlichkeit, ansonsten schadet es nicht. In Blockly vermute ich ist es der Einfachheit wegen, async davor und passt immer

                        A 1 Reply Last reply Reply Quote 1
                        • A
                          Axel21 @fastfoot last edited by

                          @fastfoot
                          Beim Suchen nach Exec und wait bin ich hierher gekommen. Auch wenn das Thema etwas älter ist, es bleibt aktuell. Und danke für die vielen Anregungen!
                          Für alle, die in BLOCKLY eine execcmd- Funktion möchten, die auf das Ergebnis des Kommandos wartet und das Ergebnis dann auch direkt an eine Variable weitergeben kann: Hier die entsprechende JS-Funktion, die man in den Block "JS-Funktion mit Ergebnis" innerhalb Blockly -> Funktionen einfügt.

                          return new Promise((resolve, reject) => {
                                  exec(cmd, function (error, stdout, stderr) {
                                      resolve(stdout);
                                  });
                              });
                          

                          Den Unterschied zum klassischen exec-Block sieht man an folgendem Beispiel (Timestamps beachten).
                          Wer mit asynchroner JS-Programmierung superfit ist, und verschachtelte callbacks mag, braucht das natürlich nicht 🙂 Vielleicht hilft es ja jemandem, der wie ich danach gesucht hat.
                          Bildschirmfoto vom 2025-07-14 15-42-25.png

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          884
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

                          javascript
                          5
                          12
                          709
                          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