Aller au contenu

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


Lazer

Messages recommandés

Comme d' habitude à  chaque fois que je veux faire une chose nouvelle, je galère dès le départ  :

 

Mon Synology est en DSM 5.2-5592 Update 4, Surveillance station en : 7.0.3778, mon FC2 en 4.056.

 

J' ai renseigné le login et le mot de passe de mon Sinology dans votre code, 

ainsi que son IP et port,

Je lance le module de Lazer version 4.1 que je viens d' importer avec DEBUG=true

et l' instruction :

local Synology = Net.FHttp(IP, tonumber(port))

se fâche tout rouge et me renvois à  ma triste incompétence....

 

Merci à  Lazer, JoJo, Secbien ou tout autre chantre du LUA de m' éclairer de leurs LUAmières....

Lien vers le commentaire
Partager sur d’autres sites

-- User configurable variables

login = "admin"
password = "xxxxxxxx"
cameras = {1}
action = "start" -- start/stop/Enable/Disable
 
-- System variables
local debug_trace = true
error = false
local selfID = fibaro:getSelfId()
local ip = fibaro:get(selfID, '192.168.1.200')
local port = fibaro:get(selfID, '5000')
local Synology = Net.FHttp(ip, tonumber(port))
 
Et l' erreur apparait :
[ERROR] 15:24:40: line FHttp:
 
 
non, pas d' espace.
 
Merci Lazer,
Lien vers le commentaire
Partager sur d’autres sites

Ok, j' ai renseigné l' IP et ports au niveau du module virtuel.

Maintenant j' ai l' erreur suivante :

 

[DEBUG] 16:13:20: /webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=admin&passwd=xxxxxxxxx&session=SurveillanceStation&format=sid


[DEBUG] 16:13:20: Error : API Authentication failure, Permission denied., {"error":{"code":402},"success":false}

Lien vers le commentaire
Partager sur d’autres sites

C'est bizarre que ça plante quand le code 117 apparait, normalement le script est censé gérer le cas de figure d'un code inconnu en renvoyant "???" :

..(self.API_CAMERA_ERROR_CODE[tonumber(jsonTable.error.code)] or self.API_COMMON_ERROR_CODE[tonumber(jsonTable.error.code)] or "???")..

Donc ça veut dire qu'il y a un endroit où on a oublié de mettre cette protection en place ?

C'est à  quelle ligne que ça se produit ?

le script plante a cause de la gestion d'erreur ;-)

Quand il ne trouve pas ce tableau:

Il faut donc l'ajouter dans le code de tous les boutons

 

local API_CAMERA_ERROR_CODE = {
[117] = "Not Enough Permission or access denied.",
[400] = "Execution failed.",
[401] = "Parameter invalid.",
[402] = "Camera disabled."
}
Lien vers le commentaire
Partager sur d’autres sites

 

si a la ligne +- 169 je met ceci:

if jsonTable.data["SYNO.API.Auth"].maxVersion >= 3 and jsonTable.data["SYNO.SurveillanceStation.Camera"].maxVersion >= 2 then

je n'ai plus le message d'erreur de version mais j'ai ceci: (pour Enable)

[DEBUG] 18:22:23: Synology API version OK
[DEBUG] 18:22:23: Request new SID
[DEBUG] 18:22:24: Synology API Auth OK
[ERROR] 18:22:25: line 138: attempt to index global 'API_CAMERA_ERROR_CODE' (a nil value)

 

 

Ce qui me fait penser que je n'ai toujours pas mis le nouveau VD de Jojo en première page.

J'attends de voir avec Sebcbien si y'a effectivement un bug à  corriger et je m'en occupe.

désolé du retard, mis de côté puis oublié de répondre :-/

 

Voici le résumé des modifications:

J'ai un vrai synology, ceci explique peut être la différence ? (surveillance station V7.x) et dernière version du dsm en cours

 

1) Ajout de la table api camera error code avec entrée 117 (ligne 46 du code ci-dessous)

  J'ai mis aussi la table ptz, inutile je pense, mais comme dirait ma femme, .. on ne sais jamais ;-)

  bref, on peut l'enlever mais maintenant c'est la même série pour tous les boutons.

 

