Aller au contenu
kead77

Scripts Lua Pour Changer Vacances Températures Panneaux De Chauffage

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites
Je ne comprenais pas bien ...  :huh:  :(

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 ...  :rolleyes:

Vous pouvez écrire le code correct pour set manuel un panneau de chauffage de la température? Ou avez-vous un link autre thread?  :13:  :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

tu peux regarder dans ma signature, j'ai fait un tuto sur le sujet

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

 

Pour le passage du mode manuel je pense qu'il faut :

properties.handTemperature ET properties.handTimestamp

"handTemperature": 0,
"handTimestamp": 1477593617
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Sauf qu'il ne sait pas comment activer les modes manuels ou vacances avec l'API, ca n'a apsnl'air de fonctionner @jojo

Partager ce message


Lien à poster
Partager sur d’autres sites

en tout cas chez moi ça fonctionne au micro poil (pas comme mon Esxi)

Partager ce message


Lien à poster
Partager sur d’autres sites

×