Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. IP Kamera Bilder via Telegram, 2. Daten Punt Auslösung

    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

    IP Kamera Bilder via Telegram, 2. Daten Punt Auslösung

    This topic has been deleted. Only users with topic management privileges can see it.
    • Asgothian
      Asgothian Developer @philipplindnerDE last edited by Asgothian

      @philipplindnerde

      Du musst deinem Skript genau 3 Dinge hinzufügen:

      • eine Variable Alarmanlage_status
      • einen Aufruf bei Skriptstart: Alarmanlage_status = getState(bewerbung02).val
      • einen Trigger on ({id: bewerbung02, change:'ne'}, function(obj) { Alarmanlage_status = obj.state.val; }

      Damit kannst du dann in deinem Trigger mit if bewerbung02==1 prüfen ob die Alarmanlage scharf ist und dein "onEvent" nur aufrufen wenn das der Fall ist.

      A.
      Nachtrag:

      • ich habe die Skriptteile nicht geprüft. Schreibfehler können vorhanden sein
      • Du sprichst oben von einer Variable "Bewegung02", die im Skript aber "bewerbung02" heisst. Die ist in den Skript Stubs gemeint.
      philipplindnerDE 1 Reply Last reply Reply Quote 0
      • philipplindnerDE
        philipplindnerDE @Asgothian last edited by

        @asgothian Danke für ihre Antwort ich probiere es mal aus. Die Variabel "bewerbung02" soll bewergung02 heißen

        1 Reply Last reply Reply Quote 0
        • philipplindnerDE
          philipplindnerDE last edited by

          Habe Ihre Parameter Eingebaut. Gehet aber nicht. Schuldigen wenn ich so doof bin. JavaScript habe ich nur Grundkenntnisse.

          // Konfiguration
          // -------------------------------------------------------------------------
                //2. Bewwgung angabe
          const bewegung02 ="mqtt.1.Philipp_Lindner_Überwachung.arlamStatus";
                // Objekt-ID des Bewegungsmelders
          const bewegung01 = "mqtt.1.Philipp_Lindner_Überwachung.cameras.flurcam_01.motion";
                // URL zur Kamera um ein Image (jpg) zu erhalten
          const cam_url = "http://192.168.1.23:8090/grab.jpg?oid=2&size=1280x720";
                // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren
          const dest_path = '/opt/iobroker/temp/cam';
                // Anzahl der Bilder, die vorgehalten werden sollen
          const imageCountMax = 4;                
                // Prefix für die Bildnamen
          const imageNamePre = "Flur_"; 
          
          // -------------------------------------------------------------------------
          // Scriptteil
          // -------------------------------------------------------------------------
          var request = require('request');
          var fs      = require('fs');
          
          var Alarmanlage_status = getState(bewegung02).val;
          
          ....
          
          on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status = obj.state.val;})
          
          if(Alarmanlage_status=="1"){
          
          on({id: bewegung01, val: true}, function (obj) {
              onEvent( obj );
          })}
          
          philipplindnerDE 1 Reply Last reply Reply Quote 0
          • philipplindnerDE
            philipplindnerDE @philipplindnerDE last edited by

            so Meine Skript mit 2 Auslöse Datenpunkte ist Verding. Danke nochmal an @Asgothian der Denkansatz wahr richtig hier für alle die sich auch für das Thema interessieren:

            // Konfiguration
            // -------------------------------------------------------------------------
                  //2. Bewerbungs angabe
            const bewegung02 ="mqtt.1.Philipp_Lindner_Überwachung.arlamStatus";
                  // Objekt-ID des Bewegungsmelders
            const bewegung01 = "mqtt.1.Philipp_Lindner_Überwachung.cameras.flurcam_01.motion";
                  // URL zur Kamera um ein Image (jpg) zu erhalten
            const cam_url = "http://192.168.xxx.xxx:8090/grab.jpg?oid=2&size=1280x720";
                  // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren
            const dest_path = '/opt/iobroker/temp/cam';
                  // Anzahl der Bilder, die vorgehalten werden sollen
            const imageCountMax = 4;                
                  // Prefix für die Bildnamen
            const imageNamePre = "Flur_"; 
            
            // -------------------------------------------------------------------------
            // Scriptteil
            // -------------------------------------------------------------------------
            var request = require('request');
            var fs      = require('fs');
            
            var Alarmanlage_status = getState(bewegung02).val;
            
            // 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
                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(t) {
                saveImage();
                setTimeout(function() { saveImage(); }, 10 * 1000); 
                log('onEVenter go ('+t+')', 'info');
            }
            
            // Ereignisroutine
            
            function auloeser(){
                log('Überwachunbg test start', 'info');
                on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status=obj.state.val;})
                
                if (Alarmanlage_status =="1"){
                    log('Arlame Scharf!','info');
                    on({id:bewegung01, val:true}, function(obj){onEvent(obj); log ('BEWEGUNG!','info');})
                    
                }
                log('test ende', 'info');
            }
            
            schedule("*/5 * * * * *", function(){ auloeser()});
            
            
            // manuelle Ausführung (Test)
            onEvent("test");
            

            der Skript läuft aller 5 sec. durch und prüft die punkte ab.

            F 1 Reply Last reply Reply Quote 0
            • F
              Fabian1 @philipplindnerDE last edited by

              @philipplindnerde Mit Blockly und exec wären das 3 klicks gewesen 😳

              philipplindnerDE 1 Reply Last reply Reply Quote 0
              • philipplindnerDE
                philipplindnerDE @Fabian1 last edited by

                @fabian1 habe ich mir auch so überlegt. Na Ja es Geht und ich habe was Über Java Skript gelernt. 🤗 😜

                Asgothian 1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @philipplindnerDE last edited by Asgothian

                  @philipplindnerde

                  function auloeser(){
                      log('Überwachunbg test start', 'info');
                      on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status=obj.state.val;})
                      
                      if (Alarmanlage_status =="1"){
                          log('Arlame Scharf!','info');
                          on({id:bewegung01, val:true}, function(obj){onEvent(obj); log ('BEWEGUNG!','info');})
                          
                      }
                      log('test ende', 'info');
                  }
                   
                  schedule("*/5 * * * * *", function(){ auloeser()});
                  
                  

                  das geht schief.

                  Du legst solange die Alarmanlage scharf ist (status == 1) alle 5 sekunden einen neuen Trigger an der die Bewegung mitschreibt.

                  Wenn dann mal Bewegung kommt dann bekommst du ggf. die eine UND die andere Log Meldung. Geschätzt im Schnitt so etwa 30 -200 - für jeden Event

                  Und wenn die Alarmanlage abgeschaltet wird bleibt der trigger aktiv, und du bekommst weiter info Meldungen.

                  So wolltest du das sicherlich ncih

                  Noch schlimmer ist das umsetzen der Variable Alarmanlage_status. Da bekommst du pro 5 sekunden Skriptlaufzeit einen Trigger. Nach einem Tag also 17280 Trigger.

                  Du solltest das so umschreiben:

                  let Alarmanlage_status = 0;
                  on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status=obj.state.val;});
                  
                  on({id:bewegung01, val:true}, function(obj){onEvent(obj); if Alarmanlage)status == 1 log ('BEWEGUNG!','info');});
                  
                  

                  Dann brauchst du den Auslöser nicht und das ganze funktioniert automatisch.

                  philipplindnerDE 1 Reply Last reply Reply Quote 0
                  • philipplindnerDE
                    philipplindnerDE @Asgothian last edited by

                    @asgothian Danke! aber eigentlich kommt die Schaf Schaltung über meine PHP Skript und da über den MQTT Broker in den IOBroker . Aber so get es auch danke noch mal. 🙂

                    Asgothian 1 Reply Last reply Reply Quote 0
                    • Asgothian
                      Asgothian Developer @philipplindnerDE last edited by Asgothian

                      @philipplindnerde sagte in IP Kamera Bilder via Telegram, 2. Daten Punt Auslösung:

                      @asgothian Danke! aber eigentlich kommt die Schaf Schaltung über meine PHP Skript und da über den MQTT Broker in den IOBroker . Aber so get es auch danke noch mal. 🙂

                      Die Methode der Scharfschaltung war nicht Thema meines Änderungsvorschlages. Die Scharfschaltung wird anscheinen über den Datenpunkt der in der Variable "bewegung02" hinterlegt wird realisiert.

                      Mir ging es bei dem Post um folgendes:

                      Den Befehl

                        on(MeinDatenpunkt, Aktion)
                      

                      Kann man umgangssprachlich so übersetzen:
                      Trag in die Liste der zu überwachenden Datenpunkte MeinDatenpunkt ein und führe Aktion jedesmal dann aus wenn die Bedingung erfüllt wird.

                      Dabei ist zu beachten das MeinDatenpunkt in dieser Liste beliebig oft auftauchen kann, mit beliebigen Bedingungen und Aktionen.

                      Ein Konstrukt

                      schedule("*/5 * * * * *", function(){ 
                        on({id:bewegung01, val:true}, function(obj){onEvent(obj); log ('BEWEGUNG!','info');})
                      });
                      

                      führt demnach dazu das alle 5 Sekunden ein zusätzlicher Trigger eingetragen wird. Damit kannst Du dein System wenn es ungünstig läuft komplett lahmlegen.

                      Es gibt die generell Aussage "Trigger im Trigger" ist gefährlich. Genau das hast Du mit dem von Dir geposteten Skript getan.

                      A.

                      philipplindnerDE 1 Reply Last reply Reply Quote 0
                      • philipplindnerDE
                        philipplindnerDE @Asgothian last edited by philipplindnerDE

                        @asgothian ok das habe ich Versanden.
                        das Problem was ich jetzt habe ist wenn beide Bedingungen erfüllt sind würd die Aktion ausgeführt. So ball ich eine ändere ist die Aktion aktiv. Was sie eigentlich nich sein dürfte. Muss ich da was zurückstellen?

                        Meine Cod sieht aktuell so aus:

                        // Konfiguration
                        // -------------------------------------------------------------------------
                              //2. Bewerbungs angabe
                        const bewegung02 ="mqtt.1.Philipp_Lindner_Überwachung.arlamStatus";
                              // Objekt-ID des Bewegungsmelders
                        const bewegung01 = "mqtt.1.Philipp_Lindner_Überwachung.cameras.flurcam_01.motion";
                              // URL zur Kamera um ein Image (jpg) zu erhalten
                        const cam_url = "http://192.168.1.23:8090/grab.jpg?oid=2&size=1280x720";
                              // Pfadangabe für die Speicherung der Bilder, der Pfad muss existieren
                        const dest_path = '/opt/iobroker/temp/cam';
                              // Anzahl der Bilder, die vorgehalten werden sollen
                        const imageCountMax = 4;                
                              // Prefix für die Bildnamen
                        const imageNamePre = "Flur_"; 
                        
                        // -------------------------------------------------------------------------
                        // Scriptteil
                        // -------------------------------------------------------------------------
                        var request = require('request');
                        var fs      = require('fs');
                        
                        var Alarmanlage_status = getState(bewegung02).val;
                        
                        // 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
                            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(t) {
                            saveImage();
                            setTimeout(function() { saveImage(t); }, 10 * 1000); 
                            log('onEVenter go ('+t+')', 'info');
                        }
                        
                        // Ereignisroutine
                        
                        /*function auloeser(){
                            log('Überwachunbg test start', 'info');
                            on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status=obj.state.val;})
                            
                            if (Alarmanlage_status =="1"){
                                log('Arlame Scharf!','info');
                                on({id:bewegung01, val:true}, function(obj){onEvent(obj); log ('BEWEGUNG!','info');})
                                
                            }
                            log('test ende', 'info');
                        }*/
                        
                        let Alarmanlage_status2 = 0;
                        on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status=obj.state.val;});
                         
                        on({id:bewegung01, val:true}, function(obj){onEvent(obj); if (Alarmanlage_status == 1){log('BEWEGUNG!','info');}});
                         
                        
                        //schedule("*/5 * * * * *", function(){ auloeser()});
                        
                        
                        // manuelle Ausführung (Test)
                        onEvent("test");
                        

                        Nachtrag: so das Problem habe ich jetzt gelöst, bin selber bescheuert umd habe den fehler nicht gesehen:

                        let Alarmanlage_status2 = 0;
                        on({id:bewegung02, change:'ne'}, function(obj) {Alarmanlage_status=obj.state.val;});
                         
                        on({id:bewegung01, val:true}, function(obj){if (Alarmanlage_status == 1){onEvent(obj); log('BEWEGUNG!','info');}});
                        

                        Danke an @Asgothian für die auf klährung.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        959
                        Online

                        31.9k
                        Users

                        80.2k
                        Topics

                        1.3m
                        Posts

                        3
                        11
                        359
                        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