Burglar Alarm (WHO = 5)¶
The MyHOME integration monitors BTicino / Legrand intrusion detection systems on OpenWebNet WHO = 5 (alarm_control_panel).
The panel is read-only: it shows the central unit's state, but it cannot arm or disarm the alarm. To arm and disarm from Home Assistant, see Arming and disarming.
In v2, setup is UI-first: the central unit is discovered from the SCS bus without manual YAML configuration files.
๐ Auto-Discovery¶
When your gateway connects to Home Assistant:
- Dynamic Bus Discovery: The first central-unit frame on the SCS bus that names the panel (for example the
*5*9*0##a disarmed panel sends when polled, or*5*8*0##when it is armed) registers thealarm_control_panelentity. - Depends on the gateway. An MH202 answers a poll with
*5*9*0##, so the panel appears at once (#564). An F454 answers with system-level frames that have an empty WHERE (*5*1*##,*5*5*##,*5*7*##,*5*9*##, see #311), and MyHOME deliberately creates no entity from an empty WHERE. On such a gateway the panel appears at the first*5*8*0##or*5*9*0##, that is the first real arm or disarm after a blank start. - Global Broadcast Zone 0 Listening: Entities follow global broadcast zone 0 telemetry (
myhome_update_<mac>_5_0) alongside their own address (myhome_update_<mac>_5_<where>), so every alarm panel stays in sync. - UI Customization: You can rename the alarm panel, assign it to an Area (e.g. Entrance, Security), and change its icon in the Home Assistant UI.
๐ก๏ธ Supported Hardware¶
The platform reads Legrand / BTicino SCS burglar alarm central units:
- BTicino 3485 / 3486: Multi-zone central alarm control units.
- BTicino HC4600 / L4600: Security control keypads and display terminals.
- BTicino 3481: Zone expansion and partition modules.
- Technical Alarm Transmitters: Flood/water leak detectors and gas safety sensors.
๐ States¶
The panel follows what the central unit reports on the bus:
| State | OpenWebNet Frame | Description |
|---|---|---|
disarmed |
*5*9*<where>##, *5*2*<where>##, *5*0*<where>## |
Disengaged, deactivated, or maintenance. |
armed_away |
*5*8*<where>## |
Engaged. |
triggered |
*5*12*, *5*15*, *5*16*, *5*17*, *5*31* |
Technical, intrusion, tampering, anti-panic or silent alarm. |
*5*1*<where>##(activation) is not an armed state. The central unit sends it while disarming (*5*2*0##โ*5*1*0##โ*5*9*0##) and in the status of a disarmed system, as well as while arming (*5*1*0##โ*5*8*0##).armed_homeis never reported: home and away arming look the same on the bus.- Zones (
*5*11*#n##active,*5*18*#n##not active) never change the panel's state.
๐ Arming and disarming¶
Current central-unit firmware rejects arm and disarm commands sent as WHO 5 frames over the SCS bus, whichever gateway sends them. A plant owner reported this, quoting BTicino support (#564), and no capture shows such a command being accepted. The alarm_control_panel entity advertises ARM_AWAY so HomeKit Bridge, voice assistants, and Home Assistant armed_away triggers and conditions recognize the armed_away state (#466), while refusing direct alarm_arm_away and alarm_disarm requests with an error. To arm and disarm from Home Assistant or Apple Home, expose the template alarm control panel below instead.
The route that works is an auxiliary (WHO 9) command. Your installer programs the central unit so that receiving, for example, *9*1*7## (AUX channel 7 on) arms a set of zones. Which AUX channels and values arm or disarm depends on that programming: check the central unit's configuration or ask your installer.
Combine the MyHOME panel's state with those AUX frames in a core template alarm control panel.
Warning
The template panel is a separate entity, so the MyHOME panel's refusal does not protect it. Without a code check, anyone who can reach Home Assistant can disarm the burglar alarm with one tap, including from the alarm card. The recipe below therefore asks for a code on disarm and stops unless it matches.
template:
- alarm_control_panel:
- name: Home alarm
unique_id: home_alarm
# Unavailable until the MyHOME panel has reported. Falling back to
# "disarmed" instead would show an armed alarm as disarmed after a restart.
availability: "{{ states('alarm_control_panel.alarm_0') in ['disarmed', 'armed_away', 'triggered'] }}"
state: "{{ states('alarm_control_panel.alarm_0') }}"
code_format: number
code_arm_required: false
# Example AUX frames: use the ones your central unit is programmed for
arm_away:
- action: myhome.send_message
data:
gateway: "00:03:50:00:00:00"
message: "*9*1*7##"
disarm:
# Stop here unless the right code was entered
- condition: template
value_template: "{{ code == '1234' }}"
- action: myhome.send_message
data:
gateway: "00:03:50:00:00:00"
message: "*9*0*7##"
To keep the code out of the YAML, for example if you share your configuration, move the whole template into secrets.yaml. !secret replaces a complete value, so it cannot be used inside the template string ({{ code == !secret ... }} does not work):
Alternatively, compare code against a helper, such as an input_text in password mode.
The template panel's state changes once the central unit reports *5*8*0## (armed) or *5*9*0## (disarmed) on the bus, not when the AUX frame is sent.
๐ Dashboard Display (Lovelace Alarm Panel)¶
Use the template panel on the alarm card so the buttons work:
type: alarm-panel
entity: alarm_control_panel.home_alarm
name: Home Security System
states:
- arm_away
๐งช Interactive Diagnostics via Bus Monitor¶
You can query the alarm with the Lovelace Bus Monitor Card Command Injector:
- Query Central Status:
*#5*0## - Query Zone Status:
*#5*#1##(for zone 1)
๐ Legacy YAML Note¶
Note
If you are upgrading from legacy v0.9 installations and still have manual alarm_control_panel: blocks in /config/myhome.yaml, please refer to the v0.9.4 Legacy Alarm Documentation or the Legacy YAML Migration Guide. In v2, alarm panels are discovered dynamically.