@homebridge-plugins/homebridge-wemo 7.5.0 → 7.5.2

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/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  All notable changes to `@homebridge-plugins/homebridge-wemo` will be documented in this file.
4
4
 
5
+ ## v7.5.2 (2026-07-14)
6
+
7
+ ### Changed
8
+
9
+ - fix: never pass the hidden wemo link accessory to the homebridge cache so saving no longer fails
10
+
11
+ ## v7.5.1 (2026-07-12)
12
+
13
+ ### Changed
14
+
15
+ - fix: clear wemo link subdevices from the pending list (#263)
16
+ - fix: show target temperature slider for heater and crockpot (#110)
17
+ - chore: update actions/checkout to v7
18
+ - chore: remove stray exit 1 from deprecation workflow
19
+ - chore: dependency updates
20
+ - docs: note homebridge v2 support in prerequisites
21
+
5
22
  ## v7.5.0 (2026-05-05)
6
23
 
7
24
  ### Changed
package/README.md CHANGED
@@ -34,7 +34,7 @@ Homebridge plugin to integrate Wemo devices into HomeKit
34
34
 
35
35
  - To use this plugin, you will need to already have:
36
36
  - [Node](https://nodejs.org): latest version of `v22` or `v24` - any other major version is not supported.
37
- - [Homebridge](https://homebridge.io): `v1.6` - refer to link for more information and installation instructions.
37
+ - [Homebridge](https://homebridge.io): `v1.6` or above - refer to link for more information and installation instructions.
38
38
  - For the UPnP connection, make sure your Homebridge instance has an allocated IP from the same IP network or VLAN as your Wemo devices. Otherwise, you should disable the UPnP connection to avoid connection errors.
39
39
 
40
40
  ### Setup
package/eslint.config.js CHANGED
@@ -35,7 +35,6 @@ export default antfu(
35
35
  'style/brace-style': ['error', '1tbs', { allowSingleLine: true }],
36
36
  'style/quote-props': ['error', 'consistent-as-needed'],
37
37
  'test/no-only-tests': 'error',
38
- 'unicorn/no-useless-spread': 'error',
39
38
  'unused-imports/no-unused-vars': ['error', { caughtErrors: 'none' }],
40
39
  },
41
40
  typescript: false,
@@ -27,12 +27,17 @@ export default class {
27
27
  .removeOnSet()
28
28
  .onSet(async value => this.internalStateUpdate(value))
29
29
 
30
- // Add options to the heater target state characteristic
31
- this.service.getCharacteristic(this.hapChar.TargetHeaterCoolerState).setProps({
32
- minValue: 0,
33
- maxValue: 0,
34
- validValues: [0],
35
- })
30
+ // Restrict the target state to HEAT so Apple Home shows a single target
31
+ // temperature slider. Locking it to AUTO makes newer Home versions expect a
32
+ // temperature range (two thresholds) and hide the slider entirely (#110).
33
+ this.service
34
+ .getCharacteristic(this.hapChar.TargetHeaterCoolerState)
35
+ .setProps({
36
+ minValue: 1,
37
+ maxValue: 1,
38
+ validValues: [1],
39
+ })
40
+ .updateValue(1)
36
41
 
37
42
  // Add the set handler and a range to the heater target temperature characteristic
38
43
  this.service
@@ -29,12 +29,17 @@ export default class {
29
29
  .removeOnSet()
30
30
  .onSet(async value => this.internalStateUpdate(value))
31
31
 
32
- // Add options to the heater target state characteristic
33
- this.service.getCharacteristic(this.hapChar.TargetHeaterCoolerState).setProps({
34
- minValue: 0,
35
- maxValue: 0,
36
- validValues: [0],
37
- })
32
+ // Restrict the target state to HEAT so Apple Home shows a single target
33
+ // temperature slider. Locking it to AUTO makes newer Home versions expect a
34
+ // temperature range (two thresholds) and hide the slider entirely (#110).
35
+ this.service
36
+ .getCharacteristic(this.hapChar.TargetHeaterCoolerState)
37
+ .setProps({
38
+ minValue: 1,
39
+ maxValue: 1,
40
+ validValues: [1],
41
+ })
42
+ .updateValue(1)
38
43
 
39
44
  // Add the set handler and a range to the heater target temperature characteristic
40
45
  this.service
package/lib/platform.js CHANGED
@@ -415,8 +415,7 @@ export default class {
415
415
  }
416
416
 
417
417
  // Update the changes to the accessory to the platform
418
- this.api.updatePlatformAccessories([accessory])
419
- devicesInHB.set(accessory.UUID, accessory)
418
+ this.saveAccessoryUpdate(accessory)
420
419
  })
421
420
 
422
421
  // Set up the listener server for device notifications
@@ -963,9 +962,15 @@ export default class {
963
962
  subAcc.context.upnpOnline = true
964
963
  }
965
964
 
965
+ // Remove the subdevice from the pending connection list, otherwise the
966
+ // 'still not been initially found' warning is logged for it indefinitely.
967
+ // Match both the raw and normalised serial as the list can contain either.
968
+ cacheSerialsToConnect = cacheSerialsToConnect.filter(
969
+ el => el !== subdevice.deviceId && el !== parseSerialNumber(subdevice.deviceId),
970
+ )
971
+
966
972
  // Update any changes to the accessory to the platform
967
- this.api.updatePlatformAccessories([subAcc])
968
- devicesInHB.set(uuidSub, subAcc)
973
+ this.saveAccessoryUpdate(subAcc)
969
974
  } catch (err) {
970
975
  // Catch any errors during the process
971
976
  const eText = parseError(err)
@@ -1234,14 +1239,27 @@ export default class {
1234
1239
  }
1235
1240
 
1236
1241
  // Update any changes to the accessory to the platform
1237
- this.api.updatePlatformAccessories([accessory])
1238
- devicesInHB.set(uuid, accessory)
1242
+ this.saveAccessoryUpdate(accessory)
1239
1243
  } catch (err) {
1240
1244
  // Catch any errors during the process
1241
1245
  this.log.warn('[%s] %s %s.', device.friendlyName, platformLang.devNotInit, parseError(err))
1242
1246
  }
1243
1247
  }
1244
1248
 
1249
+ saveAccessoryUpdate(accessory) {
1250
+ // Persist any context/characteristic changes to Homebridge, then keep the
1251
+ // accessory in our in-memory map. Hidden accessories (the Wemo Link hub) are
1252
+ // deliberately never registered (see addAccessory), so they have no associated
1253
+ // plugin, and Homebridge 2 adds any accessory passed to
1254
+ // updatePlatformAccessories to its cached list, where every cache save then
1255
+ // fails to serialize it ('Cannot serialize accessory ...'). We still keep them
1256
+ // in devicesInHB so lookups continue to work.
1257
+ if (!accessory.context.hidden) {
1258
+ this.api.updatePlatformAccessories([accessory])
1259
+ }
1260
+ devicesInHB.set(accessory.UUID, accessory)
1261
+ }
1262
+
1245
1263
  addAccessory(device, isPri, hidden = false) {
1246
1264
  const accName = device.friendlyName || device.deviceId || device.serialNumber
1247
1265
  try {
@@ -1321,8 +1339,7 @@ export default class {
1321
1339
 
1322
1340
  // Remove the accessory from the pending connection list
1323
1341
  existSerialsToConnect = existSerialsToConnect.filter(el => el !== deviceData.serialNumber)
1324
- this.api.updatePlatformAccessories([accessory])
1325
- devicesInHB.set(accessory.UUID, accessory)
1342
+ this.saveAccessoryUpdate(accessory)
1326
1343
  }
1327
1344
 
1328
1345
  disableUPNP(accessory, err) {
@@ -1336,8 +1353,7 @@ export default class {
1336
1353
  existSerialsToConnect.push(accessory.context.serialNumber)
1337
1354
 
1338
1355
  // Update any changes to the accessory to the platform
1339
- this.api.updatePlatformAccessories([accessory])
1340
- devicesInHB.set(accessory.UUID, accessory)
1356
+ this.saveAccessoryUpdate(accessory)
1341
1357
 
1342
1358
  // Perform a http poll to see if the device is still reachable
1343
1359
  if (accessory.control?.requestDeviceUpdate) {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@homebridge-plugins/homebridge-wemo",
3
3
  "alias": "Wemo",
4
4
  "type": "module",
5
- "version": "7.5.0",
5
+ "version": "7.5.2",
6
6
  "description": "Homebridge plugin to integrate Wemo devices into HomeKit.",
7
7
  "author": {
8
8
  "name": "bwp91",
@@ -55,15 +55,15 @@
55
55
  "lint:fix": "npm run lint -- --fix"
56
56
  },
57
57
  "dependencies": {
58
- "@homebridge/plugin-ui-utils": "^2.2.3",
59
- "axios": "^1.16.0",
58
+ "@homebridge/plugin-ui-utils": "^2.2.5",
59
+ "axios": "^1.18.1",
60
60
  "ip": "^2.0.1",
61
61
  "node-ssdp": "^4.0.1",
62
- "p-queue": "^9.2.0",
62
+ "p-queue": "^9.3.1",
63
63
  "xml2js": "^0.6.2",
64
64
  "xmlbuilder": "^15.1.1"
65
65
  },
66
66
  "devDependencies": {
67
- "@antfu/eslint-config": "^8.2.0"
67
+ "@antfu/eslint-config": "^9.1.0"
68
68
  }
69
69
  }