Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Frage zu Script Bewegungsmelder und Schnappschuss Kamera

    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

    [gelöst] Frage zu Script Bewegungsmelder und Schnappschuss Kamera

    This topic has been deleted. Only users with topic management privileges can see it.
    • dslraser
      dslraser Forum Testing Most Active last edited by

      Hallo,

      ich benutze folgendes Script, was auch soweit funktioniert. Wie stelle ich es an, das bei Bewegung 3 (oder eben mehr) Bilder im 3 Sekunden Abstand (oder auch anderer Zeitabstand) gemacht und gesendet werden ?

      Der untere Teil war der Versuch das zu realisieren, funktioniert aber nur manchmal. Oft kommt nur ein Bild.

      on({id: "hm-rpc.0.000xxxx.1.MOTION"/*Bewegungsmelder Gartentür.MOTION*/, val: true}, function (obj) 
      { // Beginn on
      var request = require('request');
      var fs = require('fs');
      
      request.get({url: 'http://192.168.180.50:80/cgi-bin/snapshot.cgi?loginuse=[XXX]&loginpas=[XXX]', encoding: 'binary'}, function (err, response, body) {
      fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) {
      
      if (err) {
      console.error(err);
      } else {
      console.log('Snapshot sent');
      sendTo('telegram.0', '/tmp/snap.jpg');
      }
      }); 
      });
      });
      on("hm-rpc.0.000xxx.1.MOTION", function (obj) {
          if (obj.state.val) {
              // send 2 images: immediately, in 15, and 30 seconds
              //sendImage();
              setTimeout(sendImage, 15000);
              setTimeout(sendImage, 30000);
          }
      });
      
      1 Reply Last reply Reply Quote 0
      • P
        ple last edited by

        Genau das habe ich bereits umgesetzt. Ich stell dir mal alles zur Verfügung, eben die Trigger und Daten der kam tauschen sowie den Pfad zum Bild und es müsste laufen.

        Gruß

        // Telegram Bild senden durch Klingel oder Text to command
        var source_url = 'http://xxx.xxx.xxx.xxx/tmpfs/snap.jpg?usr=xxxxxxx&pwd=xxxxxxxxxx', //Adresse der IpKamera
            dest_path = '/opt/iobroker/ipcam/';
        
        var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird
        
        var request = require('request');
        var fs      = require('fs');
        
        //var timer = null;
        var count = 0;
        
        // Bild an telegram schicken
        function sendImage (pfad) {
                sendTo('telegram.0', pfad);
                //log('Webcam Bild per telegram verschickt');
                //sendTo("telegram.0", Nachricht);    // <-- nach der Timeout funktion ausführen
        }
        
        // Bild speichern
        function saveImage() {
            request.get({url: source_url, encoding: 'binary'}, function (err, response, body) {
                fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) {
        
                if (err) {
                    //log('Fehler beim Bild speichern: ' + err, 'warn');
                } else {
                    //log('Webcam Bild gespeichert');
                    sendImage(dest_path + 'image2.jpg');
                }
              }); 
            });
        }
        
        //Trigger
        // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist
        on({id: "hm-rpc.0.xxxxxx.MOTION"/*Garten_BW_Haustuer:1.MOTION*/, val: true}, function () {
            if (getState("javascript.0.MyStates.anwesenheit"/*anwesenheit*/).val === false) {
            count = 3;
            counter();
            timer = setInterval(counter, 3000);
            }
        });
        
        function counter() {
            saveImage();
            count--;
            if(count === 0 && timer) clearInterval(timer);
        }   
        
        
        1 Reply Last reply Reply Quote 0
        • dslraser
          dslraser Forum Testing Most Active last edited by

          @ple:

          Genau das habe ich bereits umgesetzt. Ich stell dir mal alles zur Verfügung, eben die Trigger und Daten der kam tauschen sowie den Pfad zum Bild und es müsste laufen.

          Gruß

          // Telegram Bild senden durch Klingel oder Text to command
          var source_url = 'http://xxx.xxx.xxx.xxx/tmpfs/snap.jpg?usr=xxxxxxx&pwd=xxxxxxxxxx', //Adresse der IpKamera
              dest_path = '/opt/iobroker/ipcam/';
          
          var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird
          
          var request = require('request');
          var fs      = require('fs');
          
          //var timer = null;
          var count = 0;
          
          // Bild an telegram schicken
          function sendImage (pfad) {
                  sendTo('telegram.0', pfad);
                  //log('Webcam Bild per telegram verschickt');
                  //sendTo("telegram.0", Nachricht);    // <-- nach der Timeout funktion ausführen
          }
          
          // Bild speichern
          function saveImage() {
              request.get({url: source_url, encoding: 'binary'}, function (err, response, body) {
                  fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) {
          
                  if (err) {
                      //log('Fehler beim Bild speichern: ' + err, 'warn');
                  } else {
                      //log('Webcam Bild gespeichert');
                      sendImage(dest_path + 'image2.jpg');
                  }
                }); 
              });
          }
          
          //Trigger
          // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist
          on({id: "hm-rpc.0.xxxxxx.MOTION"/*Garten_BW_Haustuer:1.MOTION*/, val: true}, function () {
              if (getState("javascript.0.MyStates.anwesenheit"/*anwesenheit*/).val === false) {
              count = 3;
              counter();
              timer = setInterval(counter, 3000);
              }
          });
          
          function counter() {
              saveImage();
              count--;
              if(count === 0 && timer) clearInterval(timer);
          }   
          
          ```` `  Danke, schaue ich mir nach den Feiertagen mal an um es dann zu testen.(dann bin ich wieder zu Hause)
          1 Reply Last reply Reply Quote 0
          • T
            tempestas last edited by

            Hi,

            was muss ich tun, damit die Bilder auch gespeichert werden? Denke mal, meine Kamera braucht irgendwie eine Berechtigung, auf den NUC zu schreiben - nur wie?

            Frohes Fest allen

            1 Reply Last reply Reply Quote 0
            • dslraser
              dslraser Forum Testing Most Active last edited by

              Hallo,

              ich bekomme mit Deinem Script zwar Bilder gesendet, aber es ist eine Endlosschleife. Es kommen dann ohne Ende Bilder.

              Speichern brauche ich die Bilder eigentlich nicht, es würde mir reichen einfach , sagen wir drei Bilder im Abstand mit 3 Sekunden nach Bewegung zu senden.

              Wie bekomme ich das hin ?

              (Bilder speichern klappt auch nicht, bei mir läuft iobroker auf einer Synology, da habe ich schon verschiedene Pfade probiert, aber es wurde kein Bild in dem freigegebenen/angegebenen Ordner gespeichert)

              LG Heiko

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

                Das müsste so eigentlich laufen, 3 Bilder mit 3 Sekunden Pause dazwischen.

                Ist dein Trigger anders, dass er immer auslöst? Wie sieht dein Trigger aus?

                1 Reply Last reply Reply Quote 0
                • dslraser
                  dslraser Forum Testing Most Active last edited by

                  Ich benutze im Moment das Script, da bekomme ich dann zwei Bilder. Aber mit Deinem Script werde ich auch noch weiter probieren.

                  // -------------------------------------------------------------------------
                  // Dieses Script überwaht den Zustand eines Bewegungsmelders und speichert bei
                  // Aktivierung ein Bild einer Überwachnungskamera in einem Vereichnis und sendet
                  // dieses via Telegram.0-Adapter. Nach 10 Sek wird ein weiteres Bild erstellt und
                  // gesendet.
                  // Die Speicherung der Bilder erfolgt als "Stack", d.h. das aktuellste Bild bekommt
                  // immer den Suffix "0" und es werden n Bilder mit den Suffixen 1..n-1 vorgehalten
                  // Uhula 2017.11
                  // -------------------------------------------------------------------------
                  
                  // -------------------------------------------------------------------------
                  // Konfiguration
                  // -------------------------------------------------------------------------
                        // Objekt-ID des Bewegungsmelders
                  const oidLichtBewmelderTuer = "hm-rpc.0.xxx.1.MOTION"/*Bewegungsmelder Gartentür.MOTION*/;
                        // URL zur Kamera umn ein Image (jpg) zu erhalten
                  const cam_url = "http://192.168.180.50:80/cgi-bin/snapshot.cgi?loginuse=[xxx]&loginpas=[xxx]";
                        // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren
                  const dest_path = '';
                        // Anzahl der Bilder, die vorgehalten werden sollen
                  const imageCountMax = 8;                
                        // Prefix für die Bildnamen
                  const imageNamePre = "Gartentür"; 
                  
                  // -------------------------------------------------------------------------
                  // Scriptteil
                  // -------------------------------------------------------------------------
                  var request = require('request');
                  var fs      = require('fs');
                  
                  // Bild an telegram schicken 
                  function sendImage (path) { 
                      try {
                          var stats = fs.statSync(path);
                          var msg = formatDate(stats.birthtime,"DD.MM.YYYY hh:mm:ss") + " " + path.substring(path.lastIndexOf('/')+1);
                          sendTo('telegram.0', {
                              text:                   path,
                              caption:                msg, 
                              disable_notification:   true
                          });
                      }
                      catch(err) { if (err.code != "ENOENT") log(err); }     
                  }
                  
                  // löscht eine Datei synchron (wartet auf das Ergebnis)
                  function fsUnlinkSync(path) {
                      try {
                          var stats = fs.statSync(path);
                          try { fs.unlinkSync(path); }
                          catch(err) { if (err.code != "ENOENT") log(err); }     
                      }
                      catch(err) { if (err.code != "ENOENT") log(err); }
                  }
                  
                  // benennt eine Datei synchron um (wartet auf das Ergebnis)
                  function fsRenameSync(oldPath, newPath) {
                      try {
                          var stats = fs.statSync(oldPath);
                          try { fs.renameSync(oldPath, newPath); }
                          catch(err) { if (err.code != "ENOENT") log(err); }     
                      }
                      catch(err) { if (err.code != "ENOENT") log(err); }
                  }
                  
                  // Bild speichern und senden
                  function saveImage() {
                      // Bild imageCountMax-1 löschen
                      fsUnlinkSync( dest_path + imageNamePre + (imageCountMax-1) + "" );
                      // Bilder 0..imageCountMax-2 umbenennen
                      for (var i=imageCountMax-2; i >= 0; i-- ) { 
                          fsRenameSync(dest_path + imageNamePre + i + "", dest_path + imageNamePre + (i+1) + ".jpg"); 
                      }
                      // Bild 0 löschen
                      var fname = imageNamePre + ".jpg";
                      fsUnlinkSync( fname );
                      // Bild holen und speichern
                      request.get({url: cam_url, encoding: 'binary'}, function (err, response, body) {
                          fs.writeFile(dest_path + fname, body, 'binary', function(err) {
                              if (err) {
                                  log('Fehler beim Bild speichern: ' + err, 'warn');
                              } else {
                                  // dem Filesystem 2 Sek Zeit zum Speichern lassen
                                  setTimeout(function() { sendImage(dest_path + fname); }, 2000); 
                              }
                          }); 
                      });
                  }
                  
                  // sofort ein Bild senden und nach 3 Sek erneut
                  function onEvent() {
                      saveImage();
                      setTimeout(function() { saveImage(); }, 10 * 300); 
                  }
                  
                  // Ereignisroutine
                  on({id: oidLichtBewmelderTuer, val: true}, function (obj) {
                      onEvent( obj );
                  });
                  
                  // manuelle Ausführung (Test)
                  onEvent();
                  
                  1 Reply Last reply Reply Quote 0
                  • dslraser
                    dslraser Forum Testing Most Active last edited by Negalein

                    @ple:

                    Das müsste so eigentlich laufen, 3 Bilder mit 3 Sekunden Pause dazwischen.

                    Ist dein Trigger anders, dass er immer auslöst? Wie sieht dein Trigger aus? `
                    Ich habe bei mir jetzt den Pfad rausgenommen (iobroker läuft auf einer Synology) Als Trigger hatte ich eine Steckdose benutzt, damit ich nicht immer raus laufen muss zum probieren. 😄

                    Jedenfalls funktioniert es jetzt so wie gewünscht. Prima, Danke !

                    Sieht jetzt so aus bei mir.

                    // Telegram Bild senden durch Klingel oder Text to command
                    var source_url = 'http://192.168.180.50:80/cgi-bin/snapshot.cgi?loginuse=[xxx]&loginpas=[xxx]', //Adresse der IpKamera
                        dest_path = '';
                    var Nachricht = "Es hat an der Haustüre geklingelt"; // Nachricht, welche mit dem Bild gesendet wird
                    var request = require('request');
                    var fs      = require('fs');
                    //var timer = null;
                    var count = 0;
                    // Bild an telegram schicken
                    function sendImage (pfad) {
                            sendTo('telegram.0', pfad);
                            //log('Webcam Bild per telegram verschickt');
                            //sendTo("telegram.0", Nachricht);    // <-- nach der Timeout funktion ausführen
                    }
                    // Bild speichern
                    function saveImage() {
                        request.get({url: source_url, encoding: 'binary'}, function (err, response, body) {
                            fs.writeFile(dest_path + 'image2.jpg', body, 'binary', function(err) {
                            if (err) {
                                //log('Fehler beim Bild speichern: ' + err, 'warn');
                            } else {
                                //log('Webcam Bild gespeichert');
                                sendImage(dest_path + 'image2.jpg');
                            }
                          }); 
                        });
                    }
                    //Trigger
                    // 3 Bilder senden wenn Bewegung erkannt und keiner zu Hause ist
                    on({id: "hm-rpc.0.xxx.1.MOTION"/*Bewegungsmelder Gartentür.MOTION*/, val: true}, function () {
                    //    if (getState("javascript.0.MyStates.anwesenheit"/*anwesenheit*/).val === false) {
                        count = 3;
                        counter();
                        timer = setInterval(counter, 3000);
                        }
                    );
                    function counter() {
                        saveImage();
                        count--;
                        if(count === 0 && timer) clearInterval(timer);
                    }   
                    
                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    465
                    Online

                    31.8k
                    Users

                    79.9k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    1904
                    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