Aller au contenu
Lazer

Piloter L'enregistrement Des Caméras Avec Synology Surveillance Station

Recommended Posts

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas besoin de renifler le steak password haché, il suffit de récupérer le cookie.... la phrase qui donne faim :D

 

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui j'ai lu trop vite, en relisant ça m'a paru plus simple, je viens de tester, ça marche !!! (en SSH)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :) .)

Partager ce message


Lien à poster
Partager sur d’autres sites

=> 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)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :P

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon, je l'ai fait, ça marche  :60:

 

je suis vite content... je sais   :rolleyes:

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour synthétiser:

 

Mettre les cameras de surveillance station enabl ou disable via un appel PHP

Cré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 !  :)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai modifié le message ci-dessus, la méthode wget est maintenant plus simple

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Super, merci pour le partage Maestrea :60:

 

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 :)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :  <>

Partager ce message


Lien à poster
Partager sur d’autres sites

Aie,aie,aie

Ne site pas le message précédant les Admins trouvent que ça fait désordre...

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas que ça fait désordre juste que c'est inutile... puisque le message se situe au dessus de la réponse.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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 :) 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

×