@riddix/hamh 2.1.0-alpha.853 → 2.1.0-alpha.854

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
@@ -19,9 +19,9 @@
19
19
  ---
20
20
 
21
21
  > [!NOTE]
22
- > 🔀 **Community Fork** - This is a fork of the original [t0bst4r/home-assistant-matter-hub](https://github.com/t0bst4r/home-assistant-matter-hub), which was discontinued in January 2026. We continue active development with bug fixes, new features, and community support. Thank you **[@t0bst4r](https://github.com/t0bst4r)** for the original work! ❤️
22
+ > 🔀 **Community Fork** - This is the actively maintained fork and successor of the original [t0bst4r/home-assistant-matter-hub](https://github.com/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](https://github.com/t0bst4r)** for the original work! ❤️
23
23
  >
24
- > **📦 Migrating?** See [Migration Guide](#migration-from-t0bst4r) - your paired devices will continue to work!
24
+ > **📦 Migrating?** See [Migration Guide](#migration-from-t0bst4r) - your paired devices will continue to work! For a side-by-side feature list, see the [fork comparison](https://riddix.github.io/home-assistant-matter-hub/getting-started/fork-comparison). The add-on slugs are `hamh` (stable), `hamh-alpha` and `hamh-testing`.
25
25
 
26
26
  ---
27
27
 
@@ -133493,6 +133493,8 @@ WARNING: ${includeIdentity ? "This backup contains sensitive Matter identity dat
133493
133493
  lockPinMaxLength: config8.lockPinMaxLength,
133494
133494
  powerEntity: config8.powerEntity,
133495
133495
  energyEntity: config8.energyEntity,
133496
+ meterSerialNumber: config8.meterSerialNumber,
133497
+ pointOfDelivery: config8.pointOfDelivery,
133496
133498
  voltageEntity: config8.voltageEntity,
133497
133499
  currentEntity: config8.currentEntity,
133498
133500
  batteryPowerEntity: config8.batteryPowerEntity,
@@ -133657,6 +133659,8 @@ WARNING: ${includeIdentity ? "This backup contains sensitive Matter identity dat
133657
133659
  lockPinMaxLength: config8.lockPinMaxLength,
133658
133660
  powerEntity: config8.powerEntity,
133659
133661
  energyEntity: config8.energyEntity,
133662
+ meterSerialNumber: config8.meterSerialNumber,
133663
+ pointOfDelivery: config8.pointOfDelivery,
133660
133664
  voltageEntity: config8.voltageEntity,
133661
133665
  currentEntity: config8.currentEntity,
133662
133666
  batteryPowerEntity: config8.batteryPowerEntity,
@@ -134512,6 +134516,8 @@ function entityMappingApi(mappingStorage, identityStorage) {
134512
134516
  lockPinMaxLength: body.lockPinMaxLength,
134513
134517
  powerEntity: body.powerEntity,
134514
134518
  energyEntity: body.energyEntity,
134519
+ meterSerialNumber: body.meterSerialNumber,
134520
+ pointOfDelivery: body.pointOfDelivery,
134515
134521
  voltageEntity: body.voltageEntity,
134516
134522
  currentEntity: body.currentEntity,
134517
134523
  batteryPowerEntity: body.batteryPowerEntity,
@@ -135016,6 +135022,8 @@ function configToProfileEntry(config8) {
135016
135022
  lockPinMaxLength: config8.lockPinMaxLength,
135017
135023
  powerEntity: config8.powerEntity,
135018
135024
  energyEntity: config8.energyEntity,
135025
+ meterSerialNumber: config8.meterSerialNumber,
135026
+ pointOfDelivery: config8.pointOfDelivery,
135019
135027
  voltageEntity: config8.voltageEntity,
135020
135028
  currentEntity: config8.currentEntity,
135021
135029
  batteryPowerEntity: config8.batteryPowerEntity,
@@ -135158,6 +135166,8 @@ function mappingProfileApi(mappingStorage) {
135158
135166
  lockPinMaxLength: entry.lockPinMaxLength,
135159
135167
  powerEntity: entry.powerEntity,
135160
135168
  energyEntity: entry.energyEntity,
135169
+ meterSerialNumber: entry.meterSerialNumber,
135170
+ pointOfDelivery: entry.pointOfDelivery,
135161
135171
  voltageEntity: entry.voltageEntity,
135162
135172
  currentEntity: entry.currentEntity,
135163
135173
  batteryPowerEntity: entry.batteryPowerEntity,
@@ -139936,6 +139946,8 @@ var EntityMappingStorage = class extends Service {
139936
139946
  lockPinMaxLength: pinLengths.max,
139937
139947
  powerEntity: request.powerEntity?.trim() || void 0,
139938
139948
  energyEntity: request.energyEntity?.trim() || void 0,
139949
+ meterSerialNumber: request.meterSerialNumber?.trim() || void 0,
139950
+ pointOfDelivery: request.pointOfDelivery?.trim() || void 0,
139939
139951
  voltageEntity: request.voltageEntity?.trim() || void 0,
139940
139952
  currentEntity: request.currentEntity?.trim() || void 0,
139941
139953
  batteryPowerEntity: request.batteryPowerEntity?.trim() || void 0,
@@ -139971,7 +139983,7 @@ var EntityMappingStorage = class extends Service {
139971
139983
  composedEntities: request.composedEntities?.filter((e) => e.entityId?.trim()) ?? void 0,
139972
139984
  disableMomentaryFlip: request.disableMomentaryFlip || void 0
139973
139985
  };
139974
- if (!config8.matterDeviceType && !config8.customName && !config8.customProductName && !config8.customVendorName && !config8.customSerialNumber && config8.customVendorId === void 0 && config8.disabled !== true && !config8.filterLifeEntity && !config8.cleaningModeEntity && !config8.temperatureEntity && !config8.humidityEntity && !config8.batteryEntity && !config8.disableBatteryMapping && !config8.chargingStateEntity && !config8.roomEntities && !config8.disableLockPin && !config8.lockUsercodeService && config8.lockUsercodeSlot === void 0 && config8.lockPinMinLength === void 0 && config8.lockPinMaxLength === void 0 && !config8.powerEntity && !config8.energyEntity && !config8.voltageEntity && !config8.currentEntity && !config8.batteryPowerEntity && !config8.batteryEnergyEntity && !config8.chargingSwitchEntity && !config8.currentLimitEntity && !config8.pressureEntity && !config8.suctionLevelEntity && !config8.mopIntensityEntity && (!config8.customServiceAreas || config8.customServiceAreas.length === 0) && (!config8.customFanSpeedTags || Object.keys(config8.customFanSpeedTags).length === 0) && (!config8.fanWindPresets || (config8.fanWindPresets.natural?.length ?? 0) === 0 && (config8.fanWindPresets.sleep?.length ?? 0) === 0) && !config8.fanRestoreSpeedOnPowerOn && !config8.currentRoomEntity && !config8.cleanedAreaEntity && !config8.vacuumAscendingRoomOrder && !config8.disableCustomAreaRoomModes && !config8.valetudoIdentifier && !config8.coverSwapOpenClose && !config8.coverExposeAsDimmableLight && !config8.selectExposeAsSwitch && !config8.selectSwitchOnOption && !config8.selectSwitchOffOption && !config8.coverSliderDebounceMs && !config8.updateThrottleMs && !config8.disableClimateOnOff && !config8.disableClimateFanControl && !config8.climateKeepModeOnIdle && !config8.climateExposeFan && !config8.climateAutoMode && (!config8.composedEntities || config8.composedEntities.length === 0) && !config8.disableMomentaryFlip) {
139986
+ if (!config8.matterDeviceType && !config8.customName && !config8.customProductName && !config8.customVendorName && !config8.customSerialNumber && config8.customVendorId === void 0 && config8.disabled !== true && !config8.filterLifeEntity && !config8.cleaningModeEntity && !config8.temperatureEntity && !config8.humidityEntity && !config8.batteryEntity && !config8.disableBatteryMapping && !config8.chargingStateEntity && !config8.roomEntities && !config8.disableLockPin && !config8.lockUsercodeService && config8.lockUsercodeSlot === void 0 && config8.lockPinMinLength === void 0 && config8.lockPinMaxLength === void 0 && !config8.powerEntity && !config8.energyEntity && !config8.meterSerialNumber && !config8.pointOfDelivery && !config8.voltageEntity && !config8.currentEntity && !config8.batteryPowerEntity && !config8.batteryEnergyEntity && !config8.chargingSwitchEntity && !config8.currentLimitEntity && !config8.pressureEntity && !config8.suctionLevelEntity && !config8.mopIntensityEntity && (!config8.customServiceAreas || config8.customServiceAreas.length === 0) && (!config8.customFanSpeedTags || Object.keys(config8.customFanSpeedTags).length === 0) && (!config8.fanWindPresets || (config8.fanWindPresets.natural?.length ?? 0) === 0 && (config8.fanWindPresets.sleep?.length ?? 0) === 0) && !config8.fanRestoreSpeedOnPowerOn && !config8.currentRoomEntity && !config8.cleanedAreaEntity && !config8.vacuumAscendingRoomOrder && !config8.disableCustomAreaRoomModes && !config8.valetudoIdentifier && !config8.coverSwapOpenClose && !config8.coverExposeAsDimmableLight && !config8.selectExposeAsSwitch && !config8.selectSwitchOnOption && !config8.selectSwitchOffOption && !config8.coverSliderDebounceMs && !config8.updateThrottleMs && !config8.disableClimateOnOff && !config8.disableClimateFanControl && !config8.climateKeepModeOnIdle && !config8.climateExposeFan && !config8.climateAutoMode && (!config8.composedEntities || config8.composedEntities.length === 0) && !config8.disableMomentaryFlip) {
139975
139987
  bridgeMap.delete(request.entityId);
139976
139988
  } else {
139977
139989
  bridgeMap.set(request.entityId, config8);
@@ -149611,6 +149623,7 @@ var DoorbellDeviceDefinition = MutableEndpoint({
149611
149623
  behaviors: SupportedBehaviors(DoorbellRequirements.server.mandatory.Identify)
149612
149624
  });
149613
149625
  Object.freeze(DoorbellDeviceDefinition);
149626
+ var DoorbellDevice = DoorbellDeviceDefinition;
149614
149627
 
149615
149628
  // ../../node_modules/.pnpm/@matter+types@0.17.9/node_modules/@matter/types/dist/esm/clusters/commodity-price.js
149616
149629
  init_ClusterType();
@@ -149834,6 +149847,7 @@ var ElectricalUtilityMeterDeviceDefinition = MutableEndpoint({
149834
149847
  behaviors: SupportedBehaviors(ElectricalUtilityMeterRequirements.server.mandatory.MeterIdentification)
149835
149848
  });
149836
149849
  Object.freeze(ElectricalUtilityMeterDeviceDefinition);
149850
+ var ElectricalUtilityMeterDevice = ElectricalUtilityMeterDeviceDefinition;
149837
149851
 
149838
149852
  // ../../node_modules/.pnpm/@matter+types@0.17.9/node_modules/@matter/types/dist/esm/clusters/energy-evse.js
149839
149853
  init_ClusterType();
@@ -164991,6 +165005,9 @@ var HaGenericSwitchServer = HaGenericSwitchServerMultiBase.set({
164991
165005
  multiPressMax: 3
164992
165006
  });
164993
165007
 
165008
+ // src/matter/endpoints/legacy/event/doorbell.ts
165009
+ init_home_assistant_entity_behavior();
165010
+
164994
165011
  // src/matter/endpoints/legacy/event/index.ts
164995
165012
  init_home_assistant_entity_behavior();
164996
165013
  var EventEndpointTypeMulti = GenericSwitchDevice.with(
@@ -165033,6 +165050,33 @@ function EventDevice(homeAssistantEntity) {
165033
165050
  });
165034
165051
  }
165035
165052
 
165053
+ // src/matter/endpoints/legacy/event/doorbell.ts
165054
+ var DoorbellEndpointTypeMulti = DoorbellDevice.with(
165055
+ BasicInformationServer2,
165056
+ IdentifyServer2,
165057
+ HomeAssistantEntityBehavior,
165058
+ HaGenericSwitchServer
165059
+ );
165060
+ var DoorbellEndpointTypeSimple = DoorbellDevice.with(
165061
+ BasicInformationServer2,
165062
+ IdentifyServer2,
165063
+ HomeAssistantEntityBehavior,
165064
+ HaGenericSwitchServerSimple
165065
+ );
165066
+ function DoorbellDevice2(homeAssistantEntity) {
165067
+ const attrs = homeAssistantEntity.entity.state.attributes;
165068
+ const multiPressMax = detectMultiPressMax(attrs.event_types ?? []);
165069
+ if (multiPressMax >= 2) {
165070
+ return DoorbellEndpointTypeMulti.set({
165071
+ homeAssistantEntity,
165072
+ switch: { multiPressMax }
165073
+ });
165074
+ }
165075
+ return DoorbellEndpointTypeSimple.set({
165076
+ homeAssistantEntity
165077
+ });
165078
+ }
165079
+
165036
165080
  // src/matter/endpoints/legacy/fan/index.ts
165037
165081
  init_dist();
165038
165082
  init_home_assistant_entity_behavior();
@@ -168613,6 +168657,38 @@ var ElectricalMeterType = ElectricalMeterDevice.with(
168613
168657
  HaPowerTopologyServer
168614
168658
  );
168615
168659
 
168660
+ // src/matter/endpoints/legacy/sensor/devices/electrical-utility-meter.ts
168661
+ init_home_assistant_entity_behavior();
168662
+ var HaMeterIdentificationServer = class extends MeterIdentificationServer {
168663
+ async initialize() {
168664
+ await super.initialize();
168665
+ const homeAssistant = await this.agent.load(HomeAssistantEntityBehavior);
168666
+ const mapping = homeAssistant.state.mapping;
168667
+ applyPatchState(this.state, {
168668
+ meterSerialNumber: mapping?.meterSerialNumber ?? null,
168669
+ pointOfDelivery: mapping?.pointOfDelivery ?? null
168670
+ });
168671
+ }
168672
+ };
168673
+ ((HaMeterIdentificationServer2) => {
168674
+ class State extends MeterIdentificationServer.State {
168675
+ }
168676
+ HaMeterIdentificationServer2.State = State;
168677
+ })(HaMeterIdentificationServer || (HaMeterIdentificationServer = {}));
168678
+ var ElectricalUtilityMeterType = ElectricalUtilityMeterDevice.with(
168679
+ BasicInformationServer2,
168680
+ IdentifyServer2,
168681
+ HomeAssistantEntityBehavior,
168682
+ HaMeterIdentificationServer.set({
168683
+ meterType: null,
168684
+ pointOfDelivery: null,
168685
+ meterSerialNumber: null
168686
+ }),
168687
+ PowerServer,
168688
+ EnergyServer,
168689
+ HaPowerTopologyServer
168690
+ );
168691
+
168616
168692
  // src/matter/endpoints/legacy/sensor/devices/energy-evse.ts
168617
168693
  init_esm();
168618
168694
  init_home_assistant_actions();
@@ -173433,6 +173509,8 @@ var matterDeviceTypeFactories = {
173433
173509
  // Legacy SolarPower alias, kept for existing mappings.
173434
173510
  electrical_sensor: (ha) => ElectricalSensorType.set({ homeAssistantEntity: ha }),
173435
173511
  solar_power: (ha) => ElectricalSensorType.set({ homeAssistantEntity: ha }),
173512
+ // Matter 1.4 utility meter (0x0511), opt-in so existing pairings keep 0x0514.
173513
+ electrical_utility_meter: (ha) => ElectricalUtilityMeterType.set({ homeAssistantEntity: ha }),
173436
173514
  evse: (ha) => energyEvseType().set({ homeAssistantEntity: ha }),
173437
173515
  contact_sensor: (ha) => ContactSensorType.set({ homeAssistantEntity: ha }),
173438
173516
  motion_sensor: (ha) => MotionSensorType.set({ homeAssistantEntity: ha }),
@@ -173444,6 +173522,7 @@ var matterDeviceTypeFactories = {
173444
173522
  water_heater: WaterHeaterDevice2,
173445
173523
  water_heater_management: WaterHeaterManagementDevice,
173446
173524
  generic_switch: EventDevice,
173525
+ doorbell: DoorbellDevice2,
173447
173526
  smoke_co_alarm: (ha) => SmokeAlarmType.set({ homeAssistantEntity: ha }),
173448
173527
  water_freeze_detector: (ha) => WaterFreezeDetectorType.set({ homeAssistantEntity: ha }),
173449
173528
  water_leak_detector: (ha) => WaterLeakDetectorType.set({ homeAssistantEntity: ha })