Aller au contenu

QuickApp pour positionner une camera Axis 215


Messages recommandés

Posté(e) (modifié)

Bonsoir à tous, suite à l'acquisition d'une HC3 très récemment, je commence a regarder pour refaire les quelques VD qui tournent sur ma HC2 en QuickApp. et pour tout vous dire j'ai beaucoup de mal.

J'ai actuellement un petit VD avec 4 boutons qui positionnent une camera AXIS 215 sur des positions prédéfinies et qui affiche la position actuelle.

 

Le code de chaque bouton est le suivant :

--On définit le périphérique qu'on va attaquer et on s'authentifie dessus
FHTE = Net.FHttp("192.168.20.12")
FHTE:setBasicAuthentication("login","password")

-- Et là notre requête
response = FHTE:GET("/axis-cgi/com/ptz.cgi?gotoserverpresetname=Porte")
fibaro:setGlobal("AXIS215PTZ", "Porte")

J'ai donc essayé de faire un quickapp avec 4 boutons avec le code suivant suite à la lecture de pas mal de posts

-- QuickApp pour positionner une caméra Axis 215

local ipAddress = "192.168.20.12"
local username = "login"
local password = "password"

-- Fonction pour envoyer une requête HTTP à la caméra
local function sendRequest(position)
  local url = string.format("http://%s/axis-cgi/com/ptz.cgi?gotoserverpresetname=%s", ipAddress, position)
  local headers = {
    ["Authorization"] = "Basic " .. fibaro.encodeBase64(username .. ":" .. password)
  }
  http:request(url, {
    options = {
      headers = headers,
      method = "GET"
    },
    success = function(response)
      fibaro.debug("Response: " .. response.data)
    end,
    error = function(error)
      fibaro.debug("Error: " .. error)
    end
  })
end

-- Bouton pour positionner la caméra à la position Cours
function QuickApp:onCoursButtonClick()
  sendRequest("Cours")
end

-- Bouton pour positionner la caméra à la position Porte
function QuickApp:onPorteButtonClick()
  sendRequest("Porte")
end

-- Bouton pour positionner la caméra à la position Pelouse
function QuickApp:onPelouseButtonClick()
  sendRequest("Pelouse")
end

-- Bouton pour positionner la caméra à la position Boite
function QuickApp:onBoiteButtonClick()
  sendRequest("Boite")
end

Mais le quickapp plante

[29.05.2023] [22:42:08] [TRACE] [QUICKAPP53]: UIEvent: {"elementName":"button_Pelouse","deviceId":53,"eventType":"onReleased","values":[]}
[29.05.2023] [22:42:08] [DEBUG] [QUICKAPP53]: ./include/main.lua:11: attempt to call a nil value (field 'encodeBase64')
[29.05.2023] [22:42:08] [ERROR] [QUICKAPP53]: QuickApp crashed
[29.05.2023] [22:42:08] [ERROR] [QUICKAPP53]: Unknown error occurred: handleJsonRpc

Je pense que je n'ai pas encore compris la philosophie des quickapps, mais ca va venir...

Merci pour votre aide

 

VD_AXIS_215.png

Modifié par gargamel01000
Posté(e)

L'erreur te dit que tu appelles la fonction fibaro.encodeBase64() en ligne 11 mais elle n'existe pas.

 

Voici la fonction que tu peux intégrer dans ton code (trouvée sur le forum) :

