Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Frage zur Scriptprogrammierung

    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

    Frage zur Scriptprogrammierung

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

      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

      1 Reply Last reply Reply Quote 0
      • AlCalzone
        AlCalzone Developer last edited by

        @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) {
        
        1 Reply Last reply Reply Quote 0
        • Steff
          Steff last edited by

          Hallo AlCalzone,

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

          Gruß Steffen

          1 Reply Last reply Reply Quote 0
          • Steff
            Steff last edited by

            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

            1 Reply Last reply Reply Quote 0
            • P
              pix last edited by

              @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

              1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer last edited by

                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.

                1 Reply Last reply Reply Quote 0
                • Steff
                  Steff last edited by

                  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

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  671
                  Online

                  31.7k
                  Users

                  79.8k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  820
                  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