-
Compteur de contenus
6 715 -
Inscription
-
Dernière visite
-
Jours gagnés
124
Tout ce qui a été posté par Krikroff
-
Index des fonctions, Explications des différentes variables...
Krikroff a répondu à un(e) sujet de BenjyNet dans Annonces et suggestions
Attention, je pense que cela doit être précisé: le LUA est un "langage" de script, en gros une surcouche d'un autre langage (souvent du C justement) mais surtout le LUA est en générale utilisé pour donner la possibilité à des utilisateurs d'agir sur le code d'un système hard ou soft... Il y a des concepts généraux à tous les systèmes, des méthodes identiques mais tout n'est pas forcement implémenté, ni forcement implémenté de la même manière. ex: un script LUA pour la Vera ne tournera pas sur le HC2, l'inverse est vrai aussi... Le langage LUA est donc très dépendant de son environnement . En revanche, un tostring ou un tonumber tout comme pcall, assert auront toujours la même fonction ce sont des fonctions de base, par contre getmetatable ou bien load ne sont pas exposés par le HC2 et pourtant ce sont des fonctions aussi de base du LUA. @Benjy, pour main() c'est moi qui utilise cela par réflexes mais il n'y a pas d'obligation, tout comme nous pourrions remplacer main() par toto(). -
Index des fonctions, Explications des différentes variables...
Krikroff a répondu à un(e) sujet de BenjyNet dans Annonces et suggestions
Tout sur une même page ne servira je pense àpas grand chose et ne sera pas trop attrayant -
Index des fonctions, Explications des différentes variables...
Krikroff a répondu à un(e) sujet de BenjyNet dans Annonces et suggestions
Oui c'est certain, il y a de la matière à dire sur tout cela... Après la chose délicate est la manière de traiter l'information Peut-être faire une sous-rubrique dans la partie code lua -> "LUA pour HC2 mode d'emploi" ! Avec un sujet par Fonction ou par Principe abordé. Vous en dites quoi ? Mais il ne faut pas que cela deviennent la foire à tout -
Voici les modifications que j'ai apporté au code de i-magin (publié avec son accord): Edit: mise à jour du code du Main() pour renforcer la prévention des erreurs type T_END, Unknown etc.. --[[ %% autostart %% properties %% globals --]] fibaro:debug("process start"); selfId = fibaro:getSelfId(); local domaine = "www.xxxxxxxxxx.com"; if (temperature_exterieure==nil) then temperature_exterieure = ""; end if (humidite_exterieure==nil) then humidite_exterieure = ""; end if (temperature_interieure==nil) then temperature_interieure = ""; end if (humidite_interieure==nil) then humidite_interieure = ""; end if (co2==nil) then co2 = ""; end if (pression==nil) then pression = ""; end if (bruit==nil) then bruit = ""; end --ne charger en mémoire uniquement que à la premiere execution if(refreshUI==nil) then function refreshUI(temp, hum, press, co2, bruit) fibaro:call(selfId,"setProperty","ui.temperature.value",temp); fibaro:call(selfId,"setProperty","ui.humidite.value",hum); fibaro:call(selfId,"setProperty","ui.pression.value",press); fibaro:call(selfId,"setProperty","ui.co2.value",co2); fibaro:call(selfId,"setProperty","ui.bruit.value",bruit); end; end --ne charger en mémoire uniquement que à la premiere execution if(getExt==nil) then function getExt(retry) retry = retry or 0 -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo extérieur local response = FHTE:GET("/netatmo/netatmo.php?intext=ext"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_exterieure = result.body[1].value[1][1] or "n.c"; humidite_exterieure =result.body[1].value[1][2] or "n.c"; -- variable globale pour info sms local msg = "Température extérieure : "..temperature_exterieure.."°C"; fibaro:setGlobal("tempext", msg); return true; else fibaro:debug("Netatmo EXT: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo EXT: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo EXT:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getInt(tonumber(retry+1)); else return false; end end; end --ne charger en mémoire uniquement que à la premiere execution if(getInt==nil) then function getInt(retry) retry = retry or 0; -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo intérieur local response = FHTE:GET("/netatmo/netatmo.php?intext=int"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_interieure = result.body[1].value[1][1] or "n.c"; humidite_interieure = result.body[1].value[1][3] or "n.c"; co2 = result.body[1].value[1][2] or "n.c"; pression = result.body[1].value[1][4] or "n.c"; bruit = result.body[1].value[1][5] or "n.c"; -- variable globale pour info sms fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C"); return true; else fibaro:debug("Netatmo INT: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo INT: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo INT:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getExt(tonumber(retry+1)); else return false; end end; end local function main() -- demande au service web les informations... local resInt, resExt = false, false; local status, err = pcall(function () resInt = getInt(); end); fibaro:debug("Récupération des données interieurs: " .. tostring(resInt)); if (status == false) then fibaro:debug("err: "..tostring(err or 'n.c')); end local status, err = pcall(function () resExt = getExt(); end); fibaro:debug("Récupération des données extérieurs : " .. tostring(resExt)); if (status == false) then fibaro:debug("err: "..tostring(err or 'n.c')); end -- affichage infos dans module virtuel refreshUI( temperature_interieure.." °C / "..temperature_exterieure.." °C", humidite_interieure.." % / "..humidite_exterieure.." %", pression.." mbar", co2.." ppm", bruit.." dB" ); -- tempo de 30 secondes fibaro:sleep(30*60*1000); end -- lance le script à chaque loop main(); La sortie debug:
-
J'ai un mac mini dans un placard avec XBMC dessus, il faut juste que je le rebranche ce soir... Pour FHttp lorsque tu déclares par exemple un objet objFHttp=Net.FHttp("XX"); , si tu veux détruire la connexion un simple objFHttp=nil; est suffisant pour détruire l'objet donc réinitialiser la connexion avec l’hôte.
-
Je peux te faire un exemple si tu le souhaite pour la librairie: en gros tu mets dans ton main loop en haut les parties: Pour commencer: Toolkit, Toolkit.Debug, Toolkit.Net, Toolkit.Net.HttpRequest puis tu peux utiliser les functions et pseudos objets Tk.assertArg("strArg", strArg, "string"); pour valider qu'un argument est de type chaîne... Tk:trace("value is %d", 35); ou Tk:traceEx("green", "value is %d", 35); pour sortir une trace dans la fenêtre debug à la manière d'un string.format et en couleur stp ! local httpClient = Tk.Net.HttpRequest(HOST, PORT); -> pour faire une requête de n'importe quel type (j'utilise un socket TCP pour cela)... Et beaucoup de choses encore... le code source est documenté. Après il n'y a pas de raison, nous devrions pouvoir faire un simple json.decode et FHttp sans toutes ces galères ! Sinon je suis ok avec toi, cela ne devrait pas prendre beaucoup de temps aux Dev Fibaro pour ajouter un fibaro:refreshMainLoop(); Juste que je ne comprends toujours pas pourquoi tu as besoin de cela, j'ai bien intégré qu' il y a un problème et que le script plante ! Mais l'ajout d'une telle fonction ne réglera pas le problème, juste utile pour le contourné et serait la porte ouverte à faire tourner des scripts non optimisé et/ou avec des bugs! PS: je ne parle pas de ton code (je sais que tu maîtrise l'ami), Ex: J'ai bossé sur le script NetAtmo de i-magin, j'ai debuggé, puis patché, le script est aujourd’hui' hui fonctionnel, même en cas d'erreur le loop n'est pas bloqué, et nous avons mis certainement en évidence le fait que les serveurs NetAtmo ne sont pas opérationnel 24h/24h
-
@biboun, je complétement en accord avec toi ... L'idée était que les utilisateurs rechercheraient plus naturellement "Ping" que "tester un service" . PS: Je ne faisais pas d'allusions à des personnes du forum, mais tu as raison "chieur" est bien un string
- 67 réponses
-
- Script LUA
- FTcpSocket
-
(et 2 en plus)
Étiqueté avec :
-
Bienvenue Michel, nous pourrons échanger aussi ici, chouette
-
Ici l'idée est d'obtenir la réponse d'une IP sur un port, nous sommes toujours sur note réseau local, c'est tout l’intérêt de ce script sur le HC2... Je pense que tout le monde à un firewall correctement paramétré au niveau de son routeur alors pas vraiment de soucis . Toutes les librairies sont présentes sur le HC2 n'oublions pas qu'a la base c'est un serveur , mais Fibaro suite à de gros problèmes avec des scripts d'utilisateurs à décidé d'exposer uniquement quelques méthodes avec une surcouche logiciel Fibaro , moi ça me saoul mais en même temps j'imagine le support Fibaro avec des gens qui pètent un câble pour une box HS par un script et faire comprendre les choses alors que l'utilisateur ne fait pas la différence entre un "string" et un "number".... je peux comprendre @tonio50: super heureux que cela marche pour toi maintenant, cool
- 67 réponses
-
- Script LUA
- FTcpSocket
-
(et 2 en plus)
Étiqueté avec :
-
je pense que tu devrais faire une double vérification comme cela if (t ~= nil) then if (t.result~= nil ) then -- todo end else -- todo end autre solution, très important à savoir, il est possible de forcer "inline" la valeur d'une variable comme ceci: local myStringVar = pExtValue or ""; ici, si pExtValue est null alors automatiquement lua utilisera "" à la place . une valeur par defaut quoi ... Si tu veux, tu peux essayer ma librairie lua ici http://forum.fibaro.com/viewtopic.php?t=3207 (il faut d’ailleurs que j' ajoute un tuto ici) pour faire des requêtes avancées... Courage
-
Il y a bien un port ouvert sur tes ordinateurs non ? local _devicePort = 19;
- 67 réponses
-
- Script LUA
- FTcpSocket
-
(et 2 en plus)
Étiqueté avec :
-
Mon Main Loop tourne depuis 46 Heures 25 minutes avec 2785 boucles... Pas de coupures, pas de resets
- 8 réponses
-
- Main Loop
- Thingspeak
-
(et 2 en plus)
Étiqueté avec :
-
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
-
Actualité Un nouveau capteur Fibaro arrive !!
Krikroff a répondu à un(e) sujet de aliasing dans Le bistrot
Bonsoir Yohan, je pense qu'il est important de te signaler que le ST814 bien qu'un très bon produit (que j'utilise ) manque de précision et parfois a des comportements étranges genre la température qui ne change pas pendant 3h et tout d'un coup elle change de 2°C ! Si tu souhaites investir dans ce produit qui est aussi intéressant du faire du capteur d'humidité intégré je te conseille de les installer au départ tous dans la même pièce et de faire un relevé de température parce que moi ils sont repartis 2 fois à la boutique tellement il y avait des écarts d'un ST à l'autre. Et je ne suis pas le seul . Tu peux te faire une idée sur le blog de Pascal il y a un article "Comparatif des sondes de température" . Si financièrement c'est pas un problème pour toi je regarderais du côté de Secure, vrai thermostat avec régulation PID etc. etc. en revanche les multis fonctions je ne suis pas convaincu, nous verrons avec le Fibaro mais je pars avec des aprioris. Dans tous les cas les ST814 trouveront toujours une autre utilisation plus tard si tu changes -
Annonce Code Lua - Thème Fibaro Inside !
Krikroff a répondu à un(e) sujet de BenjyNet dans Annonces et suggestions
Super merci àvous deux -
Oui, je pense que nous sommes tous bien d'accord avec cela ;-), c'est bien pour cela que j'utilise un script sur mon serveur perso pour faire du Ping sur mes équipements distants. Juste qu'il n'y a pas de fonction pour faire cela sur le HC2 et que les librairies nécessaires sont bloquées par Fibaro pour des raisons de sécurité donc... Après il n'y a pas non plus beaucoup d'équipement réseau sans ip et sans port !! Mais c'est un abus de la langage effectivement ;-)
- 67 réponses
-
- 1
-
- Script LUA
- FTcpSocket
-
(et 2 en plus)
Étiqueté avec :
-
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 ;-)
-
Compatible V3-V4 Aeon Labs - Minimote
Krikroff a répondu à un(e) sujet de Moicphil dans Aeon Labs / Aeotec
Fantastique !!! -
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
-
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)
-
Cela devrait fonctionner . Essaies tu de faire du ping sur une ip distante ou un ordinateur du même réseau que ton HC2 ? Quand je parle de réseau c'est àdire est-ce tes ordi et ton HC2 ont tous une adresse qui commence pareil ex. 192.168.xxx.xxx ?
- 67 réponses
-
- Script LUA
- FTcpSocket
-
(et 2 en plus)
Étiqueté avec :
-
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 :