Aller au contenu

Messages recommandés

Posté(e)

Entre autres j'utilise ma Yubii Home pour commander l'ouverture automatique du volet de ma piscine à conditions qu'il fasse beau et assez chaud._j'ai des FGMS 001 au bons endroits_ et çà fonctionne correctement, mais en fonction de la saison je dois sans arrêt modifier les consignes dans le scénario.

J'ai acquis un FGBS321 et 2 sondes DS18B20, l'une dans l'eau et l'autre dans l'air.

Je voudrais que mon volet s'ouvre si la température de l'air est supérieure à celle de l'eau … et avec les autres conditions de beau temps par ailleurs.

Je ne sais pas comment comparer les valeurs des divers capteurs ou sonde avec la valeur du capteur de T° de l'eau.

Est ce possible ?

Merci de vos lumières à un archi nul en programmation … bien qu'intéressé d'apprendre et volontaire.

Posté(e)

bien sûr que c'est possible !

C'est quoi ta box ? (HC3, HC3L,-) => via scènes blocs = sans aucune programmation

Posté(e)
il y a une heure, jojo a dit :

bien sûr que c'est possible !

C'est quoi ta box ? (HC3, HC3L,-) => via scènes blocs = sans aucune programmation

Merci JoJo,

C'est une Yubii Home (l'équivalent de HC3L).

Bonne nouvelle si c'est sans programmation, mais je n'ai pas trouvé comment le faire en direct avec l'application ?

Bon je vais regarder de plus près, sans soute ai je manqué quelque chose.

Merci encore et bonne journée 

Posté(e)

J'avais bien prévenu que j'étais une buse :15:

J'ignore totalement ce qu'est une scène en mode bloc. Bien sûr j'ai rédigé et ma Yubii utilise 34 scènes, mais j'ai beau "farfouiller" j'ignore absolument comment accéder à ce mode.

Merci de ta patience.

Posté(e)

…. à moins que le "mode bloc" ne soit simplement que celui que j'utilise pour écrire tous mes scénarios ! 

Dans ce cas je ne vois pas (avec quels blocs) je peux écrire si T° capteur A > T° capteur B = action ?

Posté(e)

en effet, c'est le mode que tu utilises.

Je n'utilise jamais ce mode, du coupe j'ai voulu faire un scénario bloc de test pour te montrer,

et, à ma grande surprise, on ne sait comparer que la valeur d'un appareil à une valeur fixe, et pas à celle d'un autre appareil (en bloc).

En LUA ou avecv GEA, c'est évidemment possible et super simple

Posté(e)

Jojo Je n'ai pas trouvé mon bonheur et je n'ai à peu près rien compris sur ces 2 liens qui parlent de Quick App sauf erreur.

Quelqu'un peut il me fournir une simple routine écrite en Lua que j' intégrerai à ma scène et qui permet de réaliser une action si la valeur T° d'un capteur est supérieure à la valeur T1° d'un deuxième capteur.

Je n'ai pas trouvé çà sur le Forum, peut être pas cherché au bon endroit.

Posté(e)

en effet tu ne trouveras pas sur le forum un cours de LUA/ Un QA avec >= ou <= c'est on ne peut plus simple.

Les exemples du forum font ça et aussi des action beaucoup plus complexes.

Les 2 liens que je t'ai donnés pointent des des QA (en fait tous les codes LUA actuels sont soit des QA, soit des scènes (je n'ai aucune scène).

Et GEA est une "configuration" d'un QA.

Posté(e)

Jojo, merci de tes efforts pour m'aider, mais j'ai prévenu être une triple triple buse. J'ai transpiré il y a quelques temps pour utiliser un QA sensée récupérer des infos sur mon NAS Synology => sans succès. J'ignore totalement ce qu'est un GEA ??.

Bon j'ai demandé du renfort aux tech Fibaro en leur donnant ma scène (en Lua) et leur demandant si il était possible d'ajouter …….. ce que recherché.

On verra.

Merci encore de ta patience.

Bonne journée 

Posté(e)

si tu as déjà qqch en LUA, envoie le code (en pièce jointe dans un fichier txt avec extension .lua, car extensions .txt refusées par le forum et le code collé, le forum rajoute des caractères invisibles qui foutent le b...), j'essaierai de te l'adapter.

