jjacques68
Membres confirmés-
Compteur de contenus
4 372 -
Inscription
-
Dernière visite
-
Jours gagnés
39
Tout ce qui a été posté par jjacques68
-
Gestion complète des plantes avec Mi-Flora
jjacques68 a posté un sujet dans Périphériques et matériels autres
Bonjour à tous, Voici un petit tuto qui explique mon installation pour contrôler l'état des plantes vertes de la maison. EDIT : Scène en Version 2 (téléchargeable à la fin du tuto). correction d'un bug dans l'affichage du debug lors de la création des VG. Je précise tout de suite que je n'ai pas les pouces verts , et que je suis du genre à oublier d'arroser nos belles plantes (ou de trop les arroser). Ce n'est pas vital, mais ça me rend quand même service. Et j'ose dire que mes plantes ne se portent pas si mal que ça… J'utilise les capteurs XIAOMI Mi Flora en vente sur amazon, aliexpress, … à des prix allant du simple au triple ! J'en ai déjà eu à 9 € et d'autre à 20 € !!! Faut surveiller les offres du moment… Attention aux capteurs version chinois !!! (impossible de les mettre à jour, mais fonctionne sous BLEA). !!! Il faut prendre des versions internationales !!! Ils semblent plutôt bien fonctionner (même à l'extérieur). La précision des mesures restent à confirmer... Surtout qu'aucune plante ne se comporte de la même manière. J'ai utilisé l'application Flower Care (iPhone) pour mettre à jour les capteurs (actuellement : 3.1.8). Ces capteurs sont en Bluetooth, donc il faut une box compatible. Dans mon cas j'ai une Jeedom Smart. Sommaire : Configuration Jeedom VD HC2 La Scène Mi-Flora Conclusion 1. Configuration Jeedom Je passe la partie installation Jeedom. J'utilise le plungin BLEA de @sarakha63 (merci pour son travail) qui fonctionne à merveille avec les objets bluetooth. J'ai également ajouté une antenne bluetooth supplémentaire pour avoir une meilleur portée (raspberry avec raspbian installé et une clé Bluetooth de type SENA) Tout est bien expliqué sur le blog de @sarakha63. Je vous invite à fouillé un peu chez lui. Voilà le résultat dans Jeedom : On y voit les 12 plantes avec leurs données (humidité, température, batterie...) Je remonte certaines de ces données vers la HC2 : L'humidité (surtout cela qui m'intéresse) ; Le fertilisant ; L'ensoleillement ; La température ; La batterie Cette remontée d'info se fait grâce à un script : EDIT : il faut installer le plugin script disponible dans le market Voilà le script au complet (sans retour à la ligne ni espace) : http://192.168.xx.xx/api/callAction?deviceID=363&name=setProperty&arg1=ui.FromJeedom.value&arg2={Tmp:"#[Maison][Sanse Gd][Température]# °C",Hum:"#[Maison][Sanse Gd][Humidité]# %25",Frt:"#[Maison][Sanse Gd][Fertilisant]# uS/cm",Lum:"#[Maison][Sanse Gd][Luminosité]# Lux",Bat:"#[Maison][Sanse Gd][Batterie]# %25"} On voit dans ce script que j'écris dans un label nommé "FromJeedom" d'un VD (ici ID = 363) les données voulues de ma plante (nommée Sanse Gd) Je duplique ce script autant de fois que j'ai de plante en passant à changer le N° du VD (car un VD par plante) et bien sûr le nom de la plante. Ce qui fait que mon script contient 12 requêtes l'une en dessous de l'autre. 192.168.xx.xx est l'adresse IP sur le réseau local de la HC2. Il est exécuté toutes les 29 minutes grâce à Auto-actualisation (CRON) : */29 * * * * (google sera mieux que moi vous expliquer ce CRON… c'est pas mal le système ) EDIT : Le temps de rafraichissement de chaque Mi-Flora est fixé à 2 heures (suffisent à mon avis... à voir à l'usage) 2. VD HC2 : Voici le VD d'une plante : On y voit comme prévu, les données voulues. Le nom du VD est simplement le nom de la plante (pas forcément identique à celui renseigné dans Jeedom) L'icône présente un point d'exclamation rouge car justement l'humidité est plus basse que la consigne Sinon celle-ci serait sans le point d'exclamation. (Donc j'ai 2 icones par plante…) Il y a en plus : Un label consigne avec 2 boutons +/- pour sélectionner la consigne d'alerte pour l'arrosage. Un label Up pour savoir quand a été faite la dernière mise à jour Un label data qui reçoit le contenu de la requête Jeedom. Vous aurez compris que ce label a pour ID : FromJeedom (voir chapitre 1) Pour les labels, il est important du coup de les identifier avec cette logique : (la scène utilisera ces ID de label) Humidité = Hum ; Température = Tmp ; Lumière = Lum ; Fertilisant = Frt ; Batterie = Bat Code du bouton + : local id = fibaro:getSelfId() local cons = tonumber(fibaro:getGlobalValue("HumPlante"..id)) local val = string.match(fibaro:getValue(id, "ui.Hum.value"), "[0-9.]+") --INC la consigne cons=cons+1 if cons > 100 then cons = 100 end --set la VG fibaro:setGlobal("HumPlante"..id, cons) --affiche dans le label consigne fibaro:call(id, "setProperty", "ui.HumCons.value", cons.." %") --test la valeur et la consigne pour avoir la bonne icone if tonumber(val) >= cons then fibaro:call(id, "setProperty", "currentIcon", 1083) else fibaro:call(id, "setProperty", "currentIcon", 1084) end Code du bouton - : local id = fibaro:getSelfId() local cons = tonumber(fibaro:getGlobalValue("HumPlante"..id)) local val = string.match(fibaro:getValue(id, "ui.Hum.value"), "[0-9.]+") --DEC la consigne cons=cons-1 if cons < 0 then cons = 0 end --set la VG fibaro:setGlobal("HumPlante"..id, cons) --affiche dans le label consigne fibaro:call(id, "setProperty", "ui.HumCons.value", cons.." %") --test la valeur et la consigne pour la bone icone if tonumber(val) >= cons then fibaro:call(id, "setProperty", "currentIcon", 1083) else fibaro:call(id, "setProperty", "currentIcon", 1084) end On constate dans ces codes qu'une variable globale "HumPlanteXXX" est utilisée pour mémoriser la consigne. Celle –ci est créée par la scène (voir chapitre3). On retrouve également l'ID des 2 icones pour cette plante. Code de la mainLoop : (rien de bien compliqué, c'est juste pour que tout soit propre lors d'un reboot de la HC2) local id = fibaro:getSelfId() local cons = tonumber(fibaro:getGlobalValue("HumPlante"..id)) local val = string.match(fibaro:getValue(id, "ui.Hum.value"), "[0-9.]+") --affiche de la consigne fibaro:call(id, "setProperty", "ui.HumCons.value", fibaro:getGlobal("HumPlante"..id).." %") --test la valeur et la consigne pour l'icone if tonumber(val) >= cons then fibaro:call(id, "setProperty", "currentIcon", 1083) else fibaro:call(id, "setProperty", "currentIcon", 1084) end fibaro:abort() 3. La scène Mi-Flora : (attention c'est lourd…) --[[ %% autostart %% properties 353 ui.FromJeedom.value 352 ui.FromJeedom.value 357 ui.FromJeedom.value 358 ui.FromJeedom.value 359 ui.FromJeedom.value 361 ui.FromJeedom.value 362 ui.FromJeedom.value 363 ui.FromJeedom.value 366 ui.FromJeedom.value 367 ui.FromJeedom.value 368 ui.FromJeedom.value 385 ui.FromJeedom.value %% events %% globals --]] --[[ Version 2 - se déclenche sur changement de valeur du label FromJeedom des VD des plantes - a besoin de 2 VG par plante (testées et crées par la fonction TestGlobal) : HumPlante = consigne pour les tests d'humidité DatePlante = date à laquelle l'alerte mail a été envoyé (pour pas en avoir plusieurs) - récupère la chaine de caractère du label FromJeedom du VD (table json) - pour chaque item du json, update des label correspondant du VD - pour le label "Hum", appel de la fonction Alerte pour tester l'humidité - la fonction alerte change l'icone du VD et envoi notif si pas déjà fait - si le param "active" = 0 c'est que la plante/capteur n'est plus utilisé --]] --Déclarations****************************************************************** local Trigger = fibaro:getSourceTrigger() local NameID local Liste = { --liste des plantes (VD) [352] = {id = 352, IcoOK=1061, IcoNOK=1062, active=1}, [353] = {id = 353, IcoOK=1059, IcoNOK=1060, active=1}, [357] = {id = 357, IcoOK=1063, IcoNOK=1064, active=1}, [358] = {id = 358, IcoOK=1071, IcoNOK=1072, active=1}, [359] = {id = 359, IcoOK=1067, IcoNOK=1068, active=1}, [361] = {id = 361, IcoOK=1069, IcoNOK=1070, active=1}, [362] = {id = 362, IcoOK=1077, IcoNOK=1078, active=1}, [363] = {id = 363, IcoOK=1075, IcoNOK=1076, active=1}, [366] = {id = 366, IcoOK=1079, IcoNOK=1080, active=1}, [367] = {id = 367, IcoOK=1081, IcoNOK=1082, active=1}, [368] = {id = 368, IcoOK=1083, IcoNOK=1084, active=1}, [385] = {id = 385, IcoOK=1091, IcoNOK=1092, active=1}, } --TestGlobal**************************************************************** -- teste si la VG existe. La créée le cas échéant function TestGlobal(id) local listeVG = {"HumPlante", "DatePlante"} --liste des VG à tester/créer for k,v in ipairs(listeVG) do --pour chaque VG de la liste if fibaro:getGlobal(v..id) == nil then --si pas de VG newVar = {} --détermine son nom newVar.name = v..id --détermine sa valeur if v == "HumPlante" then newVar.value = "20" elseif v == "DatePlante" then newVar.value = "" end --crée la VG api.post("/globalVariables", newVar) print("VG "..newVar.name.." créée.") end end end --UpdateVD******************************************************************** --met à jour les label du VD et appel la fonction alerte function UpdateVD(id, name, IcoOK, IcoNOK) --récupère le tableau Json local MaChaine = fibaro:getValue(id, "ui.FromJeedom.value") --print(MaChaine) print("<font color='green'>"..os.date("%d/%m/%Y").." - Update "..name.."</font>") --test si le label est pas vide if MaChaine == "" or MaChaine == nil then print("Label vide. fin") return false --sort de la function donc fin à la scène end --pour chaque élément du tableau Json for label,valeur in pairs(json.decode(MaChaine)) do fibaro:call(id, "setProperty", "ui."..label..".value", valeur) --met à jour le VD if label == "Hum" then Alerte(id, valeur, name, IcoOK, IcoNOK) end end --met à jour la date updated fibaro:call(id, "setProperty", "ui.Up.value", os.date("%d/%m/%Y - %H:%M")) fibaro:call(id, "setProperty", "log", os.date("%d/%m/%Y - %H:%M")) fibaro:call(id, "setProperty", "logTemp", "TxtGreen") end --Alerte********************************************************************** --alerte en cas d'humidité trop basse function Alerte(id, valeur, name, IcoOK, IcoNOK) local CurrentDate = os.date("%d/%m/%Y") --reformate la valeur pour extraire que le chiffre valeur = string.match(valeur, "[0-9.]+") --si la valeur est < consigne if tonumber(valeur) < tonumber(fibaro:getGlobalValue("HumPlante"..id)) then -- change icone en alerte fibaro:call(id, "setProperty", "currentIcon", IcoNOK) --si la date de la variable est différente if fibaro:getGlobal("DatePlante"..id) ~= CurrentDate then print("<font color='red'>".."Arroser "..name.."</font>") -- envoi mail fibaro:call(2, "sendEmail", "Alerte plante "..name, "Arroser "..name) -- met à jour la variable DateAlerte fibaro:setGlobal("DatePlante"..id, CurrentDate) else --déjà notifié print("<font color='yellow'>"..name.." : déjà notifié".."</font>") end else -- Hum est ok = icone OK fibaro:call(id, "setProperty", "currentIcon", IcoOK) end end -- NotUsed******************************************************************** -- utlisé quand un capteur/plante n'est plus actif function NotUsed(id) fibaro:call(id, "setProperty", "ui.Up.value", "Not Used") fibaro:call(id, "setProperty", "log", "Not Used") fibaro:call(id, "setProperty", "logTemp", "TxtGreen") fibaro:call(id, "setProperty", "currentIcon", 1) end --MAIN********************************************************************** if Trigger.type == "property" then --trouve le nom du VD déclencheur NameID = api.get("/devices/"..Trigger.deviceID).name --test la présence de la VG (créé si pas le cas) TestGlobal(Trigger.deviceID) --si plante active on met à jour le VD if Liste[Trigger.deviceID].active == 1 then -- si la plante/capteur est actif UpdateVD(Trigger.deviceID, NameID, Liste[Trigger.deviceID].IcoOK, Liste[Trigger.deviceID].IcoNOK) else --sinon (capteur pas utilisé) NotUsed(Trigger.deviceID) end elseif Trigger.type == "other" or Trigger.type == "autostart" then --pour chaque élément de la liste for id, _ in pairs(Liste) do NameID = api.get("/devices/"..Liste[id].id).name --trouve le nom du VD TestGlobal(Liste[id].id) if Liste[id].active == 1 then -- si la plante/capteur est actif UpdateVD(Liste[id].id, NameID, Liste[id].IcoOK, Liste[id].IcoNOK) --appel de la fonction avec l'ID et le nom else --sinon (capteur pas utilisé) NotUsed(Liste[id].id) end end end Voici le debug : Explication : Cette scène est lancée à chaque changement d'un label d'un VD (Déclaré dans les Trigger). Donc lorsque le script Jeedom est exécuté (toutes les 29 minutes). Bien entendu si les données de la plante ont changé !! Elle est aussi lancée au démarrage de la HC2 (%%autostart) avec son bout de code qui va bien dans la section Main. Je passe par une variable "liste" sous forme de tableau pour faciliter l'écriture du code. Cette variable, contient l'ID des VD des plantes, l'ID des icônes OK / NOK ainsi que le paramètre "active" (voir fonction NotUsed). Après avoir récupéré le nom de la plante (nom du VD – section Main), je teste l'existence des VG nécessaires. Fonction TestGlobal() : VG HumPlante = consigne d'humidité VG DatePlante = date de la dernière notification d'alerte (pour avoir qu'une seule alerte par jour en cas de besoin d'arrosage, et non à chaque mise à jour du label du VD) Si les 2 variables, HumPlanteXXX et DatePlanteXXX (où XXX est l'ID du VD), n'existent pas, elles sont créées avec comme valeur par défaut : 20 pour HumPlante et "" DatePlante. Donc en tout ça fait 2 VG par plantes (soit pour moi actuellement 24 VG…) Fonction UpdateVD() : Rien de particulier sur cette fonction. Elle décode le contenu Json du label "FromJeedom" et envoie les données dans chaque label du VD. D'où l'importance d'avoir nommé les labels (Hum, Frt, Bat, …). Quand la fonction arrive au label "Hum", une fonction Alerte est appelée. Fonction Alerte() : Simple, si le taux d'humidité est inférieur à la consigne, alors je change l'icône du VD (ID mémorisé dans la variable "Liste") et je vérifie le VG DatePlanteXXX. Si j'ai la même date qu'aujourd'hui dans la VG, c'est que l'alerte a déjà été faite. Sinon je créé l'alerte par mail et met à jour la date dans la VG. Vous aurez compris que les alertes tombent la nuit essentiellement Fonction NotUsed() : Cette fonction permet de désactiver un VD (plante qui meurt, ou capteur HS). Il suffit de mettre 0 dans le paramètre "active" de la variable Liste. 4. Conclusion : Ce système fonctionne très bien depuis plusieurs mois. L'interaction Jeedom->HC2 ne pose pas de problème. On connait la stabilité de la HC2... je dois dire que Jeedom est assez stable aussi. De temps en temps, une antenne (local ou supplémentaire) bluetooth perd la boule, alors un petit reboot de la Jeedom est nécessaire. Lors de j'ajout d'une plante : Je commence par intégrer le capteur dans Jeedom. Ensuite j'ajoute le requête au script. Ensuite je crée les icones Puis je crée le VD dans la HC2 (je duplique simplement un existant en modifiant les icones) (le VD ne fonctionnera pas tout de suite car les VG ne sont pas encore crées...) Et pour finir j'ajoute dans la variable "liste" de la scène une ligne identique aux autres avec le nouvel ID du nouveau VD et les nouvelles icones. et c'est parti... A cause du nombre de plantes, donc de requêtes effectuées par le script Jeedom, j'ai de temps en temps une alerte sur la HC2 qui me dit "Too many instance" de la scène Mi-Flora (pourtant réglé avec le nombre d'instance max soit 10). Cela est normal car si j'ai 11 plantes qui changent leurs données en même temps, cela fait 11 lancements de scène !!!! Pour régler ce problème, je vais diviser mon script Jeedom en 2 (le lancement différé de la requête (paramètre Timeout) ne semble pas fonctionné). Soit 6 requêtes par script et décaler le moment exécution vers la HC2. De cette manière jamais j'aurai plus de 10 requêtes envoyées en une fois à la HC2, donc jamais plus de 10 scènes exécutées simultanément. Je n'exploite pas les autres données (Fertilisant, Température, …) Attention aux plantes dans les grands pots (le capteur ne plonge pas jusqu'en bas !!!). Du coup, je règle la consigne d'humidité dans les VD à l'usage (entre 20 et 25%). Cela m'a permis de me rendre compte qu'une plante était en excès d'eau (80 % d'humidité). Je ne l'ai plus arrosé depuis des semaines… le taux baisse petit à petit, et la plante se porte de mieux en mieux. EDIT : Pour les intéressés : voici le VD à télécharger : (il suffit de renommer son nom et de mettre les bons ID des icones.) : Bambou.vfib et la scène : (mettre à jour l'ID du VD et des icones) : Scene-36-ID199-MiFLora.txt Les icones de mes plantes sont dans une galerie : Galerie Plantes Vertes (je la compléterai petit à petit) -
net.HTTPClient contourner l'asynchrone c'est possible ?
jjacques68 a répondu à un(e) sujet de jjacques68 dans HC2
YES @pepite !!!! nickel !!! function TestGlobal(id) local vg = api.get("/globalVariables/"..id) if vg == nil or "" then --nouvelle variable newVar = {} newVar.name = id newVar.value = "0" api.post("/globalVariables", newVar) end end merciiiiiii !!!! @Nico, si tu parles des mi flora, ils sont toujours en vente... Je vais faire un petit tuto pour mon installation avec les mi flora... -
net.HTTPClient contourner l'asynchrone c'est possible ?
jjacques68 a répondu à un(e) sujet de jjacques68 dans HC2
@pepite faut que je teste, mais on est d'accord je suis dans une scène avec mon code là ! @Sakkhho je te mettrai un screenshot pas de soucis, et oui j'en ai un à l'extérieur, tant que tu es à porté du Bluetooth... Mais la tout de suite faut que je tire 2 câbles Ethernet de la cave aux combles merci !! -
bonjour à tous, question de programmation pure et dure Je suis confronté à un problème plutôt bloquant me concernant. Dans une scène (gestion de 12 mi-flora avec VD, consignes d'humidité, alertes mail, ... bref), je souhaite créer des variables globales dynamiquement. j'utilise pour cela ce bout de code (simplifié), qui marche très bien, placé dans une fonction : function TestGlobal(id) local http = net.HTTPClient() if fibaro:getGlobal(id) == nil then --si pas de VG --nouvelle variable newVar = {} newVar.name = id newVar.value = "0" http:request("http://127.0.0.1:11111/api/globalVariables", { options = {method = 'POST', data = json.encode(newVar)}, success = function(response) print("Création de la variable "..id) end, error = function(response) print("Error: " ..response) end, }) end end MAIS cette fonction est appelée en premier, pour ensuite exécuter d'autres fonctions utilisant justement les VG créées. Et bien ça marche pô ! Si j'analyse bien mon script complet, les VG ne sont même pas créées !!!! J'ai pas le print du success !!!! ni celui du error... pourquoi ???? Et le plus dingue, c'est que si je n'exécute pas les fonctions qui suivent, celle de la création de VG fonctionne très bien, les VG sont alors crées !!! d'après mes recherches et essais cela viendrait du mode asynchrone de l'execution du net.HTTPClient. Mais alors comment le contourner ??? J'ai déjà été confronté à ce genre de soucis, que j'ai pu contourner en imbriquant les net.HTTPClient , mais le code devient très illisible et compliqué. (exemple pour des scènes qui gère la patrouille de caméras, 7 positions PTZ déterminées = 7 net.HTTPClient qui s'imbriquent ) Mais la clairement dans ma scène actuelle, je ne peux pas faire ce genre d'emboitement. Merci pour votre aide !!
-
désolé j'ai pas la réponse, mais je suis curieux de savoir également...
-
Tuto HC2 Module Virtuel "hc2 - Diagnostics"
jjacques68 a répondu à un(e) sujet de razowski dans Tutoriels
merci @sebcbien, j'ai pris les codes du reboot /shutdown -
Topic unique Fibaro - Motion Sensor - Fgms-001
jjacques68 a répondu à un(e) sujet de Moicphil dans Modules Fibaro
alors moi j'ai fait simple : 1 scène pour tous, enfin presque car les capteur Philio PSP05-C ont moins d'option que les FGMS, donc je les laisse à part... --[[ %% properties 378 value 322 value 313 value 298 value %% events %% globals --]] --[[ - Essai de scène pour gérer tous les éclairages intérieurs par PIR - Je ne fais pas d'association directe entre les modules - La marche forcée se gère grâce au VD Mode Eclairage 383 - Ne tient pas compte du capteur Philio PSP05 car trop différent (donc scène a part) - Doit faire la différence entre les type d'actionneur (FGS ou IPX) --]] local Device = { --ID_PIR = {ID_actionneur, VG_Mode éclairage} [378] = {ID = 374, VG = "ModeEclDebarras"}, [322] = {ID = 318, VG = "ModeEclWc"}, [313] = {ID = 311, VG = "ModeEclSdB"}, [298] = {ID = 296, VG = "ModeEclEsacalier"}, } local Trigger = fibaro:getSourceTrigger() --si mode manu (VD 383) on sort. if tonumber(fibaro:getGlobalValue(Device[Trigger.deviceID].VG)) == 0 then fibaro:abort() end --si PIR = ON if tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 then --actionneur = FGS if fibaro:getType(Device[Trigger.deviceID].ID) == "com.fibaro.binarySwitch" then fibaro:call(Device[Trigger.deviceID].ID, "turnOn") --tempo while tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 do end fibaro:call(Device[Trigger.deviceID].ID, "turnOff") --actionneur = IPX elseif fibaro:getType(Device[Trigger.deviceID].ID) == "virtual_device" then fibaro:call(Device[Trigger.deviceID].ID, "pressButton", 1) --tempo while tonumber(fibaro:getValue(Trigger.deviceID, "value")) == 1 do end fibaro:call(Device[Trigger.deviceID].ID, "pressButton", 2) --si pas le bon actionneur else print("Type Device = "..fibaro:getType(Device[Trigger.deviceID].ID)) end end pour le moment ça semble bien fonctionner, pas de latence... à voir à l'usage... -
Tuto HC2 et HCL Hc2 Toolkit Application V1.3.2.0
jjacques68 a répondu à un(e) sujet de Krikroff dans Tutoriels
je viens de revérifier, autant pour moi... désolé... Je cliquais sur "Export All" qui me créait des fichier XML... au lieu de cliquer comme d'habitude sur "Enregistrer tous les codes LUA des scènes" qui me créé les fichier TXT. Tout est ok d'ailleurs faut-il mieux sauvegarder ses scènes en .txt ou en .XLM ?- 478 réponses
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
Topic unique Fibaro - Motion Sensor - Fgms-001
jjacques68 a répondu à un(e) sujet de Moicphil dans Modules Fibaro
Ce sera moi On peut pas mettre les VD en widget, en tout cas sur IPhone bien dommage... -
Tuto HC2 et HCL Hc2 Toolkit Application V1.3.2.0
jjacques68 a répondu à un(e) sujet de Krikroff dans Tutoriels
Dites c'est normal que quand on télécharge les scènes y a du code avant et après la scène qui apparait ? on dirait les propriétés de la scène ou d'un module... y avait pas ça avant !- 478 réponses
-
- tuto hc2 et hcl
- toolkit
- (et 4 en plus)
-
Topic unique Fibaro - Motion Sensor - Fgms-001
jjacques68 a répondu à un(e) sujet de Moicphil dans Modules Fibaro
Bon alors j'ai fait simple, parce que ça commence à me prendre la tête ces histoires d'associations, marche forcée, latence... j'ai créé un VD avec autant de bouton manu/auto que de FGMS servant à allumer l'éclairage. chaque détecteur possède sa VG : ModeEclXxxxxx (valeur 1 ou 0) Les boutons du VD changent la valeur de ces VG. Dans les scènes (ultra simples) lorsqu'il y a détection, je teste cette VG et si "mode auto" alors allume avec la tempo du FGMS (paramètre 6 si mes souvenir sont bon) et sinon : RIEN (pour allumer il faut aller à l'inter). J'ai mis un AutoOff à 1 heure sur les FGS au cas où le FGMS déconne. En réalité après test, la différence de latence entre l'association directe et passer par une scène, est quasi nulle (après avoir simplifier les codes LUA). Maintenant je me demande si je vais pas faire une scène unique qui me gère tous les éclairage avec FGMS au lieu d'en avoir une par pièce... vous en pensez quoi ? vaut mieux une scène unique ou plusieurs petites ? -
oui en effet
-
Ah ok vu comme ça je restais bloqué sur des fonctions je sais pas pourquoi Envoyé de mon iPhone en utilisant Tapatalk Pro
-
Vous savez si cette assistant a un port RJ45 ? Ou c'est que du wifi ? Je pense connaître la réponse mais j'ai rien trouvé sur google
- 1 289 réponses
-
- topic unique
-
(et 1 en plus)
Étiqueté avec :
-
Bonjour à tous, J'ai un algorithme casse-tête : Je souhaite dans une scène, qui peut être déclenchée par plusieurs VG, exécuter une fonction. La fonction à exécuter est différente suivant le nom de la VG qui fait le déclenchement... Voilà ce que j'ai fait, ça marche mais je trouve ça hyper compliqué !!!!! pour ce que c'est... y a pas moyen de simplifier ?? --[[ %% properties %% events %% globals VG1 VG2 --]] local Trigger=fibaro:getSourceTrigger() --variable Objet contenant les fonctions local Objet = { VG1 = function (self) print("Fonction pour la VG1") end, VG2 = function (self) print("Fonction pour la VG2") end, } --variable contenant les Trigger et les actions associées local VGTrigger = { ["VG1"] = Objet:VG1(), ["VG2"] = Objet:VG2(), } --execution de la fonction pcall(VGTrigger[Trigger.varName]) merci à vous !!!
-
Topic unique Fibaro Fgs-221 / Fgs-222 "relay Switch 2X1,5Kw"
jjacques68 a répondu à un(e) sujet de Yohan dans Modules Fibaro
y en a d'autre que la météo fait travailler- 564 réponses
-
Topic unique Fibaro Fgs-221 / Fgs-222 "relay Switch 2X1,5Kw"
jjacques68 a répondu à un(e) sujet de Yohan dans Modules Fibaro
Hello ! Rapide question qui a déjà sans doute été posé : vous avez déjà remarqué un très léger bruit (comme un sifflement ou grésillement) quand le FGS-222 est sous tension ? merci !- 564 réponses
-
Oups !!! Je viens de me rendre compte de ma conn.... y a pas de mouvement sur cette caméra... Désolé, mais ces lignes ne servent à rien du coup... Me suis trompé de modèle désolé...
-
Sécuriser l'arrivée d'eau et contrôler sa consommation
jjacques68 a répondu à un(e) sujet de jjacques68 dans Tutoriels
Exact, mais je n'en ai pas [emoji45] Envoyé de mon iPhone en utilisant Tapatalk Pro -
Sécuriser l'arrivée d'eau et contrôler sa consommation
jjacques68 a répondu à un(e) sujet de jjacques68 dans Tutoriels
ah oui les icones des VD... voilà c'est fait... -
Sécuriser l'arrivée d'eau et contrôler sa consommation
jjacques68 a répondu à un(e) sujet de jjacques68 dans Tutoriels
oui oui tête reposée avec une bière -
Sécuriser l'arrivée d'eau et contrôler sa consommation
jjacques68 a répondu à un(e) sujet de jjacques68 dans Tutoriels
bonne chance -
bon voilà j'ai essayé d'expliquer mon installation... dans Chauffage et Energie -> Tutoriels https://www.domotique-fibaro.fr/topic/10860-sécuriser-larrivée-deau-et-contrôler-sa-consommation/#comment-167007
-
Bonjour, voici comme convenu le détail de mon installation sur la gestion de l'eau. Cette installation a pour but d'apporter une certaine sécurité par rapport aux risques de fuites d'eau dans la maison. Je l'utilise aussi pour effectuer un suivi de consommation très proche de la réalité (comparé avec les factures d'eau de notre amie la comcom). Cela fait maintenant plus d'un an que ça tourne, et j'en suis plutôt satisfait. Je n'ai rien inventé de neuf. Je me suis très largement inspiré des articles et idées présent sur ce forum et je remercie tous ceux qui m'ont permis d'aboutir à cette installation. Les 2 dernières scènes sont assez piquées et ne correspondent pas trop à la réalité du terrain. Donc on peut les oublier, elles ne sont pas indispensables... C'est avec grand plaisir que je prends toutes les éventuelles améliorations que vous pouvez apporter. Alors voici le détail de mon installation : Le matériel Les branchements La configuration IPX La configuration HC2 Les Virual Device Les Scènes Les bugs connus Conclusion 1. Le matériel : 1 compteur à impulsion marque GIOANOLA 1 pulse / 0.25 l (1 litre = 4 pulses) 1 vanne motorisé marque WillTec DQ220 2 voies /220 V AC 1 IPX (800 dans mon cas) 1 entrée digitale de libre pour recevoir le compteur. 1 relais de libre pour commander la vanne. 1 Disjoncteur pour la vanne (en option) 1 contacteur pour relayer l'alimentation de la vanne 2. Les branchements : Légende de la Vanne : L = phase Vanne fermée K = phase Vanne ouverte N = neutre (il se peut, suivant les modèles que le L et K soient inversés) La vanne garde son état en cas de coupure de courant. Elle peut être manipulée manuellement en dévissant la commande et en actionnant la bille à l’aide d’une pince. Branchement sur l’IPX : La sortie NC (N°1) correspond à Vanne fermée. La sortie NO (N°3) correspond à Vanne ouverte. Conséquence : La sortie de l’IPX doit toujours être actionnée pour maintenir la vanne ouverte. Fermeture de la vanne si l’IPX est éteint/en panne. (C’est un choix… on aurait pu inverser la logique…) (Option que j’ai installée) Un contacteur peut être installé sur la sortie de l’IPX afin que la vanne soit alimentée par le contacteur et non par le relais de l’IPX. En réalité, toutes mes sorties (NO) de l’IPX actionnent un relais différent de type contacteur Jour/Nuit. Les électriciens du forum sauront mieux que moi l'expliquer... 3. Configuration IPX : edit : attention certains antivirus empêchent l'accès à l'IPX, il faut donc le désactiver avant d'y accéder... Pour que les impulsions envoyées sur l'input soient comptées, il faut assigner l'input à un compteur. Il faut simplement éditer les entrées et assigner l'entrée voulue à un compteur (ex 1 dans mon cas). Ensuite, à chaque impulsions envoyées, je transmets le compteur dans un VD de la HC2. (voir chapitre sur les VD) Cela se paramètre dans les notifications Push de l'IPX : Commande : /api/callAction?deviceID=329&name=setProperty&arg1=ui.Water.value&arg2=$C1 Server = IP de la HC2 Login = user:password 329 = l'ID du VD Water = nom du label recevant le compteur $C1 = valeur du compteur 1 Remarque sur le login : L'utilisateur principal de la HC2 possède un login avec une adresse mail. Il est impossible de saisir le couple mail:password dans le champ login de l'IPX car il y a trop de caractères. J'ai donc créé un nouvel utilisateur sur la HC2 par exemple UserIPX, avec un mot de passe classique et donné les droits d'accès au VD utilisé par la commande push ci-dessus (dans mon cas 329). 4. Configuration HC2 J'utilise des variables globales (VG) pour mémoriser les différentes valeurs de consommation. IndexEauJour = conso du jour d'avant IndexEauSemaine = conso de la semaine dernière IndexEauMois = conso du mois dernier IndexEauAnnee = conso de l'année dernière IndexEauTotal = conso total (c'est l'index du compteur de l'IPX = compteur d'eau) LastEauConso = donne la dernière conso réalisée LastEauDebit = donne le débit EauHeure1 = pour le calcul du débit EauHeure2 = pour le calcul du débit EauHeure2H = pour la détection de petites fuites EauHeure12H = pour la détection de petites fuites 5. Les Virtual Device VD EV Générale : Ce VD me permet de piloter l'électrovanne manuellement. Et c'est le bouton OFF qui sera actionné si une fuite est détectée. Code du bouton ON : local ip_module = fibaro:get(fibaro:getSelfId(),"IPAddress") HC2 = Net.FHttp(ip_module) HC2:setBasicAuthentication("admin", "xxxxxxx") response = HC2:GET("/preset.htm?set6=1") Code du bouton OFF : local ip_module = fibaro:get(fibaro:getSelfId(),"IPAddress") HC2 = Net.FHttp(ip_module) HC2:setBasicAuthentication("admin", "xxxxxxxx") response = HC2:GET("/preset.htm?set6=0") Code de la mainLoop : --affiche l'icone au démarrage de la HC2 avec retard de 1 min pour soulager les actions au reboot fibaro:sleep(60*1000) --connesxion ipx800 local ip_module = fibaro:get(fibaro:getSelfId(),"IPAddress") HC2 = Net.FHttp(ip_module) HC2:setBasicAuthentication("admin", "xxxxxxxxxx") --récipération de l'état des sortie response = HC2:GET("/api/xdevices.json?cmd=20") response = json.decode(response) --fibaro:debug(response) --affecte les icones en fonction du relais 6 if response.OUT6 == 1 then fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 151) else fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 152) end fibaro:abort() Explication : edit : j'ai oublié de préciser qu'il fallait renseigner dans l'onglet général, l'IP et le port de connexion à l'IPX... Rien de particulier à dire pour le ON/OFF. Pour le mainLoop, ce code n'est là que pour afficher la bonne icone du VD au démarrage de la HC2. (car on le sait, défois les icones ont tendance à se faire la belle…). Donc je teste l'état de la sortie de l'IPX et affiche la bonne icone. La minute de retard est pour soulager les reboot de la HC2, car sinon tous les code se mettent en route et j'imagine que cela n'est pas très bon pour notre précieuse box… à méditer… en tout cas ça marche IPX_GetIn : Comme précisé, j'ai un VD qui reçoit la valeur du compteur. Très simple celui-ci possède un label nommé Water. L'IPX envoit grâce à la commande push la valeur du compteur que l'on voit ici à 261062. Il s'agit du nombre de pulsations envoyé par le compteur Gioanola. A chaque pulsation du compteur, ce label est mis à jour. Sachant que le compteur envoit 1 puslation chaque 0.25 l… on comprend vite q'il ne sera pas difficile d'exploiter ces données… Ce Label "Water", sera le déclencheur de scénarios. Le seul code présent dans ce VD est celui permettant d'afficher l'icone du VD au boot de la HC2 : -- affiche l'icone au démarrage fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 1056) --on arrête la boucle du script fibaro:abort() Remarque: L'autre label nommé "Alarme" est un autre compteur me permettant de suivre le fonctionnement de mon alarme. Compteur Eau : Ce VD est plus complexe que le précédent. Il affiche toutes les infos de consommation. Le tarif est approximatif et se base sur les précédentes factures d'eau… Le label "Total" est la consommation total depuis qu'est installé le système. Voici le code présent dans le mainLoop : --affiche la bonne icone fibaro:call(fibaro:getSelfId(), "setProperty", "currentIcon", 150) --variables locales local currentDate = os.date("%H:%M") local Jour = tonumber(os.date("%d")) --du 1 au 31 local Semaine = tonumber(os.date("%w")) --du 1 au 7 local Mois = tonumber(os.date("%m")) --du 1 au 12 local Index = fibaro:getGlobal("IndexEauTotal") local conso = 0 local prix = 0 local tarif = 3.7127 --TTC 1er semestre 2016 --Debit Live---------------------------------------------------------------------- conso = fibaro:getGlobal("LastEauDebit") prix = "- "..string.format("%.2f", (conso/1000)*tarif).." €/min" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelDebit.value", string.format("%.2f",conso).." l/min "..prix) --LAST Eau Conso------------------------------------------------------------------- conso = fibaro:getGlobal("LastEauConso")/4 prix = "- "..string.format("%.2f", (conso/1000)*tarif).." €" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelLast.value", string.format("%.2f",conso).." l "..prix) --TOTAL----------------------------------------------------------------------------- conso = math.floor(Index/4)/1000 prix = "- "..string.format("%.2f", conso*tarif).." €" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelTotal.value", conso.." m3 "..prix) --JOUR Initialise à 00h00---------------------------------------------------------- conso = (Index-fibaro:getGlobal("IndexEauJour"))/4 if currentDate == "00:00" then fibaro:setGlobal("IndexEauJour", Index) end prix = "- "..string.format("%.2f", (conso/1000)*tarif).." €" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelJour.value", conso.." l "..prix) --SEMAINE Initilaise le lundi à 00:01 conso = math.floor((Index-fibaro:getGlobal("IndexEauSemaine"))/4)/1000 if Semaine == 1 and currentDate == "00:01" then fibaro:setGlobal("IndexEauSemaine", Index) end prix = "- "..string.format("%.2f", conso*tarif).." €" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelSemaine.value", conso.." m3 "..prix) -- MOIS Initialise le 1er du mois à 00:02-------------------------------------------- conso = math.floor((Index-fibaro:getGlobal("IndexEauMois"))/4)/1000 if Jour == 1 and currentDate == "00:02" then fibaro:setGlobal("IndexEauMois", Index) end prix = "- "..string.format("%.2f", conso*tarif).." €" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelMois.value", conso.." m3 "..prix) --ANNEE réinite le 01 janvier à 00:03------------------------------------------------- conso = math.floor((Index-fibaro:getGlobal("IndexEauAnnee"))/4)/1000 if Jour == 1 and Mois == 1 and currentDate == "00:03" then fibaro:setGlobal("IndexEauAnnee", Index) end prix = "- "..string.format("%.2f", conso*tarif).." €" fibaro:call(fibaro:getSelfId(), "setProperty", "ui.LabelAnnee.value", conso.." m3 "..prix) Explications : La mainLoop tourne en boucle toutes les 4-5 secondes, on le sait… Nous verrons dans les scènes, que à chaque impulsion envoyée par l'IPX, la VG "IndexEauTotal" est mise à jour. Donc cette VG contiendra toujours l'index réel de mon compteur d'eau. Alors à chaque boucle : Je relève la VG "IndexEauTotal" et j'applique quelques règles de calculs. Par exemple pour la conso du jour : je prends l'index total actuel de la VG "IndexEauTotal" auquel je soustrais l'index du jour dernier VG (IndexEauJour) Je divise par 4 (car 1 litre = 4 pulsations) ce qui me donne le nombre de litre du jour en cours. Pour le tarif, je divise les litres par 1000 (car le tarif est donné en €/m3) et je multiplie par la variable locale "tarif". Celle-ci peut être modifié à souhait (ce que je devrait faire entre autre…) Au passage tout les jours à minuit, je mémorise dans la VG "IndexEau Jour", l'index total en cours pour renouveler l'opération le lendemain et donc recommencer à 0. Idem pour la semaine (reset le lundi à minuit), le mois (reset le 1er à minuit) et l'année(reset le 01/01 à minuit). Pour le débit (LastEauDebit) et la dernière conso (LastEauConso) nous verrons cela dans les scènes. 6. Les Scènes : Pour les scènes, j'ai une scène "Scene Eau", déclenchée par le changement de valeur du Label Water du VD IPX_GetIn (je le rappelle : qui change à chaque pulsation du compteur) Cette scène déclenche les autres scènes : La scène "Scene Eau" : --[[ %% properties 329 ui.Water.value %% events %% globals --]] --[[ Scène lancée lorsque le label du VD 329 change (compteur IPX). elle mémorise l'index Total du compteur d'eau. elle lance, si pas d'autre instance : -Détection de grosses fuites -Calcul de la conso acutelle -Calcul du débit -Détection de petites fuites --]] local LabelValue if fibaro:countScenes() > 1 then fibaro:debug("Trop d'appels") fibaro:abort() end --mémorise l'index du compteur d'eau dans une VG LabelValue = tonumber(fibaro:getValue(329, "ui.Water.value")) if tonumber(fibaro:getGlobalValue("IndexEauTotal")) ~= LabelValue then fibaro:setGlobal("IndexEauTotal", LabelValue) end --lancement scène détection grosse fuite si pas arrosage en cours if fibaro:countScenes(111) == 0 and fibaro:getGlobal("ArrosageEnCours") == "0" then fibaro:debug("Lancement GrosseFuite") fibaro:startScene(111) end --lancement scène EauConso if fibaro:countScenes(108) == 0 then fibaro:debug("Lancement EauConso") fibaro:startScene(108) end --lancement scène EauDebit if fibaro:countScenes(109) == 0 then fibaro:debug("Lancement EauDebit") fibaro:startScene(109) end --lancement scène PetiteFuite if fibaro:countScenes(130) == 0 then fibaro:debug("Lancement PetiteFuite") fibaro:startScene(130) end Explications : On voit que le Trigger de la scène est donc bien le label Water du VD 329. Le premier rôle de cette scène est de mémoriser l'index d compteur dans la VG "IndexEauTotal". Pour le lancement de la scène "Grosses fuites", je vérifie également l'état d'une variable "ArrosageEnCours" car je ne veux pas que la détection de grosses fuites se lance si j'arrose le jardin (cela peut prendre plus de temps que prévu…) Rien d'autre de particulier à expliquer, le code est facilement compréhensible je pense… La scène "Grosse Fuite" : --[[ %% properties %% events %% globals --]] --[[ Scène de détection de grosses fuites Lancée par la scène SceneEau Elle-même lancée lorsque qu'ipx reçoit une impulsion du compteur --]] if fibaro:countScenes() > 1 then fibaro:abort() end local Delai = 15 --délai en minute avant alerte (= aussi nombre de boucle) local jsonResponse -- reçoit l'index du compteur local FirstIndex = 0 --index de référence local NextIndex = 0 --Index relevé à chaque boucle local NbLoop = 1 --compteur de boucle --function de détection function ReadIndex() print("boucle "..NbLoop) --1ère boucle on relève le premier index = référence if NbLoop==1 then FirstIndex = fibaro:getGlobal("IndexEauTotal") --pour les boucles suivantes elseif NbLoop <= Delai then --si on est pas au délai maximum NextIndex = fibaro:getGlobal("IndexEauTotal") --index relevé if NextIndex > FirstIndex then --si index > reference print("Index SUP") FirstIndex=NextIndex --on change la reference avec nouvel index else --sinon c'est qu'il n'y a plus de consommation print("Fin - pas de fuite") fibaro:abort() -- on sort si pas supérieure end --si on est au supérieur au délai : elseif NbLoop > Delai then print("Grosse Fuite détectée") --coupure d'EV général via le VD 155 (EV général via IPX) fibaro:call(155, "pressButton", "2") print("Fermeture EV générale") --envoi message push sur iphone fibaro:call(fibaro:getGlobal("IdPhoneJJ"), "sendPush", "Alerte Grosse fuite d`eau ! Fermeture automatique EV Générale") --envoi d'une notif d'alerte sur l'aplication HomeCenter.PopupService.publish({ title = "Alerte", subtitle = os.date("Le : %x à %X"), contentTitle = "Alerte fuite d'eau !", contentBody = "Grosse fuite d'eau détectée ! Fermeture automatique EV Générale", type = "Critical" }) --configure variables pour Notif Prowl fibaro:setGlobal("ProwlPriority", 1) fibaro:setGlobal("ProwlApplication", "Home%20Center") fibaro:setGlobal("ProwlEvent", "Alerte") fibaro:setGlobal("ProwlDescription", "Alerte%20:%20Grosse%20fuite%20eau%20détectée%20!%20Fermeture%20automatique%20EV%20Générale.") fibaro:call(118, "pressButton", "1") --envoi la notif via le VD PushProwl fibaro:abort() --on sort end NbLoop=NbLoop+1 --incremente la loop setTimeout(ReadIndex, 60*1000) --temps d'attente 1 minute end --appel de la function print("Lancement détection grosses fuites") ReadIndex() Explication : Cette scène est donc lancée par la scène "Scene Eau". Il ne peut y avoir qu'une seule instance de cette scène. Je mémorise l'index au démarrage "FirstIndex", et à chaque boucle (temps entre chaque boucle fixé par le setTimeout) je vérifie l'index en cours "NextIndex". Si l'index en cours est supérieur, c'est qu'on consomme de l'eau. Je continue donc mon bouclage pendant une durée fixée par la variable "delai". Si je dépasse le "delai" alors on ferme l'électrovanne (via le bouton OFF du VD) + notification push + notification prowl… Après ? ben y a plus d'eau , donc en gros la douche ne doit pas dépasser 15 min … sinon faut chercher le téléphone et actionner manuellement le bouton ON du VD… (plein de savon et à poils) Bien sûr les 15 minutes sont modifiables par la variable "delai". Je rappelle que cette scène ne se lance pas si l'arrosage du jardin est enclenché. Aucun soucis avec les machines à laver ou lave-vaisselle (ils ne consomment pas pendant 15 min non-stop !!) La scène "EauConso" : --[[ %% properties %% events %% globals --]] --[[ Scène de calcul de la conso actuelle Lancée par la scène SceneEau Elle-même lancée lorsque qu'ipx reçoit une impulsion du compteur --]] if fibaro:countScenes() > 1 then fibaro:abort() end local DepartIndex = 0 local FirstIndex = 0 local NextIndex = 0 local NbLoop = 1 --function pour les calculs function ReadIndex() print("NbLoop= "..NbLoop) if NbLoop==1 then FirstIndex = fibaro:getGlobal("IndexEauTotal") --1er index de référence DepartIndex = FirstIndex --Index pour le calcul total de la conso end NextIndex = fibaro:getGlobal("IndexEauTotal") --index relevé à chaque boucle if NextIndex > FirstIndex then --si index de chaque boucle > reference FirstIndex=NextIndex --on change la reference avec nouvel index NbLoop=1 --remise à 1 de la Loop end if NbLoop == 4 then --au bout de 3 loop sans conso on sort print("Fin détection") --memorise la conso de litre dans une variable pour affichage dans VD fibaro:setGlobal("LastEauConso", NextIndex-DepartIndex) print("conso = "..((NextIndex-DepartIndex)/4).." litres") --mise à zero du debit fibaro:setGlobal("LastEauDebit", string.format("%.2f", "0.00")) fibaro:abort() end NbLoop=NbLoop+1 --incremente la loop setTimeout(ReadIndex, 5*1000) end print("calcul de la conso en cours...") ReadIndex() Explications : Le principe de base est d'afficher dans le VD "Compteur Eau" la dernière quantité d'eau consommée. Cette quantité d'eau calculée est stockée dans une VG "LastEauConso". Donc : Cette scène ressemble beaucoup à la précédente. J'ai un bouclage qui se fait toutes les 5 secondes (setTimeout). Je mémorise l'index de départ dans "DepartIndex". A chaque passage, je vérifie l'index en cours. Si l'index en cours est supérieur c'est qu'il y a de la consommation et je fais en sorte que la mesure continue (NbLoop=1 --remise à 1 de la Loop). S'il n'y a plus de consommation, on laisse 3 boucles tourner avant de mettre fin, de calculer et stocker la conso (fibaro:setGlobal("LastEauConso", NextIndex-DepartIndex) La précision de calcul est relativement correcte : à 0.25 litres prêt (logique, le compteur d'eau est 1 pulse / 0.25 ) La partie mise à zéro du débit est pour quand il n'y a plus de consommation, le débit est donc égal à 0. C'est ici que je le fais. La scène "EauDebit" : (ma logique commence à se compliquer ça devient un peu de la science-fiction…) Tout d'abord, je suis parti du principe que l'IPX risque de ne pas voir les pulsations du compteur envoyées sur son entrée si elles sont trop rapides (limitation de l'IPX ??? si si je vous jure que j'ai lu ça quelque part et il me semble qu'on en avait déjà parlé…) (D'où la question : faut-il pas mieux mettre un compteur 1 pulse / 0.5 l ???? – bref…) Après si on calcule rapidement : 1 pulse / seconde ça fait 0.25 l / seconde ce qui fait 15 litres / minutes !!! c'est énorme !!! Je ne sais pas si on atteint cela, même en ouvrant tous les robinets de la maison, à méditer, à tester… Donc je suis parti sur cette hypothèse dans ma scène de débit : 0.25 l par seconde. --[[ %% properties %% events %% globals --]] --[[ Scène de calcul du débit d'eau. APPROXIMATIF... bof... moyen le truc... Fonctionne avec 2 VG contenant une horaire. Lancée par la SceneEau donc à chaque changement du compteur Je pars du principe que la scène est lancée toutes les 1 secondes (= temps entre chaque pulse que voit l'IPX donc 0.25 litre / seconde) --]] local Heure1 = tonumber(fibaro:getGlobalValue("EauHeure1")) local Heure2 = tonumber(fibaro:getGlobalValue("EauHeure2")) local Debit = 0 local Diff = 0 --test des VG avant tout et modification si besoin if Heure2 == 0 and Heure1 == 0 then --si les heures sont à 0 (normalement impossible) fibaro:setGlobal("EauHeure1",os.time()) elseif Heure1 > 0 and Heure2 == 0 then --si heure2 est à 0 (après une longue pose) fibaro:setGlobal("EauHeure2",os.time()) elseif Heure1 > 0 and Heure2 > 0 then fibaro:setGlobal("EauHeure2",os.time()) --VG EauHeure2 a toujours l'heure à jour fibaro:setGlobal("EauHeure1",Heure2) --VG EauHeure1 prend la valeur de heure2 end --on récupère les VG Heure1 = fibaro:getGlobal("EauHeure1") Heure2 = fibaro:getGlobal("EauHeure2") --si Heure2 > Heure1 c'est donc qu'il y a de la conso if Heure2 > Heure1 then --remise à zéro de la conso fibaro:setGlobal("LastEauConso", 0) diff=os.difftime(Heure2, Heure1) --calcul de la différence de temps entre les 2 if diff > 60 then --trop long on arrête (Heure1 est trop éloigné de Heure2) fibaro:debug("dépassement des 60 s") fibaro:abort() else Debit=(0.25*60)/diff --calcul du débit (0.25 l / seconde avec une règle de 3) Debit = string.format("%.2f", Debit) fibaro:setGlobal("LastEauDebit", Debit) fibaro:debug("Debit = "..Debit.." litres/minute") end end Explications : On l'a compris, pour calculer le débit il faut une notion de temps. Je mesure la différence de temps entre les 2 VG EauHeue1 et EauHeure2, puis j'applique une règle de 3 (0.25 litre / seconde donc sur la différence Heure2 –Heure1 … bref c'est des math… Debit=(0.25*60)/diff) Cette scène ne me plait pas trop car je suis parti sur ces 0.25l / seconde… J'obtiens comme résultat du 15l/min ou 7,5l/min ou moins ça dépend de "diff". Ça reste : logique 15l/min car diff = 1 seconde ; 7,5 car diff = 2 ; ainsi de suite. C'est pas très proche de la réalité ça… Si vous avez une idée pour améliorer ça, je suis preneur… La remise à zéro de "LastEauConso" quand à elle, est logique, on ne peut pas afficher la dernière consommation pendant que l'on consomme !! La scène "PetiteFuite" : (alors là ... encore plus de la science-fiction ... ... ... la scène ne me donne pas les résultats voulus) Bon alors … faut comprendre ma logique… qui l'est pas je pense… Tout d'abord, le sujet de détection de petites fuites a déjà été abordé sur le fofo… sans résultats surprenant. Ce qu'il faut comprends c'est que pour dire qu'il y a une "petite" fuite quelque part, c'est que au moins 0.25 litre se sont échappés (1 pulse du compteur). Ça fait une sacré goutte d'eau ça !!! Donc c'est pas la taille de la goutte bien sûr qui compte, mais le temps entre 2 pulses du compteur. Donc pour mettre un système de surveillance, il faut attendre une seconde impulsion soit encore 0.25 l !!! Et jouer avec les temps entre les pulses. Attention voilà le code : --[[ %% properties %% events %% globals --]] --[[ scene de détection petite fuite déclenchée sur une impulson (dans la scène SceneEau) sur une période de 12 h, analyse si pas de pulse pendant 2 heures si c'est le cas on relance une période de 12h avec une période d'analyse de 2 heures, etc... (donc en gros le cycle des 12h est décalé toutes les 2 heures si pas de conso) si détecte une pulse, alors on relance le compteur de 2h mais pas celui des 12 heures. ]] --récupère l'heure courante local currentDate = os.time() --paramétrage des durées des cycles local LongTime = 12 local ShortTime = 2 --relevé des durées des cycles (venant des VG) local ShortCycle = fibaro:getGlobal("EauHeure2H") local LongCycle = fibaro:getGlobal("EauHeure12H") --nettoyage de la fenetre de debug local HC2 = net.HTTPClient() HC2:request("http://127.0.0.1:11111/api/scenes/130/debugMessages", { options = {method = 'DELETE'}, success = function(response) Main() end }) function Main() --si inférieure à ShortCycle (2h) on met à jour le ShortCycle mais pas le LongCycle (12h) if currentDate < tonumber(ShortCycle) then fibaro:setGlobal("EauHeure2H",os.time()+ShortTime*60*60) fibaro:debug("<BR><font color=red>N'a pas atteint les "..ShortTime.."h</font>".. "<BR><font color=yellow>Fin nouvelle période de "..ShortTime.."h le "..os.date("%d/%m/%Y - %H:%M",fibaro:getGlobal("EauHeure2H")).."</font>".. "<BR><font color=grey>Fin des "..LongTime.." h toujours le "..os.date("%d/%m/%Y - %H:%M",LongCycle).."</font>") else –on met à jour le LongCyscle (12h) fibaro:setGlobal("EauHeure2H",os.time()+ShortTime*60*60) fibaro:setGlobal("EauHeure12H",os.time()+LongTime*60*60) LongCycle = os.time()+LongTime*60*60 --met à jour la VL pour la comparaison suivante fibaro:debug("<BR><font color=green>Au dessus des "..ShortTime.."h</font>".. "<BR><font color=yellow>Fin nouvelle période de "..ShortTime.."h le "..os.date("%d/%m/%Y - %H:%M",fibaro:getGlobal("EauHeure2H")).. "<BR>Fin nouvelle période de "..LongTime.."h le "..os.date("%d/%m/%Y - %H:%M",fibaro:getGlobal("EauHeure12H")).."</font>") end --si on est après les 12h c'est que y a jamais eu de 2H sans pulse, c'est que y a fuite if currentDate > tonumber(LongCycle) then fibaro:debug("<BR><font color=red>Depassement des "..LongTime.." heures.</font>") fibaro:call(fibaro:getGlobal("IdPhoneJJ"), "sendPush", "Détection PETITE FUITE") fibaro:setGlobal("EauHeure2H",os.time()+ShortTime*60*60) fibaro:setGlobal("EauHeure12H",os.time()+LongTime*60*60) end end Explications : Tout est dans les commentaires en début de scène. Je n'actionne pas l'électrovanne si détection car je suis pas sûr de ce code. J'ai eu au maximum en un an 3 notifications sur mon tél. Et je n'ai pas de fuites chez moi enfin je crois. C'est tellement hasardeux en fonction de l'utilisation de la maison… Avis aux propositions !!!! Perso je pense qu'il faut tout simplement oublier l'idée de détecter les petites fuites. Ou alors comme disent certains, coupez l'eau quand on part en vacances… 7. Les bugs connus Le seul vrai bug dans tout ça, c'est l'IPX. Il m'est arrivé qu'il perde complètement la boule (lors de l'extinction ou panne de courant), et donc que le compteur d'eau soit erroné. C'est pas la fin du monde car il suffit de relevé le compteur d'eau manuellement et de multiplier par 4 le relevé (1 litre = 4 pulses) pour avoir le nombre de pulse total. Et ensuite saisir cette valeur dans l'IPX manuellement. Et c'est repartit… 8. Conclusions Mise à part le calcul du débit et la détection de petites fuites, tout fonctionne très bien. Mais cette histoire de pulses manquées par l'IPX reste présente à l'esprit. Je n'ai pas de différence entre la facture de la comcom et les relevé de la HC2 (en même temps la facture se base sur des m3, donc pas très précise…) Je pense qu'avec un compteur 1 pulse / 0.5 litre, ont aura une meilleur précision de relevé sur le long terme, après tout dépend aussi du débit qu'il y a à l'entrée de la maison. Voili, voilou... Si vous avez des questions, remarques, propositions, améliorations, ou autres, je suis preneur Voici les icones des VD...
-
Topic unique Fibaro - Motion Sensor - Fgms-001
jjacques68 a répondu à un(e) sujet de Moicphil dans Modules Fibaro
Je ne pourrais pas te dire... je sais pas... Moi la latence dont je parle est avec un FGMS est d'une seconde environ qui est acceptable je pense. Par contre lorsque j'actionne des lumières connectées avec un IPX ça passe à 1 voir 2 secondes... mais ça je pense que c'est normal, vu que l'on passe par des requêtes HTTP pour piloter l'IPX... et c'est bien dommage...
