kead77 Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 Normalement j'utiliser ce script pour définir un température manuel in panneau de chauffage De dernière version du firmware ne fonctionnera pas. Comment devrais-je changer? HC2 = Net.FHttp("127.0.0.1",11111); -- Recovering info -- 4 is the heating zone response ,status, errorCode = HC2:GET("/api/panels/heating/4"); jsonTable = json.decode(response); -- Setting info jsonTable.properties.vacationTemperature = 0; -- Saving info json = json.encode(jsonTable); HC2:PUT("/api/panels/heating/4", json);
Lazer Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 Quand tu fais la ligne suivante : json = json.encode(jsonTable); Tu écrases la classe prédéfinie json avec ta variable. Il faut que tu utilises un autre nom de variable. Sinon ton script n'est pas propre, tu fais des HC2.GET puis json.decode sans aucune vérification du retour de ta variable précédente.... il faudrait mettre quelques tests.... au minimum cela : if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then PS : les points-virgules en fin de ligne ne servent à rien en LUA mais tu peux les laisser si tu en as l'habitude par rapport à d'autres langages.
kead77 Posté(e) le 26 octobre 2016 Auteur Signaler Posté(e) le 26 octobre 2016 Je ne comprenais pas bien ... Ce code a bien fonctionné (je copiais dans un autre thread dans le forum pour une VD). Je ne suis pas très bon à JSON ... en effet ... Vous pouvez écrire le code correct pour set manuel un panneau de chauffage de la température? Ou avez-vous un link autre thread?
jojo Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 tu peux regarder dans ma signature, j'ai fait un tuto sur le sujet
Lazer Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 Oui ce code fonctionnait avant... mais maintenant il ne fonctionne plus, car Fibaro a changé le mode de fonctionnement des VD depuis un certain temps. En effet, comme je le disais, la ligne json = json.encode(jsonTable) écrase la classe prédéfinie json (et tout son contenu, notamment les fonctions json.decode() et json.encode() dont tu as besoin) avec le contenu de ta nouvelle chaine de caractère. Avant, ce n'était pas grave, car une fois que tu avais écrasé la variable json, tu n'en n'avais plus besoin car le script se terminait, et le process Linux associé au VD se déchargeait de la mémoire. Maintenant le VD reste en mémoire, donc lorsque tu cliques à nouveau sur le bouton de ton VD, cela ne peut plus fonctionner car la classe json a été écrasée par ton propre code. Donc impossible d'appeler à nouveau les fonctions json.decode() et json.encode(). Cela oblige donc à coder plus proprement. A la base, ce changement de mode de fonctionner des VD a été introduit par Fibaro pour limiter les plantages inexpliqués de VD (core dump au niveau de Linux, qui faisait que le VD s'arrêtait sans prévenir). La conséquence de ce nouveau mode de fonctionnement des VD, est visible sur un autre VD du forum ; le VD Diagnostiques et son bouton Double-click pour rebooter. L'astuce du double clic ne fonctionne plus car Fibaro ne laisse plus 2 instances du VD s'exécuter en parallèle. Une seule instance persistante, et c'est tout. Voici le code qui fonctionne bien : -- Thermostat : 5°C local HC2 = Net.FHttp("127.0.0.1", 11111) local response, status, errorCode = HC2:GET("/api/panels/heating/1") if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then local jsonTable = json.decode(response) jsonTable.properties.vacationTemperature = 5 local newJson = json.encode(jsonTable) HC2:PUT("/api/panels/heating", newJson) end
jojo Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 merci Lazer pour ces explications "scientifiques". Mon VD fonctionne toujours, mais je pourrais du coup le rendre plus lisible. dans ton code, ne faudrait-il pas préciser le # du heating panel àla ligne 9 HC2:PUT("/api/panels/heating/1", newJson)
Lazer Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 Du coup j'ai jeté un oeil à ton code Jojo, et il fonctionne car tu n'écrase pas la classe "json". D'ailleurs tu n'utilises pas le json.encode car tu recrées à la main la chaine de caractère json à envoyer à l'API. Why not Oui tu as raison on peut sortir l'ID du heating panel dans une variable pour avoir un code plus universel. J'ai juste partagé vite fait mon code tel quel, car je n'ai qu'un seul thermostat.
jojo Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 Je n'utilise pas le json.encode car je ne maîtrisait pas cela à l'époue. Mais je vais le modifier, car c'est plus lisible ce que tu proposes. Je parlais de rajouter l'ID du HP lors du PUT, car je voyais que tu l'appelais lors du GET plus haut, alors comment clea peut fonctionner, même avec un HP si tu ne précises pas duquel il s'agit ? (c'est juste une question pour mourir moins bête, si je meurs dans mon sommeil cette nuit )
Lazer Posté(e) le 26 octobre 2016 Signaler Posté(e) le 26 octobre 2016 Ah ok.... hum... ça fonctionne bien comme cela, sans l'ID du HP. Donc j'imagine que ça lui suffit qu'il soit déjà dans le JSON, et qu'il n'a pas besoin de l'avoir en plus dans l'URL du PUT. Faudrait vérifier dans la doc de l'API pour en voir le coeur net, mais perso j'ai simplement copié ce que fait l'interface Web, comme à chaque fois que j'essaye d'attaquer l'API.
kead77 Posté(e) le 27 octobre 2016 Auteur Signaler Posté(e) le 27 octobre 2016 Jojo merci pour votre VD mais je avoir 6 panneaux de chauffage différents et je veux mettre chacun seul en mode OFF en fonction des événements individuels dans la chambre (en ouvrant des fenêtres le matin). Ce script est parfait à mon dessein. Si je veux appeler le mode manuel pour un temps donné, comment puis-je faire? Avec la commande "jsonTable.properties.handTemperature = 5" je imposée une valeur de température, mais ne sont pas appliquées et ne comprennent pas si elle est toujours. merci beaucoup pour votre temps
pepite Posté(e) le 27 octobre 2016 Signaler Posté(e) le 27 octobre 2016 Salut, Pour le passage du mode manuel je pense qu'il faut : properties.handTemperature ET properties.handTimestamp "handTemperature": 0, "handTimestamp": 1477593617 1
jojo Posté(e) le 27 octobre 2016 Signaler Posté(e) le 27 octobre 2016 tu peux en effet utiliser le time stamp ou laisser le mode vacances (donc sans timestamp) jusque quand la condition est erminée. Exemple : tu ne sais pas àl'avance combien de temps la fenêtre va rester ouverte, donc dès qu'on l'ouvre, tu pass en mode vacancs, et dès qu'on la referme tu repasse en mode auto.
pepite Posté(e) le 27 octobre 2016 Signaler Posté(e) le 27 octobre 2016 Sauf qu'il ne sait pas comment activer les modes manuels ou vacances avec l'API, ca n'a apsnl'air de fonctionner @jojo
jojo Posté(e) le 29 octobre 2016 Signaler Posté(e) le 29 octobre 2016 en tout cas chez moi ça fonctionne au micro poil (pas comme mon Esxi)
Messages recommandés