2) Versions de l'api qui donne l'erreur suivante:
[DEBUG] 18:14:56: Error : Synology API version is too old : DSM 4.0-2251 and Surveillance Station 6.3 are required
code avec la table camera (mais manque l'entrée de l'erreur 117)
et code complet avec modification de la ligne 170 pour la version de l'api: (177 du code ci-dessous)
maxVersion >= 3 au lieu de maxVersion >= 2
 
3) Modification pour le start/stop: (&version= 1 au lieu de &version=2) (ligne 127 du code ci-dessous)
 
Voici le code complet (pour le bouton start stop): 
--------------------------------------------------
-- Module  : Synology Surveillance Station v4
-- Button  : Start/Stop recording
-- Author  : Lazer
--------------------------------------------------

-- User configurable variables
local login = "XXXXXXXX"
local password = "XXXXXXXXX"
local cameras = {1,2,4,5,6}
local action = "start" -- start/stop/Enable/Disable


-- System variables
local debug_trace = false
error = false
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_COMMON_ERROR_CODE = {
	[100] = "Unknown error",
	[101] = "Invalid parameters",
	[102] = "API does not exist",
	[103] = "Method does not exist",
	[104] = "This API version is not supported",
	[105] = "Insufficient user privilege",
	[106] = "Connection time out",
	[107] = "Multiple login detected"
}
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."
}
local API_CAMERA_ERROR_CODE = {
	[117] = "Not Enough Permission or access denied.",
	[400] = "Execution failed.",
	[401] = "Parameter invalid.",
	[402] = "Camera disabled."
}
local API_PTZ_ERROR_CODE = {
	[400] = "Execution failed.",
	[401] = "Parameter invalid.",
	[402] = "Camera disabled."
}

-- Message function
function Message(log_msg, label_msg, trace, debug_msg)
	if log_msg then
		fibaro:log(log_msg)
	end
	if debug_msg and (debug_trace or trace) then
		fibaro:debug(debug_msg)
	end
	if label_msg then
		fibaro:call(selfID, "setProperty", "ui.LabelStatus.value", label_msg)
		fibaro:setGlobal('SurvStation_Status', label_msg)
	end
end

-- Get Cameras list
local camera = false
if cameras then
	for k, v in ipairs(cameras) do
		if v > 0 then
			Message(nil, nil, false, "cameras{} exists")
			camera = true
			break
		end
	end
end
if not camera then
	local label = fibaro:get(selfID, "ui.LabelCameras.value")
	if label ~= nil and label ~= "" then
		Message(nil, nil, false, "Create cameras{}")
		cameras = json.decode(label)
	end
end
Message(nil, nil, false, "cameras{} : " .. json.encode(cameras))

-- génération d'un nouvel SID
function GetSID()
	-- Create new login session
	fibaro:debug("Request new SID")
	payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Login&version=2&account="..login.."&passwd="..password.."&session=SurveillanceStation&format=sid"
	Message(nil, nil, false, payload)
	response, status, errorCode = Synology:GET(payload)
	if tonumber(errorCode) == 0 and tonumber(status) == 200 then
		if response ~= nil and response ~= "" then
			jsonTable = json.decode(response)
			if jsonTable.success == true then
				fibaro:setGlobal('SurvStation_SID', jsonTable.data.sid)
				Message(nil, nil, true, "Synology API Auth OK")
			else
				fibaro:debug('<span style="color:red;">Error : API Authentication failure, '..(API_AUTH_ERROR_CODE[tonumber(jsonTable.error.code)] or API_COMMON_ERROR_CODE[tonumber(jsonTable.error.code)] or "???")..'</span>')
			end
		else
			fibaro:debug('<span style="color:red;">Error : API Authentication failure, empty response</span>')
		end			
	else
		fibaro:debug('<span style="color:red;">Error : API Authentication failure, errorCode='..errorCode..', status='..status..'</span>')
	end
end

-- Destroy current login session
function Destroy()
	-- fibaro:debug("Destroy current SID")
	payload = "/webapi/"..pathAuth.."?api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation&_sid="..SID
	response, status, errorCode = Synology:GET(payload)
end

