Aller au contenu

Messages recommandés

Posté(e) (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é par henri-allauch
Posté(e)

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))

 

Posté(e)

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 ....
Posté(e) (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é par henri-allauch
Posté(e)

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

Posté(e)

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. 

 

 

Posté(e)

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.

Posté(e)

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" } ] }

Posté(e)

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. 

  • Upvote 3
Posté(e) (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é par pepite
Posté(e)

@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

 

 

  • Upvote 3
Posté(e)

@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

 

×
×
  • Créer...