@riddix/hamh 2.1.0-alpha.599 → 2.1.0-alpha.601

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,7 +37,7 @@ of port forwarding etc.
37
37
 
38
38
  | Channel | Branch | Current Version | Description |
39
39
  |---------|--------|-----------------|-------------|
40
- | **Stable** | `main` | v2.0.36 | Production-ready, recommended for most users |
40
+ | **Stable** | `main` | v2.0.38 | Production-ready, recommended for most users |
41
41
  | **Alpha** | `alpha` | v2.1.0-alpha.x | Pre-release with new features, for early adopters |
42
42
  | **Testing** | `testing` | v4.1.0-testing.x | ⚠️ **Highly unstable!** Experimental features, may break |
43
43
 
@@ -52,9 +52,30 @@ of port forwarding etc.
52
52
  ## 🎉 What's New
53
53
 
54
54
  <details>
55
- <summary><strong>📦 Stable Features (v2.0.36)</strong> - Click to expand</summary>
55
+ <summary><strong>📦 Stable Features (v2.0.38)</strong> - Click to expand</summary>
56
56
 
57
- **New in v2.0.36:**
57
+ **New in v2.0.38:**
58
+
59
+ | Feature | Description |
60
+ |---------|-------------|
61
+ | **🏷️ Per-Entity Identity Overrides** | `customProductName`, `customVendorName`, `customSerialNumber` per entity mapping ([#277](https://github.com/RiDDiX/home-assistant-matter-hub/issues/277), [#290](https://github.com/RiDDiX/home-assistant-matter-hub/issues/290)) |
62
+ | **🪟 Garage & Gate Open/Close** | Discrete Open/Close mode for garage and gate covers ([#55](https://github.com/RiDDiX/home-assistant-matter-hub/issues/55)) |
63
+ | **🚿 Dishwasher Device Type** | Dishwasher override for switch entities |
64
+ | **🚨 Siren Support** | Siren domain as OnOff Plug-in Unit |
65
+ | **🏷️ productNameFromNodeLabel Flag** | Report node label as Matter productName for Aqara controllers |
66
+ | **🤖 Vacuum Room Progress** | Dynamic room progress tracking via `currentRoomEntity` sensor |
67
+ | **⚡ Startup Force Sync** | Immediate force sync on startup to beat stale Alexa queues ([#282](https://github.com/RiDDiX/home-assistant-matter-hub/pull/282)) |
68
+ | **🌐 Network Diagnostic API** | mDNS/network diagnostic endpoint with dashboard card |
69
+ | **🔌 Energy on Composed Devices** | Energy/power measurement clusters on composed endpoints |
70
+ | **🩺 Multi-Admin Fabric Diagnostics** | Per-fabric session info in health API |
71
+ | **🩺 Docker HEALTHCHECK** | Native healthcheck in standalone and addon images |
72
+ | **🔒 Admin Password Hashing** | Admin password stored hashed, `timingSafeEqual` for lock PIN verification |
73
+ | **🧵 Matter.js 0.16.11** | Updated Matter stack |
74
+ | **🌍 Polish + Traditional Chinese** | New `pl` and `zh-tw` locales |
75
+
76
+ **Fix highlights:** vacuum keepalive for Apple Home "Updating…" ([#287](https://github.com/RiDDiX/home-assistant-matter-hub/issues/287)), multi-phase clean progress ([#281](https://github.com/RiDDiX/home-assistant-matter-hub/issues/281)), GenericSwitch single/multi split for Apple Home buttons ([#289](https://github.com/RiDDiX/home-assistant-matter-hub/issues/289)), HA restart attribute guards ([#286](https://github.com/RiDDiX/home-assistant-matter-hub/issues/286)), fan speed restore on turn-on ([#275](https://github.com/RiDDiX/home-assistant-matter-hub/issues/275)), moisture sensor auto-map to HumiditySensor ([#273](https://github.com/RiDDiX/home-assistant-matter-hub/issues/273)), TV speaker override ([#293](https://github.com/RiDDiX/home-assistant-matter-hub/issues/293)), rain + radon sensor auto-mapping, composed sub-endpoint cleanup.
77
+
78
+ **Previously in v2.0.36:**
58
79
 
59
80
  | Feature | Description |
60
81
  |---------|-------------|
@@ -70,21 +91,12 @@ of port forwarding etc.
70
91
  | **🔥 Cooling-Only Thermostat Fix** | Prevent HeatingOnly on cooling-only thermostat ([#264](https://github.com/RiDDiX/home-assistant-matter-hub/issues/264)) |
71
92
  | **↔️ Per-Entity Cover Swap** | Individual coverSwapOpenClose per cover ([#263](https://github.com/RiDDiX/home-assistant-matter-hub/issues/263)) |
72
93
 
73
- **Previously in v2.0.35:**
74
-
75
- | Feature | Description |
76
- |---------|-------------|
77
- | **🏠 HA 2026.3 Clean Area Support** | Native support for the new `vacuum.clean_area` action |
78
- | **🤖 Valetudo Identifier Mapping** | Custom `valetudoIdentifier` for MQTT topic case mismatches |
79
- | **🔌 Plugin System Hardening** | Validation, API version check, tgz upload/local install |
80
- | **📖 Docusaurus Docs** | New documentation site with improved search and navigation |
81
-
82
94
  </details>
83
95
 
84
96
  <details>
85
97
  <summary><strong>🧪 Alpha Features (v2.1.0-alpha.x)</strong> - Click to expand</summary>
86
98
 
87
- **Alpha is currently in sync with Stable (v2.0.36).** All alpha features have been promoted to stable. New alpha features will appear here as development continues.
99
+ **Alpha is currently level with Stable (v2.0.38).** All alpha features from the v2.1.0-alpha.600 line have been promoted into v2.0.38. New alpha work continues from `v2.1.0-alpha.601` onward and will appear here as development progresses.
88
100
 
89
101
  </details>
90
102
 
@@ -110,6 +122,9 @@ of port forwarding etc.
110
122
  <details>
111
123
  <summary><strong>📜 Previous Stable Versions</strong> - Click to expand</summary>
112
124
 
125
+ ### v2.0.37
126
+ Aqara productNameFromNodeLabel flag, Matter.js 0.16.11, Swedish locale update
127
+
113
128
  ### v2.0.35
114
129
  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
115
130
 
@@ -412,6 +427,7 @@ This project thrives thanks to the amazing community! Special thanks to everyone
412
427
  | [@markgaze](https://github.com/markgaze) | 🤖 **Code Contributor** - Ecovacs Deebot room support ([#118](https://github.com/RiDDiX/home-assistant-matter-hub/pull/118)) |
413
428
  | [@omerfaruk-aran](https://github.com/omerfaruk-aran) | 🔧 **Network Debugging Expert** - Systematic mDNS/multicast root cause analysis for "No Response" issues ([#129](https://github.com/RiDDiX/home-assistant-matter-hub/issues/129)) |
414
429
  | [@gustavakerstrom](https://github.com/gustavakerstrom) | 🤖 **Code Contributor** - Template description display fix ([#215](https://github.com/RiDDiX/home-assistant-matter-hub/pull/215)) |
430
+ | [@aetasoul](https://github.com/aetasoul) | 🤖 **Code Contributor** - Immediate force sync on startup to beat stale Alexa queues ([#282](https://github.com/RiDDiX/home-assistant-matter-hub/pull/282)) |
415
431
 
416
432
  <details>
417
433
  <summary><strong>📋 Issue Tracker - All Contributors</strong> (click to expand)</summary>
@@ -486,6 +502,8 @@ Thank you to everyone who helps improve this project by reporting issues!
486
502
 
487
503
  If you find this project useful, consider supporting its development:
488
504
 
505
+ [![GitHub Sponsors](https://img.shields.io/badge/GitHub%20Sponsors-Donate-ea4aaa?logo=githubsponsors&style=for-the-badge)](https://github.com/sponsors/RiDDiX)
506
+ [![Ko-fi](https://img.shields.io/badge/Ko--fi-Donate-ff5e5b?logo=kofi&logoColor=white&style=for-the-badge)](https://ko-fi.com/riddix)
489
507
  [![PayPal](https://img.shields.io/badge/PayPal-Donate-blue?logo=paypal&style=for-the-badge)](https://www.paypal.me/RiDDiX93)
490
508
 
491
509
  Your support helps cover hosting costs and motivates continued development. Thank you! ❤️
@@ -146788,6 +146788,12 @@ var init_bridge_config_schema = __esm({
146788
146788
  type: "boolean",
146789
146789
  default: false
146790
146790
  },
146791
+ productNameFromNodeLabel: {
146792
+ title: "Product Name from Node Label",
146793
+ description: "Report the entity's node label (custom name / friendly name / entity id) as the Matter productName. Useful for controllers like Aqara that display productName as the device name instead of nodeLabel. A per-entity customProductName still takes precedence.",
146794
+ type: "boolean",
146795
+ default: false
146796
+ },
146791
146797
  vacuumOnOff: {
146792
146798
  title: "Vacuum: Include OnOff Cluster (Alexa)",
146793
146799
  description: "Add an OnOff cluster to robot vacuum endpoints. Alexa REQUIRES this (PowerController) to show robotic vacuums in the app. Without it, Alexa commissions the device but never displays it. In Server Mode this is enabled automatically \u2014 only check this for bridge mode. WARNING: OnOff is NOT part of the Matter RVC device type specification. Enabling this may break Apple Home (shows 'Updating') and Google Home.",
@@ -165135,6 +165141,7 @@ function trimToLength(value, maxLength, suffix) {
165135
165141
  // src/matter/endpoints/server-mode-server-node.ts
165136
165142
  var ServerModeServerNode = class extends ServerNode {
165137
165143
  deviceEndpoint;
165144
+ featureFlags;
165138
165145
  constructor(env, bridgeData) {
165139
165146
  super({
165140
165147
  id: bridgeData.id,
@@ -165163,6 +165170,7 @@ var ServerModeServerNode = class extends ServerNode {
165163
165170
  persistenceEnabled: false
165164
165171
  }
165165
165172
  });
165173
+ this.featureFlags = bridgeData.featureFlags;
165166
165174
  }
165167
165175
  /**
165168
165176
  * Add the device endpoint to this server node.
@@ -165190,11 +165198,13 @@ var ServerModeServerNode = class extends ServerNode {
165190
165198
  * Without this, server-mode devices show bridge defaults (e.g. "riddix" / "MatterHub").
165191
165199
  */
165192
165200
  updateDeviceIdentity(entityId, device, mapping, friendlyName) {
165201
+ const nodeLabel = trimToLength(mapping?.customName, 32, "...") ?? trimToLength(friendlyName, 32, "...") ?? trimToLength(entityId, 32, "...");
165202
+ const productNameFromNodeLabel = this.featureFlags?.productNameFromNodeLabel === true ? nodeLabel : void 0;
165193
165203
  applyPatchState(this.state.basicInformation, {
165194
165204
  vendorName: trimToLength(mapping?.customVendorName, 32, "...") ?? trimToLength(device?.manufacturer, 32, "..."),
165195
- productName: trimToLength(mapping?.customProductName, 32, "...") ?? trimToLength(device?.model_id, 32, "...") ?? trimToLength(device?.model, 32, "..."),
165205
+ productName: trimToLength(mapping?.customProductName, 32, "...") ?? productNameFromNodeLabel ?? trimToLength(device?.model_id, 32, "...") ?? trimToLength(device?.model, 32, "..."),
165196
165206
  productLabel: trimToLength(device?.model, 64, "..."),
165197
- nodeLabel: trimToLength(mapping?.customName, 32, "...") ?? trimToLength(friendlyName, 32, "...") ?? trimToLength(entityId, 32, "..."),
165207
+ nodeLabel,
165198
165208
  serialNumber: trimToLength(mapping?.customSerialNumber, 32, "..."),
165199
165209
  hardwareVersionString: trimToLength(device?.hw_version, 64, "..."),
165200
165210
  softwareVersionString: trimToLength(device?.sw_version, 64, "...")
@@ -168067,20 +168077,22 @@ var BasicInformationServer2 = class extends BridgedDeviceBasicInformationServer
168067
168077
  if (!entity.state || !entity.state.attributes) {
168068
168078
  return;
168069
168079
  }
168070
- const { basicInformation } = this.env.get(BridgeDataProvider);
168080
+ const { basicInformation, featureFlags } = this.env.get(BridgeDataProvider);
168071
168081
  const homeAssistant = this.agent.get(HomeAssistantEntityBehavior);
168072
168082
  const device = entity.deviceRegistry;
168073
168083
  const mapping = homeAssistant.state.mapping;
168084
+ const nodeLabel = ellipse(32, homeAssistant.state.customName) ?? ellipse(32, entity.state?.attributes?.friendly_name) ?? ellipse(32, entity.entity_id);
168085
+ const productNameFromNodeLabel = featureFlags?.productNameFromNodeLabel === true ? nodeLabel : void 0;
168074
168086
  applyPatchState(this.state, {
168075
168087
  vendorId: VendorId(basicInformation.vendorId),
168076
168088
  vendorName: ellipse(32, mapping?.customVendorName) ?? ellipse(32, device?.manufacturer) ?? hash(32, basicInformation.vendorName),
168077
- productName: ellipse(32, mapping?.customProductName) ?? ellipse(32, device?.model_id) ?? ellipse(32, device?.model) ?? hash(32, basicInformation.productName),
168089
+ productName: ellipse(32, mapping?.customProductName) ?? productNameFromNodeLabel ?? ellipse(32, device?.model_id) ?? ellipse(32, device?.model) ?? hash(32, basicInformation.productName),
168078
168090
  productLabel: ellipse(64, device?.model) ?? hash(64, basicInformation.productLabel),
168079
168091
  hardwareVersion: basicInformation.hardwareVersion,
168080
168092
  softwareVersion: basicInformation.softwareVersion,
168081
168093
  hardwareVersionString: ellipse(64, device?.hw_version),
168082
168094
  softwareVersionString: ellipse(64, device?.sw_version),
168083
- nodeLabel: ellipse(32, homeAssistant.state.customName) ?? ellipse(32, entity.state?.attributes?.friendly_name) ?? ellipse(32, entity.entity_id),
168095
+ nodeLabel,
168084
168096
  reachable: entity.state?.state != null && entity.state.state !== "unavailable",
168085
168097
  serialNumber: ellipse(32, mapping?.customSerialNumber) ?? hash(32, entity.entity_id),
168086
168098
  // UniqueId helps controllers (especially Alexa) identify devices across