Aller au contenu
jojo

Afficher Les Valeurs D'une Variable Dans Un Vd Sour Hc2

Recommended Posts

Pour la HCL, j'avais en son temps fait un tuto pour afficher une icône dans un virtual device une icône en fonction de la valeur d'une variable globale, et de pouvoir modifier sa valeur (également depuis son smartphone), quelle se mette à  jour lors d'un restart de la box, etc pour une HCL

 

En passant sous HC2, j'avais gardé le même principe, et pour chaque VD (et donc chaque variable), la main loop tournait en continu pour vérifier que l'icône correspond bien à  la valeur de la variable. Ce n'est vraiment pas optimal. Je vais vous expliquer ici la solution que j'ai mise en place pour que la charge sur la box soit moins importante.

 

Merci à  Steven, i-magin et mprinfo qui m'ont aidé pour débugger

 

Création des variables

Je prendrai dans mon exemple 2 variables globales :

  1. Auth_PS3 avec 2 valeurs possibles : "Autorisé" et "Interdit"
  2. Auth_TV avec 2 valeurs possibles : "Autorisé" et "Interdit" (mais les valeurs pourraient être différentes que pour la 1° variable, ou avoir plus que 2 valeurs)

 

Modules virtuels

Chaque variable a son module virtuel.

Il a pour objectif d'afficher une icône différente en fonction de la valeur de la variable.

Pour facilement les retrouver, j'ai créé une section "Section Virtuelle" et dedans une pièce "Variables".

Chaque VD a le nom suivant : "Var_xxxx" où xxxx est le nom de la variable globale.

Dans notre exemple : "Var_Auth_PS3" et "Var_Auth_TV".

post-1320-0-30132700-1426852983_thumb.png

L'icône par défaut du VD est et doit rester l'horrible cube bleu (facile ainsi de repérer si la VD est à  jour)

post-1320-0-94228200-1426852985_thumb.png

J'ai créé les boutons suivants :

post-1320-0-03411500-1426852988_thumb.png

Bouton 1 : Autorisé / Interdit

Il permet simplement de faire le switch de la valeur de la variable.

C'est le bouton par défaut du VD.

Il n'y a pas d'icône associée.

post-1320-0-71925800-1426852989_thumb.png

-- nom de la variable à  modifier
local variable = "Auth_PS3"

if fibaro:getGlobal(variable) == "Interdit"
  then
    fibaro:call(fibaro:getSelfId(), "pressButton", "3")
  else
    fibaro:call(fibaro:getSelfId(), "pressButton", "4")
end  

Label : Statut

afficher en texte la valeur de la variable

post-1320-0-19821900-1426852992_thumb.png

Bouton3 : Autorisé

c'est le bouton qui est appelé pour mettre la variable à  "Autorisé"

Il contient l'icône qu'on veut voir affichée (comme ça on ne doit pas chercher son ID)

post-1320-0-15850800-1426853079_thumb.png

fibaro:setGlobal('Auth_PS3', 'Autorisé')
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Statut.value", 'Autorisé') 

Bouton4 : Interdit

c'est le bouton qui est appelé pour mettre la variable à  "Interdit"

Il contient l'icône qu'on veut voir affichée (comme ça on ne doit pas chercher son ID)

post-1320-0-36956000-1426854235_thumb.png

fibaro:setGlobal('Auth_PS3', 'Interdit')
fibaro:call(fibaro:getSelfId(), "setProperty", "ui.Statut.value", 'Interdit') 

N.B. l'ID de ce bouton ne peut pas être appelée par le bouton Switch, mais seulement son numéro QUI CHANGE si vous changez l'ordre. C'est débile, mais c'est comme ça …

 

