RiDDiX/home-assistant-matter-hub

Publish your Home-Assistant Instance using Matter.

TypeScript

1,282

2,272 commits

updated Oct 11, 2026

See the code

README

Home-Assistant-Matter-Hub

"Home-Assistant-Matter-Hub"

Expose your Home Assistant devices to Matter controllers like Apple Home, Google Home, Alexa, SmartThings and Aqara Home

GitHub Release GitHub Pre-Release GitHub Issues GitHub Stars License

πŸ“– Documentation β€’ οΏ½ Discord β€’ οΏ½πŸ› Report Bug β€’ πŸ’‘ Request Feature


[!NOTE] πŸ”€ Community Fork - This is the actively maintained fork and successor of the original t0bst4r/home-assistant-matter-hub, which was discontinued in January 2026 and has since been archived. We continue active development with bug fixes, new features, and community support. Thank you @t0bst4r for the original work! ❀️

πŸ“¦ Migrating? See Migration Guide - your paired devices will continue to work! For a side-by-side feature list, see the fork comparison. The add-on slugs are hamh (stable), hamh-alpha and hamh-testing.


πŸ“ About

This project simulates bridges to publish your entities from Home Assistant to any Matter-compatible controller like Alexa, Apple Home, Google Home, SmartThings or Aqara Home. Using Matter, those can be connected easily using local communication without the need of port forwarding etc.


πŸ“¦ Releases & Branches

ChannelBranchCurrent VersionDescription
Stablemainv2.0.58Production-ready, recommended for most users
Alphaalphav2.1.0-alpha.933Ahead of Stable, carries the additions listed under Alpha Features
Testingtestingv4.1.0-testing.x⚠️ Highly unstable! Experimental features, may break

Which version should I use?

  • Most users: Use Stable (main branch) - thoroughly tested
  • Early adopters: Use Alpha (alpha branch) - gets every fix and feature first, see Alpha Features below
  • Developers/Testers: Use Testing (testing branch) - bleeding edge, expect breakage

Upgrading from 2.0.46

A few entities re-pair once on the first start after the update and lose their room assignment in the controller:

  • leak and freeze binary_sensors (now Contact Sensors by default) and any entity using the On/Off Switch override
  • a light may drop its auto power/energy readout, re-add it by mapping the sensor by hand

Re-assign the affected devices to their rooms after they reconnect. See the docs for detail.


πŸŽ‰ What's New

πŸ“¦ Stable Features (v2.0.58) - Click to expand

