Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Frage zur Scriptprogrammierung

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.0k

Frage zur Scriptprogrammierung

Frage zur Scriptprogrammierung

Scheduled Pinned Locked Moved Skripten / Logik
7 Posts 3 Posters 906 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SteffS Offline
    SteffS Offline
    Steff
    wrote on last edited by
    #1

    Hallo,

    ich habe folgendes Script, was mir alle x-Stunden Werte per Telegram schicken soll (momentan zum Testen nur ein Wert).

    Das Script funktioniert auch soweit, d.h. der Aufruf des Bash-Scriptes für Telegram geht, es wird jedoch die von mir gewünschte Variable (SendData1) nicht mitgeschickt sondern nur der Variablenname. Ich denke ich muß die Variable anders "verpacken" - bin aber mit meinen Programmierkünsten in Javascript noch nicht wirklich weit.

    Zur Funktion: Ich rufe per exec das Script telegram.sh auf übergebe beim Aufruf die Priorität -2 und die Variable bzw. den Variableninhalt. Das Script sendet dann in Abhängigkeit der Prio den Variableninhalt an verschiedene Telegram Empfänger. Wie oben schon beschrieben geht das Senden es wird nur der Variableninhalt nicht mitgesendet sondern nur der Variablennname.

    Kann mir einer von Euch einen Schubs in die richtige Richtung geben?

    // Das Script soll alle x-Stunden Werte per Telegram versenden
    
    schedule('*/1 * * * *', function () { // Schedule zum testen auf 1 Minute
        var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val;
        log('Schedule wird ausgeführt'); // Logausgabe zum Testen
            // startet ein bash-script mit Sendeprio -2 Variableninhalt SendData1 soll gesendet werden
            exec('/opt/iobroker/scripts/telegram.sh -2 "SendData1"', function(err, stdout, stderr) {
            if (err) {
                log(stderr,'error');
            }
            });
     });
    

    Gruß Steffen

    ioBroker auf Intel NUC 7CJYH / Debian 11 / States in Redis / Objects in JSONL / Repo --> Beta / HM CCU2 V2.61.7 / Siemens LOGO! (0BA7 / 0BA8)
    Admin V7.4.7 / Node V20.18.1 / NPM V10.8.2 / JSC V7.0.6 / JSE V8.8.3

    1 Reply Last reply
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      wrote on last edited by
      #2

      @Steff:

      Wie oben schon beschrieben geht das Senden es wird nur der Variableninhalt nicht mitgesendet sondern nur der Variablennname. `
      Das liegt dran, dass den Variablennamen in die Anführungszeichen gepackst hast und nicht den Inhalt:

      exec('/opt/iobroker/scripts/telegram.sh -2 "SendData1"', function(err, stdout, stderr) {
      

      muss lauten

      exec('/opt/iobroker/scripts/telegram.sh -2 "' + SendData1 + '"', function(err, stdout, stderr) {
      

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      1 Reply Last reply
      0
      • SteffS Offline
        SteffS Offline
        Steff
        wrote on last edited by
        #3

        Hallo AlCalzone,

        danke, das war´s - und ich muß noch viel lernen! 🙂

        Gruß Steffen

        ioBroker auf Intel NUC 7CJYH / Debian 11 / States in Redis / Objects in JSONL / Repo --> Beta / HM CCU2 V2.61.7 / Siemens LOGO! (0BA7 / 0BA8)
        Admin V7.4.7 / Node V20.18.1 / NPM V10.8.2 / JSC V7.0.6 / JSE V8.8.3

        1 Reply Last reply
        0
        • SteffS Offline
          SteffS Offline
          Steff
          wrote on last edited by
          #4

          Hmm, nun habe ich doch noch ein Problem…

          ... das Script ist nun soweit fertig, alle meine Variablen werden gesendet, ich würde nun gerne zwischen den einzelnen zu sendenden Variablen eine kurze Pause einfügen. Ich denke mit setTimeout könnte es was werden aber irgendwie habe ich noch einen Bock drinne, es wird nicht zeitversetzt versendet.

          Edit: Habe das mit dem Schedule nun hinbekommen, hatte da noch einen Denkfehler drin.

          Edit: Code in Code-Tags gepackt, das war mir glatt durchgegangen --> danke an pix

          /**
          * Sendet zu bestimmten Zeiten Daten via Telegram
          */
          
          schedule('0 6,12,18 * * *', function () { // Schedule für später mit Start alle 6h
          //schedule('*/1 * * * *', function () { // Schedule zum Testen auf 1 Minute    
              setTimeout(Send2(), 500);
              setTimeout(Send3(), 1000);
              log('Script --> Info via Telegram alle 6h wird gestartet');
              // Erste Variable senden
              var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val;
                  exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Aussentemperatur beträgt ' + SendData1 + ' °C"', function(err, stdout, stderr) {
                  if (err) {
                      log(stderr,'error');
                  }
                  });
              // Zweite Variable senden
              function Send2() {
                  var SendData2 = getState("javascript.0.Telegram.Garagentemperatur").val;
                      exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Garagentemperatur beträgt ' + SendData2 + '"', function(err, stdout, stderr) {
                      if (err) {
                          log(stderr,'error');
                      }
                      });
              }
              // Dritte Variable senden
              function Send3() {
                  var SendData3 = getState("javascript.0.Telegram.Füllstand_Zisterne").val;
                      exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Der Zisternenfüllstand beträgt ' + SendData3 + '"', function(err, stdout, stderr) {
                      if (err) {
                          log(stderr,'error');
                      }
                      });
              }
           });
          

          Gruß Steffen

          ioBroker auf Intel NUC 7CJYH / Debian 11 / States in Redis / Objects in JSONL / Repo --> Beta / HM CCU2 V2.61.7 / Siemens LOGO! (0BA7 / 0BA8)
          Admin V7.4.7 / Node V20.18.1 / NPM V10.8.2 / JSC V7.0.6 / JSE V8.8.3

          1 Reply Last reply
          0
          • P Offline
            P Offline
            pix
            wrote on last edited by
            #5

            @Steff:

            Hmm, nun habe ich doch noch ein Problem…

            ... das Script ist nun soweit fertig, alle meine Variablen werden gesendet, ich würde nun gerne zwischen den einzelnen zu sendenden Variablen eine kurze Pause einfügen. Ich denke mit setTimeout könnte es was werden aber irgendwie habe ich noch einen Bock drinne, es wird nicht zeitversetzt versendet.

            Edit: Habe das mit dem Schedule nun hinbekommen, hatte da noch einen Denkfehler drin.

            ` > /**

            • Sendet zu bestimmten Zeiten Daten via Telegram

            */

            schedule('0 6,12,18 * * *', function () { // Schedule für später mit Start alle 6h

            //schedule('*/1 * * * *', function () { // Schedule zum Testen auf 1 Minute

            setTimeout(Send2(), 500);

            setTimeout(Send3(), 1000);

            log('Script –> Info via Telegram alle 6h wird gestartet');

            // Erste Variable senden

            var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val;

            exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Aussentemperatur beträgt ' + SendData1 + ' °C"', function(err, stdout, stderr) {

            if (err) {

            log(stderr,'error');

            }

            });

            // Zweite Variable senden

            function Send2() {

            var SendData2 = getState("javascript.0.Telegram.Garagentemperatur").val;

            exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Garagentemperatur beträgt ' + SendData2 + '"', function(err, stdout, stderr) {

            if (err) {

            log(stderr,'error');

            }

            });

            }

            // Dritte Variable senden

            function Send3() {

            var SendData3 = getState("javascript.0.Telegram.Füllstand_Zisterne").val;

            exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Der Zisternenfüllstand beträgt ' + SendData3 + '"', function(err, stdout, stderr) {

            if (err) {

            log(stderr,'error');

            }

            });

            }

            }); `

            Gruß Steffen `
            Hallo,

            lass mal Klammer auf und zu in setTimeout weg und packe hier im Forum den Code in CODE-Tags und nicht in QUOTE-Tags.

            Ausserdem habe ich mal die Abständezwischen den Sendungen auf 3s gestezt, damit man eine Verzögerung überhaupt bemerkt. Und schließlich ein paar Zeilen gespart: Wenn nach IF-Abfragen nur eine Code-Zeile ausgeführt wird, kann man die geschweifetn Klammern weglassen und den Befehl direkt dahinter setzen.

            Geschweifte und normale Klammer zu für schedule hat noch gefehlt, denn am Ende des Skirptes sind die nicht korrekt. Die Funktionen sollten ausserhalb von schedule liegen.

            ! ````
            ! /**

            • Sendet zu bestimmten Zeiten Daten via Telegram
              */

            ! schedule('0 6,12,18 * * ', function () { // Schedule für später mit Start alle 6h
            //schedule('
            /1 * * * *', function () { // Schedule zum Testen auf 1 Minute
            setTimeout(Send2, 3000);
            setTimeout(Send3, 6000);
            log('Script --> Info via Telegram alle 6h wird gestartet');

            // Erste Variable senden
            var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val;
            exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Aussentemperatur beträgt ' + SendData1 + ' °C"', function(err, stdout, stderr) {
                if (err) log(stderr,'error');
            });
            

            });
            // Zweite Variable senden
            function Send2() {
            var SendData2 = getState("javascript.0.Telegram.Garagentemperatur").val;
            exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Garagentemperatur beträgt ' + SendData2 + '"', function(err, stdout, stderr) {
            if (err) log(stderr,'error');
            });
            }
            // Dritte Variable senden
            function Send3() {
            var SendData3 = getState("javascript.0.Telegram.Füllstand_Zisterne").val;
            exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Der Zisternenfüllstand beträgt ' + SendData3 + '"', function(err, stdout, stderr) {
            if (err) log(stderr,'error');
            });
            }

            ! ````Gruß

            Pix

            ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

            1 Reply Last reply
            0
            • AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              wrote on last edited by
              #6

              Zur Erklärung:

              setTimeout(Send2(), 500);
              

              führt Send2 sofort aus (da runde Klammern dahinter) und versucht 500ms später den Rückgabewert von Send2() auszuführen.

              setTimeout(Send2, 500);
              

              weist setTimeout an, die Funktion Send2 nach 500ms auszuführen. Hier wird die Funktion selbst als Parameter übergeben (keine runden Klammern hinter Send2) und nicht ihr Rückgabewert.

              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

              1 Reply Last reply
              0
              • SteffS Offline
                SteffS Offline
                Steff
                wrote on last edited by
                #7

                Hallo pix und AlCalzone,

                danke für Eure Erklärungen, hat prima funktioniert!

                @Pix: Das die Funktionen außerhalb des Schedule liegen sollten habe ich gestern Abend noch rausgefunden, aber da waren die Finger dann irgendwann zu lahm zum tippen und kein Kaffee mehr in der Nähe :lol:

                Danke nochmals Euch beiden

                Gruß Steffen

                ioBroker auf Intel NUC 7CJYH / Debian 11 / States in Redis / Objects in JSONL / Repo --> Beta / HM CCU2 V2.61.7 / Siemens LOGO! (0BA7 / 0BA8)
                Admin V7.4.7 / Node V20.18.1 / NPM V10.8.2 / JSC V7.0.6 / JSE V8.8.3

                1 Reply Last reply
                0
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                Support us

                ioBroker
                Community Adapters
                Donate

                595

                Online

                32.4k

                Users

                81.3k

                Topics

                1.3m

                Posts
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                ioBroker Community 2014-2025
                logo
                • Login

                • Don't have an account? Register

                • Login or register to search.
                • First post
                  Last post
                0
                • Recent
                • Tags
                • Unread 0
                • Categories
                • Unreplied
                • Popular
                • GitHub
                • Docu
                • Hilfe