Aller au contenu

[Résolu][LUA] Modifier la valeur d'une clé au sein d'une table


Messages recommandés

Posté(e) (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é par J3R3M
Posté(e) (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é par OJC
  • Like 2
Posté(e)

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 ?

Posté(e)

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... :/

Posté(e) (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. :16:

Modifié par J3R3M
  • Like 2
  • 2 semaines après...
Posté(e)

Ça m'a obligé à me perfectionner dans la recherche d'erreurs LUA, ce ne fût que mieux!

Merci encore de ta réponse! ;)

  • Like 1
×
×
  • Créer...