Aller au contenu

Messages recommandés

Posté(e) (modifié)

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 :huh: 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 :

 

  1. Le matériel
  2. Les branchements
  3. La configuration IPX
  4. La configuration HC2
  5. Les Virual Device
  6. Les Scènes
  7. Les bugs connus
  8. Conclusion

 

1. Le matériel :

gioanola.png.c79e00fab6a804878dc76083819563a5.png

1 compteur à impulsion

marque GIOANOLA

1 pulse / 0.25 l (1 litre = 4 pulses)

 

vanne.jpg.596fdf7393595fafdc55619943f04dcd.jpg

1 vanne motorisé

marque WillTec DQ220

2 voies /220 V AC

 

ipx.jpg.c14013d88f5864c69c16c1d3971e2e3d.jpg

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 :

 

branchement.thumb.png.b8c83e77ce744ad580f83d12ec7aad51.png

 

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).

 

input1.png.a3516f8e5bb5a03af0265ee22ad22ac6.png

 

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 :

 

input2.png.3f6bf89575a57a3d66735256d39bae98.png

 

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.

 

EV.png.9f0fcb2a0e801d317628c7501e2cdd85.png

 

 

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 :P

 

IPX_GetIn :

 

Comme précisé, j'ai un VD qui reçoit la valeur du compteur.

 

IPX_GetIn.png.18cc710d25c9bc80800d3ee3df9cca37.png

 

 

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 :

 

CptEau.png.ad4eba2105abaf0cf74ae78ca2121142.png

 

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 :

scenes.png.25670eee561802628c74e3a9c0b4e418.png

 

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 :16:, 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 :P ç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 :15: ... ... ... 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 :13: :

--[[
%% 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 :mellow: 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… :2:

 

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...

compteur eau.png

ipx800counter.png

vanneOFF.png

vanneON.png

Modifié par jjacques68
  • Thanks 2
  • Upvote 7
Posté(e)

JJ, nickel, je vais mettre ça en place aussi justement. Mon second IPX est arrivé qui ira dans le local piscine, là-bas 2 pompes : Une pour la pompe à chaleur, une point alimenter la maison. Et ensuite le 3ème compteur pour l'arrivé SDEA aussi. Vais avoir du boulot. Celui de la SDEA, je vais le relier sur mon Ecodevice V2, comme ça la partie décompte sera automatique et les totaux journalier/mensuel etc sont fait automatiquement. Par contre je vais utiliser ta scène pour les 2 autres je pense.

 

D'ailleurs tu peux partager ton icône de la vanne WILTEC, j'ai les mêmes, merci :)

Posté(e)

Bravo et Merci pour le partage !

 

....en pleine construction.... Est il possible de m'indiquer les avantages et inconvénients si j'utilise un Ecodevice RT2 plutôt q'un IPX800 ?

 

EcodeviceRT2 est plutôt basé Comptage et l'IPX plutôt Automate il me semble ? un VD a t il déjà été réalisé pour EDRT2 .... ou un plugins :P

 

 

Posté(e)

et si je souhaite connecter les impulsions de mon compteur sur un FGBS ? ça marche, ou bien je risque de louper beaucoup d'impulsions suite à saturation du réseau z-wave ?

Posté(e)

Hum, moi je pense que tu peux en rater, surtout que le FGBS reste le module qui porte le moins bien niveau Zwave moi je trouve...

Posté(e)

oui, je confirme que c'est avec eux que j'ai le plus souvent des ratés. Je vais probablement investir du coup dans un IPX dans mon garage, et j'y mettrais les entrées actuelles de mes 5 FGBS en plus, ce qui fiabilisera l'ensemble de l'installation

  • 1 an après...
Posté(e)

Tu calcules bien : Tu ne paies pas la facture juste au bon moment pour qu'ils te coupent l'eau quand tu pars et tu règles pour qu'ils remettent quand tu reviens :)

  • Haha 1
×
×
  • Créer...