NEWS
Synology Surveillance Station API
-
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!
-
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
-
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?
-
on({id: "xxxx"/* variable aktualiseren um snapshot zu versenden*/}, main); `
muss man diese xxxx auch anpassen? -
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
-
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);
-
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_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); `
-
Super, funktioniert auch bei mir!
Gruß und Danke
Bernd
-
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?
-
-
eigentlich mit dem zwei scripts soll gehen, was hast als Trieger?
-
eigentlich mit dem zwei scripts soll gehen, was hast als Trieger? `
Zum Testen benutze ich einen homematic Lichtschalter. Sonst den Bewegungsmelder,innen von HM. -
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.
-
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&version=1&method=Stream&cameraId=1&format=mjpeg&_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…
-
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?
-
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. -
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…
-
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… `
Ja, und jetzt kann man mit der beta mit chrome browser die aufgenommenen videos anschauen. -
Ich find nur keine api Beschreibung zur beta….
-
Hey,
weil bisher primär PHP Code gepostet wurde, hier mal meine Lösung die ich aktuell verwende.
In der Synology Surveillancestation bei der "Stream Gültigkeit" habe ich "Dauerhaft" gewählt, trotzdem wird die URL nach 1-2 Wochen ungültig, also hole ich Sie jetzt täglich neu.
var request = require('request'); // Konfiguration var user = "surveillanceUser"; // Synology Benutzer mit Berechtigung die Kamera anzuzeigen var pass = "..."; // Passwort zu eben eingegebenem Benutzer var ip = "..."; // IP-Adresse eures Synology-NAS var port = 5000; // default Port der Surveillance Station var cameraID = 1; // ID der Kamera, welche angezeigt werden soll createState('javascript.' + instance + '.Anzeigen.Kamera.Eingangstuer-Stream', {'type': 'string', 'read': true, 'write': true, 'role': 'value', 'def': ""}); // Authentifizierung an Synology Surveillance Station WebAPI und auslesen der SID function updateStreamUrl() { request('http://' + ip + ':' + port + '/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account=' + user + '&passwd=' + pass + '&session=SurveillanceStation&format=sid', function (error, response, body) { //console.log('error:', error); // Print the error if one occurred //console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received //console.log('body:', body); // Print the HTML for the Google homepage. try { var bodyObj = JSON.parse(body); } catch (e) { console.log("Error update SurveillanceStation Stream URL: " + e); return; } if (bodyObj && bodyObj.data && bodyObj.data.sid) { var sid = bodyObj.data.sid; setState('javascript.' + instance + '.Anzeigen.Kamera.Eingangstuer-Stream', 'http://' + ip + ':' + port + '/webapi/SurveillanceStation/videoStreaming.cgi?api=SYNO.SurveillanceStation.VideoStream&version=1&method=Stream&cameraId=' + cameraID + '&format=mjpeg&_sid=' + sid, true); } else { console.log("Invalid return on SurveillanceStation Stream URL: " + JSON.stringify(bodyObj)); return; } }); } schedule("0 * * * *", function() { updateStreamUrl(); }); updateStreamUrl();
Es gibt dann einen Datenpunkt wo ich einmal pro Stunde ne neue URL hole und reinschreibe.
In Vis zeige ich es dann mit dem Cam-Widget an und {javascript.0.Anzeigen.Kamera.Eingangstuer-Stream} als "Source"/Quelle. Das klappt recht gut
Ingo
-
EDIT: habe das Problem gefunden. Ich musste es natürlich für mich anpassen mit 2x https
@apollon77:Hey,
weil bisher primär PHP Code gepostet wurde, hier mal meine Lösung die ich aktuell verwende.
In der Synology Surveillancestation bei der "Stream Gültigkeit" habe ich "Dauerhaft" gewählt, trotzdem wird die URL nach 1-2 Wochen ungültig, also hole ich Sie jetzt täglich neu.
! ````
var request = require('request');
! // Konfiguration
var user = "surveillanceUser"; // Synology Benutzer mit Berechtigung die Kamera anzuzeigen
var pass = "..."; // Passwort zu eben eingegebenem Benutzer
var ip = "..."; // IP-Adresse eures Synology-NAS
var port = 5000; // default Port der Surveillance Station
var cameraID = 1; // ID der Kamera, welche angezeigt werden soll
! createState('javascript.' + instance + '.Anzeigen.Kamera.Eingangstuer-Stream', {'type': 'string', 'read': true, 'write': true, 'role': 'value', 'def': ""});
! // Authentifizierung an Synology Surveillance Station WebAPI und auslesen der SID
! function updateStreamUrl() {
request('http://' + ip + ':' + port + '/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account=' + user + '&passwd=' + pass + '&session=SurveillanceStation&format=sid', function (error, response, body) {
//console.log('error:', error); // Print the error if one occurred
//console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
//console.log('body:', body); // Print the HTML for the Google homepage.
try {
var bodyObj = JSON.parse(body);
}
catch (e) {
console.log("Error update SurveillanceStation Stream URL: " + e);
return;
}
if (bodyObj && bodyObj.data && bodyObj.data.sid) {
var sid = bodyObj.data.sid;
setState('javascript.' + instance + '.Anzeigen.Kamera.Eingangstuer-Stream', 'http://' + ip + ':' + port + '/webapi/SurveillanceStation/videoStreaming.cgi?api=SYNO.SurveillanceStation.VideoStream&version=1&method=Stream&cameraId=' + cameraID + '&format=mjpeg&_sid=' + sid, true);
}
else {
console.log("Invalid return on SurveillanceStation Stream URL: " + JSON.stringify(bodyObj));
return;
}
});
}
! schedule("0 * * * *", function() {
updateStreamUrl();
});
! updateStreamUrl();Es gibt dann einen Datenpunkt wo ich einmal pro Stunde ne neue URL hole und reinschreibe. In Vis zeige ich es dann mit dem Cam-Widget an und {javascript.0.Anzeigen.Kamera.Eingangstuer-Stream} als "Source"/Quelle. Das klappt recht gut Ingo `
Das klingt gut. Leider ist da bei mir noch irgendwo ein Fehler.
Anpassen muss ich oben nur die 5 Variablen, richtig?
Ich habe ja nur https mit 5001… vielleicht macht das schon Probleme?
Ansonsten user, pass und ip ohne die "Anführungszeichen", richtig?
Wie bekommt man systematisch die cameraID raus? Bei mir ist es durch Ausprobieren 2 und 4, obwohl ich nur 2 cams habe.
Fehler:
javascript.0 2017-08-09 15:56:46.989 error script.js.common.cam.cam_innen compile failed: SyntaxError: Unexpected token !