Comment je gère la sécurité de ma maison grâce à Alarmo ?
Notre besoin
Depuis que nous avons emménagé dans notre nouvelle maison (fin 2021), nous savions que nous allions investir dans un système d'alarme. Nous voulions une solution qui soit fiable, esthétique et que je puisse intégrer à Home Assistant.
Notre choix se portait initialement sur un système Somfy, une marque française qui offre un système bien intégré. J'aime beaucoup leur système intelliTag hérité du rachat de la société myFox. Ce qui nous a freiné ? Le prix ! Pour notre configuration, nous dépassions facilement les 1 000€ de matériel.
Un cambriolage chez une voisine nous a fait réagir et nous nous sommes empressés de nous équiper d'un système d'alarme.
C'est à ce moment-là que j'ai vraiment creusé le sujet et que j'ai réalisé qu'il existait des solutions logicielles et matérielles pour répondre à tous nos besoins : fiables, esthétiques, bien intégrées à Home Assistant.
Les contraintes que nous voulons couvrir
Femme de ménage
Toutes les semaines, une personne vient faire du ménage à la maison. Elle peut entrer dans la maison sans que nous ne soyons présent grâce à notre serrure connectée Nuki. Nous sommes équipés d'un Nuki Keypad et elle a son propre code, ce qui lui permet d'être autonome.
L'alarme doit être désactivée lorsqu'elle est présente.
Robot aspirateur
Nous avons 2 aspirateurs robot : un pour le rez-de-chaussée et un pour l'étage. Quand le robot du rez-de-chaussée est en action, il déclenche les détecteurs de mouvement, et donc l'alarme.
Les détecteurs de mouvement doivent être désactivés lorsque le robot est en marche.
Possibilité de donner les accès à la maison lorsque nous sommes absents
Il peut arriver que nos parents déposent notre fils à la maison, ou alors un voisin peut venir déposer le courrier et jeter un oeil à la maison lorsque nous sommes en vacances.
Il y a plein de cas pour lesquels nous avons besoin de rendre possible la désactivation de l'alarme lorsque nous sommes absents, sans pour autant devoir le faire nous-même avec le téléphone.
Il est donc important d'intégrer un clavier physique à notre système.
Mise en oeuvre : gestion des états
Pré-requis et décisions
Pour en savoir plus sur mon installation, je vous invite à consulter l'article ci-dessous.
Ici, tout ce dont nous avons besoin c'est d'une instance Home Assistant sur laquelle est installée l'add-on Alarmo. Je vous invite à suivre la documentation officielle pour l'installation.
Je vous invite également à consulter l'article dans lequel j'explique comment mettre en place un système de gestion d'état de la maison. Cela pourrait vous donner des idées quant à la façon dont vous souhaitez gérer le changement d'état de votre alarme.
Pour gérer la présence (ou la possibilité de présence) de notre femme de ménage, j'ai créé une entrée input_schedule
qui me permet de définir les créneaux prévus pour sa venue. L'entité a pour identifiant input_schedule.housemaid_presence
.
Matériel
J'ai choisi de baser mon système d'alarme sur des capteurs Xiaomi Aqara en ZigBee. J'ai fait l'acquisition de 4 détecteurs de mouvement et 9 détecteurs d'ouverture. Au moment de l'acquisition de ces capteurs, je me suis rendus compte qu'ils n'étaient pas compatibles avec ZHA. J'avais pour projet de migrer sur zigbee2MQTT, cela n'a fait qu'accélérer la migration.
J'avais également déjà créé un détecteur de présence grâce à une carte ESP + LD2410 configurée via ESPHome.
Pour le contrôle d'accès / activation / désactivation manuel, je me suis équipé d'un clavier ZigBee Frient Keypad.
Pour aller plus loin dans l'intégration de ce clavier dans mon système, je vous propose de consulter l'article dédié à sa mise en place.
Cas d'usage et déclencheurs
J'ai identifié, pour mon usage, 6 situations que j'ai besoin de gérer. Pour chacune de ces situations, je me suis efforcé de définir techniquement comment cela était traduit au sein de mon installation.
disarmed
, armed_away
, armed_home
, armed_night
Cas d'usage | Techniquement, comment c'est géré ? | Statut de l'alarme |
---|---|---|
Tout le monde est absent | input_select.house_mode updated to [away , holliday ] |
armed_away |
Quelqu'un est revenu | input_select.house_mode updated to [home , night , guest ] |
disarmed |
L'aspirateur tourne | vacuum.roborock_s8_pro_ultra updated to [cleaning , returning ] |
armed_home |
L'aspirateur a terminé | vacuum.roborock_s8_pro_ultra updated to [docked , paused ] |
last known status * |
La femme de ménage est présente | schedule.housemaid_presence updated to on |
disarmed |
La femme de ménage est absente | schedule.housemaid_presence updated to off |
last known status * |
docked
, cleaning
, error
, idle
, paused
, returning
, unavailable
, unknown
.Lorsque l'aspirateur tourne, je me suis aperçu qu'il déclenchait mes capteurs de mouvement. La solution a été de basculer le statut de l'alarme à armed_home
lorsque l'aspirateur est en fonctionnement. Cela permet de désactiver les capteurs de mouvement tout en conservant actifs les capteurs d'ouverture.
Pour aller plus loin
Ma porte d'entrée est équipée d'une serrure connectée Nuki (Smart Lock 3 pro) associée à un clavier avec lecteur d'empreintes (Keypad 2). Le système est intégré via MQTT dans mon instance Home Assistant.
Dommage qu'il ne soit pas possible de récupérer le code / hash / ... ou quelconque information depuis Nuki de qui a déverrouillé la porte. Cela me permettrait de lier l'ouverture de la porte à la désactivation de l'alarme si la personne est autorisée à ouvrir la maison.
Algorithme
Voilà le décor planté. Nous savons quels cas nous avons à gérer et comment coupler ça à mes équipements. Pour nous simplifier les choses, il est intéressant de poser tout cela sous forme d'un algorithme. Cela permettra d'identifier, quand c'est possible, des simplifications de l'implémentation.
Voilà ce que je propose :
IF house_mod == ["home", "night", "guest"] OR housemaid is home THEN
set Alarmo_mod = "disarmed"
ELSE IF vacuum is in progress THEN
set Alarmo_mod = "armed_home"
ELSE
set Alarmo_mod = "armed_away"
END IF
Comment l'intégrer dans Home Assistant ?
La première étape consiste, bien entendu, à créer une nouvelle automatisation qui permettra de surveiller les déclencheurs pour décider d'un changement d'état de l'alarme. L'id de l'entité de mon automatisation est automation.alarm_mode_auto
.
Pour simplifier les choses, j'ai créé un script qui me permet de changer le mode de l'alarme Alarmo. Cela permet d'abstraire ces actions et rendre plus lisible mes automatisations. Voici le script mis en place :
Ce script permet, grâce à un appel précisant le code et le statut cible, de changer l'état de l'alarme. C'est une première étape car dans mes automatisations je ne souhaite pas avoir à passer des codes, ceux-ci ne pouvant être récupérés depuis les secret lorsque l'automatisation est définie depuis l'interface.
J'ai donc créé un second script qui me permet de me passer de ce code.
Maintenant que nous avons notre script, il ne nous reste plus qu'à compléter notre automatisation.
alias: alarm_mode_auto
description: ""
trigger:
- platform: state
entity_id:
- input_select.house_mode
- platform: state
entity_id:
- vacuum.roborock_s8_pro_ultra
- platform: state
entity_id:
- schedule.housemaid_presence
condition: []
action:
- choose:
- conditions:
- condition: or
conditions:
- condition: state
entity_id: input_select.house_mode
state: home
- condition: state
entity_id: input_select.house_mode
state: night
- condition: state
entity_id: input_select.house_mode
state: guest
- condition: state
entity_id: schedule.housemaid_presence
state: "on"
sequence:
- service: script.alarmo_change_mode
metadata: {}
data:
mode: disarmed
- conditions:
- condition: or
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: cleaning
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: returning
sequence:
- service: script.alarmo_change_mode
metadata: {}
data:
mode: armed_home
default:
- service: script.alarmo_change_mode
metadata: {}
data:
mode: armed_away
mode: single
Voilà, la base du système est en place. Mon alarme est (dés)armée automatiquement en fonction de mes habitudes. Reste maintenant à définir ce qu'il se passe si une intrusion est détectée.
Mise en oeuvre : Déclenchement de l'alarme
Matériel
En complément des éléments permettant la détection des intrusions et la gestion des états, je me suis équipé d'une sirène extérieure. Mon pré-requis ? Une sirène ZigBee ou z-wave, esthétique et pouvant fonctionner sur batterie.
La recherche n'a pas été des plus faciles et finalement, bien que le prix soit relativement élevé, mon choix s'est porté sur la sirène proposée par Bosch. Celle-ci peut être facilement intégrée à ZigBee2MQTT (attention à suivre la documentation officielle, l'appairage se faisant en mode sécurisé). Elle peut être alimentée par un câble ou grâce au panneau solaire intégré.
Je possède également une enceinte Sonos (Symfonisk) dans la cuisine, qui me permettra de diffuser des messages et/ou alertes.
Principe de fonctionnement
Alarmo propose, via son interface, de définir 2 types de réaction à un changement d'état de l'alarme :
- Notification : notifier un téléphone ou envoyer un message dans une enceinte par exemple
- Action : changer l'état d'une ou plusieurs entités.
J'avais une idée assez précise de ce que je voulais déclencher en cas d'intrusion : Diffuser un message dans la maison, fermer tous les volets, déclencher la sirène extérieure, ... mais je voulais que tout cela soit séquentiel avec des temps d'attente (par exemple, je déclenche la sirène uniquement après 40 secondes, ...). Cela permet de désactiver le système et.ou de réagir en conséquence.
Je suis également adepte de garder mon système aussi simple et flexible que possible. J'ai donc choisi de créer 2 scripts, le premier permettant de réagir à un déclenchement de l'alarme et le second permettant d'interrompre le premier (grâce à mon téléphone ou suite à la désactivation de l'alarme grâce au clavier).
Mise en place des scripts
Le premier script n'est ni plus ni moins que la liste des actions que je souhaite lancer, de manière séquentielle, dès lors qu'une intrusion est détectée.
Nul besoin ici de commenter les différentes actions. Les commentaires parlent d'eux-même. Si vous souhaitez vous inspirer de ce que j'ai mis en place, je vous mets ici à disposition le Yaml.
alias: Alarm trigger
sequence:
- target:
entity_id: media_player.cuisine
data: {}
action: media_player.media_stop
- metadata: {}
data:
volume_level: 0.5
target:
entity_id: media_player.cuisine
action: media_player.volume_set
- metadata: {}
data:
code: "!secret keypad_code"
target:
entity_id: alarm_control_panel.frient_keypad_centrale_dalarme
enabled: false
action: alarm_control_panel.alarm_trigger
- delay:
hours: 0
minutes: 0
seconds: 20
milliseconds: 0
enabled: false
- data:
entity_id: media_player.cuisine
cache: false
message: >-
Intrusion détectée. Une alerte a été envoyée et les accès seront bientôt
condamnés. L'alarme va bientôt se déclencher.
action: tts.cloud_say
- delay:
hours: 0
minutes: 0
seconds: 15
milliseconds: 0
enabled: true
- metadata: {}
data: {}
target:
entity_id:
- cover.roller_fib_005
- cover.roller_fib_003
- cover.roller_fib_001
enabled: true
action: cover.close_cover
- delay:
hours: 0
minutes: 0
seconds: 10
milliseconds: 0
enabled: true
- target:
entity_id: siren.bosch_outdoor_siren_001_alarm_state
data: {}
enabled: true
action: siren.turn_on
mode: single
icon: mdi:alarm-light
Le second script va me permettre de suspendre le premier (dans le cas où l'alarme est désactivée notamment).
Je force également dans ce script l'arrêt de la sirène extérieure. Une fois de plus, voici le Yaml associé.
alias: Alarm clear
sequence:
- metadata: {}
data: {}
target:
entity_id: script.alarm_trigger
action: script.turn_off
- metadata: {}
data: {}
target:
entity_id: siren.bosch_outdoor_siren_001_alarm_state
action: siren.turn_off
mode: single
icon: mdi:alarm-light-off
Configuration Alarmo
Maintenant que les scripts sont créés, il ne nous reste plus qu'à orchestrer tout cela pour qu'ils soient déclenchés au bon moment. Pour cela, rendez-vous dans l'interface d'administration de Alarmo dans Home Assistant, puis dans l'onglet Actions.
Il suffit de créer une action, déclenchée sur l'événement "Alarme déclenchée". J'ai choisi de limiter cette action au mode mode "Absence" de mon alarme, libre à vous de définir ce que vous souhaitez mettre en place. Dans l'action, définissez l'entité sur l'entité correspondant à votre script et choisissez l'actions Exécuter. Enfin, définissez un nom et enregistrez.
Il ne reste plus qu'à faire de même avec le script permettant de désactiver la sirène et stopper l'alerte intrusion :
Conclusion
Nous avons vu ensemble, sur base de ma propre installation, comment mettre en place Alarmo et comment il est possible de l'orchestrer. Il ne vous reste plus qu'à définir vos besoins et vous lancer. Il ne faut pas hésiter à commencer "petit" et de faire vivre votre système en venant y intégrer de nouveaux modules, en fonction de l'évolution de vos usages.
Je suis preneur de toute remarque ! ;-)