Aller au contenu
Tomsauy

[HELP/LUA] - Plantage MainLoop

Recommended Posts

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é par Tomsauy

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour Barelle :) 

 

une variable en début de Mainloop:

local roomName = "salon"

 

Modifié par Tomsauy

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par Tomsauy

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

...

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@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 :D)

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

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est cool, tu aurais du partager ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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... :mellow: Mais j'avoue c'est pas simple de debugger ce genre de pb ! :( 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello @Steven

j'y avait pensé aussi mais pour moi non, aucun autre Set/Get sur cette variable ailleurs :( 

Partager ce message


Lien à poster
Partager sur d’autres sites

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. 

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par Tomsauy

Partager ce message


Lien à poster
Partager sur d’autres sites

×