J3R3M 107 Signaler ce message Posté(e) 2 août 2018 (modifié) Bonjour à tous, Les paramètres de mes pièces sont tous triés dans un tableau lui--même stocké dans une Variable Globale. Cette table est organisée de la manière suivante pour chacune des pièces : pieces["SDB"] = { id = 3, Code = "SDB", Nom = "Salle de Bain", Detect = {220,261}, LumMini = 4, HueGroup = 301, HueList = {93}, HueType = {"hcol"}, HuePowerDodo = {5}, -- Une valeur = utilisation groupe HuePowerAM = {100}, HuePowerMidi = {100}, HuePowerPM = {100}, HuePowerSoir = {100}, HuePowerNuit = {100}, SonosId = 244, SonosVMax = {40,50,50,40}, SonosV = {15,25,25,20}, Mise = 0, StartScene = 0 }; Je cherche un moyen simple et rapide de modifier la valeur de la clé "Mise" pour le besoin de certains de mes scénarios. À l'heure actuelle, je j'ai fait de cette manière : local PIECE = "SDB"; local table_pieces = json.decode(fibaro:getGlobalValue("T_INFOS_PIECES")); local INFOS = table_pieces[PIECE]; local table = {}; for k,v in pairs(table_pieces) do if k ~= PIECE then table[k] = v; end end table[PIECE] = { id = INFOS.id, Code = INFOS.Code, Nom = INFOS.Nom, Detect = INFOS.Detect, LumMini = INFOS.LumMini, HueGroup = INFOS.HueGroup, HueList = INFOS.HueList, HueType = INFOS.HueType, HuePowerDodo = INFOS.HuePowerDodo, HuePowerAM = INFOS.HuePowerAM, HuePowerMidi = INFOS.HuePowerMidi, HuePowerPM = INFOS.HuePowerPM, HuePowerSoir = INFOS.HuePowerSoir, HuePowerNuit = INFOS.HuePowerNuit, SonosId = INFOS.SonosId, SonosVMax = INFOS.SonosVMax, SonosV = INFOS.SonosV, Mise = 1, StartScene = INFOS.StartScene }; fibaro:setGlobal("T_INFOS_PIECES", json.encode(table)); Cela a l'air de fonctionner, cependant, cela a pour conséquence de faire beaucoup ralentir la HC2, qui nécessite un redémarrage pour fonctionner de nouveau correctement. Existe-t'il une solution plus simple pour changer uniquement la valeur de cette clé ? Merci d'avance de vos réponses! Modifié 6 août 2018 par J3R3M Partager ce message Lien à poster Partager sur d’autres sites
OJC 133 Signaler ce message Posté(e) 3 août 2018 (modifié) Si le but est uniquement de changer la valeur d'une clé, je ferai comme ça : local PIECE = 'SDB' local VALEUR = 1 local table = json.decode(fibaro.getGlobalValue('T_INFOS_PIECES')) table[PIECE].Mise = VALEUR fibaro:setGlobal('T_INFOS_PIECES',json.encode(table)) En fait, avec ton code, tu ne modifies pas la table, tu en crées une nouvelle ce qui t'oblige à remettre toutes les valeurs dedans. Je ne pense pas, cependant, que ce puisse être la cause d'un ralentissement de la HC2 au point de requérir un redémarrage. C'est surprenant, sauf si ton code s'exécute à une fréquence de quelques secondes, auquel cas il faudrait prévoir même avec le code ci-dessus de ne mettre à jour la table que si la valeur change. Par exemple : local PIECE = 'SDB' local VALEUR = 1 local table = json.decode(fibaro.getGlobalValue('T_INFOS_PIECES')) if table[PIECE] ~= VALEUR then table[PIECE].Mise = VALEUR fibaro:setGlobal('T_INFOS_PIECES',json.encode(table)) end Modifié 3 août 2018 par OJC 2 Partager ce message Lien à poster Partager sur d’autres sites
J3R3M 107 Signaler ce message Posté(e) 6 août 2018 Merci de ta réponse @OJC! Qui plus est très complète! Le script est pourtant lancé manuellement et n'est soumis à aucune tempo, c'est ce qui m'avait interpellé et soulevé mon étonnement. Le but est donc uniquement de changer la valeur d'une table, oui. Malheureusement, j'obtiens cette erreur avec ce code : Citation [DEBUG] 14:25:37: [1;31m2018-08-06 14:25:37.175549 [ fatal] Unknown exception: /opt/fibaro/FibaroSceneAPI.lua:154: Assertion failed: Expected string Sais-tu éventuellement quel peut être le problème ? Partager ce message Lien à poster Partager sur d’autres sites
pepite 1 272 Signaler ce message Posté(e) 6 août 2018 Bonjour, Poste ton code, il attend un "string" ;-), mets des guillemets ;-) enfin, peut-être :-) Partager ce message Lien à poster Partager sur d’autres sites
J3R3M 107 Signaler ce message Posté(e) 6 août 2018 Bonjour @pepite, Il est vrai que je ne l'ai pas précisé, mais j'ai effectué le test avec des guillemets et ça retourne la même erreur. Le code est simplement testé dans une nouvelle scène, donc il est rigoureusement le même que celui qu'a posté @OJC La scène fait donc 6 lignes et le debug évoque la ligne 154... :/ Partager ce message Lien à poster Partager sur d’autres sites
Barelle 167 Signaler ce message Posté(e) 6 août 2018 (modifié) La variable globale existe t-elle et est-elle bien encodée en json ? Modifié 6 août 2018 par Barelle Partager ce message Lien à poster Partager sur d’autres sites
J3R3M 107 Signaler ce message Posté(e) 6 août 2018 (modifié) Merci de ton intérêt Barelle ! Oui, la table est bien encodée en json. J'ai enfin trouvé la source de l'erreur, j'ai simplement fait un copier/coller du code et une erreur de frappe s'est glissée dans le code. Il y a un "." au lieu de ":" à la ligne 4 : fibaro.getGlobalValue('T_INFOS_PIECES'). Voilà le code corrigé : local PIECE = 'SDB' local VALEUR = 1 local table = json.decode(fibaro:getGlobalValue('T_INFOS_PIECES')) table[PIECE].Mise = VALEUR fibaro:setGlobal('T_INFOS_PIECES',json.encode(table)) Cela fonctionne parfaitement et est beaucoup plus rapide que ce que j'avais fait à l'origine! Merci infiniment de vos réponses et du temps accordé pour m'aider. Modifié 6 août 2018 par J3R3M 2 Partager ce message Lien à poster Partager sur d’autres sites
OJC 133 Signaler ce message Posté(e) 14 août 2018 my bad... Partager ce message Lien à poster Partager sur d’autres sites
J3R3M 107 Signaler ce message Posté(e) 14 août 2018 Ça m'a obligé à me perfectionner dans la recherche d'erreurs LUA, ce ne fût que mieux! Merci encore de ta réponse! 1 Partager ce message Lien à poster Partager sur d’autres sites