A custom integration for BTicino / Legrand MyHOME (OpenWebNet) installations,
talking to the gateway (MyHOMEServer1, F454/F455, MH200N/MH202, ...) through the
OWNd library.
It is a fork of anotherjulien/MyHOME
(via the artmakh fork), the integration that made MyHOME usable in Home Assistant
in the first place and that this project owes everything to. The original now
receives only occasional community fixes, so this fork carries it forward on a
best-effort basis with one goal: an integration that stays up and keeps working with current Home
Assistant releases — sessions that detect a dead connection and reconnect on
their own, commands that are never silently dropped, strict configuration
validation, and closed deprecations.
- Current release: 0.5.0 (13 September 2026) — see CHANGELOG.md
- Requires Home Assistant 2026.9.0 or newer
- Devices are declared in a YAML file (
myhome.yaml); the gateway is added from the UI
- About this project
- Features
- Supported devices
- Quick start
- What's new / Upgrading
- Documentation
- Support & contributing
- Acknowledgments
- License
This is a personal project, and it is honest about how it was made.
I am not a professional developer. I run a MyHOME installation at home and for
years I have gratefully used anotherjulien's integration, which is the foundation
of everything here: without that work, and without the OWNd library by the same
author, this fork would not exist. When the original project slowed down to
occasional community fixes — perfectly understandable for volunteer work — I
forked it to keep it alive for my own use and to fix the things that, over time,
had broken with newer Home Assistant releases.
The code in this fork was written with AI assistance, with me in the lead. That does not mean a ten-line prompt and a "done": it meant hundreds of hours of reading the original code and the OpenWebNet protocol, running structured multi-agent audits of every module, deciding what to fix and how, writing shared contracts between modules before touching them, reviewing every diff, running the automated test suite (which runs in CI on every push and includes an end-to-end test against a fake OpenWebNet server), and then testing each release against my real house — lights, shutters, power meters, reloads and restarts — before publishing it. When something did not work in the real world (for example, a cover position that was lost on reload), it was found by testing, fixed, tested again and released as a patch.
If you know this domain and you are skeptical of AI-assisted code, you are right to be, and you are welcome to read the code, the tests and the CHANGELOG: every change is documented with the reason behind it. Bug reports and pull requests are welcome; I will answer on a best-effort basis.
- Lights: ON/OFF and dimmable actuators, area/group/general addresses, bus interfaces
- Covers: shutters and blinds with a time-based position estimate
(
opening_time,closing_time), a two-phase slats/curtain model with opt-in tilt control (slat_time,tilt),set_cover_position,invertedwiring, and real positions on advanced actuators - Covers, the position that is actually right: the estimate follows the roll on
the tube instead of a straight line (
roll, oropening_roll/closing_rollwhen the shutter does not behave the same way up and down), and two actions measure that model on your own shutter in centimetres and scale it to every other shutter of the same kind by its curtain travel (cover_profiles:) — see Calibrating a shutter in centimetres - Guided calibration: Configure → "Calibrate a cover" drives the shutter,
times its runs from the actuator's own status frames and asks for three tape
readings; it stores the model where it beats
myhome.yaml, and writes a profile every similar shutter inherits by its curtain travel — see Guided calibration - Profiles and covers panel: a full page inside Home Assistant showing every
basic cover grouped by the profile it follows, where a cover is assigned by
dragging it into another group (or a long press on a phone, or the keyboard), a
batch is reviewed with the values each cover would end up on before anything is
written, and the last write can be undone. The guided calibration runs on that page
too. Admin only, hidden in the sidebar until you turn it on, and it never writes
myhome.yaml— see Profiles and covers panel - Switches: WHO 1 actuators driving loads other than lights (outlets, generic relays)
- Climate: thermoregulation zones and central unit (heat/cool/auto/off, set point)
- Sensors: instant power with a built-in keep-alive, daily/monthly/total energy (when the gateway answers), temperature and illuminance
- Binary sensors: dry contacts, alarm zones, motion sensors (with timeout)
- Buttons (opt-in): Lock/Unlock of a single actuator (
lock_buttons: true) - Scenario controls (CEN / CEN+): declared keypads become devices with an event
entity and UI-selectable device triggers (
scenario_control:), plus two automation blueprints - Events: CEN/CEN+ keypad presses (
myhome_cenplus_event,myhome_cen_event), wall pushbuttons in dimmer mode held down (myhome_light_pushbutton_event, which turns any relay's pushbutton into a second gesture) and raw bus frames (myhome_message_event) for automations - Services: send raw OpenWebNet messages, sync the gateway clock, start/stop discovery, request instant power
- Discovery: devices seen on the bus but not yet configured are written as
suggestions to
myhome_discovered.yaml(yourmyhome.yamlis never modified) - Multiple gateways in one
myhome.yaml; English, French, Italian, Dutch, Spanish, German and Portuguese translations - Resilient by design: TCP keepalive and idle watchdog on the event session, timeout/retry/TTL on the command queue, entity availability that follows the real connection state, strict YAML validation with clear error messages
| Home Assistant platform | OpenWebNet WHO | What it covers |
|---|---|---|
light |
1 | ON/OFF and dimmer actuators |
switch |
1 | Actuators used for non-light loads |
cover |
2 | Shutters, blinds (basic and advanced actuators) |
climate |
4 | Thermostat zones, central unit |
sensor |
18, 4, 1 | Power/energy meters, temperature, illuminance |
binary_sensor |
25, 9, 1 | Dry contacts and alarm zones, auxiliary inputs, motion sensors |
button |
14 | Optional Lock/Unlock of an actuator |
event |
25, 15 | CEN+ / CEN scenario controls declared as devices (device triggers, blueprints) |
This repository is not in the default HACS store: add it as a custom repository.
- In HACS open the menu (⋮) → Custom repositories
- Repository:
https://github.com/Interstellar0verdrive/MyHOME-stability, type Integration, then Add - Search for MyHome in HACS, open it and Download
- Restart Home Assistant
- Add the gateway from Settings → Devices & services → Add integration → MyHOME
- Describe your devices in
/config/myhome.yaml(see below) and reload the integration
- Download
myhome.zipfrom the latest release - Extract it to
custom_components/myhome/in your Home Assistant configuration directory - Restart Home Assistant and add the gateway from Settings → Devices & services
Add the gateway from Settings → Devices & services → Add integration → MyHOME.
Many gateways announce themselves over SSDP; if yours does not appear, choose
"Configure manually" and enter host, port and password (see
Gateway compatibility for which models are
confirmed). A later password rejection raises a reauth flow, and Configure on
the integration card changes the address, port and password, the myhome.yaml
path, the number of command sessions, raw-event generation and the five session
tunables — idle
watchdog, probe window, command timeout, queue TTL and the default instant-power
keep-alive — without removing the integration.
Full walkthrough and every option: Configuration reference.
Devices are declared in myhome.yaml, in your Home Assistant config folder. Here
is a minimal example — one light, one cover and one power sensor on a single
gateway:
gateway:
mac: "00:03:50:AA:BB:CC"
light:
kitchen_light:
where: "15"
name: "Kitchen Light"
cover:
living_room_shutter:
where: "81"
name: "Living Room Shutter"
sensor:
house_main_power:
where: "51"
name: "House Main Power"
class: powerSave the file, then reload the integration (Settings → Devices & services → MyHOME → ⋮ → Reload). The file is validated on every (re)load; a validation error is shown in the integration card with the offending key path.
This covers the basics — see Configuration reference for the full parameter tables (every platform, energy filtering, Lock/Unlock buttons, multiple gateways, custom icons) and Recipes for copy-paste automations.
0.6.0 (unreleased) puts the calibration on a page of its own. "Profili e tapparelle" is a full-page panel — admin only, hidden in the sidebar until you add it from your own user page — that shows every basic cover of a gateway grouped by the profile it follows. A cover is assigned by dragging it into another group, by a long press and a tap on a phone, or from the keyboard; nothing is written until a review panel has shown, cover by cover, the values it would end up running on, and the write that follows can be undone. There is a card per cover, with every value saying where it comes from and a hand edit where an empty field means "inherit", and a card per profile, with its followers and a live preview of what changing it would do to each of them. Assignments now reach the covers without reloading the integration: nothing goes unavailable, no history is lost. Measuring a cover happens on that page as well: every button that used to send you to Configure opens the calibration where you already are, the conversation lives on the gateway rather than in the browser — so closing the tab does not lose a reading — and a calibration held by the dialog can be closed from the panel when it is in the way. Configure → "Calibrate a cover" is unchanged and remains a complete alternative to everything the panel does. Home Assistant 2026.9 or newer is required. See Profiles and covers panel.
0.5.0 (13 September 2026) is the current release. Its one theme is that a basic
roller shutter can be calibrated without a stopwatch: Settings → Devices &
services → MyHOME → Configure → "Calibrate a cover" drives the shutter, times its
runs from the actuator's own status frames, asks for a few tape readings and stores
the result inside Home Assistant, where the cover reads it. A basic calibration takes
about four minutes and lands within a couple of centimetres of the end stops; a
thorough one adds four readings and a check. Profiles let every similar shutter
inherit a measured one, scaled to its own curtain travel, and a correction path
puts right a cover that stops in the wrong place. Nothing is written to myhome.yaml,
covers that are not calibrated this way behave exactly as before, and the Calibration source attribute always says where a cover's values come from. See
Guided calibration.
The 0.4.x series prepared the ground: a roll model for basic covers (the curtain speeds up as the roll grows, so 50 % of the time is not 50 % of the travel), a calibration in centimetres through two actions, and a run clock that starts from the gateway's own answer rather than from the moment the command was queued, which is what keeps a dozen shutters commanded together from all stopping short. Details for each step are in CHANGELOG.md.
0.4.0 (7 September 2026) brought three additions, all opt-in or additive, with no renamed entity and no configuration change required:
A two-phase travel model for basic covers. On most roller shutters the first
seconds of a run only open the slats ("lamelle") and the last seconds only close
them, which is why a plain time-based position reports "5 %" with the curtain still
on the floor. Set slat_time (plus opening_time / closing_time when the motor is
slower one way) and the position describes the curtain while the new tilt controls
describe the slats — so "closed with the slats open" is one service call. Without
the key, covers behave exactly as in 0.3.x. See
Configuration → Cover.
CEN / CEN+ scenario controls as first-class devices. Declare a keypad under the
new scenario_control: block and it becomes a device with an event entity (the last
press is finally visible in the state machine and in history) and with device
triggers, so "Button 2 held down on Living Room Keypad" is a dropdown in the
automation editor rather than a hand-written event trigger. Two blueprints ship with
the repository. Undeclared controls keep firing myhome_cenplus_event /
myhome_cen_event and nothing else; those events gained a mac key (additive) so
multi-gateway plants can tell identical object numbers apart. See
Configuration → Scenario control.
Wall pushbuttons in dimmer mode become a second gesture. A BTicino light
pushbutton set to dimmer mode keeps sending "one step up/down" frames while held.
Behind a dimmer nothing changes (the light entity already follows). Behind a relay
those frames used to be dropped; they are now republished as
myhome_light_pushbutton_event, so a hold on any plain wall button can drive a
Zigbee bulb, a whole room, a scene. See
Recipes → Wall pushbuttons in dimmer mode
and CHANGELOG.md.
0.3.1 is a hotfix release. It upgrades the OpenWebNet library to OWNd 0.7.49
and, with it, fixes devices behind an F422 local bus interface, which received
no state updates at all before (their frames were applied to a main-bus device with
the same WHERE). It also stops the central heating unit from de-synchronising
zone 1, and stops myhome.sync_time from blocking the event loop. No configuration
change is needed and no entity is renamed. See CHANGELOG.md.
0.3.0 adds observability without changing any default behaviour: a Download diagnostics file on the integration page, diagnostic entities on the gateway device (connected, last frame; reconnections, dropped commands and queue length disabled by default), Home Assistant Repairs for configuration problems, and session tunables (idle watchdog, probe window, command timeout, queue TTL, default keep-alive) in the integration's Configure dialog. See Troubleshooting and the Configuration reference.
0.2.0 is a stability-focused rewrite of the gateway session handling, the YAML validator and every platform. Full details in CHANGELOG.md and a step-by-step guide in Migrating from the original; the highlights:
- Minimum Home Assistant version is now 2026.8.0.
- Breaking: Lock/Unlock buttons are now opt-in. They used to be generated for
every actuator; on upgrade the existing Lock/Unlock button entities are
removed. Add
lock_buttons: trueunder a device to keep them. - Energy totals are no longer discarded, but not every gateway provides them:
a MyHOMEServer1 with F520/F521 meters, for instance, acknowledges the requests
without returning data, so those sensors stay
unknownon that hardware. See Energy monitoring. - You can probably remove your workaround automations after a few days of watching the log: the integration now detects a dead session and reconnects itself, and arms/renews the instant-power keep-alive on its own.
- A duplicate
whereacross two devices is now a clear setup error naming both YAML keys, instead of silently dropping one of the devices.
Existing myhome.yaml files keep working unchanged — the only behaviour change on
upgrade is the opt-in Lock/Unlock buttons, above.
The docs/ folder goes deeper than this README:
- Configuration reference — gateway setup from the UI,
the full
myhome.yamlschema, Lock/Unlock buttons, multiple gateways, custom icons, and validation errors - Services and events — every service's fields and every event's data contract
- Guided calibration — the Configure → "Calibrate a cover" dialog: the three paths, the two levels, the management screens and where the values are kept
- Profiles and covers panel — the full-page screen: opening it, the overview and its origin chips, assigning and reviewing, the two cards, and troubleshooting
- The panel's WebSocket API — for contributors: the
myhome/calibration/*commands behind the panel - Energy monitoring — the instant-power keep-alive, the push filter, daily/monthly/total energy, and deriving kWh without gateway totals
- Discovery — what a discovery run writes and does not touch
- Troubleshooting — common issues, debug logging, and
upgrading from the pre-
myhome.yamlversions - Gateway compatibility — what is verified per gateway model, what is only expected, and how to report yours
- Recipes — copy-paste automations and configuration for CEN/CEN+, raw commands, covers, energy, buttons and multiple gateways
- Migrating from the original — upgrading from
anotherjulien/MyHOME(or theartmakhfork), and the known limitations - Architecture — how it works inside, for contributors
- Development — setting up a dev environment, tests, linting
- Documentation: the docs/ folder in this repository (kept in sync with the code and versioned with each release)
- Bug reports and feature requests: GitHub Issues — please attach the diagnostics file (see Troubleshooting) and say which gateway model you have
- General MyHOME discussion: the long-running Legrand/BTicino MyHOME thread on the Home Assistant community forum, started for the original integration
Contributions are welcome! Please fork the repository, create a feature branch, make your changes, add tests if applicable, and submit a pull request. See Development to set up the test suite and linter first.
- anotherjulien/MyHOME and OWNd: the original integration and the OpenWebNet library it runs on — the foundation of everything in this repository. Thank you.
- artmakh/MyHOME: the intermediate fork this repository started from
- fedem95/MyHOME (fedem95): the structure of the CEN/CEN+
device_trigger.pyand themackey on the keypad events (0.4.0) - adrael/MyHOME (raphael): the
EventEntitymodel the scenario-control event entities follow (0.4.0) - OpenHAB OpenWebNet binding: reference for the discovery device-type mapping
- Home Assistant Community: Continuous feedback and support
- BTicino/Legrand: MyHOME protocol and documentation
This project is licensed under the GNU Affero General Public License v3.0 — see the LICENSE file for details.