Compteur eau et détecteur fuite sur un GPIO pour 10€

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Répondre
Gaz
Messages : 224
Enregistré le : 17 oct. 2015, 10:30

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par Gaz »

Bonjour,
Je suis perdu dans les références des résistances, c'est du 1/4 de watt ou du 1 watt, carbone ou autre ?
Merci d'avance.
Bonne journée.

js-martin
Messages : 474
Enregistré le : 22 mars 2015, 22:08
Contact :

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par js-martin »

Des 1/4 de watt suffisent. Si tu as des 1/2 ou plus, ça marchera aussi...
Domotisation de : mes compteurs EDF, solaire, eau / mon alarme / ma Chaudière Viessamnn / mon congel / ma sonnette. Matériels : Pi2 - RFXTrx433e - Zwave+ Aeotec, ampoules Hue - Détecteur et prises Fibaro - Capteurs Oregon - présentation installation => lien

Gaz
Messages : 224
Enregistré le : 17 oct. 2015, 10:30

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par Gaz »

Merci de ton retour

toons
Messages : 11
Enregistré le : 10 avr. 2017, 08:18

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par toons »

Bonjour,

Un moyen d'économiser un fil entre le raspberry et le montage consiste à alimenter le 40106 en 5V (sa tension nominale) et de mettre un pont diviseur sur sa sortie pour respecter les 3.3V sur l'I/O de la raspberry

Gaz
Messages : 224
Enregistré le : 17 oct. 2015, 10:30

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par Gaz »

Bonjour.
Je suis bien arrivé jusqu'a l'étape du script python (eau.py), j'ai fait un chomod +x
mais lorsque que je le lance voila ce que cela fait :

Code : Tout sélectionner

pi@raspberrypi:~/domoticz/scripts/python $ chmod +x eau.py 
pi@raspberrypi:~/domoticz/scripts/python $ sudo ./eau.py
...
...
...
...
...
Et cela reste des heures en ajoutant simplement les ... à chaque ligne.

Par contre le setwatercounter.py fonctionne parfaitement.

Dans le doute j'ai ré-installé request

Code : Tout sélectionner

pi@raspberrypi:~ $ sudo apt-get install python-requests
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
python-requests est déjà la plus récente version disponible.
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  dc libasn1-8-heimdal libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal
  libkrb5-26-heimdal libroken18-heimdal libwind0-heimdal libxfce4ui-1-0
  xfce-keyboard-shortcuts
Veuillez utiliser « apt-get autoremove » pour les supprimer.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 21 non mis à jour.
Version de python :
Python 2.7.9 (default, Sep 17 2016, 20:26:04)

Mais toujours pareil, une idée ?
Merci d'avance.


