Pilotez votre alarme Diagral e-One avec Home Assistant

Vous avez une alarme Diagral ? Voici comment l'intégrer à Home Assistant.
Pilotez votre alarme Diagral e-One avec Home Assistant

Sommaire

Qui est Diagral ?

Avant de plonger dans le code et la configuration, un petit rappel sur l'acteur dont nous parlons aujourd'hui. Diagral est une entreprise française historique, pionnière dans le domaine de la sécurité résidentielle. Basée près de Grenoble et faisant partie du groupe Atraltech, la marque s'est forgée une solide réputation grâce à ses systèmes d'alarme sans fil, réputés pour leur fiabilité et leur simplicité d'installation "DIY".

Leur écosystème e-One est moderne, mais reste souvent perçu comme un "jardin fermé" par nous autres, les passionnés de domotique, qui aimons centraliser nos contrôles. Pour preuve, lors de mon utilisation précédente de Jeedom, j'avais développé un plugin Diagral sur la base d'un reverse engineering des appels API fait par l'application mobile. Pas très ouvert tout ça...

Diagral e-One

Pourquoi cette intégration ?

Si l'application Diagral e-One fait très bien son travail, elle manque cruellement d'interopérabilité avec le reste de la maison.

C'est pour combler ce manque que j'ai initié le développement de l'intégration hass-diagral. L'objectif était simple : faire remonter l'état de l'alarme et des capteurs directement dans notre dashboard préféré, tout en vous permettant d'automatiser nos scénarios de sécurité.

Mais ma quête secondaire était de ne pas avoir à réutiliser le travail que j'avais fait pour Jeedom. Il avait l'avantage d'exister, mais aussi l'inconvénient d'être lent et peu réactif (obligation de récupérer les informations périodiquement).

Par chance, ce travail de reverse engineering m'avait amené à discuter avec les développeurs de Diagral (j'avais cassé les systèmes avec un petit DDoS sur leurs API - involontaire bien sûr, mais trop d'utilisateurs en même temps qui rafraîchissent toutes les 5mn les données, les serveurs n'ont pas aimé). Et ils étaient justement en train de travailler sur une vraie API publique… Youpiiii !!!

Mais cette intégration, elle fait quoi ?

Avec cette intégration, votre Home Assistant devient le copilote de votre sécurité :

  • Armement et Désarmement : Gérez les modes Total, Nuit et Partiels (par groupes).
  • Remontée d'état en temps réel : Grâce aux webhooks, le changement de statut est quasi instantané.
  • Suivi des anomalies : Piles faibles, liaisons radio, etc...
  • Alertes : Détection des intrusions
Alarm Control Panel
⚠️
Pour les utilisateurs de mon plugin Diagral sous Jeedom, la nouvelle API ne prend pas en charge les équipements tiers comme les lumières, portails/garages, caméras, etc...
Ce n'est donc pas disponible dans l'intégration, mais vous pouvez venir ajouter vos demandes dans cette issue Github que je communique à Diagral

Prérequis

