Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. Javascript - Bild / Url lokal speichern

    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

    Javascript - Bild / Url lokal speichern

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

      Hallo zusammen.

      Ich habe folgenden Shell Befehl:

      curl http://192.168.0.18/raw.jpg -o /test-$(date +%Y%m%d).jpg
      

      Ich könnte den Befehl als Shell-Script speichern und aufrufen, was ich nicht sehr toll finde.

      Wie schreibe ich den Befehl als Javascript, dass ich diesen direkt im JS-Adapter ausführen kann?

      lg Bit

      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @bitwicht last edited by

        @bitwicht

        https://www.kindacode.com/article/using-axios-to-download-images-and-videos-in-node-js/

        1 Reply Last reply Reply Quote 0
        • B
          bitwicht last edited by

          @OliverIO

          Danke, das habe ich auch schon gefunden aber ich verstehe es nicht:

          const axios = require("axios").default;
          
          const downloadFile = async (url, path) => {
            try {
              const response = await axios({
                method: "GET",
                url: url,
                responseType: "stream",
              });
              // Do something with the response
            } catch (err) {
              // Handling errors
            }
          };
          fs.createWriteStream( http://192.168.0.18/raw.jpg, options )
          

          Wenn ich das als Script eingebe, kommt nur ein Fehler.
          Ich ich verstehe auch nicht wie ich das Zielverzeichnis eingebe.

          Wal 1 Reply Last reply Reply Quote 0
          • Wal
            Wal Developer @bitwicht last edited by

            @bitwicht ,
            ich speichere meine Klingelbilder auch lokal ab.

            var request = require('request');
            var fs      = require('fs');
            var bell = true;
            var snap = '';
            
            function sendImage() {
                request.get({url: 'http://192.168.55.55:9100/?action=snapshot', encoding: 'binary'}, function (err, response, body) {
                    fs.writeFile(snap, body, 'binary', function(err) {
            
                    if (err) {
                        console.error(err);
                    } else {
                        console.log('Snapshot sent');
                        sendTo('telegram.0', {text: snap, caption: 'Jemand klingelt an der Haustür !!!'});   
                        sendTo("email", {
                            to:      "x.xxx@gmx.de",
                            subject: "Message from ioBroker",
                            text:    "Jemand klingelt an der Haustür !!!",
                            attachments: [{path: snap}]
                        });
                    }
                  });
                });
            }
            
            on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                if (bell) {
                    snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                    sendImage();
                }
                bell = false;
                setTimeout(function() {
                    bell = true;
                  }, 120000);
            });
            

            Snap ist der Dateiname und Ordner unter dem ich das Bild speichern möchte.
            Mit request.get hole ich mir das aktuelle Bild und speichere unter Snap ab und ist unter "/opt/iobroker/snapshot/snap_Datum/Zeit.jpg " zu finden.
            Der Ordner "/opt/iobroker/snapshot" muss vorhanden sein.
            Den Telegram und E-Mail Teil kannst du ignorieren.

            1 Reply Last reply Reply Quote 0
            • B
              bitwicht last edited by

              @Wal

              Danke, ich verstehe leider nicht wie man das Script ändern muss.

              var request = require('request');
              var fs      = require('fs');
              var bell = true;
              var snap = '';
               
              function sendImage() {
                  request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                      fs.writeFile(snap, body, 'binary', function(err) {
               
                      if (err) {
                          console.error(err);
                      } else {
                          console.log('Snapshot sent');
              //            sendTo('telegram.0', {text: snap, caption: 'Jemand klingelt an der Haustür !!!'});   
              //            sendTo("email", {
              //               to:      "x.xxx@gmx.de",
              //                subject: "Message from ioBroker",
              //                text:    "Jemand klingelt an der Haustür !!!",
              //                attachments: [{path: snap}]
              //            });
                      }
                    });
                  });
              }
               
              on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                  if (bell) {
                      snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                      sendImage();
                  }
                  bell = false;
                  setTimeout(function() {
                      bell = true;
                    }, 120000);
              });
              

              Wenn ich das so ändere, geht es nicht.

              Ich glaube dein Trigger ist die Dorbell, aber ich will ja nur das das Script einfach läuft wenn der Adapter es aufruft

              Wal 1 Reply Last reply Reply Quote 0
              • Wal
                Wal Developer @bitwicht last edited by Wal

                @bitwicht ,

                var request = require('request');
                var fs      = require('fs');
                var snap = '';
                
                on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                    snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                    request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                        fs.writeFile(snap, body, 'binary', function(err) {
                            if (err) {
                                console.error(err);
                            }
                        }
                    });
                });
                

                Das müsste die kurze Version sein.

                mqtt.0.piface.input.DoorBell_1
                

                ist der Trigger um die Datei zu speichern, das musst du mit deinem Trigger ersetzen.

                1 Reply Last reply Reply Quote 0
                • B
                  bitwicht last edited by

                  @Wal

                  ich habe ja keinen trigger.

                  Ich will das Script im JS-Adapter eingeben und der soll das Script jeden 1ten eines Monats ein mal ausführen.

                  Ich will jeden 1ten des Monats ein Bild von der Wasseruhr.

                  lg
                  Bit.

                  Wal 1 Reply Last reply Reply Quote 0
                  • Wal
                    Wal Developer @bitwicht last edited by

                    @bitwicht ,
                    dann ist dein Trigger jeden 1sten im Monat.

                    1 Reply Last reply Reply Quote 0
                    • B
                      bitwicht last edited by

                      @Wal

                      wenn ich das script starte kommt:
                      12:31:58.629 error javascript.0 (305518) script.js.Skript_1 compile failed: at script.js.Skript_1:12

                      Codierknecht 1 Reply Last reply Reply Quote 0
                      • Codierknecht
                        Codierknecht Developer Most Active @bitwicht last edited by

                        @bitwicht sagte in Javascript - Bild / Url lokal speichern:

                        das script

                        Und wie sieht das jetzt aus?

                        1 Reply Last reply Reply Quote 0
                        • B
                          bitwicht last edited by bitwicht

                          hier - einfach kopiert:

                          var request = require('request');
                          var fs      = require('fs');
                          var snap = '';
                           
                          on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                              snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                              request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                                  fs.writeFile(snap, body, 'binary', function(err) {
                                      if (err) {
                                          console.error(err);
                                      }
                                  }
                              });
                          });
                          

                          error javascript.0 (305518) script.js.Skript_1 compile failed: at script.js.Skript_1:12

                          Wal 1 Reply Last reply Reply Quote 0
                          • Wal
                            Wal Developer @bitwicht last edited by Wal

                            @bitwicht ,
                            Klammer zu wenig.

                            var request = require('request');
                            var fs      = require('fs');
                            var snap = '';
                            
                            on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                                    snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                             request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                                    fs.writeFile(snap, body, 'binary', function(err) {
                                    if (err) {
                                        console.error(err);
                                    }
                                  });
                                });
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • B
                              bitwicht last edited by

                              @Wal

                              Danke, jetzt habe ich nur noch einen Fehler.
                              Das Script lässt sich starten.

                              Wenn ich im Adapter einen Cron bzw. Zeit Assistenten einstellt - einfach , jede Minute fügt er folgende Zeile hinzu:

                              '* * * * *'var request = require('request');
                              

                              dann lässt sich das script nicht mehr starten:
                              error javascript.0 (305518) script.js.Skript_1 compile failed: at script.js.Skript_1:1

                              Bilder legt er auch keine ab.

                              Ich wollte das der Cron bzw. Zeit Assistenten das Script starten und as Bild gespeichert wird.

                              Codierknecht Wal 2 Replies Last reply Reply Quote 0
                              • Codierknecht
                                Codierknecht Developer Most Active @bitwicht last edited by Codierknecht

                                @bitwicht

                                Ich wollte das der Cron bzw. Zeit Assistenten das Script starten und as Bild gespeichert wird.

                                Dann wäre Dein Trigger nicht

                                on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                                

                                sondern stattdessen

                                schedule("* * * * *", function () {
                                

                                Dann muss aber noch der Dateiname anders generiert werden ...

                                Statt

                                        snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                                
                                

                                dann

                                        snap = '/opt/iobroker/snapshots/snapshot.jpg';
                                
                                

                                denn Du willst vermutlich nicht hunderte oder gar tausende Bilder ablegen, sondern die Datei immer wieder überschreiben.

                                B 1 Reply Last reply Reply Quote 0
                                • Wal
                                  Wal Developer @bitwicht last edited by

                                  @bitwicht ,
                                  habe heute meinen humanen Tag.
                                  Habe den Schedule 1sten im Monat aus Blockly kopiert, ich denke der stimmt.

                                  var request = require('request');
                                  var fs      = require('fs');
                                  var snap = '';
                                  var Monat;
                                  
                                  schedule('{"time":{"start":"00:00","exactTime":true},"period":{"months":1,"dates":"[1]"}}', async function () {
                                      Monat = formatDate(new Date(), "DD.MM.YYYY");
                                      snap = '/opt/iobroker/snapshot/snap_' + Monat + '.jpg';
                                      request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                                          fs.writeFile(snap, body, 'binary', function(err) {
                                          if (err) {
                                              console.error(err);
                                          }
                                          });
                                      });
                                  });
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • B
                                    bitwicht @Codierknecht last edited by

                                    @codierknecht

                                    var fs      = require('fs');
                                    var snap = '';
                                     
                                    schedule("* * * * *", function () {
                                            snap = '/var/www/html/wasseruhr-haus/' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                                     request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                                            fs.writeFile(snap, body, 'binary', function(err) {
                                            if (err) {
                                                console.error(err);
                                            }
                                          });
                                        });
                                    });
                                    

                                    kommt der fehler:
                                    error javascript.0 (305518) at Object.<anonymous> (script.js.Skript_1:5:61)

                                    Das er an den Dateinamen das Datum hängt ist OK.
                                    Ich habe es aktuell auf Minute, dass ich sehen ob er Bilder macht.
                                    das würde ich dann auf monatlich umstellen.

                                    Codierknecht OliverIO 2 Replies Last reply Reply Quote 0
                                    • Codierknecht
                                      Codierknecht Developer Most Active @bitwicht last edited by

                                      @bitwicht
                                      Du hast das Ändern des Dateinamens nicht übernommen.
                                      Das Objekt obj ist nur im Trigger vorhanden und nicht im Schedule.

                                      Nimm den Code von @Wal und ändere sein Schedule auf "* * * * *". Dann erhältst Du testweise jede Minute ein Bild.
                                      Wenn das passt, kannst Du das Schedule auf "5 0 1 * *" ändern. Das wird dann um 00:05 Uhr an jedem 1. eines Monats ausgeführt.

                                      1 Reply Last reply Reply Quote 1
                                      • OliverIO
                                        OliverIO @bitwicht last edited by

                                        @bitwicht said in Javascript - Bild / Url lokal speichern:

                                        formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss')

                                        und in Zeile 5 kannst du diesen Teil

                                        formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss')
                                        

                                        gegen

                                        formatDate(new Date(), 'TT.MM.JJJJ_hh:mm:ss')
                                        

                                        tauschen

                                        1 Reply Last reply Reply Quote 0
                                        • B
                                          bitwicht last edited by bitwicht

                                          Super, für Eure Mühe!
                                          Es gehen jetzt beide Scripte ! (nur schade das ich es nicht verstehe).

                                          Lösung1:

                                          var fs      = require('fs');
                                          var snap = '';
                                           
                                          schedule("* * * * *", function () {
                                                  snap = '/var/www/html/wasseruhr-haus/' + formatDate(new Date(), 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                                           request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                                                  fs.writeFile(snap, body, 'binary', function(err) {
                                                  if (err) {
                                                      console.error(err);
                                                  }
                                                });
                                              });
                                          });
                                          

                                          oder

                                          Lösung2:

                                          var request = require('request');
                                          var fs      = require('fs');
                                          var snap = '';
                                          var Monat;
                                           
                                          schedule('{"time":{"start":"00:00","exactTime":true},"period":{"months":1,"dates":"[1]"}}', async function () {
                                              Monat = formatDate(new Date(), "DD.MM.YYYY");
                                              snap = '/opt/iobroker/snapshot/snap_' + Monat + '.jpg';
                                              request.get({url: 'http://192.168.0.18/img_tmp/raw.jpg', encoding: 'binary'}, function (err, response, body) {
                                                  fs.writeFile(snap, body, 'binary', function(err) {
                                                  if (err) {
                                                      console.error(err);
                                                  }
                                                  });
                                              });
                                          });
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • B
                                            bitwicht last edited by

                                            Ich will Eure Nerven ja nicht überstrapazieren, aber dieser E-Mail Versand ist auch ganz schick.

                                            müsste ich das dann einfach als "else" anhängen:

                                                   if (err) {
                                                        console.error(err);
                                                    } else {
                                                        sendTo("email", {
                                                            to:      "x.xxx@gmx.de",
                                                            subject: "TEXT",
                                                            text:    "TEXT",
                                                            attachments: [{path: snap}]
                                                        });
                                                    }
                                            

                                            Ich glaube aber das attachments ist falsch

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            442
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            28
                                            1298
                                            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