Linux Embedded

Le blog des technologies libres et embarquées

Réaliser une alarme de sécurité avec une Raspberry Pi et Home Assistant

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 :


raspi-config2raspi-config 3raspi-config 4

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 :
 

bouton d'activation mode configurartion capteur



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".

interface web motion



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 :

 

activation mode configurartion prise


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".
 

Interface web plug


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):
 

HA onboarding


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 :
 

HA home



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.
 

appareils et servicesintégrations


Pour ajouter le dispositif, nous renseignons son adresse IP dans le champ :
 

Entrer IP


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 :
 

Dispositifs ajoutés


Nous revenons vers la page d'accueil en cliquant sur "Aperçu" :
 

HA home 2


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".
 

Check config


Après le redémarrage, nous trouverons sur la page d'accueil une nouvelle carte qui représente le panneau de configuration d'alarme.

 

alarme presente


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" :
 

Activation


A l'issue de la période d'activation, l'alarme sera activée :
 

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.
 

En attente


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).
 

Déclenché


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 :
 

Désactivée


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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.