@homebridge-plugins/homebridge-govee 11.27.1-beta.0 → 11.27.1

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,10 +2,16 @@
2
2
 
3
3
  All notable changes to `@homebridge-plugins/homebridge-govee` will be documented in this file.
4
4
 
5
- ## v11.27.1 (Pending Release)
5
+ ## v11.27.1 (2026-07-15)
6
6
 
7
- ### Changes
7
+ ### Changed
8
8
 
9
+ - fix: do not treat lights controllable via the openapi as bluetooth only (#1263) (@methodicallychaotic)
10
+ - fix: do not initialise matter-ignored devices found on the lan (#1315)
11
+ - fix: never pass external accessories to the homebridge cache so saving no longer fails
12
+ - chore: remove the looking-for-maintainers message
13
+ - fix: restore the online status update helper for thermo and leak sensors (#1317)
14
+ - fix: skip app device groups found in the http device list (#1317)
9
15
  - fix: only treat fresh real-time gateway records as leak events, not periodic sync records (#1314)
10
16
 
11
17
  ## v11.27.0 (2026-07-13)
package/README.md CHANGED
@@ -24,8 +24,6 @@ Homebridge plugin to integrate Govee devices into HomeKit
24
24
  - can control certain models locally via LAN control without any Govee credentials
25
25
  - may use different connection methods depending on device model and account capabilities
26
26
 
27
- > I'm looking for some lovely people to help maintain this plugin, please get in touch on GitHub or Discord if you'd like to help out 😄
28
-
29
27
  ### Prerequisites
30
28
 
31
29
  - To use this plugin, you will need to already have:
@@ -27,7 +27,7 @@ export default class {
27
27
  this.colourSafeMode = platform.config.colourSafeMode
28
28
  this.minKelvin = accessory.context?.supportedCmdsOpts?.colorTem?.range?.min || 2000
29
29
  this.maxKelvin = accessory.context?.supportedCmdsOpts?.colorTem?.range?.max || 9000
30
- this.isBLEOnly = !accessory.context.useAwsControl && !accessory.context.useLanControl
30
+ this.isBLEOnly = !accessory.context.useAwsControl && !accessory.context.useLanControl && !accessory.context.useOpenApiControl
31
31
 
32
32
  // Set up custom variables for this device type
33
33
  const deviceConf = platform.deviceConf[accessory.context.gvDeviceId] || {}
package/lib/platform.js CHANGED
@@ -600,6 +600,12 @@ export default class {
600
600
  return
601
601
  }
602
602
 
603
+ // Skip Govee app device groups as these are not real devices (#1309)
604
+ if (['BaseGroup', 'SameModeGroup'].includes(httpDevice.sku)) {
605
+ this.log.debug('[%s] %s.', httpDevice.deviceName, platformLang.devIsGroup)
606
+ return
607
+ }
608
+
603
609
  // Check it's not a matter-ignored device, if the config has been set
604
610
  if (platformConsts.matterModels.includes(httpDevice.sku) && this.config.ignoreMatter) {
605
611
  return
@@ -705,6 +711,14 @@ export default class {
705
711
  return
706
712
  }
707
713
 
714
+ // Check it's not a matter-ignored device, if the config has been set, since a
715
+ // device skipped by the http/openapi loops for this reason still has an
716
+ // unmatched lan record, which would otherwise be added here and then removed
717
+ // again by the cleanup below on every restart (#1315)
718
+ if (this.config.ignoreMatter && platformConsts.matterModels.includes(lanDevice.sku)) {
719
+ return
720
+ }
721
+
708
722
  // Initialise the device into Homebridge
709
723
  // Since LAN does not provide a name, we will use the configured label or device id
710
724
  this.initialiseDevice({
@@ -874,7 +888,7 @@ export default class {
874
888
  this.logConnectionSummary()
875
889
 
876
890
  // Setup successful
877
- this.log('%s. %s', platformLang.complete, platformLang.welcome)
891
+ this.log('%s.', platformLang.complete)
878
892
  } catch (err) {
879
893
  // Catch any errors during setup
880
894
  this.log.warn('***** %s [v%s]. *****', platformLang.disabling, plugin.version)
@@ -1415,7 +1429,9 @@ export default class {
1415
1429
  )
1416
1430
 
1417
1431
  // Update any changes to the accessory to the platform
1418
- this.api.updatePlatformAccessories([accessory])
1432
+ if (!accessory.context.isExternal) {
1433
+ this.api.updatePlatformAccessories([accessory])
1434
+ }
1419
1435
  devicesInHB.set(accessory.UUID, accessory)
1420
1436
  } catch (err) {
1421
1437
  // Catch any errors during device initialisation
@@ -1650,6 +1666,12 @@ export default class {
1650
1666
  .setCharacteristic(this.api.hap.Characteristic.Model, device.model)
1651
1667
  .setCharacteristic(this.api.hap.Characteristic.Identify, true)
1652
1668
 
1669
+ // Mark the accessory as external so it is never passed to
1670
+ // updatePlatformAccessories, since Homebridge 2 adds any accessory passed
1671
+ // there to its cached list, and an external accessory has no associated
1672
+ // platform so every cache save then fails to serialize it
1673
+ accessory.context.isExternal = true
1674
+
1653
1675
  // Register the accessory
1654
1676
  this.api.publishExternalAccessories(plugin.name, [accessory])
1655
1677
  this.log('[%s] %s.', device.name, platformLang.devAdd)
@@ -1679,6 +1701,24 @@ export default class {
1679
1701
  devicesInHB.set(accessory.UUID, accessory)
1680
1702
  }
1681
1703
 
1704
+ updateAccessoryStatus(accessory, newStatus) {
1705
+ // Log the change, at a warning level if the device is reported offline
1706
+ if (newStatus) {
1707
+ accessory.log(platformLang.onlineHTTP)
1708
+ } else {
1709
+ accessory.logWarn(platformLang.offlineHTTP)
1710
+ }
1711
+
1712
+ // Update the context item for the plugin UI
1713
+ accessory.context.isOnline = newStatus ? 'yes' : 'no'
1714
+
1715
+ // Update any changes to the accessory to the platform
1716
+ if (!accessory.context.isExternal) {
1717
+ this.api.updatePlatformAccessories([accessory])
1718
+ }
1719
+ devicesInHB.set(accessory.UUID, accessory)
1720
+ }
1721
+
1682
1722
  removeAccessory(accessory) {
1683
1723
  // Remove an accessory from Homebridge
1684
1724
  try {
@@ -1793,7 +1833,9 @@ export default class {
1793
1833
  }
1794
1834
 
1795
1835
  if (update) {
1796
- this.api.updatePlatformAccessories([accessory])
1836
+ if (!accessory.context.isExternal) {
1837
+ this.api.updatePlatformAccessories([accessory])
1838
+ }
1797
1839
  devicesInHB.set(accessory.UUID, accessory)
1798
1840
  }
1799
1841
 
@@ -121,6 +121,8 @@ export default {
121
121
  twoFACodeInvalid: '2FA verification code was provided but login still failed - please check the code is correct and has not expired',
122
122
  noTokenExists: 'no account token has been retrieved',
123
123
  offlineBTConn: 'has been reported [disconnected] via BLE',
124
+ offlineHTTP: 'has been reported [offline]',
125
+ onlineHTTP: 'has been reported [online]',
124
126
  pluginNotConf: 'Plugin has not been configured',
125
127
  receivingUpdate: 'receiving update',
126
128
  sendingUpdate: 'sending update',
@@ -129,6 +131,5 @@ export default {
129
131
  storageWriteErr: 'could not save accessory to file as',
130
132
  syncFail: 'sync failed as',
131
133
  viaAL: 'via adaptive lighting',
132
- welcome: 'I\'m looking for some lovely people to help maintain this plugin, please get in touch on GitHub or Discord if you\'d like to help out 😄',
133
134
  unknownCommand: 'unknown command in payload received',
134
135
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@homebridge-plugins/homebridge-govee",
3
3
  "alias": "Govee",
4
4
  "type": "module",
5
- "version": "11.27.1-beta.0",
5
+ "version": "11.27.1",
6
6
  "description": "Homebridge plugin to integrate Govee devices into HomeKit.",
7
7
  "author": {
8
8
  "name": "bwp91",