Lazer Posté(e) le 1 juillet 2018 Signaler Posté(e) le 1 juillet 2018 Je n'avais pas pensé à ça, mais c'est évident maintenant, il faut s’authentifier à chaque fois pour obtenir un token que tu pourras utiliser dans la suite de ton code. Tu as plusieurs exemples sur le forum, mais tu peux t'inspirer du code que j'ai fait dans le tuto de détection de présente Unifi Il y a une fonction Login() qui récupère un Cookie qui est ensuite utilisé dans le Header des requêtes suivantes, mais tu peux adapter pour ton Token à la place. 2
Bloug Posté(e) le 2 juillet 2018 Auteur Signaler Posté(e) le 2 juillet 2018 (modifié) si j'ai bien ton code, toi tu utilises une fonction " Login " pour récupérer un cookie dont tu as besoin pour une fonction suivante Cookie = response.headers['Set-Cookie'] ET donc si ta fonction échoue, tu relance le login pour obtenir un cookie elseif response.status == 401 then -- HTTP 401 => Unauthorized -- Need to login and get new cookie Message("orange", "Need to login and get new cookie") Login() return moi il me semble que c'est un peut différent car même avec le bon token, j'ai besoin obligatoirement de m'identifier pour chaque requête. j'ai donc adapter ma première requête comme ton exemple en une fonction Login(command) http:request('https://airzonecloud.com/events/' .. myAuth, { success = function(response) if response.status == 201 then if response.data and response.data ~= "" then --fibaro:debug('Retour : '.. response.data) else fibaro:debug("Error : empty response data") end elseif response.status == 401 then -- HTTP 401 => Unauthorized -- Need to login First fibaro:debug('Need to login First') Login(command) fibaro:debug("Erreur : status=" .. tostring(response.status)) return end end, error = function(err) fibaro:debug("Erreur : " .. err) end, options = { method = 'POST', headers = {["Content-Type"] = "application/json;charset=UTF-8", ["Accept"] = "application/json, text/plain, */*", ["X-Requested-With"] = "X-Requested-With",}, data = "{\"event\":{\"cgi\":\"modzona\",\"system_number\":\"1\",\"zone_number\":\"4\",\"option\":\"state\",\"value\":1,\"device_id\":\"5a37f4167765621039320000\"}}" } }) Edit meme avec 2 fonctions Login() pour l'identification et On() pour le changement d'etat je n'arrive pas à avoir une continuité , login ===> et dans la partie success ====> fonction on() pourtant cela fonctionne sur apitester.com il me manque surement un lien entre les étapes peut etre du coté de cela : Mea culpa ! C'est Ok .... une petite erreur de frappe dans l'un des headers donc je lance simplement mes deux fonctions : Login() ON() ou Login() OFF() Encore MERCI @Lazer ! Modifié le 3 juillet 2018 par Bloug
Bloug Posté(e) le 8 juillet 2018 Auteur Signaler Posté(e) le 8 juillet 2018 (modifié) c'est Moi si je souhaite connaitre le nombre de Zone dans mon tableau Json la commande c'est pas : jsonTable.zones.length pour qu'il m'indque 5 ? merci local numberZ = jsonTable.zones.length fibaro:debug( numberZ ) toujours un nillllllll Modifié le 8 juillet 2018 par Bloug
Barelle Posté(e) le 8 juillet 2018 Signaler Posté(e) le 8 juillet 2018 Et que donne ? #jsonTable.zones 1
Bloug Posté(e) le 8 juillet 2018 Auteur Signaler Posté(e) le 8 juillet 2018 5 le # à une signification pour le comptage ? Merci Bcp !
Lazer Posté(e) le 8 juillet 2018 Signaler Posté(e) le 8 juillet 2018 Oui ça donne le nombre d'éléments d'un tableau
Barelle Posté(e) le 8 juillet 2018 Signaler Posté(e) le 8 juillet 2018 (modifié) En fait, selon ma compréhension, le # est un opérateur retournant la longueur d'une chaîne de caractères (#"titi" retourne 4) ou la taille d'une table. La notion de taille d'une table est ambiguë, dans le cas d'un tableau ordonné, "sans trou", la valeur retourné correspond à la taille du tableau, ou plus exactement à la plus grande valeur de l'indice. Dans le cas où les indices ne sont pas numériques, on a vite fait d'obtenir n'importe quoi : local tableau = {}; for i=1, 5 do tableau[i] = i; end fibaro:debug("1) #tableau="..#tableau); -- retourne 5 tableau["titi"] = "titi"; fibaro:debug("2) #tableau="..#tableau); -- retourne aussi 5, malgré un élément de plus... En bref, il est souvent prudent de prévoir une fonction qui compte... Pour des cas loufoques, cf. https://stackoverflow.com/questions/23590885/why-does-luas-length-operator-return-unexpected-values Modifié le 8 juillet 2018 par Barelle 2 1
Bloug Posté(e) le 9 juillet 2018 Auteur Signaler Posté(e) le 9 juillet 2018 Le 11/06/2018 à 12:58, Lazer a dit : La redirection 302 force les clients à passer en https. Il est donc impossible de faire du http sur ce serveur. Donc impossible de faire cela depuis un module virtuel avec net.fhttp(). La HC2 peut faire du https, mais uniquement dans une scène avec la fonction httpclient(). Voir exemples sur le forum. Du coup, maintenant que je gère mon ensemble dans une Scene votre avis sur la méthode pour en faire un VD ? Envoyer mes valeurs dans des VG pour les récupérer dans le VD ? c'est lourd non je vais avoir +50 VG ? Ca ne mange pas de pain le VG ?
Lazer Posté(e) le 9 juillet 2018 Signaler Posté(e) le 9 juillet 2018 Tu peux t'inspirer du couple VD + Scène que j'ai utilisé dans mon tuto Yamaha MusicCast. Le VD appelle la scène en donnant un certain nombres de paramètres (dont l'ID du VD lui-même appelant la scène, l'ID du bouton appelant, la fonction appelée, etc). En retour, la scène est capable de mettre à jour directement les Labels du VD concerné. Je te préviens, c'est assez lourd....
Bloug Posté(e) le 9 juillet 2018 Auteur Signaler Posté(e) le 9 juillet 2018 :/ ouai lourd :/ je pense que je fais alors le simplifier d'avantage avec des VG pour seulement les : Mode ( clim / chauffage / déshumidification/ ventilation ) Etat : ( On / Off ) Sleep : 30min ; 60min ; 90min faut que sa reste de l'interaction simple qui s'intègre facilement genre : Si Clim ON et Fenetre ouverte depuis 10min alors Push puis CLIM OFF ... non ?
Bloug Posté(e) le 14 juillet 2018 Auteur Signaler Posté(e) le 14 juillet 2018 ToToc ! me REvoila avec une nouvelle question ( je conserve le Topic pour éviter de faire du Vrac ! ) Dans ma table Json, ( ex ci dessus ) j'ai des "objets" 1 - 2 - 3 jusqu'a 36 avec à chaque fois à l’intérieur du tableau : name; type, value malheureusement parfois le tableau passe de 36 à 38 ( en ajoutant par le haut du tableau mais pas forcement la 1er ligne) et pour le coup quand j'utilise : local Valeur3 = jsonTable.devices[2].states[3].value bahh quand le tableau bouge c'est pas forcement la valeur recherchée :s Est-ce possible de rechercher le résultat ' value ' d'après la ligne 'name' ? ? ? Ex avec name : io:TargetHeatingLevelState merci pour votre patience
Lazer Posté(e) le 14 juillet 2018 Signaler Posté(e) le 14 juillet 2018 ce que je ferais, c'est parcourir toute la table. Pour chaque index du tableau, on vérifie la valeur de 'name' Si cela correspond à ce qu'on recherche, alors on sort immédiatement de la boucle (avec l'instruction "break") et on peut exploiter la 'value' 1
Bloug Posté(e) le 15 juillet 2018 Auteur Signaler Posté(e) le 15 juillet 2018 Merci @Lazer , le temps de digérer les divers tuto sur Google .... et de faire quelques milliers de tests ..... Donc étant toujours dans un http:request() : for k, v in pairs(jsonTable.devices[2].states) do if v.name == 'io:TargetHeatingLevelState' then local Heating_mode = v.value fibaro:debug( '<font color="Green"> Etat du Chauffage </font><font color="yellow"> : </font><font color="red">' .. Heating_mode .. '</font>') -- fibaro:setGlobal("Cozytouch_mode", Heating_mode) end if v.name == 'core:BoostModeDurationState' then local Boost_mode = v.value fibaro:debug( '<font color="Green"> Etat du Boost </font><font color="yellow"> : </font><font color="red">' .. Boost_mode .. '</font>') --fibaro:setGlobal("Cozytouch_VersionState", Boost_mode) end end c'est pas trop lourd et du coup je traite que les infos utiles MErci ! .... je reviendrai
Messages recommandés