Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Frage zur Scriptprogrammierung

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.2k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

Frage zur Scriptprogrammierung

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
7 Beiträge 3 Kommentatoren 924 Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • SteffS Offline
    SteffS Offline
    Steff
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • SteffS Offline
        SteffS Offline
        Steff
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • SteffS Offline
          SteffS Offline
          Steff
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • P Offline
            P Offline
            pix
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              • SteffS Offline
                SteffS Offline
                Steff
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                0
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                757

                Online

                32.5k

                Benutzer

                81.7k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Anmelden

                • Du hast noch kein Konto? Registrieren

                • Anmelden oder registrieren, um zu suchen
                • Erster Beitrag
                  Letzter Beitrag
                0
                • Home
                • Aktuell
                • Tags
                • Ungelesen 0
                • Kategorien
                • Unreplied
                • Beliebt
                • GitHub
                • Docu
                • Hilfe