Aller au contenu

Messages recommandés

Posté(e)

@Steven et @pepite, ôtez moi d'un doute, on parle bien de la même chose ?

 

Je suis entrain d'essayer de faire un put sans passer par une connexion de type : local HC2 = Net.FHttp("127.0.0.1", 11111) comme dans l'exemple de @Lazer !!!

J'essaye de faire un api.put tout simple.

Comme quand je récupère une valeur avec api.get (sans connexion Net.FHttp) !!

 

 

Posté(e)

Bonsoir @jjacques68

 

Pas d'inquiétude, je pense qu'avec le master @Steven nous avons bien compris ;-)

 

le code a planté ta box ? 

 

Je viens de tester en créant un panneau "rien que pour toi" ;-) Et en fait, je tombe sur la même chose que toi ;-) sans planter la box ;-)

 

Moi non plus ça ne change pas l'affichage, le changement a bien mieux, mais cela ne persiste pas. 

local idpanel = 90
local toto = api.get("/panels/heating/" ..idpanel)
print("Avant : " ..json.encode(toto.properties.monday.morning.hour))
toto.properties.monday.morning.hour = 8
api.put("panels/heating/" ..idpanel, toto.properties.monday.morning.hour)
print("Après : " ..json.encode(toto.properties.monday.morning.hour))
local titi = api.get("/panels/heating/" ..idpanel)
print("Encore après : " ..json.encode(titi.properties.monday.morning.hour))

Et le debug, 

 

[DEBUG] 20:55:21: Avant : 6
[DEBUG] 20:55:21: Après : 8
[DEBUG] 20:55:21: Encore après : 6

 

Posté(e)

Ok je retombe sur le même résultat que toi. Sans plantage de la box...

Je n'utilise pas la fonction json.encode par contre...

 

Et le panneau de chauffage ne se met pas à jour...

 

pffffff je ne trouve rien là-dessus nul part...

Posté(e)

Salut,

 

Pas d 'énervement, tu ne casses pas ta box ;-) tu la laisses tranquille, maintenant que c'est plutôt très stable, le boulet est certainement moi ;-)

 

Et cela tu peux tester stp


 

local idpanel = 90
local morninghour = 8
local payload = "/panels/heating/" ..idpanel
local myJson = '{"properties":{"monday":{"morning":{"hour":'..morninghour..'}}}}'

local toto = api.get(payload)
print("Avant : " ..json.encode(toto.properties.monday.morning.hour))

api.put(payload, myJson)
print("Après : " ..json.encode(toto.properties.monday.morning.hour))

local titi = api.get(payload)
print("Encore après : " ..json.encode(titi.properties.monday.morning.hour))

 

Posté(e)

ah bon ?

m..pardon, j'ai du me tromper dans la syntaxe du myJson.

 

Une autre syntaxe ? je crois vraiment que c'est la bonne.

tu essaies avec la syntaxe de l'API en HTTP là.

Posté(e)

oui je crois que je suis entrain de m'emmeler les pédales là...

local Panel = api.get("/panels/heating/61?properties=monday&morning=hour")

Et voilà le debug :

[DEBUG] 17:29:50: table: 0x9311860

ça ressemble à une table json mais impossible de la décoder, si j'utilise json.decode(Panel), j'obtiens :

[DEBUG] 17:32:04: line 74: bad argument #1 to 'match' (string expected, got table)

