-
Compteur de contenus
6 715 -
Inscription
-
Dernière visite
-
Jours gagnés
124
Tout ce qui a été posté par Krikroff
-
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
-
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...
-
pas de problèmes ...
- 478 réponses
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
Merci beaucoup pour toutes ces informations utiles, j’espère mettre à disposition une version 1.0.0.6 exempte de blocages
- 478 réponses
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
J'ai une piste pour ce problème, merci pour ces informations . PS: Tu attends longtemps ou pas ?
- 478 réponses
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
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
-
Non pas de news
- 251 réponses
-
Le code est ici http://www.domotique-fibaro.fr/index.php/topic/270-surveiller-un-main-loop/
-
Suite au sujet ici http://www.domotique-fibaro.fr/index.php/topic/262-emp%C3%AAcher-une-function-de-bloquer-un-script/ j'ai mis en place un script LUA afin de faire des tests sur le comportement du "Main Loop" d'un périphérique virtuel sur mon HC2 et je le partage bien volontiers avec vous afin de croiser nos expériences. Il y a deux versions, une uniquement basée sur une variable globale et une autre utilisant en plus thingspeak afin d'historiser les résultats. Il faut tout d'abord ajouter les variables, ici : MLWatchDog pour la V1 et MLWatchDog2 pour la V2 puis ajouter un périphérique virtuel, ajouter un label nommé: lblDebug et le code suivant dans le main loop Version 1 -- Copyright © 2013 Jean-christophe Vermandé ------------------------------------------------------------------------------------------- -- Main process ------------------------------------------------------------------------------------------- selfId = fibaro:getSelfId(); function refreshUI(s) fibaro:log(s); fibaro:call(selfId, "setProperty", "ui.lblDebug.value", s); fibaro:debug(s); end function SecondsToClock(sSeconds) local nSeconds = tonumber(sSeconds) if nSeconds == 0 then return "00:00:00"; else nHours = string.format("%02.f", math.floor(nSeconds/3600)); nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); return nHours..":"..nMins..":"..nSecs end end function main() -- prepare a global counter if (_count == nil) then refreshUI("Start at "..os.date()); fibaro:setGlobal("MLWatchDog", os.time()); _count = 0; else _count = _count + 1; local elapsed = os.difftime(os.time(), tonumber(fibaro:getGlobalValue("MLWatchDog"))); local msg = "Loop #".._count.." since "..SecondsToClock(elapsed); refreshUI(msg); end fibaro:sleep(57000); end local status, err = pcall(main); if (not status) then fibaro:debug('error raised ' .. tostring(err or "unknown")); end Mise en place identique que la version pour la version 2, il faut aussi modifier le script avec votre clé thingspeak Version 2 - Thingspeak -- Copyright © 2013 Jean-christophe Vermandé ------------------------------------------------------------------------------------------- -- Main process ------------------------------------------------------------------------------------------- selfId = fibaro:getSelfId(); function refreshUI(s) fibaro:log(s); fibaro:call(selfId, "setProperty", "ui.lblDebug.value", s); fibaro:debug(s); end function SecondsToClock(sSeconds) local nSeconds = tonumber(sSeconds) if nSeconds == 0 then return "00:00:00"; else nHours = string.format("%02.f", math.floor(nSeconds/3600)); nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); return nHours..":"..nMins..":"..nSecs end end function pushThingSpeak(v) local ts = Net.FHttp("api.thingspeak.com"); local response, status, errorCode = ts:POST("/update", tostring("key=FCUXXXXXXXXXXXX&field1="..v)); -- ici c'est vite fait ! il manque la vérification de la reponse mais bon ... end function main() -- prepare a global counter if (_count == nil) then refreshUI("Start at "..os.date()); fibaro:setGlobal("MLWatchDog2", os.time()); _count = 0; else _count = _count + 1; local elapsed = os.difftime(os.time(), tonumber(fibaro:getGlobalValue("MLWatchDog2"))); local msg = "Loop #".._count.." since "..SecondsToClock(elapsed); refreshUI(msg); end pushThingSpeak(_count); fibaro:sleep(57000); end local status, err = pcall(main); if (not status) then fibaro:debug('error raised ' .. tostring(err or "unknown")); end C'est plutôt stable chez moi ... Et chez vous ?
- 8 réponses
-
- Main Loop
- Thingspeak
-
(et 2 en plus)
Étiqueté avec :
-
Bonsoir i-magin, c'est vraiment étrange , je ne pense pas de rapport direct avec la changement de polling. Je connais le blocage au niveau de la remontée des informations pour les "settingsinfo", mais c'est aléatoire donc difficile à isoler . Peux-tu me dire sur quel système d'exploitation le Toolkit est installé ? si le problème arrive en local ou en externe ou les deux ? Lorsque le toolkit bloque sur settingsinfo (c'est toujours lui...) peux-tu faire un get "Weather", en générale cela débloque le reste ... Merci pour ton retour d'information cela m'aidera
- 478 réponses
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
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é
-
i-magin, pour résoudre ton problème il faut ajouter cela ton ton code if (response~= nil) then local result = json.decode(response) ; if (result ~= nil) then -- place ton code ici result.body .... else fibaro:debug("le script netatmo est inaccessible!"); end end Au moins il n'y aura pas d'erreur...
-
Voila j'ai fait un script watchdog afin de surveiller le Mainloop, cela tourne depuis 2h00 du matin donc depuis plus de 10H et tout va bien ;-) je croise les doigts ! Refresh tous les 10 secondes. Je posterais le code si cela intéresse quelqu'un ? Il y aura une version local et une avec envoi vers thingspeak pour historiser tout cela...
-
Après lecture de la réponse de domotique-store, c'est très sensé et même très intéressant, en revanche ce n'est plus la même chose ! entre ajouter un thermostat ou ajouter un délesteur sur l'installation l'investissement n'est pas le même . Pour les Danfoss elle ne ferme jamais (en tout cas chez moi), il y a toujours un passage d'eau même infime. Hâte de connaitre la fin de l'histoire.
-
J’éviterais les soucis supplémentaire en remplaçant avantageusement le 4-1 par une simple sonde Dallas DS18B20 sur un Door sensor ou bien un FGBS. Les valeurs seront bien plus fidèles . Après, rien ne remplacera un vrai thermostat digne de ce nom que je cherche toujours en z-wave (nous en parlions il y a peu avec Domodial)... Mais la solution par sonde te permettra déjà de belles économies . Pour les contacts secs, c'est bien je pense. Pour la relève de température, il n'y a pas de mystère avec une système à eau chaude comme celui-la, il faut placer le thermostat ou la sonde dans la zone la plus froide, autre solution mettre plusieurs sondes dans les zones les plus froides (je ne relève que les valeurs des chambres, poele pellet dans le séjour oblige) puis un script pour gérer tout cela dans le HC2 ou par le panneau thermostat.
-
C'est très bien une régulation PID mais si tu veux faire des économies il te faut impérativement une mesure de comparaison et un thermostat pour enclencher ou pas ta chaudière ! Je comprends mieux maintenant ta consommation de gaz . Surtout que les vannes Danfoss ne sont jamais totalement fermées de part leurs conceptions, donc ton circuit est toujours en circulation, plus certainement des déperditions sur les longueurs de tuyaux ! A moins que dans ton installation il y ai un ballon tampon de grosse capacité . Ma chaudière gaz à l'enclenchement monte dans les 40° à 60° en phase de montée en température avec des cycles + ou - courts pendant une petite heure selon la température de consigne (parfois 70° si très froid) et le reste du temps la température est maintenue entre 20° et 40° : et sur la facture cela fait une énorme différence . 18° la nuit / 19° dans les chambre et 21° dans les pièces de vie le jour.
-
Suite à un besoin particulier je voulais m'assurer de la taille maximale d'une variable globale afin de persister des informations de type chaînes de caractères si vous souhaitez faire l’expérience vous même, il faut créer une variable globale, ici: varMaxLength, puis dans un périphérique virtuel ajouter le code suivant dans un bouton for i=1, 250 do fibaro:setGlobal("varMaxLength", fibaro:getGlobalValue("varMaxLength").."0"); fibaro:debug("global variable length is now "..string.len(fibaro:getGlobalValue("varMaxLength"))); end pour remettre la variable à zero, dans un autre bouton le code suivante: fibaro:setGlobal("varMaxLength", ""); 228 est donc la taille maximale d'une chaîne dans une variable globale
-
Je suis étonné de ton installation Yohan, il y a bien un contact sec sur ta chaudière pour demander la chauffe ou elle tourne non stop ?
-
@clarkkent609, je plussoie cette demande et puis pourquoi cela ne serait pas noël toue l'année .
-
C'est tout àfait ça: si la ligne est de mauvaise qualité et il y a un Max de raisons àcela alors le résultat sera toujours mauvais ! Lors de l'achat de notre maison j'avais une ligne pas terrible àcause d'une câble aérien visiblement étiré : orange n'a rien entendu àpar vouloir me facturer deux types + une nacelle pour déplacer l'attache du câble. Conclusion il me restait 30m de câble FT, un coup de pince coupante et j'ai changé mon câble au poteau, j'en ai profité pour passer en souterrain et bien étrangement j'ai retrouvé du débit et stop les désynchronisations... Et après bonjour Free ! Bon après ce beau hors sujet :-) je pense aussi que la free est actuellement la meilleur box du marché et rien que pour l'API et bien moi je la garde ! Sauf peut-être le player et son lecteur blu Ray de m..... ;-)
-
Compatible V3-V4 Aeon Labs - Minimote
Krikroff a répondu à un(e) sujet de Moicphil dans Aeon Labs / Aeotec
Je ne savais même pas qu'il y avait une V1 et une V2, pour moi c'était juste une mise àjour du descripteur zwave pour le passage aeon / aeotec pour la conformité du produit, je ne pense pas a une différence matériel :-) a confirmer ! -
La je suis sur mon smartphone donc dure de faire quelque chose de propre mais j'essaie dans la soirée de vous proposer un bout de code pour monitorer le cycle de vie du MainLoop , nous pourrons àplusieurs peut mettre en évidence un problème ou pas ! J'ai plusieurs VD qui tournent sans problème en main loop et pourtant il y a du monde en sockets ;-)
-
J'ai bien l'impression que le main loop est une sorte de fonction dans une boucle while ;-) Pour éviter tout problème et isoler mes process j'utilise des fonctions avec tout déclaré en local dedans et par exemple mon socket déclare lui sans local àl'extérieur de mes fonctions comme cela mon socket est accessible dans toutes les fonctions.
-
Des soucis lors de la mise àjour de mon NRA pour la compatibilité vdsl2 mais depuis c'est ok, et toi des problèmes ?
-
C'est normal parceque si il n'y a pas d'erreur (merci pcall) le MainLoop n'arrête pas son processus, et comme tout ce qui est créé dans le loop vie tout au Long de l'existence du loop ! Alors problème ... Pour résoudre ton problème Shad je ferais ceci: Déclarer mon Fhttp en global et si erreur détectée par le pcall alors libérer la variable et recréer le socket FHttp. Je procède aisini et je n'ai plus de problème :-)