gargamel01000 Posté(e) le 29 mai 2023 Signaler Posté(e) le 29 mai 2023 (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 Modifié le 31 mai 2023 par gargamel01000
Lazer Posté(e) le 30 mai 2023 Signaler Posté(e) le 30 mai 2023 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.
gargamel01000 Posté(e) le 31 mai 2023 Auteur Signaler Posté(e) le 31 mai 2023 Merci Lazer je vais regarder ça. Bizarre pour le code je l’ai pourtant bien mis en insertion de code
gargamel01000 Posté(e) le 31 mai 2023 Auteur Signaler Posté(e) le 31 mai 2023 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...
Lazer Posté(e) le 31 mai 2023 Signaler Posté(e) le 31 mai 2023 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 !
gargamel01000 Posté(e) le 1 juin 2023 Auteur Signaler Posté(e) le 1 juin 2023 Merci Lazer d'avoir pris un peu de ton temps.
gargamel01000 Posté(e) le 29 novembre 2023 Auteur Signaler Posté(e) le 29 novembre 2023 Bonsoir à tous, j'ai enfin réussi a sortir un code qui fonctionne pour positionner ma camera Axis 215 PTZ. 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. Une idée de comment si prendre. Et merci encore pour vos conseils. 2
Lazer Posté(e) le 29 novembre 2023 Signaler Posté(e) le 29 novembre 2023 Il faut utiliser : self:updateView("myLabel", "text", "Hello World") Doc de référence : https://manuals.fibaro.com/home-center-3-quick-apps/
gargamel01000 Posté(e) le 29 novembre 2023 Auteur Signaler Posté(e) le 29 novembre 2023 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"
fredokl Posté(e) le 29 novembre 2023 Signaler Posté(e) le 29 novembre 2023 Essai avec: self:updateProperty("log", "Ta position ici")
Lazer Posté(e) le 30 novembre 2023 Signaler Posté(e) le 30 novembre 2023 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.
Messages recommandés