Utilisation

  1. On clique sur le bouton principal, et il switch la valeur de la variable
  2. On peut utiliser Google Calendar pour lui dire d'appuyer directement sur le bouton "Autorisé" ou "Interdit"
  3. Vous devez modifier les scènes qui modifiaient directement la variable, en la faisant appuyer sur le bouton de la VD qui modifie la variable et met à  jour l'icône de la VD (car il n'y a plus le mainloop qui contrôle en continu la valeur de la variable)

 

Limitations et solution :

Lors du redémarage de la box, ou

Lors de la sauvegarde du VD (parce que vous avez fait une petite modif, ou …)

 

L'icône qui est affichée pour le VD, est l'icône par défaut du VD. Le cube bleu, pas cool …

 

Donc pour pallier à  ce problème, j'ai créé un VD supplémentaire

"Var_Update"

 

Dont voici le code : un GRAND merci à  mprinfo qui m'a beaucoup aider pour faire qqch de plus sympa et générique

----------------------------------
-- User Settings
----------------------------------
-- la Table doit avoir la structure suivante :
--     1/ nom de la variable globale entre "
--     2/ ID du VD qui affiche la valeur de la VG
--     3/ n° du premier bouton qui doit être appuyé 
--        (qui correspond à  la première valeur de la variable)
--     4/ n° du dernier bouton qui doit être appuyé
--        (qui correspond à  la dernière valeur de la variable
--         on suppose que tous les boutons se suivent de 1 en 1)
--     5/ valeurs possibles de la variable entre "
--        (elles doivent être listées dans l'ordre des boutons de la VD)

local Table = {"Auth_PS3", 23, 3, 4, "Autorisé", "Interdit",
               "Auth_TV", 289, 3, 4, "Autorisé", "Interdit",
               "Auth_VMCEtage", 290, 3, 4, "Autorisé", "Interdit",
               "Auth_TerrPar", 291, 3, 4, "Autorisé", "Interdit",
               "Auth_LumHallNuit", 362, 3, 4, "Autorisé", "Interdit",
               "ECS", 292, 3, 4, "Oui", "Non",
               "DayPart", 130, 3, 4, "After SunRise", "After SunSet",
               "Noel", 363, 3, 4, "Oui", "Non",
               "Saison", 133, 3, 6, "Printemps", "Eté", "Automne", "Hiver",
               "Chauffage", 351, 3, 5, "0", "1", "2",
               "Vacances", 293, 3, 4, "Oui", "Non"
              }

----------------------------------
-- DO not change bellow this line
----------------------------------

local i = 1
while Table[i] ~= nil do
   local VG_Nom = tostring(Table[i])
   fibaro:debug("----------------------------")
   fibaro:debug("Nom de la variable Globale = " ..VG_Nom)
   local VD_id = tostring(Table[i+1])
   local Btn_Deb = tonumber(Table[i+2])
   local Btn_Fin = tonumber(Table[i+3])
   local NbrVal = (Btn_Fin - Btn_Deb) + 1 --Nbr de valeur possibles de la variable
   fibaro:debug('NbrVal = ' ..NbrVal)
   i = i + 4
   local VG_Val = fibaro:getGlobalValue(VG_Nom)
   fibaro:debug('Valeur de la variable Globale = ' ..VG_Val)
   for j = 1,NbrVal do
     if VG_Val == Table[i+j-1] then
         fibaro:debug(VG_Nom.. ' = ' ..VG_Val)
         fibaro:debug("Il faut appuyer sur le bouton : " ..Btn_Deb.. " de la VD_id " ..VD_id)
         fibaro:call(VD_id, "pressButton", Btn_Deb)
     end
     Btn_Deb = Btn_Deb + 1
   end  -- for
   i = i + NbrVal
end -- while

Pour retrouver l'ID du VD, vous avez plusieurs solutions :

  1. Le toolkit de Krikroff
  2.  
  3. l'API : http://<IP Box>:<Port Box>/api/virtualDevices 
  4.  
  5. vous exportez le VD, et dans l'URL vous voyez ?id=xxx
  6.  
  7. vous éditez le VD, et dans l'URL vous voyez ?vid=xxx
  8.  

Il vérifie la valeur de la variable et appuie sur le bouton correspondant à  l'icône.

D/Variable.

 

Donc maintenant, quand je vois qu'une des icônes associée à  mes variables est l'icone standard, je clique sur le bouton, et tout est remis au carré. Cela évite d'avoir un main loop qui tourne pour chaque variable 99% du temps pour rien.

 

On a donc trouvé une parade à  la deuxième limitation ;-)

 

