Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. ioBroker Allgemein
  4. Synology Surveillance Station API

NEWS

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

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

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

Synology Surveillance Station API

Synology Surveillance Station API

Scheduled Pinned Locked Moved ioBroker Allgemein
181 Posts 51 Posters 61.4k Views 35 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • lobomauL Offline
    lobomauL Offline
    lobomau
    wrote on last edited by
    #18

    @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?

    Host: NUC8i3 mit Proxmox:

    • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
    • Slave: Pi4
    1 Reply Last reply
    0
    • K Offline
      K Offline
      krissi
      wrote on last edited by
      #19

      Hi, ich tipp mal auf

      var sid = 0;

      @lobomau:

      Aber wo wird die sid der Camera eingetragen? `

      ioBroker in VM (unraid) / CCU2 für IP FB-Heizungssteuerung raspi3 / 3x Echo Dot / IKEA Tradfri / zigBee mit Conbee II

      1 Reply Last reply
      0
      • Alex1808A Offline
        Alex1808A Offline
        Alex1808
        wrote on last edited by
        #20

        doppelpost

        1 Reply Last reply
        0
        • Alex1808A Offline
          Alex1808A Offline
          Alex1808
          wrote on last edited by
          #21

          @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
          0
          • Alex1808A Offline
            Alex1808A Offline
            Alex1808
            wrote on last edited by
            #22

            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
            0
            • T Offline
              T Offline
              Trident
              wrote on last edited by
              #23

              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
              0
              • lobomauL Offline
                lobomauL Offline
                lobomau
                wrote on last edited by
                #24

                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?

                Host: NUC8i3 mit Proxmox:

                • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                • Slave: Pi4
                1 Reply Last reply
                0
                • lobomauL Offline
                  lobomauL Offline
                  lobomau
                  wrote on last edited by
                  #25

                  @Trident:

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

                  Host: NUC8i3 mit Proxmox:

                  • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                  • Slave: Pi4
                  1 Reply Last reply
                  0
                  • T Offline
                    T Offline
                    Trident
                    wrote on last edited by
                    #26

                    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
                    0
                    • lobomauL Offline
                      lobomauL Offline
                      lobomau
                      wrote on last edited by
                      #27

                      @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);
                      

                      Host: NUC8i3 mit Proxmox:

                      • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                      • Slave: Pi4
                      1 Reply Last reply
                      0
                      • lobomauL Offline
                        lobomauL Offline
                        lobomau
                        wrote on last edited by
                        #28

                        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); `

                        Host: NUC8i3 mit Proxmox:

                        • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                        • Slave: Pi4
                        1 Reply Last reply
                        0
                        • B Offline
                          B Offline
                          bku
                          wrote on last edited by
                          #29

                          Super, funktioniert auch bei mir!

                          Gruß und Danke

                          Bernd

                          1 Reply Last reply
                          0
                          • lobomauL Offline
                            lobomauL Offline
                            lobomau
                            wrote on last edited by
                            #30

                            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?

                            Host: NUC8i3 mit Proxmox:

                            • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                            • Slave: Pi4
                            1 Reply Last reply
                            0
                            • Alex1808A Offline
                              Alex1808A Offline
                              Alex1808
                              wrote on last edited by
                              #31

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

                              1 Reply Last reply
                              0
                              • lobomauL Offline
                                lobomauL Offline
                                lobomau
                                wrote on last edited by
                                #32

                                @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.

                                Host: NUC8i3 mit Proxmox:

                                • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                                • Slave: Pi4
                                1 Reply Last reply
                                0
                                • Alex1808A Offline
                                  Alex1808A Offline
                                  Alex1808
                                  wrote on last edited by
                                  #33

                                  @lobomau:

                                  @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.

                                  Mache vielleicht etwas anderes, lege zwei variablen bei javascript.0, z.b. snapshot1 und snapshot2, die trägst du in beiden scripts und baue einen script mit Trieger so das er nur bei bestimmten regeln diese variablen ansteuert.

                                  1 Reply Last reply
                                  0
                                  • S Offline
                                    S Offline
                                    Semenchkare
                                    wrote on last edited by
                                    #34

                                    Hallo,

                                    ich habe seit Monaten dieses Script am laufen:

                                    Seit gestern Abend gibt es kein Bild mehr auf meinem VIS. Folgender Fehler wird angezeigt, wenn ich die API der Surveillance direkt im Browser aufrufe_

                                    > Warning: fopen([http://192.168.xxx.xxx:5000/webapi/Surv … 0NEN300004](http://192.168.xxx.xxx:5000/webapi/SurveillanceStation/videoStreaming.cgi?api=SYNO.SurveillanceStation.VideoStream&amp;version=1&amp;method=Stream&amp;cameraId=1&amp;format=mjpeg&amp;_sid=3SqyukBt6kkio15A0NEN300004)): failed to open stream: HTTP request failed! HTTP/1.1 502 Bad Gateway in /volume1/web/cam/stream.php on line 24 Warning: fgets() expects parameter 1 to be resource, boolean given in /volume1/web/cam/stream.php on line 28 .

                                    Ich selbst habe weder eine Firmware geändert. Höchstens auf der Synology könnte ein Auto-Update erfolgt sein.

                                    Im Einsatz ist dort die Surveillance 7.2, neueste Firmware.

                                    Hat sich etwa die API bei Surveillance geändert? Dann müsste jemand anders doch das gleiche Problem haben.

                                    Und:

                                    Ja, ich habe die Cam, die Synology etc. alles schon neu gestartet. Die Cam funktioniert per direkt-Link auch noch…

                                    Viele Grüße

                                    Semenchkare

                                    raspberry 5 8GB mit iobroker,
                                    raspberry 5 8GB mit Raspberrymatic

                                    1 Reply Last reply
                                    0
                                    • apollon77A Offline
                                      apollon77A Offline
                                      apollon77
                                      wrote on last edited by
                                      #35

                                      Hey All,

                                      geht das noch? Ich will auch mit dem Thema anfangen 🙂

                                      Bei der npm Library steht:

                                      This project is deprecated, because the api used is not existing anymore in the current DSM.

                                      … geändert vor 6 Monaten ...

                                      Ist die API noch da oder nicht? 🙂

                                      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                                      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                                      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                                      1 Reply Last reply
                                      0
                                      • lobomauL Offline
                                        lobomauL Offline
                                        lobomau
                                        wrote on last edited by
                                        #36

                                        @apollon77:

                                        Hey All,

                                        geht das noch? Ich will auch mit dem Thema anfangen 🙂

                                        Bei der npm Library steht:

                                        This project is deprecated, because the api used is not existing anymore in the current DSM.

                                        … geändert vor 6 Monaten ...

                                        Ist die API noch da oder nicht? 🙂 `
                                        Ja, also mein Script mit der API läuft noch. Fotos kommen per telegram an.

                                        Host: NUC8i3 mit Proxmox:

                                        • ioBroker CT Debian 13, npm 10.9.3, nodejs 22.20.0
                                        • Slave: Pi4
                                        1 Reply Last reply
                                        0
                                        • A Offline
                                          A Offline
                                          andyb
                                          wrote on last edited by
                                          #37

                                          Es tut sich was im Hause Synology.

                                          Die Beta der SSS hat jetzt einen "Home-Modus" der per Geofence in der App funktioniert.

                                          Mal ausprobieren…

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

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

                                          245

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe