Skip to content
  • Home
  • 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
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. API-Zugriff (hier: Reolink API)

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.2k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

API-Zugriff (hier: Reolink API)

Scheduled Pinned Locked Moved JavaScript
9 Posts 4 Posters 1.4k Views 5 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.
  • P Offline
    P Offline
    PeZi
    wrote on last edited by
    #1

    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

    mickymM ? 2 Replies Last reply
    0
    • P PeZi

      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

      mickymM Offline
      mickymM Offline
      mickym
      Most Active
      wrote on last edited by mickym
      #2

      gelöscht

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Reply Last reply
      0
      • P PeZi

        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

        ? Offline
        ? Offline
        A Former User
        wrote on last edited by
        #3

        @pezi

        Funktioniert das mit dem Reolink Adapter nicht?

        P 1 Reply Last reply
        0
        • ? A Former User

          @pezi

          Funktioniert das mit dem Reolink Adapter nicht?

          P Offline
          P Offline
          PeZi
          wrote on last edited by
          #4

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

          ? 1 Reply Last reply
          0
          • P PeZi

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

            ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #5

            @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
            0
            • P Offline
              P Offline
              PeZi
              wrote on last edited by PeZi
              #6

              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);
                  });
              });
              
              OliverIOO 1 Reply Last reply
              0
              • ? A Former User

                @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 Offline
                P Offline
                PeZi
                wrote on last edited by
                #7

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

                1 Reply Last reply
                0
                • P 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);
                      });
                  });
                  
                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  wrote on last edited by
                  #8

                  @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
                  

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  P 1 Reply Last reply
                  0
                  • OliverIOO OliverIO

                    @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 Offline
                    P Offline
                    PeZi
                    wrote on last edited by
                    #9

                    @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
                    0
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    613

                    Online

                    32.5k

                    Users

                    81.7k

                    Topics

                    1.3m

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

                    • Don't have an account? Register

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