henri-allauch Posté(e) le 14 janvier 2017 Signaler Posté(e) le 14 janvier 2017 (modifié) Plusieurs post donnent des exemples d'accès à l'api de la HC2. Dans l'exemple ci dessous 2 méthodes qui donnent le même résultat ( heureusement) bien que la méthode 1 est moins synchrone la preuve la réponse arrive en 2eme Position. A mon avis La méthode 2 est plus facile et plus claire à lire. A votre avis laquelle faut il utiliser, laquelle traversera plus aisément les évolutions du Firm ? --[[ %% properties %% events %% globals --]] local MessMem ----------------------------------------------------Méthode 1 local http = net.HTTPClient() http:request('http://127.0.0.1:11111/api/diagnostics' , { options = { method = 'GET' }, success = function(response) local result = json.decode(response.data); MessMem = "RAM Disponible : "..tonumber(result.memory.free) .."%" .." Cache : "..tonumber(result.memory.cache) .."%" fibaro:debug( "1- Mémoire : " ..MessMem) end }) http = nil --------------------------------------------------Methode 2 Diag = api.get("/diagnostics") MessMem = "RAM Disponible : "..tonumber(Diag.memory.free) .."%" .." Cache : "..tonumber(Diag.memory.cache) .."%" fibaro:debug( "2- Mémoire : " ..MessMem) ----------------------------------------------------------------------- [DEBUG] 09:31:33: 2- Mémoire : RAM Disponible : 58% Cache : 17% [DEBUG] 09:31:33: 1- Mémoire : RAM Disponible : 58% Cache : 17% Modifié le 14 janvier 2017 par henri-allauch
pepite Posté(e) le 14 janvier 2017 Signaler Posté(e) le 14 janvier 2017 Salut, Moi je me dis que si l'API change, les 2 ne fonctionneront pas donc, la méthode 2 est plus clair et propre je trouve. Maus à voir avec les experts dev la bonne "MANIERE" de faire. Manque la gestion des erreurs mias peut-être pas la bonne syntaxe, a tester et verifier, suis vraiment sur de rien Diag, status, errorCode = api.get("/diagnostics") MessMem = "RAM Disponible : "..tonumber(Diag.memory.free) .."%" .." Cache : "..tonumber(Diag.memory.cache) .."%" fibaro:debug( "2- Mémoire : " ..MessMem) fibaro:debug("Status = " ..tonumber(status)) fibaro:debug("ErrorCode = "..tonumber(errorCode))
pepite Posté(e) le 14 janvier 2017 Signaler Posté(e) le 14 janvier 2017 Sinon il y a ca HC2 = Net.FHttp("127.0.0.1",11111) payload = "/api/diagnostics" response, status, errorCode = HC2:GET(payload) if tonumber(status) == 200 ....
henri-allauch Posté(e) le 14 janvier 2017 Auteur Signaler Posté(e) le 14 janvier 2017 (modifié) Diag,status,errorCode = api.get("/diagnostics") c'est OK pour tester les erreurs mais Net.FHttp ne fonctionne que dans les scènes Modifié le 14 janvier 2017 par henri-allauch
Lazer Posté(e) le 15 janvier 2017 Signaler Posté(e) le 15 janvier 2017 Faudrait que Krikroff ou Steven se prononcent, mais je ne pense pas qu'il y a une des 2 solutions qui soit meilleure qu'une autre, je dirais plutôt que tout dépend comment tu organises le code LUA de ta scène. Si tu fais de l'asynchronisme (settimeout et http:request) ou du code séquentiel classique (Net.FHttp et sleep) Si Fibaro décide de changer l'API, malheureusement on ne peut rien y faire, et on sera obligé de continuer à maintenir nos scripts indéfiniment à chaque mise à jour de firmware
henri-allauch Posté(e) le 15 janvier 2017 Auteur Signaler Posté(e) le 15 janvier 2017 Net.FHttp ne fonctionne que dans les scènes Net.HTTPClient ne fonctionne pas dans les VD api.get () fonctionne dans les scènes et dans les VD ( Peut être pas pour tous les types d'appels à l'API ) Ne connaissant pas tout l'historique de la HC2, je pensais que api.get () était un appel (lua) généralisé de l'api et dans le traitement interne de cette fonction, fibaro pouvait adapter le traitement en fonctions de ses évolutions.
Lazer Posté(e) le 15 janvier 2017 Signaler Posté(e) le 15 janvier 2017 Non c'est pareil api.get n'est qu'une fonction qui effectue un appel http standard derrière.La vraie question,je te dis, c'est asynchrone ou pas, donc tout dépend de comment tu veux organiser ton code.
Cardane Posté(e) le 15 janvier 2017 Signaler Posté(e) le 15 janvier 2017 une petite question... vous avez trouvé où la syntaxe de la réponse ? parce que si je regarde dans la doc de l'api de la box, pour /diagnostics je ne trouve pas le ".memory.free" moi je vois un truc comme ca : { "memory": 0, "storage": [ { "name": "sting", "used": 0 } ], "cpuLoad": [ { "user": "sting", "nice": "sting", "system": "sting", "idle": "sting" } ] }
henri-allauch Posté(e) le 15 janvier 2017 Auteur Signaler Posté(e) le 15 janvier 2017 http://(IP de la HC2 ) /docs soit chez moi : http://192.168.1.50/docs/ puis diagnostic et try It C'est la doc et les données de ta HC2 1
pepite Posté(e) le 16 janvier 2017 Signaler Posté(e) le 16 janvier 2017 Sinon, dans un navigateur tu tapes http://iphc2/api/diagnostics
Steven Posté(e) le 17 janvier 2017 Signaler Posté(e) le 17 janvier 2017 Perso, je préfère l'usage de api.get C'est une méthode fournie par Fibaro qui va elle même gérer l'accès à l'api. S'ils changent quelque chose, c'est donc garanti que cette méthode soit adapté car sinon plus rien ne fonctionnera. Il faut savoir que TOUTES les méthodes fibaro:..... utilise api.get ou api.post, ... exemple si dessous : fibaro.setGlobal = function(self, varName, value) __assert_type(varName, "string") local data = {["value"]=tostring(value), ["invokeScenes"]=true} api.put("/globalVariables/" .. varName, data) end Donc cette fonction sera TOUJOURS à jour. Maintenant, l'usage de http://.../api apporte l'asynchrone mais honnêtement, qui utilise de l'asynchrone en domotique ? A mon avis pratiquement personne. Je ne connais pas de "Gros" traitement en domotique qui nécessite l'usage de l'asynchrone. Je pense plus que l'asynchrone n'est pas pour tout le monde, cela complexifie la compréhension du code et apporte souvent une grande confusion quand il s'agit de chaîner les appels. Voici donc mon avis personnel. 3
pepite Posté(e) le 17 janvier 2017 Signaler Posté(e) le 17 janvier 2017 (modifié) Yes, l'avis du @Steven master ;-) . Pour moi l'asynchrone, c'est vraiq ue quand t'es pas dev heuuuu les settimetout et autre ca devient complexe ;-) Alors comment gerer le retour des "error, status, response" ? Quand je mets ca, j'ai pas de debug, et une erreur Diag, status, errorCode = api.get("/diagnostics") MessMem = "RAM Disponible : "..tonumber(Diag.memory.free) .."%" .." Cache : "..tonumber(Diag.memory.cache) .."%" fibaro:debug( "2- Mémoire : " ..MessMem) fibaro:debug("Status = " ..tonumber(status)) fibaro:debug("ErrorCode = "..tonumber(errorCode)) Modifié le 17 janvier 2017 par pepite
henri-allauch Posté(e) le 17 janvier 2017 Auteur Signaler Posté(e) le 17 janvier 2017 Merci Steven de ta réponse et pour tes bons conseils. 1
Steven Posté(e) le 17 janvier 2017 Signaler Posté(e) le 17 janvier 2017 @pepite Prenons ton exemple : Lorsque tout ce passe bien, tu vas avoir en retour Diag = objet json contenant les informations demandées status = 200 errorCode = nil --- ben oui, il n'y a pas d'erreur donc ton code fibaro:debug("ErrorCode = "..tonumber(errorCode)) va planté car tu ne peux pas faire un tonumber(nil). Si tu veux vraiment affiché cette ligne, il te suffit de la modifier ainsi fibaro:debug("ErrorCode = "..tonumber(errorCode or 0)) Et voilà, tu auras 0 s'il n'y a pas d'erreur. En cas d'erreur, c'est simple Diag sera nil. On devrait donc traiter ce genre d'appel ainsi : response, status, errorCode = api.get("/.....") if (response) then -- traitement de la réponse else fibaro:debug("Une erreur est survenue [code=" .. (errorCode or "") .. ", status=".. (status or "") .."]" ) end 3
pepite Posté(e) le 17 janvier 2017 Signaler Posté(e) le 17 janvier 2017 @Steven, ah ben voila, je comprends mieux, je savais que errorCode renvoyait 0 mais je savais pas l'ecrire lol Super, je vais encore pouvoir me coucher moins c...grace à toi ;-) MERCI beaucoup
Messages recommandés