Poulailler connecté

5

Pouvons nous surveiller nos enfants 24h/24 ? vous avez 2h. Bon cette question sera au programme du Bac 2027 mais aujourd’hui nous allons voir comment connecter votre poulailler et surveiller vos poules, elles ne diront rien elles.

Ceci est le projet de Matthieu : Contrôle automatisé de l’ouverture du poulailler, et remontée d’informations

Pourquoi connecter un poulailler ?

Suite à l’envie d’avoir quelques poules, je me suis documenté sur Internet sur les avantages et les contraintes.

Une des contraintes était d’enfermer les poules chaque nuit pour les protéger des prédateurs. Bien qu’habitant en région parisienne, j’ai une forêt juste à côté, et donc potentiellement des renard & fouines.

Il existe de nombreuses solutions qui permettent d’automatiser la fermeture et l’ouverture d’une porte de poulailler, qui se basent sur la luminosité et/ou l’heure, pour un budget non négligeable (entre 100 et 150€, sans compter la porte en alu), par exemple Chickenguard.

Je trouve ce tarif très exagéré compte tenu des faibles fonctionnalités et du coût modique des composants nécessaires à fabriquer le boîtier.

En regardant les différents projets “homemade” qui existent sur Internet, et le coût des composants, je suis arrivé à la conclusion que je pouvais avoir beaucoup mieux pour le même prix.

Avant de me lancer j’ai parcouru de nombreux sites pour m’aider dans la réflexion et le design de la solution.
Malheureusement je n’ai pas conservé les urls. Un site en particulier m’a beaucoup aidé pour le choix du moteur et du pont L298N.
La plupart des projets étaient basés sur Arduino. Certains projets de voitures radio-commandés utilisant le Rpi0 ont également été utiles.

En revanche, je n’ai pas vu de projets regroupant comme le mien un Rpi0w + cam + L298N + sunwait + jeedom

Fonctionnalités recherchées :

Je souhaitais un certain nombre de fonctionnalités que je ne retrouvais pas avec les solutions commerciales :

  • non pas basé sur la luminosité ou l’heure, mais sur l’heure réelle de lever et coucher du soleil
  • pilotable à distance
  • retour vidéo avec vision nocture, pour s’assurer que tout le monde est bien rentré dans le poulailler
  • compatible jeedom

Ce qu’il faut acheter :

  • Rpi zero w avec sa boite, 22€ chez Gearbest
  • Carte SD, environ 15€ chez Amazon
  • Caméra pour pi zero, 11.30€ chez Aliexpress
  • Pont L298N, 1.26€ chez Aliexpress
  • Moteur 12 V 25 RPM, 6.76€ chez Aliexpress
  • Coupleur d’axe 6mm/6mm, 5€ sur ebay
  • Capteur de fin de butée, 2.41€ les 10 chez Aliexpress
  • convertisseur 12V vers USB 5V, 0.66€ chez Aliexpress
  • Alimentation 12V 3A, 11€ chez Amazon
  • Boîte en plastique, 7€ chez Amazon
  • Porte coulissante en alu, 35€ chez Amazon
  • Divers : wago, petit fil, bobine de cable, ficelle, petites poulies, gaines thermorétractables, soudure, diodes, etc…, environ 35€

Total : 130€

Bonus : caméra de surveillance supplémentaire, payé 19e en promo sur Gearbest

Selon ou vous achetez le délai est plus ou moins long mais prévoyez un mois pour tout recevoir, avant de pouvoir commencer l’assemblage.

Schéma logique moche :

Photo de la boîte avec tous ses composants (le fil d’ouverture de porte sort à la verticale) :

Des capteurs de fin de course associés à des diodes permettent de stopper le moteur lorsque la porte est tout en haut ou tout en bas.

Par fainéantise, je n’ai finalement installé qu’un seul capteur de fin de course, le plus important : celui de porte ouverte.

Coté Rpi0, des fils ont été soudés sur 3 gpio, masse, et 2 data

La caméra a été raccordée au Rpi0.

