Comment je gère la sécurité de ma maison grâce à Alarmo ?

Home assistant 19 nov. 2024

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.

Mon installation homelab
Configuration et usages avancés de Home Assistant

En savoir plus sur mon installation, tant logicielle que matérielle.

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.

Mise en place d’une gestion des états de la maison
Rendez votre maison plus intelligente grâce à une gestion de mode/état complète et flexible basée sur des automatisations et des scripts avancés. Explication pas à pas facile à décliner selon votre contexte.

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.

AQARA - Détecteur d’ouverture porte/fenêtre Zigbee 3.0 T1 MCCGQ12LM
Le capteur de porte et de fenêtre Aqara T1 détecte l’état ouvert et fermé des portes ou des fenêtres à travers la distance entre l’unité de capteur et l’aimant.

Lien non affilié

AQARA - Détecteur de mouvement et luminosité ZigBee 3.0 P1 RTCGQ14LM
Le Motion Sensor P1 détecte les mouvements et les variations de lumière ambiante, envoyant des alertes ou interagit avec d’autres appareils connectés.

Lien non affilié

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.

FRIENT - Clavier à codes intelligent Zigbee 3.0 + Lecteur RFID KEYZB-110
Contrôlez les accès de votre logement ou local professionnel avec le clavier à codes intelligent Frient.

Lien non affilié

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.

Synchroniser mon clavier physique avec l’état de mon alarme
Généralement positionné à l’entrée de la maison, un clavier physique permet d’activer ou désactiver facilement le système d’alarme. Voyons ensemble comment j’ai géré la synchronisation des statuts de l’alarme (Alarmo) et du mon clavier Frient.

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.

📍
Les statuts gérés à la fois par Alarmo et le clavier Frient sont les suivants : 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 *
💡
Pour information, voici les statuts possibles pour un aspirateur dans : 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.

description: "Automatically update alarm mode"
mode: single
trigger:
  - platform: state
    entity_id:
      - input_select.house_mode
  - platform: state
    entity_id:
      - vacuum.roborock_vacuum_s5
  - platform: state
    entity_id:
      - schedule.housemaid_presence
condition: []
action: []

Définition des déclencheurs de mon automatisation

💡
A noter, j'ai choisi de ne pas définir d'état cible dans mes déclencheurs. Je préfère vérifier leur état dans les actions directement.

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 :

alarmo_change_mode_code:
  alias: Change Alarmo mode with code
  description: Change Alarmo mode with code
  fields:
    code:
      description: Alarmo code to be used
      example: azerty
      required: true
      selector:
        text: null
    mode:
      description: Mode to switch to
      example: armed_away
      required: true
      selector:
        text: null
  mode: single
  sequence:
    - choose:
        - conditions:
            - condition: template
              value_template: "{{ mode == 'disarmed' }}"
          sequence:
            - service: alarmo.disarm
              data:
                entity_id: alarm_control_panel.alarmo
                code: "{{ code }}"
        - conditions:
            - condition: template
              value_template: "{{ mode == 'armed_home' }}"
          sequence:
            - service: alarmo.arm
              data:
                mode: home
                skip_delay: false
                force: false
                entity_id: alarm_control_panel.alarmo
                code: "{{ code }}"
        - conditions:
            - condition: template
              value_template: "{{ mode == 'armed_away' }}"
          sequence:
            - service: alarmo.arm
              data:
                mode: away
                skip_delay: false
                force: false
                entity_id: alarm_control_panel.alarmo
                code: "{{ code }}"
        - conditions:
            - condition: template
              value_template: "{{ mode == 'armed_night' }}"
          sequence:
            - service: alarmo.arm
              data:
                mode: night
                skip_delay: false
                force: false
                entity_id: alarm_control_panel.alarmo
                code: "{{ code }}"

Création du script permettant le changement d'état de l'alarme

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.

ℹ️
Le code utilisé est un mot de passe fort qui a été configuré dans Alarmo.
alarmo_change_mode:
  alias: Change Alarmo mode without code
  description: Change Alarmo mode without code
  fields:
    mode:
      description: Mode to switch to
      example: armed_away
      required: true
      selector:
        text: null
  mode: single
  sequence:
    - service: script.alarmo_change_mode_code
      data:
        entity_id: alarm_control_panel.alarmo
        code: !secret alarmo_systempass
        mode: "{{ mode }}"

Définition du script permettant de se passer du code pour le changement d'état de l'alarme

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

Sirène extérieure
Commander une alarme extérieure Smart Home : expédition gratuite ✓ livraison rapide ✓ renvoi gratuit ✓ alarmes extérieures interconnectables

Lien non affilié

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.

💡
Le fait de passer par un script permet de tester facilement le fonctionnement, sans avoir à simuler une intrusion.

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 ! ;-)

Mots clés

Teddy HENNART

Passionné par les nouvelles technologies et fervent utilisateur de Home Assistant depuis de nombreuses années après avoir été un utilisateur de Domoticz et avoir essayé Jeedom.