Skip to content

TV Backlight 3 Pro (H66A0/H66A1): AI Filter not exposed by any Govee API channel, can it be controlled? #685

@danielgomezrico

Description

@danielgomezrico

What I want

Toggle the AI Filter on a TV Backlight 3 Pro (SKU H66A0, same family as H66A1) from Home Assistant. It's the switch under Video → Movie in the Govee Home app, the one with the "when AI Filter is on, color calibration is unavailable" tip.

Before filing I went looking for where that toggle lives. Posting what I found in case someone already knows the trick, or to save the next person the digging.

What I checked

# Channel AI Filter present?
1 Platform (developer) API — device list (GET /router/api/v1/user/devices) No
2 Platform API — device state No
3 Account API device blob — deviceSettings (app2.govee.com/device/rest/devices/v1/list) No
4 Account API — lastDeviceData / extResources No

Channel 3 is the same blob this project reads in src/undoc_api.rs (the get_device_list call). It's the richest cloud view of the device and still has no ai, filter, calibration, saturation, or enhance key anywhere.

Capabilities the platform API returns for H66A0

powerSwitch, brightness, colorRgb, colorTemperatureK,
gradientToggle, segmentedBrightness, segmentedColorRgb,
lightScene, musicMode, movieMode, diyScene, snapshot, dreamViewToggle

The only two devices.capabilities.toggle instances are gradientToggle and dreamViewToggle. There's no AI-filter toggle. movieMode also exposes just one option (Game = 0), so the Game/Movie split and the AI Filter switch from the app are both missing.

What the account blob does reveal about the transport

bleName: Govee_H66A0_xxxx
topic:   GD/...                  (Govee AWS-IoT MQTT topic)
supportBleBroadV3: true
supportEnc: true                 (encrypted BLE broadcast)
secretCode: <redacted>

So the device is driven by encrypted BLE-broadcast packets and/or Govee's private IoT MQTT topic with raw opcodes. AI Filter looks like one of those app-issued opcodes rather than anything an API enumerates.

The question

  1. Has anyone captured the BLE/IoT opcode the app sends when toggling AI Filter on a TV Backlight 3 Pro? An Android Bluetooth HCI snoop while flipping the switch should show the 0x33... write.
  2. Is there a cloud path I missed?
  3. If it really is BLE/IoT-only, is that in scope here, or is the honest answer "not supported until Govee adds it to the API"?

I've got the device on hand and can capture more dumps if that helps.

Environment

  • Device: TV Backlight 3 Pro, SKU H66A0
  • Govee Home app shows AI Filter under Video → Movie, device connected over Bluetooth

Appendix: requests run and raw responses

Secrets (API key, email, password, bearer token, secretCode, full device id) redacted.

Request 1 — Platform (developer) API, device list

curl -s 'https://openapi.api.govee.com/router/api/v1/user/devices' \
  -H 'Govee-API-Key: <REDACTED>'

Full H66A0 entry from the response (every capability the public API reports for this device):