-- Start or stop external recording of a camera
function Action()
	for i = 1, #cameras do
		if action == "start" or action == "stop" then
			payload = "/webapi/"..pathRecord.."?api=SYNO.SurveillanceStation.ExternalRecording&method=Record&version=1&cameraId="..cameras[i].."&action="..action.."&_sid="..SID
		else
			payload = "/webapi/"..pathCamera.."?api=SYNO.SurveillanceStation.Camera&method="..action.."&version=3&cameraIds="..cameras[i].."&_sid="..SID
		end
		Message(nil, nil, false, payload)
		response, status, errorCode = Synology:GET(payload)
		if tonumber(errorCode) == 0 and tonumber(status) == 200 then
			if response ~= nil and response ~= "" then
				jsonTable = json.decode(response);
				if jsonTable.success == true then
					if action == "start" or action == "stop" then
						Message("OK", action.." OK", true, '<span style="color:green;">Synology Surveillance Station '..action..' recording for camera "'..tostring(cameras[i])..'" OK</span>')
					else
						Message("OK", action.." OK", true, '<span style="color:green;">Synology Surveillance Station '..action..' camera "'..tostring(cameras[i])..'" OK</span>')
					end
				else
					if action == "start" or action == "stop" then
						Message("Erreur", action.." failed", true, '<span style="color:red;">Synology Surveillance Station '..action..' recording for camera "'..tostring(cameras[i])..'" FAILED : '..(API_RECORD_ERROR_CODE[tonumber(jsonTable.error.code)] or API_COMMON_ERROR_CODE[tonumber(jsonTable.error.code)] or "???")..', '..response..'</span>')
					else
						Message("Erreur", action.." failed", true, '<span style="color:red;">Synology Surveillance Station '..action..' camera "'..tostring(cameras[i])..'" FAILED : '..(API_CAMERA_ERROR_CODE[tonumber(jsonTable.error.code)] or API_COMMON_ERROR_CODE[tonumber(jsonTable.error.code)] or "???")..', '..response..'</span>')
					end
					if tonumber(jsonTable.error.code) == 105 then error = true end	
				end
			else
				if action == "start" or action == "stop" then
					Message("Erreur", action.." failed", true, '<span style="color:red;">Synology Surveillance Station '..action..' recording for camera failed, empty response</span>')
				else
					Message("Erreur", action.." failed", true, '<span style="color:red;">Synology Surveillance Station '..action..' camera failed, empty response</span>')
				end
			end
		else
			if action == "start" or action == "stop" then
				Message("Erreur", action.." failed", true, '<span style="color:red;">Synology Surveillance Station '..action..' recording for camera failed, errorCode='..errorCode..', status='..status..', response='..(response or "")..'</span>')
			else
				Message("Erreur", action.." failed", true, '<span style="color:red;">Synology Surveillance Station '..action..' camera failed, errorCode='..errorCode..', status='..status..', response='..(response or "")..'</span>')
			end
		end
	end	
end

-- Discover available APIs and corresponding information
if action == "start" or action == "stop" or action == "Enable" or action == "Disable" then
	-- only if a valid action
	fibaro:call(selfID, "setProperty", "ui.LabelStatus.value", action.."...")
	payload = "/webapi/query.cgi?api=SYNO.API.Info&method=Query&version=1&query=SYNO.API.Auth,SYNO.SurveillanceStation.ExternalRecording,SYNO.SurveillanceStation.Camera"
	Message(nil, nil, false, payload)
	response, status, errorCode = Synology:GET(payload)
	if tonumber(errorCode) == 0 and tonumber(status) == 200 then
		if response ~= nil and response ~= "" then
			jsonTable = json.decode(response);
			if jsonTable.data["SYNO.API.Auth"].maxVersion >= 3 and jsonTable.data["SYNO.SurveillanceStation.Camera"].maxVersion >= 2 then
				Message(nil, nil, true, "Synology API version OK")
				pathAuth = jsonTable.data["SYNO.API.Auth"].path
				pathRecord = jsonTable.data["SYNO.SurveillanceStation.ExternalRecording"].path
				pathCamera = jsonTable.data["SYNO.SurveillanceStation.Camera"].path
				Message(nil, nil, false, "Synology API Auth path = "..pathAuth)
				Message(nil, nil, false, "Synology API Surveillance Station Record path = "..pathRecord)
				Message(nil, nil, false, "Synology API Surveillance Station Camera path = "..pathCamera)

				SID = fibaro:getGlobal('SurvStation_SID')
				if SID == nil or SID == "" then
					Destroy()
					GetSID()
					SID = fibaro:getGlobal('SurvStation_SID')
				end
				Message(nil, nil, false, "Synology API Auth SID = "..SID)
				Action()
				if error == true then
					Destroy()
					GetSID()
					SID = fibaro:getGlobal('SurvStation_SID')
					Action()
				end
			else
				Message("Erreur", action.." failed", true, '<span style="color:red;">Error : Synology API version is too old : <b>DSM 4.0-2251</b> and <b>Surveillance Station 6.3</b> are required</span>')
			end
		else
			Message("Erreur", action.." failed", true, '<span style="color:red;">Error : Can not connect to Synology server, empty response</span>')
		end
	else
		Message("Erreur", action.." failed", true, '<span style="color:red;">Error : Can not connect to Synology server, errorCode='..errorCode..', status='..status..', ip='..ip..', port='..port..', payload='..payload..', response='..(response or "")..'</span>')
	end
