Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Synology Surveillance Station API

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    Synology Surveillance Station API

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

      @Alex1808:

      @Trident:

      Hi,

      danke dir! Werde das sofort mal testen!

      Viele Grüße

      Trident `

      Und? Hat funktioniert? `
      Bei mir noch nicht ganz. Wie erstelle ich die .php Datei am Windows Rechner? Einfach Textdokument und php Endung ist es ja nicht.

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

        @lobomau:

        @Alex1808:

        @Trident:

        Hi,

        danke dir! Werde das sofort mal testen!

        Viele Grüße

        Trident `

        Und? Hat funktioniert? Bei mir noch nicht ganz. Wie erstelle ich die .php Datei am Windows Rechner? Einfach Textdokument und php Endung ist es ja nicht.

        Ja, z.b. mit Notepad++ ( https://notepad-plus-plus.org ), Endung logische weise muss selbst vergeben.

        1 Reply Last reply Reply Quote 0
        • S
          Solear last edited by

          @lobomau:

          Bei mir noch nicht ganz. Wie erstelle ich die .php Datei am Windows Rechner? Einfach Textdokument und php Endung ist es ja nicht. `

          In den Ordneransichtseinstellungen im Explorer unbedingt Häkchen bei "Bekannte Dateiendungen ausblenden" rausnehmen.

          Sonst siehst du die Dateiendung nicht und eine umbenannte Textdatei zu php wird in Wirklichkeit zu "text.php.txt" und kann dann natürlich nicht als php Datei funktionieren.

          Und/oder wie Alex1808 sagte bestimmte Programme wie Notepad++ benutzen, um mit "speichern unter" eine andere Dateiart festzulegen.

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

            Ich habe es mit geany erstellt… müsste genauso gehen wie mit notepad++.

            Das Format ist wohl nicht das Problem. Aber das Legen auf den Server und dann Öffnen mit Browser führe ich vermutlich falsch aus.

            Was ich mal ausprobiert habe und was einen Wert ausgibt ist in den Browser der Eintrag mit den entsprechenden individuellen Einträgen:

            http://'.$ip.':'.$port.'/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account='.$user.'&passwd='.$pass.'&session=SurveillanceStation&format=sid
            
            1 Reply Last reply Reply Quote 0
            • T
              Trident last edited by

              Hi zusammen,

              danke für die Vorschläge. ich hatte auch meine Schwierigkeiten die Umsetzung mit PHP zu realisieren. daraufhin habe ich es nochmal mit Javascript probiert und es tatsächlich zum laufen bekommen.

              Es ist noch nicht komplett allgemein gültig geschrieben. So sind Username und Passwort noch teil der URL, ebenso die KameraID. Dies könnte man schnell beheben und als Variablen oben anlegen. Die IP muss auch in den URLs der API ergänzt werden. ABER: Es klappt!

              Bei Aktualisierung der angegebenen Variablen wird das Skript ausgeführt und ein Screenshot versandt.

              var request = require("request");
              var fs = require('fs');
              var myJson = {};
              var sid = 0;
              
              function parseJson(text) {
                  if (text === "") return {};
                  try {
                      json = JSON.parse(text);
                  } catch (ex) {
                      json = {};
                  }
                  if(!json) json = {};
                  return json;
              }
              
              function readJson(url, callback) {
                  request(url, function (err, state, body){
                      if (body) {
                          var json = parseJson(body);
                          callback(null, json);
                      } else {
                          var error = "(" + err + ") ERROR bei Abfrage von: " + url;
                          log(error, "warn"); 
                          callback(error, null);
                      }
                  });
              }
              
              var url_login ='http://xxxxx:zzzz/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=XXXXX&passwd=YYYYYY&session=SurveillanceStation&format=sid';
              var url_logout = 'http://xxxxxx:zzzz/webapi/auth.cgi? api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation';
              var url_snapshot = 'http://xxxxx:zzzz/webapi/entry.cgi?camStm=1&version=8&cameraId=1&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot';
              
              function main() {
                  readJson(url_login, function(err,json) {
                      if(!err) {
                          myJson = json;
                          sid = myJson.data.sid;
              	        url_snapshot += '&_sid='+sid;
              	        url_logout += '&_sid='+sid;
              	        request.get({url: url_snapshot, encoding: 'binary'}, function (err, response, body) {
                          fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) {
                              if (err) {
                                  console.error(err);
                              } else {
                                  console.log('Snapshot sent');
                                  sendTo('telegram.0', '/tmp/snap.jpg');
                                  request.get({url: url_logout, encoding: 'binary'})
                                  }
                              }); 
                          });
                      } else {
                          log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn");
                          myJson = {};
                      }
                  });
              }
              
              on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main);
              
              

              Ich hoffe das Skript hilft euch!

              Beste Grüße

              Trident

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

                @Trident:

                Hi zusammen,

                danke für die Vorschläge. ich hatte auch meine Schwierigkeiten die Umsetzung mit PHP zu realisieren. daraufhin habe ich es nochmal mit Javascript probiert und es tatsächlich zum laufen bekommen.

                Es ist noch nicht komplett allgemein gültig geschrieben. So sind Username und Passwort noch teil der URL, ebenso die KameraID. Dies könnte man schnell beheben und als Variablen oben anlegen. Die IP muss auch in den URLs der API ergänzt werden. ABER: Es klappt!

                Bei Aktualisierung der angegebenen Variablen wird das Skript ausgeführt und ein Screenshot versandt.

                var request = require("request");
                var fs = require('fs');
                var myJson = {};
                var sid = 0;
                
                function parseJson(text) {
                    if (text === "") return {};
                    try {
                        json = JSON.parse(text);
                    } catch (ex) {
                        json = {};
                    }
                    if(!json) json = {};
                    return json;
                }
                
                function readJson(url, callback) {
                    request(url, function (err, state, body){
                        if (body) {
                            var json = parseJson(body);
                            callback(null, json);
                        } else {
                            var error = "(" + err + ") ERROR bei Abfrage von: " + url;
                            log(error, "warn"); 
                            callback(error, null);
                        }
                    });
                }
                
                var url_login ='http://xxxxx:zzzz/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=XXXXX&passwd=YYYYYY&session=SurveillanceStation&format=sid';
                var url_logout = 'http://xxxxxx:zzzz/webapi/auth.cgi? api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation';
                var url_snapshot = 'http://xxxxx:zzzz/webapi/entry.cgi?camStm=1&version=8&cameraId=1&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot';
                
                function main() {
                    readJson(url_login, function(err,json) {
                        if(!err) {
                            myJson = json;
                            sid = myJson.data.sid;
                	        url_snapshot += '&_sid='+sid;
                	        url_logout += '&_sid='+sid;
                	        request.get({url: url_snapshot, encoding: 'binary'}, function (err, response, body) {
                            fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) {
                                if (err) {
                                    console.error(err);
                                } else {
                                    console.log('Snapshot sent');
                                    sendTo('telegram.0', '/tmp/snap.jpg');
                                    request.get({url: url_logout, encoding: 'binary'})
                                    }
                                }); 
                            });
                        } else {
                            log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn");
                            myJson = {};
                        }
                    });
                }
                
                on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main);
                
                

                Ich hoffe das Skript hilft euch!

                Beste Grüße

                Trident `
                Wo muss ich genau was ersetzen?

                http://xxxxx:zzzz/webapi/auth.cgi?
                ````= IP der Synology mit 192.168.xxx.xxx:5000 (das ganze auf drei Zeilen)
                
                Dann bei````
                t=XXXXX&passwd=YYYYYY&session=Surveillance
                

                Login und Passwort fuer Synology eintragen.

                Aber wo wird die sid der Camera eingetragen?

                1 Reply Last reply Reply Quote 0
                • K
                  krissi last edited by

                  Hi, ich tipp mal auf

                  var sid = 0;

                  @lobomau:

                  Aber wo wird die sid der Camera eingetragen? `

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

                    doppelpost

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

                      @Trident:

                      Hi zusammen,

                      danke für die Vorschläge. ich hatte auch meine Schwierigkeiten die Umsetzung mit PHP zu realisieren. daraufhin habe ich es nochmal mit Javascript probiert und es tatsächlich zum laufen bekommen.

                      Es ist noch nicht komplett allgemein gültig geschrieben. So sind Username und Passwort noch teil der URL, ebenso die KameraID. Dies könnte man schnell beheben und als Variablen oben anlegen. Die IP muss auch in den URLs der API ergänzt werden. ABER: Es klappt!

                      Bei Aktualisierung der angegebenen Variablen wird das Skript ausgeführt und ein Screenshot versandt.

                      var request = require("request");
                      var fs = require('fs');
                      var myJson = {};
                      var sid = 0;
                      
                      function parseJson(text) {
                          if (text === "") return {};
                          try {
                              json = JSON.parse(text);
                          } catch (ex) {
                              json = {};
                          }
                          if(!json) json = {};
                          return json;
                      }
                      
                      function readJson(url, callback) {
                          request(url, function (err, state, body){
                              if (body) {
                                  var json = parseJson(body);
                                  callback(null, json);
                              } else {
                                  var error = "(" + err + ") ERROR bei Abfrage von: " + url;
                                  log(error, "warn"); 
                                  callback(error, null);
                              }
                          });
                      }
                      
                      var url_login ='http://xxxxx:zzzz/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=XXXXX&passwd=YYYYYY&session=SurveillanceStation&format=sid';
                      var url_logout = 'http://xxxxxx:zzzz/webapi/auth.cgi? api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation';
                      var url_snapshot = 'http://xxxxx:zzzz/webapi/entry.cgi?camStm=1&version=8&cameraId=1&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot';
                      
                      function main() {
                          readJson(url_login, function(err,json) {
                              if(!err) {
                                  myJson = json;
                                  sid = myJson.data.sid;
                      	        url_snapshot += '&_sid='+sid;
                      	        url_logout += '&_sid='+sid;
                      	        request.get({url: url_snapshot, encoding: 'binary'}, function (err, response, body) {
                                  fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) {
                                      if (err) {
                                          console.error(err);
                                      } else {
                                          console.log('Snapshot sent');
                                          sendTo('telegram.0', '/tmp/snap.jpg');
                                          request.get({url: url_logout, encoding: 'binary'})
                                          }
                                      }); 
                                  });
                              } else {
                                  log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn");
                                  myJson = {};
                              }
                          });
                      }
                      
                      on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main);
                      
                      

                      Ich hoffe das Skript hilft euch!

                      Beste Grüße

                      Trident `

                      Bei mir funktioniert nicht. Im log steht das Snapshot gesendet wird, aber im Telegramm kommt nichts an. Auch erstellte Snapshot im /tmp ist fehlerhaft und lässt sich nicht öffnen.

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

                        Sory, problem gefunden..

                        CamID wird wohl nicht am Anfang vom Skript definiert, sonder in dritte url >>
                        > var url_snapshot = 'http://xxxxx:zzzz/webapi/entry.cgi?camStm=1&version=8&cameraId=1&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot';

                        Also funktioniert, Danke! 🙂

                        1 Reply Last reply Reply Quote 0
                        • T
                          Trident last edited by

                          Hi,

                          sorry hab die Posts erst jetzt gesehen.

                          Ich hätte vielleicht mehr erklären sollen! Sorry dafür!

                          Aber Ihr habt euch ja schon alles "erraten". 🙂

                          Freut mich das es funktioniert!

                          Viele Grüße

                          Trident

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

                            Ich habe es noch nicht am Laufen.

                            Habe testweise die drei URLS einzeln in Browser eingetippt. Kommt dann folgendes:

                            1. URL:````
                            {"data":{"sid":"Suw.s8Tmr6epY15A0MPN835504"},"success":true}

                            2\. URL:````
                            {"error":{"code":101},"success":false}
                            

                            3. URL:````
                            {"error":{"code":101},"success":false}

                            
                            Ich dachte die sid waere eine feste zahl der IP CAM. Aber jedes Mal wenn die erste URL aktualisiere kommt eine neue sid!? Soll das so sein?
                            1 Reply Last reply Reply Quote 0
                            • lobomau
                              lobomau last edited by

                              @Trident:

                              on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main); `
                              muss man diese xxxx auch anpassen?

                              1 Reply Last reply Reply Quote 0
                              • T
                                Trident last edited by

                                ok, vielleicht doch nochmal eine kurze Erläuterung:

                                Die API der Surveillance Station erfordert eine Authentifizierung des jeweiligen Users. Dies erfolgt über die erste URL –> "url_login". Als Antwort erhält man eine Session_id die sid in Form eines JSON. Dies hat bei dir ja auch funktioniert!

                                Soweit so gut!

                                Das du beim aufrufen der URL im Browser (ich gehe davon aus, dass du diese "einfach" per Copy-Paste in die Adresszeile gepackt hast) kommt es zu einem Fehler, da mein Skript diese String später noch modifiziert und die erhaltene Session_ID mit übergibt.

                                
                                 url_snapshot += '&_sid='+sid;
                                 url_logout += '&_sid='+sid;
                                
                                

                                Ich tippe (habe es nicht gegoogelt) das der Code 101 etwas mit nicht authentifiziertem Zugriff bedeutet.

                                Die Zeile:

                                 on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main);
                                
                                

                                Muss angepasst werden, da diese determiniert, wann das Skript überhaupt gestartet wird, sprich auf welche Variable ioBroker horcht.

                                Ich hoffe das hilft!

                                Beste Grüße

                                Trident

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

                                  @Trident:

                                  ok, vielleicht doch nochmal eine kurze Erläuterung:

                                  Die API der Surveillance Station erfordert eine Authentifizierung des jeweiligen Users. Dies erfolgt über die erste URL –> "url_login". Als Antwort erhält man eine Session_id die sid in Form eines JSON. Dies hat bei dir ja auch funktioniert!

                                  Soweit so gut!

                                  Das du beim aufrufen der URL im Browser (ich gehe davon aus, dass du diese "einfach" per Copy-Paste in die Adresszeile gepackt hast) kommt es zu einem Fehler, da mein Skript diese String später noch modifiziert und die erhaltene Session_ID mit übergibt.

                                   
                                   url_snapshot += '&_sid='+sid;
                                   url_logout += '&_sid='+sid;
                                  
                                  

                                  Ich tippe (habe es nicht gegoogelt) das der Code 101 etwas mit nicht authentifiziertem Zugriff bedeutet.

                                  Die Zeile:

                                   on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main);
                                  
                                  

                                  Muss angepasst werden, da diese determiniert, wann das Skript überhaupt gestartet wird, sprich auf welche Variable ioBroker horcht.

                                  Ich hoffe das hilft!

                                  Beste Grüße

                                  Trident `
                                  Danke. Bin wieder einen Schritt weiter. Ich bekomme ein snapshot durch einsetzen in Browser. Dazu musste ich cameraID=2 nehmen.

                                  In welche Form trage ich die Variable in der letzten Zeile ein?

                                  Habe so probiert

                                  on({id: hm-rpc.0.KEQ0198416.1.STATE/* variable aktualiseren um snapshot zu versenden*/}, main);
                                  

                                  Gibt aber da einen syntax error

                                  EDIT: korrekt ist:

                                  on({id: "hm-rpc.0.KEQ0198416.1.STATE"/* variable aktualiseren um snapshot zu versenden*/}, main);
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • lobomau
                                    lobomau last edited by

                                    Ich habe es endlich hinbekommen 😄

                                    Cooles Script!

                                    Ich habe hier mal alles rot markiert was selbst angepasst werden muss.

                                    In der dritten URL Zeile muss man die cameraID anpassen, in meinem Fall funktioniert es mit der "2".

                                    ` > var request = require("request");

                                    var fs = require('fs');

                                    var myJson = {};

                                    var sid = 0;

                                    function parseJson(text) {

                                    if (text === "") return {};

                                    try {

                                    json = JSON.parse(text);

                                    } catch (ex) {

                                    json = {};

                                    }

                                    if(!json) json = {};

                                    return json;

                                    }

                                    function readJson(url, callback) {

                                    request(url, function (err, state, body){

                                    if (body) {

                                    var json = parseJson(body);

                                    callback(null, json);

                                    } else {

                                    var error = "(" + err + ") ERROR bei Abfrage von: " + url;

                                    log(error, "warn");

                                    callback(error, null);

                                    }

                                    });

                                    }

                                    var url_login ='http://192.168.178.24:5000/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=user_synology&passwd=Passwort_synology&session=SurveillanceStation&format=sid';

                                    var url_logout = 'http://192.168.178.24:5000/webapi/auth.cgi? api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation';

                                    var url_snapshot = 'http://192.168.178.24:5000/webapi/entry.cgi?camStm=1&version=8&cameraId=2&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot';

                                    function main() {

                                    readJson(url_login, function(err,json) {

                                    if(!err) {

                                    myJson = json;

                                    sid = myJson.data.sid;

                                    url_snapshot += '&_sid='+sid;

                                    url_logout += '&_sid='+sid;

                                    request.get({url: url_snapshot, encoding: 'binary'}, function (err, response, body) {

                                    fs.writeFile("/tmp/snap.jpg", body, 'binary', function(err) {

                                    if (err) {

                                    console.error(err);

                                    } else {

                                    console.log('Snapshot sent');

                                    sendTo('telegram.0', '/tmp/snap.jpg');

                                    request.get({url: url_logout, encoding: 'binary'})

                                    }

                                    });

                                    });

                                    } else {

                                    log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn");

                                    myJson = {};

                                    }

                                    });

                                    }

                                    on({id: "hm-rpc.0.MEQ0692930.1.MOTION"/* variable aktualiseren um snapshot zu versenden*/}, main); `

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

                                      Super, funktioniert auch bei mir!

                                      Gruß und Danke

                                      Bernd

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

                                        Ich versuche gerade meine zweite cam mit einzubinden fuer snapshots.

                                        Meine zweite cam hat die ID 4 und mit der Aenderung funktioniert die zweite cam <u>alleine</u>:

                                        var url_snapshot = 'http://192.168.178.24:5000/webapi/entry.cgi?camStm=1&version=8&cameraId=4&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot';
                                        

                                        Was ich bisher versucht habe:

                                        • einfach die URL-Zeile zweimal schreiben, nur mit unterschiedlicher cameraID -> kommt nur ein Foto

                                        • zwei Scripte geschrieben fuer jede cam ein eigenes: geht manchmal aber nicht immer (mal 1 Foto, mal 2). Ich denke der gleichzeitige Befehl an beide cams ist suboptimal. Ich stelle mir vor beide in ein Script zu schreiben und einfach ein kleines delay zwischen beiden snapshots, 250ms, einzubauen.

                                        Aber wie macht man das?

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

                                          eigentlich mit dem zwei scripts soll gehen, was hast als Trieger?

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

                                            @Alex1808:

                                            eigentlich mit dem zwei scripts soll gehen, was hast als Trieger? `
                                            Zum Testen benutze ich einen homematic Lichtschalter. Sonst den Bewegungsmelder,innen von HM.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            976
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            51
                                            181
                                            50204
                                            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