sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 il y a encore cette solution: je n'ai pas encore testé mais c le moyen d'accéder à l'interface web: il se connecte avec l'api puis appelle la page http://tencopies.blogspot.de/2012/11/enable-disable-diskstation-cameras.html je doute que ce soit possible en lua edit: Lazer est trop rapide, j'ai modifié mon mail 1 minute plus tard ... (je disais qu'il fallait récupérer le hash du password)
Lazer Posté(e) le 20 juin 2014 Auteur Signaler Posté(e) le 20 juin 2014 Pas besoin de renifler le steak password haché, il suffit de récupérer le cookie.... la phrase qui donne faim En fait à partir de ce paragraphe il explique comment faire : However, Synology introduced a nice CGI API that is really straightforward and well documented and allows you to logon using clear text passwords (over SSL encrypted connection if needed) - but lacks the feature to enable / disable the cameras! :-( Finally, combining a logon call to the new API, saving the cookie, then calling the main page ("index.cgi") and then setting the cameras turned out to work, so this is what works at least for me: => On ne peut pas utiliser l'authentification par l'URL directement, c'est là dessus que j'ai bloqué lorsque j'avais essayé. => Le souci c'est de récupérer le cookie dans l'entête de la réponse. Impossible d'utiliser Net.FHttp() suivi de GET(). => il va falloir se taper les requêtes Net.FTcpSocket à la main... pas cool. Et là je ne suis pas motivé...
sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 Oui j'ai lu trop vite, en relisant ça m'a paru plus simple, je viens de tester, ça marche !!! (en SSH)
sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 comme je disais plus haut, j'ai déjà la méthode pour lancer ce genre de script en php (faire un php qui écrit un fichier sur le disque, ensuite faire un cron toutes les minutes qui vérifie si un fichier est présent, s'il est présent, l'effacer et lancer le .sh qui va bien .)
sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 => Le souci c'est de récupérer le cookie dans l'entête de la réponse. Impossible d'utiliser Net.FHttp() suivi de GET(). => il va falloir se taper les requêtes Net.FTcpSocket à la main... pas cool. Et là je ne suis pas motivé... Là je suis un peu largué, mais une petite page php entre les deux ça pourrait pas aider ? (pas jojo mais quand même plus simple que de passer par le cron et tutti quanti)
Lazer Posté(e) le 20 juin 2014 Auteur Signaler Posté(e) le 20 juin 2014 Partage si tu veux ta page en PHP, mais comme je le disais plus haut, je préfèrerais une solution native en LUA gérée directement par la HC2. C'est tout àfait faisable, il faut juste parser la réponse HTTP complète du Syno afin de récupérer le cookie, puis générer une requête complète avec l'entête contenant le cookie. Un Krikroff ou un Steven peuvent surement nous faire ça le temps qu'on boive un café (ou plutôt une bière àcette heure là), mais moi il me faudrait un week-end complet, et franchement je n'ai pas le temps.
sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 c'est ici: http://forum.eedomus.com/viewtopic.php?f=15&t=1045 post de DjMomo du 20 juillet à 18:46
Lazer Posté(e) le 20 juin 2014 Auteur Signaler Posté(e) le 20 juin 2014 2 chose me gênent avec cette technique : - on a un intermédiaire, donc une complexité supplémentaire, donc un risque de disfonctionnement - la crontab qui surveille la présence d'un fichier toutes les minutes, ce n'est pas très réactif. Dans le cas présent, on veut piloter une caméra, et je préfère que ça réagisse dans la seconde si une intrusion est détectée, et non pas une minute plus tard... En plus, une crontab qui surveille la présence d'un fichier absent 99,99% du temps, c'est quand même travailler pour rien.... ce n'est pas très "propre". Oui je fais le difficile
sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 je suis bien d'accord avec toi, je le répétais au post #44 ici plus haut. Mais bon, faute de grives, on mange des merles... Moi c'est pas dans l'optique "je détecte -> je filme" mais plutôt "j'active l'alarme, je filme (quand il y a mouvement) et j'envoie des snapshots par email", "je suis là je coupe". Le délai d'allumage ne me gène donc pas trop.
sebcbien Posté(e) le 20 juin 2014 Signaler Posté(e) le 20 juin 2014 Bon, je l'ai fait, ça marche je suis vite content... je sais
sebcbien Posté(e) le 21 juin 2014 Signaler Posté(e) le 21 juin 2014 Pour synthétiser: Mettre les cameras de surveillance station enabl ou disable via un appel PHPCréer un fichier "camoff.sh" avec le contenu suivant : remplacez password XXXXX IPSYNO et PORT par vos valeurs Edit 13/7/2014: Plus besoin de "sniffer", les commandes fonctionnent aussi sans cette valeur dans l'url. XXXXXXXX peut être trouvé en "sniffant", le debug de Firefox ou de Chrome permet de le faire très rapidement on interceptant les requêtes ajax envoyées Il suffit de modifier idList=xxx pour vos besoins. idList=1 ou idList=2 pour gérer les caméras 1 et 2 idList=2%2C5 pour gérer les caméras 2 et5 par exemple #!/bin/sh fichier=/volume1/web/camoff if [ -f $fichier ] then echo "Le fichier $fichier existe --> EXTINCTION des CAM" rm $fichier wget --keep-session-cookies --save-cookies syno-cookies.txt -O- "http://IPSYNO:PORT/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=1&account=admin&passwd=PASSWORD" wget --load-cookies syno-cookies.txt -O- "http://IPSYNO:PORT/webman/3rdparty/SurveillanceStation/cgi/index.cgi" wget --load-cookies syno-cookies.txt -O- "http://IPSYNO:PORT/webman/3rdparty/SurveillanceStation/cgi/camera.cgi?action=cameraDisable&UserId=1024&idList=1" else echo "Le fichier $fichier n'existe pas" fi Placer ce fichier dans le dossier /bin. Le changer de propriétaire avec chown root:root /bin/camoff.sh et exécutable avec chmod u+x /bin/camoff.sh Créer un fichier "camoff.php" avec le contenu suivant : <? $fichier = "camoff"; if(!$fp = fopen($fichier,"w+")) echo "Erreur lors de l'ouverture de $fichier"; fclose($fp); Le placer dans le dossier /volume1/web.Editer la crontab en rajoutant les lignes : * * * * * root sh /bin/camoff.sh > /dev/null 2>&1 * * * * * root sh /bin/camon.sh > /dev/null 2>&1 Attention que le cron des synology sont capricieux. ne faites pas l'erreur de remplacer les tabs entre les * par des espaces et redémarrez le service cron après toute modif. Pour editer: vi /etc/crontab pour redémarrer le service:cron synoservicecfg --restart crond Il vous suffit alors d'appeler http://IP_NAS/camoff.php et dans la minute qui suit, votre camera sera "disabled".Si vous voulez placer le fichier php dans un sous-dossier de /volume1/web/, il faut modifier le chemin de la variable "fichier" dans le script sh. Pour camon (allumer les cam, c'est la même chose, mais remplacez disabled par enabled dans le .sh et camoff par camon ailleurs edit: avec certaines mise à jour de firmware, le répertoire /bin est nettoyé... faites donc un backup des fichiers .sh et replacez les dans /bin Enjoy ! 1
sebcbien Posté(e) le 13 juillet 2014 Signaler Posté(e) le 13 juillet 2014 J'ai modifié le message ci-dessus, la méthode wget est maintenant plus simple
maestrea Posté(e) le 5 octobre 2014 Signaler Posté(e) le 5 octobre 2014 Salut, le code pour le PATROL LIST: -------------------------------------------------- -- Synology Surveillance Station v2 -- List Patrols -- Antonio Maestre, original code Lazer -- Oct 2014 -------------------------------------------------- -- User configurable variables local login = "yourlogin" local password = "yourpasswd" -- System variables local selfID = fibaro:getSelfId() local ip = fibaro:get(selfID, 'IPAddress') local port = fibaro:get(selfID, 'TCPPort') local Synology = Net.FHttp(ip, tonumber(port)) local API_AUTH_ERROR_CODE = { [100] = "Unknown error.", [101] = "The account parameter is not specified.", [400] = "Invalid password.", [401] = "Guest or disabled account.", [402] = "Permission denied.", [403] = "One time password not specified.", [404] = "One time password authenticate failed." } -- Discover available APIs and corresponding information payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth,SYNO.SurveillanceStation.Camera,SYNO.SurveillanceStation.PTZ" response, status, errorCode = Synology:GET(payload) if tonumber(status) == 200 then jsonTable = json.decode(response); if jsonTable.data["SYNO.API.Auth"].maxVersion >= 2 and jsonTable.data["SYNO.SurveillanceStation.Camera"].maxVersion >= 2 and jsonTable.data["SYNO.SurveillanceStation.PTZ"].maxVersion >= 1 then fibaro:debug("Synology API version OK") pathAuth = jsonTable.data["SYNO.API.Auth"].path pathCamera = jsonTable.data["SYNO.SurveillanceStation.Camera"].path pathPTZ = jsonTable.data["SYNO.SurveillanceStation.PTZ"].path --fibaro:debug("Synology API Auth path = "..pathAuth) --fibaro:debug("Synology API Surveillance Station Camera path = "..pathCamera) --fibaro:debug("Synology API Surveillance Station PTZ path = "..pathPTZ) -- Create new login session payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Login&version=2&account="..login.."&passwd="..password.."&session=SurveillanceStation&format=sid" response, status, errorCode = Synology:GET(payload) if tonumber(status) == 200 then jsonTable = json.decode(response); if jsonTable.success == true then SID = jsonTable.data.sid fibaro:debug("Synology API Auth SID = "..SID) -- Get the list of all cameras payload = "/webapi/"..pathCamera.."?api=SYNO.SurveillanceStation.Camera&method=List&version=1&_sid="..SID response, status, errorCode = Synology:GET(payload) jsonTable = json.decode(response); if jsonTable.success == true then fibaro:debug('Synology Surveillance Station number of cameras = '..tostring(jsonTable.data.total)) for i = 1, #jsonTable.data.cameras do fibaro:debug('<span style="color:green;">Found camera <b>'..jsonTable.data.cameras[i].name..'</b> ID=<b>'..jsonTable.data.cameras[i].id..'</b> address='..jsonTable.data.cameras[i].host..'</span>') -- List all presets of the PTZ camera payload = "/webapi/"..pathPTZ.."?api=SYNO.SurveillanceStation.PTZ&method=ListPatrol&version=1&cameraId="..jsonTable.data.cameras[i].id.."&_sid="..SID --fibaro:debug(payload) response, status, errorCode = Synology:GET(payload) --fibaro:debug("Respuesta: " .. response) --fibaro:debug("Status: ".. status) --fibaro:debug("Error Cod: " .. errorCode) jsonTable2 = json.decode(response); if jsonTable2.success == true then fibaro:debug('Number of PTZ patrols = '..tostring(jsonTable2.data.total)) for j = 1, #jsonTable2.data.patrols do fibaro:debug('<span style="color:green;">Found PTZ patrols <b>'..jsonTable2.data.patrols[j].name..'</b> ID=<b>'..jsonTable2.data.patrols[j].id..'</b></span>') end else fibaro:debug('<span style="color:red;">Synology Surveillance Station list PTZ patrols FAILED</span>') end end fibaro:log("OK") else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Synology Surveillance Station list cameras FAILED</span>') end -- Destroy current login session payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation&_sid="..SID response, status, errorCode = Synology:GET(payload) else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : '..API_AUTH_ERROR_CODE[tonumber(jsonTable.error.code)]..'</span>') end else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : API Authentication failure</span>') end else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : Synology API version is too old : <b>DSM 4.0-2251</b> and <b>Surveillance Station 6.1</b> are required</span>') end else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : Can not connect to Synology server</span>') end
Lazer Posté(e) le 5 octobre 2014 Auteur Signaler Posté(e) le 5 octobre 2014 Super, merci pour le partage Maestrea PS : modifie ton message, et évite de citer mon message d'origine, et insère les balises (bouton <>) autour du code afin que ça soit plus lisible, sinon les admins vont te tomber dessus
maestrea Posté(e) le 5 octobre 2014 Signaler Posté(e) le 5 octobre 2014 Bonjour, Le code pour le Run Patrol: -------------------------------------------------- -- Synology Surveillance Station v2 -- Run Patrol -- Antonio Maestre, original code Lazer -- Oct 2014 -------------------------------------------------- -- User configurable variables local login = "yourlogin" local password = "yourpasswd" local camera = 2 local preset = 2 -- System variables local selfID = fibaro:getSelfId() local ip = fibaro:get(selfID, 'IPAddress') local port = fibaro:get(selfID, 'TCPPort') local Synology = Net.FHttp(ip, tonumber(port)) local API_AUTH_ERROR_CODE = { [100] = "Unknown error.", [101] = "The account parameter is not specified.", [400] = "Invalid password.", [401] = "Guest or disabled account.", [402] = "Permission denied.", [403] = "One time password not specified.", [404] = "One time password authenticate failed." } -- Discover available APIs and corresponding information payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth,SYNO.SurveillanceStation.PTZ" response, status, errorCode = Synology:GET(payload) if tonumber(status) == 200 then jsonTable = json.decode(response); if jsonTable.data["SYNO.API.Auth"].maxVersion >= 2 and jsonTable.data["SYNO.SurveillanceStation.PTZ"].maxVersion >= 1 then fibaro:debug("Synology API version OK") pathAuth = jsonTable.data["SYNO.API.Auth"].path pathPTZ = jsonTable.data["SYNO.SurveillanceStation.PTZ"].path fibaro:debug("Synology API Auth path = "..pathAuth) fibaro:debug("Synology API Surveillance Station PTZ path = "..pathPTZ) -- Create new login session payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Login&version=2&account="..login.."&passwd="..password.."&session=SurveillanceStation&format=sid" response, status, errorCode = Synology:GET(payload) if tonumber(status) == 200 then jsonTable = json.decode(response); if jsonTable.success == true then SID = jsonTable.data.sid fibaro:debug("Synology API Auth SID = "..SID) -- Run patrol payload = "/webapi/"..pathPTZ.."?api=SYNO.SurveillanceStation.PTZ&method=RunPatrol&version=2&cameraId="..camera.."&patrolId="..preset.."&_sid="..SID response, status, errorCode = Synology:GET(payload) jsonTable = json.decode(response); if jsonTable.success == true then --fibaro:setGlobal("PosicionCAMEntrada", "Salon"); --fibaro:call(selfID, "setProperty", "ui.StatusEntrada.value", fibaro:getGlobalValue("PosicionCAMEntrada")); fibaro:log("OK") fibaro:debug('<span style="color:green;">Synology Surveillance Station move camera "'..tostring(camera)..'" to preset "'..tostring(preset)..'" OK</span>') else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Synology Surveillance Station move camera "'..tostring(camera)..'" to preset "'..tostring(preset)..'" FAILED</span>') end -- Destroy current login session payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation&_sid="..SID response, status, errorCode = Synology:GET(payload) else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : '..API_AUTH_ERROR_CODE[tonumber(jsonTable.error.code)]..'</span>') end else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : API Authentication failure</span>') end else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : Synology API version is too old : <b>DSM 4.0-2251</b> and <b>Surveillance Station 6.1</b> are required</span>') end else fibaro:log("Erreur") fibaro:debug('<span style="color:red;">Error : Can not connect to Synology server</span>') end
Moicphil Posté(e) le 6 octobre 2014 Signaler Posté(e) le 6 octobre 2014 Bonjour Maestrea et merci pour le partage. Merci d’éditer tes messages précédents et d'utiliser les "balises" pour insérer un code : <>
lionel Posté(e) le 6 octobre 2014 Signaler Posté(e) le 6 octobre 2014 Aie,aie,aie Ne site pas le message précédant les Admins trouvent que ça fait désordre...
Yohan Posté(e) le 6 octobre 2014 Signaler Posté(e) le 6 octobre 2014 Pas que ça fait désordre juste que c'est inutile... puisque le message se situe au dessus de la réponse. 1
satryany Posté(e) le 7 octobre 2014 Signaler Posté(e) le 7 octobre 2014 salut, concernant l'activation / désactivation des caméras à travers videoStation, une mise à jour de photo-sender ( http://www.domotique-fibaro.fr/index.php/topic/1250-photo-sender-131-outils-denvoi-de-photos-mails-dropbox-multi-rooms-et-multi-users-beta/ ) arrive avec cette fonctionnalité. L'enregistrement est aussi au programme, prise de photos, positions, patrol etc ...
Lazer Posté(e) le 9 octobre 2014 Auteur Signaler Posté(e) le 9 octobre 2014 @satryany, ton application a l'air vraiment complète, c'est super Mais je te dis franchement, pour ma part le Java c'est juste pas possible. Je suis complètement allergique, je me bat régulièrement contre ça au boulot avec les JRE qui ne sont jamais à la bonne version, obligé d'avoir une VM sur mon PC portable avec une ancienne version du JRE, lenteur, problèmes de certificats, etc.... Donc à la maison, on va éviter. Je n'attends qu'une seule chose : c'est que Java suive le même chemin que Flash (si y'a bien une chose que j’admirais chez Steve Jobs, c'est son opposition au Flash). Je ne comprends même pas que Google aie choisi Java pour les développements d'applis sous Android... d'ailleurs Oracle leur fait bien payer maintenant avec les procès à la con. A un moment j'avais essayé de développer une appli Android, j'ai laissé tombé bien vite. J'ai déjà fait du Java il y a bien longtemps, juste après avoir appris le C++, je t'explique pas le choc... le Java j'appelle ça du C--. Bref... voilà , c'est juste mon avis, et ça n'enlève rien à la qualité de ton appli qui a l'air chouette. Ni à ton métier d'ailleurs, moi aussi je bosse sur des systèmes que beaucoup de DSI aimeraient bien voir disparaitre (UNIX...)
satryany Posté(e) le 9 octobre 2014 Signaler Posté(e) le 9 octobre 2014 @Lazer merci Le java à bien évolué depuis que tu à essayé et puis java c'est très vaste... java, jee, et surtout les frameworks type spring, jpa, hibernate ... Les lenteurs sont relatives, tu as des bbd / search engine big data en java types elasticsearch / neo4j / cassandra qui te font du temps réél avec plusieurs milliards d'enregistrement. La comparaison avec flash n'est pas correct je pense, pour avoir fait beaucoup de flex, je pense que la raison du déclin flash c'est simplement que le html5 / ccs3 et les framework type angularJs ou backbone te permette de faire plus ou moins la même chose sans vm. Ce qui n'est pas du tout le cas de java au sens framework (ça vaut aussi pour .net). Le c++ à beau être plus rapide etc... il n'est pas adapté à tout, à chaque langage ses applications. Bref... voilà , c'est juste mon avis... je t'encourage à installer une jre et faire tourner mon appli
sebcbien Posté(e) le 31 décembre 2014 Signaler Posté(e) le 31 décembre 2014 Je ne sais pas vous, mais chez moi avec la dernière version ça ne va plus ils ont fait de gros changements a l'api apparemment. J'ai rajouté un debug sur "response" [DEBUG] 18:01:06: {"data":{"SYNO.API.Auth":{"maxVersion":3,"minVersion":1,"path":"auth.cgi"},"SYNO.SurveillanceStation.ExternalRecording":{"maxVersion":1,"minVersion":1,"path":"_______________________________________________________entry.cgi","requestFormat":"JSON"}},"success":true} [DEBUG] 18:01:06: Error : Synology API version is too old : DSM 4.0-2251 and Surveillance Station 6.1 are required et malgré que ce soit la dernière version, l'api retourne 1 comme maxVersion
Lazer Posté(e) le 31 décembre 2014 Auteur Signaler Posté(e) le 31 décembre 2014 Arf c'est embêtant... Il faut que je regarde ça àl'occasion. Par contre je n'ai pas la dernière version de DSM, donc je ferai àpartir de la doc de référence de l'api.
Messages recommandés