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. JavaScript
  5. Ordner auf neue Dateien überwachen

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    11
    2
    199

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

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

Ordner auf neue Dateien überwachen

Ordner auf neue Dateien überwachen

Scheduled Pinned Locked Moved JavaScript
37 Posts 8 Posters 5.4k Views 7 Watching
  • 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.
  • T Offline
    T Offline
    tomily
    wrote on last edited by
    #1

    Hallo zusammen,

    hat jemand eine Idee, wie ich folgendes realisieren kann?

    Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
    In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

    Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

    Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

    Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

    Grüße

    R mickymM OliverIOO 3 Replies Last reply
    0
    • T tomily

      Hallo zusammen,

      hat jemand eine Idee, wie ich folgendes realisieren kann?

      Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
      In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

      Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

      Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

      Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

      Grüße

      R Offline
      R Offline
      RandyAndy
      wrote on last edited by
      #2

      @tomily

      wie wäre es umgekehrt heranzugehen und Dataien älter als heutiges Datum -x Tage automatisch zu löschen.
      Da könnte ich helfen

      Andreas

      T 1 Reply Last reply
      0
      • R RandyAndy

        @tomily

        wie wäre es umgekehrt heranzugehen und Dataien älter als heutiges Datum -x Tage automatisch zu löschen.
        Da könnte ich helfen

        Andreas

        T Offline
        T Offline
        tomily
        wrote on last edited by
        #3

        @randyandy
        Hi,
        das ist mit nem Einzeiler per Batchdatei möglich, ist aber in dem Fall nicht gesucht 🙂

        Ich will tatsächlich nichts bereinigen, sondern erkennen, wenn keine neuen Updates mehr dazu kommen.

        Esseiden es wäre mit deiner Variante möglich die Neueste Datei statt der ältesten erkennen?

        Dann könnte man von der neusten Datei das Erstelldatum ermitteln und anschließend weiterverarbeiten?

        LG

        1 Reply Last reply
        0
        • E Offline
          E Offline
          ente34
          wrote on last edited by
          #4

          @tomily

          Ungefähr so
          Du benötigst aber den neuesten javascript-Adapter 4.11.0

          const fs = require('fs');
          const util = require('util');
          const readdir = util.promisify(fs.readdir);
          const stat = util.promisify(fs.stat);
          const lstat = util.promisify(fs.lstat);
          
          async function checkDir(dir) {
              let files = [];
              try {
                  files = await readdir(dir);
                 
                  let newestFileAge = 0;
                  let newestFile = '';
          
                  for (let file of files) {
                      let fullpath = dir + '/' + file;
                      const s = await lstat(fullpath);
                      if (s.isFile()) {
                          const stats = await stat(fullpath);
                          if (stats.mtimeMs > newestFileAge) {
                              newestFileAge = stats.mtimeMs;
                              newestFile = file;
                          }
                      }
                  }
          
                  let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                  console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
              } catch (e) {
                  console.log(e);
              }
          }
          
          checkDir('c:/temp');
          
          
          R T A 3 Replies Last reply
          0
          • E ente34

            @tomily

            Ungefähr so
            Du benötigst aber den neuesten javascript-Adapter 4.11.0

            const fs = require('fs');
            const util = require('util');
            const readdir = util.promisify(fs.readdir);
            const stat = util.promisify(fs.stat);
            const lstat = util.promisify(fs.lstat);
            
            async function checkDir(dir) {
                let files = [];
                try {
                    files = await readdir(dir);
                   
                    let newestFileAge = 0;
                    let newestFile = '';
            
                    for (let file of files) {
                        let fullpath = dir + '/' + file;
                        const s = await lstat(fullpath);
                        if (s.isFile()) {
                            const stats = await stat(fullpath);
                            if (stats.mtimeMs > newestFileAge) {
                                newestFileAge = stats.mtimeMs;
                                newestFile = file;
                            }
                        }
                    }
            
                    let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                    console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                } catch (e) {
                    console.log(e);
                }
            }
            
            checkDir('c:/temp');
            
            
            R Offline
            R Offline
            RandyAndy
            wrote on last edited by
            #5

            @ente34

            Cool, das hatte ich vor ein paar Jahren mal probiert aber nicht hinbekommen.
            ICh möchte es eigentlich nicht so sehr zum Löschen oder was auch immer verwenden sondern um zu erkennen ob es eine neue Datei von der Kamera gibt. Dann kann ich diese gezielt anzeigen wenn sich etwas getan hat.

            Das probiere ich mal aus.

            Andreas

            1 Reply Last reply
            0
            • E ente34

              @tomily

              Ungefähr so
              Du benötigst aber den neuesten javascript-Adapter 4.11.0

              const fs = require('fs');
              const util = require('util');
              const readdir = util.promisify(fs.readdir);
              const stat = util.promisify(fs.stat);
              const lstat = util.promisify(fs.lstat);
              
              async function checkDir(dir) {
                  let files = [];
                  try {
                      files = await readdir(dir);
                     
                      let newestFileAge = 0;
                      let newestFile = '';
              
                      for (let file of files) {
                          let fullpath = dir + '/' + file;
                          const s = await lstat(fullpath);
                          if (s.isFile()) {
                              const stats = await stat(fullpath);
                              if (stats.mtimeMs > newestFileAge) {
                                  newestFileAge = stats.mtimeMs;
                                  newestFile = file;
                              }
                          }
                      }
              
                      let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                      console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                  } catch (e) {
                      console.log(e);
                  }
              }
              
              checkDir('c:/temp');
              
              
              T Offline
              T Offline
              tomily
              wrote on last edited by
              #6

              @ente34
              Merci. Ich möchte es ähnlich machen wie Andreas. Überprüfen, ob neue Dateien nachkommen. Wenn nicht, dann soll etwas passieren.

              Eine Rückfrage habe ich noch....:

              Du gibst in deinem Script an checkDir(c:\temp);
              "

              Ich führe das Script auf meinem ioBroker unter Linux aus. Im generellen möchte ich ein Netzlaufwerk überprüfen.
              Wie habe ich die Möglichkeit dort ein Netzlaufwerk anzugeben?

              checkDir(\IP\Share\Ordner1);??

              E 1 Reply Last reply
              0
              • T tomily

                @ente34
                Merci. Ich möchte es ähnlich machen wie Andreas. Überprüfen, ob neue Dateien nachkommen. Wenn nicht, dann soll etwas passieren.

                Eine Rückfrage habe ich noch....:

                Du gibst in deinem Script an checkDir(c:\temp);
                "

                Ich führe das Script auf meinem ioBroker unter Linux aus. Im generellen möchte ich ein Netzlaufwerk überprüfen.
                Wie habe ich die Möglichkeit dort ein Netzlaufwerk anzugeben?

                checkDir(\IP\Share\Ordner1);??

                E Offline
                E Offline
                ente34
                wrote on last edited by ente34
                #7

                @tomily
                Unter linux musst Du die NAS mounten.

                cd  /home/pi
                mkdir mnt
                sudo mount -t cifs -o username=...,password=...,vers=3.0 //nas02/backup /home/pi/mount
                

                User und Password auf der NAS anlegen
                /backup ist ein Freigabe Ordner auf der NAS

                T 1 Reply Last reply
                0
                • E ente34

                  @tomily
                  Unter linux musst Du die NAS mounten.

                  cd  /home/pi
                  mkdir mnt
                  sudo mount -t cifs -o username=...,password=...,vers=3.0 //nas02/backup /home/pi/mount
                  

                  User und Password auf der NAS anlegen
                  /backup ist ein Freigabe Ordner auf der NAS

                  T Offline
                  T Offline
                  tomily
                  wrote on last edited by
                  #8

                  @ente34
                  Geil, danke! Ich habs zum testen mal mit nem Lokalen Ordner auf dem Server ausgeführt. Den Mount, kann ich dann später noch machen.
                  Die Ausgabe scheint korrekt zu sein. Jedenfalls wird korrekt erkannt, welches die neuste Datei ist.

                  Natürlich die doofe und Freche frage. Wie kann ich da jetzt weiterverarbeiten. Am besten mit einer Variable in "Anzahl Tagen" um zu prüfen, ob die Datei älter ist oder nicht.

                  Ziel:
                  Wenn die neueste Datei älter ist, als 3 Tage, dann soll eine Email ausgelöst werden.

                  8370141f-9e07-4ef2-9225-2bab45f8e7cd-grafik.png

                  E 1 Reply Last reply
                  0
                  • T tomily

                    @ente34
                    Geil, danke! Ich habs zum testen mal mit nem Lokalen Ordner auf dem Server ausgeführt. Den Mount, kann ich dann später noch machen.
                    Die Ausgabe scheint korrekt zu sein. Jedenfalls wird korrekt erkannt, welches die neuste Datei ist.

                    Natürlich die doofe und Freche frage. Wie kann ich da jetzt weiterverarbeiten. Am besten mit einer Variable in "Anzahl Tagen" um zu prüfen, ob die Datei älter ist oder nicht.

                    Ziel:
                    Wenn die neueste Datei älter ist, als 3 Tage, dann soll eine Email ausgelöst werden.

                    8370141f-9e07-4ef2-9225-2bab45f8e7cd-grafik.png

                    E Offline
                    E Offline
                    ente34
                    wrote on last edited by
                    #9

                    @tomily
                    Etwa so:

                    if ( seconds > 3*86400 ) {
                    sendTo("email.0", "send", {
                       text: 'Body',
                       to: 'test@gmx.de',
                       subject: 'Betreff'
                    });
                    
                    }
                    
                    T 1 Reply Last reply
                    0
                    • E ente34

                      @tomily
                      Etwa so:

                      if ( seconds > 3*86400 ) {
                      sendTo("email.0", "send", {
                         text: 'Body',
                         to: 'test@gmx.de',
                         subject: 'Betreff'
                      });
                      
                      }
                      
                      T Offline
                      T Offline
                      tomily
                      wrote on last edited by
                      #10

                      @ente34
                      Guten Morgen,

                      herzlichen Dank. Wirkt beides plausibel. Sehr geil das hilft mir extrem.
                      Könntest du mir noch verraten, wo ich die Email-Scriptszeilen einfügen soll? Innerhalb des Scriptes oben, oder in einem separaten Aufruf?

                      So ist es offensichtlich falsch 😄 (Habe die Emailadresse absichtlich noch nicht ausgefüllt)

                      const fs = require('fs');
                      const util = require('util');
                      const readdir = util.promisify(fs.readdir);
                      const stat = util.promisify(fs.stat);
                      const lstat = util.promisify(fs.lstat);
                      
                      async function checkDir(dir) {
                          let files = [];
                          try {
                              files = await readdir(dir);
                             
                              let newestFileAge = 0;
                              let newestFile = '';
                       
                              for (let file of files) {
                                  let fullpath = dir + '/' + file;
                                  const s = await lstat(fullpath);
                                  if (s.isFile()) {
                                      const stats = await stat(fullpath);
                                      if (stats.mtimeMs > newestFileAge) {
                                          newestFileAge = stats.mtimeMs;
                                          newestFile = file;
                                      }
                                  }
                              }
                       
                              let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                              console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                          } catch (e) {
                              console.log(e);
                          }
                      }
                      //################################
                      if ( seconds > 3*86400 ) {
                      sendTo("email.0", "send", {
                         text: 'Body',
                         to: 'test@gmx.de',
                         subject: 'Betreff'
                      });
                      
                      }
                      //################################
                      
                      checkDir('/etc/test1');
                      
                      E 1 Reply Last reply
                      0
                      • T tomily

                        @ente34
                        Guten Morgen,

                        herzlichen Dank. Wirkt beides plausibel. Sehr geil das hilft mir extrem.
                        Könntest du mir noch verraten, wo ich die Email-Scriptszeilen einfügen soll? Innerhalb des Scriptes oben, oder in einem separaten Aufruf?

                        So ist es offensichtlich falsch 😄 (Habe die Emailadresse absichtlich noch nicht ausgefüllt)

                        const fs = require('fs');
                        const util = require('util');
                        const readdir = util.promisify(fs.readdir);
                        const stat = util.promisify(fs.stat);
                        const lstat = util.promisify(fs.lstat);
                        
                        async function checkDir(dir) {
                            let files = [];
                            try {
                                files = await readdir(dir);
                               
                                let newestFileAge = 0;
                                let newestFile = '';
                         
                                for (let file of files) {
                                    let fullpath = dir + '/' + file;
                                    const s = await lstat(fullpath);
                                    if (s.isFile()) {
                                        const stats = await stat(fullpath);
                                        if (stats.mtimeMs > newestFileAge) {
                                            newestFileAge = stats.mtimeMs;
                                            newestFile = file;
                                        }
                                    }
                                }
                         
                                let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                            } catch (e) {
                                console.log(e);
                            }
                        }
                        //################################
                        if ( seconds > 3*86400 ) {
                        sendTo("email.0", "send", {
                           text: 'Body',
                           to: 'test@gmx.de',
                           subject: 'Betreff'
                        });
                        
                        }
                        //################################
                        
                        checkDir('/etc/test1');
                        
                        E Offline
                        E Offline
                        ente34
                        wrote on last edited by
                        #11

                        @tomily
                        Zeile 28, wenn "seconds" zugewiesen sind

                        T 1 Reply Last reply
                        0
                        • E ente34

                          @tomily
                          Zeile 28, wenn "seconds" zugewiesen sind

                          T Offline
                          T Offline
                          tomily
                          wrote on last edited by
                          #12

                          @ente34 Vielen Dank und sorry für die späte Rückmeldung.
                          Ich hatte ganz vergessen das positive Eregebnis hier zu posten 😞

                          Es hat geklappt und ich bekomme jetzt eine Email, wenn die Datei zu alt ist. HERVORRAGEND.

                          Nun muss ich nur dafür sorgen, dass vor dem ausführen die Laufwerke verbunden werden.
                          Eine Frage hätte ich noch. Kann ich einen Trigger direkt in das Script einbauen? z.B. dass das Script immer zu einer bestimmten Tageszeit läuft?

                          T 1 Reply Last reply
                          0
                          • T tomily

                            @ente34 Vielen Dank und sorry für die späte Rückmeldung.
                            Ich hatte ganz vergessen das positive Eregebnis hier zu posten 😞

                            Es hat geklappt und ich bekomme jetzt eine Email, wenn die Datei zu alt ist. HERVORRAGEND.

                            Nun muss ich nur dafür sorgen, dass vor dem ausführen die Laufwerke verbunden werden.
                            Eine Frage hätte ich noch. Kann ich einen Trigger direkt in das Script einbauen? z.B. dass das Script immer zu einer bestimmten Tageszeit läuft?

                            T Offline
                            T Offline
                            tomily
                            wrote on last edited by
                            #13

                            @tomily
                            Noch ein kleiner Nachtrag bzw. erneute Frage 🙂

                            Ich könnte natürlich im Filesystem der Linuxmaschine, auf der der ioBroker läuft die zu überwachenden Laufwerke mounten.
                            Würde diese aber ganz gerne vor dem Prüfen aus dem SCript heraus verbinden und anschließend wieder trennen.

                            Kann ich den "Mountbefehl" aus dem JavaScript heraus ausführen?

                            E 1 Reply Last reply
                            0
                            • T tomily

                              @tomily
                              Noch ein kleiner Nachtrag bzw. erneute Frage 🙂

                              Ich könnte natürlich im Filesystem der Linuxmaschine, auf der der ioBroker läuft die zu überwachenden Laufwerke mounten.
                              Würde diese aber ganz gerne vor dem Prüfen aus dem SCript heraus verbinden und anschließend wieder trennen.

                              Kann ich den "Mountbefehl" aus dem JavaScript heraus ausführen?

                              E Offline
                              E Offline
                              ente34
                              wrote on last edited by
                              #14

                              @tomily
                              Basteln wir mal alles zusammen.

                              const fs = require('fs');
                              const util = require('util');
                              const readdir = util.promisify(fs.readdir);
                              const stat = util.promisify(fs.stat);
                              const lstat = util.promisify(fs.lstat);
                              
                              const mountDir = '/home/pi/mount';
                              const nasDir = '//nas02/backup'
                              const mountCmd = `sudo mount -t cifs -o username=...,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                              const umountCmd = `sudo umount ${nasDir}`;
                              
                              const warnSeconds = 5 * 86400;
                              
                              async function checkDir(dir) {
                                  let rc = false;
                                  try {
                                      let files = [];
                                      files = await readdir(dir);
                              
                                      let newestFileAge = 0;
                                      let newestFile = '';
                              
                                      for (let file of files) {
                                          let fullpath = dir + '/' + file;
                                          const s = await lstat(fullpath);
                                          if (s.isFile()) {
                                              const stats = await stat(fullpath);
                                              if (stats.mtimeMs > newestFileAge) {
                                                  newestFileAge = stats.mtimeMs;
                                                  newestFile = file;
                                              }
                                          }
                                      }
                              
                                      let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                      rc = seconds > warnSeconds;
                                      console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                                  } catch (e) {
                                      console.log(e);
                                  } finally {
                                      return rc;
                                  }
                              }
                              
                              /**
                               * Executes a shell command and return it as a Promise.
                               * @param cmd {string}
                               * @return {Promise<string>}
                               */
                              function execShellCommand(cmd) {
                                  const exec = require('child_process').exec;
                                  return new Promise((resolve, reject) => {
                                      exec(cmd, (error, stdout, stderr) => {
                                          if (error) {
                                              console.warn(error);
                                          }
                                          resolve(stdout ? stdout : stderr);
                                      });
                                  });
                              }
                              
                              async function checkBackup() {
                                  try {
                                      //hier mount-Kommando
                                      await execShellCommand(mountCmd);
                              
                                      let result = await checkDir(mountDir);
                                      if (result) {
                                          // Mail abschicken
                                          console.log('Send Mail');
                                      }
                              
                                      //hier umount-Kommando
                                      await execShellCommand(umountCmd);
                                  } catch (e) {
                                      console.warn(e);
                                  }
                              }
                              
                              // 22:30
                              schedule('30 22 * * *', () => {
                                  checkBackup();
                              });
                              
                              

                              Im Javascript-Adapter "exec" erlauben!

                              js4.PNG

                              T 1 Reply Last reply
                              0
                              • T tomily

                                Hallo zusammen,

                                hat jemand eine Idee, wie ich folgendes realisieren kann?

                                Ich möchte diverse Unterordner meiner NAS auf neue Dateien überprüfen.
                                In den Ordnern liegen unterschiedlich viele Dateien und unterschiedliche Dateitypen.

                                Ziel ist es, eine Email auszulösen, wenn die neueste Datei im Verzeichnis älter ist, als X-Tage.

                                Damit möchte ich erreichen, dass mir zukünftig auffällt, wenn Datensicherungen nicht mehr erstellt werden.

                                Hat jemand eine Idee oder zufällig schon ein fertiges Skript für diesen Monitoring-Zweck?

                                Grüße

                                mickymM Offline
                                mickymM Offline
                                mickym
                                Most Active
                                wrote on last edited by
                                #15

                                @tomily Warum nutzt Du nicht die Watch-Node?

                                Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                T 1 Reply Last reply
                                0
                                • E ente34

                                  @tomily
                                  Basteln wir mal alles zusammen.

                                  const fs = require('fs');
                                  const util = require('util');
                                  const readdir = util.promisify(fs.readdir);
                                  const stat = util.promisify(fs.stat);
                                  const lstat = util.promisify(fs.lstat);
                                  
                                  const mountDir = '/home/pi/mount';
                                  const nasDir = '//nas02/backup'
                                  const mountCmd = `sudo mount -t cifs -o username=...,password=...,vers=3.0 ${nasDir} ${mountDir}`;
                                  const umountCmd = `sudo umount ${nasDir}`;
                                  
                                  const warnSeconds = 5 * 86400;
                                  
                                  async function checkDir(dir) {
                                      let rc = false;
                                      try {
                                          let files = [];
                                          files = await readdir(dir);
                                  
                                          let newestFileAge = 0;
                                          let newestFile = '';
                                  
                                          for (let file of files) {
                                              let fullpath = dir + '/' + file;
                                              const s = await lstat(fullpath);
                                              if (s.isFile()) {
                                                  const stats = await stat(fullpath);
                                                  if (stats.mtimeMs > newestFileAge) {
                                                      newestFileAge = stats.mtimeMs;
                                                      newestFile = file;
                                                  }
                                              }
                                          }
                                  
                                          let seconds = (new Date().getTime() - new Date(newestFileAge).getTime()) / 1000;
                                          rc = seconds > warnSeconds;
                                          console.log(`newest file "${newestFile}" created before ${seconds} seconds`);
                                      } catch (e) {
                                          console.log(e);
                                      } finally {
                                          return rc;
                                      }
                                  }
                                  
                                  /**
                                   * Executes a shell command and return it as a Promise.
                                   * @param cmd {string}
                                   * @return {Promise<string>}
                                   */
                                  function execShellCommand(cmd) {
                                      const exec = require('child_process').exec;
                                      return new Promise((resolve, reject) => {
                                          exec(cmd, (error, stdout, stderr) => {
                                              if (error) {
                                                  console.warn(error);
                                              }
                                              resolve(stdout ? stdout : stderr);
                                          });
                                      });
                                  }
                                  
                                  async function checkBackup() {
                                      try {
                                          //hier mount-Kommando
                                          await execShellCommand(mountCmd);
                                  
                                          let result = await checkDir(mountDir);
                                          if (result) {
                                              // Mail abschicken
                                              console.log('Send Mail');
                                          }
                                  
                                          //hier umount-Kommando
                                          await execShellCommand(umountCmd);
                                      } catch (e) {
                                          console.warn(e);
                                      }
                                  }
                                  
                                  // 22:30
                                  schedule('30 22 * * *', () => {
                                      checkBackup();
                                  });
                                  
                                  

                                  Im Javascript-Adapter "exec" erlauben!

                                  js4.PNG

                                  T Offline
                                  T Offline
                                  tomily
                                  wrote on last edited by
                                  #16

                                  @ente34
                                  Geil, das sieht gut aus. Ich teste es gleich heute Abend! DANKE!

                                  1 Reply Last reply
                                  0
                                  • mickymM mickym

                                    @tomily Warum nutzt Du nicht die Watch-Node?

                                    T Offline
                                    T Offline
                                    tomily
                                    wrote on last edited by
                                    #17

                                    @mickym
                                    Hmmmm, weil ich nicht weiß wie ich es damit lösen könnte? 🙂 Ginge das denn?

                                    In diesem Fall habe ich NodeRed gar nicht im Spiel. Wäre aber auch denkbar.

                                    mickymM 1 Reply Last reply
                                    0
                                    • T tomily

                                      @mickym
                                      Hmmmm, weil ich nicht weiß wie ich es damit lösen könnte? 🙂 Ginge das denn?

                                      In diesem Fall habe ich NodeRed gar nicht im Spiel. Wäre aber auch denkbar.

                                      mickymM Offline
                                      mickymM Offline
                                      mickym
                                      Most Active
                                      wrote on last edited by mickym
                                      #18

                                      @tomily Nun ich hätte mich hier nie 😉 eingemischt, aber nachdem ich ja weiß, dass Du bislang alles mit NodeRed gemacht hast, war ich etwas verwundert und vielleicht denkst Du ja auch über einen Systemwechsel nach.

                                      Außerdem hat hier @ente34 Dir schon viel geholfen und Arbeit reingesteckt und das gebietet schon der Respekt, dass ich mich da nicht einmische.

                                      Als ich dann gestern diesen Thread hier entdeckt habe, habe ich mir Deine Anfordeung mal als Herausforderung gestellt und mal einen kleinen Flow gebastelt - wobei ich nicht im Detail weiß, ob das Deinen Bedürfnissen entspricht.

                                      Hier mal nur der Flow mit ein paar Erklärungen:

                                      02d3eee9-e951-40ab-b35c-ab57d4e015f2-image.png

                                      Ich habe der Einfachheit einfach mal angenommen, dass nur ein Backup in ein Verzeichnis schreibt und deshalb nur dieser Task etwas an dem Verzeichnis ändert. Ich habe deshalb mal als Beispiel das iobroker backup genommen.

                                      1. Mit der Watch-Node beobachte ich also das "/opt/iobroker/backups" Verzeichnis - welche Änderungen sind mir wurscht - weil ich davon ausgehe, dass das nur der backitup-Adapter ist, der da was verändert.
                                      2. Findet eine Aktivität statt läuft z. Bsp der obere Ast los und schreibt einen Eintrag über ein erfolgreiches Backup in die Logdatei .
                                      3. Gleichzeitig wird der Trigger im unteren Ast getriggert, der solange nichts verschickt, solange 25 Stunden keine neue Nachricht (also Aktivität) stattfindet.
                                      4. Findet keine Aktivität statt schreibt er eine negativen Logeintrag und schickt Dir eine Mail

                                      Die Logdatei in der diese Aktivität überwacht wird schaut dann einfach so aus:

                                      7875dc65-4da8-4646-9376-d88edf00bac3-image.png

                                      und die Mail im Fehlerfall würde dann so aussehen:

                                      screen.png

                                      und dann kannst Du ja wieder mit Deinem anderen Projekt mehrere Logdateien zu überwachen ggf. fortfahren. 😉 😉 😉

                                      [
                                         {
                                             "id": "9b7a57bd.8ee618",
                                             "type": "watch",
                                             "z": "6e170384.60c96c",
                                             "name": "",
                                             "files": "/opt/iobroker/backups",
                                             "recursive": "",
                                             "x": 2560,
                                             "y": 3460,
                                             "wires": [
                                                 [
                                                     "94badf85.3ebad",
                                                     "eab4a1ca.fda7c"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "94badf85.3ebad",
                                             "type": "change",
                                             "z": "6e170384.60c96c",
                                             "name": "true",
                                             "rules": [
                                                 {
                                                     "t": "set",
                                                     "p": "payload",
                                                     "pt": "msg",
                                                     "to": "true",
                                                     "tot": "bool"
                                                 }
                                             ],
                                             "action": "",
                                             "property": "",
                                             "from": "",
                                             "to": "",
                                             "reg": false,
                                             "x": 2770,
                                             "y": 3440,
                                             "wires": [
                                                 [
                                                     "5048baed.cf7704"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "eab4a1ca.fda7c",
                                             "type": "trigger",
                                             "z": "6e170384.60c96c",
                                             "name": "",
                                             "op1": "",
                                             "op2": "false",
                                             "op1type": "nul",
                                             "op2type": "bool",
                                             "duration": "25",
                                             "extend": true,
                                             "overrideDelay": false,
                                             "units": "hr",
                                             "reset": "",
                                             "bytopic": "all",
                                             "topic": "topic",
                                             "outputs": 1,
                                             "x": 2800,
                                             "y": 3500,
                                             "wires": [
                                                 [
                                                     "db949d4b.5a23d",
                                                     "3556f13.927030e"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "db949d4b.5a23d",
                                             "type": "change",
                                             "z": "6e170384.60c96c",
                                             "name": "Log-Eintrag",
                                             "rules": [
                                                 {
                                                     "t": "change",
                                                     "p": "payload",
                                                     "pt": "msg",
                                                     "from": "true",
                                                     "fromt": "bool",
                                                     "to": "Backup gestartet ...",
                                                     "tot": "str"
                                                 },
                                                 {
                                                     "t": "change",
                                                     "p": "payload",
                                                     "pt": "msg",
                                                     "from": "false",
                                                     "fromt": "bool",
                                                     "to": "fehlendes Backup",
                                                     "tot": "str"
                                                 },
                                                 {
                                                     "t": "set",
                                                     "p": "payload",
                                                     "pt": "msg",
                                                     "to": "'iobroker.backup\\t' & $moment($now()).locale(\"de\").tz('Europe/Berlin').format('YYYY-MM-DD HH:mm:ss.SSS') & '\\t' & payload\t",
                                                     "tot": "jsonata"
                                                 }
                                             ],
                                             "action": "",
                                             "property": "",
                                             "from": "",
                                             "to": "",
                                             "reg": false,
                                             "x": 3170,
                                             "y": 3440,
                                             "wires": [
                                                 [
                                                     "14218c4a.ef2f44"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "14218c4a.ef2f44",
                                             "type": "file",
                                             "z": "6e170384.60c96c",
                                             "name": "",
                                             "filename": "/home/iobroker/iobroker_backups.log",
                                             "appendNewline": true,
                                             "createDir": false,
                                             "overwriteFile": "false",
                                             "encoding": "none",
                                             "x": 3450,
                                             "y": 3440,
                                             "wires": [
                                                 []
                                             ]
                                         },
                                         {
                                             "id": "9e3e44a3.7826a8",
                                             "type": "e-mail",
                                             "z": "6e170384.60c96c",
                                             "server": "",
                                             "port": "465",
                                             "secure": true,
                                             "tls": true,
                                             "name": "",
                                             "dname": "verschicke Mail",
                                             "x": 3380,
                                             "y": 3500,
                                             "wires": []
                                         },
                                         {
                                             "id": "3556f13.927030e",
                                             "type": "change",
                                             "z": "6e170384.60c96c",
                                             "name": "",
                                             "rules": [
                                                 {
                                                     "t": "set",
                                                     "p": "topic",
                                                     "pt": "msg",
                                                     "to": "Fehlendes Backup",
                                                     "tot": "str"
                                                 },
                                                 {
                                                     "t": "set",
                                                     "p": "payload",
                                                     "pt": "msg",
                                                     "to": "'Fehlendes Backup festgestellt am: ' & $moment($now()).locale(\"de\").tz('Europe/Berlin').format('YYYY-MM-DD HH:mm:ss.SSS')",
                                                     "tot": "jsonata"
                                                 }
                                             ],
                                             "action": "",
                                             "property": "",
                                             "from": "",
                                             "to": "",
                                             "reg": false,
                                             "x": 3020,
                                             "y": 3500,
                                             "wires": [
                                                 [
                                                     "25921972.cd66c6"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "25921972.cd66c6",
                                             "type": "template",
                                             "z": "6e170384.60c96c",
                                             "name": "",
                                             "field": "payload",
                                             "fieldType": "msg",
                                             "format": "handlebars",
                                             "syntax": "mustache",
                                             "template": "<h1>Warnung: Fehlendes Backup</h1>\n\n{{payload}} !",
                                             "output": "str",
                                             "x": 3210,
                                             "y": 3500,
                                             "wires": [
                                                 [
                                                     "9e3e44a3.7826a8"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "5048baed.cf7704",
                                             "type": "trigger",
                                             "z": "6e170384.60c96c",
                                             "name": "",
                                             "op1": "",
                                             "op2": "",
                                             "op1type": "pay",
                                             "op2type": "nul",
                                             "duration": "3",
                                             "extend": true,
                                             "overrideDelay": false,
                                             "units": "min",
                                             "reset": "",
                                             "bytopic": "all",
                                             "topic": "topic",
                                             "outputs": 1,
                                             "x": 2950,
                                             "y": 3440,
                                             "wires": [
                                                 [
                                                     "db949d4b.5a23d"
                                                 ]
                                             ]
                                         }
                                      ]
                                      

                                      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

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

                                        Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

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

                                        T M 2 Replies Last reply
                                        0
                                        • AlCalzoneA AlCalzone

                                          Wenn es wirklich nur um neue Dateien (neuer Name, nicht überschrieben) geht, kann man im JS Skript auch lediglich mtime des Verzeichnisses prüfen und muss nicht erst alle Dateien enumerieren und deren Zeitstempel prüfen.

                                          T Offline
                                          T Offline
                                          tomily
                                          wrote on last edited by
                                          #20

                                          Hallo zusammen,

                                          erst mal einen herzlichen und fetten Dank an @ente34 für den geilen Support.
                                          Ich habe das letzte Script noch etwas für mich angepasst und nun tut es EXAKT das was ich mir vorgestellt habe... Juhuuu 🙂

                                          Danke auch an @mickym. Es ist immer interessant mehrere Wege zu testen. Somit lerne ich beide Systeme. Werde den NodeRed-Flow morgen früh gleich mal ausprobieren. Einfach aus Neugierde.

                                          Ich mache viel mit NodeRed. In dem Fall wollte ich das Backup-Prüfscript aber absichtlich in einem anderen System betreiben. Es macht nie Sinn eine Datensicherung vom gleichen System zu prüfen, das es auch erstellt.

                                          Spinnt das System, erhält man gar keine Infos mehr. Deshalb arbeite ich mit mehreren Instanzen und Servern.

                                          Ich prüfe somit mehrere Verzeichnisse auf neue Sicherungen ab. Ganz egal, wie diese erstellt wurden. Manche kommen vom ioBroker direkt. Manche liefert das ESXi-Serverbackup und manche kopiere ich von Hand rein und werde somit nach einer Gewissen Zeit erinnert es wieder zu tun 🙂

                                          Das einzige, das nicht funktioniert ist, wenn die Sicherungen in Unterverzeichnissen liegen. Das wäre dann die nächste Hürde 🙂

                                          mickymM 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

                                          151

                                          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