local function encodeBase64(s)
	-- http://lua-users.org/wiki/BaseSixtyFour
	local bs = { [0] =
		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
		'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
	}
	local byte, rep = string.byte, string.rep
	local pad = 2 - ((#s-1) % 3)
	s = (s..rep('\0', pad)):gsub("...", function(cs)
		local a, b, c = byte(cs, 1, 3)
		return bs[a>>2] .. bs[(a&3)<<4|b>>4] .. bs[(b&15)<<2|c>>6] .. bs[c&63]
	end)
	return s:sub(1, #s-pad) .. rep('=', pad)
end

 

PS : ton code brut, non formaté, le rend illisible donc je n'ai pas essayé d'étudier le reste.
Pense à utiliser les balises d'insertion de code la prochaine fois.

 

Posté(e)

Bon j'ai modifié le code comme ceci :

local ipAddress = "192.168.20.12"
local username = "xxxxx"
local password = "xxxxxxxx"

local function encodeBase64(s)
	-- http://lua-users.org/wiki/BaseSixtyFour
	local bs = { [0] =
		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
		'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
	}
	local byte, rep = string.byte, string.rep
	local pad = 2 - ((#s-1) % 3)
	s = (s..rep('\0', pad)):gsub("...", function(cs)
		local a, b, c = byte(cs, 1, 3)
		return bs[a>>2] .. bs[(a&3)<<4|b>>4] .. bs[(b&15)<<2|c>>6] .. bs[c&63]
	end)
	return s:sub(1, #s-pad) .. rep('=', pad)
end

-- Fonction pour envoyer une requête HTTP à la caméra
local function sendRequest(position)
  local url = string.format("http://%s/axis-cgi/com/ptz.cgi?gotoserverpresetname=%s", ipAddress, position)
  local headers = {
    ["Authorization"] = "Basic " .. encodeBase64(username .. ":" .. password)
  }
  local http = net.HTTPClient()
  http:request(url, {
    headers = headers,
    method = "GET",
    success = function(response)
      fibaro.debug("Response: " .. response.data)
    end,
    error = function(error)
      fibaro.debug("Error: " .. error)
    end
  })
end

-- Bouton pour positionner la caméra à la position Cours
function QuickApp:onCoursButtonClick()
  sendRequest("Cours")
end

-- Bouton pour positionner la caméra à la position Porte
function QuickApp:onPorteButtonClick()
  sendRequest("Porte")
end

-- Bouton pour positionner la caméra à la position Pelouse
function QuickApp:onPelouseButtonClick()
  sendRequest("Pelouse")
end

-- Bouton pour positionner la caméra à la position Boite
function QuickApp:onBoiteButtonClick()
  sendRequest("Boite")
end

Je n'ai plus d'erreur, mais je n'ai pas de réponse envoyée par la caméra. (exemple quand je clique sur le bouton Pelouse)

[31.05.2023] [22:50:30] [TRACE] [QUICKAPP53]: UIEvent: {"elementName":"button_Pelouse","values":[null],"deviceId":53,"eventType":"onReleased"}
[31.05.2023] [22:50:30] [DEBUG] [RESPONSE: ]: nil

C'est bon Lazer, j'ai trouvé la balise code...

Posté(e)

Elle existe la fonction fibaro.debug() dans les QuickApps ?
Etrange... en tout cas elle ne fonctionne pas comme attendu, vu ton log je soupçonne qu'elle utilise la même syntaxe que dans les scènes, avec le 1er argument pour le TAG, et le 2nd argument pour le texte à afficher.
Vu que tu as un résultat nil, ça semble correspondre (tu n'as pas mis de 2nd argument)

 

Utilise plutôt la fonction prévue dans les QuickApps : self:debug()

Problème, self est inconnu car ta fonction sendResquest est locale, et non membre de la classe QuickApp.

Donc tu as plusieurs options :

 

  • mettre ta fonction sendRequest dans QuickApp (perso c'est ce que je ferais)
function QuickApp:sendRequest(position)

attention dans ce cas l'appel de la fonction depuis les boutons se fera comme suit :

self:sendRequest("Boite")

 

  • passer self en argument de cette fonction
local function sendRequest(self, position)

attention dans ce cas il faudra passer self en 1er argument lors de l'appel de cette fonction :

sendRequest(self, "Boite")

 

  • ou bien utiliser directement quickApp (sans la majuscule, c'est une variable globale qui pointe sur l'instance de ton QA.... perso je ne suis pas fan et je n'utilise cette technique qu'en dernier recours)
quickApp:debug("Response: " .. response.data)

 

 

C'est un peu compliqué tout ça, je n'ai pas trop le temps / courage d'entrer dans les détails, mais tous ces sujets ont déjà été largement étudiés en profondeur sur le forum... noyé dans les différents topics !

 

  • 5 mois après...
Posté(e)

Bonsoir à tous,

j'ai enfin réussi a sortir un code qui fonctionne pour positionner ma camera Axis 215 PTZ.

 

image.thumb.png.64c7b887184f1987a488a6ad14b67215.png

 

image.thumb.png.905485e61edbdc8de72b85c449f69df1.png

 

et voila le code

function QuickApp:onInit()
    self:debug("onInit")
    self.http = net.HTTPClient({timeout=3000})
    __TAG = "QA_"..plugin.mainDeviceId.."_Position Camera"
    --Mise a jour Variable sur label
    local Position = fibaro.getGlobalVariable("Position_Camera")
    self:updateView("lblPosition", "text", "La position de la caméra est : "..Position)
end
 	
local function encodeBase64(s)
	-- http://lua-users.org/wiki/BaseSixtyFour
	--self:debug("fonction encode base")
	local bs = { [0] =
		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
		'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/',
	}
	local byte, rep = string.byte, string.rep
	local pad = 2 - ((#s-1) % 3)
	s = (s..rep('\0', pad)):gsub("...", function(cs)
		local a, b, c = byte(cs, 1, 3)
		return bs[a>>2] .. bs[(a&3)<<4|b>>4] .. bs[(b&15)<<2|c>>6] .. bs[c&63]
	end)
	return s:sub(1, #s-pad) .. rep('=', pad)
end

function QuickApp:PositionCamera(Position_cam)
  local url = string.format("http://192.168.20.12/axis-cgi/com/ptz.cgi?gotoserverpresetname=%s", Position_cam)
  local headers = {
  ["Authorization"] = "Basic " .. encodeBase64("login:password")
                  }
  self.http:request(url, {
      options = {
      headers = headers,
      method = "GET"
    },
    success = function(response)
      fibaro.debug("Response: " .. response.data)
    end,
    error = function(error)
      fibaro.debug("Error: " .. error)
    end
  })
end

-- Position Cours
function QuickApp:onCoursButtonClick(event)
    self:PositionCamera("Cours")
    fibaro.setGlobalVariable("Position_Camera", "Cours")
    self:debug("Position Caméra : Cours")
    self:onInit()
end

-- Position Porte
function QuickApp:onPorteButtonClick(event)
    self:PositionCamera("Porte")
    fibaro.setGlobalVariable("Position_Camera", "Porte")
    self:debug("Position Caméra : Porte")
    self:onInit()
end

-- Position Pelouse
function QuickApp:onPelouseButtonClick(event)
    self:PositionCamera("Pelouse")
    fibaro.setGlobalVariable("Position_Camera", "Pelouse")
    self:debug("Position Caméra : Pelouse")
    self:onInit()
end

-- Position Boite
function QuickApp:onBoiteButtonClick(event)
    self:PositionCamera("Boite")
    fibaro.setGlobalVariable("Position_Camera", "Boite")
    self:debug("Position Caméra : Boite")
    self:onInit()
end

Le code n'est certainement pas très optimisé, mais il fonctionne.

Par contre j'aurai aimé indiquer la position de la caméra sur la vignette du quickapp.

 

image.png.b33b3d7a6480a5bbb53140d7af34eed7.png

 

Une idée de comment si prendre.

 

Et merci encore pour vos conseils.

  • Like 2
Posté(e)

Merci Lazer, en fait j'utilise cette fonction pour mettre a jour le label du quickapp lorsqu'il est ouvert, mais pour le rajouter directement sur la vignette du quickapp pour que la position soit visible sans avoir a l'ouvrir, a quoi correspond "myLabel"

 

Posté(e)

Au désolé j'avais pas compris que tu voulais mettre à jour le log, je pensais que tu voulais un label.

 

Perso j'utilise peu le log, car il ne s'affiche que sur l'interface Web, qui n'est que de l'administration dans mon usage.

En pratique c'est l'App mobile que j'utilise pour contrôler manuellement ma domotique, donc là le label est utile pour avoir un retour visuel.

 

Et myLabel c'est un exemple de nom pour le label en question.

×
×
  • Créer...