Posté(e)

{

  conditions = { {

      isTrigger = true,

      operator = "==",

      property = "sunrise",

      type = "date",

      value = 310

    }, {

      id = 221,

      isTrigger = true,

      operator = ">=",

      property = "value",

      type = "device",

      value = 16

    }, {

      isTrigger = true,

      operator = "==",

      property = "activeProfile",

      type = "profile",

      value = 1

    }, {

      isTrigger = true,

      operator = "==",

      property = "VOLET_PISCINE",

      type = "global-variable",

      value = "FERME"

    } },

  operator = "all"

}

Posté(e)

Je ne sais pas si çà peut aller ?

Il faut ajouter la condition ET si valeur T° capteur A > valeur T° capteur B.

Les capteurs A et B que je renommerai sont les valeurs relevées par 2 sondes DS18B20 branchées sur un FGBS321.

En tous cas merci encore de ta patience

Posté(e)

ourf, je ne comprends pas tout, surtout que je n'ai jamais fait de scène.

Je vais essayer de faire qqch, mais j'ai besoins de :

- id température extérieure (fgbs tmp1)

- id température eau piscine (fgbs tmp2)

- id du module qui donnerait l'impulsion pour le mvt du volet (ça pourrait être le out1 d'un FGBS222, mais PAS du FGBS321 car trop vieux)

Comment ta variable globale <VOLET_PISCINE> est mise à jour ? (quelles en sont les valeurs possibles ?)

 

 

Posté(e)

La variable est mise à jour par l'ouverture ou la fermeture du volet.

Oui les ID T° est et eau sont bien celles là

Le module qui ouvre est un FGS 224 le 1er relai commande ouverture et le 2ème la fermeture.
Là je ne t'ai mis que les "déclarations" (conditions d'ouverture) et pas les actions.

En fait les conditions ACTUELLES d'ouverture son :

   310 minutes après lever du soleil

 

Posté(e)

ça c'est donc ce que tuas MAINTENANT.

Et que veux-tu ? Toujours 310 min après lever du soleil (et avant son couché)

Quels sont les ID des 2 sondes de température ? (tu n'utiliseras donc plus ton FGMS)

les 2 dernières conditions sont toujours valides

Posté(e)

Oui c'est ce que j'ai actuellement.

310 après lever du soleil, le coucher je ne m'en occupe pas (la fermeture du volet n'est pas automatique pour des raisons de sécurité)

Je n'utiliserai plus le FGMS mais les valeurs des sondes soi id 330 pour l'air et 334 pour l'eau.

Les 2 dernières restent en l'état.

 

Posté(e)

évidemment que la fermeture automatique est dangereuse, donc à proscrire ...

Mais si tu décides d'après le coucher du soleil de fermer (manuellement) la piscine, il ne faut pas qu'elle se réouvre en pleine nuit si la température de l'air est supérieure à celle de l'eau, donc je rajouterais une condition supplémentaire sur lheure du coucher - 100 min?

 

Tu as donc un autre scénario pour mettre à jour ta variable globale Volet_piscine

Posté(e)

je ne suis pas du tout un pro des scènes - celle que j'aissaye de faire pour toi est ma toute première (car j'utilise massivement GEA avec quoi ton besoit serait rempli en une ligne = 2 min de travail ...)

 

Je n'ai donc pas trouvé comment faire un trigger en comparant deux (température). Mais comme je suis têtu je ne veux pas abandonner, surtout que je t'ai dit que c'était possible.

Donc voici mon idée :

faire tour la scène toutes les 30 min, et l'ancer les actions si

h > lever soleil + 310 min

ET

h < coucher soleil - 100 min

ET

