Fredric Posté(e) le 4 mars 2015 Signaler Posté(e) le 4 mars 2015 j'ai un petit soucis surement tout bête mais je ne trouve pas mon bonheur. j'arrive sans problème à faire changer les icônes d'un vd selon sont état mais je n'arrive pas à donner un delta pour le changement de l'eco-device. par exemple, changer l'icone si la valeur de la variable "CONSO" est entre 2000 et 3000. if tonumber(fibaro:getGlobalValue("CONSO")) <= tonumber("1000") then fibaro:call(440, "setProperty", "currentIcon", 1089) merci de votre aide
Fredric Posté(e) le 4 mars 2015 Auteur Signaler Posté(e) le 4 mars 2015 (modifié) bon, je progresse... local Watts = fibaro:getGlobalValue("CONSO") Watts = Watts/1000 fibaro:debug(Watts) if Watts <= 1 then fibaro:call(228, "setProperty","currentIcon", 1118) elseif Watts > 1 then fibaro:call(228, "setProperty", "currentIcon", 1119) elseif Watts >= 2 then fibaro:call(228, "setProperty", "currentIcon", 1119) elseif Watts >= 3 then fibaro:call(228, "setProperty", "currentIcon", 1120) elseif Watts >= 4 then fibaro:call(228, "setProperty", "currentIcon", 1120) elseif Watts >= 5 then fibaro:call(228, "setProperty", "currentIcon", 1121) elseif Watts >= 6 then fibaro:call(228, "setProperty", "currentIcon", 1122) elseif Watts >= 7 then fibaro:call(228, "setProperty", "currentIcon", 1122) elseif Watts >= 8 then fibaro:call(228, "setProperty", "currentIcon", 1122) elseif Watts >= 9 then fibaro:call(228, "setProperty", "currentIcon", 1122) elseif Watts >= 10 then fibaro:call(228, "setProperty", "currentIcon", 1122) elseif Watts >= 11 then fibaro:call(228, "setProperty", "currentIcon", 1123) end fibaro:sleep(6*1000) le problème, c'est que cela s’arrête à 1, je vois pourquoi, mais ne trouve pas la solution j'ai fait ça: local Watts = fibaro:getGlobalValue("CONSO") Watts = Watts/1000 fibaro:debug(Watts) if Watts <= 1 then fibaro:call(228, "setProperty","currentIcon", 1118) elseif Watts > 1 then fibaro:call(228, "setProperty", "currentIcon", 1119) end if Watts >= 2 then fibaro:call(228, "setProperty", "currentIcon", 1119) end if Watts >= 3 then fibaro:call(228, "setProperty", "currentIcon", 1120) end if Watts >= 4 then fibaro:call(228, "setProperty", "currentIcon", 1120) end if Watts >= 5 then fibaro:call(228, "setProperty", "currentIcon", 1121) end if Watts >= 6 then fibaro:call(228, "setProperty", "currentIcon", 1122) end if Watts >= 7 then fibaro:call(228, "setProperty", "currentIcon", 1122) end if Watts >= 8 then fibaro:call(228, "setProperty", "currentIcon", 1122) end if Watts >= 9 then fibaro:call(228, "setProperty", "currentIcon", 1122) end if Watts >= 10 then fibaro:call(228, "setProperty", "currentIcon", 1122) end if Watts >= 11 then fibaro:call(228, "setProperty", "currentIcon", 1123) end fibaro:sleep(6*1000) ça fonctionne mais je ne suis pas sur que ce soit très optimisé. Modifié le 4 mars 2015 par Fredric
Lazer Posté(e) le 4 mars 2015 Signaler Posté(e) le 4 mars 2015 Regarde là : http://www.domotique-info.fr/2014/04/home-center-2-ameliorer-laspect-peripheriques-virtuels/ Et plus spécifiquement "la patte de l'expert", où quand Steven a aidé Fredo a optimiser le code
jojo Posté(e) le 4 mars 2015 Signaler Posté(e) le 4 mars 2015 Frédéric, Je ferais ton premier code (avec les elseif), mais en inversant les conditions : en partant du plus grand au plus petit. Logique, si tu as une conso de 8 w, et que ta première condition est > 2 W (elle est donc remplie, et ne va pas plus loin ...) 1
trainkill666 Posté(e) le 5 mars 2015 Signaler Posté(e) le 5 mars 2015 A tester local Watts = fibaro:getGlobalValue("CONSO") local icone = {1118, 1119, 1120, 1120, 1121, 1122, 1122, 1122, 1122, 1122, 1123} Watts = math.floor((Watts - 1) /1000) if Watts == 0 then Watts = 1 elseif Watts > 11 then Watts = 11 end fibaro:debug(Watts) fibaro:debug(icone[Watts]) fibaro:call(228, "setProperty", "currentIcon", icone[Watts]) fibaro:sleep(6*1000) 3
jojo Posté(e) le 5 mars 2015 Signaler Posté(e) le 5 mars 2015 belle idée trainkill666, je remplacerais le n° du VD (228) par la fonction fibaro:getSelfId(), ce qui permet de rendre le VD plus portable encore
Lazer Posté(e) le 5 mars 2015 Signaler Posté(e) le 5 mars 2015 Bravo trainkill666, c'est ce vers quoi je voulais emmener Fredric, mais je n'avais pas pris le temps d'écrire les quelques lignes de code. Le tableau est la meilleure méthode àemployer plutôt que tous ces "if" disgracieux.
Fredric Posté(e) le 6 mars 2015 Auteur Signaler Posté(e) le 6 mars 2015 C'est vrai que c'est plus propre, depuis que @Shad m'a fait mon premier code en tableau il y a plus d'un ans, je l'utilise souvent, mais je n'est pas pensé àl'utiliser dans ce cas. Par contre,@trainkill666, la fonction "math.floor", je croyais connaître sa fonction, mais là, je ne comprends pas bien son interét par rapport a Watts == Watts/1000 Peut-tu m'expliquer?
jojo Posté(e) le 6 mars 2015 Signaler Posté(e) le 6 mars 2015 c'est juste pour faire l'arrondi, car 2147 / 1000 = 2.147, et tu veux voir 2
trainkill666 Posté(e) le 6 mars 2015 Signaler Posté(e) le 6 mars 2015 JoJo a répondu à ta question Pour être plus précis, j'ai d'abord simplifié au maximum tes encadrements de valeurs pour arriver à ça : Si <= 1 alors 1118 Si < 3 alors 1119 Si < 5 alors 1120 Si < 6 alors 1121 Si < 11 alors 1122 sinon 1123 Pour que la valeur "Watts" tombe juste avec le tableau il faut arrondir avec math.floor ou math.ceil. J'ai choisi math.floor pour l'arrondi inférieur après quelques tests ET (Watts - 1) car < et pas =< . Pour le <= 1 , math.floor renvoie 0, or la valeur mini de tableau est 1 d'où if Watts == 0 then Watts = 1 et pour le = de <= 1 math.floor, le problème est également contourné par ce if. J'ai ensuite créé le tableau pour les encadrements (toujours en testant, car ce n'est pas évident). Il ne manque plus que elseif Watts > 11 then Watts = 11 Pour l'encadrement maximum du tableau. J'espère avoir été simple dans la méthodologie employée. Je suis gaucher jusqu'au bout et mon raisonnement et souvent curieux, tout tourne à l'envers. 1
Fredric Posté(e) le 6 mars 2015 Auteur Signaler Posté(e) le 6 mars 2015 Merci @trainkill666 , j'aime bien comprendre les cheminements et aller au plus simple. je vais effectivement rajouter la fonction fibaro:getSelfId(). mon code fonctionne parfaitement mais je vais quand même utiliser le tiens qui est bien plus beau.
Messages recommandés