EDIT : PB de config sur mon GPIO (j'ai pas pris le bon)

zorglub2029
Messages : 4
Enregistré le : 29 avr. 2017, 01:37

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par zorglub2029 »

Bonsoir à tous,

je suis nouveau ici et je suis tombé sur ce fil après une recherche. Ce qui est décrit ici est exactement ce que je veux faire et du coup, je me suis lancé pour des tests.

Je dois d'abord résoudre un problème, surmontable, j'espère :
Mon compteur est à l'extérieur de la maison, enterré, l'alimentation en eau passant dans un fourreau. Distance compteur-maison environ 2,5 m. J'ai tenté de faire passer un câble rigide depuis l'intérieur de la maison, mais je bloque à environ 1m, donc, c'est pas encore gagné de ce côté là.

En attendant, je me suis procuré les éléments (investissement 8 euros avec CNY70, le trigger, quelques cables et consommables divers).

Je possède déjà plusieurs raspberry. Je fais des tests avec un rasp qui ne sert pas, au final, je monterai le circuit sur un autre qui fait déjà les relevé edf, températures, etc

J'ai adapté le schéma en ajoutant l'alimentation du CNY70 depuis le raspberry (ça fait juste 4 fils qui vont vers le CNY70 et pas besoin d'alim externe).

Image

J'ai monté le circuit avec 10m de cable, histoire de coller au plus près au circuit décrit ici, je n'ai pas besoin d'autant de longueur mais au cas où
La bête :
Image

Relié au raspberry :
Image

Le CNY70 au bout de son cable (au passage, on voit la LED que j'ai monté sur un autre GPIO et que je déclenche dans le script python lors des essais):
Image

Fonctionnel :
Image

Pour simuler le compteur, j'ai collé un bout de papier alu sous le couvercle du boitier du rasp et le script python allume ou éteint la led en fonction du survol ou pas de ce papier alu. Je pense que l'épaisseur du boitier simule bien ce que je vais trouver sur le compteur.
Image

Le script très très très simplifié que j'utilise pour les essais (basé sur celui de js-martin, débarrassé de tout ce qui encombre :D ):

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO  # bibliotheque pour utiliser les GPIO
import time

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Choix du GPIO
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# On mesure le compteur d'eau sur le GPIO 22 pin 15
GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BCM)   # mode de numérotation des pins
GPIO.setup(22,GPIO.IN)   # GPIO 22 (pin 15) regle en entree
GPIO.setup(18, GPIO.OUT, initial=GPIO.LOW)


def Loop4(channel):
    GPIO.output(18, not GPIO.input(18))

GPIO.add_event_detect(22, GPIO.BOTH, callback=Loop4, bouncetime=100)

while True:
    time.sleep(5)

A noter enfin que j'ai fais des essais sans utiliser de trigger, juste le CNY70 monté à l'arrache sur le rasp et j'ai pas vu de différence dans mes essais, ça marche aussi très bien, mais après, en situation, sur le long terme, je suis pas spécialiste, je ne sais pas si ça peut marcher aussi.
Le schéma du montage (pas fait proprement celui là):
Image

Et le rasp en mode arrache, les résistances à l'air, bien dégueu :lol:
Image



Réflexion :
la distance de déclenchement entre le CNY70 et le papier alu, ça se joue en mm, on verra en situation sur le compteur, mais l'alignement risque d'être coton, mais comme j'ai une vis au milieu de compteur, je pense que je vais pourvoir bricoler un bras de fixation qui ne bougera pas et bien aligné.

Concernant les valeurs des résistances, j'ai bêtement copié ici, je n'ai aucune idée si ça doit être changé, adapté. Je connais les grands principes (mettre une résistance pour une led par exemple), mais après, dans les détails, l'électronique, c'est pas vraiment (du tout) ma partie, alors tout commentaire/correction est le bienvenu.

Voilà mes explorations de la soirée, en attendant bonne nuit (et merci js-martin pour le topic).

Gaz
Messages : 224
Enregistré le : 17 oct. 2015, 10:30

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par Gaz »

js-martin a écrit :une petite amélioration :

lorsqu'il n'y a pas de consommation d'eau, il ne se passe rien : Domoticz passe le widget en rouge car il n'y a pas de mise à jour. Du coup, s'il n'y a pas de consommation pendant une heure, on fait quand même une mise à jour du widget en ajoutant 0 litre ;)

il faut dans le While True,

ajouter ces lignes :

Code : Tout sélectionner

 # on met à jour le compteur incremental de Domoticz sans rien ajouter uniquement pour indiquer que la conso est nulle
          requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=udevice&idx='+str(dummy_idx['compteur_eau'])+'&svalue=0'
          urllib.urlopen(requete)
juste après ce code :

Code : Tout sélectionner

 if CheckConso==False:
          # cela veut dire qu'il n'y a pas eu de consommation d'eau dans l'heure
          WaterAlarm=False # il suffit d'une heure sans consommation pour passer WaterAlarm a False
          logger.debug("Pas de consommation d'eau pendant une heure !")
          # on met à jour le compteur incremental de Domoticz sans rien ajouter uniquement pour indiquer que la conso est nulle
          requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=udevice&idx='+str(dummy_idx['compteur_eau'])+'&svalue=0'
          urllib.urlopen(requete)
Bonjour.
J'arrive pas à faire fonctionner ce rajout, es possible d'être plus précis ?

js-martin
Messages : 474
Enregistré le : 22 mars 2015, 22:08
Contact :

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par js-martin »

Je ne sais pas ce qui ne marche pas. L'idée du code est de faire une MAJ de domoticz lorsque tu ne consommes pas d'eau depuis plus d'une heure pour éviter que le widget passe en rouge (plus d'information). Par contre, l'histogramme des heures reste à zero.

tu as bien le code suivant :

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json
import requests
import urllib
import RPi.GPIO as GPIO  # bibliotheque pour utiliser les GPIO
import time
import logging

############# Parametres #################################

#~~~~~~~~~~ Parametres Domoticz ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
domoticz_ip="192.168.0.40"
domoticz_port="8080"
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# IDX de Domoticz
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# remplacer XXX par votre idx de votre widget
dummy_idx={'compteur_eau': 331, 'switch_eau':330}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Choix du GPIO
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# On mesure le compteur d'eau sur le GPIO 22 pin 15
GPIO.setmode(GPIO.BCM)   # mode de numérotation des pins
GPIO.setup(22,GPIO.IN)   # GPIO 22 (pin 15) réglée en entrée

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Mode debug
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# si debug = True => on affiche plein de choses... (sinon mettre False)
debug=True


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Parametres Logs
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
formatter = logging.Formatter("%(asctime)s -- %(name)s -- %(levelname)s -- %(message)s")
handler_debug = logging.FileHandler("/var/tmp/eau_debug.log", mode="a", encoding="utf-8")
handler_info = logging.FileHandler("/var/tmp/eau_info.log", mode="a", encoding="utf-8")
handler_debug.setFormatter(formatter)
handler_info.setFormatter(formatter)
handler_debug.setLevel(logging.DEBUG)
handler_info.setLevel(logging.INFO)
logger = logging.getLogger("eau")
logger.setLevel(logging.DEBUG)
logger.addHandler(handler_debug)
logger.addHandler(handler_info)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



###############  fin des parametres #############################

CheckGoOFF=False # pour eviter les erreurs de comptage (on compte un litre que si le capteur passe de OFF à ON)
CheckGoON=True # pour eviter de charger les logs de Domoticz en OFF inutiles
CheckConso=False
WaterAlarm=True
FirstDay=True
hto=time.localtime().tm_hour # heure debut analyse
jto=time.localtime().tm_wday # jour de la semaine
logger.info("--Debut ananlyse : "+str(hto)+" heure (jour de la semaine "+str(jto)+" (0=lundi to 6=dimanche)")

def Loop4(channel):
    global CheckGoOFF
    global CheckGoON
    global CheckConso
    global debug
    if GPIO.input(channel):
        if debug:
           print "---interrupt ON---"
           print "---Valeur CheckGoOFF="+str(CheckGoOFF)
        if CheckGoOFF:
           # On met à jour les drapeaux
           CheckGoOFF=False
           CheckGoON=True
           CheckConso=True
           # on met à jour le compteur incremental de Domoticz
           requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=udevice&idx='+str(dummy_idx['compteur_eau'])+'&svalue=1'
           urllib.urlopen(requete)
           logger.info("consommation 0.5 litre")
           #on passe le switch d'etat de la demi-lune à ON
           requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=switchlight&idx='+str(dummy_idx['switch_eau'])+'&switchcmd=On&level=0'
           urllib.urlopen(requete)
           if debug:
              print "***La roue a bien fait un tour, il faut incrementer le compteur de 1"
              r = requests.get('http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=devices&rid='+str(dummy_idx['compteur_eau'])).json()
              result={}
              index=str(r['result'][0]['Counter'])
              print "Compteur eau nouvel index = "+index
        else:
           CheckGoOFF=False # not needed
           if debug:
              print "=====Traitement interruptions multiples sur un meme etat===="
              print "=====>> CheckGoOFF vaut encore False : la demi lune n'a pas encore fait un tour... on ignore l'interruption"
    else:
        if CheckGoON:
           if debug:
              print ":::interrupt OFF:::"
              print ":::Valeur CheckGoOFF="+str(CheckGoOFF)
              print ":::La lune metalique a fait un demi-tour - on passe la valeur de CheckGoOFF a True"
           # On met à jour les drapeaux
           CheckGoOFF=True
           CheckGoON=False
           CheckConso=True
           logger.info("consommation 0.5 litre")
           #on passe le switch d'etat de la demi-lune a OFF
           requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=switchlight&idx='+str(dummy_idx['switch_eau'])+'&switchcmd=Off&level=0'
           urllib.urlopen(requete)
        else:
           CheckGoON=False # not needed
           if debug:
              print "=====Traitement interruptions multiples sur un meme etat===="
              print "=====>> CheckGoON vaut encore False : on ignore l'interruption"

GPIO.add_event_detect(22, GPIO.BOTH, callback=Loop4, bouncetime=100)


while True:
    time.sleep(600) # on attend 10 min
    hcur=time.localtime().tm_hour
    if hto != hcur: # changement heure
       print "changement d'heure - heure courante ="+str(hcur)
       logger.debug("changement d'heure - heure courante ="+str(hcur))
       # on regarde s'il y a eu de l'eau consommee
       if CheckConso == False:
          # cela veut dire qu'il n'y a pas eu de consommation d'eau dans l'heure
          WaterAlarm=False
          logger.debug("Pas de consommation d'eau pendant une heure !")
          # on met à jour le compteur incremental de Domoticz sans rien ajouter uniquement pour indiquer que la conso est nulle
          requete='http://'+domoticz_ip+':'+domoticz_port+'/json.htm?type=command&param=udevice&idx='+str(dummy_idx['compteur_eau'])+'&svalue=0'
          urllib.urlopen(requete)
       else:
          logger.debug("il y a eu des consommations cette heure-ci...")
       hto=hcur
       CheckConso=False
       jcur=time.localtime().tm_wday
       if jto != jcur: # changement de jour
          logger.debug("***changement de jour ="+str(jcur))
          if FirstDay:
             logger.info("C'est le premier jour d'analyse, on attend une journee entiere")
             FirstDay=False
             if WaterAlarm:
                logger.info("==>sur cette journee non complete : fuite eau")
             else:
                logger.info("==>sur cette journee non complete : pas de fuite ===")
          else:
             if WaterAlarm:
                print "===ALARME=== fuite eau "
                logger.info("===ALARME=== fuite eau ")
             else:
                print "===fin analyse sur 24H : pas de fuite ==="
                logger.info("===fin analyse sur 24H : pas de fuite ===")
          #on repart sur 24H d'analyse
          CheckConso=False
          WaterAlarm=True
          hto=time.localtime().tm_hour # heure debut analyse
          jto=time.localtime().tm_wday # jour de la semaine
          logger.info("--Debut ananlyse : "+str(hto)+" heure (jour de la semaine "+str(jto)+" (0=lundi to 6=dimanche)")
