Capteur QTR-1RC IR Sensor sur Raspberry Pi : Python & Domoticz
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
images
README.adoc
compteurEau.cfg
compteurEau.py
compteurElec.cfg
compteurElec.py
compteurGaz.cfg
compteurGaz.py
compteurSetIndex.py
requirements.txt

README.adoc

Capteur QTR-1RC IR Sensor Python Domoticz

Un petit script python pour prendre en charge un capteur IR QTR-1RC branché sur une GPIO de raspberry pi et relever des compteurs - eau et gaz dans mon cas - qui possèdent un demi-disque réflechissant.
Le résultat est envoyé dans Domoticz.

1. Avant de commencer

Ce machin est parti de l’envie de domotiser mes compteurs : eau, gaz et électricité.
Après avoir pensé à des solutions étranges à base de webcam et de reconnaissance de caractères, des solutions compliquées à mettre en oeuvre en intercalant des compteurs munis de détecteurs d’impulsions, des solutions trop onéreuses avec des capteurs d’impulsions "tout fait" à fixer sur les compteurs existants tout en ignorant si mes compteurs emettent des impulsions, j’ai fini par tomber sur des solutions vraiment abordables à base de capteurs de réflectance. En cherchant un peu j’ai trouvé ce QTR-1RC qui a le gros avantage de pouvoir se brancher directement sur la raspberry pi : 5V, 0V et une GPIO :) sans passer par une carte supplémentaire type Arduino.

Comme il est écrit dans la doc, la séquence pour lire un tel capteur est la suivante :

  • Set the I/O line to an output and drive it high.

GPIO.setup(IRPIN, GPIO.OUT)
GPIO.output(IRPIN, GPIO.HIGH)
  • Allow at least 10 μs for the sensor output to rise.

# Avec un peu de marge
time.sleep(0.00001)
  • Make the I/O line an input (high impedance).