else
	Message("Erreur", action.." failed", true, '<span style="color:red;">Error : Not a valid action.</span>')
end
Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...
  • 2 semaines après...

Lazer,

c'est un super comme module virtuel

il est extra

j'ai suivi à  la lettre l'ensemble des pages de ton tuto.

néanmoins j'ai une question, de temps en temps, lorsque je clic (une scène GEA ou moi physiquement) sur le bouton start ou stop (j'ai 6 cameras sur syno, je fais les tests avec 3) j'ai le message "start failed" ou "stop failed" dans le LABELstatut.

 

j'ai une scene GEA, si intrusion alors alarme, clic sur le bouton start (ID1) du VD, si arret alarme alors "stop" cameras

dans les deux cas, c'est incertain, il arrive (lors des tests alarme) que le start soit resté sur "failed"

je pense avoir absolument respecté l’ensemble des paramétres login, password, local cameras ....

 

ne pourrait on pas, dans ma scène GEA, lui dire de clic sur  start du VD, jusqu'a statut "start OK"? ou autre solution

  -- ALARME
-- Quand la Sirene s'active si alarme activée, alors on allume tout et on ferme les volets et REC CAMERA (1=START cam)
GEA.add({{"Value",id["SIRENE"],id["ALARMESTATUT"],0}}, -1 , "ALARME INTRUSION SIRENE en Marche" , {{"Inverse"},{"VirtualDevice",id["VD_CAMERA"],1},{"turnOn", id["DIM_SAM"]},{"turnOn", id["DIM_ENTREE"]},{"turnOn", id["DIM_ESC"]},{"turnOn", id["ECL_SAM1"]},{"turnOn", id["ECL_SAM2"]},{"turnOn", id["ECL_JARDIN"]},{"Close",id["VR_SALON"],100},{"Close",id["VR_CUISINE"],100},{"Close",id["VB_ENTREE"],100},{"Close",id["VB_SAM"],100}})   

-- Quand la sirène s'arrète, si l'alarme est desactivée alors arret eclairage jardin, DIM SAM et DIM ESC et STOP CAMERA (2=STOP cam)
GEA.add({id["SIRENE"],id["ALARMESTATUT"]}, -1 , "stop tt apres alarme" , {{"VirtualDevice",id["VD_CAMERA"],2},{"turnOff", id["ECL_JARDIN"]},{"turnOff", id["DIM_SAM"]},{"turnOff", id["DIM_ESC"]}})  

cam start

Lien vers le commentaire
Partager sur d’autres sites

Salut Sebcbien, 

euh, c'est de la tienne dont je parlais, j'ai remplacé par ton code le start stop.#290

rien à  faire

c'est vraiment curieux ;)

en revanche, je vais regarder celle de jojo, que j'ai zappé. 

 

EDIT:

 

la version qui fonctionne maintenant chez moi, et pour le moment sans bug "Surveillance_Station_v4.1.vfib"

 

 

j'ai un autre souci maintenant, je cherche le numero de ce nouveau VD, HC2 toolkit 1.1.0.6  HC2 v4.070 ne fonctionne plus chez moi

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...