Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Frage]Skript zur Steuerung ONVIF Kameras

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.7k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.2k

[Frage]Skript zur Steuerung ONVIF Kameras

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
79 Beiträge 27 Kommentatoren 27.5k Aufrufe 16 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • R Offline
    R Offline
    RandyAndy
    schrieb am zuletzt editiert von
    #25

    Hallo

    ich versuche das Skript bei mir zum Laufen zu bekommen.

    Dazu habe ich die IP-Adresse, Passwort usw angepasst
    2213_2018-11-08_21_42_09-javascript_-_iobroker.png

    Dann habe ich noch den Pfad wo die Snapshot-Datei abgespeichert werden soll geändert
    2213_2018-11-08_21_44_41-javascript_-_iobroker.png

    Das Skript selbst habe ich unter Skript/global abgelegt (die PZT Parameter werden auch erzeugt)

    Dort wird es zunächst manuell gestartet (Test)
    2213_2018-11-08_21_46_12-javascript_-_iobroker.png

    Leider wird aber keine Snapshot-Datei im angegebenen Pfad erstellt

    Was mache ich da verkehrt ?

    Ich verwende eine HIKVISION DS-2CD2T42WD-I5 Kamera und die Informationen für die IP-Adresse habe aus dem Onvif Device Manager genommen

    Danke schon mal

    Andreas

    1 Antwort Letzte Antwort
    0
    • D Offline
      D Offline
      daniello
      schrieb am zuletzt editiert von
      #26

      Andreas, wie löst Du denn ein Snapshot aus .. ich sehe nur diese Objekte:

      const idSpeed     = pfad + 'Geschwindigkeit';
      const idStoppzeit = pfad + 'Stoppzeit';
      const idStopp =     pfad + 'Stopp';
      const idRechts =    pfad + 'rechts';
      const idLinks =     pfad + 'links';
      const idHoch =      pfad + 'hoch';
      const idRunter =    pfad + 'runter';
      const idZoomIn =    pfad + 'ZoomIn';
      const idZoomOut =   pfad + 'ZoomOut';
      const idGotoPreset =   pfad + 'gotoPreset';
      
      1 Antwort Letzte Antwort
      0
      • R Offline
        R Offline
        RandyAndy
        schrieb am zuletzt editiert von Jey Cee
        #27

        Dazu gibt es die Funktion saveImage im Skript von pix.

        Da müsste eigentlich ein File auf dem Raspberry abgespeichert werden

         function saveImage () {
         // Initialize the OnvifDevice object
         device.init((error) => {
         if (error) {
         log('[ERROR] ' + error.message, 'error');
         return;
         } else {
         if (logging) log('The OnvifDevice object has been initialized successfully.');
         // +++ Get the detailed device information
         var device_info = device.getInformation();
         if (logging) log(JSON.stringify(device_info, null, ' '));
         // +++ Get the UDP stream URL
         var url = device.getUdpStreamUrl();
         if (logging) log('UDP-Stream: ' + url);
         // +++ Get Profile
         var profile = device.getCurrentProfile();
         if (logging) log('Profile: ' + JSON.stringify(profile, null, ' ')); // Viele Infos
         // für debug:
         //log('http: ' + profile.stream.http);
         var cam_info = 'ONVIF Bild' + '\n'
         + 'Model: ' + device_info.Model + '\n'
         + 'Firmware: ' + device_info.FirmwareVersion + '\n'
         + 'Seriennummer: ' + device_info.SerialNumber + '\n'
         + 'Harware ID: ' + device_info.HardwareId + '\n'
         + 'RTSP-Stream: ' + url;
         // +++ Get the data of the snapshot
         log('fetching the data of the snapshot…');
         device.fetchSnapshot((error, res) => {
         if (error) {
         log(error.message, 'error');
         return;
         }
         // Save the data to a file and send via telegram
         fs.writeFile(dest_path + 'onvif_snapshot.jpg', res.body, function (error) { // Anpassen an die OS X gegebenheiten (oder per Telegram senden)
         if (error) {
         log(error.message, 'error');
         } else {
         sendImage(dest_path + 'onvif_snapshot.jpg', cam_info);
         log('Image sent!');
         }
         });
         });
         }
         }); 
        

        Deine Frage "wie löse ich das aus" ist aber berechtigt und da muss ich heute Abend noch einmal etwas prüfen. Es könnte sein, dass die Funktion beim Aufrufen des Skripts gar nicht ausgelöst wird, sondern dazu muss man einen Trigger setzen. Das checke ich heute Abend.

        Leider fehlt so eine Art Bedienungsanleitung wie und was man durchführen muss, das macht es halt ein wenig schwer das alles nachzuvollziehen

        Andreas

        1 Antwort Letzte Antwort
        0
        • D Offline
          D Offline
          daniello
          schrieb am zuletzt editiert von
          #28

          Gib mir bitte Bescheid .. ist mein erstes Script (sonst Blockly) .. keine Ahnung wie man mit der Funktion umgeht.

          VG

          1 Antwort Letzte Antwort
          0
          • R Offline
            R Offline
            RandyAndy
            schrieb am zuletzt editiert von
            #29

            Ich vermute die Funktion wird beim Starten des Skripts gar nicht aufgerufen sondern muss getriggert werden.

            Ist aber nur eine Vermutung

            1 Antwort Letzte Antwort
            0
            • R Offline
              R Offline
              RandyAndy
              schrieb am zuletzt editiert von
              #30

              Hallo,

              endlich konnt ich das Skript von pix so anpassen dass nur noch ein snapshot erzeugt wird und regelmäßig auf der SD-Karte bzw. dem USB-Stick gespeichert wird. damit erzeuge ich alle 10 Sekunden ein Bild mit gleichem Namen. Da ich meiner SD-Karte in der auch ioBroker und das Raspberry System) abgelegt dies auf Dauer nicht zumuten möchte (das wird die Lebensdauer der SD-Karte dann schon deutlich verringern), wollte ich die Snapshots auf einem einem USB-Stick speichern und dann im ioBroker anzeigen. Das Speichern aus USB-Karte habe ich auch hinbekommen (die Snapshots waren da). Nach einem Tag Test ist aber das System komplett ausgestiegen (ich vermute mal, da muss ich mit Garbage Collection arbeiten) und ich konnte das System nur noch durch aufspielen eines vorher gezogenen Images wieder beleben. Und zweitens habe ich es nicht geschafft auf das USB-Laufwerk über ioBroker zuzugreifen. Der scheint nur Bilder die im Ordner vis.0 liegen zu akzeptieren. Wenn jemend daran interessiert ist, ich kann gerne das Skript und die Einrichtung posten, dann wäre es aber schön wenn ich auch Hilfe bekommen würde wie man von USB Bilder anzeigt.

              Andreas

              1 Antwort Letzte Antwort
              0
              • D Offline
                D Offline
                daniello
                schrieb am zuletzt editiert von
                #31

                Hi Andy .. Foto machen und irgendwo ablegen geht auch über ein Blockly .. das funktioniert bei mir alles schon .. Interessehalber wäre spannend wie man die Funktion in diesem Skript hier triggert um ein Foto zu machen .. könnte auch an anderer Stelle nützlich sein.

                Falls Dich das Blockly zum Fotomachen interessiert .. zeig ich's Dir gern .. aber das wäre falsch im Onvif-Thread. Hab gestern auch geschafft mir auf Knopfdruck (zum Testen) ein 10 Sekunden Stream per Telegram zu senden .. auch nett. Alles nicht meine Erfindung .. sondern hier aus dem Forum gelernt :-)

                Mit Vis hab ich leider gar nichts am Hut :-(

                1 Antwort Letzte Antwort
                0
                • R Offline
                  R Offline
                  RandyAndy
                  schrieb am zuletzt editiert von
                  #32

                  Hallo daniello,

                  gib mir bitte 1-2 Tage Zeit.

                  Ich muss das Skript noch einmal erzeugen, da ich mir das image abgeschossen habe.

                  Daneben muss ich dann auch noch zusammenfassen wie man die onvif adpater unter nodejs installiert, das war die größte Hürde.

                  Skript kommt asap

                  Andreas

                  1 Antwort Letzte Antwort
                  0
                  • P Offline
                    P Offline
                    pix
                    schrieb am zuletzt editiert von
                    #33

                    Hallo RandyAndy,

                    ich freue mich, dass das Skript auch anderen hilft.

                    Ich habe deine Posts eben erst gesehen, da ich den Thread nicht mehr abonniert habe.

                    1. Die korrekte Pfadangabe für das lokale Speichern von Dateien auf dem Raspberry kann ich dir nicht sagen. Es gibt aber hier im Forum einige Beispiele für Skripte, die genau das machen. Suche einfach mal nach "fs.writeFile".

                    2. BITTE BITTE BITTE keine Skripte in /global abspeichern. Die Skripte im Ordner global werden jedem anderen Skript angehängt. Somit läuft das Skript dann praktisch mehrfach. Skripte gehören in common oder in eigene, selbst erstellte Ordner.

                    Es ist schon spät, ich kann gerade nicht ausführlich antworten.

                    Vielleicht klappt es morgen.

                    Gruß

                    Pix

                    ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                    1 Antwort Letzte Antwort
                    0
                    • R Offline
                      R Offline
                      RandyAndy
                      schrieb am zuletzt editiert von
                      #34

                      Hallo Pix,

                      danke für die Info. Wie ich schon geschrieben habe, ist es mir möglich einen Snapshot über fs.write zu erzeugen, wobei ich das File aber auf einem USB-Stick schreibe, da ich ungerne auf der SD-Karte (auf der das ganze Betriebssystem liegt) alle 10 Sekunden ein Bild schreiben möchte.

                      ICh denke aber das man das im Skriopt erzeugte onvif object nach dem schreiben wieder auf NULL setzen sollte (das muss ich noch testen), sonst könnte es sein, dass ich ein Object nach dem anderen generiere und das führte dann zu meinem Crash.

                      Bitte einfach mal das Skript wenn ich es gepostet habe durchsehen (sind nur wenige Zeilen) und dann Feedback geben.

                      Was ich auch nicht hinbekommen habe, ist das Bild vom USB-Stick wieder zu lesen. Vis erlaubt offensichtlich nur Dateien vom vis.0 Ordner anzuzeigen.

                      Ich hatte dann noch die Idee das über den Web-Server zu machen sozusagen eine http-Seite mit einm integrietrten link zum Bild, das hat aber leider auch nicht funktioniert. Am besten wäre es ohnehin das Bild im DRAM abzulegen und dann im VIS anzuzeigen (das wäre die beste Lösung), da habe ich aber gar keine Idee mehr wie das gehen soll.

                      ANdreas

                      1 Antwort Letzte Antwort
                      0
                      • JB_SullivanJ Offline
                        JB_SullivanJ Offline
                        JB_Sullivan
                        schrieb am zuletzt editiert von
                        #35

                        Schön das dieser Thread gerade so zeitnah bearbeitet wird.

                        Ich versuche nämlich auch meine Kameras ins VIS einzubinden. Da ich im Skript Bereich von iobroker keine Fehler angezeigt bekomme, gehe ich mal davon aus das ich die node_onvif Installation erfolgreich hinter mich gebracht habe.

                        Ich habe mit dem hier empfohlenen Programm ONVIF Device Manager, alle Informationen aus meinen Kameras heraus bekommen die ich wohl brauchen werde. Somit habe ich im Skript die IP, den ONVIF Port und den Token Parameter entsprechen geändert. Benutzername und Password ist eh klar.

                        Leider bekomme ich in der Objekt Anzeige aber nur "false" Werte für die verschiedenen Funktionen. Auch in dem Widget was hier gepostet wurde, bleibt ein mögliches Bild (Stream?) bislang aus.

                        Wäre cool wenn mir jemand ein bisschen auf die Sprünge helfen könnte. Ich bin noch relativ neu bei iobroker dabei und hatte in der letzen Woche mehr mit ausprobieren und "kämpfen" der iobroker Installation auf verschiedenen Hardware Systemen zu tun.

                        9724_2018-11-28_09_54_54-objects_-_iobroker.png

                        ioBroker auf Intel Core i3-5005U NUC und Windwos10 Pro

                        1 Antwort Letzte Antwort
                        0
                        • R Offline
                          R Offline
                          RandyAndy
                          schrieb am zuletzt editiert von
                          #36

                          Hi,

                          so jetzt habe ich mal alles zusammengeschrieben wie ich vorgegangen bin.

                          Vorweg den ganzen PTZ Kram habe ich über Board geworfen, da meine Kameras fest verbaut sind und Bewegungen, Zoom usw. nicht besitzen.

                          Da ich meine Kameras über VPN eingebunden habe ist für mich der Daten-Traffic noch ein wichtiges Kriterium, daher möchte ich nur alle 10 - 15 Sekunden ein Bild übertragen. Einen Stream habe ich erst mal kein Interesse (aber natürlich wenn es einer hinbekommt wäre das hilfreich).

                          So nun zum Vorgehen:

                          • Zunächst muß man über die Konsole in den Ordner "opt/iobroker/node_modules/iobroker.javascript" wechseln

                          • dort installiert man über "npm install -s node-onvif" den benötigten Adapter (Ich habe versucht node-onvif im im Verzeichnis node_modules von iobroker zu installieren, das hat aber eine Fehlermeldung erzeugt. Kann man sicher anpassen aber was soll es.

                          • Danach habe ich folgendes Skript erstellt:

                          const onvif = require('node-onvif');
                          const fs = require('fs');
                          
                          // Create an OnvifDevice object
                          let device = new onvif.OnvifDevice({
                            xaddr: 'http://192.168.xx.xx:port/onvif/device_service',
                            user : 'user (der onvif user)',
                            pass : 'password (onvif password)'
                          });
                          
                          // Initialize the OnvifDevice object
                          device.init().then(() => {
                            // Get the data of the snapshot
                            console.log('fetching the data of the snapshot...');
                            return device.fetchSnapshot();
                          }).then((res) => {
                            // Save the data to a file
                            fs.writeFileSync('/home/pi/snapshot.jpg', res.body, {encoding: 'binary'});
                            console.log('Done!');
                            device = null;
                            // habe ich noch eingefügt, da ich mir nicht sicher bin ob das device auch wirklich wieder frei gegeben wird insb. wenn ich es in einem CRON - Job laufen lasse
                          }).catch((error) => {
                            console.error(error);
                          });
                          
                          

                          Ich verwende eine Hikvision Kamera und damit das funktioniert muss man natürlich den onvif Zugang aktivieren und einen user definieren.

                          Ich habe auch versucht das Snapshot auf einem USB-Laufwerk zu schreiben (geht auch und das Bild wird erzeugt) aber dann kann ich es in Vis nicht integieren, offensichtlich erlaubt VIS nur den Zugriff auf Bilder im Verzeichnis opt/iobroker/iobroker-data/files/vis.0/…

                          Da wäre ein Hinweis von Euch hilfreich wie man über Vis auf eine Datei auf einem USB-Laufwerk zugreifen kann

                          1 Antwort Letzte Antwort
                          0
                          • ChaotC Offline
                            ChaotC Offline
                            Chaot
                            schrieb am zuletzt editiert von
                            #37

                            Irgendwie kriege ich das Ganze nicht eingebunden.

                            Bei mir erscheinen unter VIS - Kamera nur die Punkte "PTZ"

                            Meine Kamera kann kein PTZ.

                            Den Pfad zu stream kann ich nirgendwo finden.

                            Oder anders herum:

                            Muss ich zwingend die Ganze Geschichte so aufbauen oder besteht die Möglichkeit das Livebild direkt in VIS darzustellen?

                            Über den VLC komme ich ja problemlos auf den Stream:

                            rtsp://192.168.8.90:554/user=xxxx_password=xxxx_channel=1_stream=0.sdp?real_stream
                            

                            Aber wie binde ich den jetzt in VIS ein

                            ioBroker auf NUC unter Proxmox; VIS: 12" Touchscreen und 17" Touch; Lichtsteuerung, Thermometer und Sensoren: Tasmota (39); Ambiente Beleuchtung: WLED (9); Heizung: DECT Thermostate (9) an Fritz 6690; EMS-ESP; 1 Echo V2; 3 Echo DOT; 1 Echo Connect; 2 Echo Show 5; Unifi Ap-Ac Lite.

                            1 Antwort Letzte Antwort
                            0
                            • P Offline
                              P Offline
                              pix
                              schrieb am zuletzt editiert von
                              #38

                              Hallo,

                              bitte den ganzen Thread lesen. Hier geht’s nicht um die Einbindung in Vis, sondern um die Ansteuerung mit JavaScript per onvif, im speziellen um die Schwenks. Wenn eine Kamera keine PTZ Funktion hat, ist das Skript nicht optimal. Lösungen zum Abrufen eines Snapshots finden sich im Forum einige (inkl. z.B. PhantomJS).

                              Pix

                              ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                              1 Antwort Letzte Antwort
                              0
                              • smartboartS Offline
                                smartboartS Offline
                                smartboart
                                schrieb am zuletzt editiert von
                                #39

                                Hi ist die Kommunikation mittels onvif nur in Richtung Kamera moeglich? Oder kann man auch eine bewegungserkennung der Kamera einlesen um als trigger zu benutzen? Hat jemand mal den onvif Adapter ausprobiert (iobroker. Onvif) forked von kirovilya?

                                Gesendet von meinem CLT-L09 mit Tapatalk

                                1 Antwort Letzte Antwort
                                -1
                                • DerMichaD Offline
                                  DerMichaD Offline
                                  DerMicha
                                  schrieb am zuletzt editiert von DerMicha
                                  #40

                                  Hi Leute,
                                  ich probiere seit kurzem auch mit IOBroker, SmartHome und IP-Kamera herum. Mit meiner Kamera komme ich aber irgendwie nicht weiter..
                                  Ich habe das Skript von RandyAndy genommen und Bilder von meiner Cam in ../Vis.0 gespeichert und dann in der Vis mit Image eingefügt. das ganze dann im 10 Sekunden takt dank Cron.
                                  Danach habe ich den Speicherpfad um einen Unterordner erweitert und schon geht nix mehr. Ich habe den Speicherpfad wieder auf den Ursprung geändert und trotzdem die gleiche Fehlermeldung:
                                  "21:21:52.665 error javascript.0 script.js.Kamera.KameraTest: Error: 500 Web Error"
                                  Hat jemand eine Idee was das Problem sein könnte?
                                  Hat ja vorher funktioniert.
                                  Leider behersche ich Javascript nicht wirklich.

                                  1 Antwort Letzte Antwort
                                  0
                                  • aurodionovA Offline
                                    aurodionovA Offline
                                    aurodionov
                                    schrieb am zuletzt editiert von
                                    #41

                                    https://github.com/Haba1234/ioBroker.onvif/blob/master/README.md

                                    Пишу с пульта….

                                    1 Antwort Letzte Antwort
                                    0
                                    • DerMichaD Offline
                                      DerMichaD Offline
                                      DerMicha
                                      schrieb am zuletzt editiert von wendy2702
                                      #42

                                      Was ich schon komisch finde ist, dass laut der Beschreibung nach dem Scannen und Einbinden der Kamera ein Snapshot in der Instanz angezeigt werden sollte. Macht der aber nicht.
                                      Trotzdem hat das Holen und Speichern des Bildes ja am Anfang funktioniert und jetzt wird immer "Error: 500 Web Error" angezeigt.
                                      Hier das verwendete Skript:

                                      function kameraSnapshot() {
                                      
                                      const onvif = require('node-onvif');
                                      //const fs = require('fs');
                                      
                                      // Create an OnvifDevice object
                                      let device = new onvif.OnvifDevice({
                                        xaddr: 'http://192.168.2.88:2000/onvif/device_service',
                                        user : 'nutzer',
                                        pass : 'passwort'
                                      });
                                      
                                      // Initialize the OnvifDevice object
                                      device.init().then(() => {
                                        // Get the data of the snapshot
                                        console.log('fetching the data of the snapshot...');
                                        return device.fetchSnapshot();
                                      }).then((res) => {
                                        // Save the data to a file
                                        fs.writeFileSync('/opt/iobroker/iobroker-data/files/vis.0/snapshot.jpg', res.body, {encoding: 'binary'});
                                        console.log('Done!');
                                        device = null;
                                        // habe ich noch eingefügt, da ich mir nicht sicher bin ob das device auch wirklich wieder frei gegeben wird insb. wenn ich es in einem CRON - Job laufen lasse
                                      }).catch((error) => {
                                        console.error(error);
                                      })
                                      } //Ende kameraSnapshot
                                      schedule('*/60 * * * * *', kameraSnapshot); // alle X Minuten
                                      setTimeout(kameraSnapshot, 2000);;
                                      

                                      OnvifInstanz.PNG
                                      OnvifObjekt.PNG

                                      1 Antwort Letzte Antwort
                                      0
                                      • P pix

                                        Hallo,

                                        nach langem Tüfteln habe ich es diesen Sommer geschafft, meine ONVIF Kamera einzubinden.

                                        Es wird ein Node-Modul benötigt, dass im Javascript Adapter eingestellt werden muss (https://www.npmjs.com/package/node-onvif von futomi (https://github.com/futomi/node-onvif/tree/master/sample))

                                        /* Kinderzimmer Kamera 1 ONVIF
                                        Steuerung meiner einzigen ONVIF Kamera via Javascript
                                        https://github.com/futomi/node-onvif/tree/master/sample
                                          hostname: "192.168.178.XXX",
                                         username: "username",
                                         password: "passwort"
                                        
                                        Presets direkt in Kamera-Webserver (sihe hostname) speichern.
                                        Todo: 
                                        Presets speichern und dabei Snapshot für Preview in vis.0 speichern
                                        Presets löschen und dabei neutrales Vorschaubild in vis.0 erstellen
                                        Wie AutoPan oder Pattern oder Tour aufrufen?
                                        23.07.2017 Presets zugefügt
                                        14.08.2017 Test beendet, umbeannt
                                        */
                                        const fC = false;
                                        const logging = false;
                                        const dest_path = '/Users/pix/Documents/iobroker/iobroker-data/webcam/'; // OS X Pfad
                                        const pfad = 'javascript.' + instance + '.VIS.Kamera.1.PTZ.';
                                        const idSpeed     = pfad + 'Geschwindigkeit';
                                        const idStoppzeit = pfad + 'Stoppzeit';
                                        const idStopp =     pfad + 'Stopp';
                                        const idRechts =    pfad + 'rechts';
                                        const idLinks =     pfad + 'links';
                                        const idHoch =      pfad + 'hoch';
                                        const idRunter =    pfad + 'runter';
                                        const idZoomIn =    pfad + 'ZoomIn';
                                        const idZoomOut =   pfad + 'ZoomOut';
                                        const idGotoPreset =   pfad + 'gotoPreset';
                                        const onvif = require('node-onvif');
                                        const fs = require('fs');
                                        createState(idSpeed, 1, fC, {
                                           def: 1,
                                           min: 0,
                                           max: 1,
                                           name: 'Kamera 1 PTZ Geschwindkeit bei Bewegung',
                                           desc: 'Geschwindigkeit von 0-1 bei der Bewegung',
                                           type: 'number'
                                        });
                                        createState(idStoppzeit, 1, fC, {
                                           def: 0,
                                           min: 0,
                                           name: 'Kamera 1 PTZ Stoppzeit',
                                           desc: 'Dauer in Sekunden bis zum Stopp der Bewegung',
                                           type: 'number',
                                           unit: 's'
                                        });
                                        createState(idStopp, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ Stopp',
                                           desc: 'Sofortiger Stopp der Bewegung',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idRechts, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ rechts',
                                           desc: 'Bewegung nach rechts',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idLinks, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ links',
                                           desc: 'Bewegung nach links',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idHoch, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ oben',
                                           desc: 'Bewegung nach oben',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idRunter, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ unten',
                                           desc: 'Bewegung nach unten',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idZoomIn, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ Zoom in',
                                           desc: 'Bild vergößern',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idZoomOut, false, fC, {
                                           def: false,
                                           name: 'Kamera 1 PTZ Zoom out',
                                           desc: 'Bild verkleinern',
                                           type: 'boolean',
                                           role: 'switch'
                                        });
                                        createState(idGotoPreset, 0, fC, {
                                           def:  0,
                                           name: 'Kamera 1 PTZ Preset Wähler',
                                           desc: 'Preset auswählen (Zahlen von 1 bis X)',
                                           type: 'number'
                                        });
                                        /*
                                        log('Start the discovery process.');
                                        // Find the ONVIF network cameras
                                        onvif.startDiscovery((info) => {
                                         // Show the device name and the URL of the end point
                                         log('- ' + info.urn);
                                         log('  - ' + info.name);
                                         log('  - ' + info.xaddrs[0]);
                                        });
                                        // Stop the discovery process in 3 seconds
                                        setTimeout(() => {
                                         onvif.stopDiscovery(() => {
                                           log('Stopped the discovery process.');
                                        
                                         });
                                        }, 3000);
                                        */
                                        // Create an OnvifDevice object
                                        const device = new onvif.OnvifDevice({
                                           xaddr: 'http://192.168.178.xxx:8999/onvif/device_service',
                                           user : 'username',
                                           pass : 'passwort'
                                        });
                                        function movePTZ (ptz_x, ptz_y, ptz_z, stoptime) {
                                           // https://github.com/futomi/node-onvif#ptzmoveparams-callback
                                           device.init((error) => {
                                               if (error) {
                                                   log('[ERROR] ' + error.message);
                                                   return;
                                               } else {
                                                   // +++ CONTROL via PTZ 
                                                   var ptzlog = '';
                                                   ptz_x = (ptz_x <=1 && ptz_x >=-1) ? ptz_x : 0;
                                                   ptz_y = (ptz_y <=1 && ptz_y >=-1) ? ptz_y : 0;
                                                   ptz_z = (ptz_z <=1 && ptz_z >=-1) ? ptz_z : 0;
                                                   if (ptz_x > 0) ptzlog = 'Schwenk nach rechts';
                                                   if (ptz_x < 0) ptzlog = 'Schwenk nach links';
                                                   if (ptz_y > 0) ptzlog = 'Schwenk nach oben';
                                                   if (ptz_y < 0) ptzlog = 'Schwenk nach unten';
                                                   if (ptz_z > 0) ptzlog = 'Zoom in';
                                                   if (ptz_z < 0) ptzlog = 'Zoom out';
                                                   ptzlog += ' für ' + stoptime + 's';
                                                   if (logging) log(ptzlog);
                                                   // Create the parameters
                                                   var params = {
                                                       'speed': {
                                                           x: ptz_x, // Speed of pan (in the range of -1 to 1.0)
                                                           y: ptz_y, // Speed of tilt (in the range of -1 to 1.0)
                                                           z: ptz_z  // Speed of zoom (in the range of -1 to 1.0)
                                                       },
                                                       'timeout': 30 // seconds
                                                   };
                                                   // Move the camera
                                                   device.ptzMove(params, (error) => {
                                                       if (error) {
                                                           log(error.message, 'error');
                                                       } else {
                                                           log('Camera moved!');
                                                       }
                                                   });
                                        
                                                   // Stop to the PTZ in X seconds
                                                   setTimeout(() => {
                                                       device.ptzStop((error) => {
                                                           if (error) {
                                                               log(error.message, 'error');
                                                           } else {
                                                               log('Succeeded to stop after ' + stoptime + ' seconds.');
                                                           }
                                                       });
                                                   }, stoptime * 1000);  // stopzeit
                                               }
                                           });
                                        }
                                        function stopMoving () {
                                           device.ptzStop((error) => {
                                               if (error) {
                                                   log(error.message, 'error');
                                               } else {
                                                   log('Succeeded to stop.');
                                               }
                                           });
                                        }
                                        // https://github.com/futomi/node-onvif#gotopresetparams-callback-method
                                        function gotoPreset (presetNumber) { // 1,2,3 kommt als ganze Zahl
                                           if (presetNumber > 0) {
                                               device.init((error) => {
                                                   if (error) {
                                                       log('[ERROR] ' + error.message, 'error');
                                                       return;
                                                   } /*else {*/
                                                   // The OnvifServicePtz object
                                                   var ptz = device.services.ptz;
                                                   if (ptz) {
                                                       //var profile = device.getCurrentProfile(); // debug
                                                       //log(JSON.stringify(profile, null, '  ')); // debug log
                                        
                                                       var params = {
                                                           'ProfileToken': 'MainStream',
                                                           'PresetToken' : presetNumber.toString(),
                                                           'Speed'       : {'x': 1, 'y': 1, 'z': 1}
                                                       };
                                        
                                                       device.services.ptz.gotoPreset(params, (error, result) => {
                                                           if (error) {
                                                               log('[ERROR] ' + error.message, 'error');
                                                           } else {
                                                               if (logging) log('Preset: ' + JSON.stringify(result.data, null, '  ')); // statt result.['data']
                                                               log('Camera moved to Preset #' + presetNumber.toString());
                                                           }
                                                       });
                                                   } else {
                                                       log('[ERROR] Your ONVIF network camera does not support the PTZ service.');
                                                   }
                                                   //}
                                               });
                                           } else {
                                               log('Preset für Kamera 1 kein valider Preset-Wert'); // debug log
                                           }
                                        }
                                        // Bild an telegram schicken
                                        function sendImage (pfad, bildtext) {
                                           setTimeout(function() {
                                               sendTo('telegram.1', {
                                                   text: pfad,
                                                   caption: bildtext
                                               });
                                               log('Webcam Bild per telegram verschickt');
                                           }, 2 * 1000);
                                        }
                                        function saveImage () {
                                               // Initialize the OnvifDevice object
                                               device.init((error) => {
                                                   if (error) {
                                                       log('[ERROR] ' + error.message, 'error');
                                                       return;
                                                   } else {
                                                       if (logging) log('The OnvifDevice object has been initialized successfully.');
                                                       // +++ Get the detailed device information
                                                       var device_info = device.getInformation();
                                                       if (logging) log(JSON.stringify(device_info, null, '  '));
                                                       // +++ Get the UDP stream URL
                                                       var url = device.getUdpStreamUrl();
                                                       if (logging) log('UDP-Stream: ' + url);
                                        
                                                       // +++ Get Profile
                                                       var profile = device.getCurrentProfile();
                                                       if (logging) log('Profile: ' + JSON.stringify(profile, null, '  ')); // Viele Infos
                                                       // für debug: 
                                                       //log('http: ' + profile.stream.http);
                                        
                                                       var cam_info = 'ONVIF Bild' + '\n'
                                                                    + 'Model: ' + device_info.Model + '\n'
                                                                    + 'Firmware: ' + device_info.FirmwareVersion + '\n'
                                                                    + 'Seriennummer: ' + device_info.SerialNumber + '\n'
                                                                    + 'Harware ID: ' + device_info.HardwareId + '\n'
                                                                    + 'RTSP-Stream: ' + url;     
                                        
                                                       // +++ Get the data of the snapshot
                                                       log('fetching the data of the snapshot...');
                                                       device.fetchSnapshot((error, res) => {
                                                           if (error) {
                                                               log(error.message, 'error');
                                                               return;
                                                           }
                                                           // Save the data to a file and send via telegram
                                                           fs.writeFile(dest_path + 'onvif_snapshot.jpg', res.body, function (error) { // Anpassen an die OS X gegebenheiten (oder per Telegram senden)
                                                               if (error) {
                                                                   log(error.message, 'error');
                                                               } else {
                                                                   sendImage(dest_path + 'onvif_snapshot.jpg', cam_info);
                                                                   log('Image sent!');
                                                               }
                                                           });
                                                       });
                                                   }
                                               });    
                                        }
                                        // Start beim Setzen auf true
                                        // Links
                                        on(idLinks, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              var stoppzeit = getState(idStoppzeit).val;
                                              var speed = getState(idSpeed).val;
                                              movePTZ(-1 * speed , 0, 0, stoppzeit);
                                              setStateDelayed(idLinks, false, 500); // ggf , 500 + (stoppzeit * 1000)
                                           }
                                        });
                                        // rechts
                                        on({id: idRechts, val: true}, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              var stoppzeit = getState(idStoppzeit).val;
                                              var speed = getState(idSpeed).val;
                                              movePTZ(1 * speed , 0, 0, stoppzeit);
                                              setStateDelayed(idRechts, false, 500);
                                           }
                                        });
                                        // oben
                                        on(idHoch, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              var stoppzeit = getState(idStoppzeit).val;
                                              var speed = getState(idSpeed).val;
                                              movePTZ(0, 1 * speed, 0, stoppzeit);
                                              setStateDelayed(idHoch, false, 500, 500);
                                           }
                                        });
                                        // rechts
                                        on(idRunter, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              var stoppzeit = getState(idStoppzeit).val;
                                              var speed = getState(idSpeed).val;
                                              movePTZ(0, -1 * speed, 0, stoppzeit);
                                              setStateDelayed(idRunter, false, 500);
                                           }
                                        });
                                        // vergrößern
                                        on(idZoomIn, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              var stoppzeit = getState(idStoppzeit).val;
                                              var speed = getState(idSpeed).val;
                                              movePTZ(0, 0, 1 * speed, stoppzeit);
                                              setStateDelayed(idZoomIn, false, 500);
                                           }
                                        });
                                        // verkleinern
                                        on(idZoomOut, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              var stoppzeit = getState(idStoppzeit).val;
                                              var speed = getState(idSpeed).val;
                                              movePTZ(0, 0, -1 * speed, stoppzeit);
                                              setStateDelayed(idZoomOut, false, 500);
                                           }
                                        });
                                        // sofortiger Stopp
                                        on(idStopp, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              stopMoving();
                                              setStateDelayed(idStopp, false, 500);
                                              setState(idGotoPreset, 0);
                                           }
                                        });
                                        // bei Bedienung aller Knöpfe sofert Preset Anzeige löschen 
                                        // klappt noch nicht so richtig, da laufende Fahrt zum Presetpunkt noch beendet wird
                                        on({
                                           id: [idStopp, idZoomOut, idZoomIn, idRunter, idHoch, idRechts, idLinks], 
                                           change: 'any'
                                        }, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              setState(idGotoPreset, 0);
                                           }
                                        });
                                        // zum bereits gespeicherten Preset X fahren (Ganze Zahl, kommt aus VIS, Scenes oder Script)
                                        on(idGotoPreset, function (obj) {
                                           if (!obj.state.ack && obj.state.val) {
                                              gotoPreset(parseInt(obj.state.val,10)); // wird später zu einem String gewandelt
                                              //setStateDelayed(idGotoPreset, 0, 500); // reset
                                           }
                                        });
                                        // Skriptstart
                                        //setTimeout(saveImage, 15000);
                                        // setTimeout(goHome, 1000);
                                        /*
                                        setTimeout(function() {
                                           movePTZ(1,0,0,5); // rechts, 2 sek
                                        }, 1000);
                                        */
                                        
                                        

                                        So wie das Skript hier veröffentlicht ist, läuft es bei mir (natürlich noch Nutzernamen, Passwort und Kamera-IP:Onvif-Pport anpassen).

                                        Durch setzen der Objekte kann die Kamera bewegt werden. Sieht dann bei mir so aus: 261_bildschirmfoto_2017-11-01_um_22.55.06.png
                                        Die drei Presets habe ich natürlich in der Kamera gespeichert, aber das Node-Modul lässt es auch zu, dort Positionen festzulegen und abzufahren. War mir zu aufwendig 8-) .

                                        Viel Erfolg! :D

                                        Gruß

                                        Pix

                                        PS: Leider habe ich derzeit, überhaupt keine Zeit, daraus einen Adapter zu machen. Aber geplant ist es eigentlich schon :roll:

                                        Edit 7.3.2019 nach Portierung ins neue Forum Skript bereinigt

                                        smartboartS Offline
                                        smartboartS Offline
                                        smartboart
                                        schrieb am zuletzt editiert von smartboart
                                        #43

                                        @pix Hi pix kannst du das script nochmal hochladen? Durch die Umstellung im Forum scheint es etwas durcheinander geraten zu sein.

                                        1 Antwort Letzte Antwort
                                        0
                                        • S schittl

                                          @pix:

                                          Öhömmm :oops: Da habe ich wohl den Aufruf vergessen. Oder vielmehr habe ich vergessen, den Telegram Teil nach dem testen wieder rauszulöschen, denn das Zusenden nach Bewegungsalarm mache ich woanders. `

                                          Hi Pix,

                                          danke für das Script. Genial! Könntest Du mir vielleicht mitteilen wie Du das Zusenden nach Bewegungsalarm gelöst hast?

                                          vg

                                          Falk

                                          P Offline
                                          P Offline
                                          pix
                                          schrieb am zuletzt editiert von
                                          #44

                                          @schittl Habe das Skript ganz oben im Thread nochmal bereinigt. Nach der Protierung zum neuen Forum haben sich tatsächlich einige falsche Zeichen eingeschlichen

                                          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                          smartboartS metaxaM 2 Antworten Letzte Antwort
                                          1
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          778

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe