Aller au contenu
Lazer

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

Recommended Posts

Note : le QuickApp pour HC3 se trouve ici : https://www.domotique-fibaro.fr/topic/14594-quick-app-synology-surveillance-station/

 

 

Présentation

 

Voici un Module Virtuel permettant de activer/désactiver les caméras, et démarrer/arrêter l'enregistrement des caméras gérées par l'outil Surveillance Station qu'on trouve sur les NAS Synology.

Ce module permet également de piloter le positionnement PTZ des caméras motorisées.

 

Ce module virtuel dispose de 5 boutons :

  • Start : démarrer l'enregistrement
  • Stop : arrêter l'enregistrement
  • Enable : activer la/les caméra(s)
  • Disable : désactiver la/les caméra(s)
  • List : permet de récupérer l'ID des caméras connues par Surveillance Station. Pour utiliser ce bouton, il faut ouvrir la fenêtre de Debug car c'est pour le moment la seule façon que j'ai trouvé d'afficher les informations à  l'écran.

Ainsi que d'un nombre de boutons paramétrables :

  • Un bouton pour chaque position mémorisée

De plus, la main loop permet de surveiller le statut des caméras et d'adapter l’icône du module virtuel en conséquence.

 

gallery_133_79_10386.png

 

 

Pré-requis :

 

Au moins une caméra doit être gérée par Surveillance Station :

 

gallery_133_79_9835.png

 
Il est conseillé de paramétrer la caméra en détection de mouvement permanente :

 

gallery_133_79_23430.png

 

Si la caméra en est capable, des positions prédéfinies doivent être mémorisées pour les caméras à  piloter :
 

gallery_133_79_32302.png

 

 

 
Création d'un utilisateur dédié :
 
Bien que non-obligatoire, il est conseillé pour des raisons de sécurité de créer un utilisateur dédié dans DSM. Ainsi, le mot de passe du compte admin n'est pas exposé dans le code source du module virtuel.
 
Note : la version 4.3 est utilisée pour les screenshots suivants, mais la méthode est strictement identique pour les versions 5.x de DSM.
 
Ouvrir le panneau de configuration :
 

gallery_133_79_187191.png

 
Ouvrir le panneau des utilisateurs :
 

gallery_133_79_145742.png

 
Cliquer sur le bouton "Créer", et entrer les informations utiles.
Note : il est judicieux de cocher la case "Ne pas autoriser l'utilisateur à  changer le mot de passe du compte" :
 

gallery_133_79_32111.png

 
Cocher le groupe "users" :
 

gallery_133_79_88374.png

 
Cocher les cases "Pas d'accès" pour l'ensemble des dossiers partagés :
 

gallery_133_79_123112.png

 
Ne rien cocher :
 

gallery_133_79_124627.png

 
Décocher les cases de tous les privilèges, et ne cocher que la case "Surveillance Station" :
 

gallery_133_79_207414.png

 
Ne rien modifier :
 

gallery_133_79_207763.png

 
Vérifier que tout est bon, et cliquer sur le bouton "Appliquer" :
 

gallery_133_79_160940.png

 
De retour dans Surveillance Station, ouvrir le panneau Utilisateur, puis sélectionner l'utilisateur Fibaro préalablement créé, et cliquer sur le bouton "Modifier" :
 

gallery_133_79_29610.png

 
Dans la liste déroulante "Profil de privilège", sélectionner "Gestionnaire tout objet", puis cliquer sur le bouton "OK" :
 

gallery_133_79_21266.png

 
L'utilisateur dispose maintenant des droits Directeur :
 

gallery_133_79_21151.png

 
 
Import du module virtuel :
 
Dans l'interface du Home Center 2, importer le fichier Surveillance_Station.vfib :
 

gallery_133_79_2278.png

 

gallery_133_79_9362.png

 

 

 
Modifier les icônes du module et de tous les boutons avec les images suivantes :
 
  • Module virtuel : surveillancestation_128.png

gallery_133_79_2080.png

  • Start : surveillancestation_rec_128.png

surveillancestation Rec 128

  • Stop : surveillancestation_stop_128.png

gallery_133_79_14281.png

  • Enable : surveillancestation_enable_128.png

gallery_133_79_16282.png

  • Disable : surveillancestation_disable_128.png

gallery_133_79_5534.png

  • List : surveillancestation_list_128.png

gallery_133_79_4245.png

  • Move : surveillancestation_ptz_128.png

gallery_133_79_7192.png

 

Configuration :

 

Modifier les propriétés du module virtuel, et entrer les informations correctes pour joindre le Synology : Adresse IP et Port TCP :
 

gallery_133_79_22223.png

 

Modifier les propriétés avancées du module virtuel, et modifier les premières lignes de chacun des boutons avec vos paramètres :

-- User configurable variables
local login = "user"          -- Utilisateur Synology
local password = "password"   -- Mot de passe Synology.

Pour les boutons PTZ, il faut spécifier le preset correspondant à  chaque bouton (la caméra positionnée sera obligatoirement la première caméra listée dans la main loop, voir plus bas) :

local preset = 1              -- ID de la position PTZ

 

Pour récupérer l'ID des caméras, et les ID des positions PTZ, il faut utiliser le mode "Debug" sur le bouton "List".

Dans l'exemple ci-dessous, il y a une seule caméra avec l'ID n°2, et 4 positions PTZ avec les ID n°1, 2, 3, 4 :

 

gallery_133_79_7595.png

 
 

Remarque : lors de l'importation du module virtuel, le Virtual Device possède 4 boutons PTZ, mais ceci est à  modifier en fonction de votre propre environnement. Il faut 1 bouton par position et par caméra.

 

 

Main Loop :

 

Ce module virtuel dispose d'une Main Loop qui surveille le statut des caméras avec un intervalle de rafraichissement de 10 secondes et met à  jour :

  • l’icône du module virtuel
  • un label du module virtuel
  • une variable globale

 

Pour la configuration de cette main loop, il faut modifier les paramètres suivants :

  • login : Utilisateur Synology
  • password : Mot de passe Synology
  • cameras :
    • {0} => détection automatique des caméras. Par conséquent, les boutons d'action Enable/Disable/Start/Stop agiront sur toutes les caméras simultanément.
    • {1} ou {2} ou {1, 2, 3} ... => ID de la (ou des) caméra(s) à  gérer. On peut envisager de ne piloter qu'une seule caméra, et de multiplier les modules virtuels, afin que chaque module virtuel ne soit responsable que d'une seule caméra (voir aussi VG_status ci-dessous)
  • VG_status :
    • SurvStation_Status => variable globale par défaut créée automatiquement, qui contient le statut de la (ou des) caméra(s), pouvant être exploité dans des scripts LUA.
    • Valeur personnalisée => nécessaire si plusieurs instances du VD afin de piloter différentes caméras (voir aussi cameras ci-dessus). Celle-ci sera également automatiquement créée au démarrage du VD.
  • refresh : intervalle de rafraichissement du statut, par défaut à  10 secondes.
  • standbyIcon, recordIcon, disableIcon : ID des icônes Standby, Recording, et Disabled
-- User configurable variables
local login = "user"
local password = "password"
local cameras = {0} -- {1,2,4,5,6} -- Liste de une ou plusieurs caméras, pour les boutons Start, Stop, Enable, Disable
local VG_status = "SurvStation_Status"
local refresh = 10 -- seconds
local standbyIcon = 1010
local recordIcon = 1011
local disableIcon = 1029

Pour récupérer les ID des 3 icônes, le plus simple est d'utiliser le Toolkit HC2 de Krikroff, on sélectionne l'onglet Virtual Devices, puis Get API Raw Data, puis là  on cherche la valeur du paramètre buttonIcon des boutons Start, Stop, et Disable :

 

gallery_133_79_21547.png

 

 

Utilisation :

 

- Un clic sur les boutons "Enable" ou "Disable", a pour effet d'activer/désactiver la caméra dans Surveillance Station, donc d'activer ou désactiver la détection de mouvement par le Syno.

- Un clic sur le bouton "Start" a pour effet de forcer le démarrage de l'enregistrement continu des caméras sur le disque dur du NAS.

- Un clic sur le bouton "Stop" a pour effet d'arrêter l'enregistrement continu des caméras, qui est équivalent à  repasser en détection de mouvement

- Un clic sur les boutons de position PTZ permet de déplacer la caméra.

- La Main Loop surveille l'enregistrement des caméras, et ajuste l’icône du module virtuel en conséquence, ainsi qu'un petit message en vert en bas du module si un enregistrement est en cours.

 
Ensuite, vous pouvez appeler ces boutons depuis vos scènes, par exemple à  heure fixe programmée, ou en fonction des scénarios tels que la mise en fonctionnement de l'alarme, ou la détection de mouvement.
 
 
Changelog :
  • v1.0 : Initial release
  • v1.01 : Minor bug fixes
  • v2.0 : Main Loop and PTZ control
  • v4.0 : Improved main loop, Add Enable/Disable buttons, Add cameras auto-detection
  • v4.3 : Improved SID connection, added Status global variable
  • v4.4 : Enhanced management of single or multiple camera

 

Téléchargement :

 

 

Modifié par Lazer
  • Upvote 13

Partager ce message


Lien à poster
Partager sur d’autres sites

Très bon boulot encore une fois Lazer.

 

Merci pour ton partage.

Partager ce message


Lien à poster
Partager sur d’autres sites

Allez, hop je le met en place sur mon syno...merci ! ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Tip Top :) , merci pour le partage.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup. Je le mets en place dès que possible.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer

Grace a toi ,je vais être obliger de me racheter un Sygnology

C est madame qui va être contente :P

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai mis à  jour le fichier joint au premier post. Je ne sais pas trop d'où sort ce "5", mais ça devrait être corrigé.

 

Si l'import ne fonctionne pas, voici le code source du module à  copier/coller :

 

Pour les 2 boutons Start et Stop, c'est le même code, il faut simplement changer la variable action en début de script :

--------------------------------------------------
-- Synology Surveillance Station
-- Start/Stop recording
-- Lazer
-- Mars 2014
--------------------------------------------------

-- User configurable variables
local Synology = Net.FHttp("192.168.1.1", 5000)
local login = "user"
local password = "password"
local cameras = {1, 2, 3}
local action = "start" -- "stop"

-- System variables
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."
}
local API_RECORD_ERROR_CODE = {
	[400] = "Execution failed.",
	[401] = "Parameter invalid.",
	[402] = "Camera disabled."
}

-- Discover available APIs and corresponding information
payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth,SYNO.SurveillanceStation.ExternalRecording"
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.ExternalRecording"].maxVersion >= 2 then
		fibaro:debug("Synology API version OK")
		pathAuth = jsonTable.data["SYNO.API.Auth"].path
		pathRecord = jsonTable.data["SYNO.SurveillanceStation.ExternalRecording"].path
		fibaro:debug("Synology API Auth path = "..pathAuth)
		fibaro:debug("Synology API Surveillance Station Record path = "..pathRecord)

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

				for i = 1, #cameras do
					-- Start or stop external recording of a camera
					payload = "/webapi/"..pathRecord.."?api=SYNO.SurveillanceStation.ExternalRecording&method=Record&version=2&cameraId="..cameras[i].."&action="..action.."&_sid="..SID
					response, status, errorCode = Synology:GET(payload)
					jsonTable = json.decode(response);
					if jsonTable.success == true then
						fibaro:log("OK")
						fibaro:debug('<span style="color:green;">Synology Surveillance Station '..action..' recording for camera "'..tostring(cameras[i])..'" OK</span>')
					else
						fibaro:log("Erreur")
						fibaro:debug('<span style="color:red;">Synology Surveillance Station '..action..' recording for camera "'..tostring(cameras[i])..'" FAILED : '..API_RECORD_ERROR_CODE[tonumber(jsonTable.error.code)]..'</span>')
					end
				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

.

 

Pour le bouton List :

--------------------------------------------------
-- Synology Surveillance Station
-- List cameras
-- Lazer
-- Mars 2014
--------------------------------------------------

-- User configurable variables
local Synology = Net.FHttp("192.168.1.1", 5000)
local login = "user"
local password = "password"

-- System variables
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"
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 then
		fibaro:debug("Synology API version OK")
		pathAuth = jsonTable.data["SYNO.API.Auth"].path
		pathCamera = jsonTable.data["SYNO.SurveillanceStation.Camera"].path
		fibaro:debug("Synology API Auth path = "..pathAuth)
		fibaro:debug("Synology API Surveillance Station Camera path = "..pathCamera)

		-- 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
				--fibaro:debug(payload)
				response, status, errorCode = Synology:GET(payload)
				--fibaro:debug(response)
				--fibaro:debug(status)
				--fibaro:debug(errorCode)
				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>')
					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

je viens juste de déballer mon cadeau d'anniversaire et devinez quoi!! un Synology DS213j, ça tombe bien!!

 

 

bravo et merci Lazer

Partager ce message


Lien à poster
Partager sur d’autres sites

Pile poil ce qu'il me faut ça !

 

Bon, j'ai une grosse question de noob qui tue (je suis pas encore équipé, désolé) : ça tourne sur un HCL ça ?

 

Diego

Partager ce message


Lien à poster
Partager sur d’autres sites

Comme je t'ai déjàdit non.

Aucun code lua n'est possible dans la HClite

Partager ce message


Lien à poster
Partager sur d’autres sites

Narsil,

 

Non, je ne pense pas que ça tournera sur HCL, car il me semble bien qu'il n'est pas possible d'importer un Virtual Device comportant du code LUA.

Peut-être qu'en v4 avec les plugins ça sera possible, mais pour le moment ce ne sont que des suppositions.

Avec la HC Lite, tu peux seulement appeler des URL simples, avec la commande HTTP GET. Donc il faudrait que les scripts de ce module virtuel soient hébergés sur un autre serveur. Mais comme tu as peu de chances de pouvoir faire tourner du LUA sur une autre plateforme, il faudrait transcrire le code en PHP par exemple.... bref, ce n'est que déporter la complexité sur un autre serveur.

 

EDIT : grillé par Shad !

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci @Lazer... toujours des Tutos impeccables (clairs, détaillés, illustrés !)  :icon1010:

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour la configuration HC2 , j'ai fais deux groupes donc deux modules, un Module Intérieur (5 cams record) et un Module Extérieur (4cams record). On peut créer aussi un module par cam ( mais ça fait beaucoup de bouton a appuyer en même temps).

 

merci encore et toujours

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer, super boulot, et ça tombe pil poile car je viens d'installer deux caméras mobotix chez moi

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Lazer:

Est-ce qu'il serait envisageable d'utiliser ce module virtuel en faisant quelques modifications, avec un NAS Qnap et la surveillance station de Qnap ?!

Bonne soirée.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui tout est possible :)

Mais comme je ne connais pas du tout l'API Qnap, et que je n'ai pas de Qnap pour tester, je te laisse t'y coller ;)

Tu peux reprendre les scripts, et créer un nouveau sujet dédié.

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai enfin eu le temps de mettre ça en place  :60:

Super Lazer,  ça marche nickel.

j'ai du copier le code pour le "STOP" car cela ne fonctionné pas direct avec le VD, mais une fois copier/coller et mis mes paramètres , super  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

×