mode box = Soleil (il faut rentrer un # pour le mode,c'est quoi chez toi ?)

ET

Volet_piscine = "FERME"

 

et dans les actions, je compare les 2 température, et ouvre le volet si nécessaire

 

ok ?

Posté(e)

Jojo je te remercie de tout ce mal que tu te donnes. 

Je ne sais ce qu'est GEA ; sur ma Yubii j'ai "Blocs" convertibles en "Lua" et Quick App … pas de GEA en vue.

Le mode"Soleil" est le mode par défaut installé sur Yubii que j'ai renommé Soleil et d'autres Pluie (les volets ne se ferment plus partiellement) et Enfants (je n'ouvre pas leurs volets le matin si ils sont là" etc

Dans le Lua c'est cette partie

"isTrigger = true,

      operator = "==",

      property = "activeProfile",

      type = "profile",

      value = 1"

Vois l'équivalent de toute la partie "Déclarations" en mode bloc, ce sera plus clair.

Je me demande si la partie "comparaison de T°" ne doit pas être plutôt à la suite des "Déclarations" Plutôt que les "Actions" où l'on ne devrait avoir que le lancement du scénario "Ouverture de volet" et le message disant que c'est fait …. En fait la comparaison des T° est une condition de plus pour que le volet s'ouvre.

Actuellement au fur et à mesure de l'avancement de la saison je change la T° extérieure (ici 16°C) qui devient 28°C en été : et c'est pour m'éviter çà que je cherche.

 

Ceci dit si tu penses que je peux avoir accès à GEA (? les Quick Apps sur lesquelles j'ai calé) et que c'est plus simple c'est peut être à essayer.

 

Ecran 2025-04-14 à 19.04.36.jpg

Posté(e) (modifié)

Pour répondre à l’impossibilité de comparer les valeurs de deux dispositifs, je propose un QA qui interrogera les valeurs et qui stockera la différence dans sa propre valeur.

Ce QA, voir ci-dessous, attend trois variables :

  • Une variable "refreshDelay" qui contiendra la période (en secondes) de rafraichissement de la valeur calculée ;
  • Deux variables "deviceId1" et "deviceId2" précisant les id des dispositifs dont il faudra réaliser la comparaison des valeurs.

Note : un QA générique ne possédant pas l’attribut "value", j’ai retenu pour ce QA un type "Capteur de température".

 

Le code lua :

local myVersion = "0.12";
-- Barelle le 14/04/2025 : création

local delay = 60; -- secondes
local devId1, devId2 = 0, 0;
local dev1Lbl = "Device 1";
local dev2Lbl = "Device 2";
local selfId  = plugin.mainDeviceId;

__TAG = "Comparaison_"..plugin.mainDeviceId;

function QuickApp:onInit()
	local initError = false;
	local initErrorCause = "";
	local testVariable = function(varName, defaultValue)
		local var = self:getVariable(varName);
		if (var == "") or (var == nil) then
			var = defaultValue;
			self:setVariable(varName, var);
			if type(var) == "table" then
				self:warning("QuickApp:onInit>testVariable>>>🤨 Variable \"" .. varName .. "\" not defined, now sets to " .. json.encode(var));
			else
				self:warning("QuickApp:onInit>testVariable>>>🤨 Variable \"" .. varName .. "\" not defined, now sets to " .. stuffToString(var));
			end
		else
			if type(var) == "table" then self:debug('QuickApp:onInit>testVariable>>>😐 variable "'..varName..'"='..json.encode(var), "SeaGreen"); else self:debug('QuickApp:onInit>testVariable>>>😐 variable "'..varName..'"='..tostring(var)); end
		end
		return var;
	end -- testVariable
		
	self:trace("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* [" .. __TAG .. "] onInit (version " .. myVersion .. ") *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
	
	-- 0) Check if QuickApp device is enabled
	if api.get("/devices/" .. tostring(selfId)).enabled then
		self:updateProperty("log", "");
	else
		self:updateProperty("log", " Disabled ");
		self:warning("QuickApp:onInit>>>Device " .. self.name .. " is disabled => QuickApp stopped.");
		return;
	end
	
	-- 1) On récupère le delai de raffraichissement des données
	delay = testVariable("refreshDelay", delay);
	self:trace('onInit>>>🙂 Variable "refreshDelay"=' .. delay .. ' seconds.');
		
	-- 2) On récupère l'Id du premier appareil
	devId1 = tonumber(testVariable("deviceId1", devId1));
	self:trace('onInit>>>🙂 Variable "deviceId1"=' .. devId1 .. '.');
	
	-- 3) On récupère l'Id du second appareil
	devId2 = tonumber(testVariable("deviceId2", devId2));
	self:trace('onInit>>>🙂 Variable "deviceId2"=' .. devId2 .. '.');

	-- 4) On vérifie que les paramètres sont bons
	if (devId1 > 1) and (devId2 > 1) then
		local val1 = hub.getValue(devId1, 'value');
		if (type(val1) ~= "number") then
			initError = true;
			initErrorCause = '🥵 Invalid device "deviceId1" : ' .. devId1;
			dev1Lbl = "Device 1 (id: " .. devId1 .. ")";
		else
			dev1Lbl = "Device 1 (id: " .. devId1 .. ") value=" .. val1;
		end
		local val2 = hub.getValue(devId2, 'value');
		if (type(val2) ~= "number") then
			initError = true;
			initErrorCause = initErrorCause ..' 🥵 Invalid device "deviceId2" : ' .. devId2;
			dev2Lbl = "Device 2 (id: " .. devId2 .. ")";
		else
			dev2Lbl = "Device 2 (id: " .. devId2 .. ") value=" .. val2;
		end
		if (type(val1) == "number") and (type(val2) ~= "number") then
			self:updateProperty("value", val1-val2);
		end
	else
		initError = true;
		dev1Lbl = "Device 1 (id: " .. devId1 .. ")";
		dev2Lbl = "Device 2 (id: " .. devId2 .. ")";
		initErrorCause = '🥵 Paramètres invalides.';
	end
	-- 5) On met à jour l'interface utilisateur
	self:updateView("dev1Lbl", "text", dev1Lbl);
	self:updateView("dev2Lbl", "text", dev2Lbl);
	self:updateView("majLbl", "text", "Le " ..os.date ("%d/%m/%Y à %H:%M:%S", os.time()) .. ".");
	
	if initError then
		self:warning(initErrorCause);
		self:updateView("resultLbl", "text", initErrorCause);
		self:updateProperty("value", 0);
		self:updateProperty("log", " Erreur ");
	else
		self:loop(delay);
	end