Avant de vous lancer, assurez-vous d'avoir :

  1. Une box Diagral e-One (DIAG56AAX) connectée et fonctionnelle.
  2. Vos identifiants Cloud Diagral (Email et mot de passe).
  3. Votre Code PIN (Master Code) de l'alarme (4 à 6 chiffres).
  4. Une connection internet sur votre Home Assistant (et oui c'est du Cloud)
  5. HACS installé sur votre instance Home Assistant.

Installation pas à pas

L'installation est très classique pour ceux qui ont l'habitude des "Custom Repositories".

1. Via HACS

Rendez-vous dans HACS > Intégrations, puis recherchez hass-diagral ou cliquez directement sur ce bouton :

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

⚠️ N'oubliez pas de redémarrer Home Assistant pour que la nouvelle intégration soit chargée.

Diagral integration in HACS

2. Configuration UI

La configuration est simple à mettre en place.

Direction Paramètres > Appareils et services. Cliquez sur "Ajouter une intégration" et cherchez "Diagral".

L'assistant vous demandera votre ID de box DIAG56AAX, vos identifiants cloud et votre Code PIN, suivi des options de configuration personnalisables.

Identifiant DIAG56AAX
Compte de connexion
Options

Le secret du temps réel : Les Webhooks

Par défaut, l'intégration va interroger le cloud Diagral régulièrement (toutes les 5 minutes). Mais pour une réactivité optimale, je vous conseille vivement d'utiliser les Webhooks.

Le cloud Diagral permet d'envoyer des webhooks à votre Home Assistant pour recevoir des alertes, des anomalies ou des changements d'état en temps réel. Les notifications sont transmises par système, et chaque système ne peut avoir qu'un seul abonnement webhook (une seule destination webhook).

ℹ️
Les webhook peuvent être enregistrés et désenregistrés manuellement au besoin avec les actions diagral.register_webhook et diagral.unregister_webhook

Les évènements Diagral

Lorsque l'intégration reçoit des webhooks du cloud Diagral, tous les webhooks reçus sont propagés au système d'événement de Home Assistant et peuvent être surveillés avec le type d'événement DIAGRAL_EVENT.

event_type: DIAGRAL_EVENT
data:
  type: STATUS
  data:
    transmitter_id: 1234567890ABCD
    alarm_code: "3401"
    alarm_description: LOCAL-ARMING-OF-GROUP
    group_index: NIGHT_MODE_GROUP_CODE
    detail:
      device_type: null
      device_index: null
      device_label: null
    user:
      username: HereMyName
      user_type: owner
    date_time: "2026-02-25T17:59:58.008154+00:00"
origin: LOCAL
time_fired: "2026-02-25T17:59:59.359763+00:00"
context:
  id: 01JMZ480KZPV5J7M1FX2QQWT47
  parent_id: null
  user_id: null

Les informations fournies par le webhook reçu se trouvent dans la clé data.
Le type peut être :

  • STATUT
  • ALERTE
  • ANOMALIE
  • INCONNU (Si vous rencontrez ce problème, veuillez ouvrir un ticket sur GitHub et fournir tous les détails pertinents de l’événement pour une analyse plus approfondie.)

Plus de détails sur les évènements sont disponibles dans la documentation officielle.

Dashboard

Parce qu'on aime bien quand c'est beau et pratique, voyons maintenant comment on met cela dans votre dashboard.

ℹ️
Dans les exemple de code YAML ci-dessous, remplacez maison_XXX par votre propre entité avec un search and replace (les noms d'entités étant nomenclaturées)

L'intégration utilise une entité de type alarm_control_panel qui dispose nativement d'une carte : alarm-panel qui peut être configuré ainsi :

type: alarm-panel
states:
  - arm_home
  - arm_away
entity: alarm_control_panel.maison_XXX_centrale

alarm_panel Card

alarm_panel Screenshot

Mais il existe aussi une carte mushroom-alarm-control-panel-card qui peut se configurer ainsi :

type: custom:mushroom-alarm-control-panel-card
entity: alarm_control_panel.maison_XXX_centrale
states:
  - armed_home
  - armed_away
fill_container: true
grid_options:
  columns: full
  rows: 2

mushroom-alarm-control-panel-card Card

mushroom-alarm-control-panel-card Screenshot

ou encore ma carte personnelle qui se base sur button_card et card_mod :

type: custom:button-card
entity: alarm_control_panel.maison_XXX_centrale
name: Système Alarme
show_name: false
show_state: false
show_icon: false
triggers_update:
  - sensor.maison_XXX_groupes_actifs
  - sensor.maison_XXX_anomalies
variables:
  active_color: red
  on_state: armed_away
styles:
  grid:
    - grid-template-areas: |
        "i btns"
        "s btns"
        "n btns"
        "hr hr"
        "f_left f_right"
        "group_list group_list"
    - grid-template-columns: 1fr 185px
    - grid-template-rows: min-content min-content min-content 20px min-content min-content
  card:
    - height: auto
    - min-height: 175px
    - border-radius: 16px
    - padding: 16px
    - background: |
        [[[ 
          if (entity.state == 'disarmed') return 'var(--ha-card-background, var(--card-background-color, white))'; 
          if (entity.state == 'armed_home') return '#7AAACE';
          if (entity.state == 'armed_away') return '#FF7070';
          if (entity.state == 'arming') return '#FF7070';
          return 'var(--ha-card-background, var(--card-background-color, white))'; 
        ]]]
  custom_fields:
    i:
      - justify-self: start
      - padding-left: 12px
    s:
      - justify-self: start
      - font-size: 19px
      - font-weight: 900
      - padding-left: 12px
      - color: >
          [[[ return (entity.state == 'disarmed') ? 'var(--primary-text-color)'
          : 'white'; ]]]
    "n":
      - justify-self: start
      - font-size: 11px
      - opacity: 0.8
      - padding-left: 12px
      - color: >
          [[[ return (entity.state == 'disarmed') ?
          'var(--secondary-text-color)' : 'white'; ]]]
    btns:
      - align-self: center
      - justify-self: end
    hr:
      - align-self: center
      - border-bottom: 1px solid rgba(var(--rgb-primary-text-color), 0.2)
      - width: 100%
    group_list:
      - justify-self: start
      - padding: 8px 12px 4px 12px
      - font-size: 13px
      - text-align: left
      - font-weight: 500
      - width: 100%
      - overflow: hidden
      - box-sizing: border-box
      - color: >
          [[[ return (entity.state == 'disarmed') ? 'var(--primary-text-color)'
          : 'white'; ]]]
custom_fields:
  i: |
    [[[ 
      let icon = 'mdi:shield-lock';
      if (entity.state == 'disarmed') icon = 'mdi:shield-lock-open';
      if (entity.state == 'armed_home') icon = 'mdi:shield-moon';
      if (entity.state == 'armed_away') icon = 'mdi:shield-lock';
      let color = (entity.state == 'disarmed') ? 'var(--primary-text-color)' : 'white';
      return `<ha-icon icon="${icon}" style="width: 26px; color: ${color};"></ha-icon>`; 
    ]]]
  s: |
    [[[ 
      const statusMap = { 'disarmed': 'Désactivée', 'armed_home': 'Mode Nuit', 'armed_away': 'Armée' };
      return statusMap[entity.state] || entity.state;
    ]]]
  "n": Système Alarme
  btns:
    card:
      type: tile
      entity: alarm_control_panel.maison_XXX_centrale
      name: " "
      hide_state: true
      features:
        - type: alarm-modes
          modes:
            - armed_away
            - armed_home
            - disarmed
      card_mod:
        style:
          .: >
            ha-card {
              background: transparent !important; border: none !important; box-shadow: none !important;
              padding: 0 !important; width: 180px !important;
            } .content, .icon-container, ha-tile-info, ha-tile-icon {
            display:none !important; }
          .features hui-alarm-modes-tile-feature $: |
            ha-control-select {
              --control-select-background-color: rgba(255, 255, 255, 0.2) !important;
              --control-select-thickness: 40px;
              border-radius: 12px !important;
            }
  hr: " "
  f_left:
    card:
      type: tile
      entity: sensor.maison_XXX_groupes_actifs
      name: " "
      card_mod:
        style:
          ha-tile-info $: |
            .primary { font-size: 14px !important; }
          .: |
            ha-card {
              background: transparent !important; border: none !important; box-shadow: none !important;
              padding: 0 !important;
              --primary-text-color: {{ 'white' if not is_state('alarm_control_panel.maison_XXX_centrale', 'disarmed') else '' }};
              --tile-color: {{ 'white' if not is_state('alarm_control_panel.maison_XXX_centrale', 'disarmed') else 'var(--primary-color)' }};
            }
            .info { margin-left: -12px !important; }
            ha-tile-icon {
              --tile-color: {{ 'var(--error-color)' if states('sensor.maison_XXX_anomalies')|int(0) > 0 else ('white' if not is_state('alarm_control_panel.maison_XXX_centrale', 'disarmed') else 'var(--disabled-color)') }};
            }
  f_right:
    card:
      type: tile
      entity: sensor.maison_XXX_anomalies
      name: " "
      card_mod:
        style:
          ha-tile-info $: |
            .primary { font-size: 14px !important; }
          .: |
            ha-card {
              background: transparent !important; border: none !important; box-shadow: none !important;
              padding: 0 !important;
              --primary-text-color: {{ 'white' if not is_state('alarm_control_panel.maison_XXX_centrale', 'disarmed') else '' }};
            }
            .info { margin-left: -12px !important; }
            ha-tile-icon {
              --tile-color: {{ 'var(--error-color)' if states('sensor.maison_XXX_anomalies')|int(0) > 0 else ('white' if not is_state('alarm_control_panel.maison_XXX_centrale', 'disarmed') else 'var(--disabled-color)') }};
            }
  group_list: |
    [[[
      const sensor = states['sensor.maison_XXX_groupes_actifs'];
      if (!sensor || parseInt(sensor.state) === 0 || !sensor.attributes.groups) return "";
      
      const activeGroups = sensor.attributes.groups.filter(g => g.active === true).map(g => g.name);
      const displayGroups = activeGroups.join(', ');
      
      return displayGroups ? `<span style="font-size:13px; font-weight:500; display:block; white-space:normal; word-break:break-word; overflow-wrap:break-word; line-height:1.4;"><b>Actifs :</b> ${displayGroups}</span>` : "";
    ]]]

My Custom Card

My Custom Card Capture
ℹ️
alarm_control_panel ne gère pas l'activation/désactivation de groupes spécifiques. Par conséquent, j'ai mis à disposition des actions permettant de le faire.
Il est ainsi possible d'activer un ou plusieurs groupes spécifiques lors de votre départ ou encore désactiver un ou plusieurs groupes uniquement lors de votre retour.

Par exemple, quand j'entre dans un rayon proche de ma maison, je désactive uniquement la zone Garage (et non pas tout le domicile), puis une fois stationné, je désactive l'ensemble avec le clavier qui est dans le garage.

Seule votre imagination est la limite...

Exemples d'automatisations

C'est là que la magie opère. Voici une idée simple pour sécuriser votre départ :

alias: "Sécurité : Départ maison"
trigger:
  - platform: state
    entity_id: device_tracker.mon_telephone
    to: "not_home"
condition:
  - condition: state
    entity_id: alarm_control_panel.diagral_e_one
    state: "disarmed"
action:
  - service: notify.mobile_app
    data:
      message: "Vous avez quitté la maison mais l'alarme Diagral n'est pas mise !"
      data:
        actions:
          - action: "ARM_AWAY"
            title: "Armer l'alarme"

Un mot sur la responsabilité

Comme toujours avec les systèmes de sécurité, la prudence est de mise. Diagral est un système certifié et robuste. En l'interfaçant avec Home Assistant via le cloud, vous ajoutez une couche de confort, mais rappelez-vous que la sécurité critique de votre foyer repose d'abord sur l'équipement lui-même.

Cette intégration est un projet indépendant, je l'utilise quotidiennement chez moi, mais installez-la en toute connaissance de cause !

Conclusion

L'intégration Diagral pour Home Assistant permet enfin de briser les silos. Que ce soit pour fermer vos volets automatiquement quand vous armez l'alarme ou pour recevoir une photo de vos caméras en cas de déclenchement de l'alarme, les possibilités sont infinies.

N'hésitez pas à faire vos retours sur le forum ou directement sur le GitHub du projet.

Bonnes automatisations à tous !