Tomsauy Posté(e) le 12 novembre 2018 Signaler Posté(e) le 12 novembre 2018 (modifié) Hello, voila je sèche un peu du coup j'en appelle à vos connaissances ! J'ai un VD avec une Mainloop et pour une raison que j'ignore cette Mainloop plante au bout d'un certain temps (environ 24 à 48h) En ajoutant des traces j'ai identifié que c'est le fibaro:setGlobal() qui fait planter cette boucle, mais impossible de savoir pourquoi... Voici le bout de code en question. fibaro:debug("Step 1") -- Get Room Zone & Zone Mode associated local room_zone = fibaro:getGlobal("zone_"..roomName) fibaro:debug("Step 2") zone_heat_value = fibaro:getGlobal("zone_"..room_zone.."_heat_value") fibaro:debug("Step 3") status, err = pcall(function() fibaro:setGlobal("rad_"..roomName.."_status", zone_heat_value) end ) if (status ~= nil and status ~= true) then fibaro:debug("status: " .. tostring(status or '')); end if (err ~= nil) then fibaro:debug("err: " .. tostring(err or '')); end --fibaro:setGlobal("rad_"..roomName.."_status", zone_heat_value) fibaro:debug("Step 4") J'ai fait un test en passant pour un pcall pour protéger l'appel à la fonction mais ça ne change rien la Mainloop plante Et il n'y a rien dans la variable err car aucun affichage, tout s’arrête à "Step 3" ! Bref il doit y avoir quelque chose qui déconne mais impossible de comprendre quoi... Et pour debug pas simple car il faut attendre 24 à 48h entre 2 tests... Bref si quelqu'un a une idée je suis preneur ! Merci Modifié le 12 novembre 2018 par Tomsauy
Barelle Posté(e) le 12 novembre 2018 Signaler Posté(e) le 12 novembre 2018 Où est définie la variable roomName ?
Tomsauy Posté(e) le 12 novembre 2018 Auteur Signaler Posté(e) le 12 novembre 2018 (modifié) Bonjour Barelle une variable en début de Mainloop: local roomName = "salon" Modifié le 12 novembre 2018 par Tomsauy
Barelle Posté(e) le 12 novembre 2018 Signaler Posté(e) le 12 novembre 2018 Je te suggère de rajouter dans tes traces les valeurs des variables globales : fibaro:debug("Step 2, room_zone="..room_zone) fibaro:debug("Step 3, zone_heat_value="..zone_heat_value)
Tomsauy Posté(e) le 12 novembre 2018 Auteur Signaler Posté(e) le 12 novembre 2018 (modifié) Pas faux je vais rajouter cela ça coûte rien ! Voici pour info le code qui tourne actuellement: local roomName = "salon" [...] -- Get Heater Mode local rad_mode = fibaro:getGlobal("rad_"..roomName.."_mode") fibaro:debug("Step 1,rad_mode="..rad_mode) -- If the Heater Mode is Auto set the Heater Status associated to the Zone Mode if (rad_mode == "Auto") then fibaro:debug("Step 2") -- Get Room Zone & Zone Mode associated local room_zone = fibaro:getGlobal("zone_"..roomName) fibaro:debug("Step 3, room_zone="..room_zone) zone_heat_value = fibaro:getGlobal("zone_"..room_zone.."_heat_value") fibaro:debug("Step 4, zone_heat_value="..zone_heat_value) status, err = pcall(function() fibaro:setGlobal("rad_"..roomName.."_status", zone_heat_value) end ) if (status ~= nil and status ~= true) then fibaro:debug("status: " .. tostring(status or '')); end if (err ~= nil) then fibaro:debug("err: " .. tostring(err or '')); end --fibaro:setGlobal("rad_"..roomName.."_status", zone_heat_value) fibaro:debug("Step 5") end [...] Modifié le 12 novembre 2018 par Tomsauy
Steven Posté(e) le 13 novembre 2018 Signaler Posté(e) le 13 novembre 2018 Une fois que tu auras validé le contenu des variables globales par des fibaro:debug(...) Perso, j'optimiserais le code ainsi : local roomName = "salon" -- If the Heater Mode is Auto set the Heater Status associated to the Zone Mode if ("Auto" == fibaro:getGlobalValue("rad_"..roomName.."_mode")) then -- Get Room Zone & Zone Mode associated local room_zone = fibaro:getGlobalValue("zone_"..roomName) fibaro:setGlobal("rad_"..roomName.."_status", fibaro:getGlobalValue("zone_"..room_zone.."_heat_value")) end Il faut savoir que l'usage de getGlobal ne retourne pas que la valeur de la Variable Global mais aussi sa date de mise à jour. Il est donc préférable d'utiliser getGlobalValue. Après le code de fibaro, fait la même chose dans les 2 cas, mais on est jamais à l'abri d'une optimisation de leur part. 1
Tomsauy Posté(e) le 13 novembre 2018 Auteur Signaler Posté(e) le 13 novembre 2018 Merci pour ces optimisations ! effectivement je pense qu'il y a largement matière à optimiser le code et d'ailleurs je ferai peut être un post dédié à cela, car ça fait bien longtemps que je n'ai pas programmé et je pense qu'il y a largement de quoi optimiser tout le code. Dans l'absolut tout fonctionne (sauf le pb dont je fais mention dans ce topic) mais surement pas de manière optimum
Steven Posté(e) le 13 novembre 2018 Signaler Posté(e) le 13 novembre 2018 Un MainLoop qui tourne toutes les 3 secondes et qui plante sur 3 getGlobal et un setGlobal, ce n'est pas fréquent. A la lecture du code, j'ai l'impression qu'il n'y a que quelques variables globales qui doivent être vérifiée ou modifiée toutes les 3 secondes. Il serait bien de les identifier et d'aller chercher les autres qu'une seule fois. Exemple : local roomName = "salon" if (not room_zone) then room_zone = fibaro:getGlobalValue("zone_"..roomName) end ...
Tomsauy Posté(e) le 13 novembre 2018 Auteur Signaler Posté(e) le 13 novembre 2018 @Steeve je suis entièrement d'accord J'ai écrit ce VD il y a 4 ans quasi jour pour jour (je viens de m'en rendre compte en regardant l’entête de mon scripte ) Et à cette époque les choses étaient pas les même au niveau des possibilités et en plus je débutais en LUA (ceci dit je suis pas sur d'avoir bcp progressé depuis ) Et en fait il fonctionnait sans trop bronché du coup ben c'est comme bien souvent je n'y ai pas retouché même si bien conscient que tout cela pourrait être fait de manière bcp plus optimale... J'avais même eu pour idée de le partager avec la communauté à l'époque mais conscient que c'était peut être pas la meilleurs des façons de développer le truc je ne suis pas allé jusqu’au bout et surtout peut être trop spécifique à mon besoin (aujourd'hui je regrette car je me dis qu'il aurait peut être intéressé mais avec des évolutions que chacun aurait pu faire) Mais du coup cet été j'ai réinstallé toute ma Box avec un RAZ complet et je me suis rendu compte que ce bon vieux VD d'il y a 4 ans avait quelques soucis et du coup l'idée de debugger et pourquoi pas updater le tout m'est passé par la tête... Bref voila un peu d'historique pour expliquer tout cela. Pour info je fais un sleep et la boucle ne tourne que toutes les 10sec car à l'époque ça faisait planter la box (vu l'optimisation du code pas étonnant) ! Ces VD gère chaque chauffage de la maison en gros : un chauffage = un VD de ce type Et j'ai un autre type de VD qui gère les Zones et la programmation de la Zone 1
Steven Posté(e) le 13 novembre 2018 Signaler Posté(e) le 13 novembre 2018 C'est cool, tu aurais du partager
Tomsauy Posté(e) le 13 novembre 2018 Auteur Signaler Posté(e) le 13 novembre 2018 Si j'arrive à le debugger je partage !
Tomsauy Posté(e) le 14 novembre 2018 Auteur Signaler Posté(e) le 14 novembre 2018 Ca y est le module a planté... Mais je ne sais pas pourquoi... Aucune info dans la log, tout est "normal" ! [DEBUG] 15:14:09: Info Traitement : Boucle principale [DEBUG] 15:14:09: Info Traitement : Gestion Windows [DEBUG] 15:14:09: Last Window/Door as been closed: 23356sec [DEBUG] 15:14:09: Current Temp.: 21.2°C [DEBUG] 15:14:09: Step 1,rad_mode=Auto [DEBUG] 15:14:09: Step 2 [DEBUG] 15:14:09: Step 3, room_zone=1 [DEBUG] 15:14:09: Step 4, zone_heat_value=Confort [DEBUG] 15:14:11: Step 5 [DEBUG] 15:14:11: Heater Mode: Auto [DEBUG] 15:14:11: Heater Status: Confort [DEBUG] 15:14:11: Mode Confort [DEBUG] 15:14:21: Info Traitement : Boucle principale [DEBUG] 15:14:21: Info Traitement : Gestion Windows [DEBUG] 15:14:21: Last Window/Door as been closed: 23368sec [DEBUG] 15:14:21: Current Temp.: 21.2°C [DEBUG] 15:14:21: Step 1,rad_mode=Auto [DEBUG] 15:14:21: Step 2 [DEBUG] 15:14:21: Step 3, room_zone=1 [DEBUG] 15:14:21: Step 4, zone_heat_value=Confort Il récupère bien les valeurs mais ça plante ! Le setGlobal ne passe pas....
jjacques68 Posté(e) le 15 novembre 2018 Signaler Posté(e) le 15 novembre 2018 petite question, tu as des têtes Danfoss ? Car moi aussi je gère le chauffage via des zones. et VD par zones. Et à chaque saison de chauffe j’ai souvent des plantage de la box complète. Je pense sérieusement, aux têtes qui retournent des valeurs étranges...
Tomsauy Posté(e) le 15 novembre 2018 Auteur Signaler Posté(e) le 15 novembre 2018 Hello @jjacques68, non je ne gère pas via des vannes Danfoss, je suis en chauffage électrique je passe par le fils pilotes de mes radiateurs (via un module FGS-222 + Diodes de redressement) peut être essayé de debugger en affichant les valeurs... Mais j'avoue c'est pas simple de debugger ce genre de pb !
Steven Posté(e) le 15 novembre 2018 Signaler Posté(e) le 15 novembre 2018 Aurais-tu un autre script qui fait des setGlobal de la même variable ? Je pense à un "lock" quand 2 applications mettent à jour la même variable.
Tomsauy Posté(e) le 15 novembre 2018 Auteur Signaler Posté(e) le 15 novembre 2018 Hello @Steven, j'y avait pensé aussi mais pour moi non, aucun autre Set/Get sur cette variable ailleurs
Steven Posté(e) le 15 novembre 2018 Signaler Posté(e) le 15 novembre 2018 Vraiment étrange car ton code semble bon. As-tu tenté de mettre une temporisation. Du style (code très sale) if (not i) then i = 0 end if i % 5 == 0 then --- ton code ici end Juste pour vérifier que si ton code est exécuté une fois sur 5, il ne plante pas.
Tomsauy Posté(e) le 16 novembre 2018 Auteur Signaler Posté(e) le 16 novembre 2018 (modifié) Je n'ai pas encore testé mais je vais car hier j'ai tenté de réécrire un peu le code de manière à commencer à optimiser et malgré cela même plantage... Le plus étonnant c'est que ça fait planter tous mes VD attachés à chaque chauffage et cela exactement à la même seconde d’après les logs de chaque VD !! Du coup je pense à un plantage du système et je essayer de regarder dans les logs systèmes... Mais vu la verbosité il n'y a pas long de log (1 à 2h max de ce que j'ai vu ce matin) Et en attendant je pense que je vais mettre en place le WatchDog car ça devient problématique le plantage du chauffage avec les températures qui baissent !! Modifié le 16 novembre 2018 par Tomsauy
Messages recommandés