Automatisation domestique avec Raspberry Pi 2 et Windows 10 IoT Core : Guide complet
Composants et fournitures
| Composant | Description | Qté |
|---|---|---|
| Raspberry Pi 2 Model B | Ordinateur monocarte principal | 1 |
| HSRel5 - Carte relais 5 canaux I²C | 5 relais, 3 GPIO, bus I2C, basé sur PCF8574 | 1 |
| HSRel8(+8) - Carte relais 8 canaux I²C | 8 relais, 8 GPIO, bus I2C, basé sur MAX7311 | 1 |
| I2C-Port 16 HS - Extension 16 GPIO I²C | 16 GPIO, bus I2C, basé sur MAX7311 | 1 |
| Alimentation 12 V / 54 W (DR-60-12) | Alimentation 12 V pour tous les modules | 1 |
| Alimentation 5 V / 3 A (MeanWell DR-30-5) | Alimentation 5 V pour tous les modules | 1 |
| Shield de prototypage pour Raspberry Pi | LED de statut, entrée d'interruption protégée, bornier 3 pôles | 1 |
| Tampon I2C HS (P82B96) | Niveau de tension I2C + résistances de tirage, montage rail DIN | 1 |
| Arduino Nano R3 | Pont entre capteurs DHT22 et bus I2C | 1 |
| Émetteur/récepteur 433 MHz | Pour relais sans fil | 1 |
Applications et services en ligne
À propos de ce projet
Mise à jour 2 : Le projet continue d'évoluer avec de nouvelles fonctionnalités (client Twitter, intégration bots Telegram). Consultez le dépôt GitHub et les notes de version pour en savoir plus.
Mise à jour 1 : Merci à tous pour vos retours ! Présenté à Maker Faire Rome 2015 et Microsoft Technical Summit 2015.
Je développe une solution domotique depuis 3 ans, incluant l'installation matérielle et le développement logiciel.
Fonctionnalités
Entrées (Inputs)
- Bouton poussoir (Busch-Jaeger 2020US)
- Détecteur de mouvement (Abus 360° BW8085)
- Température pièce (capteur DHT22 personnalisé)
- Humidité pièce (capteur DHT22 personnalisé)
- État fenêtre (ouvert/fermé, contact reed Honeywell Slimline)
- Lever/coucher du soleil, température/humidité extérieures (via OpenWeatherMap)
Sorties (Outputs)
- Lampe (plafond) - pilotée par relais, pas de gradateur
- Prise - pilotée par relais
- Volet roulant - 2 relais (montée/descente)
- Ventilateur plafond - 3 relais (3 vitesses)
- Ventilateur salle de bain - 2 relais (2 vitesses)
Autres fonctionnalités
- Application web pour iOS, Android, Windows, macOS (configuration chargée depuis le contrôleur)
- Publication des événements vers Azure Event Hub et/ou journalisation CSV
- Traçage UDP détaillé pour débogage (application console TraceViewer)
- Actionneurs personnalisés extensibles
- Combinaison de sorties physiques en sorties logiques
- Animations sur les sorties logiques
- Résilience aux pannes : le système continue de fonctionner même si des composants sont déconnectés
- Support relais 433 MHz
Le concept
Lors de la rénovation de ma maison il y a 3 ans, j'ai choisi de tout piloter depuis le tableau électrique via des relais. Chaque bouton, lampe, prise, volet est câblé individuellement vers le tableau. Aucun bus KNX/EIB n'est nécessaire.
Note : Les composants sont conçus pour du 230 V (Allemagne). L'installation des câbles 230 V et du tableau est réalisée par un électricien qualifié.
Matériel
Le nouveau tableau électrique
Le bus I2C optimisé
Le bus I2C n'est pas prévu pour de longs câbles, mais des astuces permettent d'augmenter la distance :
- Alimenter le bus en 5 V. Le Raspberry Pi sort du 3,3 V → un niveau de tension I2C (P82B96) est indispensable. Câble le plus court possible.
- Utiliser du câble paires torsadées type CAT7 : une paire pour SDA+GND, une autre pour SCL+GND. Ne pas utiliser une seule paire pour SDA+SCL. Connecter le blindage à la terre (PE).
- Préférer du câble multibrins.
- Ajouter des résistances de tirage (pull-up) 10 kΩ en bout de bus sur SDA et SCL.
- Limiter la vitesse à 100 kbit/s (mode standard).
- Inclure un tampon I2C (P82B96) au milieu du bus pour segmenter physiquement.
Cartes relais (sorties)
La société allemande CCTools vend des cartes relais pour bus I2C. La carte HSRel5 a 5 relais + 3 GPIO via un PCF8574 (8 GPIO). Les 5 premiers pilotent les relais, les 3 derniers sont disponibles. Les relais nécessitent 12 V, fournis via un driver de relais (ULN2803) et un inverseur (car l'état par défaut du PCF8574 est HIGH à la mise sous tension, ce qui fermerait tous les relais involontairement).
Pour fermer le premier relais, il faut envoyer 00011110 (MSB) au PCF8574 → met la première broche à LOW → inverseur → driver → relais.
La carte HSRel8(+8) utilise un MAX7311 (8 relais + 8 GPIO) et ne nécessite pas d'inverseur matériel. La logique HIGH/LOW est inversée par rapport à la HSRel5, gérée par le logiciel.
J'utilise 8 HSRel5 et 4 HSRel8. Le PCF8574 permet 8 adresses, le PCF8574A en ajoute 8 autres → 16 HSRel5 max sur le bus.
Extensions de ports (entrées)
Boutons, détecteurs, contacts reed sont câblés sur des cartes I2C-Port16 HS (MAX7311, résistances de tirage 5 V 10 kΩ, condensateurs céramiques 100 nF pour filtrage). Alimentation 12 V ou 5 V.
Chaque dispositif d'entrée a son propre câble CAT7 (blindé, blindage relié à PE) vers le tableau. Les points multiples (ex: volets) peuvent partager un câble.
Au tableau, chaque entrée est câblée sur une broche de l'expandeur et GND. Par défaut HIGH (pull-up). Appui = connexion à GND = LOW. Même principe pour détecteurs et contacts reed.
Un fil d'interruption partagé relie toutes les cartes d'entrée. Tiré à HIGH par défaut. Tout changement d'état sur un expandeur met l'interruption à LOW. Cela évite le polling continu : le Pi2 surveille seulement ce GPIO d'interruption, et interroge les expandeurs concernés seulement si changement.
Raspberry Pi 2
Le Pi 2 tourne sous Windows 10 IoT, monté dans un boîtier personnalisé sur le tableau. Il possède un shield de prototypage avec : LED de statut, port d'interruption avec pull-up 10 kΩ, résistance de protection 1 kΩ, condensateur 100 nF (anti-rebonds). Bornier à vis pour tous les câbles.
Capteurs température/humidité
10 capteurs DHT22 (AOSONG) mesurent température et humidité par pièce. Le protocole propriétaire ne gère pas l'adressage → chaque capteur doit être câblé sur un microcontrôleur. J'utilise un Arduino Nano V3.0 en esclave sur le bus I2C. Il lit tous les capteurs toutes les 2,5 s et met en cache. Le Pi2 lit les valeurs en envoyant l'ID du port (0-10), comme une lecture de registre I2C standard.
L'application web affiche température et humidité avec un indicateur de risque de moisissure : <60% vert, <70% jaune, ≥70% rouge.
Configuration matérielle au tableau
Relais 433 MHz
L'Arduino Nano (pont DHT22) envoie aussi les signaux 433 MHz. L'émetteur FS1000A est logé dans le boîtier du capteur central, alimenté en 12 V pour portée accrue.
Problème : les relais 433 MHz ne renvoient pas d'état. L'utilisateur peut changer l'état avec la télécommande d'origine. Solution : le logiciel force une resynchronisation toutes les 5 s. Les codes 433 MHz sont configurés manuellement via un circuit sur plaque d'essai (sketch Arduino dans CK.HomeAutomation.SensorsBridge\RemoteCodeFinder).
Bac à litière connecté
Le bac à litière du chat est relié à une vieille cheminée inutilisée. Un ventilateur sur relais extrait les odeurs. Un détecteur de mouvement au local de stockage déclenche le ventilateur pendant quelques minutes. Icône dédiée dans l'appli web pour contrôle manuel. Les logs permettent de suivre l'usage du bac et d'optimiser le nettoyage.
Logiciel
Avant Windows 10 IoT, le logiciel tournait sur un G120 (GHI Electronics) avec .NET Micro Framework 4.3. Manque de performances (120 MHz, 16 Mo RAM, interpréteur) → migration vers Windows 10 IoT Background Task + intégration Azure.
Le dépôt GitHub contient la solution Visual Studio 2015 complète.
Structure des projets
- App : Application web (AngularJS, jQuery, Bootstrap)
- Controllers : Projets de démarrage (Background Task IoT) + configuration domicile
- SDK : Projets partagés
Modules principaux
- CK.HomeAutomation.TraceViewer : Application console affichant les traces UDP du contrôleur (port 19227). Indispensable pour déboguer.
- CK.HomeAutomation.Networking : Serveur HTTP basique pour l'appli web (JSON + commandes). Hébergement de l'appli web via partage SMB admin.
- CK.HomeAutomation.Controller.* : Chaque projet dans
Controllersest un Background Task IoT.Controller.Emptysert de point de départ. Prérequis : configurer Pi2 avec Windows 10 IoT, session PowerShell distante, déploiement UWP. ScriptSetupRaspberryPi.ps1fourni (ajuster les IPs). - CK.HomeAutomation.Actuators : Abstraction haute niveau (maison, pièces, actionneurs : boutons, lampes, prises, etc.). API fluide pour configuration.
- MotionDetector : Détecte présence/mouvement. Événements
MotionDetectedetDetectionCompleted. Désactivable via web. - Button : Bouton poussoir physique. Événements
PressedShort(<1,5 s) etPressedLong(>1,5 s). Existe aussiVirtualButton(pilotable via web). - Socket, Lamp, BinaryStateOutput : Classe de base pour sorties binaires ON/OFF. Méthodes maj/toggle. Interagissent avec les boutons.
- CombinedBinaryStateActuators : Combine plusieurs sorties physiques en une logique. Évite les délais visibles en séquence sur le bus I2C grâce au suivi interne des changements.
- StateMachine : États multiples (ex: ventilateur 3 vitesses, ou « ambiances » multi-actionneurs). Méthodes OFF / état suivant. Option
WithTurnOffIfStateIsAppliedTwicepour toggle. - TemperatureSensor / HumiditySensor : Lecture via pont I2C Arduino Nano, toutes les 10 s.
Automatismes
- AutomaticTurnOnAndOffAutomation : Allume une sortie binaire sur déclencheur (bouton/mouvement) pour une durée définie. Plage horaire optionnelle (jour/nuit via station météo).
- AutomaticRollerShutterAutomation : Gestion automatique volets (lever/coucher soleil, température extérieure, horaire « n'ouvrir pas avant »). Suivi position par temporisation.
- AutomaticConditionalOnAutomation : Allume tant que conditions remplies (ex: lampes jardin la nuit). Plages ON/OFF, lever/coucher soleil.
- Automatismes génériques : Framework conditions/actions personnalisées, évalué à chaque déclencheur (bouton, mouvement, intervalle...).
Station météo virtuelle
Données météo (température, humidité, lever/coucher soleil) depuis OpenWeatherMap API, toutes les 60 s. Interface IWeatherStation pour intégrer facilement une station physique future.
CK.HomeAutomation.Hardware
Drivers pour cartes relais/entrées CCTools, relais 433 MHz. Code Arduino Nano (pont capteurs + émetteur 433 MHz) inclus. Couche d'abstraction via interfaces pour ajouter facilement de nouveaux drivers.
CK.HomeAutomation.Telemetry
- CSV Writer : Enregistre chaque changement d'état dans
BinaryStateOutputActuatorChanges.csv(dossier LocalState, accessible via SMB admin). - AzureEventHubPublisher : Envoie événements (changements état, valeurs capteurs, appuis boutons, détections) vers Azure Event Hub. Scripts SQL + Stream Analytics fournis (dossier
#Azure). Chaque changement génère 2 entrées : START (nouvel état) et END (durée en secondes). Rapports Power BI créés.
Application Web
Projet CK.HomeAutomation.App : AngularJS + jQuery + Bootstrap. Configuration UI générée depuis le contrôleur (Pi2). Fichier Configuration.js pour config/traduction + IP du contrôleur. Hébergement sur serveur web requis pour « Ajouter à l'écran d'accueil » iOS (perso : BananaPi + nginx).
Terminal
Un vieil iPad 3 sert de terminal mural dans le salon.
Évolutions futures
- Actionneurs infrarouge (bande LED RGB)
- Fichiers de configuration XML
- Appli tablette dédiée
- Contacts reed pour fenêtres (affichage état web)
- Bibliothèques drivers autres fabricants
- Contrôle vannes chauffage (sorties + lecture temp déjà implémentés)
- Système d'alarme (notifications mouvement/fenêtres)
- Station météo hardware
- Fermeture volets auto si fenêtre ouverte + pluie détectée (API météo dispo)
- Plus de tests unitaires
- Documentation wiki GitHub
- Animations (déjà sous NETMF, pas migré à temps pour le concours IoT)
Intéressé pour contribuer (matériel, logiciel, doc) ? Contactez-moi !
Code
Dépôt GitHub
Solution complète (SDK, WebApp, configuration personnelle) :
https://github.com/chkr1011/CK.HomeAutomation.git
Schémas
- Circuit pour lecture codes 433 MHz télécommande
- Circuit carte capteur DHT22 (une par pièce)
- Shield Raspberry Pi (LED statut + bornier I2C + interruption)
- Capteur température/humidité avec émetteur 433 MHz intégré (un seul pour toute la maison)
Processus de fabrication
- Construire un enregistreur de température Raspberry Pi avec capteur I2C à 5 $
- Surveillance météo à distance avec Raspberry Pi 3 et PubNub
- Intégration du TI SensorTag à Blynk via Node‑RED sur Raspberry Pi Zero
- Contrôler une LED avec un capteur de mouvement PIR sur Raspberry Pi
- Surveiller la température de votre maison avec un tableau de bord Raspberry Pi
- Lire les pulsations cardiaques avec Windows 10 IoT Core sur Raspberry Pi – Guide étape par étape
- Construire un système domotique piloté par Raspberry Pi pour contrôle à distance
- Envoyer les données IMU 10DOF Adafruit du Raspberry Pi 2 vers Azure Event Hubs avec Windows 10 IoT Core
- Surveillance Précise de Température et Humidité avec SHT15 sur Windows 10 IoT Core