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.
    • 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
                      • Wal
                        Wal Developer @bitwicht last edited by

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

                        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:

                        Versuch macht kluch ! 😉

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

                          Hier noch das Script zusätzlich mit E-Mail versand (E-Mail Adapter muss installiert sein):

                          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);
                                  } else {
                                      sendTo("email", {
                                          to:      "hier-an-Emailadresse-eintragen",
                                          subject: "Betreff-Eintragen",
                                          text:    "Tect-Eintargen",
                                          attachments: [{path: snap}]
                                      });
                                  }
                                  
                                });
                              });
                          });
                          
                          OliverIO 1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @bitwicht last edited by

                            @bitwicht

                            das skript lädt aktuell das komplette bild erst in den Hauptspeicher und speichert es dann. solange genug Speicher da ist, kann man das lassen.

                            Behalt dir mal im Hinterkopf, das man hier optimieren könnte, falls es mit dem Speicher mal eng wird. Dann könnten die Daten gestreamt werden, da wird dann nur ein kleiner Teil im Hauptspeicher zwischengespeichert.
                            https://github.com/request/request#streaming

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

                              @Wal

                              zu deiner Zeitangabe noch eine Frage. Du schreibst:

                              {"time":{"start":"00:00","exactTime":true},"period":{"months":1,"dates":"[1]"}}',
                              

                              Wenn ich das im IOBroker eingebe kommt:

                              {"time":{"start":"00:00","end":"23:59","mode":"hours","interval":1},"period":{"months":"[1,2,3,4,5,6,7,8,9,10,11,12]","dates":"[1]"}}',
                              

                              Du schreibst months":1," wäre das dann nicht nur JAN ?

                              Muss ich bei months nicht alle Monate und dates nicht alle Tage spezifizieren?

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

                                @bitwicht @Wal
                                Ich verwende nur noch CRON und nix mehr was der Wizard da so produziert.
                                CRON ist zum Einen wesentlich kürzer und zum Anderen weniger fehleranfällig.
                                Hier hatten immer mal wieder Anwender Probleme mit den Schedules aus dem Wizard, die durch CRON ganz einfach gelöst werden konnten.

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

                                  @Codierknecht

                                  OK, mit Cron wären es:

                                  '1 0 1,16 * *'
                                  

                                  Um 00:01 am 1 und 16 im jeden Monat

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

                                    @bitwicht
                                    Exakt - kurz und knackig 😁

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

                                      @codierknecht ,
                                      ich verwende auch nur Cron, aber ich wollte das der Themenstarter auch noch etwas selbst herausfinden muss, sonst hat das alles keinen Lerneffekt und beim nächsten Skript steht er wieder auf der Matte. 😉

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      859
                                      Online

                                      31.9k
                                      Users

                                      80.1k
                                      Topics

                                      1.3m
                                      Posts

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