Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. (gelöst) Umbau von request auf httpGet für mehrere Snapshot

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    (gelöst) Umbau von request auf httpGet für mehrere Snapshot

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

      Hallo zusammen,
      Ich nutze seit längerer Zeit Script von @Uhula

       
       
      // -------------------------------------------------------------------------
      // 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 oidKlinkelShelly = "shelly.0.xxx.Relay0.Switch";
      // URL zur Kamera umn ein Image (jpg) zu erhalten
      const cam_url = "http://192.168.xx.xxx/cgi-bin/api.cgi?cmd=Snap&channel=0&rs=wuuPhkmUCeI9WG7C&user=admin&password=password";
      // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren
      const dest_path = '/opt/iobroker/iobroker-data/files/temp/';
      // Anzahl der Bilder, die vorgehalten werden sollen
      const imageCountMax = 8;
      // Prefix für die Bildnamen
      const imageNamePre = "Eingang";
       
      // -------------------------------------------------------------------------
      // 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 hh:mm:ss") + " Es hat geklingelt" // + path.substring(path.lastIndexOf('/')+1);
         var msg = formatDate(Date.now(),"DD.MM hh:mm:ss") + " Es hat geklingelt" // + 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) + ".jpg" );
         // Bilder 0..imageCountMax-2 umbenennen
         //for (var i=imageCountMax-2; i >= 0; i-- ) {
         //fsRenameSync(dest_path + imageNamePre + i + ".jpg", dest_path + imageNamePre + (i+1) + ".jpg");
         //}
         // Bild 0 löschen
         var fname = imageNamePre + "0.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 10 Sek erneut
      function onEvent() {
         saveImage();
         //setTimeout(function() { saveImage(); }, 10 * 1000);
      }
       
      // Ereignisroutine
         //on({id: oidKlinkelShelly, val: true}, function (obj) {
         on({id: "shelly.0.SHSW-1#25A7FE#1.Relay0.Switch"/*Switch*/, change: "ne"}, function (obj){
         if (getState("shelly.0.SHSW-1#25A7FE#1.Relay0.Switch").val == true) {
             onEvent( obj );
         } else {
             console.log('Schreibt nicht');
         }
       
      });
      // manuelle Ausführung (Test)
       
      
      

      Habe heute auch auf JS v8.3.1 upgedated.
      Jetzt bekomme ich diese Fehlermeldung
      script.js.common.Bild_per_Telegramm_bei_Alarm: request package is deprecated - please use httpGet (or a stable lib like axios) instead!
      Die beiden Methoden hab ich ausprobiert, klappt aber nicht
      https://forum.iobroker.net/topic/75072/gelöst-request-auf-httpget-umstellen-für-snapshot/4
      Für Hilfe wäre ich dankbar.

      T 1 Reply Last reply Reply Quote 0
      • T
        TT-Tom @kukoratsch last edited by

        @kukoratsch
        was hast du probiert? zeige doch mal. dann kannst du es besser verstehen, als nur zu kopieren. Im Prinzip, ist es die selbe Konstellation wie bei dir.

        K 1 Reply Last reply Reply Quote 0
        • K
          kukoratsch @TT-Tom last edited by

          @tt-tom

          // -------------------------------------------------------------------------
          // 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 = "0_userdata.0.Alarm_Anlage.Kamera_Eingang";
             // URL zur Kamera umn ein Image (jpg) zu erhalten
          //const cam_url = "http://192.168.178.96:8085/tmpfs/auto.jpg?usr=xxx&pwd=xxx";
             // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren
          // const dest_path = '/opt/iobroker/iobroker-data/files/temp/alarm/';
          const dest_path = '/opt/iobroker/iobroker-data/tmp/';
             // Anzahl der Bilder, die vorgehalten werden sollen
          const imageCountMax = 50;                
             // Prefix für die Bildnamen
          const imageNamePre = "Enbruch_Kamera_Eingang_"; 
          // -------------------------------------------------------------------------
          // 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) + ".jpg" );
              // Bilder 0..imageCountMax-2 umbenennen
              for (var i=imageCountMax-2; i >= 0; i-- ) { 
                  fsRenameSync(dest_path + imageNamePre + i + ".jpg", dest_path + imageNamePre + (i+1) + ".jpg"); 
              }
              // Bild 0 löschen
              var fname = imageNamePre + "0.jpg";
              fsUnlinkSync( fname );
              
              // Bild holen und speichern
          httpGet('http://192.168.178.96:8085/tmpfs/auto.jpg?usr=xxx&pwd=xxx',{ responseType: 'arraybuffer' }, (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); }, 1500); 
                      }
                  }); 
              });
          }
          // sofort ein Bild senden und nach 10 Sek erneut
          function onEvent() {
          saveImage();
          setTimeout(function() { saveImage(); }, 2 * 1000);
          setTimeout(function() { saveImage(); }, 4 * 1000); 
          setTimeout(function() { saveImage(); }, 6 * 1000);   
          }
          // Ereignisroutine
          on({id: oidLichtBewmelderTuer, val: true}, function (obj) {
              onEvent( obj );
          });
          // manuelle Ausführung (Test)
          onEvent();
          
          

          Felermeldungen

          javascript.0	16:08:25.752	error	at Object.<anonymous> (script.js.common.Alarm.Kamera.Test_Kamera_Eingang_Bild_per_Telegramm_bei_Alarm:75:12)
          javascript.0	16:08:27.755	error	at Object.<anonymous> (script.js.common.Alarm.Kamera.Test_Kamera_Eingang_Bild_per_Telegramm_bei_Alarm:75:12)
          javascript.0	16:08:29.755	error	at Object.<anonymous> (script.js.common.Alarm.Kamera.Test_Kamera_Eingang_Bild_per_Telegramm_bei_Alarm:75:12)
          javascript.0	16:08:31.755	error	at Object.<anonymous> (script.js.common.Alarm.Kamera.Test_Kamera_Eingang_Bild_per_Telegramm_bei_Alarm:75:12)
          
          M T 2 Replies Last reply Reply Quote 0
          • M
            MCU @kukoratsch last edited by

            @kukoratsch Und so?
            Zeile 73

            httpGet('http://192.168.178.96:8085/tmpfs/auto.jpg?usr=xxx&pwd=xxx',{ responseType: 'arraybuffer' }, (err, response) => {
                    fs.writeFile(dest_path + fname, response.data, 'binary', function(err) {
            
            1 Reply Last reply Reply Quote 0
            • T
              TT-Tom @kukoratsch last edited by TT-Tom

              @kukoratsch

              der Anfang war doch schon mal richtig, nur das es den Parameter body nicht mehr gibt, dass ist jetzt alles in response enthalten.
              du musst also body in response.dataändern
              hier mal der Link zur Doku.

              Edit: okay, kannste von MCU kopieren

              K 1 Reply Last reply Reply Quote 0
              • K
                kukoratsch @TT-Tom last edited by

                @TT-Tom @MCU
                Dankeschön Funktioniert !!!

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

                Support us

                ioBroker
                Community Adapters
                Donate

                768
                Online

                31.6k
                Users

                79.5k
                Topics

                1.3m
                Posts

                3
                6
                348
                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