Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Mail mit mehr als 2 Anhängen?

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Mail mit mehr als 2 Anhängen?

    This topic has been deleted. Only users with topic management privileges can see it.
    • lost in translation
      lost in translation @AlCalzone last edited by

      @AlCalzone said in Mail mit mehr als 2 Anhängen?:

      const execAsync = util.promisify(exec); // exec ist schon geladen, soweit ich weiß

      scheitere gerade bereits an dieser Zeile:
      const execAsync = util.promisify(exec); // exec ist schon geladen, soweit ich weiß

      Ich vermute, es hängt damit zusammen, dass ich keinerlei Ahnung habe was node8+ ist und wie ich checken kann ob ich das habe und was ich tun muss, wenn ich das haben will.

      naja, mühsam...

      1 Reply Last reply Reply Quote 0
      • lost in translation
        lost in translation last edited by

        var von, an, betreff, text, bilder, Bildzaehler, wgetsleeptime, MailSender, EmailEmpfaenger, Bilderpfad, Name_Kamera1, Name_Kamera2, IP_Kamera1, IP_Kamera2, IP_NAS, UserName_NAS, NAS_Zielpfad, Name_Kamera, IP_Kamera, Bilderliste, datum, zeit, dateiname_1, dateimitpfad1, dateiname_2, dateimitpfad2, i;
        /**
         * Beschreibe diese Funktion …
         */
        function sendmail(von, an, betreff, text, bilder) {
            var attaches = [];
            
            for(var bild in bilder) {
                attaches.push({path: bilder[bild], cid: "image" + bild});
            }
            
            console.log(JSON.stringify(attaches));
            
            sendTo("email", {
                from:    von,
                to:      an,
                subject: betreff,
                html: text,
               attachments: attaches
            });
        }
        
        function listsRepeat(value, n) {
          var array = [];
          for (var i = 0; i < n; i++) {
            array[i] = value;
          }
          return array;
        }
        
        
        Bildzaehler = 0;
        wgetsleeptime = 0.3;
        MailSender = 'iobroker@meinedomain.de';
        EmailEmpfaenger = 'ich@meinedomain.de';
        Bilderpfad = '/opt/iobroker/kameras/';
        Name_Kamera1 = 'xx';
        Name_Kamera2 = 'yy';
        IP_Kamera1 = '192.168.xx.nn';
        IP_Kamera2 = '192.168.yy.nn';
        IP_NAS = '192.168.yy.nn';
        UserName_NAS = 'gandalf_der_zarte';
        NAS_Zielpfad = '/vol1/files/Bilder/Kameras/';
        Name_Kamera = Name_Kamera1;
        IP_Kamera = IP_Kamera1;
        Bilderliste = listsRepeat('/opt/iobroker/kameras/noimage.jpg', 1);
        datum = formatDate(new Date(), "JJJJ-MM-TT");
        // Ab hier Bilder holen
        zeit = formatDate(new Date(), "SS.mm.ss");
        dateiname_1 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'_',Bildzaehler,'.jpg'].join('');
        dateimitpfad1 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_1].join('');
        exec((['wget --output-document ',dateimitpfad1,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\''].join('')), function (error, result, stderr) {
            Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad1);
          Name_Kamera = Name_Kamera2;
          IP_Kamera = IP_Kamera2;
          Bildzaehler = (typeof Bildzaehler == 'number' ? Bildzaehler : 0) + 1;
          zeit = formatDate(new Date(), "SS.mm.ss");
          dateiname_2 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'_',Bildzaehler,'.jpg'].join('');
          dateimitpfad2 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_2].join('');
          exec((['wget --output-document ',dateimitpfad2,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\'','  &&sleep ' + String(wgetsleeptime)].join('')), function (error, result, stderr) {
              Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad2);
            Name_Kamera = Name_Kamera1;
            IP_Kamera = IP_Kamera1;
            Bildzaehler = (typeof Bildzaehler == 'number' ? Bildzaehler : 0) + 1;
        // hier Bilder geholt    
        Bilderliste.pop();
        sendmail(MailSender, EmailEmpfaenger, 'Testbetreff', 'TestBilder', Bilderliste);
        for (var i_index in Bilderliste) {
            i = Bilderliste[i_index];
            exec(([['sleep ',10 + Math.random() * 5,' && scp '].join(''),i,[' ',UserName_NAS,'@',IP_NAS,':',NAS_Zielpfad,'Haustuer/'].join(''),datum,'/ && rm ' + String(i)].join('')));
            console.log("exec: " + ([['sleep ',10 + Math.random() * 5,' && scp '].join(''),i,[' ',UserName_NAS,'@',IP_NAS,':',NAS_Zielpfad,'Haustuer/'].join(''),datum,'/ && rm ' + String(i)].join('')));
            };
          })})
                                                                                    
        
        

        Hab ich jetzt mal aus der Javascript Ansicht meines Blockly kopiert und es schickt eine Mail mit 2 Attachements. Jetzt müsste ich ja eigentlich "nur noch" diese Abhängigkeit auflösen und stattdessen mit dem await hantieren.

        Es ist fast zu einfach...

        Frank

        1 Reply Last reply Reply Quote 0
        • lost in translation
          lost in translation last edited by

          Meinst Du mit Node 8+ das hier:

          /opt/iobroker$ node --version

          v8.16.0

          ?

          ciao
          frank

          AlCalzone 1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer @lost in translation last edited by

            @lost-in-translation sagte in Mail mit mehr als 2 Anhängen?:

            Meinst Du mit Node 8+ das hier:

            ja!

            Ich bin mir gerade nicht sicher, wo du hängst. Am besten mal ein Minimalbeispiel posten (ohne überflüssigen Schnickschnack).

            lost in translation 1 Reply Last reply Reply Quote 0
            • lost in translation
              lost in translation @AlCalzone last edited by

              @AlCalzone

              // Du brauchst eine async-Funktion, die kannst du aber normal aufrufen
              async function wgetsfeuern() {
               // wichtig: let für block-scoped Variablen, sonst hast du den Ärger, 
               // dass nur das letzte Bild hochgeladen wird
               for (let i = 0; i < 20; i++) {
                 zeit = formatDate(new Date(), "SS.mm.ss");
                 dateiname_1 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'__',i,'.jpg'].join('');
                 dateimitpfad1 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_1].join('');
                 Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad1);
                 // await hält die Funktion an, bis execAsync wirklich fertig ist
                 await execAsync(['wget --output-document ',dateimitpfad1,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\'', '  &&sleep ' + String(wgetsleeptime)].join(''));
               }
               // Code hier wird nach allen exec-Befehlen ausgeführt.
              }
              
              
              

              Das läuft soweit, dass alle Dateien auf dem Raspi rumliegen, aber aus mir nicht erkennbaren Gründen wird die List nicht entsprechend erweitert und es wird dadurch weder gemailt, noch kopiert.

              Das mit dem alles gleichzeitig losfeuern ist total lästig, wenn man sequentiell denkt. Und Schleifen sind für mich sequentiell.

              ciao

              frank

              AlCalzone 1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @lost in translation last edited by

                @lost-in-translation
                Du hast eine komische Art, Strings zu verbinden. Erinnert mich irgendwie an Matlab.
                Und das +1 - 1 versteh ich auch nicht. Ist es wichtig, wo die Bilder in der Liste eingefügt werden? Am Ende täte es auch ein .push(...)

                Um ganz sicher zu gehen: Du rufst die Funktion auch auf, oder? Und wo verarbeitest du die Bilderliste? Nach dem Kommentar in Zeile 13 oder komplett außerhalb der Funktion? Letzeres wird auch mehr oder weniger sofort ausgeführt, ohne auf die wgets zu warten.

                lost in translation 1 Reply Last reply Reply Quote 0
                • lost in translation
                  lost in translation @AlCalzone last edited by

                  @AlCalzone

                  genau genommen habe ich die Strings nicht so verbunden. Ich habe in Blockly die Javascript Ansicht eingeschaltet und dann copy-paste gemacht. Daher auch die interessante Art die Liste zu erweitern.

                  ciao
                  frank

                  AlCalzone 1 Reply Last reply Reply Quote 0
                  • AlCalzone
                    AlCalzone Developer @lost in translation last edited by

                    @lost-in-translation Ok das erklärts. Wie siehts aus mit den Fragen im zweiten Absatz meines Posts? 😉

                    lost in translation 1 Reply Last reply Reply Quote 0
                    • lost in translation
                      lost in translation @AlCalzone last edited by

                      @AlCalzone said in Mail mit mehr als 2 Anhängen?:

                      @lost-in-translation Ok das erklärts. Wie siehts aus mit den Fragen im zweiten Absatz meines Posts? 😉

                      🙂 aufgerufen habe ich die Funktion. Die wgets werden offenbar auch ausgeführt, sonst hätte ich die Dateien nicht im Filesystem liegen. Den Rest muss ich nachgucken, wenn ich wieder Zugriff auf den Raspi habe 🙂

                      ciao

                      frank

                      1 Reply Last reply Reply Quote 0
                      • lost in translation
                        lost in translation last edited by

                        Hat eigentlich schonmal jemand die persönlichen Daten in ein conf-File ausgelagert? Dann könnte man ein Skript viel einfacher sharen ohne mit dem Zensurstempel drüber zu rasen.

                        Vielleicht gehe ich aber auch grundsätzlich falsch an die Sache ran.
                        Was ich will:
                        von 2 Kameras jeweils 20 Bilder in 30 Sekunden holen.
                        Am liebsten wäre es mir, wenn ich nach dem holen des Bildes so lange warten könnte bis 1,5 Sekunden vergangen sind. Also Bild Kamera 1 holen dauert 0,2 Sekunden -> 1,3 Sekunden Warten -> nächstes Bild (dauert 0,8 Sekunden -> 0,7 Sekunden warten -> nächstes Bild (dauert 2,7 Sekunden) -> 0Sekunden warten - >nächstes Bild ...
                        vor jedem Bild will ich einen Dateinamen mit aktuellem Zeitstempel darin erzeugen.
                        Das die Bilder von Kamera 1 und Kamera 2 parallel geholt werden, wäre für mich Ok. Oder auch jeweils hintereinander (hole Bild Kam1 (0,2s), hole Bild Kam 2 (0,2s), warte 1,1s, hole Bild2 Kam1 ...

                        Also im Prinzip will ich pacen. Wenn das mit Blockly auch anders erreicht werden kann, dann wäre ich über Hinweise dankbar.
                        In Blockly ging es bisher so, dass ich den folgenden wget in die Ergebnisbehandlung des vorherigen gepastet habe und an den einzelnen wget noch einen sleep befehl angehängt habe. Der ist allerdings starr und würde sich nicht reduzieren, wenn der Download von der Kamera mal länger braucht.

                        Vielleicht denke ich auch komplett falsch und sollte jeweils 20 timer setzen, die Bilder zu holen und einen weiteren, sie danach zu verschicken?

                        so weit mal meine Gedanken dazu, wo ich gerade den iobroker nicht zur Hand habe.

                        AlCalzone 1 Reply Last reply Reply Quote 0
                        • AlCalzone
                          AlCalzone Developer @lost in translation last edited by

                          @lost-in-translation

                          Am liebsten wäre es mir, wenn ich nach dem holen des Bildes so lange warten könnte bis 1,5 Sekunden vergangen sind

                          z.B. so:

                          // ...
                          const wgetInterval = 1500; // ms
                          
                          function wait(ms) {
                              return new Promise((resolve) => {
                                  setTimeout(resolve, ms);
                              });
                          }
                          
                          for (let i = 0; i < 20; i++) {
                              const startTime = Date.now();
                              await execAsync("Befehl...");
                              // Dauer des Befehls in ms ermitteln
                              const duration = Date.now() - startTime;
                              // Wenn der Befehl zu schnell war, bis zur Mindestzeit warten
                              if (duration < wgetInterval) await wait(wgetInterval - duration);
                          }
                          
                          // ...
                          
                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          405
                          Online

                          31.9k
                          Users

                          80.3k
                          Topics

                          1.3m
                          Posts

                          blockly communication
                          4
                          37
                          1631
                          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