-
Compteur de contenus
6 719 -
Inscription
-
Dernière visite
-
Jours gagnés
128
Tout ce qui a été posté par Krikroff
-
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
-
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é ?
-
Juste une question: que se passe-t-il si tu fais un ping de sur l'adresse du PC depuis cmd.exe: ouvre une fenêtre de commande puis ping xxx.xxx.xxx.xxx
- 67 réponses
-
- Script LUA
- FTcpSocket
-
(et 2 en plus)
Étiqueté avec :
-
Il peut arriver lorsqu'un script dépend d'un traitement extérieur comme par exemple l'appel d'un service web qui retourne un json, que le script ne s’exécute pas correctement jusqu'au bout, les raisons peuvent être multiples: timeout, service indisponible etc. C'est pourquoi il peut être utile dans certaines conditions de relancer l’exécution du script jusqu’à obtention du résultat attendu. Voici comment faire: -- Copyright © 2013 Jean-christophe Vermandé local _selfId = fibaro:getSelfId(); -- update Public IP label httpClient = Net.FHttp("checkip.dyndns.com"); -- recursive function to ping device function checkIP(retry) retry = retry or 0; -- call domaine to check response, status, errorCode = httpClient:GET("/"); -- check for error if errorCode == 0 then -- Internet connection is alive :-) fibaro:setGlobal("NetworkStatus", 1); if tonumber(status) == 200 then local ip = response:match("(%d%d?%d?.%d%d?%d?.%d%d?%d?.%d%d?%d?)"); fibaro:call(_selfId, "setProperty", "ui.lblPublicIP.value", ip); else fibaro:call(_selfId, "setProperty", "ui.lblPublicIP.value", "Error!"); end else if retry < 5 then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(1000); return checkIP(tonumber(retry+1)); end -- Internet seems down, check connection... fibaro:setGlobal("NetworkStatus", 0); fibaro:call(_selfId, "setProperty", "ui.PublicIPLabel.value", "Unknown"); -- send mail fibaro:call(2, "sendEmail", "Check Network Status failed !", "Unable to check network status, error code is "..errorCode.. ", response is ["..response.."]"); end end -- execution de la fonction checkIP(); -- clean memory, destroy object httpClient = nil; Ce code interroge le service checkip.dyndns.com pour vérifier l'adresse IP, si le service est en erreur ou bien un problème avec FHttp, alors le script est relancé une nouvelle fois. Si au bout d'un maximum de 5 tentatives il y a toujours une erreur alors un mail est envoyé. La fonction récursive peut être dans d'autres cas: algorithme, calcul etc.
-
- Script lua
- fonction récursive
-
(et 1 en plus)
Étiqueté avec :
-
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 !
