NEWS
API-Zugriff (hier: Reolink API)
-
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..
... und so...
... das FeedbackDer Token (oder das Token?) wird also zurück geliefert.
Gruß
Peter -
gelöscht
-
Funktioniert das mit dem Reolink Adapter nicht?
-
@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. -
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..
-
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); }); });
-
@ilovegym
Der Tipp mit dem Blockly war zielführend, danke dafür -
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-Behandlunglet ergebnis = JSON.parse(response.data); let Token = ergebnis.find(el=>el.cmd=="Login").value.Token.name
-
@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) => { }); });