Aller au contenu
J3R3M

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

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Bonjour, 

 

Poste ton code, il attend un "string" ;-), mets des guillemets ;-) 

enfin, peut-être :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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

La variable globale existe t-elle et est-elle bien encodée en json ?

Modifié par Barelle

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Ç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

Partager ce message


Lien à poster
Partager sur d’autres sites

×