Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. API-Zugriff (hier: Reolink API)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    API-Zugriff (hier: Reolink API)

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

      Hallo zusammen,
      ich versuche auf Basis dieser API-Dokumentation:
      https://drive.google.com/drive/folders/1qvKcKswNJP_-G0tTbs_JQOuO67QqujfB
      auf meine Reolink-Kamera zuzugreifen und in Vis eine Steuerung der PAN und TILT Funktionen zu implementieren.

      Bei der Umsetzung der dort beschriebene Funktionsaufrufe in Javascript komme ich nicht weiter.
      Wie kann z.B. das hier (Seite 15)...

      Token by sending a login request. 
      
      1. get token first:
      
      The login request url:
      https://<camera_ip>/api.cgi?cmd=Login
      The request body:
      [
      { "cmd":"Login", "param":{ "User":{ "Version": "0", "userName":"admin", "password":"xxxxxx"
      }
      }
      }
      ]
      
      Response:
      [
      {
      "cmd" : "Login",
      "code" : 0,
      "value" : {
      "Token" : {
      "leaseTime" : 3600,
      "name" : "42da7586d7b82a6"
      }
      }
      }
      ]
      

      ... in Javascript umgesetzt werden?

      Mit Fiddler konnte ich die Befehle absetzen und bekomme auch die richtigen Werte zurück. Grundsätzlich scheint es also zu funktionieren. Ich scheitere einfach an der Umsetzung in Javascript 😞

      So sieht die Abfrage des Token in Fiddler aus..

      caadcfd0-aec2-47f9-8317-741f8bde844f-image.png

      ... und so...

      57f24e47-8b9f-4b33-9307-20a4d9bd7ebb-image.png
      ... das Feedback

      Der Token (oder das Token?) wird also zurück geliefert.

      Gruß
      Peter

      mickym Neuschwansteini 2 Replies Last reply Reply Quote 0
      • mickym
        mickym Most Active @PeZi last edited by mickym

        gelöscht

        1 Reply Last reply Reply Quote 0
        • Neuschwansteini
          Neuschwansteini @PeZi last edited by

          @pezi

          Funktioniert das mit dem Reolink Adapter nicht?

          P 1 Reply Last reply Reply Quote 0
          • P
            PeZi @Neuschwansteini last edited by

            @ilovegym
            Mit dem Reolink Adapter kann man "nur" auf die voreingestellten Presets gehen oder die Pfade abfahren. Ein direktes Ansteuern von PAN und TILD ist damit leider nicht möglich.

            Neuschwansteini 1 Reply Last reply Reply Quote 0
            • Neuschwansteini
              Neuschwansteini @PeZi last edited by

              @pezi

              Ah, ok, ich hab zwar Reolink kameras, aber keine mit PTZ.. das ist aber auch ein Feature-Request fuer den Adapter.. da gehoert es doch letztendlich hin.. 🙂
              Aber natuerlich auch super, wenn du es so hinbekommst...

              Bei Problemen mit Javascript erstelle ich mir gern das mit Blockly, und lasse mir den Code dann im Adapter anzeigen, um zu kapieren, wie was wo.. ist ne gute Hilfe..

              P 1 Reply Last reply Reply Quote 0
              • P
                PeZi last edited by PeZi

                Für alle, die vor dem gleichen Problem stehen, hier eine Lösung zur Ermittlung des Tokens:

                'use strict'
                
                // Token für Kamera 3 ermitteln aund speichern
                schedule("*/30 * * * *", async () => {
                    httpPost('http://192.168.22.42/api.cgi?cmd=Login', '[{ "cmd":"Login", "param":{ "User":{ "Version": 0, "userName":"YYYYYY", "password":"XXXXXXXX"}}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                        let ergebnis=('' + response.data)
                        let position=0;
                        let suche = ergebnis.indexOf('"name" : "', position); 
                
                //Hier ist noch zu prüfen, on das Token IMMER genau 15 Zeichen lang ist. Ggf. muss der Filter angepasst werden!
                
                        let Token = ergebnis.slice(suche+10, suche + 25);
                        setState('0_userdata.0.Token_Kamera3', Token, true);
                    });
                });
                
                OliverIO 1 Reply Last reply Reply Quote 1
                • P
                  PeZi @Neuschwansteini last edited by

                  @ilovegym
                  Der Tipp mit dem Blockly war zielführend, danke dafür 🙂

                  1 Reply Last reply Reply Quote 1
                  • OliverIO
                    OliverIO @PeZi last edited by

                    @pezi

                    wenn die api JSON zurückliefert, würde ich da nicht per Zeichenmanipulation darauf zugreifen,
                    sondern direkt als Objekt. Die Position, an der sich ein property befindet ist nämlich nicht garantiert.

                    daher würde ich eher folgendes vorschlagen, ersetzt Zeile 6-12
                    leider liefern die da ein Array of Objects zurück, daher muss nach dem richtigen Objekt per find gesucht werden. Code ohne FailSafe-Behandlung

                    let ergebnis = JSON.parse(response.data);
                    let Token = ergebnis.find(el=>el.cmd=="Login").value.Token.name
                    
                    P 1 Reply Last reply Reply Quote 0
                    • P
                      PeZi @OliverIO last edited by

                      @oliverio
                      danke für den Tipp, habs so umgesetzt.

                      Hier mal für alle die ähnliches vorhaben zusätzlich der Code mit dem dann auf Grundlage des ermittelten Tokens die Steuerbefehle abgesetzt werden.
                      Auch in dem Code gibt es sicher Optimierungsmöglichkeiten, aber er funktioniert 🙂

                      'use strict'
                      
                      // Token für Kamera 3 ermitteln aund speichern
                      schedule("*/30 * * * *", async () => {
                          httpPost('http://192.168.22.42/api.cgi?cmd=Login', '[{ "cmd":"Login", "param":{ "User":{ "Version": 0, "userName":"XXX", "password":"YYY"}}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                              let ergebnis = JSON.parse(response.data);
                              let Token = ergebnis.find(el=>el.cmd=="Login").value.Token.name
                              setState('0_userdata.0.Token_Kamera3', Token, true);
                          });
                      });
                      
                      // Kamara Links
                      on({id: '0_userdata.0.Kamera3_Links', change: 'gt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Left", "speed":16}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      on({id: '0_userdata.0.Kamera3_Links', change: 'lt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Stop"}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      // Kamara Rechts
                      on({id: '0_userdata.0.Kamera3_Rechts', change: 'gt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Right", "speed":16}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      on({id: '0_userdata.0.Kamera3_Rechts', change: 'lt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Stop"}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      // Kamara Auf
                      on({id: '0_userdata.0.Kamera3_Auf', change: 'gt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Up", "speed":16}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      on({id: '0_userdata.0.Kamera3_Auf', change: 'lt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Stop"}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      // Kamara Ab
                      on({id: '0_userdata.0.Kamera3_Ab', change: 'gt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Down", "speed":16}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      on({id: '0_userdata.0.Kamera3_Ab', change: 'lt'}, function(obj) {
                          let Adresse= 'http://192.168.22.42/api.cgi?cmd=PtzCtrl&token=' + getState("0_userdata.0.Token_Kamera3").val;
                          httpPost(Adresse, '[{ "cmd":"PtzCtrl", "param":{ "channel":0, "op":"Stop"}}]', { timeout: 3000, responseType: 'arraybuffer' }, async (err, response) => {
                          });
                      });   
                      
                      1 Reply Last reply Reply Quote 1
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      927
                      Online

                      31.7k
                      Users

                      79.7k
                      Topics

                      1.3m
                      Posts

                      4
                      9
                      779
                      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