Domotisation de : mes compteurs EDF, solaire, eau / mon alarme / ma Chaudière Viessamnn / mon congel / ma sonnette. Matériels : Pi2 - RFXTrx433e - Zwave+ Aeotec, ampoules Hue - Détecteur et prises Fibaro - Capteurs Oregon - présentation installation => lien

js-martin
Messages : 474
Enregistré le : 22 mars 2015, 22:08
Contact :

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par js-martin »

zorglub2029 a écrit :
J'ai adapté le schéma en ajoutant l'alimentation du CNY70 depuis le raspberry (ça fait juste 4 fils qui vont vers le CNY70 et pas besoin d'alim externe).
Oui, c'est possible mais j'aime bien aussi l'idée de séparer les alimentations...
zorglub2029 a écrit :Pour simuler le compteur, j'ai collé un bout de papier alu sous le couvercle du boitier du rasp et le script python allume ou éteint la led en fonction du survol ou pas de ce papier alu. Je pense que l'épaisseur du boitier simule bien ce que je vais trouver sur le compteur.
Avec mon boitier, tu pourras ajuster la hauteur. Une fois la hauteur réglée, tu peux le coller au silicone...
zorglub2029 a écrit : J'ai monté le circuit avec 10m de cable, histoire de coller au plus près au circuit décrit ici, je n'ai pas besoin d'autant de longueur mais au cas où
Tu n'avais pas besoin. Je voulais juste dire qu'avec plusieurs mètres, ca marche encore...
zorglub2029 a écrit : Le script très très très simplifié que j'utilise pour les essais (basé sur celui de js-martin, débarrassé de tout ce qui encombre :D ):
C'est quand même utile la détection de fuite d'eau :lol:
Domotisation de : mes compteurs EDF, solaire, eau / mon alarme / ma Chaudière Viessamnn / mon congel / ma sonnette. Matériels : Pi2 - RFXTrx433e - Zwave+ Aeotec, ampoules Hue - Détecteur et prises Fibaro - Capteurs Oregon - présentation installation => lien

zorglub2029
Messages : 4
Enregistré le : 29 avr. 2017, 01:37

Re: Compteur eau et détecteur fuite sur un GPIO pour 10€

Message par zorglub2029 »

js-martin a écrit : Oui, c'est possible mais j'aime bien aussi l'idée de séparer les alimentations...
L'un n'empêche pas l'autre, je peux aussi coller une alim indépendante, l'important pour moi étant de passer un seul câble multibrins, ce qu'il y a au bout...

js-martin a écrit : Avec mon boitier, tu pourras ajuster la hauteur. Une fois la hauteur réglée, tu peux le coller au silicone...
J'ai une vis centrale sur le compteur, je pense plutôt à un bras vissé qui tiendra le capteur, après, c'est qu'une idée comme ça. j'ai pas d'imprimante 3D à dispo, bref, pas fixé encore sur la méthode finale

js-martin a écrit : Tu n'avais pas besoin. Je voulais juste dire qu'avec plusieurs mètres, ca marche encore...
C'est plus rapport à la valeur de la résistance que tu as fait varier en fonction de la longueur, ne sachant pas trop, j'ai fait au plus près (j'ai une bobine de 50M de cable en réserve :mrgreen: )
js-martin a écrit : C'est quand même utile la détection de fuite d'eau :lol:
Mais carrément, c'est même un des 2 buts ultimes, l'autre étant de suivre la conso, plus pour information. Mais là, je suis en mode développement/recherche alors étape par étape, juste voir déjà si ça marche de base et de ce côté là, rien à dire, ça a l'air de fonctionner très bien sur le principe, étape suivante : faire l'essai directement sur le compteur.


Juste un problème en fait, j'ai tenté de passer un fil dans le fourreau du tuyau d'eau, mais à mi chemin, y'a du sable qui bouche :evil: , donc, pour l'instant, mes recherches consistent à passer cet obstacle. J'ai quelques idées, je persévère.

Et encore merci pour ton travail

Répondre