Raspbian a été installé, mis à jour, et configuré.

Pour la caméra, j’ai suivi le tuto suivant:

J’ai installé le programme “sunwait” pour déclencher l’ouverture et fermeture de la porte en fonction des horaires du soleil.

Jeedom a été configuré pour récupérer le flux vidéo et pousser les commandes manuelles.

Etant accro aux capteurs Xiaomi, et heureux propriétaire d’un Zigate, j’ai également “enrichi” le poulailler de quelques capteurs supplémentaires :

  • capteur température & humidité
  • capteur d’ouverture de la trappe donnant accès aux oeufs
  • à venir : capteur d’état de la porte pour détecter des anomalies

Tuto poulailler

Code source

Avertissement : je ne me considère pas comme un développeur, et code beaucoup avec google dans une autre page… donc les scripts suivants fonctionnent, mais je ne peux pas garantir leur stabilité et sécurité. Le serveur ne doit donc pas être accessible depuis Internet.

Sur jeedom : les commandes d’ouverture et fermeture manuelles se font via le plugin script :

Sur le raspberry pi zero w, les pages correspondantes sont très courtes :

open_script.php :

<?php

$command = escapeshellcmd(‘/opt/chickendoor/open_door.py’);

shell_exec($command);

?>

 

close_script.php :

<?php

$command = escapeshellcmd(‘/opt/chickendoor/close_door.py’);

shell_exec($command);

?>

 

Ces deux pages appellent des fichiers pythons :

open_door.py :

#!/usr/bin/env python

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

import door

#quit()

door.init()

door.open_door()

 

close_door.py :

 

#!/usr/bin/env python

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

import door

#quit()

door.init()

door.close_door()

 

Ces deux fichiers appellent un autre fichier central : door.py, qui pilote les ports GPIO du RPi, génère des logs, et garde le statut dans un fichier texte. Suite à un problème qui a failli détruire le moteur (une fois la ficelle entièrement déroulée, si on continu à dérouler, ça enroule dans l’autre sens !), j’ai ajouté des sécurités empêchant de fermer ou ouvrir deux fois la porte. Pour des cas particuliers (amorçage), j’ai ajouté des fonctions bypassant la sécurité.

Le code n’est pas du tout documenté (honte à moi), mais il est suffisant simple pour être facilement compréhensible.

 

#!/usr/bin/env python

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

import RPi.GPIO as gpio

import datetime

import time

import logging

TIME_UP = 45

TIME_DOWN = 36

FILENAME = « /opt/chickendoor/status.txt »

LOGFILE = « /opt/chickendoor/chicken.log »

def init():

gpio.setmode(gpio.BCM)

gpio.setup(17, gpio.OUT)

gpio.setup(22, gpio.OUT)

logging.basicConfig(filename=’chicken.log’, level=logging.DEBUG, format=’%(asctime)s — %(name)s — %(levelname)s — %(message)s’)

def read_status():

file = open(FILENAME, »r »)

status = file.readline()

file.close()

return(status)

def write_status( STATUS ):

file = open(FILENAME, »w »)

file.write(STATUS)

file.close()

def open_door():

if read_status() == « Closed »:

write_status(« Opening »)

logging.info(‘DOOR Opening…’)

gpio.output(17, True)

gpio.output(22, False)

time.sleep(TIME_UP)

gpio.cleanup()

logging.info(‘DOOR Opened !’)

write_status(« Opened »)

else:

gpio.cleanup()

logging.warning(‘ERROR! Action OPEN but door not closed!’)

def force_open_door():

write_status(« Opening »)

logging.info(‘DOOR FORCED Opening…’)

gpio.output(17, True)

gpio.output(22, False)

time.sleep(TIME_UP)

gpio.cleanup()

logging.info(‘DOOR FORCED Opened!’)

write_status(« Opened »)

def close_door():

print read_status()

if read_status() == « Opened »:

write_status(« Closing »)

logging.info(‘DOOR Closing…’)

gpio.output(17, False)

gpio.output(22, True)

time.sleep(TIME_DOWN)

