Modern, async-native Home Assistant integration for BTicino / Legrand MyHOME SCS bus systems connected via OpenWebNet IP gateways.
Maintained by the OpenWebNet-HA community organisation.
📦 Installation • 🏛️ Supported Hardware • 📚 Documentation • 💬 Discussions • 🤝 Contributing • 🔒 Security
Tip
🚀 V2 Phase 1 & 2 Architecture Now Live (v2.0.0b17): The complete v2 architecture modernization is active across OWNd and MyHOME (PR #232)! Featuring strongly typed CEN / CEN+ scenario command builders and device triggers (P2), Thermoregulation Central Unit (3550 / 4695) master mode and zone coordination (P4), Multi-Gateway routing and physical plant isolation (P6), DALI Tunable White, Cover End-Stop Settling & Min Delta, FM Tuner controls, and 100.0% test coverage across 5,324 automated tests verified against the OpenWebNet Golden Corpus.
- Strongly Typed CEN / CEN+ Device Triggers & Addressing (P2): Native Home Assistant UI device triggers for scenario buttons with string-preserved addressing (
"0001","01","15"), enriched event payloads (where,gateway_mac,entry_id), and all 8 press/release/held actions without requiring external YAML blueprints. - Native Hardware Bus Light & Switch Timers (
WHO=1): Hardware-offloaded countdown timers executed directly on Legrand DIN actuators (F411, etc.) viamyhome.turn_on_timedor nativetimer/durationparameters inlight.turn_onandswitch.turn_on. Supports standard Legrand preset codes (0.5s, 30s, 1m, 2m, 3m, 4m, 5m, 15m) and custom Dimension 2 (*#1*WHERE*#2*H*M*S##) durations that turn off automatically even if Home Assistant restarts. - Real-World Gateway Trace Replay Fixtures in CI (P5): Automated pytest fixture engine replaying frozen on-wire bus captures from production gateways (F461, HL4684, Legrand 067292, F454, MH200N, MH201, 3550, 3486) directly against the integration state machine, enabling deterministic bug reproduction and permanent regression defense for community beta testers without requiring physical hardware.
- Cover Kinematics, End-Stop Settling & Min Delta: Advanced cover kinematics with configurable
min_position_delta(1–5 %, default 2 %) for tall shutters and slat adjustments, automatic settling ontravel_time + 2 sfrom known positions, and 0.5 s early cutoff recognition preventing fractional frozen positions short of limit stops. - Thermoregulation Central Unit Coordination (P4): Dedicated master coordination for 99-zone Central Unit (
#0, modelCentral Unit (3550)) and 4-zone Central Unit (#0#1, modelCentral Unit (4695)). Master Heating/Cooling switches (*4*3xx*#0##) propagate across internal dispatchers to subordinate zones (standalone=False), automatically synchronizing whole-home climate operations with physical central units. - Multi-Gateway Routing & Plant Isolation (P6): Namespaced event dispatchers (
f"myhome_cen_event_{mac}",f"myhome_central_mode_{mac}") and device trigger filtering by parent gateway MAC (via_device), eliminating cross-talk and phantom triggers across physical plants combining multiple gateways (e.g. F454 + MH200N / MH201). - DALI Tunable White & Color Temperature: Native support for DALI DT8 ballasts (F429 / F461 gateways) with auto-detection of color temperature (
ColorMode.COLOR_TEMP, 2000K–6535K / mireds), seamless Kelvin/mireds conversion, and sentinel filtering. - Declarative Hardware Profiles: Auto-detects and tunes connection limits and queue pacing specifically for your gateway model (
F454,F455,F461,MH202,MH201,MyHomeServer1,MH200N,MH200,H4890 / AM4890,F452 / F453AV,HL4684, andLegrand 3578). Eliminates hardware session exhaustion and buffer overflows. - USB / Serial Gateway & OpenZigBee Support: Native asynchronous transport for the Legrand 3578 USB/Serial interface via
pyserial-asynciowith dynamic port discovery, authentication bypass, and OpenZigBee addressing (<8-digit id>#9). - Zero-Friction Migration: Upgrades preserve all existing custom entity IDs (
light.keuken,cover.living) and friendly names. Unique IDs migrate transparently (MAC-WHERE→MAC-WHO-WHERE) with no broken dashboards or automations. - Adaptive Inter-Frame Bus Pacing: Hardened priority command queue with model-specific inter-frame delays (e.g. 150ms for legacy MH200 vs 20ms for F454) preventing command dropping during heavy automation bursts.
- Dynamic Bus Auto-Discovery: Automatically discovers entities from physical bus events and status sweeps without requiring manual
myhome.yamlconfiguration. Full support for F422 cross-bus routing (e.g.18#4#02). - Sound System 2.0 & Audio Matrix (WHO=16): Complete multi-room audio support for F441 / F441M matrices and amplifiers, including zone power, volume normalization (0–31 scale), software mute emulation, and dynamic streaming proxy.
- Streaming Audio Dynamic Proxy: Seamlessly stream from Music Assistant, Spotify Connect, or any HA media player to wired BTicino audio zones using a thread-safe
DecoderPoolwith analog gain-staging. - Dimmable Light Detection: Auto-detects dimming capabilities directly from bus events with transition support.
- OpenWebNet Golden Corpus Conformance: Over 5,300 automated tests passing with 100.0% statement coverage (5,324 tests) across all component modules, verified against multi-authority real-world captures across 11 OpenWebNet subsystems.
We now maintain a comprehensive, community-curated GitHub Wiki and Master Specifications Registry documenting the OpenWebNet protocol, hardware profiles, and WHO subsystem specifications:
👉 OpenWebNet Protocol & WHO Specifications Wiki
👉 Official Legrand Developer Portal (PDF Documentation)
👉 Master Document Archive (15 Specifications — PR #232)
- WHO Specifications Archive & Status Matrix: Complete catalog of all OpenWebNet WHO families (WHO 0 to WHO 1004, HMAC authentication, and core system intro) with official PDF documentation references, current implementation status, and frame syntax.
- CEN / CEN+ Automations & Community Blueprint: Community blueprint by gST84 to trigger actions, toggle non-BTicino smart devices, and dim lights from physical MyHOME pushbuttons.
- Hardware Gateway Profiles: Deep dive into connection constraints, socket limits, pacing delays, and watchdog behaviors across all 12 supported gateway models (F454, F455, F461, MH202, MH201, MyHomeServer1, MH200N, MH200, H4890/AM4890, F452/F453AV, HL4684, and Legrand 3578).
- Sound System 2.0 & Audio Matrix Guide: Setup instructions for F441/F441M matrices, room amplifier calibration, and Dynamic Proxy streaming.
- Bus Monitor Lovelace Card: Bus card installation, live frame decoding, diagnostic logging, and syntax injector reference.
- Community Contribution Guide: How to cross-check documentation versions and contribute missing WHO PDF specifications.
- Supported Functions — what each WHO subsystem and platform does, read-only or not at all.
- Known Limitations — what is not supported, why, and the workaround.
- Troubleshooting — symptoms → log lines / bus frames → fix.
- Use Cases — end-to-end scenarios with the automations that make them work.
- Services, Gateways, Runtime Behaviour, Bus Monitor, Sound System, CEN / CEN+, Lovelace Recipes.
| Gateway Model | Protocol Support | Max Command Workers | Inter-Frame Delay | UPnP Discovery | Notes |
|---|---|---|---|---|---|
| F454 | OpenWebNet / HMAC | 4 workers | 50 ms | ✅ Port 49153 | Full high-speed multi-session support |
| F455 | OpenWebNet / HMAC | 4 workers | 50 ms | ✅ Port 49153 | Basic gateway (single SCS bus) |
| F461 | OpenWebNet / HMAC | 4 workers | 50 ms | ❌ Manual | Compact DIN Ethernet Web Server |
| MH202 | OpenWebNet / HMAC | 2 workers | 100 ms | ✅ Port 49153 | Modern scenario programmer gateway |
| MH201 | OpenWebNet | 1 worker | 100 ms | ✅ Port 49153 | Second-generation scenario programmer |
| MyHomeServer1 | OpenWebNet / HMAC | 4 workers | 20 ms | ✅ SSDP | Cloud/local hybrid gateway |
| MH200N | OpenWebNet | 1 worker | 150 ms | ✅ SSDP | Second-generation scenario programmer |
| MH200 (Legacy) | OpenWebNet | 1 worker | 150 ms | ✅ SSDP | Strict single-session pacing; watchdog hardened |
| H4890 / AM4890 | OpenWebNet | 1 worker | 50 ms | ✅ SSDP | 3.5" Touch screen display IP gateway (Axolute / Livinglight) |
| F452 / F453AV | OpenWebNet | 1 worker | 150 ms | ✅ Port 49153 | Audio/video & web server gateway |
| H4684 / H/L4684 | OpenWebNet | 1 worker | 50 ms | ✅ SSDP | Colour touch screen IP gateway (Axolute / LivingLight) |
| Legrand 3578 | OpenWebNet (Serial) | 1 worker | 50 ms | ❌ Manual (Serial) | USB / Serial gateway & OpenZigBee interface |
This table is automatically updated from gateway profile definitions and hardware specifications.
| Gateway Model | WHO 0 Scenario |
WHO 1 Lights |
WHO 2 Autom. |
WHO 3 Load |
WHO 4 Climate |
WHO 5 Alarm |
WHO 9 Power |
WHO 13 Gateway |
WHO 14 Lock |
WHO 15 CEN |
WHO 16 Audio |
WHO 17 Scenario |
WHO 18 Energy |
WHO 22 Audio Diff. |
WHO 25 Diag |
WHO 1001 Diag |
WHO 1004 Diag |
WHO 1013 Diag |
WHO 1022 Diag |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 067292 | ✅ | ✅ | ✅ | ||||||||||||||||
| F453AV | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||||||
| F454 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||
| F455 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||||||
| F461 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||||
| H4684 / H/L4684 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||||
| H4890 / AM4890 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||||||||||
| MH200 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||||
| MH200N | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||
| MH201 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||||
| MH202 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |||||||
| MyHomeServer1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Checkmarks (✅) indicate that at least one diagnostic_summary.json or .txt bus capture in our test corpus contains frames for that subsystem from the specified gateway model. This matrix is automatically updated from the fixtures repository.
| Domain | WHO | Capabilities |
|---|---|---|
light |
WHO=1 | On/Off, Dimmers with brightness control & transitions (stepped & native), DALI DT8 Tunable White (Dimension 14, 2000K–6535K), HS/RGB colour, Hardware-offloaded bus timers (myhome.turn_on_timed / timer parameter) |
switch |
WHO=1 | Relays, auxiliary switches, socket actuators (switch/outlet device classes), Hardware-offloaded bus timers (myhome.turn_on_timed / timer parameter) |
cover |
WHO=1 / WHO=2 | Motorized shutters, blinds, roll-ups with state tracking, position-reporting actuators & virtual travel-time positioning; impulse gates & garage doors (WHO=1) with sensor feedback and an optional multi-factor approval workflow |
lock |
WHO=6 | Native video door entry strikes (WHO=6, configured in myhome.yaml) with constant-time PIN authentication and auto-relock |
climate |
WHO=4 | Heating, cooling, 4-pipe systems, thermostats, setpoints, fancoil 3-speed modes, offset tracking, Central Unit 3550 (#0) & 4695 (#0#1) master coordination & seasonal propagation |
alarm_control_panel |
WHO=5 | Central units (3485/3486), read-only state (disarmed / armed away / triggered), zone 0 broadcast sync; arm/disarm via AUX frames (docs) |
binary_sensor |
WHO=1 / 9 / 25 | Magnetic contacts, door/window sensors, PIR motion, AUX channels (1–9), dry contacts (F482/3477), inverted contacts |
sensor |
WHO=1 / 4 / 18 | Power meters, energy counters (total/daily/monthly), temperature probes (3475), illuminance / lux sensors |
button |
WHO=14 / 2 / 16 / 22 | Hardware actuator lock/unlock for lights, switches & covers (WHO=14), cover travel time calibration buttons (per cover & gateway-wide, WHO=2), F500/F500N FM tuner Seek up / Seek down buttons (WHO=16 / 22) |
number |
WHO=16 / 22 | Direct manual FM radio frequency input & stepping (87.50–108.00 MHz, 0.05 MHz step) for declared F500/F500N tuner sources (WHO=16 / 22) |
media_player |
WHO=16 / 22 | F441/F441M audio zones, F500/F500N FM radio tuners (presets, RDS, Media Browser, manual frequency & preset storage on WHO=16 & WHO=22), volume normalization, software mute, streaming dynamic proxy (Music Assistant / Spotify Connect) |
device_trigger (Automations) |
WHO=15 / 25 | Stateless CEN & CEN+ scenario pushbuttons with string-preserved addressing ("0001"), gateway MAC isolation, and 8 native UI trigger types (short press, long press start, held, release, rotary dials) |
This table is automatically updated from platform definitions and supported_functions.md.
Requires Home Assistant 2026.3 or newer (Python 3.14 cores). Older cores stay on 2.0.0b12; see Known Limitations.
Caution
/config/custom_components/ (e.g. myhome.backup)!
Home Assistant automatically discovers all subdirectories containing manifest.json under /config/custom_components/. If you create a backup folder like /config/custom_components/myhome.backup or rename the old directory in place:
- Home Assistant registers
custom_components.myhome.backupas the integration module path for domainmyhome. - Python treats dots (
.) as module delimiters, attempting to loadbackup.pyfromcustom_components.myhome, which does not exist. - Home Assistant startup fails with:
Setup failed for custom integration 'myhome': Unable to import component: No module named 'custom_components.myhome.backup'
Rule: Always keep safety backups outside the custom_components/ folder (e.g. in /config/myhome_backup/).
Warning
In HACS 2.0+, pre-release access was moved to Home Assistant entity switches (switch.myhome_pre_release) that are disabled by default. Due to upstream Home Assistant registry caching, enabling these switches frequently gets stuck in an "unavailable" loop or reverts to "disabled". Furthermore, because pre-releases are built on the active development branch (v2-phase1-architecture) while the default branch is master, HACS download validation frequently fails with:
The version 2.0.0b17 for this integration can not be used with HACS
To avoid frustration, please use Method 1 (Terminal & SSH) or Method 2 (Manual) below — they take less than 10 seconds and preserve all existing devices, entities, and settings 100% safely.
If you have the Terminal & SSH add-on enabled in Home Assistant, open Terminal from the sidebar and paste this command (press Ctrl + Shift + V / Shift + Ctrl + V or right-click to paste into the web terminal):
cd /config/custom_components
# Move any legacy in-place backup out of custom_components to prevent loader crashes:
[ -d myhome.backup ] && mv myhome.backup /config/myhome_backup_old
# Create a safety backup in /config (outside custom_components) before updating:
[ -d myhome ] && rm -rf /config/myhome_backup && cp -r myhome /config/myhome_backup
# Download and install the latest v2.0.0b17 release:
rm -rf myhome
wget -O myhome_beta.zip https://github.com/OpenWebNet-HA/MyHOME/releases/download/2.0.0b17/myhome.zip
unzip -q myhome_beta.zip -d myhome
rm myhome_beta.zip
ha core restart(For Home Assistant Container / Docker, run on your Docker host:)
docker exec -it homeassistant bash -c 'cd /config/custom_components && [ -d myhome.backup ] && mv myhome.backup /config/myhome_backup_old; [ -d myhome ] && rm -rf /config/myhome_backup && cp -r myhome /config/myhome_backup; rm -rf myhome && wget -O myhome_beta.zip https://github.com/OpenWebNet-HA/MyHOME/releases/download/2.0.0b17/myhome.zip && unzip -q myhome_beta.zip -d myhome && rm myhome_beta.zip'
docker restart homeassistantNote
All existing entity names, custom entity IDs, and gateway configurations are preserved automatically.
- Download the release package:
👉 Download myhome.zip (v2.0.0b17) (or browse all GitHub Releases) - Open your Home Assistant configuration directory (via Samba Share, Studio Code Server, or File Editor add-on).
- Important: If you wish to back up your existing
myhomefolder first, copy it to/config/myhome_backup/(outsidecustom_components/). Never rename or copy it tocustom_components/myhome.backup. - Extract
myhome.zipdirectly into/config/custom_components/myhome/(overwriting the existing files). - Restart Home Assistant (Settings → System → Restart).
(Available seamlessly once PR #232 is merged into master for the stable v2.0.0 release)
- Open HACS in your Home Assistant UI.
- Click the three dots (
⋮) in the top-right corner and select Custom repositories. - Add the repository details:
- Repository:
https://github.com/OpenWebNet-HA/MyHOME - Type / Category:
Integration
- Repository:
- Click Add.
Caution
Migrating from a personal fork? DO NOT delete the MyHOME integration from Home Assistant Settings!
Deleting the integration from Settings → Devices & Services will wipe all configured gateways and devices.
If you previously tracked a personal fork (such as GreenGrassBlueOcean/MyHOME or anotherjulien/MyHOME):
- Open HACS → ⋮ → Custom repositories.
- Click the red trash can icon next to the old fork URL to unlink it.
- Verify
OpenWebNet-HA/MyHOMEis present in the list. - All your configured devices, gateways, and automations remain 100% intact.
- Open HACS → Integrations → MyHome.
- Click the blue Download button (or
⋮→ Redownload). - Select the version and click Download.
- Restart Home Assistant (Settings → System → Restart).
More symptoms and fixes: Troubleshooting guide.
If Home Assistant fails to load with the log error:
Setup failed for custom integration 'myhome': Unable to import component: No module named 'custom_components.myhome.backup'
This is caused by a backup folder (myhome.backup) residing inside /config/custom_components/. Fix it by running:
mv /config/custom_components/myhome.backup /config/myhome_backup
ha core restartIf you ever need to revert to the legacy codebase (0.9.4):
- Via HACS: Open MyHome → click
⋮→ Redownload → select0.9.4→ Download → Restart Home Assistant. - Via Terminal & SSH (use
Ctrl + Shift + Vto paste):cd /config/custom_components wget https://github.com/OpenWebNet-HA/MyHOME/releases/download/0.9.4/myhome.zip -O myhome_legacy.zip rm -rf myhome unzip -q myhome_legacy.zip -d myhome rm myhome_legacy.zip ha core restart
- Go to Settings → Devices & services → MyHOME, open the gateway entry's
⋮menu and choose Delete. Repeat for every configured gateway. This closes the bus sessions, unloads all platforms and removes the gateway's devices and entities from the registries. - Restart Home Assistant if you also want to remove the code:
- HACS: open MyHome in HACS →
⋮→ Remove. - Manual / one-liner installs: delete the folder:
rm -rf /config/custom_components/myhome ha core restart
- HACS: open MyHome in HACS →
- Optional clean-up the integration does not touch on its own:
/config/myhome.yaml— the legacy platform configuration file, if you used one.- Settings → Dashboards → Resources: the auto-registered
/myhome_static/myhome-bus-card.jsresource, and anycustom:myhome-openwebnet-bus-monitorcards on your dashboards. - Automations and blueprints that reference
myhome.*services or themyhome_*events (myhome_cen_event,myhome_cenplus_event,myhome_message_event,myhome_cover_calibration, …).
The gateway itself is not modified by installing or removing the integration; nothing needs to be reset on the OpenWebNet side.
- Navigate to Settings → Devices & Services → Add Integration.
- Search for MyHOME.
- Choose your gateway type:
- Network Gateway (TCP/IP):
- Auto-Discovery: The integration automatically discovers UPnP/SSDP-compatible gateways on your local subnet (e.g. F454, MH202, MyHomeServer1). Discovered gateways appear in the Home Assistant UI with standard Configure and Ignore options, requiring explicit user confirmation before any config entry is created.
- Manual IP Setup: For gateways without UPnP (e.g. MH200), enter the gateway IP address, port (default
20000), MAC address, and OpenWebNet password (default12345).
- USB / Serial Gateway (Legrand 3578 / OpenZigBee):
- Select your physical serial device (e.g.
/dev/ttyUSB0orCOM3) from the dynamically populated port picker. - Select your baud rate (default
19200). - Serial transport operates with zero authentication overhead (no IP password challenge needed) and natively routes OpenZigBee addresses (
<8-digit id>#9).
- Select your physical serial device (e.g.
- Network Gateway (TCP/IP):
- Select or confirm your gateway hardware profile from the dropdown.
Go to Settings → Devices & Services → MyHOME → Configure to fine-tune your installation:
- Gateway Address & Password: Update the gateway IP address or OpenWebNet password without recreating the integration.
- Command Worker Count: Adjust concurrent command sessions (1 to 10 workers, default 1).
- Generate Bus Events (
myhome_message_event): Enable firing raw OpenWebNet messages directly to the Home Assistant event bus for custom monitoring and blueprint automations. - Sweep group/area/general light addresses for status: Enabled by default. After a group, area or general lighting command, the gateway is given a short (~250 ms) debounce window to echo each member's own status before the integration sweeps the group/area itself; disable this if your gateway needs a different cadence (see Broadcast re-sync).
- Light Transition Mode: Select how brightness transitions are handled:
software_stepped(Default & Recommended): Smooth 0.3s stepped fades interpolated in software, compatible with all MyHOME dimmers.native: Passes through the OpenWebNet hardware speed parameter directly (for supported hardware dimmers).
- Audio Decoders Pool: Map network media players (Music Assistant, Spotify Connect, WiiM, Squeezelite) to physical matrix inputs 1–4 with per-source analog pre-gain offsets (0–50%).
While the integration features Dynamic Bus Auto-Discovery that discovers devices automatically from bus events, existing configurations from older versions are 100% supported:
- Automatic Search Order: The integration automatically locates your configuration file in:
/config/myhome.yaml(Standard HA config directory)/config/myhome/myhome.yaml- Custom component directory fallback
- Single & Multi-Gateway Syntax:
- Single gateway installations do not require a root MAC header; platforms are mapped automatically to your gateway.
- Multi-gateway installations group platforms under their respective MAC addresses (
00:03:50:xx:xx:xx).
f454:
mac: '00:03:50:xx:xx:xx'
light:
living_light:
where: '11'
name: Living Room Light
dimmable: True
cover:
kitchen_shutter:
where: '21'
name: Kitchen Shutter
travel_time: 22
alarm_control_panel:
central_alarm:
where: '0'
name: Central Alarm-
How names work (Home Assistant's device / entity model):
namenames the device on the bus. A light, switch, cover, thermostat, audio zone or alarm panel is its device, so its entity carries the device name (light.living_room_light, friendly name Living Room Light). Sensors and binary sensors are features of their device and are named after their device class — a power meter namedHousegivessensor.house_power(House Power) andsensor.house_energy; a dry contact namedCancellowithclass: openinggivesbinary_sensor.cancello_opening(Cancello Opening). Useentity_nameon a sensor or binary sensor to name the feature yourself (entity_name: Contact→ Front Door Contact); anentity_nameequal tonamemeans "the entity is the device". Lock/unlock and calibration buttons are named Lock, Unlock, Calibrate travel time under their device. Entity ids are assigned once by the entity registry: existing installations keep every entity id and every name you set in the UI, and deleting the integration by accident is safe — Home Assistant keeps the registry entries for 30 days and restores names, areas and ids when the gateway is added again. -
DALI DT8 capabilities and
lock_features: a light learns dimming, tunable white (Dimension 14) and HSV colour (Dimension 12) from the bus as the frames arrive. BTicino DALI gateways (F429 / F461) remember any HSV or colour-temperature value that was ever written to an address - even to a fixture that cannot use it - and replay it on every status sweep, so a plain dimmer can end up with a colour wheel. Declare what the fixture really is and lock it:
light:
rgbw_spot:
where: '25'
interface: '02'
name: RGBW Spot
dimmable: true
color_temp: true # Dimension 14 tunable white
rgb: true # Dimension 12 HSV colour (alias: hs)
lock_features: true # exactly these modes, never learn another one
hallway_relay:
where: '26'
interface: '02'
name: Hallway
lock_features: true # on/off only, whatever the gateway replaysWithout lock_features the three flags are only the starting point and auto-detection stays on. Uncommissioned sentinels (*12*511*127*255##, *14*1##) are filtered by the protocol layer and never promote a light, locked or not.
What a locked light does with a frame it is locked out of. The frame is dropped as a whole - not just the colour, the HSV value (*12*H*S*V##) too. A dimension the gateway replays to an address that cannot use it carries no truth in any field: the value is whatever was once written, not the current level. Brightness is never affected by this, because it always arrives on Dimension 1 (*#1*WHERE*1*<level>*<speed>##), and a light declared with rgb or color_temp is implicitly dimmable. Every dropped frame is written to the log at DEBUG level - enable custom_components.myhome: debug in the logger configuration if a locked light does not follow the app the way you expect:
GATEWAY light 26#4#02 is locked to ['onoff']; ignoring Dimension 12 frame *#1*26#4#02*12*353*74*80##
- Declared lighting groups (P7, #368): a
#GWHERE(#1through#255) declares a group that already exists in your plant (configured with MyHOME_Suite or a physical group-programmed actuator) - it does not configure group membership on the bus, and it is not a second kind of "group" competing with Home Assistant's ownlight.group. Use it when you want a single OpenWebNet frame (*1*1*#G##, or*#1*#G*#14*<mireds>##for a DALI colour-temperature change) to reach every actuator programmed into that group at once:
light:
living_room_group:
where: '#6'
name: Living Room Group
dimmable: true
color_temp: trueWithout members the entity is assumed_state: Home Assistant shows separate On / Off controls instead of a toggle, because the integration has no way to know the group's actual state - only what was last sent to it. Add members (the point-to-point WHERE of each actuator in the group) to derive real state instead, the same way core's light.group averages its members' brightness / colour temperature / HS colour:
light:
living_room_group:
where: '#6'
name: Living Room Group
dimmable: true
color_temp: true
members: ['12', '13', '0114'] # each member's own light WHEREmembers never sends a single extra frame - it only tells the integration which existing light entities to watch. A group with members still accepts direct control (single-frame *1*1*#6##); it also picks up a group dimension write the gateway echoes back (*#1*#6*#14*153##, the DALI case from #300). Never an auto-discovered entity for a group, area or general address (#368) - only a declared one.
The integration registers specialized services under the myhome domain:
| Service | Fields | Description |
|---|---|---|
myhome.send_message |
gateway (optional)message (required) |
Send an arbitrary, validated OpenWebNet frame (e.g. *1*0*0##) directly to the SCS bus. Useful for scripts, custom diagnostic probes, and testing. |
myhome.sync_time |
gateway (optional) |
Synchronizes the gateway's internal real-time clock with Home Assistant's local time using standard OpenWebNet date/time frames (WHO=13). |
myhome.start_sending_instant_power |
entity_id (required)duration (required) |
Requests high-frequency instant active power telemetry (W) from energy management counters (WHO=18) for duration minutes. |
myhome.stop_sending_instant_power |
entity_id (required) |
Stops high-frequency instant active power telemetry from energy management counters (WHO=18). |
The integration fires native events to the Home Assistant event bus for automation triggers:
myhome_cen_event&myhome_cenplus_event: Pushbutton events from physical CEN (WHO=15) and CEN+ (WHO=25) scenario controllers. Event payload includes:object: Scenario button unit numberpushbutton: Pushbutton index (0–31)event: Trigger action (pushbutton_short_press,pushbutton_short_release,pushbutton_long_press,pushbutton_long_press_repeat(CEN+, every ~0.5 s while held),pushbutton_long_release, or rotary dialrotary_cw_slow,rotary_cw_fast,rotary_ccw_slow,rotary_ccw_fast)
myhome_alarm_event: State transitions emitted by burglar alarm systems (WHO=5), including partitionwhere,state,state_code, andis_alarmflag.myhome_scene_event: Scenario lifecycle transitions emitted by scenario programmers (e.g., MH200N, MH201, F420; WHO=17). Event payload includesscenario,where,state(1=start, 2=stop, 3=enable, 4=disable),is_on(Truewhen started,Falsewhen stopped; denotes execution lifecycle rather than load power states),is_enabled(True/Falsefor scheduled enablement),gateway_mac, andentry_id.- Broadcast Subsystem Events: Global and area broadcast commands are mirrored as:
myhome_general_light_event,myhome_area_light_event,myhome_group_light_eventmyhome_general_automation_event,myhome_area_automation_event,myhome_group_automation_event
myhome_message_event: WhenGenerate Bus Eventsis enabled in Options Flow, every valid OpenWebNet message received from the gateway is broadcast to the event bus withgatewayand raw framemessage.
The BTicino sound system matrix (F441 / F441M) is an analog matrix switch. It routes physical source inputs (IN 1–4) to amplified room zones.
This integration includes a Dynamic Proxy that lets you stream IP audio (via Music Assistant, Spotify Connect, AirPlay, etc.) directly to your wired BTicino zones.
┌────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ Media Source │ │ DecoderPool │ │ F441M Matrix │
│ (Music Assistant / │─────▶│ - claims idle decoder │─────▶│ (Hardware Routing) │
│ Spotify Connect) │ │ - gain staging (clean) │ │ │
│ │ │ - activates zone (O/I) │ │ IN 1 ────▶ Living │
└────────────────────────┘ └─────────────────────────┘ │ IN 2 ────▶ Kitchen │
▲ │ IN 3 ────▶ Bedroom │
│ └─────────────────────────┘
┌──────────┴──────────┐ ▲
│ Network Decoders │ │
│ │ │
│ Decoder 1 (Wiim) │────── RCA ──────────┘ (IN 1)
│ Decoder 2 (HiFiDAC) │────── RCA ──────────┘ (IN 2)
└──────────────────────┘
- Wire your network streamer (e.g. Raspberry Pi running squeezelite, WiiM, Cambridge Audio) to one of the matrix inputs (e.g. Source 1 or 2).
- In Home Assistant, ensure the streamer is available as a
media_playerentity. - Open MyHOME Options (
Configure), navigate to Decoders, and specify:- Entity: The streamer's
media_playerentity ID. - Source: The physical matrix input number (1–4) it is plugged into.
- Pre-Gain: Analog offset percentage (recommended
15–20%for line-level DACs,0%for fixed pre-amps).
- Entity: The streamer's
- Send audio from Music Assistant or Spotify to your BTicino zone entity:
- The proxy automatically claims the decoder, wakes it, applies gain staging, and activates the zone.
- When playback stops, the decoder is released back to the pool.
The integration includes an in-band real-time bus monitor operating over the existing gateway event stream with zero extra socket connections:
A modern custom Lovelace element is automatically registered with zero configuration:
- Visual Card Picker & GUI Editor: Fully integrated with Home Assistant's card picker — simply search for "MyHOME OpenWebNet Bus Monitor" (or search "MyHOME" / "OpenWebNet") under
+ Add Cardand configure the title or buffer size visually without touching raw YAML (YAML typecustom:myhome-openwebnet-bus-monitor, withcustom:myhome-bus-cardsupported as a backward-compatible alias). - Live Bus Stream: High-performance scrolling feed with color-coded badges for subsystems (Lighting
WHO=1, AutomationWHO=2, ClimateWHO=4, SoundWHO=16, EnergyWHO=18, CENWHO=15/25) and ACK (*#*1##) / NACK (*#*0##) highlighting. - Interactive Controls: Live Pause/Resume, buffer clearing, and instant filtering by subsystem, WHERE address, and Direction (RX/TX).
- Manual Frame Injector: Send raw OpenWebNet diagnostic frames directly to the bus with syntax validation.
- One-Click Diagnostic Bug Reporter: Click "📋 Copy Diagnostic Report" to copy a sanitized, GitHub-ready Markdown bundle containing:
- Home Assistant Core & integration versions
- Hardware gateway profile, firmware, connection type, queue pacing, and worker counts
- Live buffer depth and RX/TX counters
- Collapsible OpenWebNet bus trace (
<details><summary>OpenWebNet Bus Trace</summary>) - Direct link opening pre-filled GitHub Issue Forms!
Tip
Troubleshooting: Card not showing up or "Custom element doesn't exist"?
- Manual Resource Verification: While the integration automatically registers the card resource, you can verify or manually add it under Settings ➔ Dashboards ➔ Resources (click the three dots ⋮ in the top-right corner):
- URL:
/myhome_static/myhome-bus-card.js - Resource Type:
JavaScript Module
- URL:
- Check for Conflicting HACS Cards: If custom cards fail to load or the card picker spins indefinitely, inspect your browser console (
F12). A common cause is conflicting or duplicate custom cards (e.g. having bothscheduler-cardandlovelace-standalone-schedule-cardinstalled simultaneously). An uncaughtCustomElementRegistrycollision in an earlier card halts the browser's Lovelace resource-loading pipeline before subsequent cards can initialize. Removing the duplicate card resolves the blockage immediately. - Hard Browser Refresh: After adding resources or updating components, perform a hard refresh (
Ctrl + F5orCtrl + Shift + R) to ensure the browser loads the latest JavaScript bundle from the gateway.
When reporting issues or requesting new device support on GitHub, interactive forms ensure complete diagnostics:
- Bug Report: Gateway profile dropdown, connection type, HA version, diagnostics JSON attachment, and pre-formatted bus trace.
- Device Support Request: Structured form for adding new BTicino/Legrand modular components with WHO codes and frame samples.
In addition to the real-time bus monitor card, the integration implements Home Assistant's native diagnostic provider (diagnostics.py).
To download a sanitized diagnostic bundle:
- Navigate to Settings → Devices & Services → MyHOME.
- Click the three dots (
⋮) next to your gateway and select Download diagnostics. - All sensitive credentials, IP addresses, and tokens are automatically redacted via
CONF_PASSWORDandCONF_HOSTanonymizers before being saved to JSON.
A major CI infrastructure enhancement introduced for beta testing is the Trace Replay Engine (tests/test_trace_replay.py), enabling deterministic bug reproduction and permanent regression defense:
┌──────────────────────────────────────┐
│ Beta Tester's Real Plant │
│ (F454, MyHomeServer1, MH202, etc.) │
└──────────────────┬───────────────────┘
│
│ 1-Click "📋 Copy Capture" in Bus Monitor Card
▼
┌──────────────────────────────────────┐
│ diagnostic_summary.json │
│ (100 frozen on-wire frames + config)│
└──────────────────┬───────────────────┘
│
│ Saved to tests/fixtures/plants/<issue_id>/
▼
┌──────────────────────────────────────┐
│ Automated Pytest Replay Engine │
│ - Replays 100% of frames in order │
│ - Reproduces bug deterministically │
│ - Permanent regression protection │
└──────────────────────────────────────┘
- Zero Hardware Needed for Bug Triage: Legrand and BTicino manufacture dozens of gateway models (F454, MyHomeServer1, MH200N, MH202, 3578 USB) and modular DIN actuators with subtle firmware timing variations. When a beta tester reports unexpected behavior, clicking "📋 Copy Capture" on the Bus Monitor card (or downloading HA Diagnostics) packages the last 100 on-wire OpenWebNet frames with precise microsecond timestamps.
- Automated Discovery & Plant Setup: Pytest automatically scans
tests/fixtures/plants/*/for any directory containingdiagnostic_summary.jsonandmyhome.yaml. - Sequential On-Wire Replay: The harness initializes a simulated gateway session and streams the frozen frames sequentially into Home Assistant's internal event dispatcher (
f"myhome_message_{mac}"), exercising the exact same message routing path as physical hardware. - End-to-End State Verification: Verifies that every single frame across Lighting (
WHO=1), Automation (WHO=2), Thermoregulation (WHO=4), Audio (WHO=16), Energy (WHO=18), Dry Contacts (WHO=25), and ACK/NACK control signals updates entity states accurately with zero unhandled exceptions. - High-Frequency Stress Testing: Simulates event storms (e.g. 50 rapid toggle frames) to prove that the integration's async event queue and state machines never drop messages or trigger race conditions.
- Permanent CI Regression Protection: Once a tester's trace is committed, it runs automatically on every pull request and push to master, ensuring that a fix for one community member's installation never regresses in future updates.
- In Home Assistant: Call service
myhome.sweep_bus-> Download Diagnostics (or copy trace from Bus Card). - Standalone CLI: Run
python scripts/record_gateway_trace.py --host <IP> --password <PASS> --model <MODEL>to record an isolated gateway on a test bench directly into a ready-to-test fixture.
A diagnostics download describes a home: room and family names in myhome.yaml, the LAN address and MAC of the gateway, the config-entry id, sometimes a password. None of that is needed to replay a bus - only the addresses, platforms, options and frames are - so every fixture is anonymized before it is committed, and tests/test_fixture_privacy.py fails the build if one is not:
python scripts/anonymize_plant_fixture.py tests/fixtures/plants/issue_<n>_<model>Devices become light_10 / Light 10 (the address is the name), IPs move to the 192.0.2.0/24 documentation range, MACs to 00:03:50:00:<issue>, the entry id to a synthetic one, passwords to null. The script prints the old → new entity-id mapping for the test you write against the fixture. Name the directory after the issue and the gateway model, not after the reporter.
What the integration emits is clean at the source: the card's issue bundle and trace/sweep export name the transport and the gateway model, never the LAN address, the serial device or your browser; the diagnostics download redacts host, MAC, SSDP identity, config-file path, entry id and title, and names a decoder slot's media player media_player.decoder_<n> rather than after your room - in the config entry's data and options only; the gateway, profile, queue, platform and bus-monitor blocks are not touched, so every frame's where / who / what is there for triage. Two things still need the script: your myhome.yaml (it is your file, with your room names) and the envelope Home Assistant wraps around every diagnostics download (the list of installed integrations, setup_times), which is not ours to strip. python scripts/anonymize_plant_fixture.py --check tests reports anything personal under tests/; the pre-commit hook in .pre-commit-config.yaml runs it before a commit exists, CI runs it on every push.
This project enforces strict code quality and packaging standards:
# Run the complete test suite
pytest tests/
# Run with coverage report
pytest --cov=custom_components.myhome --cov-report=term-missing tests/
# Run containerized Home Assistant smoke test (stable, beta, dev, or all)
python scripts/run_ha_container_smoke.py --channel stable
python scripts/run_ha_container_smoke.py --channel all
# Run OWNd protocol engine smoke test (pinned, latest, dev, or all)
python scripts/run_ownd_smoke.py --target pinned
python scripts/run_ownd_smoke.py --target all
# Validate PyPI packaging and PEP 517 compliance
python -m build
twine check --strict dist/*
check-wheel-contents dist/*.whlTo verify integration installation and runtime cleanliness against official upstream Home Assistant Docker environments before deployment:
# Test against stable Home Assistant container image
python scripts/run_ha_container_smoke.py --channel stable
# Test against upcoming beta container image
python scripts/run_ha_container_smoke.py --channel beta
# Test across all channels (stable, beta, and dev)
python scripts/run_ha_container_smoke.py --channel allThis runner:
- Pulls the official container (
ghcr.io/home-assistant/home-assistant:<channel>). - Runs
hass --script check_configto validate schemas and component manifests. - Automatically installs all integration dependencies (
manifest.json). - Validates clean import of all 14 integration platform modules.
- Boots Home Assistant in daemon mode and verifies zero exceptions and zero asyncio loop-blocking warnings.
To verify protocol engine compatibility and prevent regressions across upstream library distributions:
# Run against pinned PyPI version (manifest.json lockstep)
python scripts/run_ownd_smoke.py --target pinned
# Run against latest PyPI pre-release
python scripts/run_ownd_smoke.py --target latest
# Run against upstream development branch (OWNd@master)
python scripts/run_ownd_smoke.py --target dev
# Test all distribution targets across the matrix
python scripts/run_ownd_smoke.py --target allThis runner executes 5 validation gates:
- Metadata Lockstep: Verifies that the exact
OWNd==pin inmanifest.jsonmatches the installed package. - Golden Corpus Conformance: Runs 250+ OpenWebNet frame fixtures (
tests/test_golden_conformance.py) verifying parser extraction and builder parity. - Platform Clean Imports: Verifies all 14 integration platform modules import cleanly without missing symbols or deprecation errors.
- Mock Gateway TCP Loopback: Boots a mock OpenWebNet TCP server, negotiates session handshake (
*99*0##), dispatches commands, and verifies frame parsing end-to-end. - Firmware Oracle Conformance: Verifies frame compatibility and parser resilience against hash-pinned empirical gateway verdicts (
tests/test_firmware_oracle_conformance.py), ensuring authentic firmware-emitted frames parse cleanly and target gateway rejection guarantees (e.g. dimmer level writes, unrouted private bus) hold.
See the F454 regression checks for the fixes, automated coverage and physical gateway verification steps.
hassfest: Official Home Assistant manifest, translation, and metadata validation.validate: Official HACS compliance checks.test-coverage: 5,324 automated unit and integration tests with snapshot matching and 100.0% statement coverage enforcement.ha-container-smoke: Automated containerized smoke testing against official Home Assistant Docker images (stable,beta,dev) verifyingcheck_config, clean platform module imports, and zero asyncio loop-blocking calls.ownd-smoke: Automated smoke testing of theOWNdprotocol engine acrosspinned,latest, andupstream-devdistributions on Python 3.14.ha-upstream-compat: Continuous integration testing against upstream Home Assistant Stable, Beta, and Dev channels.ha_standards: Automated architectural standards enforcement (verify_ha_standards.py/test_ha_standards.py) ensuring user-confirmed discovery flows, complete step translations, no deprecated constants, and no blocking calls in async coroutines.pypi_standards: Strict wheel hygiene, metadata verification, and packaging checks.quality-scale: Self-audit ofquality_scale.yamlagainst the official Home Assistant Integration Quality Scale (quality_scale_report.py); reports the tier reached, refreshes the badge and the table below.strict-typing:mypy --strictover the integration, ratcheted per module (scripts/typing_ratchet.py,mypy_baseline.json) — a module may only ever get cleaner (Platinum rulestrict-typing).
Tier reached: 🏆 Platinum
| Tier | Rules satisfied | Status |
|---|---|---|
| 🥉 Bronze | 20 / 20 | ✅ complete |
| 🥈 Silver | 10 / 10 | ✅ complete |
| 🥇 Gold | 21 / 21 | ✅ complete |
| 🏆 Platinum | 3 / 3 | ✅ complete |
Self-audit of quality_scale.yaml against the official Integration Quality Scale; a tier needs every rule of that tier and all lower tiers done/exempt. Updated by the Integration Quality Scale workflow; tiers are formally awarded only by Home Assistant core review.
The integration maintains 5,324 automated tests (100.0% statement coverage across all modules) covering core protocol handling, hardware profiles, discovery, state reconciliation, and error boundaries.
| Component / Module | Coverage | Notes |
|---|---|---|
__init__.py |
100% | Setup lifecycle and zero-friction entity migration |
alarm_control_panel.py |
100% | Core integration component |
binary_sensor.py |
100% | Magnetic contacts, door/window sensors, motion sensors |
bus_monitor.py |
100% | In-band 500-frame circular ring buffer tap (0 extra sockets) |
button.py |
100% | Scenario buttons and bus diagnostic pings |
climate.py |
100% | Heating, cooling, 4-pipe systems, and thermostat controls |
config_flow.py |
100% | Step handlers, user entry, reauth, and options flow |
const.py |
100% | Protocol commands, dimensions, and integration constants |
core/transport/base.py |
100% | Abstract transport layer defining OWN lifecycle contract |
core/transport/serial.py |
100% | Async Serial/USB transport for Legrand 3578 / OpenZigBee |
core/transport/tcp.py |
100% | Modular TCP/IP socket transport with framed stream parsing |
cover.py |
100% | Motorized shutters, blinds, roll-ups with state tracking |
cover_calibration.py |
100% | Core integration component |
cover_motion.py |
100% | Core integration component |
cover_scope.py |
100% | Core integration component |
data.py |
100% | Core integration component |
decoder_companion.py |
100% | Core integration component |
decoder_pool.py |
100% | Thread-safe streaming proxy audio pool |
device_trigger.py |
100% | Stateless CEN/CEN+ scenario device automation triggers |
diagnostics.py |
100% | Config entry diagnostics with sensitive data redaction |
discovery.py |
100% | Core integration component |
gateway.py |
100% | Hardware handler, lockout prevention, adaptive queue pacing |
gateway_events.py |
100% | Core integration component |
gateway_resync.py |
100% | Core integration component |
gateway_sessions.py |
100% | Core integration component |
identity.py |
100% | Core integration component |
legacy_yaml.py |
100% | Core integration component |
light.py |
100% | Relays, auto-dimmer detection, and brightness transitions |
light_dali.py |
100% | Core integration component |
light_fade.py |
100% | Core integration component |
light_group.py |
100% | Core integration component |
media_player.py |
100% | F441/F441M sound system zones, dynamic proxy, gain-staging |
media_player_decoder.py |
100% | Core integration component |
media_player_group.py |
100% | Core integration component |
media_player_pool.py |
100% | Core integration component |
media_player_routing.py |
100% | Core integration component |
media_player_source.py |
100% | Core integration component |
media_player_zone.py |
100% | Core integration component |
migrate.py |
100% | Core integration component |
myhome_device.py |
100% | Home Assistant device registry schema compliance |
poll_health.py |
100% | Core integration component |
repairs.py |
100% | Core integration component |
router.py |
100% | Core integration component |
sensor.py |
100% | Power meters, energy counters, and pulse sensors |
services.py |
100% | Core integration component |
sound_source.py |
100% | Core integration component |
switch.py |
100% | Relay actuators, auxiliary switches, socket controllers |
topology.py |
100% | Core integration component |
validate.py |
100% | Device & gateway schemas, custom WHERE validators, sensor injections |
websocket.py |
100% | WebSocket API for real-time bus streaming, history, and diagnostics |
where_grammar.py |
100% | Core integration component |
Live Test Execution: View the live code coverage dashboard directly on Codecov (v2-phase1-architecture) or download the interactive HTML report from the test-coverage GitHub Actions run.
The development of the MyHOME integration is organized into strategic release milestones aligned with community RFC #248. For comprehensive milestone details, technical specifications, and contributor attribution, refer to the full ROADMAP.md.
- Phase 1: Architecture Modernization & Core Feature Parity (v2.0 — Complete)
- Declarative hardware gateway profiles (
MH200toF454). - Dual asynchronous transports: Async TCP & Serial/USB (
Legrand 3578 / OpenZigBee). - Adaptive inter-frame bus pacing & sentinel supervisor lifecycle.
- In-band Lovelace Bus Monitor Card (
<myhome-openwebnet-bus-monitor>) & WebSocket streaming proxy. - Native Home Assistant Diagnostics (
diagnostics.py) & GitHub Issue Forms. - Full feature parity across primary subsystems: Light, Switch, Cover, Climate (Fancoil), Alarm, Binary Sensor (3477 Dry Contact / IR), Device Triggers (CEN/CEN+).
- 100% automated test coverage across all component modules.
- Declarative hardware gateway profiles (
- Phase 2: CEN/CEN+ Triggers, Central Unit Coordination & Multi-Gateway Routing (v2.1 — Live)
- Strongly typed CEN / CEN+ scenario command builders and native device triggers with string-preserved addressing (P2).
- Thermoregulation Central Unit (3550 / 4695) master mode toggles and whole-plant zone synchronization (P4).
- Multi-gateway plant routing, MAC namespacing, and cross-talk isolation (P6).
- DALI Tunable White (Dimension 14, 2000K–6535K) auto-detection and color temperature control.
- Multi-authority OpenWebNet Golden Corpus cross-validation with 100.0% line coverage.
- Phase 3: Native Bus Timers & Environmental Auto-Discovery (v2.2 — largely delivered, Q4 2026)
- Native SCS light actuator temporization / staircase timers (
WHO = 1Dimension 2 & timed WHAT codes):myhome.turn_on_timedand thetimer/durationparameters. - Dynamic discovery for illuminance & motion detectors (Legrand 048834). Open bug: broadcast
WHERE 0frames create a phantom illuminance sensor (#604). - Passive bus sniffing & topology auto-mapping: shared-bus topology step in the config flow is in; the remaining probe needs a capture from a plant with two gateways (#453).
- Native SCS light actuator temporization / staircase timers (
- Phase 4: Actuator Diagnostics & Endpoint Safety Locks (v2.3 — Q4 2026)
- Actuator hardware maintenance locks (
WHO = 14) as lock / unlock configuration buttons (#353). - Decide whether the locks also become a native
lockentity with domain services (#493). - Device fault reporting as self-clearing Home Assistant repair issues (
device_health.py). - Cover end-stop settle recomputation and 0.5 s limit-stop cutoff from known positions (#834, #847).
- Relay operating cycle counters: no WHO 14 / 1001 / 1004 captures exist yet, so this waits on community traces (#466).
- Actuator hardware maintenance locks (
- Phase 5: Extended Lighting Management & DALI-2 (v2.4 — deferred)
- Lighting Management Room Controllers (
WHO = 24BMNE500 / 002645) are deferred as an optional standalone extension; the residential core stays onWHO = 1and the DALI gateways. See ROADMAP.md.
- Lighting Management Room Controllers (
- Phase 6: Smart Energy Management (v2.5 — Q1 2027)
- Power meters and energy counters (
WHO = 18) as Home Assistant energy sensors. - Energy management central units & multi-function power meters (
WHO = 18F520/F521/F522/F523/3522): not started, needs a scope decision and captures. - Multi-room FM tuner presets, frequency, and RDS metadata (
WHO = 22/WHO = 16): nativemedia_playertuner controls with band, preset, and frequency tuning (#839, #844).
- Power meters and energy counters (
- Stable v2.0.0: merge the v2 line (PR #232) into
masterso HACS users receive it; today every release is a pre-release (latest: v2.0.0b17).
This integration is developed and maintained by the OpenWebNet-HA community.
Special thanks to:
- @anotherjulien for creating the original MyHOME integration and laying the protocol foundations.
- @GreenGrassBlueOcean for the v2 modernized architecture, gateway profiles, streaming proxy, and test suite.
- @xtimmy86x for crafting the frontend user experience, administration panel, cover calibration interfaces, and hardware diagnostics.
- @gdluck for outstanding engineering, invaluable ideas, and rigorous physical F461 plant measurements.
- @TheDarkWizard for crucial CEN+ wire address captures (KW8011), WHO 1001 diagnostics, and tireless real-world hardware testing across Living Now controls and MyHomeServer1 setups.
- @wave68runner for the authentic HL4684 touchscreen captures, BTicino 3550 thermoregulation sweeps, and tuner diagnostics.
- @Interstellar0verdrive for deep hardware actuator analysis, cover timing/concurrency mechanics, and platform extensions.
- @fedem95, @mantovanellimatteo, @lyubomirtraykov, and Cedric Rohou for key bugfixes, platform extensions, and community testing.
- @GianlucaCh for preserving and contributing the comprehensive 15-manual BTicino/Legrand specification archive (
OWN DOC.zip), the officialWHO_24.pdfLighting Management specification, and CEN+ community automation references. - @nicolacavallo84 for the iconic 70+ device plant captures and H4890 touchscreen multi-gateway traces that form our foundational CI replay fixtures.
- All community testers and trace providers whose real-world bus captures keep our test suite grounded in real hardware: "In traces we find the truth" — their traces prove again and again that we can only build reliable stuff when we get authentic user traces: @manfredgittmaier-afk, @eC0y0te, @simo72mast-lab, @lionelser, @caiosweet, @f18m, @marcob79, @xduss, @pakob81, @Depechie, @nce2704, @ricdijk, @imfreddie, @theveninjeremy, and @Yvan13120.
Licensed under the Apache License 2.0, the same license as Home Assistant Core.
