Aller au contenu

Empêcher une function de bloquer un script


Shad

Messages recommandés

L'utilisation tu pcall est vraiment important mais ce n'est pas une fin en soit, il est aussi important de savoir pourquoi le code plante, donc ne pas hésiter à  vérifier les choses, exemple les variables (type, valeur) avant de les utiliser: c'est la cause la plus fréquente de plantage...

 

Sinon, mes deux WatchDog tournent depuis plus de 20h sans remonter d'erreur ou de blocage, mon device Freebox serveur lui tourne depuis > 38 heures sans problèmes et pourtant: > de 2000 lignes de codes, un max de socket, un max de fonctions etc. etc., je suis rassuré :)

Lien vers le commentaire
Partager sur d’autres sites

Oui, il faut avant tout chercher la cause du plantage du main loop

Dans mon cas, le hasard a bien fait les choses, puisque j'ai volontairement relancé mon main loop avec debug, et cette fois-ci j'ai bien vu le problème du plantage.... mais j'ai constaté également l'impact de l'absence des lignes de contrôles  

Je préférerais par contre utiliser une log pour les remontées d'erreurs (plutôt que debug), et qui ne soit pas une ligne de caractères en vert sur le module virtuel.... un vrai historique d’événements d'erreurs, mais je ne trouve pas ?

 

Sinon pour le device Freebox, je suis toujours preneur  ;)

Lien vers le commentaire
Partager sur d’autres sites

Un historique d'événements d'erreurs est un truc envisageable mais avec un serveur externe car Fibaro n'ouvre pas l'accès au logs du HC2.

 

Pour le device Freebox, j'en connais un qui veut être bêta testeur :D

 

freebox serveur beta device

 

Lien vers le commentaire
Partager sur d’autres sites

Bon, à  défaut et de manière très provisoire, je vais peut-être remonter la périodicité des problèmes de traitement d'info Netatmo, sur un module virtuel avec quelques labels : très bricolo ! 

... ou alors, il faut que je regarde ton watchdog avec Thingspeak, mais çà  ne sera pas avant la semaine prochaine

Lien vers le commentaire
Partager sur d’autres sites

Bon c'est pas  vraiment un watchdog (abus de langage) car le script n'agit pas sur le problème mais surveille la bonne exécution et le recyclage éventuel des variable globales du main loop, après c'est assez simple de l'adapter au besoin et par exemple ré exécuter un appel raté, prévenir par mail ou push en cas de blocage du loop etc...

Lien vers le commentaire
Partager sur d’autres sites

J'avais remonté àAndrew il y a quelques mois des problèmes avec le FHttp qui plante aléatoirement j'ai réglé le problème depuis àma sauce, en gros la fonction est executée (5 x max) jusqu’àréussite, comme cela:

-- recursive function
local function process(retry)
  retry = retry or 0;
  --open the socket
  local httpClient= Net.FHttp("mon_domaine");
  --send packet
  local response, status, errorCode = httpClient:GET("/mon_script");
  --check for error  	
  if errorCode == 0 then
    -- traiter la reponse ici
    return true;
  else
    if retry < 5 then
      fibaro:log("Retry process, please wait...");
      fibaro:sleep(1000);
      return process(retry + 1);
    end
    return false;
  end
end
Lien vers le commentaire
Partager sur d’autres sites

Les valeurs provenant de Netatmo affichées ce matin sur mon module virtuel sont obsolètes : le main loop est encore bloqué

 

Voici le code que j'avais modifié :

--[[
%% autostart
%% properties
%% globals
--]]

-- Setting up the connection data 
FHTE = Net.FHttp("www.xxxxxxxx.com") 
-- Netatmo extérieur
response = FHTE:GET("/netatmo/netatmo.php?intext=ext") 
-- decoding json string to table 
if (response~= nil) then
local result = json.decode(response) ;
if (result ~= nil) then
 temperature_exterieure = result.body[1].value[1][1];
 humidite_exterieure =result.body[1].value[1][2];
 -- variable globale pour info sms
 fibaro:setGlobal("tempext", "Température extérieure : "..temperature_exterieure.."°C")
else
  fibaro:debug("problème script netatmo !");
end
end
-- Netatmo intérieur
response = FHTE:GET("/netatmo/netatmo.php?intext=int") 
-- decoding json string to table 
if (response~= nil) then
local result = json.decode(response) ;
if (result ~= nil) then
  temperature_interieure = result.body[1].value[1][1];
  co2 =result.body[1].value[1][2];
  humidite_interieure =result.body[1].value[1][3];
  pression =result.body[1].value[1][4];
  bruit =result.body[1].value[1][5];
  -- variable globale pour info sms
  fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C")
  -- affichage infos dasn module virtuel
  fibaro:call(114,"setProperty","ui.temperature.value",(temperature_interieure.."°C / "..temperature_exterieure.."°C"))
  fibaro:call(114,"setProperty","ui.humidite.value",(humidite_interieure.."% / "..humidite_exterieure.."%"))
  fibaro:call(114,"setProperty","ui.pression.value",(pression.." mbar"))
  fibaro:call(114,"setProperty","ui.co2.value",(co2.." ppm"))
  fibaro:call(114,"setProperty","ui.bruit.value",(bruit.." dB"))
