Skip to main content

Govee (Cloud)

Govee-branded smart lights, light strips, light bars, and smart plugs via the public developer cloud API at developer-api.govee.com. One GEM device per Govee account (API key); each paired Govee device maps to a GEM zone.

Prerequisites

  • A Govee Home account with each target device paired in the mobile app.
  • Cloud control enabled on each device (default — verify under the device's settings page in the Govee Home app if get_devices returns less than expected).
  • A free developer API key. Open the Govee Home app, side menu → About Us → Apply for API Key. The key is emailed within a few minutes.
  • Outbound HTTPS to developer-api.govee.com (port 443) from the GEM server.

Setup

  1. On the Devices page choose System → Devices → Add Device and pick the driver govee_cloud.
  2. Paste the API key into the api_key attribute (marked secure, stored encrypted) and save. On connect the driver fetches the account's device list; once the key is valid the parent device comes up Connected.
  3. Run the get_devices command. It returns { devices: [ … ] } with one entry per paired Govee device — {address, name, model, controllable, retrievable, supportCmds}. Note the address value of each device you want to control.
  4. For each Govee device, create a zone bound to this device under Zones:
    • Subsystem — a default GEM install ships a Lights subsystem (lights), and this driver hints lights, so the zone editor pre-selects Lights for you. (Re-create it under Subsystems only if it was removed.)
    • Address — paste the address value from get_devices verbatim (e.g. AA:BB:CC:DD:EE:FF:12:34:H6160). The model number is always the final colon-separated segment; don't hand-assemble the string.
    • Optional supports_color / supports_color_tem if you want the UI to expose color / tunable-white controls; the driver dispatches RGB / color-temperature commands regardless of these flags — they are UI hints you set yourself, not auto-detected.
  5. (Optional) Adjust status_interval if the account has many zones — see the rate-limit note below.

The driver does not auto-create zones or a subsystem — add one zone per Govee device as above. Each zone is matched to its Govee device by its exact address, so a typo there means the zone never updates or controls.

Attribute Reference

Device attributes

AttributeRequiredTypeDefaultNotes
api_keyyesstring (secure)Developer API key issued by Govee. Sent as the Govee-API-Key header on every request.
status_intervalnoint (ms)30000How often each zone is polled for state. Keep this ≥ 30000 ms once you have more than ~30 zones on the same key.

Zone attributes

AttributeRequiredTypeNotes
addressyesstringThe device's hardware identifier followed by :<model>, exactly as returned in the address field of get_devices — copy it verbatim. The model number (e.g. H6160, H6072) is always the final colon-separated segment.
supports_colornoboolUI hint — does this model accept RGB. Does not gate dispatch; set_color is sent regardless.
supports_color_temnoboolUI hint — does this model accept color temperature. Does not gate dispatch; set_color_tem is sent regardless.

Polled state attributes

Each status poll (and any get_state call) writes the device's current state back onto its zone. Build attribute triggers, UI tiles, and history on these names:

AttributeTypeMeaning
statestringon / off.
levelintBrightness 1–100 (Govee's native scale, written straight through).
red / green / blueintLast RGB color, 0–255 each (color-capable models only).
color_temintColor temperature in Kelvin (tunable-white models only).

The driver writes an attribute only when the polled value differs from what the zone already holds, so triggers fire on real changes. Smart-plug models report power only, so just state updates for them.

Commands

NameArgsNotes
onaddressPower on.
offaddressPower off.
toggleaddressReads cached state (or fetches if unknown) and inverts.
set_leveladdress, level (0-100)Brightness. level <= 0 sends off. Govee's wire scale is 1-100 — the driver rounds and clamps.
set_coloraddress, red, green, blue (0-255 each)Requires a model with RGB capability.
set_color_temaddress, color_tem (kelvin)Range varies by model — typically 2000-9000 K. Out-of-range values come back as HTTP 400.
get_stateaddressOne-shot state read (power / brightness / color / color_tem).
get_devicesLists every Govee device visible to this API key plus its supportCmds. Use this to populate zone addresses.

Rate limits

Govee enforces 100 requests per minute per API key. The status loop paces itself with an 800 ms gap between zone reads, so a single key comfortably polls up to ~30 zones at the default 30 s interval. If you exceed the limit you'll get HTTP 429 and get_* / set_* calls will surface {error: 'rate limited (429) — raise status_interval'}. Mitigations: raise status_interval, or split zones across two Govee accounts (each with its own key on a separate GEM device).

Known Limitations

  • Devices paired LAN-only in the Govee Home app do not appear in the cloud API. The mobile app's "Devices" tab must show them with cloud control enabled.
  • State reads can lag the actual device by a few seconds — Govee's cloud cache is the source of truth, not the bulb.
  • Effects, scenes, music-react modes, and segment-level control on light strips are not yet exposed through this driver (the developer API only covers turn, brightness, color, colorTem).
  • Smart-plug models report powerState only; brightness and color writes are rejected by the API.
  • The cloud API does not surface per-device offline state — a missing or errored read is treated as "no change", so a Govee device that drops off Wi-Fi keeps showing its last-known state until it returns. The status poll does not flip the GEM device offline on a failed zone read.
  • The parent GEM device's online/offline state is set at connect and re-evaluated only when get_devices runs (at connect, or when you run that command). A full cloud/network outage therefore shows as down the next time get_devices is attempted; individual control commands report their own {error: …} result without changing the device's connection state.

Troubleshooting

SymptomLikely cause / fix
get_devices returns emptyAPI key is wrong, OR the paired Govee devices are LAN-only (open the mobile app, turn on cloud control).
HTTP 429Rate limit hit. Raise status_interval, reduce zone count, or split across additional Govee accounts.
HTTP 401API key revoked or stale. Re-issue from the Govee Home app and update the attribute.
set_color returns 400 "unsupported command"This model has no RGB capability. Check supportCmds from get_devices.
set_color_tem returns 400 "invalid value of colorTem"Value outside the model's supported kelvin range. The supported range is in properties.colorTem.range of the /v1/devices response.
State changes don't show upGovee's cloud cache lags. The status loop will pick them up on its next pass; raise polling frequency only if you have headroom under the 100 req/min limit.
A Govee device went offline but its zone still shows the old stateExpected — the cloud API does not report per-device offline, and the poll treats a failed read as "no change". Confirm reachability in the Govee Home app; the zone updates on the next successful poll.
A zone never updates or controlsThe zone's address does not match a Govee device. Re-run get_devices and paste the address value verbatim — the model is the final colon-separated segment.
  • Zones — creating and binding the per-device zones.
  • Subsystems — the Lights subsystem these zones live under.
  • Devices — the device editor, secure attributes, and Reload.
  • Commands — the command tester used to run get_devices.