:13::15::(:angry:

Posté(e)

C'est normal, le api.get a déjà décodé la string pour te la transformer en tableau :

api.get = function(uri)
        uri = "/api" .. uri
        local http = Net.FHttp("127.0.0.1", 11111)
        local result, status, errorCode = http:GET(uri)
        if result ~= "" then
                return json.decode(result)
        else
                return ""
        end
end

PUT (ne met pas de string) attend un tableau :

api.put = function(uri, data)
        uri = "/api" .. uri
        local http = Net.FHttp("127.0.0.1", 11111)
        local jsonData = json.encode(data)
        local result, status, errorCode = http:PUT(uri, jsonData)
        if result ~= "" then
                return json.decode(result)
        else
                return ""
        end
end

 

  • Upvote 1
Posté(e)

ok pour l'explication.

Mais je crois que je vai abandonner mon idée de passer sans connexion Net.FHttp...

Je voulais économiser quelques lignes de code en passant directement avec api.put mais ça marche pô du tout.

 

C'est d'un compliqué tout ça...

  • Upvote 1
Posté(e) (modifié)

Absolument :)

 

Donc api.get et api.put te simplifie bien la vie comme tu le souhaitais. Pas besoin de Net.Fhttp ni de json.encode et decode().

 

Après si ton code ne fonctionne pas, c'est probablement parce tu t'es planté dans les champs du panneau de chauffage que tu souhaites modifier.

 

EDIT : ton dernier test en Net.Fhttp confirme ma phrase du dessus.

Modifié par Lazer
Posté(e)

OH put... de put... de m... !!

 

Je viens de comprendre que depuis le début, la valeur que je voulais insérer était 8.

Moi je mettais 8 sous forme de string, soit "8".

La je viens de comprendre qu'il attend un entier, soit 8.

 

Et la ça marche !!

 

@pepite, je vais reprendre tes exemples... du coup

Posté(e) (modifié)

Zut, replantage de la box avec ça dans une scène :

local Panel = api.get("/panels/heating/61")

Panel.properties.monday.morning.hour = 8

api.put("/panels/heating/61", Panel.properties.monday.morning.hour)

 

Modifié par jjacques68
Posté(e)

YEAH !!! ça marche maintenant !!!

voilà le bon code :

local Panel = api.get("/panels/heating/61")

Panel.properties.monday.morning.hour = 7

api.put("/panels/heating/61", Panel)

MERCI @pepite , @Lazer et @Steven !!

 

Mais j'ai besoin d'explications... là parce que moi pas comprendre.

local Panel = api.get("/panels/heating/61")

La variable Panel reçoit le contenu complet sous forme de tableau (json décodé) du panneau de chauffage 61. -> ok ?

 

Panel.properties.monday.morning.hour = 7

Je modifie ma valeur dans le tableau qui est dans la variable Panel. -> ok ?

 

api.put("/panels/heating/61", Panel)

Et la maintenant j'envois la le tableau de la variable Panel dans l'api. -> ok ?

 

Mais alors si je compare avec ce code du VD :

local HC2 = Net.FHttp("127.0.0.1", 11111)
local response, status, errorCode = HC2:GET("/api/panels/heating/61")
if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then
	local Panel = json.decode(response)
  	Panel.properties.monday.morning.hour = 7
  	Panel = json.encode(Panel)
  	HC2:PUT("/api/panels/heating/61", Panel)
end

... ... ... Bon je viens de percuter que c'est la même chose.

Comme vous avez dis api.put ou api.get permet d'éviter les lignes Net.FHttp, encode, decode, errorCode, ...

Posté(e)

Et ton affichage alors ? bien à jour ? 

Bon moi ça fonctionne mais, mon panneau ne se met jamais à jour en affichage, peut-être parce qu'il n'est pas actif ;-)

 

Regarde la fonction api.put et api.get que @Lazer a partagé. 

Tout ce dont tu parles, Net.FHttp et error, status, code  sont dans la déclaration de la fonction ;-) 

Posté(e)

Oui alors je viens de comprendre ces fonctions.

 

Mon affichage dans le panneau de chauffage est ok. Il est bien modifié, et en regardant dans l'API de la HC2, la valeur est prise en compte.

 

Mais c'est quand même fou le peu de documentation disponible !

Si des gars comme vous n'étiez pas là, on avancerait pas !

(ou alors je cherche mal...) :)

×
×
  • Créer...