New in v2.0.58:

  • πŸ—‚οΈ Old backups get deleted again: the automatic backup only runs while HAMH shuts down, and the add-on gets a few seconds to stop, so the backup could be cut off before it reached the cleanup. Every restart left one more half-written backup in the list. Old backups are now also cleaned up at startup, and a backup keeps a temporary name until it is complete, so a cut-off one never shows up (#483)
  • πŸ›‘οΈ Backup settings are checked: the settings endpoint only takes a keep count from 1 to 100, and a failed write (a full disk, for example) fails that backup instead of crashing the app. The Turkish, Portuguese (Brazil) and Traditional Chinese texts no longer promise a scheduled backup
  • πŸ“– Docs: the Alexa "never connects" entry drops the fresh bridge advice, a new bridge did not help in #478, and says how to tell from the log whether the Echo reached the bridge
  • πŸ”Œ Port 80 in the network check: freeing it helped two users pair Alexa, so the Health Dashboard shows when it's in use (#449, #478)
  • πŸ’‘ Wattage for lights in Apple Home: a light can be set to On/Off Plug-in Unit, Apple only shows wattage on outlets (#484)
  • πŸ“– Docs: Apple Home power readings since iOS 27, and the port 80 note for Alexa
  • πŸ”Œ Each outlet of a power strip reports its own power (#488, thanks @barnabasbusa)
  • πŸ” A bridge that went quiet comes back on its own: a subscription that died while starting left every device offline until a restart (#487)
  • 🧽 Dishwashers understand Home Connect and SmartThings states (#486)
  • 🧹 Vacuum rooms reset when a clean finishes on its own: the next clean started from Home Assistant could only match the old rooms (#490)
  • πŸ’‘ No flash when Alexa dims a light that is off: it now turns on straight at the new level instead of its old brightness first (#491)
  • 🧽 Dishwashers on a power switch show their real state: the Home Connect or SmartThings state sensor is picked up automatically (#486)
  • 🧺 Washers and dryers on a power switch show their real state: Laundry Washer and Laundry Dryer types pick up the state from Home Connect, SmartThings, Miele or LG
  • βœ… Vacuums and appliances report a finished clean or cycle
  • 🏠 Every paired controller shows on the bridge card: it only showed Google and Alexa, and 4448 now shows as Sengled
  • πŸ“– Controller support: SmartThings added, Apple no longer warns about fans, air purifiers and air quality, and Google no longer warns about smoke alarms and dishwashers
  • πŸŒ€ Fans and air purifiers follow Home Assistant again: speed and mode changes from HA stopped reaching controllers in alpha.880 and 2.0.57, only on/off still followed (#494, thanks @bigmike613)
  • 🧹 Apple Home drops the old rooms during a clean started elsewhere: after a three room Apple job, a one room clean from Home Assistant still showed "cleaning 3 rooms" (#492)
  • 🧹 Apple Home stays on Vacuuming after a start: while the vacuum was still leaving the dock, Home flipped to "Ready, Resume Cleaning Later" for a few seconds (#496)
  • πŸͺŸ Dashboard cover chip shows how far it is open: a closed cover showed "100% open", controllers were never affected (#495)
  • πŸ—ΊοΈ Vacuum rooms stay in the run mode list: Valetudo and auto-detected Roborock rooms fell out after the first Home Assistant update, CLEAN_AREA rooms right at startup, so controllers such as Alexa saw only Idle and Cleaning (#497)
  • πŸ”‹ Battery sensors stop showing up as their own device: a battery that was unavailable during a refresh got its own device next to the temperature sensor and stayed, and a temperature sensor built in that moment never picked its battery up (#498)
  • 🧹 Vacuum current room and room names in Apple Home: the current room follows the robot through rooms outside the job, and a room renamed in Home Assistant reaches the room list without re-pairing (#501)
  • ↩️ Failed Home Assistant calls no longer leave a stale state: when a call fails after the command was accepted, the device goes back to its Home Assistant state within a second instead of staying "opening" or "on" (#446)
  • πŸ‡³πŸ‡± Dutch translation: new nl locale, thanks @toineenzo (#503)
  • πŸ‡«πŸ‡· French translation completed: about 316 strings that fell back to English are translated now, thanks @iblur01 (#504)
  • ☁️ VeSync plugin: Levoit, Cosori and Etekcity devices from your VeSync account mount when you switch them on, with no bridge restart. Cloud only, these devices have no local control. An air fryer cannot be started from a controller.
  • βš™οΈ Saving a disabled built-in no longer wipes its settings: a built-in plugin that has been disabled since the last restart keeps its stored settings when you save.

Previously in v2.0.57:

  • 🧹 Air purifiers stop rebuilding themselves: a composed device never listed its battery entity, so the battery auto-map retry rebuilt the endpoint on every sensor update, burning CPU and raising unhandled rejections. A sensor without a device class now needs "batt" in its id to count as the battery, so a filter life or tank level percentage is no longer taken for one (#461)
  • πŸͺŸ Covers keep their position while a controller is talking to them: endpoint state writes are serialized per device, and an update that arrives while the endpoint is busy waits for it instead of being dropped with a warning (#464)
  • πŸ”’ Lock PIN handling reworked: a PIN added or cleared through a controller takes effect immediately instead of on the next state change, empty and overlong PINs are rejected, Add, Modify and the creating fabric are enforced as the Matter rules require, a code the physical lock rejected is no longer reported as programmed, and hashing moved off the event loop so a PIN protected unlock stops freezing every bridge
  • 🧠 Heap limit is configurable: the add-on takes a heap_size_mb option, the automatic sizing moved from a quarter to half of the available memory, and a NODE_OPTIONS you set yourself is honored instead of being silently overridden (#459)
  • 🧩 Third-party plugins load again: an installed plugin package is imported through its manifest entry point instead of its directory, plugin devices report their own name to controllers, and adding or removing one tells commissioned controllers that the bridge composition changed; contributed by Patrick Gu (#458)
  • 🚨 Security plugin can mirror an existing alarm panel: the new sourceAlarmPanel setting turns the four mode switches and the Alarm contact into a Matter view of an alarm_control_panel.* entity (Alarmo etc.), with arm and disarm flowing back to Home Assistant; contributed by Patrick Gu (#457). Panels that require an alarm code reject the bridge's arm/disarm calls, the switches then fall back to the panel's real state
  • 🏷️ A device renamed in Home Assistant reaches the controller: the registry snapshot is pushed to the endpoints on every registry refresh, a rename counts as a registry change now so that refresh runs at all, and server mode pushes the renamed identity to its root node. Apple Home takes the accessory name when the device is added and keeps its own copy, so a rename shows up there only for accessories you add after it (#467)
  • πŸ” Editing the entity filter takes effect right away: a removed entity rode the five minute outage protection meant for Home Assistant restarts. It is removed on the spot now, its endpoint number stays reserved so re-adding restores the device with its groups, and a filtered-out vacuum takes its room switches along and brings them back on their old numbers (#468)
  • 🍳 An oven exposed as a climate entity mounts in a Fahrenheit install: registration multiplied the raw Fahrenheit number by 100 before the unit conversion had a chance to run, so a template climate with max_temp: 500 failed with "Value 50000 is above the int16 maximum". Registration values are clamped into the Matter range now and the thermostat converts them on its first update (#470)
  • πŸ’‘ Siri "set to 100%" works next to Alexa: alexaPreserveBrightnessOnTurnOn now only suppresses the brightness reset for commands arriving over the Alexa fabric, before it swallowed the same command from Apple Home (#460)
  • πŸͺŸ Covers keep the same Matter fingerprint for life: a cover that had been moved used to come back from a restart advertising an extra attribute it never had when the controller paired it (#456)
  • 🧩 New composedPrimaryOnParent bridge option, off by default: puts the primary entity of a self-grouped composed device on the parent endpoint, so Apple Home reads the accessory as a light instead of taking an icon from one of the grouped entities. Needs autoComposedDevices on as well. It changes the endpoint layout, so the device has to be removed and added again in the controller, and Apple Home has been seen to stop listing the grouped entities afterwards, so try it on one bridge first (#469)
  • πŸ“‘ New omitEventsInPriming bridge option, off by default: for Google fabrics that acknowledge every chunk of the initial subscription report but never answer the final one, leaving the device permanently offline. With it on, the initial report carries attributes only, live events afterwards are unaffected (#424)
  • ❄️ Per-entity climateForceTurnOn: sends climate.turn_on on every Matter On command, for IR controlled ACs where Home Assistant can report on while the device is off (#462)
  • πŸ” A controller that refuses the bridge certificates says so in the log: pairing that stops right after the attestation step left only a bare "Failed" on the controller and nothing in the HAMH log. Controllers that only pair with CSA certified products, like the Ambiscape feature on Philips Ambilight TVs, cannot be used at all (#465)
  • 🌑️ The HAMH device cards follow Home Assistant's temperature unit: a Fahrenheit install saw Celsius chips on every thermostat and temperature sensor, because the card printed the raw Matter value (Matter always carries 0.01 Β°C) with a hardcoded unit. The chips now read the unit out of the endpoint itself: thermostats and water heaters from their UI configuration cluster, sensors and weather from the entity's own unit_of_measurement. What the controllers show never changed, Apple Home and Alexa convert on their side (#472)
  • πŸ”” A controller that stops answering is logged as a warning: the three "Error sending subscription update message" lines that precede a dropped subscription were logged at INFO, so a dying controller link was invisible to anyone filtering for warnings. The first two retries stay at INFO, the third one and the "Giving up on subscription" line are warnings now (#471)
  • 🌑️ A temperature sensor outside the usual range keeps updating: the sensor endpoint declared a -40 to 125 Β°C measurement window while writing anything int16 could hold, so an oven probe, a grill thermometer or a deep freezer was rejected by matter.js and the endpoint kept its last in-range reading forever. The declared window now covers everything the bridge can send
  • πŸ”Œ A docked vacuum stops claiming it is charging: with no charging signal of its own the bridge assumed a docked robot below 100% was charging, so Apple Home showed "Charging" for a robot that had long finished. If the vacuum's device has a charging sensor in Home Assistant (a battery_charging binary sensor, or a ..._charging_state sensor as Xiaomi exposes), it is mapped automatically now and drives both the battery charge state and the status line. Devices without one keep the old assumption, and a charging sensor picked up this way still stays available as its own device (#450)
  • πŸ”Œ EV charger mode works from SmartThings: SmartThings addresses EnergyEvseMode modes by list position, so the single Manual mode numbered 1 never showed and every mode change was refused. It is mode 0 now; a node that stored the old number still mounts. UserMaximumChargeCurrent is optional and read by no known controller, ModeSelect is not part of the EVSE device type, neither was added (#475)
  • 🧩 Auto Composed Devices says what it does: the description claimed a master toggle merging power and energy; those never depended on it. It changes the shape of a temperature sensor with humidity/pressure sensors (one device with a sub-device per reading), forces battery, humidity and pressure auto-mapping on and unlocks Composed Sub-Entities. Stored key unchanged (#474)
  • πŸ”‹ Battery percentage goes out with the write: the percentage is a quieter Matter attribute, and matter.js reported its change ten seconds after the write, on its own. The charge state went with the write, the percentage late or, on Apple Home, never. Both go together now (#450)
  • πŸ”‹ A short outage no longer blanks the battery: a device marked unavailable for a moment (a missed Roborock poll, an HA restart) got a null percentage and a flipped charge state, then the old values back 15 s later. The bridge keeps what the controller has; only a battery never seen stays null (#450)
  • πŸ§ͺ Loopback subscription test: a matter.js commissioner pairs with the vacuum node over loopback, subscribes, and checks that battery percentage and charge state arrive with the write. Off by default, HAMH_LOOPBACK=1 runs it. This settled the Apple Home battery question: the bridge sends the value, Apple's framework treats BatPercentRemaining as changes-omitted and keeps only the value from pairing or from a read (#450)
  • πŸ”Ž Diagnostic export shows the connection attempts: the export now keeps the PASE and CASE session setup lines and the failsafe expiry, lists every open session with its subscriptions, the host's network interfaces and mDNS settings (addresses replaced by their kind when anonymized), and the log levels it was taken at. A controller that never connects, or connects and never subscribes, is readable from the file instead of a debug log (#477, #478)
  • 🧹 Factory reset goes through the stop path: the reset restarted the bridge without stopping it first, so the built-in plugins stayed registered and every reset logged "Plugin camera is already registered" (#477, #478)
  • πŸ’‘ Cool white lights load again after a restart: a light that ran above 6800 K kept its color temperature in storage, and on the next start the bridge's default range no longer covered it, so matter.js refused the endpoint and the light was missing until the value changed. The range now widens around the stored value first (#477).
  • πŸ” The devices API keeps the camera's Home Assistant token to itself: the WebRTC bridge lives in the camera endpoint's state, and the devices JSON behind the endpoint inspector printed its haUrl and haToken. The credentials are a private field now, and any key named token, secret or password is redacted in that output (#155, #373)
  • 🏷️ Prefer Entity Registry Name applies in server mode: only bridged devices read the flag, a standalone device kept the friendly name (#276)
  • 🚫 Water Leak Detector is marked unsupported on Alexa: the mapping dialog warns before you pick the type that took a whole Alexa bridge offline (#365)
  • 🧹 A rebuilt composed device drops its pending update: after a mapping change the old endpoint was closed with a 50 ms update still queued, which then failed on the closed endpoint (#461)
  • πŸ”‡ Deleting a bridge no longer logs a mutex warning: the shutdown guard looked for a message matter.js never sends
  • πŸ“– Docs: the vacuum "Updating" section describes the Wedge Watchdog and the 60 s report interval (#287), the Alexa section covers the 11-digit manual code, the Echo models that stop after the certification prompt and the Unique ID Suffix (#478, #449, #385), heap warnings name the add-on's heap_size_mb option (#459)
  • 🧭 The interface warning names your LAN interface: on a Docker host the Network Diagnostics card and the startup log listed every interface, Docker bridges included, and left the choice to you. A compose bridge on a 172.x address no longer counts as a candidate, the suggestion reads "eth0 (192.168.5.161)", and the text says the warning only matters when a controller shows devices offline (#482)
  • πŸ“– Docs: the Alexa "never connects" entry lists the checks that helped in #478 (firewall on UDP 5540, manual code, fresh bridge) instead of a theory

Previously in v2.0.56:

  • πŸ”‹ Vacuum battery after HA 2026.8: integrations that moved the battery to a separate sensor are picked up as the sensor appears, a missing percentage reports an unknown charge state instead of "charging forever", and terminal states like "not charging" stop counting as charging (#450)
  • πŸ’‘ RGB-only lights pass controller conformance again: the Extended Color Light always advertises the full mandatory feature set, which brings WLED and similar lights back to Alexa (#452)
  • 🌫️ PM2.5, PM10 and COβ‚‚ sensor overrides: map a single-pollutant sensor to an Air Quality Sensor endpoint carrying just that concentration cluster via the Entity Mapping UI (Aqara renders them, Alexa partially)
  • πŸ‡°πŸ‡· Korean translation by @hyeok-yoo (#455)
  • πŸ”€ Debounced commands no longer swallow an explicit on/off that arrives next to a level or color change (#453)
  • 🌑️ Thermostats write their absolute limits before the user limits, so a flat heat range can no longer trip the range check on bring-up (#454)
  • πŸͺŸ Cover end product type follows the feature map: a tilting curtain or shade reports the matching tilting product, a lift-only blind stops claiming InteriorBlind (follow-up to #304)
  • πŸ” Three Alexa pairing diagnostics, off by default: advertiseSpecVersion151, supportTermsAndConditions and enableMatterTcp, for Echos that stop right after the attestation step (#449)
  • 🧹 Session supervision and entity mapping sync now live in shared code instead of two near-identical copies per bridge flavour; no behavior change

Previously in v2.0.55:

  • πŸ”— Devices keep their Matter numbers when Home Assistant restarts, so controllers stop re-adding everything and losing groups and routines (#438)
  • πŸ”Œ One plugin device no longer stalls every state update on its bridge, and plugin devices stop vanishing a minute after a refresh (#445)
  • 🚫 A command that cannot reach Home Assistant now fails instead of reporting success, so a cover no longer shows a position it never reached (#446)
  • πŸ’‘ Identify presses the identify button of the device, on everything rather than vacuums alone (#447)
  • 🌑️ Climate power-on reaches the device even when the cached state lags (#441)
  • πŸŒ€ Fan speed zero picks the slowest mode the entity really has, and fan sliders can be debounced so bridged air conditioners stop beeping (#442, #443)
  • 🎚️ Number feature flags render as number inputs, so the cover and fan debounce settings are reachable in the UI at last
  • 🀝 A controller that is still being interviewed is no longer disconnected halfway, which could abort commissioning
  • πŸ“· Camera devices carry the bridged information every device under a bridge needs (#155)

Previously in v2.0.54 (hotfix release):

  • πŸ”Œ Plugin disable now sticks across restarts, for the security and camera plugins alike
  • πŸ‘» An unconfigured security plugin exposes no devices anymore; updating removes the ghost plugs
  • πŸ” Disabling a plugin removes its devices immediately, re-enabling keeps their identity

Previously in v2.0.53:

  • πŸ›‘οΈ Security plugin (experimental): the bridge becomes a small alarm system with Home/Away/Night/Vacation switches you arm from any controller or by voice, entry/exit delays, trigger and alert lists; for setups without an alarm integration
  • πŸ€– Vacuum room switches: opt-in per-room switches that controller routines can flip, an opt-in ascending room order for batch cleaning, and auto-resolved rooms survive state updates (#355, #368)
  • πŸ”Œ Plugin settings dialog: configure plugins right on the Plugins page; config survives restarts, stored secret fields are redacted from the plugin listing, and the page explains server mode instead of failing (#432)
  • πŸ”” Doorbell and electrical utility meter overrides: opt-in Matter 1.4 device types for event entities and consumption sensors; SmartThings renders them, defaults stay unchanged
  • 🚿 Water heater management: opt-in Matter 1.4 Water Heater with Boost/CancelBoost on top of the heating thermostat, for energy-management controllers (#437)
  • πŸŒ€ Fan modes follow the entity: controllers are only offered the speeds and modes the HA fan actually accepts, no more phantom Medium or Auto (#436)
  • 🌑️ heat_cool thermostats no longer crash-loop the add-on: the auto deadband is zeroed, single-mode setpoints ignore the parked range, and an endpoint that still fails is contained instead of exiting (#435)
  • πŸ”’ Lock stops re-adding itself: a stale flag written by v2.0.7-v2.0.16 failed lock init on every start, so the lock re-paired as a new device each boot; it is cleared on load (#433)
  • πŸ’‘ Google room-off no longer relights dimmable lights: the level Google sends after "turn off" is stored for the next turn-on instead of being applied (#434)
  • πŸͺŸ Cover stuck-moving paths closed: the remaining cases that kept a cover reported as moving are fixed, and resolved cover flags are logged (#429)
  • πŸ”Œ Plugin devices receive controller writes again: a wiring gap dropped attribute writes on the way to plugin devices
  • 🧡 matter.js 0.17.9
  • πŸ“Š Fork comparison page: the docs compare this fork with the archived t0bst4r upstream, feature by feature

Previously in v2.0.52 (hotfix release):

  • πŸ”Œ The plugins page no longer fails with a 500 when a server mode bridge exists (#430)

Previously in v2.0.51:

  • πŸ• Opt-in wedge watchdog: rotates a controller session that keeps acking but stops talking at the interaction layer, the automated "Play Sound" fix for stuck Apple devices (#287, #428)
  • 🧹 Clean up orphaned records: bridge menu action with a dry-run preview that removes identity and mapping leftovers of entities deleted from HA (7 day tombstone guards against false positives)
  • πŸš— EV charger support: new EVSE device-type override with charging switch and current limit mapping, EnableCharging/Disable from the controller; Aqara and Home Assistant render it, keep it off Alexa bridges
  • 🩺 Subscription scope on the health card: see whether each controller holds a whole-node wildcard or watches specific endpoints
  • πŸ“· Camera live view signaling completed: the WebRTC answer now reaches the controller over the requestor cluster, plus full media path logging, HA signaling timeouts, trickle ICE and ICE server support (still experimental until verified on real hardware)
  • πŸͺŸ Cover stop detection in every position space: the v2.0.50 cover fix now also works with the Alexa percentage flag and the per-cover swap toggle, and swapped covers report the right direction (#429)
  • πŸ€– Vacuum on/off crash fixed: state updates no longer throw on vacuums with the on/off toggle (#428)
  • 🌍 Brazilian Portuguese completed: 602 of 615 strings (#420)

Previously in v2.0.50:

  • πŸ†” Stable device identity (opt-in): endpoints keep their identity when an entity is renamed or re-registered, keyed on the HA registry unique id; enable the stableIdentity feature flag per bridge (#404, #407)
  • ⚑ Energy suite stage 1: consumption sensors expose an Electrical Meter that Google Home and SmartThings render, home batteries become a Battery Storage device with signed charge/discharge power and lifetime energy, and voltage/current/energy sensors group onto one endpoint via new mapping fields
  • πŸͺŸ Covers report their own movement: controllers get the moving-to-stopped edge even when the integration never reports opening/closing, clears the stuck "Opening" on Echo Show (#429), and discrete commands cancel a pending slider action (#411)
  • πŸ§™ Commissioning preflight in the wizard: port, mDNS and controller checks with fix-it buttons before the QR code, plus a label guard and an empty-filter block
  • πŸ”‹ Per-entity "Disable battery mapping" switch (#427)
  • 🧩 Auto-grouped sensors read sub-entities past the bridge filter (#426)
  • πŸ“‘ mDNS records refresh when interface addresses change, recovers Google Home after an IPv6 prefix change (#415), and mDNS IPv4 can be disabled (#417)
  • πŸ–₯ Server mode shares the dead-session timeout and session diagnostics (#428)
  • πŸ”’ Per-lock PIN length overrides and an opt-in passthrough that programs the physical lock usercode (#418)
  • πŸ”˜ Opt-in to suppress the momentary on/off flip for scripts (#423)
  • 🚨 Smoke alarms report battery, fault and expressed state (#408)
  • πŸ’‘ Light level and color-temperature step control (#412)
  • πŸ“· Camera bridges enable Matter-over-TCP for SmartThings live view, and camera endpoints set the mandatory AV stream attributes (#419)
  • πŸ”§ Valve and cover overrides route On/Off to their services (#65)
  • 🌍 Brazilian Portuguese added (#420)
  • 🧡 matter.js 0.17.9
  • ⬆️ Dependency vulnerabilities resolved (websocket-driver, react-router 8, fast-uri, js-yaml and friends)

Previously in v2.0.49:

  • πŸŒ€ Fan speed restore: speed is remembered across transactions and restarts, localized wind presets map through, Auto is gated on a real auto preset, and an opt-in restores speed on power-on (#387)
  • πŸ“‘ Session recovery hardening: subscription jitter dropped, superseded sessions of a reconnecting peer swept, stale sessions closed only after a real quiet period, plus opt-in fast recovery (#386, #400, #398, #287)
  • 🩺 Per-fabric controller health card on the bridge page
  • πŸ”’ Endpoint number kept on mapping change so Alexa no longer re-adds the device (#404), plus a unique-id suffix to shed stale controller records (#385)
  • πŸ”˜ select as an On/Off Switch (#356), plus an experimental mounted On/Off control type (#380)
  • πŸͺŸ Tilt for set_tilt_position-only covers (#405), and tilt-only cover-as-light uses the tilt channel (#350)
  • 🚨 Warns on a non-5540 Alexa bridge (#401) and on an OTBR Thread mDNS interface (#388)
  • πŸ“· Camera plugin config scoped per bridge (#373)
  • πŸ”Œ Clashing bridge port reassigned on load (#378)
  • 🧩 Composed sub-entities compose even outside the bridge filter (#408), and composed sensors list all device types (#214)
  • πŸ”’ Unbolt maps to lock.unlock not open (#397), level-to-brightness uses one scale (#402), button drops the Lighting feature (#182), and stale cooling/auto state is cleared (#384)
  • 🌍 Russian translations added (#409) and zh-TW completed

Previously in v2.0.48:

  • 🌑️ Cooling-only thermostats no longer drop and re-pair after a switch to cool; a leftover Heat setpoint limit was crashing init (#381)
  • πŸ“ The Settings update box now shows the full release notes instead of cutting them off

Previously in v2.0.47:

  • πŸ’§ Leak and freeze binary_sensors now default to a Matter 1.3 Contact Sensor so Alexa stays stable; the Matter 1.4 Water Leak, Water Freeze, and Rain detector types are selectable per entity through the device-type override (#365)
  • πŸ’‘ Lights no longer auto-attach power/energy clusters; map a light's power or energy sensor explicitly with powerEntity/energyEntity if you want the readout (#374)
  • πŸ”˜ The On/Off Switch device-type override now exposes a real On/Off Light instead of a no-op plug (#380)
  • πŸ” New manufacturer entity-filter matcher (#382)
  • πŸŒ€ Opt-in: turning the companion fan off now turns the AC off too (#309)
  • 🩺 Reliability & health: configurable auto-recovery with failure timestamps, controller-compatibility warnings on each bridge page, and per-entity device-health on the dashboard
  • πŸ–₯️ Standalone (non-vacuum) devices in server mode, plus lawn_mower entities exposed as a robotic mower
  • πŸͺŸ Cover exposed as a dimmable light for Alexa routines (#372), per-entity update throttle (#351), charging-state sensor mapping (#377)
  • πŸ“· Experimental built-in WebRTC camera plugin (SmartThings-only, media path not verified yet)
  • 🧡 matter.js 0.17.9

Previously in v2.0.46:

  • ❄️ Opt-in companion fan for climate ACs: a per-entity toggle exposes the AC's fan as its own Matter fan endpoint, the setting is persisted, and fan-speed presets are now ordered lowβ†’high (#309)
  • 🌦️ Weather domain support: weather.* entities are exposed as a composed Temperature + Humidity + Pressure sensor read from the entity's attributes (pressure converted to hPa, shown on Google Home)
  • πŸ€– Vacuum service-area editing: edit area data inline in Entity Mapping and dispatch room cleaning in batches, plus a batch-room-data fix (#291)
  • πŸ”’ Door Lock credential hardening: safer access-code handling and fabric-index casting on the lock cluster (#313)
  • ⚑ Skip unchanged endpoints on HA updates: only endpoints whose entity or a mapped sub-entity actually changed are refreshed, so CPU no longer scales with entity count Γ— event rate (#351)
  • πŸ”Œ Registry stays resilient when HA drops: an initial reload failure no longer puts the add-on in a restart loop on a flaky HA boot, and a mid-flight "Connection lost" retries once (#352)
  • πŸ” RVC sessions refreshed safely so vacuum reactors don't go stale (#287)
  • πŸͺŸ Tilt-only covers use the tilt channel for lift commands (#350)
  • πŸ”‹ Battery auto-mapping narrowed to avoid false matches, plus support for enum battery states (#359)
  • πŸ”˜ automation entities are momentary: turning one on triggers it and snaps back to off (#364)
  • πŸŒ€ Climate swing-mode handling fix
  • 🚨 Non-5540 Alexa bridge warning: a bridge on any other port now warns, since Alexa only pairs on port 5540
  • 🧡 matter.js 0.17.0: upgraded from 0.16.11; the local LG-TV NOC-serial patch is dropped because upstream now tolerates 21-octet operational cert serials (#305)
  • 🧰 Build/runtime fixes: bun:sqlite constants export stubbed so the esbuild bundle builds against matter.js 0.17.0, add-on heap flag preserved (#358)
  • ⬆️ Dependency vulnerabilities resolved
  • πŸ“ Docs: hvac_action requirement for the Auto running-state display (#309), Google Home ModeSelect label gap (#356), Alexa cover-routine limitation (#312), and the new weather domain

Previously in v2.0.45 (hotfix release):

  • ⌨️ Typed text now binds in the entity-id autocomplete, so a partial entity id isn't dropped when you pick a suggestion (#348)

Previously in v2.0.44:

  • πŸͺŸ Cover reliability overhaul: Matter state/target/current reports split and correctly ordered, deferred target writes de-duplicated, legacy position attributes dropped from updates, cluster profile aligned with the certified Eve blind, current position held during external motion (#328)
  • 🎚️ Per-bridge and per-entity cover slider debounce, window widened to 300 ms for smoother slider control (#331)
  • πŸ€– Vacuum service-area handling: customServiceAreas preserved in dynamic RvcRunMode supported modes, custom areas dispatched sequentially, currentArea cleared on dock return and no longer inherited stale across restarts, observedCleaning set on every cleaning event (#335)
  • πŸ”‹ Docked vacuum stops reporting charging once the battery is full (#334)
  • ❄️ Per-entity climateKeepModeOnIdle for off+idle ACs; mode kept through a coolβ†’off transition, freeze applied immediately on off and cleared on action=off (#340)
  • πŸ” Matter session rotation: opt-in per-bridge setting, aged sessions rotated, RVC clean-mode reactor goes offline correctly, pushKeepalive guarded on construction (#287)
  • 🧠 Heap-headroom and force-sync pressure guard to reduce memory pressure (#347)
  • 🏷️ Per-entity customVendorId with Home Assistant device-registry serial fallback (#290)
  • πŸ”’ serialNumberSuffix now loads when editing a bridge and is preserved when the serial is trimmed to 32 characters (#330)
  • πŸ” Regex filters for entity and device labels, plus an any_field_regex matcher for grouped AND/OR filter rules (#337)
  • ⌨️ Entity-id autocomplete in the filter-rule editor (#338)
  • ⚑ Energy sensor endpoints default activePower to 0 and gain PowerTopology + cumulativeEnergyImported defaults (#343)
  • ⏱️ Home Assistant WebSocket message timeout is now configurable, default raised to 60 s (#341)
  • πŸͺŸ device_class=window covers no longer emit EndProductType.Unknown (#312)
  • πŸ–ΌοΈ Bridge-icon existence check now uses the /exists endpoint instead of a HEAD probe (#336)
  • 🧩 JSON editor de-duplicates @codemirror/state (#345)
  • 🌍 Polish translation update, credited to @MStankiewiczOfficial (#329)
  • βœ… Added regression test coverage for the session-max-age parser (#287)
  • ⬆️ Dependency hygiene: transitive deps flagged by Dependabot patched, serialize-javascript bumped to 7.0.5 in docs-site

Previously in v2.0.43:

  • πŸ€– Vacuum currentArea updates when cleaning is started outside HAMH (#281)
  • πŸ“‘ Sensor reactors mark themselves offline when HA disconnects, so updates reach controllers on reconnect (#327)
  • πŸͺŸ Lift+tilt window coverings pick a valid Matter Type (#323)
  • πŸͺŸ Cover device_class=window maps to Rollershade (#312)
  • 🧹 UWANT and Xiaomi sweep/mop labels recognised, mop usage routed via mode.vacuum_mop (#322)
  • πŸ€– Vacuum identify falls back to a sibling identify button when vacuum.locate is unsupported (#320)
  • ❄️ HA-auto AC systemMode stays put when hvac_action is idle, ha-auto-only ACs no longer expose Matter Auto (#309)
  • 🌑️ Climate setpoints snap to the entity target_temp_step (#321)
  • πŸ›°οΈ matter.js controller traffic captured in /api/logs
  • πŸ‡―πŸ‡΅ Japanese translation by @kimera257 (#325)
  • πŸ“ Docs note for the iPhone-only stuck-on-updating vacuum workaround (#287)

Previously in v2.0.42 (hotfix release):

  • πŸ‡―πŸ‡΅ Aqara bridge registration no longer stalls, root softwareVersionString now matches the numeric softwareVersion (#316)
  • ❄️ Climate auto mode is clamped to heat/cool on devices without an AutoMode base (#319)
  • πŸŒ€ Per-entity disableClimateFanControl mapping flag, falls back to ThermostatDevice when controllers like Aqara don't recognise RoomAirConditioner (0x0072) (#318)
  • πŸ—ΊοΈ Vacuum service area selectedAreas is kept after dispatch instead of being cleared

Previously in v2.0.41:

FeatureDescription
🌑️ Google Home AC offline fixDeadFrontBehavior on climate OnOff cluster so RoomAirConditioner stops showing offline on Google Home (#302)
πŸͺŸ Cover device_class mappingMap HA garage/gate/window/awning/etc. to the matching Matter WindowCovering type so voice commands hit the right device type (#304)
πŸ“Ί LG TV commissioning patchLocal patch on matter.js 0.16.11 to accept long NOC operational cert serials (#305)
πŸ’‘ Alexa brightness-reset behind flagOld Alexa brightness-reset heuristic moved behind alexaPreserveBrightnessOnTurnOn, default off, Apple Home "set room to 100%" works again (#306)
πŸŒ€ Google Home fan speedUses fan.set_percentage so already-on fans pick up speed changes from Google Home (#308)
❄️ Climate auto modeExpose Matter Auto mode when HA reports auto in hvac_modes (#309)
πŸ†” Server-mode root identityRoot identity now applies as a single transaction, so controllers don't drop devices mid-swap (#311)
πŸͺŸ Lift-only blindsNo more TiltBlindTiltOnly on covers without tilt, fixes Alexa routines for roller blinds (#312)
🏷️ Per-entity disableClimateOnOffTurn off the OnOff cluster on climate endpoints per entity for controllers that prefer mode-only control
πŸ”’ serialNumberSuffix per bridgeAppend a suffix to every entity serial, useful if controllers like Aqara cache stale device data
πŸ“ protocolLogLevel optionQuiet matter.js logs independently from the app log level
πŸ–₯️ Bridge HW/SW version stringsHA device-registry hw_version/sw_version now show up in Matter BasicInformation on server-mode endpoints
🎨 Extended color light: XY + enhancedColorModeXY feature added as mandatory, enhancedColorMode mirrors colorMode
🎭 Groups + ScenesScenes and Groups clusters added on light, plug, and fan endpoints
πŸ’§ Boolean state configurationCluster added on leak, freeze, rain, and contact sensors
🌍 Spanish translationNew es locale (#314, thanks @Yllelder)
🧡 Matter.js 0.16.11 (pinned)Kept pinned, local NOC serial patch applied
⬆️ Dep bumpsVite 8, jsdom 29, MUI x-tree-view 9, i18next 26, react-i18next 17, TypeScript 6.0.3, biome pinned 2.4.3, pnpm overrides for transitive CVEs

Reliability & resilience: parallel bridge stop in stopAll/restartAll, parallel HA registry fetches, serialized bridge start/stop lifecycle, serialized updateStates with plugin listener detach, HA reconnect retry on transient network errors, 30s timeout on sendMessagePromise, port-conflict reject on web-api start, graceful shutdown on /api/backup/restart, AppEnvironment disposal on SIGINT, stale optimistic state sweep, pending debouncer clear, healthcheck 401 fix under basic auth, deep-equal entity attribute comparison, overlap guard for auto-refresh, safer mireds conversion, aligned colorMode publishing, surfaced bridge import errors, corrected thermostat running state for unknown modes + drying, unified Node version across Dockerfiles, sourcemaps excluded from npm tarball, unused deps dropped (rxjs, strip-color, lodash), unused config-validator utility removed.

Previously in v2.0.39 & v2.0.40 (hotfix releases):

  • Fixed crash loop on startup caused by Node 22 native WebSocket dropping connections (#297, #299), affects both aarch64 (RPi) and amd64
  • Fixed service initialization errors being silently swallowed, causing the process to hang instead of exiting
  • Registry fetch now waits for WebSocket reconnect between retries and has increased retry tolerance
  • Fixed select, input_select, siren domains showing as unsupported in filter preview (#298)

Previously in v2.0.38:

FeatureDescription
🏷️ Per-Entity Identity OverridescustomProductName, customVendorName, customSerialNumber per entity mapping (#277, #290)
πŸͺŸ Garage & Gate Open/CloseDiscrete Open/Close mode for garage and gate covers (#55)
🚿 Dishwasher Device TypeDishwasher override for switch entities
🚨 Siren SupportSiren domain as OnOff Plug-in Unit
🏷️ productNameFromNodeLabel FlagReport node label as Matter productName for Aqara controllers
πŸ€– Vacuum Room ProgressDynamic room progress tracking via currentRoomEntity sensor
⚑ Startup Force SyncImmediate force sync on startup to beat stale Alexa queues (#282)
🌐 Network Diagnostic APImDNS/network diagnostic endpoint with dashboard card
πŸ”Œ Energy on Composed DevicesEnergy/power measurement clusters on composed endpoints
🩺 Multi-Admin Fabric DiagnosticsPer-fabric session info in health API
🩺 Docker HEALTHCHECKNative healthcheck in standalone and addon images
πŸ”’ Admin Password HashingAdmin password stored hashed, timingSafeEqual for lock PIN verification
🧡 Matter.js 0.16.11Updated Matter stack
🌍 Polish + Traditional ChineseNew pl and zh-tw locales

Fix highlights: vacuum keepalive for Apple Home "Updating…" (#287), multi-phase clean progress (#281), GenericSwitch single/multi split for Apple Home buttons (#289), HA restart attribute guards (#286), fan speed restore on turn-on (#275), moisture sensor auto-map to HumiditySensor (#273), TV speaker override (#293), rain + radon sensor auto-mapping, composed sub-endpoint cleanup.

Previously in v2.0.36:

FeatureDescription
πŸ—οΈ User-Defined Composed DevicesCreate custom composed devices via composedEntities mapping (#220)
πŸ”Œ Plugin Domain MappingsDomain mapping support in plugin API with cloud-mock example
πŸ”‹ Valve & Pump BatteryBattery support for valve and pump endpoints
🌐 German + Russian TranslationsComplete German translation and new Russian language
πŸ“‘ Session RecoveryGraceful session close, dead session cleanup, mDNS re-announcement (#266)
πŸ”— Quick Link to Failed DevicesDashboard quick link to failed devices (#270)
🌑️ Thermostat FixSkip climate.turn_on when already on (#269)
πŸͺŸ Cover FixCorrect stale targetPosition during external movement (#268)
🌬️ Air Purifier FixSub-endpoints for composed air purifier, manual temp/humidity mapping (#265)
πŸ”₯ Cooling-Only Thermostat FixPrevent HeatingOnly on cooling-only thermostat (#264)
↔️ Per-Entity Cover SwapIndividual coverSwapOpenClose per cover (#263)
πŸ§ͺ Alpha Features (v2.1.0-alpha.933) - Click to expand

v2.1.0-alpha.933:

  • πŸͺŸ Option to send cover open/close as a position: some cover integrations, like Cover Time Based, stop when they get open or close while the cover is moving, and only reverse on a position. Turn on Send open/close as position in the entity mapping and open and close go out as set_cover_position 100 and 0. Off by default, covers without a position keep open/close (#512)

v2.1.0-alpha.932:

  • 🧹 Removed option cleaned from saved bridges: a bridge saved with the old "Omit events in priming" option still listed it on the Diagnostics page and in the export. It is now dropped from storage on start

v2.1.0-alpha.931:

  • 🧡 No local matter.js patch any more: HAMH now runs matter.js 0.18 unchanged. The "Omit events in priming" bridge option is gone, it was never confirmed to help Google. The last failed subscription update and "Giving up on subscription" are logged at INFO again
  • πŸ” Session rotation is opt-in in server mode too: server mode bridges no longer close controller sessions every 4 h. Set Session Rotation Max Age if you want it back. When HAMH closes a session itself, it closes its subscriptions first
  • πŸ”Œ EV chargers answer charging target commands: SetTargets, GetTargets and ClearTargets are accepted and stored, nothing is sent to Home Assistant

v2.1.0-alpha.930:

  • 🧡 matter.js 0.18 RC (nightly 0.18.0-alpha.0-20261008): brings Matter 1.6.1. Controllers now see spec version 1.6.1, a Groupcast cluster on the bridge root and newer device type revisions. If something pairs or behaves differently than on alpha.929, please open an issue with the diagnostic export
  • πŸ”‡ matter.js device type checks stay off at runtime: 0.18 can check every endpoint against its device type and log a warning for each deviation at every start. HAMH turns that off, the endpoint shapes are covered by its tests

v2.1.0-alpha.929:

  • 🧹 Vacuums with one cleaning mode get a second "Auto" mode: Matter needs at least two cleaning modes, and the coming matter.js 0.18 refuses a vacuum with only one. Picking "Auto" is refused and nothing is sent to Home Assistant. Apple Home shows it as "Automatic"
  • πŸ”Œ EV chargers list "Time of Use" next to Manual: same rule for the EVSE mode list. Picking it is refused, Manual stays selected
  • πŸͺŸ Shutters with tilt become exterior venetian blinds: Matter 1.6.1 allows the Shutter type only with lift or tilt, not both. A tilting shutter cover now reports TiltBlindLift with ExteriorVenetianBlind, so already paired ones may show a different blind type. Covers also set a valid product type before their first state arrives
  • πŸ”’ Unlock with timeout reaches Home Assistant: the command used to flip the lock state in the controller without calling Home Assistant. It now unlocks through Home Assistant like a normal unlock and locks again when the timeout runs out
  • πŸ”˜ Long press events end released: a long_press without a following release sent the press twice and left the button held. It now sends press, long press and release once
  • πŸ“Ί TVs without play or pause mount: they failed to start because the playback cluster was left out
  • πŸ’‘ Color lights list RemainingTime and the pump mapping mounts, it never did before

v2.1.0-alpha.928:

  • 🧹 Apple Home can clean all rooms of a CLEAN_AREA vacuum: Apple sends "all rooms" as an empty selection and then starts with one room's run mode, so only that room got cleaned. The "Don't expose rooms as per-room cleaning modes" option in the entity mapping now also covers CLEAN_AREA rooms and rooms from the vacuum attributes, not only custom areas. Turn it on when only Apple Home starts the vacuum; Alexa and Google Home still need the room modes (#511)

v2.1.0-alpha.927:

  • πŸŒ€ Fans and air purifiers keep their speed range while unavailable: Home Assistant drops the speed step while a fan is unavailable, so the bridge changed the fixed SpeedMax from 100 to 3 and back on every outage. It now keeps the last value (#505)

v2.1.0-alpha.926:

  • 🎨 A color sent right after On is applied: Alexa sends the color a moment after On, while Home Assistant still reports the light off. The color was held back and applied on the next turn-on instead. It now goes out with this one, and a color right after Off no longer switches the light back on (#510)

v2.1.0-alpha.925:

  • πŸ”’ Locks without a keypad can skip PIN codes: the new Lock has no keypad switch in a lock's entity mapping exposes it without PIN codes, so controllers offer no access code setup. Other locks keep their PIN support (#418)

v2.1.0-alpha.924:

  • πŸ“· High resolution camera streams get through: a 1440p keyframe overflowed the bridge's UDP receive buffer, so the controller never got a whole picture. The bridge now asks for 4 MB, which HAOS allows (#373)

v2.1.0-alpha.923:

  • πŸ“· Camera errors from Home Assistant are readable: when HA refuses a live view request the log shows its error instead of [object Object], and camera ids HA can't accept (like camera.rtsp-lq) are skipped at startup with a warning (#373)

v2.1.0-alpha.922:

  • πŸ“· Camera live view can work with SmartThings: four bugs stopped it every time, SmartThings' stream setup was rejected, every offer failed, the bridge offered VP8 instead of H.264 and answered too late. Tested end to end with a simulated SmartThings controller, a test on real hardware is still missing (#373)

v2.1.0-alpha.921:

  • πŸ—ΊοΈ Vacuum custom areas can carry a map and a floor: custom service areas of a vacuum can carry a map name and a floor number, areas sharing a map name show up as one Matter map, and the same room name can sit on two maps (#506)

v2.1.0-alpha.920:

  • βš™οΈ Device list changes are one log line: the log now has one line 'Device list changed: N removed, M added, K mounted' whenever a bridge changes its set of devices, with the added ones named and the bridge id in the logger name, so a log or diagnostic export shows whether the bridge itself changed what a controller sees (#505)
  • βš™οΈ Session cleanup no longer quotes a false 60s gap: the session cleanup lines no longer say 'no subscriptions for 60s', because that number was the check interval and not the time without subscriptions (#505)

v2.1.0-alpha.919:

  • βš™οΈ Failed label queries keep the last labels: a failed Home Assistant label query no longer empties the label list, and before that a bridge filtering by label name could unmount its devices until the next refresh (#500)
  • πŸ“‘ False mDNS re-announcement log is gone: the log line "Triggered mDNS re-announcement after session cleanup" is gone, nothing was sent at that point (#500, #485)

v2.1.0-alpha.918:

  • πŸ“‘ Clearer mDNS global IPv6 warning: the startup log now says you can ignore it when devices work, and names mdns_strip_global_ipv6 for the add-on and --mdns-strip-global-ipv6 for a container (#392)
⚠️ Testing Features (v4.1.0-testing) - Click to expand

[!CAUTION] Testing versions are highly unstable and intended for developers only!

πŸ—οΈ Vision 1: Callback-based Architecture

Old (Legacy)New (Vision 1)
Behaviors update themselvesEndpoint updates behaviors via setStateOf()
Behaviors call HA actions directlyBehaviors notify via notifyEndpoint()

New Callback-Behaviors: OnOff, LevelControl, Lock, Cover, Fan, ColorControl, VacuumRunMode, VacuumOperationalState

Updated Endpoints: Switch, Lock, Cover, Vacuum, Button, Valve, Scene, Humidifier, Light, Fan

πŸ“œ Previous Stable Versions - Click to expand

v2.0.40

Filter preview domain fix, select, input_select, siren now show as supported (#298)

v2.0.39

Node 22 WebSocket crash loop fix (#297, #299), service init error surfacing, registry retry hardening, support link added

v2.0.37

Aqara productNameFromNodeLabel flag, Matter.js 0.16.11, Swedish locale update

v2.0.35

HA 2026.3 Clean Area Support, Valetudo Identifier Mapping, Plugin System Hardening, Registry Fingerprint Fix, Roomba Battery Fix, Contact Sensor Fix, Script Momentary Fix, Docusaurus Docs

v2.0.34

Automatic Backup, Vacuum Battery Auto-Map, Deprecated Feature Flags Fix

v2.0.33

Endpoint Number Preservation, Binary Sensor Battery Auto-Map

v2.0.32

Multi-Language Support, Plugin System, New Device Types (PIR, Rain, Electrical, AQ Sensors), Cluster Diagnostics, Dashboard Enhancements, Mapping Profile Export/Import, Fan & Air Purifier Fixes, Stale Session Cleanup, KNX Cover Fix

v2.0.31

Controller Profiles & Area Setup, Fan Speed/Preset Fix, Optimistic State Fix, Cover Target Fix, Humidity Auto-Mapping Default

v2.0.30

Mapped Entity Propagation Fix, API Error Surfacing

v2.0.29

Light currentLevel Fix, Bridge Config Save Fix, Fan Device Feature Fix, Humidity Auto-Mapping Fix

v2.0.28

Device Image Support, Custom Fan Speed Mapping, TV Source Selection, Reverse Proxy Base Path, On/Off-Only Fans, Light Brightness Fix, Fan Speed Fixes, Composed Air Purifier Fix, Dreame Multi-Floor Fix, Optimistic State Updates, Frontend Improvements

v2.0.27

Valetudo support, Custom Service Areas, ServiceArea Maps, Vacuum Identify/Locate/Charging, Alarm Control Panel, Composed Air Purifier, Dashboard Controls, Vendor Brand Icons, Thermostat fixes, Air Purifier oscillation/wind

v2.0.26

Authentication UI, Select entity support, Webhook event bridge, Cluster diagnostics, Matter.js 0.16.10, Docker Node 22, vacuum cleaning mode fallback, vacuum entity filter fix

v2.0.25

Vacuum mop intensity, vacuum auto-detection, Roborock room auto-detect, live entity mapping, dynamic heap sizing, multi-fabric commissioning, fan speed label fix

v2.0.24

Dashboard landing page, composed devices, bridge wizard feature flags, entity autocomplete, light transitions, live diagnostics, vacuum suction level, thermostat auto-resume, vacuum docked state, memory leak fix

v2.0.19-v2.0.23

Bridge templates, live filter preview, entity diagnostics, multi-bridge bulk operations, entity health indicators, diagnostic export, EntityLabel/DeviceLabel filters, Power & Energy Measurement, Event domain (GenericSwitch)

v2.0.17 / v2.0.18

Room Label (FixedLabel), thermostat overhaul, lock unlatch/unbolt, binary sensor fix, auto pressure mapping, vacuum fixes, dead session recovery, network map, mobile UI, Labels & Areas page, crash resilience, memory limit

v2.0.16

Force Sync, Lock PIN, Cover/Blinds improvements, Roborock Rooms, Auto Entity Grouping, Water Heater, Vacuum Server Mode, OOM fix

v1.10.4

Climate/Thermostat fixes, Cover position fix, Vacuum battery, Humidifier improvements, Entity Mapping, Alexa brightness preserve

v1.9.0

Custom bridge icons, Basic Video Player (TV), Alexa deduplication, Auto-only thermostat, Health Check API, WebSocket, Full backup/restore

v1.8.x

Graceful crash handler, PM2.5/PM10 sensors, Water Valve, Smoke/CO Detector, Pressure/Flow sensors, Air Purifier, Pump device

v1.7.x

Dark Mode toggle, Device list sorting

v1.5.x

Matter Bridge, Multi-Fabric support, Health Monitoring, Bridge Wizard, AirQuality sensors, Fan control, Media playback


Supported Device Types

Home Assistant DomainMatter Device TypeNotes and Feature Flags
lightExtended Color (color or color temperature), Dimmable, On/OffpowerEntity, energyEntity set by hand, lights don't get them auto-mapped (#374). Can be set to On/Off Plug-in Unit so Apple Home shows its wattage (#484)
switchOn/Off Plug-in UnitPower and energy sensors of the same device are mapped automatically. Overrides: Dishwasher, Laundry Washer, Laundry Dryer, EV Charger, Pump, Water Valve, On/Off Switch, Mounted On/Off Control
input_booleanOn/Off Plug-in Unit
lockDoor LockPIN credentials, unbolt when the lock can open
coverWindow CoveringcoverSwapOpenClose, coverExposeAsDimmableLight (#372)
climateRoom Air Conditioner (with fan modes), otherwise ThermostatdisableClimateFanControl, disableClimateOnOff, climateExposeFan (#309), battery via batteryEntity
fanFan, On/Off Plug-in Unit without speed controlOscillation, wind modes. Air Purifier override with filterLifeEntity
humidifierFan, the fan speed sets the target humidityMatter has no humidifier type
binary_sensorContact, Occupancy, Smoke/CO Alarm, On/Off SensorLeak and freeze default to Contact Sensor (Alexa-safe); the Matter 1.4 Water Leak, Water Freeze and Rain detectors are overrides (#365)
sensorTemperature, Humidity, Pressure, Flow, Light, Air Quality (COβ‚‚, CO, PM1, PM2.5, PM10, TVOC, NOβ‚‚, ozone, radon), Electrical Meter (power, energy, voltage, current), BatterybatteryEntity, humidityEntity, pressureEntity. Overrides: Solar Power, Electrical Utility Meter, EV Charger, Battery Storage with power and energy
eventGeneric SwitchDoorbell override (experimental)
button, input_buttonOn/Off Plug-in Unit, pressed when turned on
automation, script, sceneOn/Off Plug-in Unit, triggers when turned onOn/Off Switch override, needs a one-time re-pair (#380)
select, input_selectMode SelectselectExposeAsSwitch for a select with on and off options
alarm_control_panelMode SelectOn/Off Plug-in Unit override to arm and disarm
media_playerSpeaker, Basic Video Player for TVs
valveWater Valve
vacuumRobot Vacuum CleanerserverMode, roomEntities, customServiceAreas, vacuumRoomSwitches, vacuumOnOff, batteryEntity, cleaningModeEntity, suctionLevelEntity, mopIntensityEntity, chargingStateEntity (#377)
lawn_mowerRobot Vacuum Cleaner, Matter has no mower type yetSame flags as the vacuum (#301)
water_heaterThermostat (heating)Override: Matter 1.4 Water Heater (0x050F) with Boost
siren, remoteOn/Off Plug-in Unit
weatherTemperature Sensor with humidity and pressure

Which controller shows which type is in the Controller Compatibility matrix (Apple Home, Google Home, Alexa, Aqara Home, SmartThings).

πŸ“– See Supported Device Types Documentation for details

Common per-entity flags: updateThrottleMs rate-limits how often an entity pushes updates to controllers (#351), coverExposeAsDimmableLight exposes a cover as a dimmable light for Alexa routines (#372), chargingStateEntity maps a charging-state sensor (#377), climateExposeFan exposes a climate AC's fan as its own endpoint (#309).

Entity Filters

Filter rules match on these matcher types: pattern, regex, domain, platform, entity_label, device_label, entity_label_regex, device_label_regex, any_field_regex, area, entity_category, device_name, product_name, device_class. The new manufacturer matcher matches the device manufacturer (or default_manufacturer) and supports * wildcards (#382).

Reliability & Health

Configurable auto-recovery with failure timestamps in Settings, controller-compatibility warnings on each bridge page, per-entity device-health diagnostics on the health dashboard, and a warning when a bridge exposes device types its controller does not support.

Experimental: Camera Plugin

A built-in plugin exposes Home Assistant cameras as Matter Cameras (0x0142). Experimental and SmartThings-only as of 2026. Live view could not work until the #373 fix; a loopback test that does what SmartThings' camera driver does now streams end to end, a test on real SmartThings hardware is still missing.


πŸ€– Robot Vacuum Server Mode

⚠️ Important: Apple Home & Alexa require Server Mode for Robot Vacuums (click to expand)

The Problem

Apple Home and Alexa do not properly support bridged robot vacuums. When your vacuum is exposed through a standard Matter bridge, you may experience:

  • Apple Home: "Updating" status, Siri commands don't work, room selection fails
  • Alexa: Vacuum is not discovered at all

This is because these platforms expect robot vacuums to be standalone Matter devices, not bridged devices.

The Solution: Server Mode

Server Mode exposes a device as a standalone (non-bridged) Matter endpoint without the bridge wrapper. It works for any device type, not just vacuums, and a bridge can host standalone devices. For a robot vacuum this makes it fully compatible with Apple Home and Alexa.

Setup Instructions

  1. Create a new bridge in the Matter Hub web interface
  2. Enable "Server Mode" checkbox in the bridge creation wizard
  3. Add only your vacuum to this bridge
  4. Pair the new Server Mode bridge with Apple Home or Alexa
  5. Your other devices stay on your regular bridge(s)

Important Notes

  • A Server Mode node exposes each device as a standalone endpoint, up to 10 per node; extra entities are skipped
  • For best results give a robot vacuum its own dedicated Server Mode bridge
  • Other device types (lights, switches, sensors) also work on regular bridges
  • After switching to Server Mode, Siri commands like "Hey Siri, start the vacuum" will work

Documentation

For more details, see the Robot Vacuum Documentation.


Installation

Open your Home Assistant instance and show the dashboard of an app.

Manual steps (testing versions, etc.)

Add this repository to your Add-on Store:

https://github.com/RiDDiX/home-assistant-addons

Three add-ons are available:

  • Home-Assistant-Matter-Hub (hamh) - Stable release
  • Home-Assistant-Matter-Hub (Alpha) (hamh-alpha) - Pre-release, gets every fix first
  • Home-Assistant-Matter-Hub (Testing) (hamh-testing) - Experimental, may break

Docker

docker run -d \
  --name home-assistant-matter-hub \
  --network host \
  -v /path/to/data:/data \
  -e HAMH_HOME_ASSISTANT_URL=http://192.168.178.123:8123 \
  -e HAMH_HOME_ASSISTANT_ACCESS_TOKEN=your_long_lived_access_token \
  ghcr.io/riddix/home-assistant-matter-hub:latest

Note: All environment variables require the HAMH_ prefix. See the Installation Guide for all available options.

For alpha versions, use tag alpha instead of latest.


Documentation

Please see the documentation for detailed installation instructions, configuration options, known issues, limitations and guides.


πŸ”§ Network Troubleshooting

⚠️ "No Response" / Connection Drops, Common Network Causes (click to expand)

The Problem

Your Matter devices suddenly show "No Response" (Apple Home), "Unavailable" (Google Home), or become unresponsive after some time, even though the bridge is still running and other controllers (e.g., Alexa) continue to work fine.

Root Cause: Network Equipment Blocking mDNS/Multicast

Matter relies heavily on mDNS (multicast DNS) for device discovery and reachability. Many routers, access points, and managed switches have features that filter, throttle, or block multicast traffic, which breaks Matter communication silently.

πŸ’‘ This was confirmed and documented thanks to the excellent systematic testing by @omerfaruk-aran in #129. The issue was traced to a TP-Link Archer AX50 (in AP mode) sitting between the Apple TV and the network, its default settings were blocking/limiting mDNS/Bonjour traffic over time.

What to Check on Your Network Equipment

  1. IGMP Snooping, Disable or configure it to allow mDNS (224.0.0.251 / ff02::fb)
  2. Multicast Optimization / Multicast Enhancement, Disable (often called "Airtime Fairness" or "Multicast to Unicast")
  3. AP Isolation / Client Isolation, Must be disabled so devices on the same network can communicate
  4. mDNS / Bonjour Forwarding, Enable if available (some enterprise APs have this)
  5. DHCP Server on secondary devices, Disable DHCP on access points / switches that are NOT your main router (multiple DHCP servers cause IP conflicts)
  6. Firmware Updates, Update your router/AP firmware, as multicast handling is frequently improved

Affected Equipment (Known Cases)

DeviceIssueFix
TP-Link Archer AX50 (AP mode)mDNS traffic blocked/limited over timeFirmware update + disable DHCP on the AP
Ubiquiti UniFi APsIGMP Snooping can filter mDNSDisable IGMP Snooping or enable mDNS Reflector
Managed Switches (various)Multicast filtering enabled by defaultAllow mDNS multicast groups

Quick Diagnostic Steps

  1. Does Alexa still work when Apple Home shows "No Response"?

    • Yes β†’ Bridge is online, the issue is network path / mDNS related
    • No β†’ Bridge may actually be down, check HAMH logs
  2. Does removing a Home Hub (HomePod/Apple TV) fix it?

    • Yes β†’ The hub's network path is affected (AP/switch between hub and bridge)
    • No β†’ May be a different issue
  3. Try binding mDNS to a specific interface:

    --mdns-network-interface eth0
    

    (or end0, enp0s18, etc., check your system)

Network Topology Tips

  • Keep the path simple: Avoid placing access points or managed switches between your Matter bridge (Home Assistant) and your Home Hub (HomePod/Apple TV)
  • Use wired connections where possible for Home Hubs and the Home Assistant host
  • Same subnet: All Matter devices, controllers, and the bridge must be on the same Layer 2 network / subnet
  • IPv6: Matter requires IPv6, do not disable it. For VLAN setups, configure ULA addresses (fd00::/8), not just link-local (fe80::). See Troubleshooting and Discussion #39

Migration from t0bst4r

Migrating from the original t0bst4r/home-assistant-matter-hub is easy. Your Matter fabric connections and paired devices will be preserved!

Home Assistant Add-on

  1. Backup your data:

    cp -r /addon_configs/*_hamh /config/hamh-backup
    # Verify the backup was copied correctly
    ls /config/hamh-backup
    
  2. Uninstall the old add-on (Settings β†’ Add-ons β†’ Uninstall) and make sure the old folder is removed:

    rm -rf /addon_configs/*_hamh
    
  3. Add the new repository:

    https://github.com/RiDDiX/home-assistant-addons
    
  4. Install and start the new add-on once (creates the data folder), then stop it

  5. Clear the new folder and restore your backup:

    rm -rf /addon_configs/*_hamh/*
    cp -r /config/hamh-backup/* /addon_configs/*_hamh/
    
  6. Start the add-on again - your devices should reconnect automatically

Docker / Docker Compose

Simply change the image from:

ghcr.io/t0bst4r/home-assistant-matter-hub:latest

to:

ghcr.io/riddix/home-assistant-matter-hub:latest

Your volume mounts stay the same - no data migration needed.

For detailed instructions, see the full Migration Guide.


πŸ™ Contributors & Acknowledgments

This project thrives thanks to the amazing community! Special thanks to everyone who contributes by reporting bugs, suggesting features, and helping others.

Note: GitHub doesn't surface contributors on this repo because it's still a fork of the original. The list below is maintained by hand.

πŸ† Top Contributors

Newest first.

ContributorContributions
@iblur01🌐 Translator - French translation completed (#504)
@toineenzo🌐 Translator - Dutch translation (#503)
@qbattersbyπŸ€– Code Contributor - LevelControl transitionTime patch for matter.js 0.17, so Google Home can dim already-on lights (#383)
@Yllelder🌐 Translator - Spanish translation (#314)
@MStankiewiczOfficial🌐 Translator - Polish translation (#288, #329)
@aetasoulπŸ€– Code Contributor - Immediate force sync on startup to beat stale Alexa queues (#282)
@omerfaruk-aran🌐 Turkish translation (#260) + πŸ”§ Network debugging for "No Response" issues (#129)
@gustavakerstromπŸ€– Code Contributor - Custom fan speed mapping (#226), template description fix (#215)
@AmineDjeghriπŸ“ Migration instructions for the addon data folder (#171)
@markgazeπŸ€– Code Contributor - Ecovacs Deebot room support (#118)
@codyc1515πŸ₯‡ Top Reporter - Climate/thermostat bugs (#52, #24, #21, #20), README badge & install steps (#285), binary sensor classes (#66), fan control init (#10)
@AymericLeFeyerπŸ“ README YouTube video link
@depahkπŸ“ Migration docs (#32)
@Hatton920πŸ€– Vacuum Expert - Intensive testing of Robot Vacuum Server Mode, Apple Home & Siri validation
@razziethemanπŸ₯ˆ Active Tester - Bridge icons (#101), sorting (#80), feature requests (#31, #30), extensive UI/UX feedback
@SH1FT-WπŸ’Ž Sponsor + Vacuum room selection feature request (#49)
@ChrulfπŸ” Google Home brightness debugging (#41), detailed logs & testing
@FettkeewlπŸ› Script import bug (#26), Alias feature request (#25)
πŸ“‹ Issue Tracker - All Contributors (click to expand)

Thank you to everyone who helps improve this project by reporting issues!

πŸ’– Sponsors

Donations are completely voluntary! This project exists because of passion for open source, not money. Thank you to everyone who has supported it, it truly means a lot! ❀️

πŸ₯‡ First Sponsor: @thorsten-gehrig

πŸ’Ž @SH1FT-WπŸ’Ž @ilGaspaπŸ’Ž @linux4life798
πŸ’Ž @torandrerolandπŸ’Ž @ralondoπŸ’Ž @bexxter85-ux
πŸ’Ž @dinarioxπŸ’Ž @JRCondatπŸ’Ž @d3rby91
πŸ’Ž @nicoodeimosπŸ’Ž @ustari28πŸ’Ž Markus MΓΌller (@Dingosworld)
πŸ’Ž StefanSπŸ’Ž Manny B.πŸ’Ž Bonjon
πŸ’Ž TobiRπŸ’Ž Franz HuberπŸ’Ž Michele Larese de Prata
πŸ’Ž @CNCBπŸ’Ž @pelican1997πŸ’Ž @PeJanNL
πŸ’Ž @bra1nbusterπŸ’Ž @knuti1960πŸ’Ž @ppttu

πŸ™ ...and anonymous supporters who prefer not to be named.

🌟 Original Author

  • @t0bst4r - Creator of the original Home-Assistant-Matter-Hub project

β˜• Support the Project

[!NOTE] Completely optional! This project will continue regardless of donations. I maintain this in my free time because I believe in open source.

If you find this project useful, consider supporting its development:

GitHub Sponsors Ko-fi PayPal

Your support helps cover hosting costs and motivates continued development. Thank you! ❀️


πŸ“Š Project Stats

GitHub commit activity GitHub last commit GitHub issues GitHub closed issues GitHub pull requests


RiDDiX/home-assistant-matter-hub

Publish your Home-Assistant Instance using Matter.

TypeScript

1,282

2,272 commits

updated Oct 11, 2026

See the code

README

Home-Assistant-Matter-Hub

"Home-Assistant-Matter-Hub"

Expose your Home Assistant devices to Matter controllers like Apple Home, Google Home, Alexa, SmartThings and Aqara Home

GitHub Release GitHub Pre-Release GitHub Issues GitHub Stars License

πŸ“– Documentation β€’ οΏ½ Discord β€’ οΏ½πŸ› Report Bug β€’ πŸ’‘ Request Feature


[!NOTE] πŸ”€ Community Fork - This is the actively maintained fork and successor of the original t0bst4r/home-assistant-matter-hub, which was discontinued in January 2026 and has since been archived. We continue active development with bug fixes, new features, and community support. Thank you @t0bst4r for the original work! ❀️

πŸ“¦ Migrating? See Migration Guide - your paired devices will continue to work! For a side-by-side feature list, see the fork comparison. The add-on slugs are hamh (stable), hamh-alpha and hamh-testing.


πŸ“ About

This project simulates bridges to publish your entities from Home Assistant to any Matter-compatible controller like Alexa, Apple Home, Google Home, SmartThings or Aqara Home. Using Matter, those can be connected easily using local communication without the need of port forwarding etc.


πŸ“¦ Releases & Branches

ChannelBranchCurrent VersionDescription
Stablemainv2.0.58Production-ready, recommended for most users
Alphaalphav2.1.0-alpha.933Ahead of Stable, carries the additions listed under Alpha Features
Testingtestingv4.1.0-testing.x⚠️ Highly unstable! Experimental features, may break

Which version should I use?

  • Most users: Use Stable (main branch) - thoroughly tested
  • Early adopters: Use Alpha (alpha branch) - gets every fix and feature first, see Alpha Features below
  • Developers/Testers: Use Testing (testing branch) - bleeding edge, expect breakage

Upgrading from 2.0.46

A few entities re-pair once on the first start after the update and lose their room assignment in the controller:

  • leak and freeze binary_sensors (now Contact Sensors by default) and any entity using the On/Off Switch override
  • a light may drop its auto power/energy readout, re-add it by mapping the sensor by hand

Re-assign the affected devices to their rooms after they reconnect. See the docs for detail.


πŸŽ‰ What's New

πŸ“¦ Stable Features (v2.0.58) - Click to expand

New in v2.0.58:

  • πŸ—‚οΈ Old backups get deleted again: the automatic backup only runs while HAMH shuts down, and the add-on gets a few seconds to stop, so the backup could be cut off before it reached the cleanup. Every restart left one more half-written backup in the list. Old backups are now also cleaned up at startup, and a backup keeps a temporary name until it is complete, so a cut-off one never shows up (#483)
  • πŸ›‘οΈ Backup settings are checked: the settings endpoint only takes a keep count from 1 to 100, and a failed write (a full disk, for example) fails that backup instead of crashing the app. The Turkish, Portuguese (Brazil) and Traditional Chinese texts no longer promise a scheduled backup
  • πŸ“– Docs: the Alexa "never connects" entry drops the fresh bridge advice, a new bridge did not help in #478, and says how to tell from the log whether the Echo reached the bridge
  • πŸ”Œ Port 80 in the network check: freeing it helped two users pair Alexa, so the Health Dashboard shows when it's in use (#449, #478)
  • πŸ’‘ Wattage for lights in Apple Home: a light can be set to On/Off Plug-in Unit, Apple only shows wattage on outlets (#484)
  • πŸ“– Docs: Apple Home power readings since iOS 27, and the port 80 note for Alexa
  • πŸ”Œ Each outlet of a power strip reports its own power (#488, thanks @barnabasbusa)
  • πŸ” A bridge that went quiet comes back on its own: a subscription that died while starting left every device offline until a restart (#487)
  • 🧽 Dishwashers understand Home Connect and SmartThings states (#486)
  • 🧹 Vacuum rooms reset when a clean finishes on its own: the next clean started from Home Assistant could only match the old rooms (#490)
  • πŸ’‘ No flash when Alexa dims a light that is off: it now turns on straight at the new level instead of its old brightness first (#491)
  • 🧽 Dishwashers on a power switch show their real state: the Home Connect or SmartThings state sensor is picked up automatically (#486)
  • 🧺 Washers and dryers on a power switch show their real state: Laundry Washer and Laundry Dryer types pick up the state from Home Connect, SmartThings, Miele or LG
  • βœ… Vacuums and appliances report a finished clean or cycle
  • 🏠 Every paired controller shows on the bridge card: it only showed Google and Alexa, and 4448 now shows as Sengled
  • πŸ“– Controller support: SmartThings added, Apple no longer warns about fans, air purifiers and air quality, and Google no longer warns about smoke alarms and dishwashers
  • πŸŒ€ Fans and air purifiers follow Home Assistant again: speed and mode changes from HA stopped reaching controllers in alpha.880 and 2.0.57, only on/off still followed (#494, thanks @bigmike613)
  • 🧹 Apple Home drops the old rooms during a clean started elsewhere: after a three room Apple job, a one room clean from Home Assistant still showed "cleaning 3 rooms" (#492)
  • 🧹 Apple Home stays on Vacuuming after a start: while the vacuum was still leaving the dock, Home flipped to "Ready, Resume Cleaning Later" for a few seconds (#496)
  • πŸͺŸ Dashboard cover chip shows how far it is open: a closed cover showed "100% open", controllers were never affected (#495)
  • πŸ—ΊοΈ Vacuum rooms stay in the run mode list: Valetudo and auto-detected Roborock rooms fell out after the first Home Assistant update, CLEAN_AREA rooms right at startup, so controllers such as Alexa saw only Idle and Cleaning (#497)
  • πŸ”‹ Battery sensors stop showing up as their own device: a battery that was unavailable during a refresh got its own device next to the temperature sensor and stayed, and a temperature sensor built in that moment never picked its battery up (#498)
  • 🧹 Vacuum current room and room names in Apple Home: the current room follows the robot through rooms outside the job, and a room renamed in Home Assistant reaches the room list without re-pairing (#501)
  • ↩️ Failed Home Assistant calls no longer leave a stale state: when a call fails after the command was accepted, the device goes back to its Home Assistant state within a second instead of staying "opening" or "on" (#446)
  • πŸ‡³πŸ‡± Dutch translation: new nl locale, thanks @toineenzo (#503)
  • πŸ‡«πŸ‡· French translation completed: about 316 strings that fell back to English are translated now, thanks @iblur01 (#504)
  • ☁️ VeSync plugin: Levoit, Cosori and Etekcity devices from your VeSync account mount when you switch them on, with no bridge restart. Cloud only, these devices have no local control. An air fryer cannot be started from a controller.
  • βš™οΈ Saving a disabled built-in no longer wipes its settings: a built-in plugin that has been disabled since the last restart keeps its stored settings when you save.

Previously in v2.0.57:

  • 🧹 Air purifiers stop rebuilding themselves: a composed device never listed its battery entity, so the battery auto-map retry rebuilt the endpoint on every sensor update, burning CPU and raising unhandled rejections. A sensor without a device class now needs "batt" in its id to count as the battery, so a filter life or tank level percentage is no longer taken for one (#461)
  • πŸͺŸ Covers keep their position while a controller is talking to them: endpoint state writes are serialized per device, and an update that arrives while the endpoint is busy waits for it instead of being dropped with a warning (#464)
  • πŸ”’ Lock PIN handling reworked: a PIN added or cleared through a controller takes effect immediately instead of on the next state change, empty and overlong PINs are rejected, Add, Modify and the creating fabric are enforced as the Matter rules require, a code the physical lock rejected is no longer reported as programmed, and hashing moved off the event loop so a PIN protected unlock stops freezing every bridge
  • 🧠 Heap limit is configurable: the add-on takes a heap_size_mb option, the automatic sizing moved from a quarter to half of the available memory, and a NODE_OPTIONS you set yourself is honored instead of being silently overridden (#459)
  • 🧩 Third-party plugins load again: an installed plugin package is imported through its manifest entry point instead of its directory, plugin devices report their own name to controllers, and adding or removing one tells commissioned controllers that the bridge composition changed; contributed by Patrick Gu (#458)
  • 🚨 Security plugin can mirror an existing alarm panel: the new sourceAlarmPanel setting turns the four mode switches and the Alarm contact into a Matter view of an alarm_control_panel.* entity (Alarmo etc.), with arm and disarm flowing back to Home Assistant; contributed by Patrick Gu (#457). Panels that require an alarm code reject the bridge's arm/disarm calls, the switches then fall back to the panel's real state
  • 🏷️ A device renamed in Home Assistant reaches the controller: the registry snapshot is pushed to the endpoints on every registry refresh, a rename counts as a registry change now so that refresh runs at all, and server mode pushes the renamed identity to its root node. Apple Home takes the accessory name when the device is added and keeps its own copy, so a rename shows up there only for accessories you add after it (#467)
  • πŸ” Editing the entity filter takes effect right away: a removed entity rode the five minute outage protection meant for Home Assistant restarts. It is removed on the spot now, its endpoint number stays reserved so re-adding restores the device with its groups, and a filtered-out vacuum takes its room switches along and brings them back on their old numbers (#468)
  • 🍳 An oven exposed as a climate entity mounts in a Fahrenheit install: registration multiplied the raw Fahrenheit number by 100 before the unit conversion had a chance to run, so a template climate with max_temp: 500 failed with "Value 50000 is above the int16 maximum". Registration values are clamped into the Matter range now and the thermostat converts them on its first update (#470)
  • πŸ’‘ Siri "set to 100%" works next to Alexa: alexaPreserveBrightnessOnTurnOn now only suppresses the brightness reset for commands arriving over the Alexa fabric, before it swallowed the same command from Apple Home (#460)
  • πŸͺŸ Covers keep the same Matter fingerprint for life: a cover that had been moved used to come back from a restart advertising an extra attribute it never had when the controller paired it (#456)
  • 🧩 New composedPrimaryOnParent bridge option, off by default: puts the primary entity of a self-grouped composed device on the parent endpoint, so Apple Home reads the accessory as a light instead of taking an icon from one of the grouped entities. Needs autoComposedDevices on as well. It changes the endpoint layout, so the device has to be removed and added again in the controller, and Apple Home has been seen to stop listing the grouped entities afterwards, so try it on one bridge first (#469)
  • πŸ“‘ New omitEventsInPriming bridge option, off by default: for Google fabrics that acknowledge every chunk of the initial subscription report but never answer the final one, leaving the device permanently offline. With it on, the initial report carries attributes only, live events afterwards are unaffected (#424)
  • ❄️ Per-entity climateForceTurnOn: sends climate.turn_on on every Matter On command, for IR controlled ACs where Home Assistant can report on while the device is off (#462)
  • πŸ” A controller that refuses the bridge certificates says so in the log: pairing that stops right after the attestation step left only a bare "Failed" on the controller and nothing in the HAMH log. Controllers that only pair with CSA certified products, like the Ambiscape feature on Philips Ambilight TVs, cannot be used at all (#465)
  • 🌑️ The HAMH device cards follow Home Assistant's temperature unit: a Fahrenheit install saw Celsius chips on every thermostat and temperature sensor, because the card printed the raw Matter value (Matter always carries 0.01 Β°C) with a hardcoded unit. The chips now read the unit out of the endpoint itself: thermostats and water heaters from their UI configuration cluster, sensors and weather from the entity's own unit_of_measurement. What the controllers show never changed, Apple Home and Alexa convert on their side (#472)
  • πŸ”” A controller that stops answering is logged as a warning: the three "Error sending subscription update message" lines that precede a dropped subscription were logged at INFO, so a dying controller link was invisible to anyone filtering for warnings. The first two retries stay at INFO, the third one and the "Giving up on subscription" line are warnings now (#471)
  • 🌑️ A temperature sensor outside the usual range keeps updating: the sensor endpoint declared a -40 to 125 Β°C measurement window while writing anything int16 could hold, so an oven probe, a grill thermometer or a deep freezer was rejected by matter.js and the endpoint kept its last in-range reading forever. The declared window now covers everything the bridge can send
  • πŸ”Œ A docked vacuum stops claiming it is charging: with no charging signal of its own the bridge assumed a docked robot below 100% was charging, so Apple Home showed "Charging" for a robot that had long finished. If the vacuum's device has a charging sensor in Home Assistant (a battery_charging binary sensor, or a ..._charging_state sensor as Xiaomi exposes), it is mapped automatically now and drives both the battery charge state and the status line. Devices without one keep the old assumption, and a charging sensor picked up this way still stays available as its own device (#450)
  • πŸ”Œ EV charger mode works from SmartThings: SmartThings addresses EnergyEvseMode modes by list position, so the single Manual mode numbered 1 never showed and every mode change was refused. It is mode 0 now; a node that stored the old number still mounts. UserMaximumChargeCurrent is optional and read by no known controller, ModeSelect is not part of the EVSE device type, neither was added (#475)
  • 🧩 Auto Composed Devices says what it does: the description claimed a master toggle merging power and energy; those never depended on it. It changes the shape of a temperature sensor with humidity/pressure sensors (one device with a sub-device per reading), forces battery, humidity and pressure auto-mapping on and unlocks Composed Sub-Entities. Stored key unchanged (#474)
  • πŸ”‹ Battery percentage goes out with the write: the percentage is a quieter Matter attribute, and matter.js reported its change ten seconds after the write, on its own. The charge state went with the write, the percentage late or, on Apple Home, never. Both go together now (#450)
  • πŸ”‹ A short outage no longer blanks the battery: a device marked unavailable for a moment (a missed Roborock poll, an HA restart) got a null percentage and a flipped charge state, then the old values back 15 s later. The bridge keeps what the controller has; only a battery never seen stays null (#450)
  • πŸ§ͺ Loopback subscription test: a matter.js commissioner pairs with the vacuum node over loopback, subscribes, and checks that battery percentage and charge state arrive with the write. Off by default, HAMH_LOOPBACK=1 runs it. This settled the Apple Home battery question: the bridge sends the value, Apple's framework treats BatPercentRemaining as changes-omitted and keeps only the value from pairing or from a read (#450)
  • πŸ”Ž Diagnostic export shows the connection attempts: the export now keeps the PASE and CASE session setup lines and the failsafe expiry, lists every open session with its subscriptions, the host's network interfaces and mDNS settings (addresses replaced by their kind when anonymized), and the log levels it was taken at. A controller that never connects, or connects and never subscribes, is readable from the file instead of a debug log (#477, #478)
  • 🧹 Factory reset goes through the stop path: the reset restarted the bridge without stopping it first, so the built-in plugins stayed registered and every reset logged "Plugin camera is already registered" (#477, #478)
  • πŸ’‘ Cool white lights load again after a restart: a light that ran above 6800 K kept its color temperature in storage, and on the next start the bridge's default range no longer covered it, so matter.js refused the endpoint and the light was missing until the value changed. The range now widens around the stored value first (#477).
  • πŸ” The devices API keeps the camera's Home Assistant token to itself: the WebRTC bridge lives in the camera endpoint's state, and the devices JSON behind the endpoint inspector printed its haUrl and haToken. The credentials are a private field now, and any key named token, secret or password is redacted in that output (#155, #373)
  • 🏷️ Prefer Entity Registry Name applies in server mode: only bridged devices read the flag, a standalone device kept the friendly name (#276)
  • 🚫 Water Leak Detector is marked unsupported on Alexa: the mapping dialog warns before you pick the type that took a whole Alexa bridge offline (#365)
  • 🧹 A rebuilt composed device drops its pending update: after a mapping change the old endpoint was closed with a 50 ms update still queued, which then failed on the closed endpoint (#461)
  • πŸ”‡ Deleting a bridge no longer logs a mutex warning: the shutdown guard looked for a message matter.js never sends
  • πŸ“– Docs: the vacuum "Updating" section describes the Wedge Watchdog and the 60 s report interval (#287), the Alexa section covers the 11-digit manual code, the Echo models that stop after the certification prompt and the Unique ID Suffix (#478, #449, #385), heap warnings name the add-on's heap_size_mb option (#459)
  • 🧭 The interface warning names your LAN interface: on a Docker host the Network Diagnostics card and the startup log listed every interface, Docker bridges included, and left the choice to you. A compose bridge on a 172.x address no longer counts as a candidate, the suggestion reads "eth0 (192.168.5.161)", and the text says the warning only matters when a controller shows devices offline (#482)
  • πŸ“– Docs: the Alexa "never connects" entry lists the checks that helped in #478 (firewall on UDP 5540, manual code, fresh bridge) instead of a theory

Previously in v2.0.56:

  • πŸ”‹ Vacuum battery after HA 2026.8: integrations that moved the battery to a separate sensor are picked up as the sensor appears, a missing percentage reports an unknown charge state instead of "charging forever", and terminal states like "not charging" stop counting as charging (#450)
  • πŸ’‘ RGB-only lights pass controller conformance again: the Extended Color Light always advertises the full mandatory feature set, which brings WLED and similar lights back to Alexa (#452)
  • 🌫️ PM2.5, PM10 and COβ‚‚ sensor overrides: map a single-pollutant sensor to an Air Quality Sensor endpoint carrying just that concentration cluster via the Entity Mapping UI (Aqara renders them, Alexa partially)
  • πŸ‡°πŸ‡· Korean translation by @hyeok-yoo (#455)
  • πŸ”€ Debounced commands no longer swallow an explicit on/off that arrives next to a level or color change (#453)
  • 🌑️ Thermostats write their absolute limits before the user limits, so a flat heat range can no longer trip the range check on bring-up (#454)
  • πŸͺŸ Cover end product type follows the feature map: a tilting curtain or shade reports the matching tilting product, a lift-only blind stops claiming InteriorBlind (follow-up to #304)
  • πŸ” Three Alexa pairing diagnostics, off by default: advertiseSpecVersion151, supportTermsAndConditions and enableMatterTcp, for Echos that stop right after the attestation step (#449)
  • 🧹 Session supervision and entity mapping sync now live in shared code instead of two near-identical copies per bridge flavour; no behavior change

Previously in v2.0.55:

  • πŸ”— Devices keep their Matter numbers when Home Assistant restarts, so controllers stop re-adding everything and losing groups and routines (#438)
  • πŸ”Œ One plugin device no longer stalls every state update on its bridge, and plugin devices stop vanishing a minute after a refresh (#445)
  • 🚫 A command that cannot reach Home Assistant now fails instead of reporting success, so a cover no longer shows a position it never reached (#446)
  • πŸ’‘ Identify presses the identify button of the device, on everything rather than vacuums alone (#447)
  • 🌑️ Climate power-on reaches the device even when the cached state lags (#441)
  • πŸŒ€ Fan speed zero picks the slowest mode the entity really has, and fan sliders can be debounced so bridged air conditioners stop beeping (#442, #443)
  • 🎚️ Number feature flags render as number inputs, so the cover and fan debounce settings are reachable in the UI at last
  • 🀝 A controller that is still being interviewed is no longer disconnected halfway, which could abort commissioning
  • πŸ“· Camera devices carry the bridged information every device under a bridge needs (#155)

Previously in v2.0.54 (hotfix release):

  • πŸ”Œ Plugin disable now sticks across restarts, for the security and camera plugins alike
  • πŸ‘» An unconfigured security plugin exposes no devices anymore; updating removes the ghost plugs
  • πŸ” Disabling a plugin removes its devices immediately, re-enabling keeps their identity

Previously in v2.0.53:

  • πŸ›‘οΈ Security plugin (experimental): the bridge becomes a small alarm system with Home/Away/Night/Vacation switches you arm from any controller or by voice, entry/exit delays, trigger and alert lists; for setups without an alarm integration
  • πŸ€– Vacuum room switches: opt-in per-room switches that controller routines can flip, an opt-in ascending room order for batch cleaning, and auto-resolved rooms survive state updates (#355, #368)
  • πŸ”Œ Plugin settings dialog: configure plugins right on the Plugins page; config survives restarts, stored secret fields are redacted from the plugin listing, and the page explains server mode instead of failing (#432)
  • πŸ”” Doorbell and electrical utility meter overrides: opt-in Matter 1.4 device types for event entities and consumption sensors; SmartThings renders them, defaults stay unchanged
  • 🚿 Water heater management: opt-in Matter 1.4 Water Heater with Boost/CancelBoost on top of the heating thermostat, for energy-management controllers (#437)
  • πŸŒ€ Fan modes follow the entity: controllers are only offered the speeds and modes the HA fan actually accepts, no more phantom Medium or Auto (#436)
  • 🌑️ heat_cool thermostats no longer crash-loop the add-on: the auto deadband is zeroed, single-mode setpoints ignore the parked range, and an endpoint that still fails is contained instead of exiting (#435)
  • πŸ”’ Lock stops re-adding itself: a stale flag written by v2.0.7-v2.0.16 failed lock init on every start, so the lock re-paired as a new device each boot; it is cleared on load (#433)
  • πŸ’‘ Google room-off no longer relights dimmable lights: the level Google sends after "turn off" is stored for the next turn-on instead of being applied (#434)
  • πŸͺŸ Cover stuck-moving paths closed: the remaining cases that kept a cover reported as moving are fixed, and resolved cover flags are logged (#429)
  • πŸ”Œ Plugin devices receive controller writes again: a wiring gap dropped attribute writes on the way to plugin devices
  • 🧡 matter.js 0.17.9
  • πŸ“Š Fork comparison page: the docs compare this fork with the archived t0bst4r upstream, feature by feature

Previously in v2.0.52 (hotfix release):

  • πŸ”Œ The plugins page no longer fails with a 500 when a server mode bridge exists (#430)

Previously in v2.0.51:

  • πŸ• Opt-in wedge watchdog: rotates a controller session that keeps acking but stops talking at the interaction layer, the automated "Play Sound" fix for stuck Apple devices (#287, #428)
  • 🧹 Clean up orphaned records: bridge menu action with a dry-run preview that removes identity and mapping leftovers of entities deleted from HA (7 day tombstone guards against false positives)
  • πŸš— EV charger support: new EVSE device-type override with charging switch and current limit mapping, EnableCharging/Disable from the controller; Aqara and Home Assistant render it, keep it off Alexa bridges
  • 🩺 Subscription scope on the health card: see whether each controller holds a whole-node wildcard or watches specific endpoints
  • πŸ“· Camera live view signaling completed: the WebRTC answer now reaches the controller over the requestor cluster, plus full media path logging, HA signaling timeouts, trickle ICE and ICE server support (still experimental until verified on real hardware)
  • πŸͺŸ Cover stop detection in every position space: the v2.0.50 cover fix now also works with the Alexa percentage flag and the per-cover swap toggle, and swapped covers report the right direction (#429)
  • πŸ€– Vacuum on/off crash fixed: state updates no longer throw on vacuums with the on/off toggle (#428)
  • 🌍 Brazilian Portuguese completed: 602 of 615 strings (#420)

Previously in v2.0.50:

  • πŸ†” Stable device identity (opt-in): endpoints keep their identity when an entity is renamed or re-registered, keyed on the HA registry unique id; enable the stableIdentity feature flag per bridge (#404, #407)
  • ⚑ Energy suite stage 1: consumption sensors expose an Electrical Meter that Google Home and SmartThings render, home batteries become a Battery Storage device with signed charge/discharge power and lifetime energy, and voltage/current/energy sensors group onto one endpoint via new mapping fields
  • πŸͺŸ Covers report their own movement: controllers get the moving-to-stopped edge even when the integration never reports opening/closing, clears the stuck "Opening" on Echo Show (#429), and discrete commands cancel a pending slider action (#411)
  • πŸ§™ Commissioning preflight in the wizard: port, mDNS and controller checks with fix-it buttons before the QR code, plus a label guard and an empty-filter block
  • πŸ”‹ Per-entity "Disable battery mapping" switch (#427)
  • 🧩 Auto-grouped sensors read sub-entities past the bridge filter (#426)
  • πŸ“‘ mDNS records refresh when interface addresses change, recovers Google Home after an IPv6 prefix change (#415), and mDNS IPv4 can be disabled (#417)
  • πŸ–₯ Server mode shares the dead-session timeout and session diagnostics (#428)
  • πŸ”’ Per-lock PIN length overrides and an opt-in passthrough that programs the physical lock usercode (#418)
  • πŸ”˜ Opt-in to suppress the momentary on/off flip for scripts (#423)
  • 🚨 Smoke alarms report battery, fault and expressed state (#408)
  • πŸ’‘ Light level and color-temperature step control (#412)
  • πŸ“· Camera bridges enable Matter-over-TCP for SmartThings live view, and camera endpoints set the mandatory AV stream attributes (#419)
  • πŸ”§ Valve and cover overrides route On/Off to their services (#65)
  • 🌍 Brazilian Portuguese added (#420)
  • 🧡 matter.js 0.17.9
  • ⬆️ Dependency vulnerabilities resolved (websocket-driver, react-router 8, fast-uri, js-yaml and friends)

Previously in v2.0.49:

  • πŸŒ€ Fan speed restore: speed is remembered across transactions and restarts, localized wind presets map through, Auto is gated on a real auto preset, and an opt-in restores speed on power-on (#387)
  • πŸ“‘ Session recovery hardening: subscription jitter dropped, superseded sessions of a reconnecting peer swept, stale sessions closed only after a real quiet period, plus opt-in fast recovery (#386, #400, #398, #287)
  • 🩺 Per-fabric controller health card on the bridge page
  • πŸ”’ Endpoint number kept on mapping change so Alexa no longer re-adds the device (#404), plus a unique-id suffix to shed stale controller records (#385)
  • πŸ”˜ select as an On/Off Switch (#356), plus an experimental mounted On/Off control type (#380)
  • πŸͺŸ Tilt for set_tilt_position-only covers (#405), and tilt-only cover-as-light uses the tilt channel (#350)
  • 🚨 Warns on a non-5540 Alexa bridge (#401) and on an OTBR Thread mDNS interface (#388)
  • πŸ“· Camera plugin config scoped per bridge (#373)
  • πŸ”Œ Clashing bridge port reassigned on load (#378)
  • 🧩 Composed sub-entities compose even outside the bridge filter (#408), and composed sensors list all device types (#214)
  • πŸ”’ Unbolt maps to lock.unlock not open (#397), level-to-brightness uses one scale (#402), button drops the Lighting feature (#182), and stale cooling/auto state is cleared (#384)
  • 🌍 Russian translations added (#409) and zh-TW completed

Previously in v2.0.48:

  • 🌑️ Cooling-only thermostats no longer drop and re-pair after a switch to cool; a leftover Heat setpoint limit was crashing init (#381)
  • πŸ“ The Settings update box now shows the full release notes instead of cutting them off

Previously in v2.0.47:

  • πŸ’§ Leak and freeze binary_sensors now default to a Matter 1.3 Contact Sensor so Alexa stays stable; the Matter 1.4 Water Leak, Water Freeze, and Rain detector types are selectable per entity through the device-type override (#365)
  • πŸ’‘ Lights no longer auto-attach power/energy clusters; map a light's power or energy sensor explicitly with powerEntity/energyEntity if you want the readout (#374)
  • πŸ”˜ The On/Off Switch device-type override now exposes a real On/Off Light instead of a no-op plug (#380)
  • πŸ” New manufacturer entity-filter matcher (#382)
  • πŸŒ€ Opt-in: turning the companion fan off now turns the AC off too (#309)
  • 🩺 Reliability & health: configurable auto-recovery with failure timestamps, controller-compatibility warnings on each bridge page, and per-entity device-health on the dashboard
  • πŸ–₯️ Standalone (non-vacuum) devices in server mode, plus lawn_mower entities exposed as a robotic mower
  • πŸͺŸ Cover exposed as a dimmable light for Alexa routines (#372), per-entity update throttle (#351), charging-state sensor mapping (#377)
  • πŸ“· Experimental built-in WebRTC camera plugin (SmartThings-only, media path not verified yet)
  • 🧡 matter.js 0.17.9

Previously in v2.0.46:

  • ❄️ Opt-in companion fan for climate ACs: a per-entity toggle exposes the AC's fan as its own Matter fan endpoint, the setting is persisted, and fan-speed presets are now ordered lowβ†’high (#309)
  • 🌦️ Weather domain support: weather.* entities are exposed as a composed Temperature + Humidity + Pressure sensor read from the entity's attributes (pressure converted to hPa, shown on Google Home)
  • πŸ€– Vacuum service-area editing: edit area data inline in Entity Mapping and dispatch room cleaning in batches, plus a batch-room-data fix (#291)
  • πŸ”’ Door Lock credential hardening: safer access-code handling and fabric-index casting on the lock cluster (#313)
  • ⚑ Skip unchanged endpoints on HA updates: only endpoints whose entity or a mapped sub-entity actually changed are refreshed, so CPU no longer scales with entity count Γ— event rate (#351)
  • πŸ”Œ Registry stays resilient when HA drops: an initial reload failure no longer puts the add-on in a restart loop on a flaky HA boot, and a mid-flight "Connection lost" retries once (#352)
  • πŸ” RVC sessions refreshed safely so vacuum reactors don't go stale (#287)
  • πŸͺŸ Tilt-only covers use the tilt channel for lift commands (#350)
  • πŸ”‹ Battery auto-mapping narrowed to avoid false matches, plus support for enum battery states (#359)
  • πŸ”˜ automation entities are momentary: turning one on triggers it and snaps back to off (#364)
  • πŸŒ€ Climate swing-mode handling fix
  • 🚨 Non-5540 Alexa bridge warning: a bridge on any other port now warns, since Alexa only pairs on port 5540
  • 🧡 matter.js 0.17.0: upgraded from 0.16.11; the local LG-TV NOC-serial patch is dropped because upstream now tolerates 21-octet operational cert serials (#305)
  • 🧰 Build/runtime fixes: bun:sqlite constants export stubbed so the esbuild bundle builds against matter.js 0.17.0, add-on heap flag preserved (#358)
  • ⬆️ Dependency vulnerabilities resolved
  • πŸ“ Docs: hvac_action requirement for the Auto running-state display (#309), Google Home ModeSelect label gap (#356), Alexa cover-routine limitation (#312), and the new weather domain

Previously in v2.0.45 (hotfix release):

  • ⌨️ Typed text now binds in the entity-id autocomplete, so a partial entity id isn't dropped when you pick a suggestion (#348)

Previously in v2.0.44:

  • πŸͺŸ Cover reliability overhaul: Matter state/target/current reports split and correctly ordered, deferred target writes de-duplicated, legacy position attributes dropped from updates, cluster profile aligned with the certified Eve blind, current position held during external motion (#328)
  • 🎚️ Per-bridge and per-entity cover slider debounce, window widened to 300 ms for smoother slider control (#331)
  • πŸ€– Vacuum service-area handling: customServiceAreas preserved in dynamic RvcRunMode supported modes, custom areas dispatched sequentially, currentArea cleared on dock return and no longer inherited stale across restarts, observedCleaning set on every cleaning event (#335)
  • πŸ”‹ Docked vacuum stops reporting charging once the battery is full (#334)
  • ❄️ Per-entity climateKeepModeOnIdle for off+idle ACs; mode kept through a coolβ†’off transition, freeze applied immediately on off and cleared on action=off (#340)
  • πŸ” Matter session rotation: opt-in per-bridge setting, aged sessions rotated, RVC clean-mode reactor goes offline correctly, pushKeepalive guarded on construction (#287)
  • 🧠 Heap-headroom and force-sync pressure guard to reduce memory pressure (#347)
  • 🏷️ Per-entity customVendorId with Home Assistant device-registry serial fallback (#290)
  • πŸ”’ serialNumberSuffix now loads when editing a bridge and is preserved when the serial is trimmed to 32 characters (#330)
  • πŸ” Regex filters for entity and device labels, plus an any_field_regex matcher for grouped AND/OR filter rules (#337)
  • ⌨️ Entity-id autocomplete in the filter-rule editor (#338)
  • ⚑ Energy sensor endpoints default activePower to 0 and gain PowerTopology + cumulativeEnergyImported defaults (#343)
  • ⏱️ Home Assistant WebSocket message timeout is now configurable, default raised to 60 s (#341)
  • πŸͺŸ device_class=window covers no longer emit EndProductType.Unknown (#312)
  • πŸ–ΌοΈ Bridge-icon existence check now uses the /exists endpoint instead of a HEAD probe (#336)
  • 🧩 JSON editor de-duplicates @codemirror/state (#345)
  • 🌍 Polish translation update, credited to @MStankiewiczOfficial (#329)
  • βœ… Added regression test coverage for the session-max-age parser (#287)
  • ⬆️ Dependency hygiene: transitive deps flagged by Dependabot patched, serialize-javascript bumped to 7.0.5 in docs-site

Previously in v2.0.43:

  • πŸ€– Vacuum currentArea updates when cleaning is started outside HAMH (#281)
  • πŸ“‘ Sensor reactors mark themselves offline when HA disconnects, so updates reach controllers on reconnect (#327)
  • πŸͺŸ Lift+tilt window coverings pick a valid Matter Type (#323)
  • πŸͺŸ Cover device_class=window maps to Rollershade (#312)
  • 🧹 UWANT and Xiaomi sweep/mop labels recognised, mop usage routed via mode.vacuum_mop (#322)
  • πŸ€– Vacuum identify falls back to a sibling identify button when vacuum.locate is unsupported (#320)
  • ❄️ HA-auto AC systemMode stays put when hvac_action is idle, ha-auto-only ACs no longer expose Matter Auto (#309)
  • 🌑️ Climate setpoints snap to the entity target_temp_step (#321)
  • πŸ›°οΈ matter.js controller traffic captured in /api/logs
  • πŸ‡―πŸ‡΅ Japanese translation by @kimera257 (#325)
  • πŸ“ Docs note for the iPhone-only stuck-on-updating vacuum workaround (#287)

Previously in v2.0.42 (hotfix release):

  • πŸ‡―πŸ‡΅ Aqara bridge registration no longer stalls, root softwareVersionString now matches the numeric softwareVersion (#316)
  • ❄️ Climate auto mode is clamped to heat/cool on devices without an AutoMode base (#319)
  • πŸŒ€ Per-entity disableClimateFanControl mapping flag, falls back to ThermostatDevice when controllers like Aqara don't recognise RoomAirConditioner (0x0072) (#318)
  • πŸ—ΊοΈ Vacuum service area selectedAreas is kept after dispatch instead of being cleared

Previously in v2.0.41:

FeatureDescription
🌑️ Google Home AC offline fixDeadFrontBehavior on climate OnOff cluster so RoomAirConditioner stops showing offline on Google Home (#302)
πŸͺŸ Cover device_class mappingMap HA garage/gate/window/awning/etc. to the matching Matter WindowCovering type so voice commands hit the right device type (#304)
πŸ“Ί LG TV commissioning patchLocal patch on matter.js 0.16.11 to accept long NOC operational cert serials (#305)
πŸ’‘ Alexa brightness-reset behind flagOld Alexa brightness-reset heuristic moved behind alexaPreserveBrightnessOnTurnOn, default off, Apple Home "set room to 100%" works again (#306)
πŸŒ€ Google Home fan speedUses fan.set_percentage so already-on fans pick up speed changes from Google Home (#308)
❄️ Climate auto modeExpose Matter Auto mode when HA reports auto in hvac_modes (#309)
πŸ†” Server-mode root identityRoot identity now applies as a single transaction, so controllers don't drop devices mid-swap (#311)
πŸͺŸ Lift-only blindsNo more TiltBlindTiltOnly on covers without tilt, fixes Alexa routines for roller blinds (#312)
🏷️ Per-entity disableClimateOnOffTurn off the OnOff cluster on climate endpoints per entity for controllers that prefer mode-only control
πŸ”’ serialNumberSuffix per bridgeAppend a suffix to every entity serial, useful if controllers like Aqara cache stale device data
πŸ“ protocolLogLevel optionQuiet matter.js logs independently from the app log level
πŸ–₯️ Bridge HW/SW version stringsHA device-registry hw_version/sw_version now show up in Matter BasicInformation on server-mode endpoints
🎨 Extended color light: XY + enhancedColorModeXY feature added as mandatory, enhancedColorMode mirrors colorMode
🎭 Groups + ScenesScenes and Groups clusters added on light, plug, and fan endpoints
πŸ’§ Boolean state configurationCluster added on leak, freeze, rain, and contact sensors
🌍 Spanish translationNew es locale (#314, thanks @Yllelder)
🧡 Matter.js 0.16.11 (pinned)Kept pinned, local NOC serial patch applied
⬆️ Dep bumpsVite 8, jsdom 29, MUI x-tree-view 9, i18next 26, react-i18next 17, TypeScript 6.0.3, biome pinned 2.4.3, pnpm overrides for transitive CVEs

Reliability & resilience: parallel bridge stop in stopAll/restartAll, parallel HA registry fetches, serialized bridge start/stop lifecycle, serialized updateStates with plugin listener detach, HA reconnect retry on transient network errors, 30s timeout on sendMessagePromise, port-conflict reject on web-api start, graceful shutdown on /api/backup/restart, AppEnvironment disposal on SIGINT, stale optimistic state sweep, pending debouncer clear, healthcheck 401 fix under basic auth, deep-equal entity attribute comparison, overlap guard for auto-refresh, safer mireds conversion, aligned colorMode publishing, surfaced bridge import errors, corrected thermostat running state for unknown modes + drying, unified Node version across Dockerfiles, sourcemaps excluded from npm tarball, unused deps dropped (rxjs, strip-color, lodash), unused config-validator utility removed.

Previously in v2.0.39 & v2.0.40 (hotfix releases):

  • Fixed crash loop on startup caused by Node 22 native WebSocket dropping connections (#297, #299), affects both aarch64 (RPi) and amd64
  • Fixed service initialization errors being silently swallowed, causing the process to hang instead of exiting
  • Registry fetch now waits for WebSocket reconnect between retries and has increased retry tolerance
  • Fixed select, input_select, siren domains showing as unsupported in filter preview (#298)

Previously in v2.0.38:

FeatureDescription
🏷️ Per-Entity Identity OverridescustomProductName, customVendorName, customSerialNumber per entity mapping (#277, #290)
πŸͺŸ Garage & Gate Open/CloseDiscrete Open/Close mode for garage and gate covers (#55)
🚿 Dishwasher Device TypeDishwasher override for switch entities
🚨 Siren SupportSiren domain as OnOff Plug-in Unit
🏷️ productNameFromNodeLabel FlagReport node label as Matter productName for Aqara controllers
πŸ€– Vacuum Room ProgressDynamic room progress tracking via currentRoomEntity sensor
⚑ Startup Force SyncImmediate force sync on startup to beat stale Alexa queues (#282)
🌐 Network Diagnostic APImDNS/network diagnostic endpoint with dashboard card
πŸ”Œ Energy on Composed DevicesEnergy/power measurement clusters on composed endpoints
🩺 Multi-Admin Fabric DiagnosticsPer-fabric session info in health API
🩺 Docker HEALTHCHECKNative healthcheck in standalone and addon images
πŸ”’ Admin Password HashingAdmin password stored hashed, timingSafeEqual for lock PIN verification
🧡 Matter.js 0.16.11Updated Matter stack
🌍 Polish + Traditional ChineseNew pl and zh-tw locales

Fix highlights: vacuum keepalive for Apple Home "Updating…" (#287), multi-phase clean progress (#281), GenericSwitch single/multi split for Apple Home buttons (#289), HA restart attribute guards (#286), fan speed restore on turn-on (#275), moisture sensor auto-map to HumiditySensor (#273), TV speaker override (#293), rain + radon sensor auto-mapping, composed sub-endpoint cleanup.

Previously in v2.0.36:

FeatureDescription
πŸ—οΈ User-Defined Composed DevicesCreate custom composed devices via composedEntities mapping (#220)
πŸ”Œ Plugin Domain MappingsDomain mapping support in plugin API with cloud-mock example
πŸ”‹ Valve & Pump BatteryBattery support for valve and pump endpoints
🌐 German + Russian TranslationsComplete German translation and new Russian language
πŸ“‘ Session RecoveryGraceful session close, dead session cleanup, mDNS re-announcement (#266)
πŸ”— Quick Link to Failed DevicesDashboard quick link to failed devices (#270)
🌑️ Thermostat FixSkip climate.turn_on when already on (#269)
πŸͺŸ Cover FixCorrect stale targetPosition during external movement (#268)
🌬️ Air Purifier FixSub-endpoints for composed air purifier, manual temp/humidity mapping (#265)
πŸ”₯ Cooling-Only Thermostat FixPrevent HeatingOnly on cooling-only thermostat (#264)
↔️ Per-Entity Cover SwapIndividual coverSwapOpenClose per cover (#263)
πŸ§ͺ Alpha Features (v2.1.0-alpha.933) - Click to expand

v2.1.0-alpha.933:

  • πŸͺŸ Option to send cover open/close as a position: some cover integrations, like Cover Time Based, stop when they get open or close while the cover is moving, and only reverse on a position. Turn on Send open/close as position in the entity mapping and open and close go out as set_cover_position 100 and 0. Off by default, covers without a position keep open/close (#512)

v2.1.0-alpha.932:

  • 🧹 Removed option cleaned from saved bridges: a bridge saved with the old "Omit events in priming" option still listed it on the Diagnostics page and in the export. It is now dropped from storage on start

v2.1.0-alpha.931:

  • 🧡 No local matter.js patch any more: HAMH now runs matter.js 0.18 unchanged. The "Omit events in priming" bridge option is gone, it was never confirmed to help Google. The last failed subscription update and "Giving up on subscription" are logged at INFO again
  • πŸ” Session rotation is opt-in in server mode too: server mode bridges no longer close controller sessions every 4 h. Set Session Rotation Max Age if you want it back. When HAMH closes a session itself, it closes its subscriptions first
  • πŸ”Œ EV chargers answer charging target commands: SetTargets, GetTargets and ClearTargets are accepted and stored, nothing is sent to Home Assistant

v2.1.0-alpha.930:

  • 🧡 matter.js 0.18 RC (nightly 0.18.0-alpha.0-20261008): brings Matter 1.6.1. Controllers now see spec version 1.6.1, a Groupcast cluster on the bridge root and newer device type revisions. If something pairs or behaves differently than on alpha.929, please open an issue with the diagnostic export
  • πŸ”‡ matter.js device type checks stay off at runtime: 0.18 can check every endpoint against its device type and log a warning for each deviation at every start. HAMH turns that off, the endpoint shapes are covered by its tests

v2.1.0-alpha.929:

  • 🧹 Vacuums with one cleaning mode get a second "Auto" mode: Matter needs at least two cleaning modes, and the coming matter.js 0.18 refuses a vacuum with only one. Picking "Auto" is refused and nothing is sent to Home Assistant. Apple Home shows it as "Automatic"
  • πŸ”Œ EV chargers list "Time of Use" next to Manual: same rule for the EVSE mode list. Picking it is refused, Manual stays selected
  • πŸͺŸ Shutters with tilt become exterior venetian blinds: Matter 1.6.1 allows the Shutter type only with lift or tilt, not both. A tilting shutter cover now reports TiltBlindLift with ExteriorVenetianBlind, so already paired ones may show a different blind type. Covers also set a valid product type before their first state arrives
  • πŸ”’ Unlock with timeout reaches Home Assistant: the command used to flip the lock state in the controller without calling Home Assistant. It now unlocks through Home Assistant like a normal unlock and locks again when the timeout runs out
  • πŸ”˜ Long press events end released: a long_press without a following release sent the press twice and left the button held. It now sends press, long press and release once
  • πŸ“Ί TVs without play or pause mount: they failed to start because the playback cluster was left out
  • πŸ’‘ Color lights list RemainingTime and the pump mapping mounts, it never did before

v2.1.0-alpha.928:

  • 🧹 Apple Home can clean all rooms of a CLEAN_AREA vacuum: Apple sends "all rooms" as an empty selection and then starts with one room's run mode, so only that room got cleaned. The "Don't expose rooms as per-room cleaning modes" option in the entity mapping now also covers CLEAN_AREA rooms and rooms from the vacuum attributes, not only custom areas. Turn it on when only Apple Home starts the vacuum; Alexa and Google Home still need the room modes (#511)

v2.1.0-alpha.927:

  • πŸŒ€ Fans and air purifiers keep their speed range while unavailable: Home Assistant drops the speed step while a fan is unavailable, so the bridge changed the fixed SpeedMax from 100 to 3 and back on every outage. It now keeps the last value (#505)

v2.1.0-alpha.926:

  • 🎨 A color sent right after On is applied: Alexa sends the color a moment after On, while Home Assistant still reports the light off. The color was held back and applied on the next turn-on instead. It now goes out with this one, and a color right after Off no longer switches the light back on (#510)

v2.1.0-alpha.925:

  • πŸ”’ Locks without a keypad can skip PIN codes: the new Lock has no keypad switch in a lock's entity mapping exposes it without PIN codes, so controllers offer no access code setup. Other locks keep their PIN support (#418)

v2.1.0-alpha.924:

  • πŸ“· High resolution camera streams get through: a 1440p keyframe overflowed the bridge's UDP receive buffer, so the controller never got a whole picture. The bridge now asks for 4 MB, which HAOS allows (#373)

v2.1.0-alpha.923:

  • πŸ“· Camera errors from Home Assistant are readable: when HA refuses a live view request the log shows its error instead of [object Object], and camera ids HA can't accept (like camera.rtsp-lq) are skipped at startup with a warning (#373)

v2.1.0-alpha.922:

  • πŸ“· Camera live view can work with SmartThings: four bugs stopped it every time, SmartThings' stream setup was rejected, every offer failed, the bridge offered VP8 instead of H.264 and answered too late. Tested end to end with a simulated SmartThings controller, a test on real hardware is still missing (#373)

v2.1.0-alpha.921:

  • πŸ—ΊοΈ Vacuum custom areas can carry a map and a floor: custom service areas of a vacuum can carry a map name and a floor number, areas sharing a map name show up as one Matter map, and the same room name can sit on two maps (#506)

v2.1.0-alpha.920:

  • βš™οΈ Device list changes are one log line: the log now has one line 'Device list changed: N removed, M added, K mounted' whenever a bridge changes its set of devices, with the added ones named and the bridge id in the logger name, so a log or diagnostic export shows whether the bridge itself changed what a controller sees (#505)
  • βš™οΈ Session cleanup no longer quotes a false 60s gap: the session cleanup lines no longer say 'no subscriptions for 60s', because that number was the check interval and not the time without subscriptions (#505)

v2.1.0-alpha.919:

  • βš™οΈ Failed label queries keep the last labels: a failed Home Assistant label query no longer empties the label list, and before that a bridge filtering by label name could unmount its devices until the next refresh (#500)
  • πŸ“‘ False mDNS re-announcement log is gone: the log line "Triggered mDNS re-announcement after session cleanup" is gone, nothing was sent at that point (#500, #485)

v2.1.0-alpha.918:

  • πŸ“‘ Clearer mDNS global IPv6 warning: the startup log now says you can ignore it when devices work, and names mdns_strip_global_ipv6 for the add-on and --mdns-strip-global-ipv6 for a container (#392)
⚠️ Testing Features (v4.1.0-testing) - Click to expand

[!CAUTION] Testing versions are highly unstable and intended for developers only!

πŸ—οΈ Vision 1: Callback-based Architecture

Old (Legacy)New (Vision 1)
Behaviors update themselvesEndpoint updates behaviors via setStateOf()
Behaviors call HA actions directlyBehaviors notify via notifyEndpoint()

New Callback-Behaviors: OnOff, LevelControl, Lock, Cover, Fan, ColorControl, VacuumRunMode, VacuumOperationalState

Updated Endpoints: Switch, Lock, Cover, Vacuum, Button, Valve, Scene, Humidifier, Light, Fan

πŸ“œ Previous Stable Versions - Click to expand

v2.0.40

Filter preview domain fix, select, input_select, siren now show as supported (#298)

v2.0.39

Node 22 WebSocket crash loop fix (#297, #299), service init error surfacing, registry retry hardening, support link added

v2.0.37

Aqara productNameFromNodeLabel flag, Matter.js 0.16.11, Swedish locale update

v2.0.35

HA 2026.3 Clean Area Support, Valetudo Identifier Mapping, Plugin System Hardening, Registry Fingerprint Fix, Roomba Battery Fix, Contact Sensor Fix, Script Momentary Fix, Docusaurus Docs

v2.0.34

Automatic Backup, Vacuum Battery Auto-Map, Deprecated Feature Flags Fix

v2.0.33

Endpoint Number Preservation, Binary Sensor Battery Auto-Map

v2.0.32

Multi-Language Support, Plugin System, New Device Types (PIR, Rain, Electrical, AQ Sensors), Cluster Diagnostics, Dashboard Enhancements, Mapping Profile Export/Import, Fan & Air Purifier Fixes, Stale Session Cleanup, KNX Cover Fix

v2.0.31

Controller Profiles & Area Setup, Fan Speed/Preset Fix, Optimistic State Fix, Cover Target Fix, Humidity Auto-Mapping Default

v2.0.30

Mapped Entity Propagation Fix, API Error Surfacing

v2.0.29

Light currentLevel Fix, Bridge Config Save Fix, Fan Device Feature Fix, Humidity Auto-Mapping Fix

v2.0.28

Device Image Support, Custom Fan Speed Mapping, TV Source Selection, Reverse Proxy Base Path, On/Off-Only Fans, Light Brightness Fix, Fan Speed Fixes, Composed Air Purifier Fix, Dreame Multi-Floor Fix, Optimistic State Updates, Frontend Improvements

v2.0.27

Valetudo support, Custom Service Areas, ServiceArea Maps, Vacuum Identify/Locate/Charging, Alarm Control Panel, Composed Air Purifier, Dashboard Controls, Vendor Brand Icons, Thermostat fixes, Air Purifier oscillation/wind

v2.0.26

Authentication UI, Select entity support, Webhook event bridge, Cluster diagnostics, Matter.js 0.16.10, Docker Node 22, vacuum cleaning mode fallback, vacuum entity filter fix

v2.0.25

Vacuum mop intensity, vacuum auto-detection, Roborock room auto-detect, live entity mapping, dynamic heap sizing, multi-fabric commissioning, fan speed label fix

v2.0.24

Dashboard landing page, composed devices, bridge wizard feature flags, entity autocomplete, light transitions, live diagnostics, vacuum suction level, thermostat auto-resume, vacuum docked state, memory leak fix

v2.0.19-v2.0.23

Bridge templates, live filter preview, entity diagnostics, multi-bridge bulk operations, entity health indicators, diagnostic export, EntityLabel/DeviceLabel filters, Power & Energy Measurement, Event domain (GenericSwitch)

v2.0.17 / v2.0.18

Room Label (FixedLabel), thermostat overhaul, lock unlatch/unbolt, binary sensor fix, auto pressure mapping, vacuum fixes, dead session recovery, network map, mobile UI, Labels & Areas page, crash resilience, memory limit

v2.0.16

Force Sync, Lock PIN, Cover/Blinds improvements, Roborock Rooms, Auto Entity Grouping, Water Heater, Vacuum Server Mode, OOM fix

v1.10.4

Climate/Thermostat fixes, Cover position fix, Vacuum battery, Humidifier improvements, Entity Mapping, Alexa brightness preserve

v1.9.0

Custom bridge icons, Basic Video Player (TV), Alexa deduplication, Auto-only thermostat, Health Check API, WebSocket, Full backup/restore

v1.8.x

Graceful crash handler, PM2.5/PM10 sensors, Water Valve, Smoke/CO Detector, Pressure/Flow sensors, Air Purifier, Pump device

v1.7.x

Dark Mode toggle, Device list sorting

v1.5.x

Matter Bridge, Multi-Fabric support, Health Monitoring, Bridge Wizard, AirQuality sensors, Fan control, Media playback


Supported Device Types

Home Assistant DomainMatter Device TypeNotes and Feature Flags
lightExtended Color (color or color temperature), Dimmable, On/OffpowerEntity, energyEntity set by hand, lights don't get them auto-mapped (#374). Can be set to On/Off Plug-in Unit so Apple Home shows its wattage (#484)
switchOn/Off Plug-in UnitPower and energy sensors of the same device are mapped automatically. Overrides: Dishwasher, Laundry Washer, Laundry Dryer, EV Charger, Pump, Water Valve, On/Off Switch, Mounted On/Off Control
input_booleanOn/Off Plug-in Unit
lockDoor LockPIN credentials, unbolt when the lock can open
coverWindow CoveringcoverSwapOpenClose, coverExposeAsDimmableLight (#372)
climateRoom Air Conditioner (with fan modes), otherwise ThermostatdisableClimateFanControl, disableClimateOnOff, climateExposeFan (#309), battery via batteryEntity
fanFan, On/Off Plug-in Unit without speed controlOscillation, wind modes. Air Purifier override with filterLifeEntity
humidifierFan, the fan speed sets the target humidityMatter has no humidifier type
binary_sensorContact, Occupancy, Smoke/CO Alarm, On/Off SensorLeak and freeze default to Contact Sensor (Alexa-safe); the Matter 1.4 Water Leak, Water Freeze and Rain detectors are overrides (#365)
sensorTemperature, Humidity, Pressure, Flow, Light, Air Quality (COβ‚‚, CO, PM1, PM2.5, PM10, TVOC, NOβ‚‚, ozone, radon), Electrical Meter (power, energy, voltage, current), BatterybatteryEntity, humidityEntity, pressureEntity. Overrides: Solar Power, Electrical Utility Meter, EV Charger, Battery Storage with power and energy
eventGeneric SwitchDoorbell override (experimental)
button, input_buttonOn/Off Plug-in Unit, pressed when turned on
automation, script, sceneOn/Off Plug-in Unit, triggers when turned onOn/Off Switch override, needs a one-time re-pair (#380)
select, input_selectMode SelectselectExposeAsSwitch for a select with on and off options
alarm_control_panelMode SelectOn/Off Plug-in Unit override to arm and disarm
media_playerSpeaker, Basic Video Player for TVs
valveWater Valve
vacuumRobot Vacuum CleanerserverMode, roomEntities, customServiceAreas, vacuumRoomSwitches, vacuumOnOff, batteryEntity, cleaningModeEntity, suctionLevelEntity, mopIntensityEntity, chargingStateEntity (#377)
lawn_mowerRobot Vacuum Cleaner, Matter has no mower type yetSame flags as the vacuum (#301)
water_heaterThermostat (heating)Override: Matter 1.4 Water Heater (0x050F) with Boost
siren, remoteOn/Off Plug-in Unit
weatherTemperature Sensor with humidity and pressure

Which controller shows which type is in the Controller Compatibility matrix (Apple Home, Google Home, Alexa, Aqara Home, SmartThings).

πŸ“– See Supported Device Types Documentation for details

Common per-entity flags: updateThrottleMs rate-limits how often an entity pushes updates to controllers (#351), coverExposeAsDimmableLight exposes a cover as a dimmable light for Alexa routines (#372), chargingStateEntity maps a charging-state sensor (#377), climateExposeFan exposes a climate AC's fan as its own endpoint (#309).

Entity Filters

Filter rules match on these matcher types: pattern, regex, domain, platform, entity_label, device_label, entity_label_regex, device_label_regex, any_field_regex, area, entity_category, device_name, product_name, device_class. The new manufacturer matcher matches the device manufacturer (or default_manufacturer) and supports * wildcards (#382).

Reliability & Health

Configurable auto-recovery with failure timestamps in Settings, controller-compatibility warnings on each bridge page, per-entity device-health diagnostics on the health dashboard, and a warning when a bridge exposes device types its controller does not support.

Experimental: Camera Plugin

A built-in plugin exposes Home Assistant cameras as Matter Cameras (0x0142). Experimental and SmartThings-only as of 2026. Live view could not work until the #373 fix; a loopback test that does what SmartThings' camera driver does now streams end to end, a test on real SmartThings hardware is still missing.


πŸ€– Robot Vacuum Server Mode

⚠️ Important: Apple Home & Alexa require Server Mode for Robot Vacuums (click to expand)

The Problem

Apple Home and Alexa do not properly support bridged robot vacuums. When your vacuum is exposed through a standard Matter bridge, you may experience:

  • Apple Home: "Updating" status, Siri commands don't work, room selection fails
  • Alexa: Vacuum is not discovered at all

This is because these platforms expect robot vacuums to be standalone Matter devices, not bridged devices.

The Solution: Server Mode

Server Mode exposes a device as a standalone (non-bridged) Matter endpoint without the bridge wrapper. It works for any device type, not just vacuums, and a bridge can host standalone devices. For a robot vacuum this makes it fully compatible with Apple Home and Alexa.

Setup Instructions

  1. Create a new bridge in the Matter Hub web interface
  2. Enable "Server Mode" checkbox in the bridge creation wizard
  3. Add only your vacuum to this bridge
  4. Pair the new Server Mode bridge with Apple Home or Alexa
  5. Your other devices stay on your regular bridge(s)

Important Notes

  • A Server Mode node exposes each device as a standalone endpoint, up to 10 per node; extra entities are skipped
  • For best results give a robot vacuum its own dedicated Server Mode bridge
  • Other device types (lights, switches, sensors) also work on regular bridges
  • After switching to Server Mode, Siri commands like "Hey Siri, start the vacuum" will work

Documentation

For more details, see the Robot Vacuum Documentation.


Installation

Open your Home Assistant instance and show the dashboard of an app.

Manual steps (testing versions, etc.)

Add this repository to your Add-on Store:

https://github.com/RiDDiX/home-assistant-addons

Three add-ons are available:

  • Home-Assistant-Matter-Hub (hamh) - Stable release
  • Home-Assistant-Matter-Hub (Alpha) (hamh-alpha) - Pre-release, gets every fix first
  • Home-Assistant-Matter-Hub (Testing) (hamh-testing) - Experimental, may break

Docker

docker run -d \
  --name home-assistant-matter-hub \
  --network host \
  -v /path/to/data:/data \
  -e HAMH_HOME_ASSISTANT_URL=http://192.168.178.123:8123 \
  -e HAMH_HOME_ASSISTANT_ACCESS_TOKEN=your_long_lived_access_token \
  ghcr.io/riddix/home-assistant-matter-hub:latest

Note: All environment variables require the HAMH_ prefix. See the Installation Guide for all available options.

For alpha versions, use tag alpha instead of latest.


Documentation

Please see the documentation for detailed installation instructions, configuration options, known issues, limitations and guides.


πŸ”§ Network Troubleshooting

⚠️ "No Response" / Connection Drops, Common Network Causes (click to expand)

The Problem

Your Matter devices suddenly show "No Response" (Apple Home), "Unavailable" (Google Home), or become unresponsive after some time, even though the bridge is still running and other controllers (e.g., Alexa) continue to work fine.

Root Cause: Network Equipment Blocking mDNS/Multicast

Matter relies heavily on mDNS (multicast DNS) for device discovery and reachability. Many routers, access points, and managed switches have features that filter, throttle, or block multicast traffic, which breaks Matter communication silently.

πŸ’‘ This was confirmed and documented thanks to the excellent systematic testing by @omerfaruk-aran in #129. The issue was traced to a TP-Link Archer AX50 (in AP mode) sitting between the Apple TV and the network, its default settings were blocking/limiting mDNS/Bonjour traffic over time.

What to Check on Your Network Equipment

  1. IGMP Snooping, Disable or configure it to allow mDNS (224.0.0.251 / ff02::fb)
  2. Multicast Optimization / Multicast Enhancement, Disable (often called "Airtime Fairness" or "Multicast to Unicast")
  3. AP Isolation / Client Isolation, Must be disabled so devices on the same network can communicate
  4. mDNS / Bonjour Forwarding, Enable if available (some enterprise APs have this)
  5. DHCP Server on secondary devices, Disable DHCP on access points / switches that are NOT your main router (multiple DHCP servers cause IP conflicts)
  6. Firmware Updates, Update your router/AP firmware, as multicast handling is frequently improved

Affected Equipment (Known Cases)

DeviceIssueFix
TP-Link Archer AX50 (AP mode)mDNS traffic blocked/limited over timeFirmware update + disable DHCP on the AP
Ubiquiti UniFi APsIGMP Snooping can filter mDNSDisable IGMP Snooping or enable mDNS Reflector
Managed Switches (various)Multicast filtering enabled by defaultAllow mDNS multicast groups

Quick Diagnostic Steps

  1. Does Alexa still work when Apple Home shows "No Response"?

    • Yes β†’ Bridge is online, the issue is network path / mDNS related
    • No β†’ Bridge may actually be down, check HAMH logs
  2. Does removing a Home Hub (HomePod/Apple TV) fix it?

    • Yes β†’ The hub's network path is affected (AP/switch between hub and bridge)
    • No β†’ May be a different issue
  3. Try binding mDNS to a specific interface:

    --mdns-network-interface eth0
    

    (or end0, enp0s18, etc., check your system)

Network Topology Tips

  • Keep the path simple: Avoid placing access points or managed switches between your Matter bridge (Home Assistant) and your Home Hub (HomePod/Apple TV)
  • Use wired connections where possible for Home Hubs and the Home Assistant host
  • Same subnet: All Matter devices, controllers, and the bridge must be on the same Layer 2 network / subnet
  • IPv6: Matter requires IPv6, do not disable it. For VLAN setups, configure ULA addresses (fd00::/8), not just link-local (fe80::). See Troubleshooting and Discussion #39

Migration from t0bst4r

Migrating from the original t0bst4r/home-assistant-matter-hub is easy. Your Matter fabric connections and paired devices will be preserved!

Home Assistant Add-on

  1. Backup your data:

    cp -r /addon_configs/*_hamh /config/hamh-backup
    # Verify the backup was copied correctly
    ls /config/hamh-backup
    
  2. Uninstall the old add-on (Settings β†’ Add-ons β†’ Uninstall) and make sure the old folder is removed:

    rm -rf /addon_configs/*_hamh
    
  3. Add the new repository:

    https://github.com/RiDDiX/home-assistant-addons
    
  4. Install and start the new add-on once (creates the data folder), then stop it

  5. Clear the new folder and restore your backup:

    rm -rf /addon_configs/*_hamh/*
    cp -r /config/hamh-backup/* /addon_configs/*_hamh/
    
  6. Start the add-on again - your devices should reconnect automatically

Docker / Docker Compose

Simply change the image from:

ghcr.io/t0bst4r/home-assistant-matter-hub:latest

to:

ghcr.io/riddix/home-assistant-matter-hub:latest

Your volume mounts stay the same - no data migration needed.

For detailed instructions, see the full Migration Guide.


πŸ™ Contributors & Acknowledgments

This project thrives thanks to the amazing community! Special thanks to everyone who contributes by reporting bugs, suggesting features, and helping others.

Note: GitHub doesn't surface contributors on this repo because it's still a fork of the original. The list below is maintained by hand.

πŸ† Top Contributors

Newest first.

ContributorContributions
@iblur01🌐 Translator - French translation completed (#504)
@toineenzo🌐 Translator - Dutch translation (#503)
@qbattersbyπŸ€– Code Contributor - LevelControl transitionTime patch for matter.js 0.17, so Google Home can dim already-on lights (#383)
@Yllelder🌐 Translator - Spanish translation (#314)
@MStankiewiczOfficial🌐 Translator - Polish translation (#288, #329)
@aetasoulπŸ€– Code Contributor - Immediate force sync on startup to beat stale Alexa queues (#282)
@omerfaruk-aran🌐 Turkish translation (#260) + πŸ”§ Network debugging for "No Response" issues (#129)
@gustavakerstromπŸ€– Code Contributor - Custom fan speed mapping (#226), template description fix (#215)
@AmineDjeghriπŸ“ Migration instructions for the addon data folder (#171)
@markgazeπŸ€– Code Contributor - Ecovacs Deebot room support (#118)
@codyc1515πŸ₯‡ Top Reporter - Climate/thermostat bugs (#52, #24, #21, #20), README badge & install steps (#285), binary sensor classes (#66), fan control init (#10)
@AymericLeFeyerπŸ“ README YouTube video link
@depahkπŸ“ Migration docs (#32)
@Hatton920πŸ€– Vacuum Expert - Intensive testing of Robot Vacuum Server Mode, Apple Home & Siri validation
@razziethemanπŸ₯ˆ Active Tester - Bridge icons (#101), sorting (#80), feature requests (#31, #30), extensive UI/UX feedback
@SH1FT-WπŸ’Ž Sponsor + Vacuum room selection feature request (#49)
@ChrulfπŸ” Google Home brightness debugging (#41), detailed logs & testing
@FettkeewlπŸ› Script import bug (#26), Alias feature request (#25)
πŸ“‹ Issue Tracker - All Contributors (click to expand)

Thank you to everyone who helps improve this project by reporting issues!

πŸ’– Sponsors

Donations are completely voluntary! This project exists because of passion for open source, not money. Thank you to everyone who has supported it, it truly means a lot! ❀️

πŸ₯‡ First Sponsor: @thorsten-gehrig

πŸ’Ž @SH1FT-WπŸ’Ž @ilGaspaπŸ’Ž @linux4life798
πŸ’Ž @torandrerolandπŸ’Ž @ralondoπŸ’Ž @bexxter85-ux
πŸ’Ž @dinarioxπŸ’Ž @JRCondatπŸ’Ž @d3rby91
πŸ’Ž @nicoodeimosπŸ’Ž @ustari28πŸ’Ž Markus MΓΌller (@Dingosworld)
πŸ’Ž StefanSπŸ’Ž Manny B.πŸ’Ž Bonjon
πŸ’Ž TobiRπŸ’Ž Franz HuberπŸ’Ž Michele Larese de Prata
πŸ’Ž @CNCBπŸ’Ž @pelican1997πŸ’Ž @PeJanNL
πŸ’Ž @bra1nbusterπŸ’Ž @knuti1960πŸ’Ž @ppttu

πŸ™ ...and anonymous supporters who prefer not to be named.

🌟 Original Author

  • @t0bst4r - Creator of the original Home-Assistant-Matter-Hub project

β˜• Support the Project

[!NOTE] Completely optional! This project will continue regardless of donations. I maintain this in my free time because I believe in open source.

If you find this project useful, consider supporting its development:

GitHub Sponsors Ko-fi PayPal

Your support helps cover hosting costs and motivates continued development. Thank you! ❀️


πŸ“Š Project Stats

GitHub commit activity GitHub last commit GitHub issues GitHub closed issues GitHub pull requests


Significant stargazers

Sandro

609 followers Β· starred Aug 2026

Felipe Santos

193 followers Β· starred Jul 2026

Artem Belevich

269 followers Β· starred Feb 2026

Benjamin Bock

66 followers Β· starred May 2026