@homebridge-plugins/homebridge-govee 11.32.2-beta.0 → 11.32.2-beta.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
@@ -7,6 +7,8 @@ All notable changes to `@homebridge-plugins/homebridge-govee` will be documented
7
7
  ### Changed
8
8
 
9
9
  - fix: implement the H7107's oscillation toggle, which threw a not-implemented error when tapped (#1334)
10
+ - fix: also send the H7107's oscillation command as the multiSync frame the fan itself uses, since the first shape only turned it off sometimes (#1334)
11
+ - fix: send the H7107's oscillation-off command without the swing-range bytes, matching the zero-tailed frame the fan echoes back (#1334)
10
12
 
11
13
  ## v11.32.1 (2026-08-02)
12
14
 
@@ -210,12 +210,15 @@ export default class {
210
210
  return
211
211
  }
212
212
 
213
- // The AWS code mirrors the device's own `aa1d..` oscillation report,
214
- // carrying over the extra bytes from the last report seen (#1334).
215
- // Mirroring a status code is not guaranteed on every model, so the
216
- // documented OpenAPI oscillation toggle is also sent when the device
217
- // advertises it
218
- const tailBytes = this.cacheSwingCode
213
+ // The AWS code mirrors the device's own `aa1d..` oscillation report.
214
+ // Turning ON carries over the swing-range bytes from the last report
215
+ // seen, which hardware-confirmed works. Turning OFF must NOT carry
216
+ // them: the fan answered a parameterised off command by echoing back a
217
+ // zero-tailed `331d00..` frame while continuing to oscillate — its own
218
+ // way of showing the shape it expects (#1334). Mirroring a status code
219
+ // is not guaranteed on every model, so the documented OpenAPI
220
+ // oscillation toggle is also sent when the device advertises it
221
+ const tailBytes = value && this.cacheSwingCode
219
222
  ? this.cacheSwingCode.slice(6, 14).match(/.{1,2}/g).map(byte => Number.parseInt(byte, 16))
220
223
  : []
221
224
  await this.platform.sendDeviceUpdate(this.accessory, {
@@ -226,6 +229,16 @@ export default class {
226
229
  : undefined,
227
230
  })
228
231
 
232
+ // Hardware testing showed the `331d..` frame above turns oscillation ON
233
+ // reliably but OFF only sometimes - and the fan's own oscillation state
234
+ // travels as multiSync traffic, which is what the `3a`-prefixed frame
235
+ // belongs to. Both shapes mean the same thing, so the one the fan
236
+ // ignores is harmless, and one test tells us which it honours (#1334)
237
+ await this.platform.sendDeviceUpdate(this.accessory, {
238
+ cmd: 'multiSync',
239
+ value: generateCodeFromHexValues([0x3A, 0x1D, value ? 0x01 : 0x00, ...tailBytes]),
240
+ })
241
+
229
242
  // Cache the new state and log if appropriate
230
243
  if (this.cacheSwing !== newValue) {
231
244
  this.cacheSwing = newValue
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.2-beta.0",
5
+ "version": "11.32.2-beta.2",
6
6
  "description": "Homebridge plugin to integrate Govee devices into HomeKit.",
7
7
  "author": {
8
8
  "name": "bwp91",