Gazous Posté(e) le 8 avril 2015 Signaler Posté(e) le 8 avril 2015 Le voici avec en bonus le code pour fixer une valeur et en ajouter 2 dans la liste prédéfinie. -- Creation de Variable Gazous json = '{"name":"Gazous", "isEnum":1}' HC2 = Net.FHttp("127.0.0.1", 11111) HC2:POST("/api/globalVariables", json) -- Ajout de 2 valeurs àla Variable Gazous et modification avec une des 2 valeurs json = '{"value":"Gazous1","isEnum":true,"enumValues":["Gazous1", "Gazous2"]}' HC2:PUT("/api/globalVariables/Gazous", json) 2
mprinfo Posté(e) le 8 avril 2015 Signaler Posté(e) le 8 avril 2015 Super merci Gazous je vais testé cela demain Je vais peux être faire un tuto avec ce genre de code si je mets ton mon comme auteur de ce script ca te vas? Envoyé de mon SM-G900F en utilisant Tapatalk
Gazous Posté(e) le 9 avril 2015 Signaler Posté(e) le 9 avril 2015 Je confirme ce qui semblait évident : en basculant tout le code de la MainLoop dans un bouton et en faisant un pressbutton dans la MainLoop, ça ne plante plus. Le souci c'est que durant la durée d'exécution du code du bouton, c'est l'icône du bouton qui s'affichera donc pas forcément très esthétique... Il serait quand même bien de comprendre ce qui génère le blocage dans la MainLoop !
mprinfo Posté(e) le 9 avril 2015 Signaler Posté(e) le 9 avril 2015 Pour une variable globale non prédéfinie -- Creation de Variable Pascal Merci a Gasous pour l'aide json = '{"name":"Pascal", "isEnum":0}'
Sakkhho Posté(e) le 9 avril 2015 Signaler Posté(e) le 9 avril 2015 je suis un peu perdu à vrai dire sur ce module, j'ai le VD de depart, que dois je modifier pour qu'il ne bloque pas ?
Gazous Posté(e) le 9 avril 2015 Signaler Posté(e) le 9 avril 2015 Je te proposes mon code actuel qui tourne très bien Premier button "Tout Eteindre" -- Récupération de la liste des modules HC2 = Net.FHttp("127.0.0.1", 11111) reponse = HC2:GET("/api/devices") json = json.decode(reponse) -- Modules à exclure et fonction de traitement (pas raccordés à des lumières) -- Peut contenir un id ou un mot clés à chercher dans le nom du module toExclude = {72, "Dispo", "Volet", "Bubendorff"} function shouldExclude(module) for k, v in pairs(toExclude) do if string.find(module.name, v) ~= nil or module.id == v then return true end end return false end -- Boucle sur les modules for k, v in ipairs(json) do if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" and not shouldExclude(v) then if v.properties.value == "true" then fibaro:call(v.id, "turnOff") elseif v.properties.value ~= nil and v.properties.value ~="false" then if tonumber(v.properties.value) > 0 then fibaro:call(v.id, "turnOff") end end end end Deuxième bouton "Rafraîchir" ----------------------------------------------------------- -- Toutes lumières v1.3 ----------------------------------------------------------- -- Extinction de l'ensemble des lumières de la maison ----------------------------------------------------------- -- Changelog -- 1.3 : Liste d'exclusion pouvant contenir des id de modules ou des mots clés dans les noms -- 1.2 : Correction du test d'état prenant en charge les -- modules variateurs et rétablissement de la -- condition pour l'exctinction -- 1.1 : Extinction inconditionnelle et prise en charge des -- modules variateurs ----------------------------------------------------------- ------------------------------ -- Variables à renseigner ------------------------------ -- Identiants des icônes IconeAllume = 1030 IconeEteint = 1031 function debug(text, color) color = color or "white" fibaro:debug("<font color='"..color.."'>"..text.."</font>") end -- Modules à exclure et fonction de traitement (pas raccordés à des lumières) -- Peut contenir un id ou un mot clés à chercher dans le nom du module toExclude = {72, "Dispo", "Volet", "Bubendorff"} function shouldExclude(module) for k, v in pairs(toExclude) do if string.find(module.name, v) ~= nil or module.id == v then return true end end return false end function checkLights() -- Variable du compteur compteurLumieres = 0 -- Récupération de la liste des modules HC2 = Net.FHttp("127.0.0.1", 11111) reponse = HC2:GET("/api/devices") jsonResponse = json.decode(reponse) -- Boucle sur les modules for k, v in ipairs(jsonResponse) do if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" and not shouldExclude(v) then if v.properties.value == "true" then compteurLumieres = compteurLumieres + 1 elseif v.properties.value ~= nil and v.properties.value ~="false" then if tonumber(v.properties.value) > 0 then compteurLumieres = compteurLumieres + 1 end end end end -- Mise à jour de l'icône if(compteurLumieres > 0) then fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeAllume) debug(compteurLumieres.." lumière(s) allumée(s)", "green") else fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint) debug("Aucune lumière allumée") end end pcall(checkLights) MainLoop fibaro:call(fibaro:getSelfId(), 'pressButton', '2')
Plap3014 Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Bonsoir, a fonctionne bien le code a @Gazous... @Gazous: tu as mis quoi comme icon a rafraîchir? merci, Patrick
megabubu Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 @Gazous Comment dans le main loop, on met un timing de 10 secondes pour simuler l appuis sur le bouton?
Sakkhho Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Merci pour le code, l'appuie sur le bouton je vais le faire via GEA et pas dans le main loop, ca me parait moins lourd non ?
mprinfo Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 voici un solution que j'utilise dans le main loop d'un vd pour appuyer sur un bouton Attention si on utilise un SLEEP il faut éviter de faire des sleep supérieur a 30 mn (risque de blocage) se script appui sur le bouton toute les Heures a adapter a vos besoin while true do local Var_Heure = os.date("%H:%M") fibaro:debug("heure OS : " ..Var_Heure) if Var_Heure == "00:01" then fibaro:call(fibaro:getSelfId(), "pressButton", "1") end fibaro:sleep(60*1000) end
megabubu Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 @mprinfo en fait, j'avais deja pensé à utiliser ton code, car j'ai deja piqué des VD à toi mais etant pas tres bon, je me suis vite perdu! Avec ton code, comment creer un appui toutes les 10 secondes?
mprinfo Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 c'est trés simple tu n'as pas besoin de osdate() while true do fibaro:call(fibaro:getSelfId(), "pressButton", "1") fibaro:sleep(10*1000) end
megabubu Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Merci, mais pour ma compréhension, avec osdate() , ca donnerais quoi?
mprinfo Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 la tu veux toutes le x seconde ou x minutes avec os.date() on récupére l'heure systéme et on appui sur le bouton au des heures, minutes, secondes bien précise tu trouveras a la fin de ce totu toutes les possibilités de os.date : sunrisehour-sunsethour-osdate
pepite Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Je trouve sympa la solution de Trainkill et plutot simple à gerer Mais si on ne mettait rien dans le mainloop ;-) et que le code du mainloop allait dans le bouton "Mise à jour" Qu'en pensez-vous ? Je viens de tester, ca fonctionne super, et avantage de cette soluce : les eclairages derrieres les WallPlugs sont pris en compte ;-) Attention, il faut que les noms des eclairages respectent la casse ;-) J'ai rajoute dans le bouton d'extinction des eclairages la mise a jour de l'icone ;-)
trainkill666 Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 @ pepite Merci . Le main loop tourne en boucle pour la mise à jour de l'icône d'état (allumé, éteint), il n'y a plus rien d'autre. Pour le bouton d'extinction d'éclairage, il suffit de lui attribuer simplement l'icône identique à celui "iconearret", ça évite de rajouter une ligne de code et de voir apparaître l'icône du cube bleu. Si comme dans mon cas toutes tes modules d'éclairages contiennent un mot clé (éclairage ... par exemple) qui n'est pas présent dans les autres, je peux te donner la version du code j'utilise. Le programme cherche lui-même, pour ne pas à avoir à les rentrer.
Sakkhho Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 perso rien dans la main loop et GEA qui appuies sur le bouton du VD toutes les 5mn GEA.add(true, 5*60, "", {{"VirtualDevice", id["TOUTES_LUMIERES"], 2},{"Repeat"}})
pepite Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 @trainkill : ah oui, pas bete le coup de l'icone, j'ai rajoute du code moi mais c'est beaucoup plus simple ta soluce. Malheureusement pour moi je n'ai pas le terme eclairage pour chaque en fait mais je vais pe modif en les prefixant par une chaine aussi type "Ecl" ou "Lum" ou autres.. Je veux bien le code oui stp, ca gagne du temps quand c'est deja fait ;-) ..oui je sais j'en profite ;-) @sakkho, tout pareil, GEA appuie sur les boutons pour moi, rien dans le mainloop et je vais rajouter la creation d'une variable pour etre averti et faire de la conditions multiples : exemple : Si Mode MAISON= ABSENCE depuis 5 mins : appui bouton RAFRAICHIR ce qui donne une valeur a une variable type VG : lumieres = ON Si Mode MAISON= ABSENCE et LUMIERES = ON alors appui bouton extinction et envoi SMS
trainkill666 Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 @pepite Voici le nouveau bouton "Mise à jour" qui fonctionne par mot clé et ignore les modules virtuels (pour éviter tout risque d'erreur). Il suffit simplement de mettre ton mot clé à la place d' "Eclairage" . Y'a pas plus simple. Puis un ptit clic sur le bouton. -- Le code à été placé en page 5 dans le post du 08 avril 2015 - 14:26 avec l'ensemble du module virtuel.
megabubu Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Je confirme ce qui semblait évident : en basculant tout le code de la MainLoop dans un bouton et en faisant un pressbutton dans la MainLoop, ça ne plante plus. Le souci c'est que durant la durée d'exécution du code du bouton, c'est l'icône du bouton qui s'affichera donc pas forcément très esthétique... Il serait quand même bien de comprendre ce qui génère le blocage dans la MainLoop ! toujours pas trouvé la solution?
mprinfo Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 @gazous Il y a un topic a ce sujet je sais plus ou mais il est préférable de mettre le code dans un bouton il faudrait que tu vois cela avec krikroff ou steven je pense qu'il y a des subtilités pour le main loop Envoyé de mon SM-G900F en utilisant Tapatalk
Gazous Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 En fait, c'est très simple, l'appel à'pressButton" est protégé car il est asynchrone donc tu peux appeler 1000 fois la fonction, si jamais il y a eu un blocage dans les 1000 appels, cela n'aura pas bloqué les suivants puisque c'es la MainLoop qui appelle. En mettant le code dans le bouton, il est probable que le blocage soit toujours là, mais on ne le voit plus. C'est donc une solution de contournement qui ne résout pas le blocage 1
mprinfo Posté(e) le 10 avril 2015 Signaler Posté(e) le 10 avril 2015 Il faudrait donc trouver ce qui bloc et gérer l erreur afin que çàne plante pas je sais que fibaro a mis 3s pour le mainloop car il y avait trop de problèmes Envoyé de mon SM-G900F en utilisant Tapatalk
Messages recommandés