Cela fait maintenant plusieurs mois que je travaille sur un système domotique complet pour ma chambre, basé sur l’Arduino et le Raspberry pi, qui constitue une sorte de « fil rouge » au coeur de tous mes plus petits projets. Les contraintes que je me suis fixé sont les suivantes :
- Le système doit intégrer :
- Un système d’alarme, qui détecte toute intrusion, puisse la référencer, la filmer avec une caméra. L’identification se ferait avec une carte RFID, grâce à un module dédié.
- Un système d’éclairage, qui puisse contrôler les luminaires déjà présents, en plus de LEDs RGB placées partout dans la chambre.
- Le contrôle du volet roulant électrique
- Eventuellement le contrôle du chauffage (bien que je n’y voie pas de grande utilité…)
- Le contrôle de ce système doit pouvoir s’effectuer :
- Par l’intermédiaire d’une interface Web
- Par l’intermédiaire d’un écran tactile placé quelque part dans la chambre
- Par l’intermédiaire d’un logiciel installé sur mon ordinateur
- Par l’intermédiaire d’une application telle que Blynk (Site officiel de Blynk) afin de pouvoir tout contrôler depuis le monde entier
- Le système doit également être muni de capture pour détecter ce que fait l’utilisateur (par exemple s’il dort, travaille…) afin d’adapter les composantes du milieu
- Le contrôle s’effectuera à partir de scénarios, et non d’une interface permettant de choisir tous les paramètres séparément.
En ce qui concerne le contrôle du volet électrique roulant, j’ai tout d’abord ouvert l’interrupteur du volet roulant (après avoir bien entendu coupé l’électricité), pour le remplacer par un module relais, de manière à pouvoir le diriger depuis un microcontrôleur 5v. J’ai choisi un module Huzzah esp8266 de chez Adafruit, que j’ai programmé via Arduino pour qu’il se connecte à un serveur mqtt afin de récupérer des données depuis Internet ou depuis d’autres appareils pour pouvoir contrôler les volets en fonction de ces données. Voici le module Huzzah :
En ce qui concerne la lampe, j’ai effectué le même montage pour l’automatiser, cette fois avec un seul module relais.
La lampe et le volet sont donc contrôlables via internet à travers le serveur mqtt.
Avec l’arrivée d’iOS 10, Apple a approfondi HomeKit en proposant une application système dédiée : « Home ». J’ai donc voulu tirer parti de cette mise à jour en rendant ces deux appareils compatibles HomeKit, comme je l’ai fait pour ma serrure : Serrure Homekit. J’ai donc configuré un serveur NodeJS et un client mqtt sur un Raspberry Pi pour communiquer les informations d’HomeKit à ces appareils, et je peux donc directement les contrôler avec l’application dédiée, en demandant à Siri, ou encore via le centre de contrôle d’iOS.
J’ai ajouté une fonctionnalité bien pratique : l’activation de systèmes par RFID. Le principe est simple : avoir une machine qu’il suffit de passer sur la lampe pour l’allumer ou l’éteindre, sur le volet pour le monter ou le descendre, sur l’imprimante 3D pour démarrer une impression, et bien d’autres. Le prix de lecteurs RFID étant plus élevé que celui des badges, j’ai opté pour que chaque appareil à contrôler ait un badge. La machine qui permet d’activer les appareils est en fait constituée d’une batterie, d’un Raspberry Pi Zero avec un dongle WiFi et d’un module RFID PN532. Lorsque le Raspberry détecte un badge correspondant à un appareil, il change sa valeur sur le serveur MQTT, car tous les appareils y sont déjà connectés.
Voici le code python présent sur le Raspberry Pi :
import binascii import sys import time import Adafruit_PN532 as PN532 from Adafruit_IO import Client import RPi.GPIO as GPIO aio = Client('clé_de_compte_adafruit_IO') GPIO.setmode(GPIO.BCM) GPIO.setup(21, GPIO.OUT) GPIO.output(21, GPIO.HIGH) CS = 18 MOSI = 23 MISO = 24 SCLK = 25 lamp = 1 volet = 2 pn532 = PN532.PN532(cs=CS, sclk=SCLK, mosi=MOSI, miso=MISO) pn532.begin() ic, ver, rev, support = pn532.get_firmware_version() pn532.SAM_configuration() while True: uid = pn532.read_passive_target() if uid is None: continue if format(binascii.hexlify(uid)) == '9ecd020d': print ('Bonne carte') premier = 1 if volet == 1 and premier == 1 : print ('Bonne carte') aio.send('volet', 2) volet = 2 premier = 0 time.sleep(1) if volet == 2 and premier == 1 : print ('Bonne carte') aio.send('volet', 1) volet = 1 premier = 0 time.sleep(1) if format(binascii.hexlify(uid)) == '5e4b9fa0': first = 1 if lamp == 1 and first == 1 : print ('Bonne carte') aio.send('lampe', 2) lamp = 2 first = 0 time.sleep(1) if lamp == 2 and first == 1 : print ('Bonne carte') aio.send('lampe', 1) lamp = 1 first = 0 time.sleep(1)