Aller au contenu
Steven

Mettre À Jour Une Vg Sans Utiliser L'api Post Mais Un Simple Get

Recommended Posts

Fréquemment j'ai besoin taper une simple URL pour mettre à  jour une VG, mettre à  jour un label, recevoir l'état de mon IPX, tout en déclenchant un scénario ... mais mettre un place un script qui fait un POST sur une Variable Globale est un vrai calvaire car il faut passer par un système tiers (PHP, Java, ...).

 

Et pourtant, Fibaro nous a donner un des outils les plus simples et surtout les plus utile ... les Virtual Devices.

 

Et oui, cela peu surprendre mais saviez-vous que chaque label, slider d'un VD se comportent exactement comme une variable globale. C'est à  dire :

  • les données sont persistante (vous pouvez rebooter votre box, la donnée sera toujours là )
  • les données sont modifiables (via un scène ou un appel http .. nous y reviendrons)
  • le changement de valeur active un trigger

 

Allez passons au chose sérieuse. Donc si je résume cela veux dire que si je fait un appel HTTP GET pour changer un label et que le changement de ce dernier active un trigger, je peux donc ... heuuuu ... dire zut au variable globale.

 

En effet, voici un exemple concret et simple :

 

Créons un Virtuel Device avec un simple label que nous allons appeler ainsi :

Label : V.Globales
ID : VG

Notons en passant l'ID de ce nouveau VD.

 

Maintenant si depuis un navigateur, je tape cette URL, je vais changer la valeur de mon label :

http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=<ID_VD>&name=setProperty&arg1=ui.VG.value&arg2=<MaNouvelleValeur>

Ok mais quel intérêt ? L'intérêt vient en ajoutant une scénario derrière tout cela :

--[[
%% properties
484 ui.VG.value
--]]

actions = {
   ["ui.VG.value"] = function(values)
	for k,v in pairs(json.decode(values)) do
	   if (fibaro:getGlobalValue(k) ~= v) then
	      fibaro:setGlobal(k, v)
	   end
	end
    end,
}

-- ===============================
-- Démarrage du script
-- ===============================
local trigger = fibaro:getSourceTrigger()

if (trigger.type == "property") then
	property = trigger.propertyName
  	device = trigger.deviceID
  	value = fibaro:getValue(device, property)
	
	actions[property](value)  
end

Que va donc faire ce script et ben il va écouter si la valeur ui.VG.value de mon VG (484 chez moi) change et si elle change et bien il va lire la valeur et mettre à  jour mes variables globales.

 

En reprenant l'URL ci-dessus, en remplacant <MaNouvelleValeur> par un json au format simple 

{NomVariable:valeur, NomVariable2:valeur, ...}

Exemples: 

