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
- 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.
- Is there a cloud path I missed?
- 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.
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
GET /router/api/v1/user/devices)deviceSettings(app2.govee.com/device/rest/devices/v1/list)lastDeviceData/extResourcesChannel 3 is the same blob this project reads in
src/undoc_api.rs(theget_device_listcall). It's the richest cloud view of the device and still has noai,filter,calibration,saturation, orenhancekey anywhere.Capabilities the platform API returns for H66A0
The only two
devices.capabilities.toggleinstances aregradientToggleanddreamViewToggle. There's no AI-filter toggle.movieModealso 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
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
0x33...write.I've got the device on hand and can capture more dumps if that helps.
Environment
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
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)
Returns a bearer token (
data.token).Request 3 — account API device list (same blob this project reads)
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/enhancekey anywhere indeviceSettings,lastDeviceData, orextResources. The only adjacent token in the blob issupportScene.