Jean Louis DURET Posté(e) le 11 avril Signaler Posté(e) le 11 avril 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.
jojo Posté(e) vendredi à 13:34 Signaler Posté(e) vendredi à 13:34 bien sûr que c'est possible ! C'est quoi ta box ? (HC3, HC3L,-) => via scènes blocs = sans aucune programmation
Jean Louis DURET Posté(e) vendredi à 15:02 Auteur Signaler Posté(e) vendredi à 15:02 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
Jean Louis DURET Posté(e) vendredi à 19:07 Auteur Signaler Posté(e) vendredi à 19:07 J'avais bien prévenu que j'étais une buse 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.
Jean Louis DURET Posté(e) vendredi à 19:19 Auteur Signaler Posté(e) vendredi à 19:19 …. à 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 ?
jojo Posté(e) samedi à 09:41 Signaler Posté(e) samedi à 09:41 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
Jean Louis DURET Posté(e) samedi à 10:21 Auteur Signaler Posté(e) samedi à 10:21 Peux tu me montrer un exemple en LUA, je peux tenter ?
jojo Posté(e) dimanche à 15:15 Signaler Posté(e) dimanche à 15:15 il y a des milliards d'exemples sur le forum. Sur une HC3L tu peux faire 10 LUA. Je t'en recommande 2 : 1) les scripte GEA adapté par Lazer 2) et le script que j'ai adapté pour générer les ID des devices, utilisé par GEA.
Jean Louis DURET Posté(e) dimanche à 19:21 Auteur Signaler Posté(e) dimanche à 19:21 Ok merci je vais voir.
Jean Louis DURET Posté(e) dimanche à 20:59 Auteur Signaler Posté(e) dimanche à 20:59 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.
jojo Posté(e) lundi à 06:44 Signaler Posté(e) lundi à 06:44 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.
Jean Louis DURET Posté(e) lundi à 08:09 Auteur Signaler Posté(e) lundi à 08:09 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
jojo Posté(e) lundi à 09:26 Signaler Posté(e) lundi à 09:26 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.
Jean Louis DURET Posté(e) lundi à 09:41 Auteur Signaler Posté(e) lundi à 09:41 { 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" }
Jean Louis DURET Posté(e) lundi à 09:44 Auteur Signaler Posté(e) lundi à 09:44 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
jojo Posté(e) lundi à 10:07 Signaler Posté(e) lundi à 10:07 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 ?)
Jean Louis DURET Posté(e) lundi à 10:34 Auteur Signaler Posté(e) lundi à 10:34 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
Jean Louis DURET Posté(e) lundi à 10:37 Auteur Signaler Posté(e) lundi à 10:37 suite ... Si la T° du FGMS 01 (Id 221) est > 16°C Si on est en mode "Soleil" Si la variable "Volet_piscine" est "Fermé"
jojo Posté(e) lundi à 12:38 Signaler Posté(e) lundi à 12:38 ç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
Jean Louis DURET Posté(e) lundi à 13:53 Auteur Signaler Posté(e) lundi à 13:53 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.
jojo Posté(e) lundi à 15:08 Signaler Posté(e) lundi à 15:08 é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
jojo Posté(e) lundi à 15:50 Signaler Posté(e) lundi à 15:50 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 ?
Jean Louis DURET Posté(e) lundi à 17:12 Auteur Signaler Posté(e) lundi à 17:12 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.
Barelle Posté(e) lundi à 19:56 Signaler Posté(e) lundi à 19:56 (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é mardi à 14:39 par Barelle Minor improvements 😜
Messages recommandés