J3R3M Posté(e) le 2 août 2018 Signaler Posté(e) le 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é le 6 août 2018 par J3R3M
OJC Posté(e) le 3 août 2018 Signaler Posté(e) le 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é le 3 août 2018 par OJC 2
J3R3M Posté(e) le 6 août 2018 Auteur Signaler Posté(e) le 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 ?
pepite Posté(e) le 6 août 2018 Signaler Posté(e) le 6 août 2018 Bonjour, Poste ton code, il attend un "string" ;-), mets des guillemets ;-) enfin, peut-être :-)
J3R3M Posté(e) le 6 août 2018 Auteur Signaler Posté(e) le 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... :/
Barelle Posté(e) le 6 août 2018 Signaler Posté(e) le 6 août 2018 (modifié) La variable globale existe t-elle et est-elle bien encodée en json ? Modifié le 6 août 2018 par Barelle
J3R3M Posté(e) le 6 août 2018 Auteur Signaler Posté(e) le 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é le 6 août 2018 par J3R3M 2
J3R3M Posté(e) le 14 août 2018 Auteur Signaler Posté(e) le 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
Messages recommandés