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

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

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 :
- Une box Diagral e-One (DIAG56AAX) connectée et fonctionnelle.
- Vos identifiants Cloud Diagral (Email et mot de passe).
- Votre Code PIN (Master Code) de l'alarme (4 à 6 chiffres).
- Une connection internet sur votre Home Assistant (et oui c'est du Cloud)
- 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 :
⚠️ N'oubliez pas de redémarrer Home Assistant pour que la nouvelle intégration soit chargée.

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.



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).
diagral.register_webhook et diagral.unregister_webhookLes é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.
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

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: 2mushroom-alarm-control-panel-card Card

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

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 !