end -- QuickApp:onInit

function QuickApp:loop(delay)
	-- Check if QuickApp device is enabled
	if api.get("/devices/"..tostring(self.id)).enabled then
		self:updateProperty("log", "");
	else
		self:updateProperty("log", " Disabled ");
		self:warning("Device", self.name, "is disabled => QuickApp stopped");
		return
	end
	
	local valDev1 = hub.getValue(devId1, 'value');
	local valDev2 = hub.getValue(devId2, 'value');
	local ecart = valDev1 - valDev2;
	self:updateView("dev1Lbl", "text", "Device 1 (id: " .. devId1 .. "), value = " .. valDev1);
	self:updateView("dev2Lbl", "text", "Device 2 (id: " .. devId2 .. "), value = " .. valDev2);
	self:updateProperty("value", ecart);
	self:updateProperty("log", "Ecart = " .. ecart);
	self:updateView("resultLbl", "text", "L'écart entre les valeurs est de " .. ecart .. ".");
	self:updateView("majLbl", "text", "Le " ..os.date ("%d/%m/%Y à %H:%M:%S", os.time()) .. ".");
	
	self:trace("QuickApp:loop>>>Le QA a été mis a jour : prochaine mise à jour dans " .. delay .. " secondes.");
	hub.setTimeout(delay * 1000, function() 
			self:loop(delay);
		end)
end -- QuickApp:loop

function stuffToString(stuff)
	local typ = type(stuff);
	if		typ == "nil"		then return "nil";
	elseif	typ == "string"		then return stuff;
	elseif	typ == "number"		then return tostring(stuff);
	elseif	typ == "boolean"	then return iif(stuff, "true", "false");
	elseif	typ == "table"		then return json.encode(stuff);
	elseif	typ == "function"	then return "function";
	elseif	typ == "userdata"	then return "userdata";
	elseif	typ == "thread"		then return "\"thread\" not supported by Fibaro!";
	else
		return "unknown Lua variable type: "..typ;
	end
end -- stuffToString

 

Le fichier du QA :

 

Comparaison-0.12.fqa

Modifié par Barelle
Minor improvements 😜
×
×
  • Créer...