jucom Posté(e) le 2 mars 2021 Signaler Posté(e) le 2 mars 2021 Bonjour, je cherche de l'aide car je bloque sur quelque chose qui doit être facile mais qui pour moi est très compliqué. J'aimerai envoyer une requete HTTPS depuis la HC3 pour déclencher une action préconfigurée dans surveillance station (synology). En clair la HC3 remonte un mouvement PIR et pousse la requête HTTPS qui déclenche l'action préconfigurée dans surveillance station. le requête est la suivante : https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This is external event1"&account="{account}"&password="{password}" Dans Firefox, j'ai le bon retour "success" et l'action préconfigurée fonctionne. Comme j'ai vu que l'on pouvait faire ce genre de chose avec net.HTTPClient(), je me suis lancé mais évidement ce n'est pas si simple, du moins pour moi... J'ai créé une scene lua et en déclaration j'ai ; { conditions = { { id = 216, isTrigger = true, operator = "==", property = "value", type = "device", value = true } }, operator = "all" } en action j'ai ; local http = net.HTTPClient() http:request("https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This is external event1"&account="MONLOGIN"&password="MONPASSWORD"", { success = function(response) if response.status == 200 then fibaro:debug('OK, réponse : '.. response.data) else fibaro:debug("Erreur : status=" .. tostring(response.status)) end end, error = function(err) fibaro:debug("Erreur : " .. err) end, options = { method = 'GET' } }) Selon mes essais j'ai toujours des messages d'erreurs [02.03.2021] [06:31:47] [ERROR] [SCENE99]: (load):3: ')' expected near 'Trigger' [02.03.2021] [06:46:11] [ERROR] [SCENE99]: (load):3: ')' expected near '"&method="' [02.03.2021] [06:47:13] [ERROR] [SCENE99]: (load):3: ')' expected near '"Trigger"' J'ai compris que le problème c'est la requête HTTPS en elle même car elle contient des " un peu partout. Elle n'est pas prise en compte dans son intégralité et du coup le reste de la requête génère des erreurs. Pourriez vous m'aider SVP ?
Lazer Posté(e) le 2 mars 2021 Signaler Posté(e) le 2 mars 2021 La réponse saute aux yeux avec la coloration du code, et en plus le message d'erreur t'indique où ça coince : près de Trigger dans ton URL Ce sont les guillemets, tu ne peux pas les mettre ainsi dans une chaine de caractère (string) elle-même entourée de guillemets. Donc soit tu entoures ta chaine complète de single quotes à la place des doubles quotes, soit tu protège les doubles quotes à l'intérieur de la chaine par des antislashs. 'https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This is external event1"&account="MONLOGIN"&password="MONPASSWORD"' -- ou : "https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=\"Trigger\"&version=1&eventId=1&eventName=\"This is external event1\"&account=\"MONLOGIN\"&password=\"MONPASSWORD\"" (tu vois bien que la chaine entière est colorée, il n'y a plus de rupture) Par ailleurs, si ton intention était de concaténer la chaine de caractères avec une variable, alors il faut lui dire avec les 2 petits points : "https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="..Trigger.."&version=1&eventId=1&eventName="..This_is_external_event1.."&account="..MONLOGIN.."&password="..MONPASSWORD (tu noteras que j'ai mis des underscores dans le nom de variable This_is_external_event1, car les espaces sont évidemment impossibles dans un nom de variable) 1
jucom Posté(e) le 2 mars 2021 Auteur Signaler Posté(e) le 2 mars 2021 Ok, j'ai compris la notion de chaine, quote et antislashs. Je test ca ! Merci Bcp,
jucom Posté(e) le 2 mars 2021 Auteur Signaler Posté(e) le 2 mars 2021 (modifié) j'ai essayé les 3 possibilités en prenant en compte les explications.avec cette version je vois qu'il prend bien la totalité de ma requête local http = net.HTTPClient() http:request('https://IPSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This_is_external_event1"&account="LOGIN"&password="PASSWORD"', { success = function(response) if response.status == 200 then fibaro:debug('OK, réponse : '.. response.data) else fibaro:debug("Erreur : status=" .. tostring(response.status)) end end, error = function(err) fibaro:debug("Erreur : " .. err) end, options = { method = 'PUT' } }) j'ai une erreur à la fin mais sans precision [02.03.2021] [18:51:33] [ERROR] [SCENE99]: avec les Slashs j'ai ca [02.03.2021] [18:18:00] [ERROR] [SCENE99]: (load):3: unexpected symbol near '<\239>' les .. il veut pas [02.03.2021] [18:23:40] [ERROR] [SCENE99]: (load):2: unfinished string near ''https://ADRESSEipSYNOLOGY/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="..Trigger.."&version=1&eventId=1&eventName="..This_is_external_event1.."&account="..LOGIN.."&password="..PASSWORD, {' Modifié le 2 mars 2021 par jucom modif insertion code
jucom Posté(e) le 4 mars 2021 Auteur Signaler Posté(e) le 4 mars 2021 J'ai lu que pcall permettait de détecter plus facilement ou se trouvent les erreurs. le truc c'est que je ne sais pas comment l’implémenter.
Lazer Posté(e) le 5 mars 2021 Signaler Posté(e) le 5 mars 2021 Déjà il te dit clairement où est l'erreur : dans la string qui contient ton URL. Je ne sais pas quel éditeur de code tu utilises, mais Notepad++ par exemple, permet la coloration du texte selon le langage utilisé (qu'il détecte automatiquement si le fichier porte l'extension .lua), ça aide énormément à détecter les erreurs de syntaxe. pcall() s'utilise de cette façon là : local status, err = pcall(function() http:request(url, { success = function(response) -- Suite des traitements... end, error = function(err) -- Gestion de l'erreur end, options = { -- options... } }) -- http:request() end) -- pcall() if not status then -- Gestion de l'erreur print(err) end Cela évite de faire planter le script, permet de traiter l'erreur, et de continuer l'exécution. Pour information pcall() est également très utile (voire indispensable) pour une autre fonction qui a la fâcheuse habitude de planter : json.decode() si le JSON donné en argument est mal formaté. Exemple : local status, jsonTable = pcall(function() return json.decode(response.data) end) if status then -- Suite des traitements... else print(jsonTable or "json.decode() failed") end
jucom Posté(e) le 6 mars 2021 Auteur Signaler Posté(e) le 6 mars 2021 Bon j'ai bien avancé grâce a tes conseil Lazer et aux échanges que j'ai pu lire sur le forum local http = net.HTTPClient() http:request('https://AdresseSynology/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method="Trigger"&version=1&eventId=1&eventName="This_is_external_event1"&account="LOGIN"&password="PASSWORD"', { success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'GET' } J'ai remplacé fibaro:debug() par print() et ca fonctionne enfin... presque :-) La commande est bien envoyée, mais la HC3 a pour réponse du Synology ; [06.03.2021] [23:53:17] [DEBUG] [SCENE99]: OK, réponse : {"error":{"code":101},"success":false} Cela correspond à un paramètre invalide ce que je ne comprends pas puisque la même commande HTTPS fonctionne quand elle est utilisée seule dans un navigateur. J'ai testé en méthode 'GET' et 'PUT' c'est pareil. Je continu mes recherches...
Lazer Posté(e) le 7 mars 2021 Signaler Posté(e) le 7 mars 2021 Je pense qu'il n'aime pas les doubles quotes dans l'URL, il faudrait que tu fasses un urlencode() de ta chaine avant de la donner à http:request() Mais je suis surpris quand même, est-tu certain de la nécessité de mettre des guillemets ? J'utilise l'API Synology pour d'autres usages, et je n'ai jamais eu besoin... et c'est même carrément pas standard comme pratique, en général on utilise uniquement des caractères classiques dans les URL, autant que possible.
jucom Posté(e) le 7 mars 2021 Auteur Signaler Posté(e) le 7 mars 2021 Effectivement la commande dépouillée des " passe bien dans le navigateur https://ADRESSEDUSYNO/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=Trigger&version=1&eventId=1&eventName=This_is_external_event1&account=LOGIN&password=PASSWORD Mais pas via la HC3 qui renvoie toujours [07.03.2021] [18:38:28] [DEBUG] [SCENE99]: OK, réponse : {"error":{"code":101},"success":false} J'ai testé avec ' juste avant et après le requête HTTPS et " aussi mais le résultat est le même. La requête https initial est générée tel quel par surveillance station avec tous ces ". Je l'utilisais dans EEDOMUS et je la teste dans un navigateur.
Lazer Posté(e) le 7 mars 2021 Signaler Posté(e) le 7 mars 2021 oui OK mais il faut toujours que tu fasses un urlencode() A vue de nez, rien que les espace dans ton message "This is external event" ne sont pas valides dans une requête function urlencode(str) if str then str = string.gsub(str, "\n", "\r\n") str = string.gsub(str, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end) str = string.gsub(str, " ", "+") end return str end Puis : local url = urlencode("https://ADRESSEDUSYNO/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=Trigger&version=1&eventId=1&eventName=This_is_external_event1&account=LOGIN&password=PASSWORD") http:request(url, { -- la suite ...
jucom Posté(e) le 7 mars 2021 Auteur Signaler Posté(e) le 7 mars 2021 (modifié) J'ai trouvé !! Laser tu m'a mis sur la voie avec les ". J'ai creusé pour tomber sur ce site faisant référence à Encodage-pourcent https://developer.mozilla.org/fr/docs/Glossary/percent-encoding L'HC3 avec net.HTTPClient() semble ne pas aimer du tout certain caractères spéciaux et je pense que les navigateurs modernes les interprètent tout seul. Apres vu mon niveau je me trompe peut être dans l'analyse. J'ai donc enlevé tous les ? les & et je les ai remplacés. ca donne ca https://ADRESSESYNOLOGY/webapi/entry.cgi%3Fapi=SYNO.SurveillanceStation.ExternalEvent%26method=Trigger%26version=1%26eventId=1%26eventName=This_is_external_event1%26account=LOGIN%26password=PASSWORD au lieu de ca https://ADRESSEDUSYNO/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=Trigger&version=1&eventId=1&eventName=This_is_external_event1&account=LOGIN&password=PASSWORD Ca fonctionne enfin ! Un grand merci pour le temps passé ! Modifié le 7 mars 2021 par jucom correction code
Lazer Posté(e) le 7 mars 2021 Signaler Posté(e) le 7 mars 2021 Ah voilà, tu vois ! Tant mieux, m'enfin tu aurais utilisé la fonction urlencode() que je t'ai proposé d'utiliser depuis ce matin ça aurait été plus vite
jucom Posté(e) le 8 mars 2021 Auteur Signaler Posté(e) le 8 mars 2021 Oui j'avais commencé a regarder, c'est juste que pour moi c'est une nouvelle fonction à apprendre et je ne sais pas comment l'utiliser. Du coup j'ai fait au plus simple d'abord mais plus long du coup .. Merci encore !
jojo Posté(e) le 30 mai 2022 Signaler Posté(e) le 30 mai 2022 Le 07/03/2021 à 20:40, Lazer a dit : Ah voilà, tu vois ! Tant mieux, m'enfin tu aurais utilisé la fonction urlencode() que je t'ai proposé d'utiliser depuis ce matin ça aurait été plus vite J'ai voulu utiliser cette fonction et à la ligne url = string.gsub(url, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end) (url = local url = "https://maker.ifttt.com/trigger/xxxx/with/key/xxxxx?value1=supèrde&value2=&value3=TestDepuisHC3" ) J'ai l'erreur suivante [30.05.2022] [17:53:00] [ERROR] [QUICKAPP173]: QuickApp crashed [30.05.2022] [17:53:00] [ERROR] [QUICKAPP173]: Unknown error occurred: std::runtime_error: 'Invalid argument' qu'ai-je mal fait ?
Lazer Posté(e) le 30 mai 2022 Signaler Posté(e) le 30 mai 2022 Tu es quand même très fort pour être le seul à trouver des erreurs inédites @jojo (chat noirs inside ) Je vois un accent "è" dans ton url, ce qui est interdit, c'est probablement la cause.
jojo Posté(e) le 31 mai 2022 Signaler Posté(e) le 31 mai 2022 mais justement, ton bout de code ce n'est pas pour que les caractères spéciaux passent ? en tout cas ce code passe (avec le "è" et une instruction mise en commentaire) local http = net.HTTPClient() local url = "https://maker.ifttt.com/trigger/Message/with/key/bZ5dr5MH9lcZ8c53F4AXau?value1=supèr de faire dire ce qu'on veut à ses Google Home&value2=&value3=Test Depuis HC3" url = string.gsub(url, "\n", "\r\n") -- url = string.gsub(url, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end) url = string.gsub(url, " ", "+") http:request(url, { success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status = " .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'GET' } }) donc je ne crois pas que mes chats noirs soient revenus (et je ne suis pas pressé de les revoir)
Lazer Posté(e) le 31 mai 2022 Signaler Posté(e) le 31 mai 2022 Les caractères spéciaux oui (espace, &, ...), mais les accents c'est plus que spécial, c'est juste une aberration de certaines langues latines (pas de chance pour nous) ! Parce qu'on ne sait jamais trop si c'est encodé en UTF8 ou ISO-8859, bref une plaie que les Unixiens et Linuxiens connaissent bien. Historiquement les accents sont interdits dans les URL, mais une rapide recherche me montre que ça semble maintenant autorisé. Comme quoi tu évolue Du coup... ben... ce code LUA pour la fonction urlencode() qu'on utilise depuis des années.... tu as découvert qu'il n'est pas compatible avec les accents ! En commentant une ligne gsub(), tu as contourné le problème, mais tu vas t'en créer d'autre, car la fonction ne fera plus la conversion de tout un tas de caractères spéciaux (les caractères spéciaux "normaux", ceux qu'on connais de manière historique : - _ . ~ etc...) Je n'utilise pas IFTTT, mais n'as tu pas la possibilité de passer tes paramètres en données d'une requête POST ou PUT, plutôt que dans l'URL d'une requête GET ?
jojo Posté(e) le 1 juin 2022 Signaler Posté(e) le 1 juin 2022 ma ligne en commentaire me permet de faire paler mes GH. Je sais, ce n'est pas beau. Mais en la réactivant et en supprimant tout les caractères spéciaux, ça ne fonctionne toujours pas. Mon url modifiée : local url = "https://maker.ifttt.com/trigger/xxx/with/key/xxx?value1=supairdefairedirececonveutasesGoogleHome&value2=&value3=TestDepuisHC3" url = string.gsub(url, "\n", "\r\n") url = string.gsub(url, "([^%w %-%_%.%~])", function(c) return string.format("%%%02X", string.byte(c)) end) url = string.gsub(url, " ", "+") http:request(url, { ... l'erreur 01.06.2022] [15:40:00] [DEBUG] [QUICKAPP173]: onInit [01.06.2022] [15:40:00] [ERROR] [QUICKAPP173]: QuickApp crashed [01.06.2022] [15:40:00] [ERROR] [QUICKAPP173]: Unknown error occurred: std::runtime_error: 'Invalid argument' ce sont mes chats noir qui reviendraient ? Pour des requètes POST et PUT, je vais regarder, mais il faudrait d'abord que je comprenne la différence avec du GET ...
jojo Posté(e) le 1 juin 2022 Signaler Posté(e) le 1 juin 2022 en fait je le fais par ce biais, car ça ne fonctionnait pas par GEA. Maintenant ok, je crois avoir vu ce qui n'allait pas (comment reproduire le problème dans GEA)
jjacques68 Posté(e) le 2 juin 2022 Signaler Posté(e) le 2 juin 2022 Le 01/06/2022 à 15:43, jojo a dit : ma ligne en commentaire me permet de faire paler mes GH tu utilises quel système pour les faire parler ? moi j'utilise Pushbullet avec nodeJS...
jojo Posté(e) le 3 juin 2022 Signaler Posté(e) le 3 juin 2022 j'utilise cette solution également (cfr tuto que j'avais écrit TTS pour assistant vocaux - lien dans ma signature) Maintenant, dès que je suis prêt avec ma migration vers HC3, je vais regarder une autre solution : j'ai vu ici une solution avec nodered, ce qui semblerait simplifier l'architecture
jjacques68 Posté(e) le 4 juin 2022 Signaler Posté(e) le 4 juin 2022 pour la partie nodeJS, j'ai fais une installation sous windows, sur un PC allumé H24 7/7, ça fonctionne très bien, et assez simple à mettre en œuvre. Tu nous diras avec nodered...
jojo Posté(e) le 7 juin 2022 Signaler Posté(e) le 7 juin 2022 Pour nodeJS, je l'ai installé sur une Debian sur EXSI et un HP Gen8 qui tourne 24/7. J'ai abonné la solution sous Synology
Messages recommandés