@riddix/hamh 2.1.0-alpha.767 → 2.1.0-alpha.768

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.
@@ -126316,6 +126316,7 @@ WARNING: ${includeIdentity ? "This backup contains sensitive Matter identity dat
126316
126316
  climateAutoMode: config11.climateAutoMode,
126317
126317
  customServiceAreas: config11.customServiceAreas,
126318
126318
  customFanSpeedTags: config11.customFanSpeedTags,
126319
+ fanWindPresets: config11.fanWindPresets,
126319
126320
  composedEntities: config11.composedEntities
126320
126321
  });
126321
126322
  mappingsRestored++;
@@ -126466,6 +126467,7 @@ WARNING: ${includeIdentity ? "This backup contains sensitive Matter identity dat
126466
126467
  climateAutoMode: config11.climateAutoMode,
126467
126468
  customServiceAreas: config11.customServiceAreas,
126468
126469
  customFanSpeedTags: config11.customFanSpeedTags,
126470
+ fanWindPresets: config11.fanWindPresets,
126469
126471
  composedEntities: config11.composedEntities
126470
126472
  });
126471
126473
  mappingsRestored++;
@@ -127300,6 +127302,7 @@ function entityMappingApi(mappingStorage) {
127300
127302
  mopIntensityEntity: body.mopIntensityEntity,
127301
127303
  customServiceAreas: body.customServiceAreas,
127302
127304
  customFanSpeedTags: body.customFanSpeedTags,
127305
+ fanWindPresets: body.fanWindPresets,
127303
127306
  currentRoomEntity: body.currentRoomEntity,
127304
127307
  cleanedAreaEntity: body.cleanedAreaEntity,
127305
127308
  disableCustomAreaRoomModes: body.disableCustomAreaRoomModes,
@@ -127785,6 +127788,7 @@ function configToProfileEntry(config11) {
127785
127788
  mopIntensityEntity: config11.mopIntensityEntity,
127786
127789
  customServiceAreas: config11.customServiceAreas,
127787
127790
  customFanSpeedTags: config11.customFanSpeedTags,
127791
+ fanWindPresets: config11.fanWindPresets,
127788
127792
  valetudoIdentifier: config11.valetudoIdentifier,
127789
127793
  coverSwapOpenClose: config11.coverSwapOpenClose,
127790
127794
  coverSliderDebounceMs: config11.coverSliderDebounceMs,
@@ -127912,6 +127916,7 @@ function mappingProfileApi(mappingStorage) {
127912
127916
  mopIntensityEntity: entry.mopIntensityEntity,
127913
127917
  customServiceAreas: entry.customServiceAreas,
127914
127918
  customFanSpeedTags: entry.customFanSpeedTags,
127919
+ fanWindPresets: entry.fanWindPresets,
127915
127920
  valetudoIdentifier: entry.valetudoIdentifier,
127916
127921
  coverSwapOpenClose: entry.coverSwapOpenClose,
127917
127922
  coverSliderDebounceMs: entry.coverSliderDebounceMs,
@@ -132068,6 +132073,7 @@ var EntityMappingStorage = class extends Service {
132068
132073
  (a) => a.name?.trim() && a.service?.trim()
132069
132074
  ) ?? void 0,
132070
132075
  customFanSpeedTags: request.customFanSpeedTags && Object.keys(request.customFanSpeedTags).length > 0 ? request.customFanSpeedTags : void 0,
132076
+ fanWindPresets: request.fanWindPresets && ((request.fanWindPresets.natural?.length ?? 0) > 0 || (request.fanWindPresets.sleep?.length ?? 0) > 0) ? request.fanWindPresets : void 0,
132071
132077
  currentRoomEntity: request.currentRoomEntity?.trim() || void 0,
132072
132078
  cleanedAreaEntity: request.cleanedAreaEntity?.trim() || void 0,
132073
132079
  disableCustomAreaRoomModes: request.disableCustomAreaRoomModes || void 0,
@@ -132083,7 +132089,7 @@ var EntityMappingStorage = class extends Service {
132083
132089
  climateAutoMode: request.climateAutoMode || void 0,
132084
132090
  composedEntities: request.composedEntities?.filter((e) => e.entityId?.trim()) ?? void 0
132085
132091
  };
132086
- if (!config11.matterDeviceType && !config11.customName && !config11.customProductName && !config11.customVendorName && !config11.customSerialNumber && config11.customVendorId === void 0 && config11.disabled !== true && !config11.filterLifeEntity && !config11.cleaningModeEntity && !config11.temperatureEntity && !config11.humidityEntity && !config11.batteryEntity && !config11.chargingStateEntity && !config11.roomEntities && !config11.disableLockPin && !config11.powerEntity && !config11.energyEntity && !config11.pressureEntity && !config11.suctionLevelEntity && !config11.mopIntensityEntity && (!config11.customServiceAreas || config11.customServiceAreas.length === 0) && (!config11.customFanSpeedTags || Object.keys(config11.customFanSpeedTags).length === 0) && !config11.currentRoomEntity && !config11.cleanedAreaEntity && !config11.disableCustomAreaRoomModes && !config11.valetudoIdentifier && !config11.coverSwapOpenClose && !config11.coverExposeAsDimmableLight && !config11.coverSliderDebounceMs && !config11.updateThrottleMs && !config11.disableClimateOnOff && !config11.disableClimateFanControl && !config11.climateKeepModeOnIdle && !config11.climateExposeFan && !config11.climateAutoMode && (!config11.composedEntities || config11.composedEntities.length === 0)) {
132092
+ if (!config11.matterDeviceType && !config11.customName && !config11.customProductName && !config11.customVendorName && !config11.customSerialNumber && config11.customVendorId === void 0 && config11.disabled !== true && !config11.filterLifeEntity && !config11.cleaningModeEntity && !config11.temperatureEntity && !config11.humidityEntity && !config11.batteryEntity && !config11.chargingStateEntity && !config11.roomEntities && !config11.disableLockPin && !config11.powerEntity && !config11.energyEntity && !config11.pressureEntity && !config11.suctionLevelEntity && !config11.mopIntensityEntity && (!config11.customServiceAreas || config11.customServiceAreas.length === 0) && (!config11.customFanSpeedTags || Object.keys(config11.customFanSpeedTags).length === 0) && (!config11.fanWindPresets || (config11.fanWindPresets.natural?.length ?? 0) === 0 && (config11.fanWindPresets.sleep?.length ?? 0) === 0) && !config11.currentRoomEntity && !config11.cleanedAreaEntity && !config11.disableCustomAreaRoomModes && !config11.valetudoIdentifier && !config11.coverSwapOpenClose && !config11.coverExposeAsDimmableLight && !config11.coverSliderDebounceMs && !config11.updateThrottleMs && !config11.disableClimateOnOff && !config11.disableClimateFanControl && !config11.climateKeepModeOnIdle && !config11.climateExposeFan && !config11.climateAutoMode && (!config11.composedEntities || config11.composedEntities.length === 0)) {
132087
132093
  bridgeMap.delete(request.entityId);
132088
132094
  } else {
132089
132095
  bridgeMap.set(request.entityId, config11);
@@ -151243,7 +151249,14 @@ function FanControlServer2(config11, defaults = {}) {
151243
151249
  }
151244
151250
 
151245
151251
  // src/matter/endpoints/legacy/fan/behaviors/fan-fan-control-server.ts
151252
+ init_home_assistant_entity_behavior();
151246
151253
  var attributes2 = (e) => e.attributes;
151254
+ var windPresets = (agent) => agent.get(HomeAssistantEntityBehavior).state.mapping?.fanWindPresets ?? {};
151255
+ var isEnglishNatural = (m) => {
151256
+ const lower = m.toLowerCase();
151257
+ return lower === "natural" || lower === "nature";
151258
+ };
151259
+ var isEnglishSleep = (m) => m.toLowerCase() === "sleep";
151247
151260
  var fanControlConfig = {
151248
151261
  getPercentage: (state) => state.state === "off" ? 0 : attributes2(state).percentage,
151249
151262
  getStepSize: (state) => attributes2(state).percentage_step,
@@ -151262,17 +151275,22 @@ var fanControlConfig = {
151262
151275
  attributes2(state).supported_features ?? 0,
151263
151276
  FanDeviceFeature.OSCILLATE
151264
151277
  ),
151265
- // Wind mode support - check if preset_modes contains natural/sleep
151266
- getWindMode: (state) => {
151267
- const mode = attributes2(state).preset_mode?.toLowerCase();
151268
- if (mode === "natural" || mode === "nature") return "natural";
151269
- if (mode === "sleep") return "sleep";
151278
+ // Wind mode support - localized presets via mapping, english as fallback
151279
+ getWindMode: (state, agent) => {
151280
+ const mode = attributes2(state).preset_mode;
151281
+ if (!mode) return void 0;
151282
+ const presets = windPresets(agent);
151283
+ if (presets.natural?.includes(mode)) return "natural";
151284
+ if (presets.sleep?.includes(mode)) return "sleep";
151285
+ if (isEnglishNatural(mode)) return "natural";
151286
+ if (isEnglishSleep(mode)) return "sleep";
151270
151287
  return void 0;
151271
151288
  },
151272
- supportsWind: (state) => {
151289
+ supportsWind: (state, agent) => {
151273
151290
  const modes = attributes2(state).preset_modes ?? [];
151291
+ const presets = windPresets(agent);
151274
151292
  return modes.some(
151275
- (m) => m.toLowerCase() === "natural" || m.toLowerCase() === "nature" || m.toLowerCase() === "sleep"
151293
+ (m) => isEnglishNatural(m) || isEnglishSleep(m) || !!presets.natural?.includes(m) || !!presets.sleep?.includes(m)
151276
151294
  );
151277
151295
  },
151278
151296
  turnOff: () => ({ action: "fan.turn_off" }),
@@ -151295,12 +151313,29 @@ var fanControlConfig = {
151295
151313
  action: "fan.oscillate",
151296
151314
  data: { oscillating }
151297
151315
  }),
151298
- setWindMode: (mode) => ({
151299
- action: "fan.set_preset_mode",
151300
- data: {
151301
- preset_mode: mode === "natural" ? "Natural" : mode === "sleep" ? "Sleep" : "Normal"
151316
+ setWindMode: (mode, agent) => {
151317
+ const presets = windPresets(agent);
151318
+ let presetMode;
151319
+ if (mode === "natural") {
151320
+ presetMode = presets.natural?.[0] ?? "Natural";
151321
+ } else if (mode === "sleep") {
151322
+ presetMode = presets.sleep?.[0] ?? "Sleep";
151323
+ } else {
151324
+ const wind = /* @__PURE__ */ new Set([
151325
+ ...presets.natural ?? [],
151326
+ ...presets.sleep ?? []
151327
+ ]);
151328
+ const entityState = agent.get(HomeAssistantEntityBehavior).state.entity.state;
151329
+ const modes = attributes2(entityState).preset_modes ?? [];
151330
+ presetMode = modes.find(
151331
+ (m) => !wind.has(m) && !isEnglishNatural(m) && !isEnglishSleep(m)
151332
+ ) ?? "Normal";
151302
151333
  }
151303
- })
151334
+ return {
151335
+ action: "fan.set_preset_mode",
151336
+ data: { preset_mode: presetMode }
151337
+ };
151338
+ }
151304
151339
  };
151305
151340
  var FanFanControlServer = FanControlServer2(fanControlConfig);
151306
151341
 
@@ -155164,8 +155199,9 @@ function FanDevice2(homeAssistantEntity) {
155164
155199
  if (testBit(supportedFeatures, FanDeviceFeature.OSCILLATE)) {
155165
155200
  features3.add("Rocking");
155166
155201
  }
155202
+ const windPresets2 = homeAssistantEntity.mapping?.fanWindPresets;
155167
155203
  const hasWindModes = presetModes.some(
155168
- (m) => m.toLowerCase() === "natural" || m.toLowerCase() === "nature" || m.toLowerCase() === "sleep"
155204
+ (m) => m.toLowerCase() === "natural" || m.toLowerCase() === "nature" || m.toLowerCase() === "sleep" || !!windPresets2?.natural?.includes(m) || !!windPresets2?.sleep?.includes(m)
155169
155205
  );
155170
155206
  if (hasWindModes) {
155171
155207
  features3.add("Wind");