Pour la première limitation (mise à  jour après un restart de la box) la solution est facile :

Créer une scène qui appelle la VD "Var_Update" / bouton 1 au démarrage de la box.

post-1320-0-43496300-1426854242_thumb.png

post-1320-0-37245300-1426854245_thumb.png

--[[
%% autostart
--]]

fibaro:sleep (10*1000)
fibaro:call(361, "pressButton", "1") 

où 361 est l'ID du Vd "Var_Update"

Merci à  Steven qui finalement à  trouvé la solution du sleep au début de la scène, ainsi qu'à  i-magin et mprinfo pour leurs bonnes idées

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour être précis, et puisque je suis cité, ce qui marche chez moi, c'est la scène suivante exécutée au démarrage de la box (voir ci-après)

Cette scène permet d'afficher dans un module virtuel, l'icône et le mode de chauffage correspondant à  l'état d'un module Qubino FP, uniquement au démarrage de la box (ou lors de la sauvegarde de la scène)

En marche normale, l'icône et le mode de chauffage sont gérés par les 6 boutons du module virtuel correspondant au 6 ordres possibles du Qubino FP

--[[
%% autostart
%% properties
%% globals
--]]

--
-- Scène exécutée après redémarrage box HC2
--

-- chauffage Salon
local id_qubino_salon = 255
local id_chauffe_salon = 155
local id_icone = {
[99] = 1016,
[50] = 1047,
[40] = 1048,
[30] = 1012,
[20] = 1013,
[0] = 1050,
}
local mod_chauffe = {
[99] = "CONFORT",
[50] = "CONFORT -1",
[40] = "CONFORT -2",
[30] = "ECO",
[20] = "HORS-GEL",
[0] = "ARRET"
}
fibaro:call(id_chauffe_salon, "setProperty", "currentIcon", id_icone[tonumber(fibaro:getValue(id_qubino_salon, "value"))])
fibaro:call(id_chauffe_salon,"setProperty","ui.Label1.value",mod_chauffe[tonumber(fibaro:getValue(id_qubino_salon, "value"))])
fibaro:debug("Redémarrage box : "..os.date())

Je n'ai donc pas testé la procédure de @jojo  ;) ... un peu trop complexe pour moi

Partager ce message


Lien à poster
Partager sur d’autres sites

i-magin,

Merci pour ta précision. Plein d'espoir àla lecture de ton feedback, j'ai collé le code de la VD_Update dans la scène.

Et zut, ça ne fonctionne toujours pas. Je crois avoir compris : on ne pourrait pas faire de pressButton depuis une scène... Je t'este cela ce WE

Partager ce message


Lien à poster
Partager sur d’autres sites

Aucun souci pour exécuter un "pressButton" depuis une scène, et heureusement....

La programmation de mon chauffage tient essentiellement dans une scène qui appelle des boutons de modules virtuels

 

Petit rappel : ne pas oublier de valider l'option "Scène Active" 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans GEA ... une scène .. cela donne cela

 

{"VirtualDevice", <ID_MODULE>, <position du bouton>}

 

donne

 

fibaro:call(<ID_MODULE>, "pressButton", <position du bouton>)

 

Donc oui c'est 100% possible :)

Partager ce message


Lien à poster
Partager sur d’autres sites

donc cela devrait être un problème chez moi uniquement, et tant mieux si ça marche chez vous. Je ferai avec.