else
  fibaro:debug("problème script netatmo !");
end
end 
-- tempo de 6 minutes
fibaro:sleep(360*1000); 

Je relance deux fois le main loop par la procédure debug et j'obtiens à  chaque fois ce message d'erreur :

[ERROR] 02:40:37: line 14: Expected value but found T_END at character 1
Il s'agit de la ligne 13 sur ce post (décalage d'une ligne, la 1ère étant vide)
 
Je ne modifie pas le code, je me contente de sauvegarder le module virtuel, je relance avec debug : pas de message d'erreur et les données Netatmo sont mises à  jour 
 
D'ici dimanche, je ne pourrai pas consacrer du temps à  des recherches, mais je pense que cette info pourra vous intéresser, notamment @Krikroff
Lien vers le commentaire
Partager sur d’autres sites

Oui il a pas mis pcall. Donc tu auras toujours cette erreur.

Mais tant qu'on ne pourra mettre un code dans le else de pcall sa ne fonctionnera pas car il y aura toujours des bugs.

Faut vraiment pouvoir reloader un main loop, sans sa c'est mort.

Où l'autre solution on mais son code dans un bouton, et on appelle le bouton dans le main loop.

Lien vers le commentaire
Partager sur d’autres sites

Tout à  fait possible de mettre une condition au pcall ;) . la c'est surtout le T_END qui me dérange. Depuis le changement de librairie JSON il y a ce problème parfois  :mellow: 

Lien vers le commentaire
Partager sur d’autres sites

Le T_END andrew est au courant.

 

C'est de la qu'il ma proposer le pcall. Mais sa ne résous pas le problème.

 

Je sais qu'on peut mettre une condition dans le pcall. Mais ce que je veux dire c'est par exemple si pcall return false alors par exemple fibaro:reload(idmodule)

Lien vers le commentaire
Partager sur d’autres sites

Merci @Krikroff

Pas de souci pour utiliser le module virtuel , le voici... mince, passe pas... refus des vfib... je zip.... -_-

 

PS : @shad, j'ai bien compris pour le pcall, mais il est préférable de rechercher l'origine du blocage et de la supprimer  ;)

 

 

Netatmo.zip

Lien vers le commentaire
Partager sur d’autres sites

Hum j'aime les défis :), je pense qu'il est tout àfait possible d’empêcher le blocage du mainloop, tout est affaire de design du code ;) (enfin si nous parlons bien tous de la même chose)

Lien vers le commentaire
Partager sur d’autres sites

Perso je parle sur des requêtes FHTTP.

Toi je pense que tu parles pour que le code puis continuer malgré les erreurs.

 

Mais une fois que la connexion au json est perdue, il n'arrive pas à  la restaurer.

C'est un problème tout à  fais aléatoire. J'aime essayer de remplacer la locale de connexion avec nil en cas de problème et qu'au loop suivant il recommence la connexion, mais sa ne change rien.

Une que loop a merdé, il ne se reconnecte plus du tout. L'erreur continue dans tout les loops.

Donc a moins d'avoir une commande kill ou reload, je pense pas qu'il n'y est trop de solution.

Lien vers le commentaire
Partager sur d’autres sites

Nous parlons donc bien de la même chose Shad, c'st une affaire de design du code, j'ai apporté un début de réponse ici: http://www.domotique-fibaro.fr/index.php/topic/271-cr%C3%A9er-une-fonction-r%C3%A9cursive/

 

Encapsule ton code critique dans des fonctions pour isoler les processus, en cas de défaillance il faut relancer le processus ou choisir une alternative pour continuer la bonne marche du code !

 

Si il y a blocage sur un json parce-que le retour est mauvais il n'y a rien a faire, par contre si c'est parce-que le service qui crée le json à  mal répondu il n'y a pas de problème :)

Lien vers le commentaire
Partager sur d’autres sites

Je ne vois pas ou est le problème ? Il faut gérer le nil puis nouveau socket, sleep(1000), nouvelle demande :-)

En même temps c'est pas évident sans voir le code ;-)

Perso j'utilise maintenant aussi beaucoup mon framework LUA que j'ai distribué et n'utilise quasi plus FHttp mais ma librairie ;-)

Lien vers le commentaire
Partager sur d’autres sites

Je fais des tests sur le code de i-magin parce qu'il y a un truc pas net avec json.decode qui plante sans raison visible et balance régulièrement l'erreur T_END. Cette erreur est contournable pour pas planter le main loop mais c'est pas normal.

 

Tu te prends aussi le T_END toi ? désolé pour la question mais a force de zapper d'un truc à  l'autre :rolleyes:

 

PS: pas d'inquiétude pour le code, je suis discret et pas vraiment adepte du pillage, question de principe ;)

Lien vers le commentaire
Partager sur d’autres sites

Oui je l'ai aussi, enfin plus depuis que j'utilise le pcall ou ton code avec les erreurs.

Mais je fais toutes les boucles pour finalement afficher error, et finir avec le nil.

 

Mais là  j'abandonne, je vais voir si on je peux faire quelque chose tu coté tcp port 9090 avec xbmc.

 

edit: Me parait bien compliquer le tcp avec xbmc Xd

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...