{
  "sku": "H66A0",
  "device": "9E:9A:...:5481",
  "deviceName": "TV Backlight 3 Pro",
  "type": "devices.types.light",
  "capabilities": [
    {"type":"devices.capabilities.on_off","instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]}},
    {"type":"devices.capabilities.range","instance":"brightness","parameters":{"unit":"unit.percent","dataType":"INTEGER","range":{"min":1,"max":100,"precision":1}}},
    {"type":"devices.capabilities.color_setting","instance":"colorRgb","parameters":{"dataType":"INTEGER","range":{"min":0,"max":16777215,"precision":1}}},
    {"type":"devices.capabilities.color_setting","instance":"colorTemperatureK","parameters":{"dataType":"INTEGER","range":{"min":2200,"max":6500,"precision":1}}},
    {"type":"devices.capabilities.toggle","instance":"gradientToggle","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]}},
    {"type":"devices.capabilities.segment_color_setting","instance":"segmentedBrightness","parameters":{"dataType":"STRUCT","fields":[{"fieldName":"segment","size":{"min":1,"max":14},"dataType":"Array","elementRange":{"min":0,"max":13},"elementType":"INTEGER","required":true},{"fieldName":"brightness","dataType":"INTEGER","range":{"min":0,"max":100,"precision":1},"required":true}]}},
    {"type":"devices.capabilities.segment_color_setting","instance":"segmentedColorRgb","parameters":{"dataType":"STRUCT","fields":[{"fieldName":"segment","size":{"min":1,"max":14},"dataType":"Array","elementRange":{"min":0,"max":13},"elementType":"INTEGER","required":true},{"fieldName":"rgb","dataType":"INTEGER","range":{"min":0,"max":16777215,"precision":1},"required":true}]}},
    {"type":"devices.capabilities.dynamic_scene","instance":"lightScene","parameters":{"dataType":"ENUM","options":[]}},
    {"type":"devices.capabilities.music_setting","instance":"musicMode","parameters":{"dataType":"STRUCT","fields":[
      {"fieldName":"musicMode","dataType":"ENUM","options":[{"name":"Energic","value":0},{"name":"Rhythm","value":1},{"name":"Spectrum","value":2},{"name":"Rolling","value":3},{"name":"Separation","value":4},{"name":"Hopping","value":5},{"name":"Piano Keys","value":6},{"name":"Fountain","value":7},{"name":"Day and Night","value":8},{"name":"Sprouting","value":9},{"name":"Splash","value":10},{"name":"Spring","value":11},{"name":"Color Painting","value":12},{"name":"Beat","value":13},{"name":"Windmill","value":14},{"name":"Flowing Light","value":15}],"required":true},
      {"unit":"unit.percent","fieldName":"sensitivity","dataType":"INTEGER","range":{"min":0,"max":100,"precision":1},"required":true},
      {"fieldName":"autoColor","dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}],"required":false},
      {"fieldName":"rgb","dataType":"INTEGER","range":{"min":0,"max":16777215,"precision":1},"required":false}]}},
    {"type":"devices.capabilities.movie_setting","instance":"movieMode","parameters":{"dataType":"STRUCT","fields":[{"fieldName":"movieMode","dataType":"ENUM","options":[{"name":"Game","value":0}],"required":true}]}},
    {"type":"devices.capabilities.dynamic_scene","instance":"diyScene","parameters":{"dataType":"ENUM","options":[]}},
    {"type":"devices.capabilities.dynamic_scene","instance":"snapshot","parameters":{"dataType":"ENUM","options":[]}},
    {"type":"devices.capabilities.toggle","instance":"dreamViewToggle","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]}}
  ]
}

grep -i 'ai\|filter\|calibrat\|saturat\|enhance' over the whole response: no match.

Request 2 — account API login (to reach the richer blob)

curl -s -X POST 'https://community-api.govee.com/os/v1/login' \
  -H 'Content-Type: application/json' \
  -d '{"email":"<REDACTED>","password":"<REDACTED>"}'

Returns a bearer token (data.token).

Request 3 — account API device list (same blob this project reads)

curl -s -X POST 'https://app2.govee.com/device/rest/devices/v1/list' \
  -H 'Authorization: Bearer <TOKEN>' \
  -H 'appVersion: 6.7.0' -H 'clientId: <uuid>' \
  -H 'clientType: 1' -H 'iotVersion: 0'

Relevant fields from the H66A0 entry's deviceExt (deviceSettings), secrets redacted:

{
  "bleName": "Govee_H66A0_5481",
  "topic": "GD/<REDACTED>",
  "supportBleBroadV3": true,
  "supportEnc": true,
  "secretCode": "<REDACTED>"
}

No ai / filter / calibration / saturation / enhance key anywhere in deviceSettings, lastDeviceData, or extResources. The only adjacent token in the blob is supportScene.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions