@homebridge-plugins/homebridge-govee 11.33.1 → 11.33.2-beta.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,6 +2,13 @@
2
2
 
3
3
  All notable changes to `@homebridge-plugins/homebridge-govee` will be documented in this file.
4
4
 
5
+ ## v11.33.2 (Pending Release)
6
+
7
+ ### Changed
8
+
9
+ - fix: implement the H7105 oscillation toggle, which threw a not-implemented error (#1339)
10
+ - fix: stop the purifiers reporting their startup status as unrecognised scenes (#1340)
11
+
5
12
  ## v11.33.1 (2026-08-04)
6
13
 
7
14
  ### Changed
@@ -187,33 +187,42 @@ export default class extends GoveeDevice {
187
187
 
188
188
  async internalSwingUpdate(value) {
189
189
  try {
190
- // Don't continue if the new value is the same as before
191
- if (this.cacheSwing === value) {
190
+ const newValue = value ? 'on' : 'off'
191
+ // Don't continue if the new value is the same as before. The comparison
192
+ // has to be against the mapped string - cacheSwing holds 'on'/'off' and
193
+ // value arrives as a boolean, so comparing them directly never matched
194
+ if (this.cacheSwing === newValue) {
192
195
  return
193
196
  }
194
197
 
195
- throw new Error('Swing mode update not implemented yet')
196
-
197
- // const newValue = value ? 'on' : 'off'
198
- // The existing cacheSwingCode might be something like aa1d0101960384000000000000000000000000a6
199
- // We need to change the third hex value to 00 for off or 01 for on
200
- // const hexValues = [
201
- // 0x3A,
202
- // 0x1D,
203
- // value ? 0x01 : 0x00,
204
- // ...this.cacheSwingCode.slice(6, 14).match(/.{1,2}/g).map(byte => Number.parseInt(byte, 16)),
205
- // ]
206
- //
207
- // await this.platform.sendDeviceUpdate(this.accessory, {
208
- // cmd: 'multiSync',
209
- // value: generateCodeFromHexValues(hexValues),
210
- // })
198
+ // Same oscillation shape as the H7107, which is the only other fan that
199
+ // reports a swing RANGE rather than a plain on/off. Turning ON carries
200
+ // over the range bytes from the last report seen; turning OFF must not,
201
+ // because a parameterised off command was answered with a zero-tailed
202
+ // frame while the fan kept oscillating (#1334, #1339)
203
+ const tailBytes = value && this.cacheSwingCode
204
+ ? this.cacheSwingCode.slice(6, 14).match(/.{1,2}/g).map(byte => Number.parseInt(byte, 16))
205
+ : []
206
+ await this.platform.sendDeviceUpdate(this.accessory, {
207
+ cmd: 'ptReal',
208
+ value: generateCodeFromHexValues([0x33, 0x1D, value ? 0x01 : 0x00, ...tailBytes]),
209
+ openApi: this.accessory.context.openApiCapabilities?.oscillationToggle
210
+ ? { instance: 'oscillationToggle', capabilityType: 'devices.capabilities.toggle', value: value ? 1 : 0 }
211
+ : undefined,
212
+ })
213
+
214
+ // The fan's own oscillation state travels as multiSync traffic, so send
215
+ // that shape too. Whichever the model ignores is harmless
216
+ await this.platform.sendDeviceUpdate(this.accessory, {
217
+ cmd: 'multiSync',
218
+ value: generateCodeFromHexValues([0x3A, 0x1D, value ? 0x01 : 0x00, ...tailBytes]),
219
+ })
211
220
 
212
221
  // Cache the new state and log if appropriate
213
- // if (this.cacheSwing !== newValue) {
214
- // this.cacheSwing = newValue
215
- // this.accessory.log(`${platformLang.curSwing} [${newValue}]`)
216
- // }
222
+ if (this.cacheSwing !== newValue) {
223
+ this.cacheSwing = newValue
224
+ this.accessory.log(`${platformLang.curSwing} [${newValue}]`)
225
+ }
217
226
  } catch (err) {
218
227
  this.failUpdate(err, () => {
219
228
  this.service.updateCharacteristic(this.hapChar.SwingMode, this.cacheSwing === 'on' ? 1 : 0)
@@ -466,9 +466,18 @@ export default class GoveePurifierH7123 extends GoveeDevice {
466
466
  case '3316': { // display light
467
467
  break
468
468
  }
469
+ // Sent in a burst when the connection comes up. What each one carries
470
+ // has not been worked out, and nothing here needs them, so they are
471
+ // known-and-ignored rather than reported every time (#1340)
472
+ case 'aa12':
473
+ case 'aa17':
474
+ case 'aa1f': {
475
+ this.accessory.logDebug(`startup status [${deviceFunction}]: ${hexString}`)
476
+ break
477
+ }
469
478
  default:
470
479
  logUnknownData(this.accessory, {
471
- kind: 'scene',
480
+ kind: 'status',
472
481
  source: params.source,
473
482
  raw: command,
474
483
  hex: hexString,
@@ -325,9 +325,25 @@ export default class extends GoveeDevice {
325
325
  }
326
326
  break
327
327
  }
328
+ // Sent in a burst when the connection comes up. What each one carries
329
+ // has not been worked out, and nothing here needs them, so they are
330
+ // known-and-ignored rather than reported every time (#1340)
331
+ case '0500':
332
+ case '0502':
333
+ case '0503':
334
+ case '0800':
335
+ case '1202':
336
+ case '1300':
337
+ case '1301':
338
+ case '1702':
339
+ case '1900':
340
+ case '2600': {
341
+ this.accessory.logDebug(`startup status [${deviceFunction}]: ${hexString}`)
342
+ break
343
+ }
328
344
  default:
329
345
  logUnknownData(this.accessory, {
330
- kind: 'scene',
346
+ kind: 'status',
331
347
  source: params.source,
332
348
  raw: command,
333
349
  hex: hexString,
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.33.1",
5
+ "version": "11.33.2-beta.1",
6
6
  "description": "Homebridge plugin to integrate Govee devices into HomeKit.",
7
7
  "author": {
8
8
  "name": "bwp91",