Krikroff Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 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é
Krikroff Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 Le code est ici http://www.domotique-fibaro.fr/index.php/topic/270-surveiller-un-main-loop/
i-magin Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 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
Krikroff Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 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
Moicphil Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 Et si toutefois tu as besoin d'un 2 iem béta testeur ...
i-magin Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 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
Krikroff Posté(e) le 15 janvier 2014 Signaler Posté(e) le 15 janvier 2014 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...
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 Je te remercie, je fais essayer de cette façon.
i-magin Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 ha ! encore ce problème de T_END ... Puis-je me permettre d'utiliser ton code sur mon HC2 pour test et de remonter l'information àFibaro si cela est confirmé ?
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 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.
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 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)
i-magin Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 On ne peut rien y faire au blocage àl'heure actuel, et la seule solution que je vois cette reload le main loop Et sa ne supprime pas l'erreur sa empêche le script de ce bloquer.
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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)
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 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.
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 Mon code est dans une fonction globale qui choisis les paramètre via des confitions. Faudrait que je réessaye en créant une fonction par code dans ce cas.
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 Krikroff, tu vois même avec ton code et je suis monté a 10 boucle [ERROR] 19:14:33: line 64: attempt to index global 't' (a nil value)
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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 ;-)
Shad Posté(e) le 16 janvier 2014 Auteur Signaler Posté(e) le 16 janvier 2014 Moi je veux bien arrêtter le FHttp, mais il y a une autre solution pour récupérer un json ???? Oui sa va le code je vais te le passer.
Krikroff Posté(e) le 16 janvier 2014 Signaler Posté(e) le 16 janvier 2014 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 PS: pas d'inquiétude pour le code, je suis discret et pas vraiment adepte du pillage, question de principe
Shad Posté(e) le 17 janvier 2014 Auteur Signaler Posté(e) le 17 janvier 2014 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
Messages recommandés