trainkill666 Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 Pour la mise à jour, remettre les commentaires, voir optimiser le code, je rends la main à neliger, c'est son tuto, je ne suis qu'un intervenant, tout comme vous. Sans lui je serais incapable de lister les modules du HC2 par json. Par contre, un chti " j'aime " sur mon post serait sympathique (je n'ai pas de dimmer). 2
neliger Posté(e) le 30 mars 2015 Auteur Signaler Posté(e) le 30 mars 2015 Je ne met pas à jour tant que je ne comprend pas. Précisément, je ne vois pas pourquoi type(v.properties.value) peut retourner string pour un dimmer alors que d'après mes tests c'était un numérique. D'ailleurs une comparaison avec une chaine retournait une erreur de type.
trainkill666 Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 Au fait pour contourner le déclenchement du modules dimmer ou on/off non utilisés pour l'éclairage, j'ai rajouté une condition au code : if fibaro:getName(v.id):find("Eclairage") then Car tous mes modules éclairages comporte ce terme dans le nom. La récupération du "Name" peut se faire en json, mais làje passe mon tour.
neliger Posté(e) le 30 mars 2015 Auteur Signaler Posté(e) le 30 mars 2015 @trankill666 : pour cette modif là je ne l'ajouterais pas dans le module car cela dépend du nom des modules chez les utilisateurs, donc pas assez portable. Le isLight n'était pas correct pour toi ?
pepite Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 ben oui, ton type n'est pas isLight trainkill ?
mprinfo Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 @trainkill666 un mamque d affection ou c'est la v4 qui te déprime ☺ c'est vrai que ca fais toujours plaisir J'ai pas testé ton code car j'avais donner accès a ma box a neliger donc je ne touche pas au VD au cas ou il a besoin de refaire un test Envoyé de mon SM-G900F en utilisant Tapatalk
trainkill666 Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 Malheureusement , j'ai plusieurs bugs depuis la 4.40 (comme je l'ai dit précedemment ), et la propriété isLight a disparu de tous mes modules, ainsi que leur affichage dans la section éclairage de l'appli android. Le recovery s'approche à grand pas. J'utilise cette solution provisoire en attendant. @mprinfo oui ça fait plaisir. Comme je t'avais dit dans le mp, après une bonne réinstalle, je pense que tout va tourner nickel. J'attends juste un jour ou Madame n'est pas là . Grâce à neliger, je suis en train de me faire un chti code qui va restaurer automatiquement les ID des modules de toutes la maison (éclairage, chauffage, VMC, alarme, vidéo, modules virtuels,chauffe eau, ID appli android ...) dans les scènes, après la réinstallation. Il y aura moins de risque d'erreur, et surtout, je vais gagner beaucoup de temps à la remise en route.
neliger Posté(e) le 30 mars 2015 Auteur Signaler Posté(e) le 30 mars 2015 Ok, je comprend mieux. Pour le code distribué à tous, on va rester sur le pré-requis que la box ne soit pas boguée ^^ @mprinfo : si tu le veux bien je me reconnecterais à ta box ce soir, il faut que je comprenne ce problème de typage de la valeur de dimmer.
mprinfo Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 Pas de soucis Envoyé de mon SM-G900F en utilisant Tapatalk
pepite Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 @trainkill : il va falloir partager ce petit code ;-) Sinon sache que @steven en a fait un qui permet de tous les récuperer aussi mais ce n'est pe pas le meme genre ;-) Jette un oeil : c'est generateur d'IDS http://www.domotique-fibaro.fr/index.php/topic/3477-g%C3%A9n%C3%A9rateur-did-pour-gea-ou-autre-script/page-2?hl=generateur#entry52747
trainkill666 Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 @pepite Merci, justement je cherchais le liens sur le forum pour y trouver des idées.
mprinfo Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 @trainkill666 si tu fais un recovery pourrais tu nous dire les versions encore en ligne chez fibaro Merci Envoyé de mon SM-G900F en utilisant Tapatalk
trainkill666 Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 @mprinfo Ok, je pense faire la manip fin de semaine, s'il n'y a pas d'imprévu, voire lundi ou mardi de la semaine prochaine, je suis en congés.
mprinfo Posté(e) le 30 mars 2015 Signaler Posté(e) le 30 mars 2015 Oui c'est assez long comme manip si tu repasses en v4 soyons fou lol inclus tes modules en v4 ca sera plus propre au niveau des ID bon courage Envoyé de mon SM-G900F en utilisant Tapatalk
Gazous Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 Bonsoir, je viens de tester ce VD qui fonctionne bien mais dans mon cas, j'ai un certain nombre de devices qui ne pilotent pas de lumières donc qu'il faudrait pouvoir les exclure. J'ai donc de mon côté mis en place un tableau contenant les ID des modules à exclure du traitement. Voici le code que je propose pour cela. Pour le bouton -- Récupération de la liste des modules local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local json = json.decode(reponse) -- Modules à exclure et fonction du traitement (pas raccordés à des lumières) local idsToExclude = {10,36,38,39,41,44,56,59,61,72} function arrayContains(array, val) for k,v in pairs(array) do if (v == val) 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 arrayContains(idsToExclude, v.id) 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 Pour la Mainloop ----------------------------------------------------------- -- Toutes lumières v1.2 ----------------------------------------------------------- -- Extinction de l'ensemble des lumières de la maison ----------------------------------------------------------- -- Changelog -- 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 local IconeAllume = 1030 local IconeEteint = 1031 -- Intervalle de mise à jour automatique (en secondes) local IntervalleMAJ = 10 while true do -- Variable du compteur local compteurLumieres = 0 -- Modules à exclure et fonction du traitement (pas raccordés à des lumières) local idsToExclude = {10,36,38,39,41,44,56,59,61,72} function arrayContains(array, val) for k,v in pairs(array) do if (v == val) then return true end end return false end -- Récupération de la liste des modules local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local json = json.decode(reponse) -- 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 arrayContains(idsToExclude, v.id) 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) else fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint) end -- Attente de la prochaine mise à jour automatique fibaro:sleep(IntervalleMAJ*1000) end Ca fonctionne bien chez moi. Sinon ça me coupait des alimentations de volets roulant, mon caisson de basses etc... 3
trainkill666 Posté(e) le 31 mars 2015 Signaler Posté(e) le 31 mars 2015 (modifié) @ Gazous bonne idée Voici une version sans connaître les IDs des modules àexclure, et en plaçant simplement les noms dans la listeexclusion comme dans l'exemple ci-dessous. Version toujours non testée car j'ai toujours les bug de la v4.040. --code retiré car très peu de modifications par rapport àcelui de 20H14. --seul l'encodage et le desencodage par json de la liste sauvegardée en variable globale diffère. Modifié le 8 avril 2015 par trainkill666 1
mprinfo Posté(e) le 1 avril 2015 Signaler Posté(e) le 1 avril 2015 @trainkiller et @Gazous super boulot Avec ses 2 scripts j'ai 2 exemple pour essayer de comprendre fonction return et les tables pour le moment j'arrive avec une table simple
Gazous Posté(e) le 1 avril 2015 Signaler Posté(e) le 1 avril 2015 Désolé si ça pollue un peu le sujet mais j'ai pensé à une approche un peu plus générique pour les exclusion. En effet, elle offre la possibilité au choix de saisir soit l'id d'un module à exclure, soit un mot clé contenu dans le nom du module. Cela offre un peu plus de souplesse. Dans mon cas, j'ai un certains nombres de FGS dont les nom sont "Volet Salon", "Volet SAM" etc... Il me suffit simplement de saisir le mot "Volet" dans la liste d'exclusion et le tour est joué. Voici le code Bouton -- Récupération de la liste des modules local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local 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 local toExclude = {72, "Caisson", "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 Mainloop ----------------------------------------------------------- -- 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 local IconeAllume = 1030 local IconeEteint = 1031 -- Intervalle de mise à jour automatique (en secondes) local IntervalleMAJ = 10 -- 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 local toExclude = {72, "Caisson", "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 while true do -- Variable du compteur local compteurLumieres = 0 -- Récupération de la liste des modules local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local json = json.decode(reponse) -- 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 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) else fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint) end -- Attente de la prochaine mise à jour automatique fibaro:sleep(IntervalleMAJ*1000) end Voilà , espérant que ça puisse servir à d'autres.
trainkill666 Posté(e) le 1 avril 2015 Signaler Posté(e) le 1 avril 2015 @ Gazous fibaro:getName(module.id) peut être remplacé par module.name Je pense que tu ne pollues pas le sujet, je n'ai jamais appris aussi vite en programmation que sur ce forum grâce aux échanges.
neliger Posté(e) le 1 avril 2015 Auteur Signaler Posté(e) le 1 avril 2015 Ce petit truc commence àprendre une tournure plus complète, je pense que je vais plutôt voir pour faire un plug-in complet et plein d'options.
trainkill666 Posté(e) le 1 avril 2015 Signaler Posté(e) le 1 avril 2015 (modifié) Voici le code pensé différemment, au lieu de rechercher de nouveau les ID dans le code du bouton, on récupère la liste créée par le main loop contenant les ID (sans les modules exclus). Toujours le même problème, code fait sans possibilité de Test car Box non opérationnelle grâce à la 4.040 , il peut donc y avoir des "coquilles" empêchant la bonne exécution du code. A vous de tester. Bouton : --récupération des ID --fonction de décodage des variables globales local decodage = function (listeorigine) local liste = json.decode((fibaro:getGlobal(listeorigine))) return liste end --arrêt éclairage local verifeclairage = function(liste) for index,valeur in ipairs(liste) do if tonumber(fibaro:getValue(valeur, "value")) > 0 then fibaro:call(valeur, "turnOff") end end end ----------------------------------------------------------------------------- --récupération des IDS des modules à éteindre local listeclairage = decodage("listeclairage") --éteint les modules verifeclairage(listeclairage) Main Loop : -- Identiants des icônes local IconeAllume, IconeEteint = 1030, 1031 -- Intervalle de mise à jour automatique (en secondes) local IntervalleMAJ = 10 --liste d'exclusion contenant ID ou nom local exclusion = {72, "Caisson", "Volet", "Bubendorff", "Tests"} --test si le module est dans la liste d'exclusion function controlexclusion(idmodule) local retour = true for index, valeur in pairs(exclusion) do if idmodule.name:find(valeur) ~= nil or idmodule.id == valeur then retour = false break end --compare si le nom correspond ou l'id end return retour end -- Boucle sur les modules local recherche = function (liste) -- Liste à sauvegarder pour les id des modules local listeobtenue = {} for k, v in ipairs(liste) do if type(v.properties.isLight) == "string" and type(v.properties.value) == "string" and controlexclusion(v) then if v.properties.value == "true" then table.insert(listeobtenue, v.id) elseif v.properties.value ~= nil and v.properties.value ~="false" then if tonumber(v.properties.value) > 0 then table.insert(listeobtenue, v.id) end end end end return listeobtenue end ----------------------------------------------------------------------------- while true do -- Récupération de la liste des modules local HC2 = Net.FHttp("127.0.0.1", 11111) local reponse = HC2:GET("/api/devices") local resultat = json.decode(reponse) local listeclairage = recherche(resultat) --Sauvegarde pour les id des modules dans une variable globale fibaro:setGlobal("listeclairage",json.encode(listeclairage)) -- Mise à jour de l'icône if #listeclairage > 0 then fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeAllume) else fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", IconeEteint) end -- Attente de la prochaine mise à jour automatique fibaro:sleep(IntervalleMAJ*1000) end Modifié le 8 avril 2015 par trainkill666
Gazous Posté(e) le 1 avril 2015 Signaler Posté(e) le 1 avril 2015 Incroyable j'ai fait des améliorations similaires de mon côté sans consulter ton message J'ai du coup update mon post au dessus. Concernant la liste à stocker en variable globalle, très bonne idée mais ça implique la création d'une variable globale. Est-ce que quelqu'un connaît la taille maximale en nombre de caractères pour une variable globale au fait ? Par contre je vois une petit coquille ligne 46 : listeclairage à remplacer par listeobtenue Sinon je ne suis pas sà»r que json.encode fonctionne tel que tu l'as mis, il faudra passer par une fonction. Ne me demandes pas pourquoi, je se sais pas, mais j'ai déjà eu ce problème...
trainkill666 Posté(e) le 2 avril 2015 Signaler Posté(e) le 2 avril 2015 (modifié) @ Gazous, ils manque plusieurs lignes que j'ai oublié lors du copié collé, merci , je corrige. J'ai fait ça à la va vite entre les travaux. Et oui, j'ai oublié de préciser qu'il faut créer la variable globale "listeclairage". Pour json.encode, je l'utilise depuis quelques jours pour créer automatiquement une recherche de tous les IDs de mon système. Ensuite tout est sauvegardé sur la variable, et ma scène (un système similaire à GEA mais propre à mon utilisation donc beaucoup moins complet) les charge à son démarrage, et tout fonctionne. (Du moins pour le moment, et hormis les bug de la V4.040) Je prends donc des "morceaux" de ce que j'utilise dans les scènes, ce qui explique les risques d'erreurs, ou les oublies lors du copié-collé. Modifié le 2 avril 2015 par trainkill666
mprinfo Posté(e) le 2 avril 2015 Signaler Posté(e) le 2 avril 2015 je confirme que ça fonctionne très bien la sauvegarde de ID en Json dans une variable global j'utilise cela depuis pas mal de temps aucun soucis. Pour la limite de peux pas dire mais j'avais vu sur un poste que l'on peut y aller sans soucis il me semble que j'avais vu plus de 800 caractère c' était toujours OK @Gazous par contre si tu connais la commande lua pour crée une variable globale sans avoir a passer par l'interface je suis preneur, Enfin si on peut
pepite Posté(e) le 2 avril 2015 Signaler Posté(e) le 2 avril 2015 @mrpinfo : on ne peut pas je crois et pour les caracteres dans une VG, steven a teste avec 42 000 environ, ca a fonctionne mais a mis 2h30 pour écrire dans la variable Lsiteeclaireage ou listeobtenue alors ?
Messages recommandés