@homebridge-plugins/homebridge-govee 11.32.0-beta.25 → 11.32.0-beta.26

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
@@ -29,6 +29,7 @@ All notable changes to `@homebridge-plugins/homebridge-govee` will be documented
29
29
  - docs(changelog): list every unreleased commit in the pending section
30
30
  - fix(fans): rebuild the fan service once when it was cached under the old speed scale, so the top of the slider stops setting the slowest speed (#1326) (@cwhett)
31
31
  - fix: show the H5089 night light tile again, but refuse control commands, so it reports the real state instead of quietly ignoring taps (#1323)
32
+ - fix(ice-makers): stop the home app showing an ice size of 0 when one has never been set (#1329) (@cwhett)
32
33
 
33
34
  ## v11.31.0 (2026-07-24)
34
35
 
@@ -52,6 +52,13 @@ export default class {
52
52
  .onSet(async value => this.internalSizeUpdate(value))
53
53
  this.cacheSize = this.service.getCharacteristic(this.hapChar.RotationSpeed).value || 2
54
54
 
55
+ // Keep the characteristic in step with the cache. Without this an accessory
56
+ // that has never had a size set reports Active=1 with RotationSpeed=0, which
57
+ // is contradictory and which the Home app renders as "0".
58
+ if (this.service.getCharacteristic(this.hapChar.RotationSpeed).value !== this.cacheSize) {
59
+ this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
60
+ }
61
+
55
62
  // Output the customised options to the log
56
63
  const opts = JSON.stringify({})
57
64
  platform.log('[%s] %s %s.', accessory.displayName, platformLang.devInitOpts, opts)
@@ -105,8 +112,15 @@ export default class {
105
112
 
106
113
  async internalSizeUpdate(value) {
107
114
  try {
108
- // Don't continue if 0
115
+ // 0 is not a valid ice size. Put the slider back, otherwise HomeKit keeps 0
116
+ // while the device carries on at cacheSize - and that 0 is what gets written
117
+ // to the accessory cache, so it returns on the next restart. Deferred for the
118
+ // same reason as the error reverts below: an immediate update would be
119
+ // overwritten by the value HomeKit is currently writing.
109
120
  if (value === 0) {
121
+ setTimeout(() => {
122
+ this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
123
+ }, 1000)
110
124
  return
111
125
  }
112
126
 
@@ -145,8 +159,11 @@ export default class {
145
159
  if (params.workMode) {
146
160
  const mode = params.workMode.workMode
147
161
  if (mode > 0 && mode <= 3) {
148
- this.cacheState = 'on'
149
- this.service.updateCharacteristic(this.hapChar.Active, 1)
162
+ if (this.cacheState !== 'on') {
163
+ this.cacheState = 'on'
164
+ this.service.updateCharacteristic(this.hapChar.Active, 1)
165
+ this.accessory.log(`${platformLang.curState} [on]`)
166
+ }
150
167
  if (this.cacheSize !== mode) {
151
168
  this.cacheSize = mode
152
169
  this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
@@ -184,6 +201,14 @@ export default class {
184
201
  }
185
202
  break
186
203
  }
204
+ case 'aa05': {
205
+ // Ice size report. The payload encoding is deliberately NOT decoded here:
206
+ // sizeCodes runs small=0x03..large=0x01 while the OpenAPI path sends
207
+ // workMode un-inverted, and which is authoritative is unresolved (#1329).
208
+ // Claiming a mapping here could silently swap sizes, so this case exists
209
+ // only to stop a routine status report being logged as a new scene code.
210
+ break
211
+ }
187
212
  default:
188
213
  this.accessory.logWarn(`${platformLang.newScene}: [${command}] [${hexString}]`)
189
214
  break
@@ -52,6 +52,13 @@ export default class {
52
52
  .onSet(async value => this.internalSizeUpdate(value))
53
53
  this.cacheSize = this.service.getCharacteristic(this.hapChar.RotationSpeed).value || 2
54
54
 
55
+ // Keep the characteristic in step with the cache. Without this an accessory
56
+ // that has never had a size set reports Active=1 with RotationSpeed=0, which
57
+ // is contradictory and which the Home app renders as "0".
58
+ if (this.service.getCharacteristic(this.hapChar.RotationSpeed).value !== this.cacheSize) {
59
+ this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
60
+ }
61
+
55
62
  // Output the customised options to the log
56
63
  const opts = JSON.stringify({})
57
64
  platform.log('[%s] %s %s.', accessory.displayName, platformLang.devInitOpts, opts)
@@ -105,8 +112,15 @@ export default class {
105
112
 
106
113
  async internalSizeUpdate(value) {
107
114
  try {
108
- // Don't continue if 0
115
+ // 0 is not a valid ice size. Put the slider back, otherwise HomeKit keeps 0
116
+ // while the device carries on at cacheSize - and that 0 is what gets written
117
+ // to the accessory cache, so it returns on the next restart. Deferred for the
118
+ // same reason as the error reverts below: an immediate update would be
119
+ // overwritten by the value HomeKit is currently writing.
109
120
  if (value === 0) {
121
+ setTimeout(() => {
122
+ this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
123
+ }, 1000)
110
124
  return
111
125
  }
112
126
 
@@ -145,8 +159,11 @@ export default class {
145
159
  if (params.workMode) {
146
160
  const mode = params.workMode.workMode
147
161
  if (mode > 0 && mode <= 3) {
148
- this.cacheState = 'on'
149
- this.service.updateCharacteristic(this.hapChar.Active, 1)
162
+ if (this.cacheState !== 'on') {
163
+ this.cacheState = 'on'
164
+ this.service.updateCharacteristic(this.hapChar.Active, 1)
165
+ this.accessory.log(`${platformLang.curState} [on]`)
166
+ }
150
167
  if (this.cacheSize !== mode) {
151
168
  this.cacheSize = mode
152
169
  this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
@@ -184,6 +201,14 @@ export default class {
184
201
  }
185
202
  break
186
203
  }
204
+ case 'aa05': {
205
+ // Ice size report. The payload encoding is deliberately NOT decoded here:
206
+ // sizeCodes runs small=0x03..large=0x01 while the OpenAPI path sends
207
+ // workMode un-inverted, and which is authoritative is unresolved (#1329).
208
+ // Claiming a mapping here could silently swap sizes, so this case exists
209
+ // only to stop a routine status report being logged as a new scene code.
210
+ break
211
+ }
187
212
  default:
188
213
  this.accessory.logWarn(`${platformLang.newScene}: [${command}] [${hexString}]`)
189
214
  break
@@ -52,6 +52,13 @@ export default class {
52
52
  .onSet(async value => this.internalSizeUpdate(value))
53
53
  this.cacheSize = this.service.getCharacteristic(this.hapChar.RotationSpeed).value || 2
54
54
 
55
+ // Keep the characteristic in step with the cache. Without this an accessory
56
+ // that has never had a size set reports Active=1 with RotationSpeed=0, which
57
+ // is contradictory and which the Home app renders as "0".
58
+ if (this.service.getCharacteristic(this.hapChar.RotationSpeed).value !== this.cacheSize) {
59
+ this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
60
+ }
61
+
55
62
  // Output the customised options to the log
56
63
  const opts = JSON.stringify({})
57
64
  platform.log('[%s] %s %s.', accessory.displayName, platformLang.devInitOpts, opts)
@@ -105,8 +112,15 @@ export default class {
105
112
 
106
113
  async internalSizeUpdate(value) {
107
114
  try {
108
- // Don't continue if 0
115
+ // 0 is not a valid ice size. Put the slider back, otherwise HomeKit keeps 0
116
+ // while the device carries on at cacheSize - and that 0 is what gets written
117
+ // to the accessory cache, so it returns on the next restart. Deferred for the
118
+ // same reason as the error reverts below: an immediate update would be
119
+ // overwritten by the value HomeKit is currently writing.
109
120
  if (value === 0) {
121
+ setTimeout(() => {
122
+ this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
123
+ }, 1000)
110
124
  return
111
125
  }
112
126
 
@@ -145,8 +159,11 @@ export default class {
145
159
  if (params.workMode) {
146
160
  const mode = params.workMode.workMode
147
161
  if (mode > 0 && mode <= 3) {
148
- this.cacheState = 'on'
149
- this.service.updateCharacteristic(this.hapChar.Active, 1)
162
+ if (this.cacheState !== 'on') {
163
+ this.cacheState = 'on'
164
+ this.service.updateCharacteristic(this.hapChar.Active, 1)
165
+ this.accessory.log(`${platformLang.curState} [on]`)
166
+ }
150
167
  if (this.cacheSize !== mode) {
151
168
  this.cacheSize = mode
152
169
  this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSize)
@@ -184,6 +201,14 @@ export default class {
184
201
  }
185
202
  break
186
203
  }
204
+ case 'aa05': {
205
+ // Ice size report. The payload encoding is deliberately NOT decoded here:
206
+ // sizeCodes runs small=0x03..large=0x01 while the OpenAPI path sends
207
+ // workMode un-inverted, and which is authoritative is unresolved (#1329).
208
+ // Claiming a mapping here could silently swap sizes, so this case exists
209
+ // only to stop a routine status report being logged as a new scene code.
210
+ break
211
+ }
187
212
  default:
188
213
  this.accessory.logWarn(`${platformLang.newScene}: [${command}] [${hexString}]`)
189
214
  break
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.32.0-beta.25",
5
+ "version": "11.32.0-beta.26",
6
6
  "description": "Homebridge plugin to integrate Govee devices into HomeKit.",
7
7
  "author": {
8
8
  "name": "bwp91",