Aller au contenu

Bloug

Membres confirmés
  • Compteur de contenus

    1351
  • Inscription

  • Dernière visite

  • Jours gagnés

    30

Tout ce qui a été posté par Bloug

  1. Bloug

    Json T_end

    @Lazer juste pour être sur .... si mon url : https://airzonecloud.com/zones/?format=json&device_id=5a37f4167765621039320000&user_email=*****&user_token=***** me retourne un json tout plein d'info quand je la pose dans un navigateur.... cette meme URL placé dans mon http:request n'est pas censé me retourner une erreur 404 ( not Found ) non ?
  2. Bloug

    Json T_end

    J'avance sur la 2eme solution ! avec deja un piège de la team AirZone ! suite à un coup de tel hier à la hotline le tech c'est connecté dessus et du coup le Token à changé .... donc j'arrive à règler le pb de l'dentification : {"error":"Il est nécessaire que vous soyez inscrit afin de pouvoir continuer."} ensuite mes deux coquilles : https://airzonecloud.com/zones/?format=json&system_id=5b139f1ef51445a30df80c6c?user_email=*****&user_token=**** déjà j'ai deux erreurs dans l'url : le ? je pense qu'il faut le remplacer par une & , et le system_id lui est pour le Groupe Nuit et non la "Zone" donc à remplacer par l’étiquette : id https://airzonecloud.com/zones/?format=json&device_id=5b139f1ef51445a30df80c6d&user_email=*****&user_token=***** quand je colle cela dans mon navigateur celui ci m'affiche : {"zones":[]} je pense donc arriver pas trop loin du bon endroit vu que la commande du PUT est : data = '{"zone":{"state":"1"}}' reste à comprendre pourquoi du coté de la HC2 j'ai une erreur 404 Edit : en fait non même avec : https://airzonecloud.com/zones/?format=json&user_email=*****&user_token=***** j'ai le meme retour ....
  3. Bloug

    Json T_end

    pour le urlencode() tu parle de "email:password" dans mon cas j'ai une "email" &user_token= "Token" c'est l'ensemble de la ligne que je dois encoder : email&user_token=Token car en encodant chacun de son coté , meme problème. , le token est genre : 3ICzvRojbmRZ-BjuNEOqy0vUQSudNYOMedHwTFt8 Pour la seconde : j'ai modifié avec : https://airzonecloud.com/zones/?format=json&system_id=5b139f1ef51445a30df80c6c?user_email=*****&user_token=**** qui me donne du 404 - mais dans le navigateur j'ai : {"error":"Il est nécessaire que vous soyez inscrit afin de pouvoir continuer."}
  4. Bloug

    Json T_end

    peut etre une autre piste , en trifouillant le sniffer j'ai trouvé une commande PUT qui change également l’état : PUT /zones/5b139f1ef51445a30df80c6c?user_email=*****&user_token=***** { "zone": { "state": "1" } } voici mon code : --================= IDENTIFICATION =========================================== local serveur = 'airzonecloud.com' local user_email = '*******' local user_token = '*******' local regist_Id = '*******' --============================================================================ local device_ID = '5a37f4167765621039320000' ----- ID du System ------ local espace_Jour = '5b139f1ef51445a30df80c6f' -- Jour local zone_Salon = '5b139f1ef51445a30df80c70' --------------- Salon 0 local espace_Nuit = '5b139f1ef51445a30df80c69' -- Nuit local zone_Parents = '5b139f1ef51445a30df80c6a' --------------- Parents 0 local zone_Sport = '5b139f1ef51445a30df80c6b' --------------- Sport 1 local zone_Alyssa = '5b139f1ef51445a30df80c6c' --------------- Alyssa 2 local zone_Bureau = '5b139f1ef51445a30df80c6d' --------------- Bureau 3 --============================================================================ local myAuthJour = ( '/?format=json&system_id=' .. espace_Jour .. '&user_email=' .. user_email .. '&user_token=' .. user_token ) local myAuthNuit = ( '/?format=json&system_id=' .. espace_Nuit .. '&user_email=' .. user_email .. '&user_token=' .. user_token ) local myAuth = ( '?user_email=' .. urlencode(tostring(user_email)) .. '&user_token=' .. user_token ) 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 --fibaro:debug("urlencode : " .. urlencode(tostring(user_email))) -- Appel HTTPS local http = net.HTTPClient() http:request('https://airzonecloud.com/zones/' .. zone_Bureau .. myAuth, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then fibaro:debug('Retour : '.. response.data) local jsonTable = json.decode(response.data) -- Parcours de la table JSON local k, v for k, v in pairs(jsonTable) do fibaro:debug("key = " .. k .. " - type(v) = " .. type(v)) end -- Ici la suite du code, exécuté en asynchrone, donc après la fin de l'exécution du code appelant http:request() -- ... else fibaro:debug("Error : empty response data") end else fibaro:debug("Erreur : status=" .. tostring(response.status)) end end, error = function(err) fibaro:debug("Erreur : " .. err) end, options = { method = 'PUT', data = '{"zone":{"state":"1"}}' } }) -- Ici la suite du code, exécuté en synchrone, donc avant l'exécution du contenu de la fonction success() -- ... malheureusement j'ai également une erreur mais..... différente : [DEBUG] 07:21:31: Erreur : Bad file descriptor peut être qu'ici le pb peut être contourné
  5. Bloug

    Json T_end

    merci beaucoup @Lazer pour ton temps ! j'a donc trouvé la fonction urlencode() que j'ai adapté pour l'authentification t local myAuth = ( '?user_email=' .. urlencode(tostring(user_email)) .. '&user_token=' .. user_token ) 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 fibaro:debug("urlencode : " .. urlencode(tostring(user_email))) [DEBUG] 06:47:41: Erreur : status=401 <---- mais toujours le meme pb . L'erreur 401 ( unauthorized )
  6. Bloug

    Json T_end

    Voici mon pb : Je souhaite utiliser des fonctions de mon system AirZone via la HC2 pour combiner des actions ( fenetre ouverte ==> push ==> extinction de la zone ou genre CO2 > xx =>> mode ventilation etc... ) L'API AirZone n'est pas publique mais dans le dernier Airzone m'informent qu'ils y bossent .... ( bientot 1ans ... ) Du coup je me suis amusé avec le sniffer Android : Packet Capture : où j'ai trouver des infos comme les requêtes GET sur mon Groupe Nuit composée de 4 Zones : https://airzonecloud.com/zones/?format=json&system_id=5b139f1ef51445a30df80c69&user_email=*****&user_token=***** ou mon Groupe Jour composée d'une seule Zone : https://airzonecloud.com/zones/?format=json&system_id=5b139f1ef51445a30df80c6f&user_email=*****&user_token=***** Voici voici un extrait du retour de la requête ( j'ai coupé pour pas la faire trop longue ) Zone NUIT : { "zones": [ { "id": "5b139f1ef51445a30df80c6c", "system_id": "5b139f1ef51445a30df80c69", "device_id": "5a37f4167765621039320000", "modes": "1111111011", "warning": "0", "name": "Alyssa", "system_number": "1", "zone_number": "3", "state": "0", "consign": "25.0", "temp": "25.8", "mode": "1", "velocity": null, "show_velocity": null, "sleep": "0", "lower_conf_limit": "18.0", "upper_conf_limit": "30.0", "master": null, "eco": "0", "prog_enabled": "0", "speed_prog_mode": null, "show_ventilation": "1", "updated_at": 1529765477, "setup_type": "0", "class": "Zone", "last_update": 1529765477, "next_schedule_number": "0", "led": null, "offset": null, "cold_offset": null, "heat_offset": null, "scene": null, "air_flow": null, "humidity": null, "coldConsign": "", "heatConsign": "", "auto": false, "temperature_unit": false, "config": { "id": "5b159daaf51445a30df8123c", "cold_values": null, "heat_values": null, "cold_angle": null, "heat_angle": null, "swing_horizontal": null, "swing_vertical": null, "antifreeze": "0", "vla": null, "zone_number": "3", "slave": null, "master": null, "basic_mode": null, "ambient_temp": null, "heat_type": null, "cold_type": null, "heat_type_config": null, "cold_type_config": null, "ventilation": null, "q_weight": null, "window": null, "presence": null, "spray_dew": null, "local_vent": null, "tact_fw": null, "firm_lm": null, "manufacturer": null, "led": null, "confort_cold_consign": null, "confort_heat_consign": null, "eco_cold_consign": null, "eco_heat_consign": null, "unocupied_cold_consign": null, "unocupied_heat_consign": null, "vacation_cold_consign": null, "vacation_heat_consign": null, "firm_ws": "3.10", "offset": null, "errors": "0", "zone_id": "5b139f1ef51445a30df80c6c", "automatic_weight": null, "autochange_differential": null, "offset_environment_cold": null, "offset_environment_heat": null ....................................................... } }, { "id": "5b139f1ef51445a30df80c6d", "system_id": "5b139f1ef51445a30df80c69", "device_id": "5a37f4167765621039320000", "modes": "1111111011", "warning": "0", "name": "Bureau", ....................................................... } }, { "id": "5b139f1ef51445a30df80c6a", "system_id": "5b139f1ef51445a30df80c69", "device_id": "5a37f4167765621039320000", "modes": "1111111011", "warning": "0", "name": "Parents", ....................................................... }, { "id": "5b139f1ef51445a30df80c6b", "system_id": "5b139f1ef51445a30df80c69", "device_id": "5a37f4167765621039320000", "modes": "1111111011", "warning": "0", "name": "Sport", } ] } j'ai donc accès avec le GET aux info importante grace au code : local http = net.HTTPClient() http:request('https://airzonecloud.com/zones/' .. myAuthNuit, { options = { method = 'GET' }, success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) -- Alyssa local nameAlyssa = jsonTable.zones[1].name local consAlyssa = jsonTable.zones[1].consign local tempAlyssa = jsonTable.zones[1].temp local modeAlyssa = jsonTable.zones[1].mode local etatAlyssa = jsonTable.zones[1].state local lupdAlyssa = jsonTable.zones[1].last_update -- Etat de la Zone Alyssa if etatAlyssa == "0" then etatAlyssa = " arret " elseif etatAlyssa == "1" then etatAlyssa = " marche " end -- Mode de travail Alyssa if modeAlyssa == "1" then modeAlyssa = " Refroidissement " elseif modeAlyssa == "3" then modeAlyssa = " Chauffage " elseif modeAlyssa == "5" then modeAlyssa = " Deshumidification " elseif modeAlyssa == "7" then modeAlyssa = " Ventilation " end -- Débug Alyssa fibaro:debug( 'Zone Nuit : ' .. nameAlyssa ) fibaro:debug( 'Consigne à :' .. consAlyssa .. '°C -- Température Actuelle : ' .. tempAlyssa .. '°C ' ) fibaro:debug( 'Mode de Fonctionnement :' .. modeAlyssa .. ' -- Etat Actuel : en' .. etatAlyssa ) fibaro:debug( '*************' ) --- Suite ci dessous --- else fibaro:debug("Error : empty response data") end else fibaro:debug("Error : status=" .. tostring(response.status)) end end, error = function(err) fibaro:debug("Error : " .. err) end }) Enfin analyser les modifications avec packet caputure sur la mise en marche et arrêt d'une zone j'ai le POST suivant : POST /events/?user_email=********&user_token=******** HTTP/1.1 Host: www.airzonecloud.com Connection: keep-alive Content-Length: 131 Accept: application/json, text/plain, */* Origin: file:// X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Linux; Android 8.0.0; SM-G950F Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 Mobile Safari/537.36 Content-Type: application/json;charset=UTF-8 Accept-Encoding: gzip, deflate Accept-Language: fr-FR,en-US;q=0.9 { "event": { "cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 0, "device_id": "5a37f4167765621039320000" } } ou j'utilise donc ta scene : local myAuth = ( '?user_email=' .. user_email .. '&user_token=' .. user_token ) -- ====================== Z O N N E N U I T ===================== -- -- Appel HTTPS local http = net.HTTPClient() http:request('https://airzonecloud.com/events/' .. myAuth, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then fibaro:debug('Retour : '.. response.data) local jsonTable = json.decode(response.data) -- Parcours de la table JSON local k, v for k, v in pairs(jsonTable) do fibaro:debug("key = " .. k .. " - type(v) = " .. type(v)) end -- Ici la suite du code, exécuté en asynchrone, donc après la fin de l'exécution du code appelant http:request() -- ... else fibaro:debug("Error : empty response data") end else fibaro:debug("Erreur : status=" .. tostring(response.status)) end end, error = function(err) fibaro:debug("Erreur : " .. err) end, options = { method = 'POST', data = '{"event":{"cgi":"modzona","system_number":"1","zone_number":"4","option":"state","value":1,"device_id":"5a37f4167765621039320000"}}' } }) -- Ici la suite du code, exécuté en synchrone, donc avant l'exécution du contenu de la fonction success() -- ... mais j'ai une Erreur : 401 unauthorized [DEBUG] 09:29:05: Erreur : status=401 déjà pour le data je suis obligé de le réduire en une ligne et de le placer entre des ' ' ( Ôhhh passage, suis passé par le site : https://codebeautify.org/jsonviewer ) data = '{"event":{"cgi":"modzona","system_number":"1","zone_number":"4","option":"state","value":1,"device_id":"5a37f4167765621039320000"}}' sinon j'ai toujours des erreurs, même si je le pose sous la forme : data = { "event": { "cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 1, "device_id": "5a37f4167765621039320000" } } Donc pour GET je passe par ici : http:request('https://airzonecloud.com/zones/' .. myAuthNuit, { et pour POST par là : http:request('https://airzonecloud.com/events/' .. myAuth, { mais rien dans le navigateur si je colle la ligne : https://airzonecloud/events/?user_email=******&user_token=***** d'où ma question de hier de faire un POST directement après le GET en utilisant le : jsonTable.zones[1].state = "1" sur la requette : https://airzonecloud.com/zones/ et non /events/... j'espère avoir été assez clair :S lol merci.
  7. Bon après beaucoup de tests avec GET puis POST puis qu'avec POST et une erreur 401 j'ai ajouter des éléments dans le headers pour bloqué sur du 400 ... Comme le souligne le grand philosophe espagnol : Mas banda ! j'arrêter de polluer le topic ....
  8. merci , je regarde immediatement !
  9. oui
  10. désolé, pour etre plus clair, je souhaite comprendre le fonctionnent, j'utilise pour récupérer des info un GET et un element de la table : local etatAlyssa = jsonTable.zones[1].state Si je souhaite modifier la valeur de l'élément et lui attribuer la valeur 1 ou 0 => state = 1 j'utilise donc la seconde parti de ton code avec POST et la valeur dans le myJson EX : local myJson = { "couleurs": { [1] = "bleu", [2] = "blanc", [3] = "rouge" }, "fruits": { [1] = "pomme", [2] = "banane" }, } donc pour mon cas je dois utiliser la même structure qu'avec GET ? ou il faut adapter comme dans ton ex avec les accolades : jsonTable.zones[1].state jsonTable.zones[1].state modif : {"zones":[{"state":"0"}]} ou peut etre qu'il n' a aucun rapport entre un GET et POST...
  11. merci pour le tuto, Petite question , si je récupère une donné avec un GET : local etatAlyssa = jsonTable.zones[1].state pour la modifier dois je utiliser la meme structure que le GET ? local myJson = { jsonTable.zones[1].state = "1" } merci
  12. Bloug

    Json T_end

    Oh cool ! Merci beaucoup je vais prendre une aspirine avant
  13. Bloug

    Json T_end

    y'a pas de pb lol C'est la fameuse erreur entre la chaise et le clavier
  14. Bloug

    Json T_end

    loool impec je regarde cela merci.
  15. Bloug

    Json T_end

    @Lazer toc toc toc bon je me doute qu'avec Alexa mon sujet n’intéresse pas grand monde ( visiteur 1 ( moi)) lol mais puis je avoir ton analyse sur le message d'erreur? et vers quel coté chercher ? Est-ce une erreur du coté de la requette qui semble fausse du myjson ou de la 'method' ? merci
  16. Et les cmd avec ha-bridge c'est quoi ? Alexa, demande à M. Bridge d'allumer..... ?
  17. Lol moi j'arrive à obtenir les infos de fibaro sur mobile mais quand je bascule sur un compte amazon fr je perds tout. Ayant un pb avec mon numéro de tel déjà associé je pense que mon pb est donc là.
  18. Cool Je test plus tard merci
  19. Quand je bascule pour avoir accès au store us j'ai mes skills fr installées qui disparaissent.... j'active donc la skills Fibaro j'active le fibaro ID mais dès que je re-bascule sur FR plus de skills de chez Fibar installé mais mes skills fr ré apparaissent .... là j'ai les skills Fr sur le phone et sur le pc je suis en US ( https://alexa.amazon.com/spa/index.html#skills/your-skills/?ref-suffix=ysa_gw )
  20. Bloug

    Json T_end

    Merci ! j'ai posé la variable myJson sur une seule ligne car sinon j'ai toujours des erreur de { local myJson = '{ "event": { "cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 0, "device_id": "5a37f4167765621039320000" } }' local myJson = local http = net.HTTPClient() http:request('www.airzonecloud.com/events/?user_email=****&user_token=****' , { options = { method = 'PUT', data = json.encode(myJson) }, fibaro:debug('Retour : '.. myJson) }) [DEBUG] 22:54:20: [1;31m2018-06-15 22:54:20.597466 [ fatal] Unknown exception: /opt/fibaro/scenes/47.lua:15: '}' expected (to close '{' at line 14) near ':' et si je pose en ligne : local myJson = '{ "event": {"cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 0, "device_id": "5a37f4167765621039320000" }}' local http = net.HTTPClient() http:request('www.airzonecloud.com/events/?user_email=****&user_token=****' , { options = { method = 'PUT', data = json.encode(myJson) }, fibaro:debug('Retour : '.. myJson) }) [DEBUG] 22:53:24: Retour : { "event": {"cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": "0", "device_id": "5a37f4167765621039320000" }} [DEBUG] 22:53:24: �[1;31m2018-06-15 22:52:24.972194 [ fatal] Unknown exception: std::runtime_error: 'Invalid argument'
  21. Bloug

    Json T_end

    bon nouvelle recette j'ai pas d'erreur mais j'ai pas de retour également : function postMethod(data) modeOn = ' "event": { "cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 0, "device_id": "5a37f4167765621039320000" } ' local http = net.HTTPClient() http:request('https://airzonecloud.com/events/?user_email=****&user_token=****' , { options = { method = 'POST', headers = {}, data = modeOn, timeout = 1000 }, success = function(status) fibaro:debug(status) local result = status.data; if result.status ~= 1 then print("failed"); print(status.data); end end, error = function(err) print('[ERROR] ' .. err) end }) end meme si je vire le timeout j'ai aucun retour dans mon sniffage j'ai trouver en POST : POST /events/?user_email=****&user_token=*****8 HTTP/1.1 Host: www.airzonecloud.com Connection: keep-alive Content-Length: 131 Accept: application/json, text/plain, */* Origin: file:// X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Linux; Android 8.0.0; SM-G950F Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 Mobile Safari/537.36 Content-Type: application/json;charset=UTF-8 Accept-Encoding: gzip, deflate Accept-Language: fr-FR,en-US;q=0.9 et json { "event": { "cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 0, "device_id": "5a37f4167765621039320000" } } où l'etat de mon Module Bureau passe de On à OFF grace à " State "
  22. Bloug

    Json T_end

    me revoila Bon j'avance bien et j'arrive a récupérer toutes les infos de mode etat consigne températures etc ... là je cherche a voir si j'arrive à modifier une consigne. La methode est POST mais ne faut il pas utiliser PUT sur la HC2 ? dois-je utiliser la même forme que précédemment : local http = net.HTTPClient() http:request('https://airzonecloud.com/events/' .. myConsigne , { options = { method = 'PUT' }, data = { "event": { "cgi": "modzona", "system_number": "1", "zone_number": "4", "option": "state", "value": 0, "device_id": "5a37f4167765621039320000" } } Je suppose que le : local http = net.HTTPClient() peut il être supprimé également ? c'est la position / ou l'insertion du data = { que j'ai calqué sur des ex du forum qui me chagrine. merci
  23. une vrai mouche mouche verte le GH
  24. Et lifedomus...
×
×
  • Créer...