gpio.cleanup()

logging.info(‘DOOR Closed!’)

write_status(« Closed »)

else:

gpio.cleanup()

logging.warning(‘ERROR! Action CLOSE but door not opened!’)

def force_close_door():

write_status(« Closing »)

logging.info(‘DOOR FORCED Closing…’)

gpio.output(17, False)

gpio.output(22, True)

time.sleep(TIME_DOWN)

gpio.cleanup()

logging.info(‘DOOR FORCED Closed!’)

write_status(« Closed »)

 

Autre paramètrage :

  • il faut ajouter www-data dans les utilisateurs habilités à modifier les ports GPIO :

 

$ sudo usermod -a -G gpio www-data

$ sudo groups www-data

$ sudo service apache2 restart

 

  • Il faut créer un fichier status.txt lisible et écrivable par tous dans le répertoire /opt/chikendoor/ et avec un lien symbolique dans le répertoire html où se trouvent les scripts php :

 

touch /opt/chickendoor/status.txt

chmod a+wr /opt/chickendoor/status.txt

ln -s /opt/chickendoor/status.txt /var/www/html/chicken/status.txt

chmod a+r /var/www/html/chicken/status.txt

 

  • il faut paramétrer le crontab (ou tout autre planificateur) pour ouvrir et fermer automatiquement la porte.

Attention : j’avais d’abord utilisé les options de décalage avant/après le levé/coucher du soleil, mais avec ma version de sunwait, cela ne marchait pas !

J’ai trouvé la solution en me basant sur une option de sunwait, qui permet le déclenchement non pas lorsque le soleil est à l’horizon (0°), mais encore caché (-8° de mémoire).

Ainsi, la porte s’ouvre une demie heure avant le levé “officiel” du soleil, et se couche une demie-heure après le coucher.

 

Exemple des différences entre le lever/coucher “normal” et “civil” :

 

root@Rpi-Poulailler:/home/pi# sunwait report 48.735393N 2.430392E

Current Date and Time: 11-Apr-2018 21:12 CEST

Target Information …

Location: 48.735393N,   2.430392E

Date: 11-Apr-2018

Timezone: CEST

Sun directly north/south: 13:51

Twilight angle: -0.83 degrees (daylight)

Day with twilight: 07:08 to 20:34

It is: Night

General Information (no offset) …

Times …         Daylight: 07:08 to 20:34

with Civil twilight: 06:37 to 21:05

with Nautical twilight: 05:57 to 21:45

with Astronomical twilight: 05:15 to 22:27

Duration …    Day length: 13:26 hours

with civil twilight: 14:27 hours

with nautical twilight: 15:47 hours

with astronomical twilight: 17:12 hours

Ce qui me donne les entrées cron suivantes :

00 02   * * *   /usr/bin/sunwait wait civil rise 48.735393N 2.430392E; /usr/bin/python /opt/chickendoor/open_door.py >> /var/log/chicken.log 2>&1

00 13   * * *   /usr/bin/sunwait wait civil set 48.735393N 2.430392E; /usr/bin/python /opt/chickendoor/wait_and_close.py >> /var/log/chicken.log 2>&1

 

Exemple de fonctionnement

  • tous les jours à 2h du matin, le programme sunwait se lance et attend que la condition de lever du soleil soit remplie, puis se termine.
  • La deuxième commande est alors exécutée : l’ouverture de la porte
  • Puis rebelote à 13h, sunwait attend le coucher de soleil, se ferme, et la commande python de fermeture est alors exécutée.

Et les poules dans tout ça ?

Elles se portent à merveille et pondeuse leur oeuf quotidien.

Les premiers jours ont été compliqués, car seule une poule était venue dormir dans le nichoir. Mais après les avoir forcé à s’y rendre une nuit, tout le monde va dormir dans le dortoir chaque soir !

Malheureusement, elles sont un peu trop curieuses, et on va devoir leur couper quelques plumes pour les empêcher de prendre la poudre d’escampette !

 

 

A voir aussi

5 Commentaires

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here

CommentLuv badge

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.