# pulse_start = time.time()
GPIO.setup(IRPIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
  • Measure the time for the voltage to decay by waiting for the I/O line to go low.

while GPIO.input(IRPIN)> 0:
  pass # attente I/O passe à bas
if  GPIO.input(IRPIN)<=0:
  pulse_end = time.time()

Ce temps de passage de haut à bas dépend de la résistance du phototransistor et donc de la réflectance de la surface en vis à vis du capteur. On peut ainsi détecter chaque passage du demi-disque réflechissant devant le capteur, c’est à dire le nombre de tours de ce disque, et en déduire la consommation.

2. Ce qu’il faut

Un capteur QTR-1RC, un port GPIO (pull-down) de libre (GPIO17 et GPIO18 dans mon cas) sur la raspberry pi avec Raspbian. Python 2.7 que je fais tourner dans un virtualenv mais ce n’est pas obligatoire. RPi.GPIO : la gestion des GPIO pour Python. Et enfin Domoticz pour visualiser la consommation.

3. Installation

3.1. Sur la Raspberry pi

  • Il faut bien sûr brancher le capteur sur la raspberry pi : alim 5V, terre et une GPIO. Et pour faire des tests vous devrez le promener au dessus de surfaces de réflectances différentes.

  • Placer le script ou vous voulez sur votre raspverry pi.

  • Modifier le fichier compteurGaz.cfg, dans le même dossier que le script.

  • En activant le mode Debug dans le fichier de configuration,

DEBUG: True

vous pouvez lancer un

python compteurGaz.py

et observer le fichier de log qui affichera les temps de décharge du capteur et vous permettra de régler les deux valeurs seuils :

HIGH_LEVEL: 0.00017
LOW_LEVEL: 0.00013

3.2. Dans Domoticz

Dans "Réglages/Matériels", vous devez créer un "Dummy (Does nothing, use for virtual switches only)". Et y ajouter deux capteurs virtuels : un compteur incrémental et un interrupteur. Le premier sert à mesurer la consommation (dernières 24h, mois, années) et le second peut être utile pour voir plus finement la consommation. Dans la liste des dispositifs, relevez les Idx des deux nouveaux dispositifs et modifiez le fichier de configuration :

counter_idx: 89
switch_idx: 90

Le compteur est mis à jour par :

requete='http://'+domoticz_ip+':'+str(domoticz_port)+'/json.htm?type=command&param=udevice&idx='+str(counter_idx)+'&svalue='+str(VOLUME_INC)
urllib.urlopen(requete)

et l’interrupteur par

requete='http://'+domoticz_ip+':'+str(domoticz_port)+'/json.htm?type=command&param=switchlight&idx='+str(switch_idx)+'&switchcmd=On&level=0'
urllib.urlopen(requete)
Tip
Pour lancer le script au démarrage du système, vous pouvez modifier votre fichier /etc/rc.local.

3.3. Equilibrage

Si au cours du temps vous constatez un écart entre la mesure du script et votre compteur réel, vous pouvez utiliser le script "compteurSetIndex.py" pour ajouter ou enlever des litres à votre compteur.

Warning
les numéros Idx des compteurs sont donnés à titre indicatif.

4. Contributions

Vous pouvez lire ça si vous avez encore du temps CONTRIBUTING.md.

5. License

GNU General Public License, mais alors vraiment faire plaisir à mon chat.

6. Thank’s

Merci à Toby pour son code qui m’a bien servi.

Merci à js-martin pour son article et ses précisions sur Domoticz.

Des infos sur la gestion des GPIO.

7. Photos

compteur
Figure 1. Compteur avec demi disque
qtr1rc
Figure 2. Qtr-1RC Sensor
rpi3
Figure 3. Raspberry Pi 3 : branchements
domoticz
Figure 4. Domoticz : dispositifs et Idx

8. Améliorations

J’ai rencontré trois problèmes lors des premières utilisations.

Le premier sur le capteur lui-même qui passait au dessus de la valeur haute sans raison liée à la présence du demi-disque réfléchissant. Je me suis donc retrouvé avec des passages Off à On - et donc des litres - en plus. C’est pourquoi je vérifie deux valeurs consécutives à On avant d’incrémenter le compteur. Il faut prendre cela en compte lors du réglage de la valeur du TIME_INTERVAL, en effet il faut que le capteur soit interrogé au moins deux fois lorsqu’il est au dessus du demi-disque réflechissant, même lorsqu’il tourne rapidement - plusieurs robinets ouverts à fond par exemple -.

Le second sur la condition "GPIO.input(IRPIN)⇐0" qui n’était de temps en temps jamais atteinte.

Enfin le troisième sur la boucle "while GPIO.input(IRPIN)> 0" qui restait bloquée sur le "pass". Il semble que la connexion de la GPIO IN à la résistance de pull-down ne se fasse pas toujours : "GPIO.setup(IRPIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)". Du coup j’ai modifié le "pass" en "i += 1" et limité le nombre max d’itérations dans le cas du blocage. Je l’ai fixé à 1000, ce qui dans mon cas est largement suffisant sur ma Raspberry pi qui fait plafonner le compteur à 80 dans les plus longs temps de décharge. Mais si jamais vous faites tourner sur un Xéon dernier cri il faudra peut-être augmenter cette valeur. Ou encore mieux, trouver d’où vient le problème ;).

9. Bon et au final ???

Au final le système fonctionne pas trop mal, j’ai des écarts entre la relève et le réel mais je peux suivre l’évolution et garder une idée assez précise de ma consommation en eau et en gaz ; et surtout scruter l’effet de modifications de ma gestion de consommation : changement de têtes de robinet, isolation, baisse du chauffage, …​.

Et bien sûr j’ai à présent le suivi à distance, ce qui peut être utile pendant les absences prolongées ; et les alertes gérées par Domoticz et enfin éviter de me retrouver avec un rattrapage de plus de 1000 € d’eau parce que le releveur adore passer pendant qu’il n’y a personne et que les factures ne prennent pas en compte les auto-relèves et s’appuient uniquement sur des estimations !!!