Introduction
La domotique est un domaine de l’IoT qui devient de plus en plus populaire de nos jours. Plusieurs applications qui facilitent notre vie quotidienne sont possibles grâce à la domotique. Dans cet article nous allons parler d’une de ces applications – l’alarme de sécurité. En effet, l’exemple de l’alarme de sécurité est intéressant à la fois du point de vue théorique (permet d’illustrer plusieurs notions du système IoT comme capteurs et actionneurs) et pratique (apporte une vraie valeur ajoutée à la vie quotidienne). Dans cet article nous allons réaliser une alarme de sécurité minimaliste, « cloudless » et à base de logiciels open source.
Aspect théorique : étude de cas d'alarme de sécurité
L’Internet of Things (IoT) est composé de Things ou autrement dit d’Objets Connectés. Parmi les Objets Connectés on peut citer des capteurs connectés et des actionneurs connectés. Un capteur connecté quelconque contient 4 modules essentiels :
-
Module de capteurs – un ou plusieurs capteurs dont l’objectif est de mesurer une valeur physique ou détecter un événement.
-
Module de communication – comme il s’agit d’un capteur connecté, on a besoin d’un module de communication qui permet d’assurer la transmission des valeurs mesurées vers l’unité de contrôle ou de traitement de données qui peut se trouver dans le cloud ou sur un serveur local.
-
Module de contrôle – un élément nécessaire pour gérer l’acquisition et le prétraitement de données de capteurs ainsi que la transmission de ces données. Ce module est souvent représenté par un microcontrôleur.
-
Module d’alimentation – sert à assurer l’alimentation électrique de tous les autres modules. Peut-être représenté par un bloc d’alimentation secteur, une batterie, un panneau photovoltaïque etc.
Dans la structure d’un actionneur connecté, le module de capteurs est remplacé par le module d’actionneurs – éléments qui permettent de réaliser une action. Un exemple d’actionneur peut être un relais électrique. Les autres modules d’un actionneur connecté sont similaires à ceux d’un capteur connecté : module de communication, module de contrôle et module d’alimentation.
En général, plusieurs capteurs et/ou actionneurs connectés communiquent avec une unité de contrôle déployée dans le réseau local ou dans un cloud. Le rôle de l’unité de contrôle est d’assurer la collecte, le stockage et l’analyse de données, ainsi que la prise de décisions et gestion des actionneurs quand c'est nécessaire. Un schéma simplifié d’un système IoT ainsi que la structure d'un capteur et d'un actionneur connectés est représentée sur la Figure 1.
Figure 1 : Schéma simplifié d'un système IoT
La nécessité d’intégration de capteurs ou d’actionneurs spécifiques dépend de l’application du système IoT. Certaines applications ne nécessitent que des capteurs (relevé de température dans la pièce), d’autres utilisent les actionneurs seulement (allumage de l’éclairage dans le jardin à partir d’une certaine heure).
Le cas d’alarme de sécurité fait partie des applications qui utilisent à la fois les capteurs connectés qui réalisent la détection d’une intrusion (capteurs d’ouverture d’une porte ou fenêtre, capteur de mouvement du type passive infrared - PIR, etc.) et les actionneurs (activation d’une sirène).
Aspect pratique : description du système
Comme il a été mentionné précédemment, notre objectif est de mettre en place un système minimaliste à la base de logiciels Open Source. Pour ce faire, nous allons utiliser la composition suivante du système :
-
Le capteur de mouvement "Shelly Motion sensor" sera utilisé comme une entrée du système. Il contient une batterie rechargeable à l’intérieur et utilise une connexion Wi-Fi pour la liaison avec l’unité de contrôle. Un SoC de chez Silicon Labs, réunissant un Cortex M3 et un module Wi-Fi est utilisé comme microcontrôleur.
-
La prise connectée "Shelly Plug S" sera utilisée comme actionneur. La détection d’une intrusion va causer l’activation du courant de la prise. Le courant fourni par cette prise peut servir à alimenter une sirène ou une lumière, par exemple. La prise est alimentée directement par le courant du secteur et communique en Wi-Fi. Le dispositif est géré par une puce ESP8266.
-
Une Raspberry Pi 3B+ va jouer le rôle d’unité de contrôle pour notre système IoT d’alarme. Dans ce cadre, on va utiliser le projet Open Source de gestion de domotique Home Assistant
Une des forces de Home Assistant c’est le grand nombre d’Intégrations (officielles ou développées par des contributeurs) – modules de compatibilités avec de nombreux équipements, plates-formes et services IoT, protocoles de communications. Cela permet de concevoir un système IoT avec une grande flexibilité.
Quant aux dispositifs Shelly que nous avons choisi pour cet article, ils supportent plusieurs protocoles de communication (couche Application) : Webhooks, API REST, MQTT et CoIoT. Même si tous ces protocoles de communication sont supportés par Home Assistant, dans le cadre de cet article, nous portons notre choix sur la dernière option (CoIoT) pour profiter d’une intégration officielle Shelly (disponible d’office sur Home Assistant) qui utilise ce protocole. CoIoT est un protocole développé par Shelly à la base de CoAP (RFC 7252).
Afin de simplifier notre installation, la fonctionnalité du point d’accès Wi-Fi sera également réalisée par la Raspberry Pi. Pour cela, RaspAP, un autre projet Open Source nous sera utile. A titre d’exemple, nous allons utiliser la distribution Raspberry Pi OS Lite.
Le système complet est illustré sur la Figure 2.
Figure 2 : Le système complet
Mise en place du système
Dans cette section nous allons décrire les étapes de mise en place de notre système. Nous considérons que la carte SD utilisée par la Raspberry Pi est déjà flashée avec une version récente du Raspberry Pi OS Lite (au moment de publication de l’article il s’agit d’une version datée de 22/09/2022). Nous avons également assuré la connexion Ethernet fonctionnelle avec l'accès internet et activé le serveur SSH au préalable pour pouvoir accéder au système par un shell.
Remarque : il est possible d’utiliser également la connexion série pour accéder au shell.
Étape 1 : configuration du point d’accès Wi-Fi avec RaspAP
Nous allons commencer par l'installation de RaspAP qui nous aidera de configurer le point d'accès Wi-Fi sur notre Raspberry Pi.
Pou cela, on va d'abord configurer le paramètre "WLAN Country" dans les options de localisation. Ceci définira les canaux Wi-Fi disponibles en fonction du pays (dans notre cas - France). Pour effectuer cette configuration, on va lancer la commande suivante :
pi@raspberrypi:~ $ sudo raspi-config
Puis, nous suivrons le menu :
Et on termine par "Finish".
Une fois la configuration du pays pour le Wi-Fi est terminé, nous allons procéder à l'installation de RaspAP en utilisant un script d'installation simple. Pour cela nous allons exécuter la commande suivante :
pi@raspberrypi:~ $ sudo apt-get update
Après, on lance le script d'installation et on répond aux questions posées par l'installateur. Les valeurs proposées par défaut nous conviendront pour notre exemple. De notre cas nous avons préféré refuser les 3 dernières propositions liées à l'installation du module de blocage de publicité et de services VPN dont nous n'aurons pas besoin dans le cadre de cet article. La commande pour lancer l'installation de RaspAP ainsi que quelques exemples de questions proposées sont présentés ci-dessous :
pi@raspberrypi:~ $ curl -sL https://install.raspap.com | bash
888888ba .d888888 888888ba
88 8b d8 88 88 8b
a88aaaa8P' .d8888b. .d8888b. 88d888b. 88aaaaa88a a88aaaa8P
88 8b. 88 88 Y8ooooo. 88 88 88 88 88
88 88 88. .88 88 88. .88 88 88 88
dP dP 88888P8 88888P 88Y888P 88 88 dP
88
dP version 2.8.7
The Quick Installer will guide you through a few easy steps
RaspAP Install: Configure installation
Detected OS: Raspbian GNU/Linux 11 (bullseye)
Using GitHub repository: RaspAP/raspap-webgui 2.8.7 branch
Configuration directory: /etc/raspap
lighttpd root: /var/www/html? [Y/n]: Y
Installing lighttpd directory: /var/www/html
Complete installation with these values? [Y/n]: Y
RaspAP Install: Updating sources
Hit:1 http://archive.raspberrypi.org/debian bullseye InRelease
Hit:2 http://raspbian.raspberrypi.org/raspbian bullseye InRelease
Reading package lists...
RaspAP Install: Checking for systemd network services
systemd-networkd.service is not running (ok)
systemd-resolved.service is not running (ok)
[ ✓ ok ]
RaspAP Install: Installing required packages
...
RaspAP Install: Optimize PHP configuration
Enable HttpOnly for session cookies (Recommended)? [Y/n]: Y
Php-cgi enabling session.cookie_httponly.
RaspAP Install: Cloning latest files from github
Cloning into '/tmp/raspap-webgui'...
[ ✓ ok ]
RaspAP Install: Changing file ownership in web root directory
RaspAP Install: Creating hostapd logging & control scripts
[ ✓ ok ]
RaspAP Install: Creating lighttpd control scripts
Copying configport.sh to /etc/raspap/lighttpd
Changing file ownership
[ ✓ ok ]
RaspAP Install: Copying lighttpd extra config files
Copying 50-raspap-router.conf to /etc/lighttpd/conf-available
Creating link to /etc/lighttpd/conf-enabled
Existing 50-raspap-router.conf found. Unlinking.
unlink: cannot unlink '/etc/lighttpd/conf-enabled/50-raspap-router.conf': No such file or directory
Linking 50-raspap-router.conf to /etc/lighttpd/conf-enabled/
[ ✓ ok ]
RaspAP Install: Moving configuration file to /etc/raspap
changed ownership of '/etc/raspap/raspap.php' from root:root to www-data:www-data
RaspAP Install: Applying default configuration to installed services
Changing file ownership of /etc/raspap/networking/defaults.json
Checking for existence of /etc/dnsmasq.d
Copying bridged AP config to /etc/systemd/network
Copying primary RaspAP config to includes/config.php
[ ✓ ok ]
RaspAP Install: Configuring networking
Enabling IP forwarding
net.ipv4.ip_forward = 1
Restarting procps (via systemctl): procps.service.
Checking iptables rules
Adding rule: -t nat -A POSTROUTING -j MASQUERADE
Adding rule: -t nat -A POSTROUTING -s 192.168.50.0/24 ! -d 192.168.50.0/24 -j MASQUERADE
Persisting IP tables rules
Enable RaspAP control service (Recommended)? [Y/n]: Y
RaspAP Install: Enabling RaspAP daemon
Disable with: sudo systemctl disable raspapd.service
Created symlink /etc/systemd/system/multi-user.target.wants/raspapd.service → /lib/systemd/system/raspapd.service.
[ ✓ ok ]
RaspAP Install: Configure ad blocking (Beta)
Install ad blocking and enable list management? [Y/n]: n
[ ✓ ok ] (Skipped)
RaspAP Install: Configure OpenVPN support
Install OpenVPN and enable client configuration? [Y/n]: n
[ ✓ ok ] (Skipped)
RaspAP Install: Configure WireGuard support
Install WireGuard and enable VPN tunnel configuration? [Y/n]: n
[ ✓ ok ] (Skipped)
RaspAP Install: Adding raspap.sudoers to /etc/sudoers.d/090_raspap
RaspAP Install: Symlinked wpa_supplicant hooks for multiple wlan interfaces
RaspAP Install: Unmasking and enabling hostapd service
Removed /etc/systemd/system/hostapd.service.
Synchronizing state of hostapd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable hostapd
[ ✓ ok ]
RaspAP Install: Installation completed
Join RaspAP Insiders for early access to exclusive features!
> https://docs.raspap.com/insiders/
> https://github.com/sponsors/RaspAP/
The system needs to be rebooted as a final step. Reboot now? [Y/n]: Y
Le script d'installation vient de terminer la mise en place et la configuration de modules nécessaires. On peut remarquer également que de nouvelles règles ont été ajoutées sur iptables. La dernière réponse étant positive, le système redémarre.
Une fois que le système a redémarré, nous constatons l'apparition d'un nouveau réseau Wi-Fi disponible avec le SSID suivant : raspi-webgui. Nous allons nous connecter à ce nouveau réseau pour tester le fonctionnement et continuer la configuration. Pour ce faire, nous allons renseigner comme mot de passe du réseau la valeur par défaut "ChangeMe" .
Une fois la connexion effectuée, nous allons nous connecter à l'interface web de configuration de RaspAP disponible par défaut à l'adresse suivante : 10.3.141.1. Les identifiants par défaut sont les suivants :
Username : admin
Password : secret
Nous allons maintenant modifier la configuration par défaut sur l'onglet Hotspot :
D'abord, sur la partie "Basic", nous remplacerons le SSID par défaut pour, par exemple, "DEMO_ECS". Il faut aussi choisir comme "Wireless Mode" : 802.11n - 2.4 GHz car nos dispositifs Shelly fonctionnent dans la bande 2.4 GHz. Puis on clique "Save Settings".
Ensuite, dans la partie "Security" on va modifier le mot de passe du réseau Wi-Fi par défaut en choisissant par exemple "demodemo", suivi d'un clic sur "Save settings" :
Et enfin, sur l'onglet "Advanced" nous allons choisir comme "Country Code" : France.
Remarque : RaspAP supporte aussi le mode "WiFi client AP" qui permet d'utiliser le module Wi-Fi de Raspberry Pi pour générer un point d'accès et se connecter en même temps à un réseau Wi-Fi existant comme client. Pour des raisons de simplicité, nous n'allons pas configurer ce mode.
Après l'enregistrement de ces paramètres, nous allons redémarrer le point d'accès pour que les nouvelles valeurs entrent en vigueur en cliquant sur "Restart hotspot".
Nous allons ensuite nous connecter au nouveau réseau Wi-Fi avec le SSID "DEMO_ECS" que nous venons de configurer. Nous pouvons alors démarrer la connexion SSH vers l'adresse RaspAP par défaut : 10.3.141.1 et pour vérifier que notre Raspberry Pi a bien détecté notre PC qui vient de se connecter, nous allons lancer la commande suivante :
pi@raspberrypi:~ $ arp -a | grep wlan0
P-LIL-CADDY (10.3.141.148) at 10:a5:XX:XX:XX:XX [ether] on wlan0
Nous constatons que le PC est dans la liste. La configuration nécessaire du RaspAP est donc terminée.
Étape 2 : configuration du capteur PIR
Une fois notre réseau Wi-Fi assuré par RaspAP opérationnel, nous allons passer à la configuration de nos objets connectés. Nous allons commencer par le capteur de mouvement. Pour ce faire il faut activer le mode de configuration de notre capteur connecté en appuyant pendant quelques secondes sur un bouton prévu à cet effet à l'aide d'un trombone, comme indiqué sur l'image ci-dessous :
Une fois le dispositif dans le mode de configuration, nous allons constater un nouveau réseau Wi-Fi de configuration disponible avec le SSID du format suivant : shellymotionsensor-XXXXXXXXXXXX, où XXXXXXXXXXXX est la valeur de l'adresse MAC de notre dispositif. On va se connecter à ce réseau ouvert (pas de mot de passe) et accéder à l'interface web de configuration disponible à l'URL http://192.168.33.1 .
Nous naviguons alors vers la partie "Internet & Security" dans laquelle nous configurons les sections "WIFI MODE - CLIENT" avec les paramètres de connexion à notre réseau Wi-Fi RaspAP puis "COIOT", dans laquelle nous allons spécifier l'adresse de notre futur serveur COIOT - réalisé par Home Assistant - et le port de CoIoT par défaut : 10.3.141.1:5683 (adresse est toujours la même adresse par défaut de RaspAP). A la fin de la configuration, nous cliquons sur "SAVE".
Le réseau de configuration va disparaître, et le dispositif se connectera à notre réseau assuré par RaspAP. Pour vérifier, nous allons nous reconnecter par SSH à travers le réseau RaspAP vers notre Raspberry Pi et nous allons lancer de nouveau la commande suivante :
pi@raspberrypi:~ $ arp -a | grep wlan0
shellymotionsensor-60A423BEB0C2 (10.3.141.157) at 60:a4:23:be:b0:c2 [ether] on wlan0
P-LIL-CADDY (10.3.141.148) at 10:a5:XX:XX:XX:XX [ether] on wlan0
pi@raspberrypi:~ $ ping 10.3.141.157
PING 10.3.141.157 (10.3.141.157) 56(84) bytes of data.
64 bytes from 10.3.141.157: icmp_seq=1 ttl=255 time=1003 ms
64 bytes from 10.3.141.157: icmp_seq=2 ttl=255 time=12.3 ms
^C
--- 10.3.141.157 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 12.310/507.718/1003.126/495.408 ms
Nous venons de tester la connectivité avec notre dispositif avec la commande "ping". La configuration du capteur de mouvement est terminée.
Étape 3 : configuration de la prise connectée
Pour configurer la prise électrique connectée, nous allons suivre la procédure similaire à celle pour le capteur de mouvement : après avoir branché la prise connectée au secteur, nous allons appuyer pendant quelques secondes sur le bouton indiqué sur l'image ci-dessous :
La prise entrera en mode de configuration et le réseau Wi-Fi avec SSID du format suivant apparaîtra : shellyplug-s-XXXXXX, où XXXXXX - est une partie de l'adresse MAC de notre dispositif. De même manière que dans le cas du capteur de mouvement, nous allons nous connecter à ce réseau ouvert et accéder à l'interface web de configuration à l'adresse http://192.168.33.1. Nous allons configurer les même éléments que dans le cas précédent : section "WIFI MODE - CLIENT" et la partie CoIoT dans "ADVANCED - DEVELOPER SETTINGS" (les deux se trouvent dans la partie "Internet & Security" ). A la fin de la configuration, on clique sur "SAVE".
De nouveau, le réseau de configuration va disparaître, et le dispositif se connectera à notre réseau assuré par RaspAP. Pour vérifier, nous allons nous reconnecter par SSH à travers le réseau RaspAP vers notre Raspberry Pi et nous allons lancer les mêmes commandes :
pi@raspberrypi:~ $ arp -a | grep wlan0
shellymotionsensor-60A423BEB0C2 (10.3.141.157) at 60:a4:23:be:b0:c2 [ether] on wlan0
P-LIL-CADDY (10.3.141.148) at 10:a5:XX:XX:XX:XX [ether] on wlan0
shellyplug-s-BB9111 (10.3.141.96) at e8:db:84:bb:91:11 [ether] on wlan0
pi@raspberrypi:~ $ ping 10.3.141.96
PING 10.3.141.96 (10.3.141.96) 56(84) bytes of data.
64 bytes from 10.3.141.96: icmp_seq=1 ttl=128 time=158 ms
64 bytes from 10.3.141.96: icmp_seq=2 ttl=128 time=182 ms
^C
--- 10.3.141.96 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 157.772/169.907/182.042/12.135 ms
Nous avons confirmé la connectivité de notre prise avec le test "ping".
Étape 4 : installation du Docker
Nous allons maintenant installer Docker qui va nous aider à lancer le Home Assistant au sein d'un conteneur. Pour cela, nous allons d'abord exécuter la commande :
pi@raspberrypi:~ $ sudo apt-get update
Ensuite nous téléchargeons et exécutons le script d'installation du Docker :
pi@raspberrypi:~ $ curl -fsSL https://get.docker.com -o get-docker.sh
pi@raspberrypi:~ $ sudo sh get-docker.sh
# Executing docker install script, commit: 66474034547a96caa0a25be56051ff8b726a1b28
+ sh -c apt-get update -qq >/dev/null
Une fois installé, nous allons faire le nécessaire pour pouvoir exécuter Docker sans être "root". A la fin, il faut se reconnecter pour que les modifications soient prises en compte :
pi@raspberrypi:~ $ sudo usermod -aG docker $USER
pi@raspberrypi:~ $
logout
Connection to 10.3.141.1 closed.
pi@raspberrypi:~ $ docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:46:47 2023
OS/Arch: linux/arm
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.1
API version: 1.42 (minimum version 1.12)
Go version: go1.19.5
Git commit: bc3805a
Built: Thu Feb 9 19:46:47 2023
OS/Arch: linux/arm
Experimental: false
containerd:
Version: 1.6.18
GitCommit: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Nous constatons que Docker est bien installé sur notre système et qu'on peut l'exécuter sans être "root".
Étape 5 : Installation et configuration de Home Assistant
Nous allons maointenant procéder à l'installation de Home Assistant sous forme d'un conteneur Docker. Pour cela nous allons créer d'abord le dossier pour des fichiers de configuration "ha_config" que sera monté comme un volume à notre conteneur pour assurer la persistance (si le conteneur lui-même est supprimé, la configuration sera conservée). Nous allons également créer le fichier "compose.yml" avec le contenu suivant :
version: '3'
services:
homeassistant:
container_name: homeassistant
image: "ghcr.io/home-assistant/home-assistant:stable"
volumes:
- /home/pi/ha_config:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: host
Remarque : il est possible de configurer l'utilisation de "namespaces" pour le Docker afin de favoriser l'aspect sécurité. Dans ce cas, pour autoriser les conteneur à accéder aux réseaux de notre système "host" (notamment au réseau Wi-Fi de RaspAP), il est nécessaire de rajouter dans le fichier "compose.yml" un paramètre : "userns_mode: host". Cependant, cette configuration est hors périmètre de l'article.
Notez que nous avons spécifié le répertoire de configuration dans le fichier.
On va vérifier que le dossier de configuration et le fichier compose.yml sont bien crées :
pi@raspberrypi:~ $ ls -l
total 28
-rw-r--r-- 1 pi pi 293 Feb 21 10:22 compose.yml
-rw-r--r-- 1 pi pi 18906 Feb 21 09:42 get-docker.sh
drwxr-xr-x 2 pi pi 4096 Feb 21 10:23 ha_config
On démarre alors Home Assistant grâce à Docker Compose :
pi@raspberrypi:~ $ docker compose up -d
[+] Running 29/29
⠿ homeassistant Pulled 321.9s
⠿ e44ba29d168a Pull complete 2.2s
⠿ 44c80762f78c Pull complete 2.6s
⠿ ac0dae899fef Pull complete 20.0s
⠿ e98098909631 Pull complete 21.0s
⠿ ddbccfaf511f Pull complete 32.5s
⠿ e9a9ced295b4 Pull complete 33.1s
⠿ 49510eb9205a Pull complete 39.8s
⠿ b53cf8ac2105 Pull complete 54.5s
⠿ 3eb92f4be9ac Pull complete 54.9s
⠿ 73cc12506aef Pull complete 58.7s
⠿ 4f4fb700ef54 Pull complete 59.1s
⠿ 3604bab5e353 Pull complete 59.8s
⠿ f74b796deffb Pull complete 60.4s
⠿ 91f492a83ba2 Pull complete 64.0s
⠿ f09d7dd53806 Pull complete 64.6s
⠿ f7408a3e104b Pull complete 65.9s
⠿ e140a5564b2e Pull complete 66.3s
⠿ 001268b1a999 Pull complete 66.8s
⠿ 9ab20091d599 Pull complete 67.2s
⠿ f32b731f28a2 Pull complete 68.1s
⠿ 8cac16430c8f Pull complete 68.5s
⠿ 9516cf920974 Pull complete 77.4s
⠿ 80a3c300c641 Pull complete 77.8s
⠿ ad8bcb6bf65d Pull complete 279.8s
⠿ 6d0c43d9de31 Pull complete 308.8s
⠿ 82bb3e859257 Pull complete 318.5s
⠿ 14d3743ef76d Pull complete 318.9s
⠿ ce920e059020 Pull complete 319.2s
[+] Running 1/1
⠿ Container homeassistant Started 6.9s
pi@raspberrypi:~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db778fb103d8 ghcr.io/home-assistant/home-assistant:stable "/init" 11 minutes ago Up 11 minutes homeassistant
A la fin, nous avons vérifié que le conteneur avec Home Assistant fonctionne.
Nous pouvons à présent nous connecter à l'interface web de Home Assistant accessible sur le port 8123 (nous utilisons toujours l'adresse de notre Raspberry Pi sur le réseau RaspAP : 10.3.141.1).
Lors de la première connexion nous nous retrouvons à la page de création de compte (en local sur notre Raspberry Pi):
Nous allons renseigner les champs nécessaires et suivre les pages de l'outil de configuration.
Nous nous retrouvons ensuite sur le tableau de bord de Home Assistant :
Ensuite, nous allons configurer nos dispositifs connectés (capteur de mouvement et la prise). Pour cela, nous naviguons dans Paramètres - Appareils et services et nous cliquons sur "Ajouter une intégration". Dans la fenêtre qui s'ouvre, nous recherchons le mot-clé "shelly" - fabricant de nos dispositifs.
Pour ajouter le dispositif, nous renseignons son adresse IP dans le champ :
Après avoir répété la manipulation pour nos deux dispositifs (un par un), nous constatons la présence des deux dans la liste :
Nous revenons vers la page d'accueil en cliquant sur "Aperçu" :
Nous constatons que deux nouvelles cartes liées à nos dispositifs sont apparues sur la page d'accueil de Home Assistant.
Pour pouvoir ajouter la carte du panneau de configuration de notre alarme, il faut d'abord ajouter quelques lignes dans les fichiers de configuration de Home Assistant. Pour cela, nous revenons dans notre terminal et nous créons le fichier "alarm_control_panel.yaml" dans le dossier de configuration avec le contenu suivant :
- platform: manual
name: Demo Alarm
code: 1234
arming_time: 3
delay_time: 3
disarm_after_trigger: false # Leave alarm armed after triggering.
trigger_time: 600 # How long the alarm goes off for.
disarmed:
trigger_time: 0 # Can't be triggered when disarmed.
Ce fichier contient la description générale des paramètres de l'alarme (le code d'activation/désactivation, la durée d'activation de l'alarme (temps pour quitter le bâtiment avant que l'alarme soit activée etc.). Pour avoir plus de détails sur les paramètres disponibles, vous pouvez consulter la page de documentation de l'intégration de l'alarme.
Ensuite, nous devons inclure le fichier que nous venons de créer dans la configuration générale de Home Assistant. Pour cela nous allons ajouter une ligne dans le fichier principal de configuration "configuration.yaml". Après la modification, le contenu du fichier sera le suivant :
pi@raspberrypi:~/ha_config $ cat configuration.yaml
# Loads default set of integrations. Do not remove.
default_config:
# Load frontend themes from the themes folder
frontend:
themes: !include_dir_merge_named themes
# Text to speech
tts:
- platform: google_translate
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
alarm_control_panel: !include alarm_control_panel.yaml
Nous pouvons remarquer, parmi les fichiers inclus, le fichier "automations.yaml". Ce fichier décrit le fonctionnement de l'alarme (conditions de passage d'un état à l'autre, les actions à exécuter dans un état précis, etc.). Nous allons intégrer le contenu suivant dans ce fichier :
- alias: Alarm - Trigger when motion detected
trigger:
- platform: state
entity_id: binary_sensor.shellymotionsensor_60a423beb0c2_motion
to: 'on'
condition:
condition: or
conditions:
- condition: state
entity_id: alarm_control_panel.demo_alarm
state: armed_away
- condition: state
entity_id: alarm_control_panel.demo_alarm
state: armed_home
action:
service: alarm_control_panel.alarm_trigger
entity_id: alarm_control_panel.demo_alarm
- alias: Alarm - Pending
trigger:
- platform: state
entity_id: alarm_control_panel.demo_alarm
from: armed_away
to: pending
action:
- alias: Alarm - Triggered
trigger:
- platform: state
entity_id: alarm_control_panel.demo_alarm
to: triggered
action:
- service: switch.turn_on
data:
entity_id: switch.shelly_plug_s
- alias: Alarm - Disarmed
trigger:
- platform: state
entity_id: alarm_control_panel.demo_alarm
to: disarmed
action:
- service: switch.turn_off
target:
entity_id: switch.shelly_plug_s
Nous spécifions que le facteur de déclenchement de l'alarme (quand elle est activée) est le passage de notre capteur de mouvement en état "On".
Nous avons également décrit l'action dans l'état "Triggered" et "Disarmed" - activation et désactivation de la prise électrique respectivement. Pour plus de détails sur des différents états de l'alarme, vous pouvez consulter la page de documentation de l'intégration de l'alarme.
Après les manipulations mentionnées ci-dessus, le dossier de configuration de Home Assistant aura le contenu suivant :
pi@raspberrypi:~/ha_config $ ls -la
total 3608
drwxr-xr-x 7 pi pi 4096 Feb 21 13:02 .
drwxr-xr-x 3 pi pi 4096 Feb 21 10:53 ..
-rw-r--r-- 1 pi pi 166 Feb 21 13:02 alarm_control_panel.yaml
-rw-r--r-- 1 root root 1068 Feb 21 12:53 automations.yaml
drwxr-xr-x 4 root root 4096 Feb 21 10:54 blueprints
drwxr-xr-x 2 root root 4096 Feb 21 10:54 .cloud
-rw-r--r-- 1 root root 374 Feb 21 12:46 configuration.yaml
drwxr-xr-x 2 root root 4096 Feb 21 10:54 deps
-rw-r--r-- 1 root root 8 Feb 21 10:54 .HA_VERSION
-rw-r--r-- 1 root root 423 Feb 21 11:15 home-assistant.log
-rw-r--r-- 1 root root 0 Feb 21 10:54 home-assistant.log.1
-rw-r--r-- 1 root root 0 Feb 21 10:54 home-assistant.log.fault
-rw-r--r-- 1 root root 4096 Feb 21 10:54 home-assistant_v2.db
-rw-r--r-- 1 root root 32768 Feb 21 13:02 home-assistant_v2.db-shm
-rw-r--r-- 1 root root 3600912 Feb 21 13:02 home-assistant_v2.db-wal
-rw-r--r-- 1 root root 0 Feb 21 10:54 scenes.yaml
-rw-r--r-- 1 root root 0 Feb 21 10:54 scripts.yaml
-rw-r--r-- 1 root root 161 Feb 21 10:54 secrets.yaml
drwxr-xr-x 2 root root 4096 Feb 21 13:00 .storage
drwxr-xr-x 2 root root 4096 Feb 21 10:54 tts
Il faut alors redémarrer le Home Assistant pour que la nouvelle configuration entre en vigueur. Avant cela, il est utile de vérifier la syntaxe de nos fichiers de configuration. Pour cela, dirigeons-nous dans l'interface web de Home Assistant, dans l'onglet "Outils de développement". Puis cliquons sur "Vérifier la configuration". S'il n'y a pas d'erreurs, nous pouvons cliquer sur "Redémarrer".
Après le redémarrage, nous trouverons sur la page d'accueil une nouvelle carte qui représente le panneau de configuration d'alarme.
Remarque : pour modifier la configuration des cartes sur Home Assistant, vous pouvez utiliser le menu avec trois points en haut à droite, puis "Modifier le tableau de bord".
Étape 6 : tester le fonctionnement
Dès que la configuration est terminée, nous pouvons tester le fonctionnement de l'alarme.
Pour activer l'alarme nous allons d'abord taper le code "1234" sur le panneau de configuration de l'alarme, puis cliquer sur "ARMER". Nous voyons deux modes pour armer l'alarme (présent ou absent). Dans notre fichier de configuration, nous avons prévu le même fonctionnement pour les deux. A titre d'exemple, nous allons choisir "Armer (absent)". L'alarme va entrer en mode d'activation pendant la durée spécifiée dans le fichier "alarm_control_panel.yaml" :
A l'issue de la période d'activation, l'alarme sera activée :
Pour simuler l'intrusion, nous allons générer un mouvement, en passant la main au dessus du capteur de mouvement (voir la carte du capteur de mouvement sur l'image ci-dessous). L'alarme va passer en mode intermédiaire "En attente" pendant la durée spécifiée dans le même fichier. En pratique, ce mode permet d'avoir le temps de désactiver l'alarme s'il ne s'agit pas de l'intrusion.
Si le code de désactivation n'a pas été saisi dans le délai, l'alarme passe en mode "Déclenché", ce qui active la prise électrique (voir l'interrupteur sur l'image).
Nous pouvons maintenant saisir le code "1234" de nouveau et cliquer sur "Désarmer" pour désactiver l'alarme. L'alarme passe alors en mode initial - "Désactivée" et la prise connectée désactive sa sortie de courant :
Conclusion
Dans cet article nous avons mis en place un modèle simple d'une alarme de sécurité à la base du logiciel libre Home Assistant. Ce logiciel est capable de fonctionner en local, ce qui rend possible l'utilisation du système de manière complètement autonome, sans la dépendance de la connexion à Internet. L'utilisation de la solution Open Source RaspAP nous a permis de réduire l'infrastructure nécessaire au fonctionnement au minimum. Le système peut être utilisé comme une base d'un système d'alarme plus complexe ou servir d'un démonstrateur d'un système IoT simpliste et complet.