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

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

Community Forum

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

NEWS

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

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

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

API-Zugriff (hier: Reolink API)

Geplant Angeheftet Gesperrt Verschoben JavaScript
9 Beiträge 4 Kommentatoren 1.3k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P Offline
    P Offline
    PeZi
    schrieb am zuletzt editiert von
    #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 Antworten Letzte Antwort
    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 Online
      mickymM Online
      mickym
      Most Active
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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
        Ein ehemaliger Benutzer
        schrieb am zuletzt editiert von
        #3

        @pezi

        Funktioniert das mit dem Reolink Adapter nicht?

        P 1 Antwort Letzte Antwort
        0
        • ? Ein ehemaliger Benutzer

          @pezi

          Funktioniert das mit dem Reolink Adapter nicht?

          P Offline
          P Offline
          PeZi
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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
            Ein ehemaliger Benutzer
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • P Offline
              P Offline
              PeZi
              schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
              0
              • ? Ein ehemaliger Benutzer

                @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
                schrieb am zuletzt editiert von
                #7

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

                1 Antwort Letzte Antwort
                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
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  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
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    494

                    Online

                    32.4k

                    Benutzer

                    81.4k

                    Themen

                    1.3m

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

                    • Du hast noch kein Konto? Registrieren

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