Aller au contenu
mikael2235

Gestion Erreur dans code lua

Recommended Posts

Bonjour à tous, 

 

Je vous explique mon besoin, je cherche à gérer les cas d'erreurs sur une simple fonction call, afin notamment de detecter si un module non alimenté. 

 

fibaro:call(160, turnOn);

--Gestion erreur
if erreur then
   send notif KO
else
   execute code OK
end

Je ne sais pas si j'ai été bien clair ! Je vous remercie d'avance pour votre aide. 

Mikael

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut. Ton message est très clair. Tu voudrais essayer de faire un catch de l erreur. 

 

Peut être ici bas une piste?

 

Pas encore vérifié mais peut être regarder ici :

 

https://forum.fibaro.com/topic/20287-how-to-handle-errors-in-lua/

ou

 

https://www.domotique-fibaro.fr/topic/14971-d%C3%A9tecter-les-erreurs-et-prot%C3%A9ger-lex%C3%A9cution-dun-script-lua-avec-pcall/

 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 3 heures, Lorenzo a dit :

Salut. Ton message est très clair. Tu voudrais essayer de faire un catch de l erreur. 

 

Peut être ici bas une piste?

 

Pas encore vérifié mais peut être regarder ici :

 

https://forum.fibaro.com/topic/20287-how-to-handle-errors-in-lua/

ou

 

https://www.domotique-fibaro.fr/topic/14971-détecter-les-erreurs-et-protéger-lexécution-dun-script-lua-avec-pcall/

 

Merci pour ton retour, J'ai bien vu ces liens et j'ai essayé avec pcall (exemple 5) mais sans succès. Je ne suis pas sur de ce que je fais non plus :-/

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu ne peux pas, cette fonction fibaro:call() envoie l'instruction au module concerné, mais ne retourne rien, quel que soit le résultat de l'exécution de la commande.

 

Il faut donc le faire de manière détourner, par exemple selon la séquence suivante (simple suggestion, il y a surement d'autres façon de procéder) :

- fibaro:call()

- attendre un certain temps avec sleep() ou settimeout()

- aller lire le statut du module en question pour connaitre son état avec fibaro.getValue() ou encore api.get() qui te permettra d'aller récupérer toutes les propriétés contenues dans le JSON du module (par exemple dead, power, etc)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer pour ces précisions. 

 

J'avais d'abord essayé avec la propriété dead, mais je ne comprend pas bien comment cela fonctionne car même avec un module débranché, il me renvoie dead : 0

donc pas vraiment fiable. 

 

aurais tu un exemple de code pour le json du module ? je ne connais pas ça !

 

En fait ce que je voudrais c'est par exemple récupérer le "Transfert OK" ou "Problème communication" qui s'affiche dans le module sur le dashboard !!

Modifié par mikael2235

Partager ce message


Lien à poster
Partager sur d’autres sites

La propriété dead doit refléter l’icône de ton module dans l'interface, donc je suppose qu'il n'est pas passé en nœud mort ? (icône grisée ou barrée sur HC2, je ne sais plus)

Un module mort ne passe pas immédiatement dead, mais uniquement après quelques tentatives infructueuse de le joindre. Et c'est pire pour un module sur batterie, car il ne passe dead qu'après avoir écoulé le temps de son intervalle de réveil (qui peut être infini sur certains modules modernes...)

 

Attention je suis sur HC3, il y a pas mal de petites différences dans le code LUA et l'API avec la HC2.

Mais des exemples de code avec api.get() il y en a plusieurs sur le forum, tu les retrouveras facilement.

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai trouvé un exemple de code api.get complet, 

local Value=api.get("/devices/"..device[i].id)

mais je voudrais savoir qu'elles sont les propriétés interrogeables pour que je puisse savoir si mon module est branché ? 

Partager ce message


Lien à poster
Partager sur d’autres sites

Et bien c'est la propriété dead, comme mentionné.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

finalement je vais utiliser les propriétés log + dead pour plus de fiabilité, avec ce code : 

--[[
%% properties
%% events
%% globals
--]]
id = 21

fibaro:call(id, "turnOn");
ser = fibaro:getValue(id, "dead")
fibaro:debug(ser)
log = fibaro:getValue(id, "log")
fibaro:debug(log)

ce qui me donne ce résultat :

et la je vais pouvoir lire les status a chaque commande et savoir si il est off ou pas en lisant le log, sans attendre le call d'après !

[DEBUG] 06:43:04: 1   module débranché
[DEBUG] 06:43:04: SEND_COMMAND_TO_DEAD_DEVICE
[DEBUG] 06:44:12: 0  module rebranché
[DEBUG] 06:44:12:
[DEBUG] 06:44:33: 0
[DEBUG] 06:44:33:
[DEBUG] 06:44:40: 0   module débranché
[DEBUG] 06:44:40: ZWave_Send_Failed
[DEBUG] 06:44:54: 1
[DEBUG] 06:44:54: SEND_COMMAND_TO_DEAD_DEVICE

 

Partager ce message


Lien à poster
Partager sur d’autres sites

je n'ai pas eu le courage de lire tous vos échanges, mais mon idée serait la suivante :

On parle ici d'un module alimenté => faire un test si le module est mort ...

Partager ce message


Lien à poster
Partager sur d’autres sites

×