Même si "ma" proposition semble complexe (beaucoup de call imbriqués) il me semble qu'elle a l'avantage d'être simple àmaintenir une fois mise en place.

Partager ce message


Lien à poster
Partager sur d’autres sites

je vous le donne en 1000 : la solution au problème de démarrage de la scène avec le redémarrage de la box est venu de qui ?

 

de Steven, bien-sà»r !

 

II fallait juste mettre un sleep de 10s au démarrage de la scène, histoire de laisser le temps à  notre petite box de se réveiller en douceur  :P

Partager ce message


Lien à poster
Partager sur d’autres sites

Coup de chance mais je voyais rien d'autre qui pouvait poser le problème.

Partager ce message


Lien à poster
Partager sur d’autres sites

Super JOJO te reste plus qu'a passer en V4 si madame le veux bien :D

Partager ce message


Lien à poster
Partager sur d’autres sites


local Var_Id = {23, 289, 290, 291}

for i = 1,#Var_Id do

if fibaro:getGlobal(Var_Id) == 'Autorisé' then

fibaro:call(Var_Id, "pressButton", "3")

else

fibaro:call(Var_Id, "pressButton", "4")

end

end

Partager ce message


Lien à poster
Partager sur d’autres sites

oui mprinfo, ce code pourrait fonctionner si mes variables ont toutes les  mêmes valeurs autorisées ("Autorisé" et "Interdit'), mais s'il y a d'autres valeurs ('Oui' ou "Non"), ou plus que 2 valeurs, ça ne marche plus. Il faudra quelque chose de plus générique, surtout si je veux le partager : Disons que toi tu utilises des variables avec comme valeurs permises "Permis" et "Non-Permis" (par exple), il faut que ça marche aussi ...

Partager ce message


Lien à poster
Partager sur d’autres sites

on peut faire un tableau du style suivant :

local Var_Id = {23, autorisé, 3, 4, 289, OUI, 3, 5,}
 

on incrémente i de 4 dans la boucle

 

ID , "autorisé, OUI, etc..., Bouton de départ, bouton Fin

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai oublié les "" il faut mettre "autorisé" et "OUI"

Partager ce message


Lien à poster
Partager sur d’autres sites

merci pour l'idée, c'est une excellente piste d'amélioration, je devrais m'y pencher dessus, mais je DOIS (et ça va être dur ...) essayer de ne plus trop toucher àla domotique jusqu'au 20 avril ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Pauvre Jojo :) à‡a va être dur dur enfin si tu as une petite autorisation je veux bien te donné un coup de main courage il y aura des jours meilleurs.... 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je te rassure, je dois préparer mes vacances de début avril. C'est donc pour la bonne cause ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah ok tiens moi au courant quand tu pourras ? Car j'ai plusieurs solutions mais je voudrais que tu m expliques plus en détails ce que tu veux

Envoyé de mon SM-G900F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

voilà, avec l'aide de mprinfo (MERCI), nous avons modifié le code de la VD "Var_Update" pour qu'il soit générique.

Pour les modif, voir le post initial qui a été adapté

Partager ce message


Lien à poster
Partager sur d’autres sites

merci jojo pour ce tuto ;)  me reste plus cas les intégrer dans mes scenes 

Partager ce message


Lien à poster
Partager sur d’autres sites

je voulais utiliser google calendar pour ma scène vacances seulement j'ai rien compris du tout , c'est pas fait pour moi  :(

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir à vous,

je remonte ce sujet car j'aimerai afficher dans l'étiquette d'un VD, la valeur de consommation d'un FGS223.

Je récupère la valeur via le json, mais je ne sais pas si c'est possible d'afficher la valeur récupérée via l'étiquette, en la renommant par exemple.

A la place de "consommation", je voudrais afficher la valeur récupérée via json.

 

 

 

 

Sans titre.png

Partager ce message


Lien à poster
Partager sur d’autres sites

×