{'Pushbullet':'Message'}
{'Pushbullet':'Message', 'Chauffage':'Vacances}

http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=<ID_VD>&name=setProperty&arg1=ui.VG.value&arg2={'Pushbullet':'Message'}

Et voilà , il ne reste plus qu'à  "caché" le VD et la scène et vous avez un moyen simple de mettre à  jour vos VG avec un simple GET HTTP.

 

Pour allez plus loin, voici ma scène pour vous donner des idées

--[[
%% properties
484 ui.Portail.value
484 ui.ConsoGlobal.value
484 ui.VG.value
484 ui.IPX.value
484 ui.Properties.value
--]]


actions = {
	["ui.Portail.value"] = function(value) 
    		fibaro:call(466, "setProperty", "ui.Label1.value", value) 
  		end,
  	["ui.ConsoGlobal.value"] = function(value)
  			fibaro:call(283, "setProperty", "ui.Label1.value", "Global " .. value) 
  		end,
	["ui.VG.value"] = function(values)
    		setVG(values)
    	end,
	["ui.IPX.value"] = function(values)
    		setIPX(values)
    	end,
	["ui.Properties.value"] = function(values)
    		setProperties(values)
    	end,
}

-- -----------------------------------------------------
-- set les Variables Globales reçues
-- Ex : {'Pushbullet'='Coucou', 'Chauffage'='Vacances'}
-- -----------------------------------------------------
function setVG(values) 
	for k,v in pairs(json.decode(values)) do
    	if (fibaro:getGlobalValue(k) ~= v) then
			fibaro:setGlobal(k, v)
		end
    end
end

-- -----------------------------------------------------
-- Traite les inputs / outputs de l'ipx
-- M2M -> Push
-- Ex : {'in'='$I', 'out'='$O'}
-- -----------------------------------------------------
function setIPX(values)
	for k,v in pairs(json.decode(values)) do
    	val = string.sub(v, 1, 8) 
		val = string.gsub(val, "1", " ¦ " )
		val = string.gsub(val, "0", " ? ")
    	fibaro:debug(k .. " = " .. val)
    	if (k == 'in') then
    		fibaro:call(80, "setProperty", "ui.lblIn.value", val) 
      	else
      		fibaro:call(80, "setProperty", "ui.lblOut.value", val) 
     	end
    end
end

-- -----------------------------------------------------
-- set les propriétés ou valeurs d'un module
 -- Ex : [{'id'=123, 'property'='setValue', 'value'=100}, {'id'=234, 'property'='ui.Label1.value', 'value'='Message'}]
-- -----------------------------------------------------
function setProperties(values)
  	fibaro:debug(values)
	local tablejson = json.decode(values)
	if (#tablejson > 0) then
		for k,v in pairs(tablejson) do
			setProperty(v)
		end
	else
		setProperty(tablejson)
	end
end

-- -----------------------------------------------------
-- set une propriété ou valeur d'un module
 -- Ex : {'id'=123, 'property'='setValue', 'value'=100}
-- -----------------------------------------------------
function setProperty(v)
    	fibaro:debug(json.encode(v))
    	if (v.property == "setValue") then
      		--fibaro:call(v.id, "setValue", v.value)
    		fibaro:debug("Value " .. v.id .. " = " .. v.value)
      	else
    		-- fibaro:call(v.id, "setProperty", v.property, v.value)
    		fibaro:debug("Property " .. v.id .. " " .. v.property .. " = " .. v.value)
      	end
end


-- ===============================
-- Démarrage du script
-- ===============================
local trigger = fibaro:getSourceTrigger()

if (trigger.type == "property") then
	property = trigger.propertyName
  	device = trigger.deviceID
  	value = fibaro:getValue(device, property)
	
	actions[property](value)  
end 

 

Amusez-vous bien

  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait c'est un peu ce que je faisais avant depuis ma Zibase pour piloter mes VDs sensors correspondant, et en plus on peut trigger le label depuis GEA.

 

Désormais plus trop besoin, car j'utilise la technique des modules morts/inutilisées.

 

Mais je confirme, c'est top, car cela évite de devoir gérer des tonnes de VG !!

Partager ce message


Lien à poster
Partager sur d’autres sites

super merci pour l'astuce, moi je suis encore tres VG, j'avoue que je n'ai pas encore tout compris au code de the MASTER ;-)

 

Mais j'ai bien compris qu'on recuperait la valeur des labels n les utilisant en trigger et on remettait la valeur du label dans la VG lol

 

Question performance dans ce cas : ecrire dans un label est-il plus rapide que dans une VG ?

Vous semblearit-il judicieux d'utiliser des labels en trigger que des VGs pour recup des infos par exemple depuis un autre VD ou autre scene ?

 

j'oubliais, juste trop fort ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Pepite, tu ne te souviens plus, on en avais justement discuté dans le topic GEA de cette technique quand je cherchais un lien pour ma Zibase, c'est toi qui m'avait donné le code pour trigger dans GEA :) :)

 

Niveau perf, je pense que cela ne doit pas changer grand chose, mais le gros plus, c'est que cela évite d'avoir des tonnes de VG, on peut trier, et les intégrer dans les VDs qu'il faut si nécessaire.

Partager ce message


Lien à poster
Partager sur d’autres sites

sisi je m'en souviens bien Nico, ma question etait surtout en terme de perfs compare à  l'ecriture sur des VGs

 

faudrait vraiment que je me penche la-dessus pour voir, c'est vrai que mon nombre de VGs augmente, mais je trouve ca tellement pratique.

je dois pouvoir réduire en utilisant les labels..

 

le code de maitre Steven est trop complexe pour un non dev..ca me prend du temps lol

Partager ce message


Lien à poster
Partager sur d’autres sites

Te prends pas la tête sur les perfs, une écriture ça reste lent, mais tu n'en fait pas 1000 àla seconde comme dans un benchmark.

Donc que le label ou la VG soit 2 fois plus rapide/lent, ça ne changera rien.

Si tu veux vraiment gagner en perfs, tu fais une lecture avant, tu compares, et tu ne modifies que si nécessaire. Làtu vas gagner.

Partager ce message


Lien à poster
Partager sur d’autres sites

oui, ca c'est ce que j'ai fait des que j'ai commence àessayer de coder suite àtes recommandations..Je n'ecris que si necessaire, 'essaie d'etre le plus precis possible dans les conditions

Partager ce message


Lien à poster
Partager sur d’autres sites

Enfin pareil, si c'est pour mettre àjour un variable une fois par minute, tu ne gagneras strictement rien, c'est tellement transparent pour la box...

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut @Steven,

Merci infiniment pour ce script que j'utilise pour dialoguer à  partir de Jeedom.

Ceci dit, je penses que quelques coquilles se sont glissées.

Pour que d'autres ne perdent pas le même temps que moi, voici les coquilles.

 

exemple pour envoyer éteindre un dimmer: (properties)

{"id":123,"property":"setValue","value":100}

et non pas

{'id'=123, 'property'='setValue', 'value'=100}

et pour les VG

{"House_Mode":"Manual"}

 au lieu de 

{'House_Mode':'Manual'}

Partager ce message


Lien à poster
Partager sur d’autres sites

×