wez / govee2mqtt

Govee2MQTT: Connect Govee lights and devices to Home Assistant
MIT License
458 stars 30 forks source link

H7173 kettle support #30

Closed tankdeer closed 9 months ago

tankdeer commented 9 months ago

Is it possible to control devices that are not directly in your Govee account/profile, but shared from another one? A couple months ago my wife purchased the H7173 kettle, and setup a Govee account for it. And recently I bought the H7066 spotlights, and ended up creating a separate account. The two devices are shared between the accounts, and we can each control both, however I only see the spotlights when configuring the add-on. I noticed if I do a device query through the API, I only receive what is directly associated with that API key, not ones that are shared. I am not sure if there is a different endpoint for shared devices, or not.

Thank you

wez commented 9 months ago

There isn't anything in the docs about shared accounts. If the API doesn't return the devices, and if they don't show up via the LAN discovery protocol, then they won't be visible to govee2mqtt.

I don't want to dictate to you how you should do things, but I would suggest that it would be simpler to get all the devices on the same account if you wanted to use them with a home automation system.

tankdeer commented 9 months ago

Thank you. I had figured that was probably the best route forward, but thought I would ask since it seems like there is a lot of functionality in the various APIs that is undocumented. Appreciate the response.

tankdeer commented 9 months ago

Per your advice, I consolidated our accounts, and now both devices show up in HA. Since I know this is all very much a WIP, I figured I would share the metadata of the kettle. Here's how it's picked up currently:

image

And here is the device info:

{
  "code": 200,
  "message": "success",
  "data": [
    {
      "sku": "H7173",
      "device": "1E:6E:60:74:F4:5F:3E:1E",
      "deviceName": "Bev",
      "type": "devices.types.kettle",
      "capabilities": [
        {
          "type": "devices.capabilities.on_off",
          "instance": "powerSwitch",
          "parameters": {
            "dataType": "ENUM",
            "options": [
              {
                "name": "on",
                "value": 1
              },
              {
                "name": "off",
                "value": 0
              }
            ]
          }
        },
        {
          "type": "devices.capabilities.temperature_setting",
          "instance": "sliderTemperature",
          "parameters": {
            "dataType": "STRUCT",
            "fields": [
              {
                "fieldName": "temperature",
                "dataType": "INTEGER",
                "range": {
                  "min": 40,
                  "max": 100,
                  "precision": 1
                },
                "required": true
              },
              {
                "fieldName": "unit",
                "defaultValue": "Celsius",
                "dataType": "ENUM",
                "options": [
                  {
                    "name": "Celsius",
                    "value": "Celsius"
                  },
                  {
                    "name": "Fahrenheit",
                    "value": "Fahrenheit"
                  }
                ],
                "required": true
              }
            ]
          }
        },
        {
          "type": "devices.capabilities.property",
          "instance": "sensorTemperature"
        },
        {
          "type": "devices.capabilities.work_mode",
          "instance": "workMode",
          "parameters": {
            "dataType": "STRUCT",
            "fields": [
              {
                "fieldName": "workMode",
                "dataType": "ENUM",
                "options": [
                  {
                    "name": "DIY",
                    "value": 1
                  },
                  {
                    "name": "Boiling",
                    "value": 2
                  },
                  {
                    "name": "Tea",
                    "value": 3
                  },
                  {
                    "name": "Coffee",
                    "value": 4
                  }
                ],
                "required": true
              },
              {
                "fieldName": "modeValue",
                "dataType": "ENUM",
                "options": [
                  {
                    "defaultValue": 0,
                    "name": "Boiling"
                  },
                  {
                    "dataType": "ENUM",
                    "name": "Tea",
                    "options": [
                      {
                        "value": 1
                      },
                      {
                        "value": 2
                      },
                      {
                        "value": 3
                      },
                      {
                        "value": 4
                      }
                    ]
                  },
                  {
                    "dataType": "ENUM",
                    "name": "Coffee",
                    "options": [
                      {
                        "value": 1
                      },
                      {
                        "value": 2
                      },
                      {
                        "value": 3
                      },
                      {
                        "value": 4
                      }
                    ]
                  },
                  {
                    "dataType": "ENUM",
                    "name": "DIY",
                    "options": [
                      {
                        "value": 1
                      },
                      {
                        "value": 2
                      },
                      {
                        "value": 3
                      },
                      {
                        "value": 4
                      }
                    ]
                  }
                ],
                "required": false
              }
            ]
          }
        }
      ]
    }
  ]
}
tankdeer commented 9 months ago

And here's how it appears in the app.

Looking at the metadata I think the workMode enum corresponds to the currently selected preset, and each of the nested enums in the workValue field are I think the setting for that preset? For example setting workMode to 3 - tea and workValue to 1 would presumably be the green tea setting. I do wonder if there's a reference for these enum values somewhere.

It looks like it exposes the temperature setting, but I don't see the current temp. Nor am I seeing the keep warm setting. There may be more I am missing.

Anyways, hope this is useful. Thanks again for all your efforts on this

wez commented 9 months ago

Ah, interesting info!

Looking at the metadata I think the workMode enum corresponds to the currently selected preset, and each of the nested enums in the workValue field are I think the setting for that preset? For example setting workMode to 3 - tea and workValue to 1 would presumably be the green tea setting.

Yes, that's how workMode works for humidifiers and fans, and it appears that it works that way here also.

I do wonder if there's a reference for these enum values somewhere.

I doubt there is anything public for this, but that doesn't mean we can't make this look better in home assistant.

For fans and humidifiers, most of the modes have no useful metadata at all, and the values correspond to some internal integers that need some translation and scaling to use correctly.

For your kettle, it looks like a much better situation. I think we can and should translate the discrete levels into meaningful labels. Could you confirm the set of mode/values that you see from the device state when you set the app into different modes?

I agree that the Tea options 1-4 most likely correspond to Green Tea, Black Tea and Oolong Tea and something that isn't shown in the app. It is possible that the metadata is wrong and there should only be 3 options.

Anyway: if you can give me the mapping of numbers to the most reasonable labels, I think we can replace the number slider for Tea with a selection box listing out the discrete labels. Should be much more intuitive to use.

For the Boiling parameter, which has no enum metadata, I suspect that the parameter value is the temperature, perhaps offset and/or scaled. For example, in the humidifier, the target humidity value is set as 128 + percentage and the device has a minimum value of 40%, meaning that the smallest parameter value there is 168.

For the humidifier, there is a Custom mode which has some built-in automation functionality. That was too complex to reverse engineer and I ended up hiding it from HASS. The rationale is: if you want to automate the device, you can do that with hass and the other modes that are exposed. I wonder if the DIY mode shown on your screen is in a similar category?

You can use:

$ docker run --rm ghcr.io/wez/govee2mqtt /app/govee --api-key $GOVEE_API_KEY http-control --id $DEVICE_ID status

to read back the current values that correspond to the metadata you pulled, so if you go into the app, change to a certain mode/parameter then run that status command and note down what you see, it shouldn't take too long to map out most of how that device works.

For extra bonus points here, I would like to also enable the IoT API which has a more complex representation; there is additional data that will get logged by govee2mqtt as changes are made if you set the debug_level to govee::service::iot=debug,info. It will look like a lot of hex numbers. I don't expect you to decode all those, but if you could capture those along with the known mode values you set in the app, then we're ahead of the game on this. The advantage of the IoT API is that we get very low latency readings from the device without using up your api key quota from the platform API.

wez commented 9 months ago

In the latest addon update, I made a change to how we read back data for devices like this: previously we'd always try to read from the IoT API and skip the platform API. Now we realize when we need the data from the platform API and make sure to call it. You might find that the controls in HASS now do something, potentially something useful.

tankdeer commented 9 months ago

Ok, I tried running the command, however it did not appear it picked up any changes I made in the app. Here is the output I received. This was the same regardless of which setting I chose.

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(false),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(100),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": String(""),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(2),
                },
            },
        },
    ],
}

I tried a few of the controls in HA and even after the latest update, they still don't do anything either. Here is the logging from that (I noticed in both test cases there is no additional debug logging)

Power switch

[2024-01-10T08:27:36 INFO  govee::service::state] Using IoT API to set Bev (1E:6E:60:74:F4:5F:3E:1E) power state
[2024-01-10T08:27:36 INFO  govee::service::state] Polling Bev (1E:6E:60:74:F4:5F:3E:1E) to get latest state after control
[2024-01-10T08:27:36 INFO  govee::service::state] requesting update via Platform API Bev (1E:6E:60:74:F4:5F:3E:1E) Some(DeviceState { on: false, online: Some(false), kelvin: 0, color: DeviceColor { r: 0, g: 0, b: 0 }, brightness: 0, scene: None, source: "PLATFORM API", updated: 2024-01-10T16:21:28.067594789Z })
[2024-01-10T08:27:36 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T08:27:36 WARN  govee::hass_mqtt::enumerator] Do something about Property sensorTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: Property, instance: "sensorTemperature", parameters: None, alarm_type: None, event_state: None }

Playing with sliders

[2024-01-10T08:28:30 WARN  govee::hass_mqtt::number] Tea for 1E6E6074F45F3E1E: 2
[2024-01-10T08:28:30 INFO  govee::service::state] Polling Bev (1E:6E:60:74:F4:5F:3E:1E) to get latest state after control
[2024-01-10T08:28:30 INFO  govee::service::state] requesting update via Platform API Bev (1E:6E:60:74:F4:5F:3E:1E) Some(DeviceState { on: false, online: Some(false), kelvin: 0, color: DeviceColor { r: 0, g: 0, b: 0 }, brightness: 0, scene: None, source: "PLATFORM API", updated: 2024-01-10T16:27:36.994278053Z })
[2024-01-10T08:28:31 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T08:28:31 WARN  govee::hass_mqtt::enumerator] Do something about Property sensorTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: Property, instance: "sensorTemperature", parameters: None, alarm_type: None, event_state: None }
[2024-01-10T08:28:52 WARN  govee::hass_mqtt::number] Boiling for 1E6E6074F45F3E1E: 138
[2024-01-10T08:28:52 INFO  govee::service::state] Polling Bev (1E:6E:60:74:F4:5F:3E:1E) to get latest state after control
[2024-01-10T08:28:52 INFO  govee::service::state] requesting update via Platform API Bev (1E:6E:60:74:F4:5F:3E:1E) Some(DeviceState { on: false, online: Some(false), kelvin: 0, color: DeviceColor { r: 0, g: 0, b: 0 }, brightness: 0, scene: None, source: "PLATFORM API", updated: 2024-01-10T16:28:31.734419740Z })
[2024-01-10T08:28:53 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T08:28:53 WARN  govee::hass_mqtt::enumerator] Do something about Property sensorTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: Property, instance: "sensorTemperature", parameters: None, alarm_type: None, event_state: None }
tankdeer commented 9 months ago

So here's how the presets look in the app. In each case you can edit the name and set temperature. The DIY ones are user created, so I think that is similar to your humidifier.

I confirmed that the enum ranges correspond to the maximum number of presets you can define for each setting.

wez commented 9 months ago

Can you confirm which version of the addon you were running when you obtained those results? The reason I ask is that 2024.01.10-86c015b5 (from this morning) should have populated an entity for the sensorTemperature property.

Since the readings being returned from the platform API don't seem to reflect the device settings, I think the next step is to collect the IoT packets for this device as I mentioned at the bottom of my earlier long comment.

Valdorama commented 9 months ago

Just installed this after a lot of faffing about getting MQTT up and running (I'm using HA Container) and this is what I get:

image

The temp was accurate at the time (save the scale obviously), although it's out-of-date now. Should it be updating at a specific interval?

(Sorry, don't mean to hijack the thread, but should this container have any volumes defined? Are the logs saved on file somewhere..?)

wez commented 9 months ago

(Sorry, don't mean to hijack the thread, but should this container have any volumes defined? Are the logs saved on file somewhere..?)

No need to define any volumes. Logs can be found via docker logs govee2mqtt, and followed as they change by adding in --follow.

tankdeer commented 9 months ago

Ok, sorry for the delay, it's been a hectic day.

So I went ahead an updated the add-on. I think you were right I was on an older version at the time. Currently on 2024.01.10-a8f0a956. Additionally, it turned out I had some firewall stuff that was preventing me from doing useful debugging. Will obviously have to circle back to that.

Anyways, here is hopefully some much more meaningful info. Json & debug logs grouped by action performed on the app:

Turn on with Preset set to Boil

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(1),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(100),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(167),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(2),
                },
            },
        },
    ],
}

(Might be a little extra in here as I didn't check it at first)

[2024-01-10T18:19:50 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("status"), msg: None, state: StateUpdate { on_off: Some(0), brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 1F, 06, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 1F, 03, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B7]), NotifyHumidifierMode { mode: 2, param: 0 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE]), Generic([AA, 10, 01, 40, D8, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 22]), Generic([AA, 17, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, BD]), Generic([AA, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B3]), Generic([AA, 22, 00, 00, 78, 78, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 88]), Generic([AA, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B3]), Generic([AA, 23, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 89]), Generic([AA, 1B, 05, 00, 00, 55, 55, 0A, 01, 00, 55, 00, 00, 50, 50, 55, 00, 55, 00, EA])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:19:50 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T18:19:53 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("status"), msg: None, state: StateUpdate { on_off: Some(1), brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 1F, 06, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 1F, 03, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B7]), NotifyHumidifierMode { mode: 2, param: 0 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE]), Generic([AA, 10, 01, 40, D8, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 22]), Generic([AA, 17, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, BD]), Generic([AA, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B3]), Generic([AA, 22, 00, 00, 78, 78, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 88]), Generic([AA, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B3]), Generic([AA, 23, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 89]), Generic([AA, 1B, 05, 00, 00, 55, 55, 0A, 01, 00, 55, 00, 00, 50, 50, 55, 00, 55, 00, EA])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:19:53 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T18:19:53 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("status"), msg: None, state: StateUpdate { on_off: Some(1), brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 1F, 06, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 1F, 03, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B7]), NotifyHumidifierMode { mode: 2, param: 0 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE]), Generic([AA, 10, 01, 40, D8, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 22]), Generic([AA, 17, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, BD]), Generic([AA, 19, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 22, 00, 00, 78, 78, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 88]), Generic([AA, 19, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 23, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 89]), Generic([AA, 1B, 05, 00, 00, 55, 55, 0A, 01, 00, 55, 00, 00, 50, 50, 55, 00, 55, 00, EA])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:19:53 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T18:20:25 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("status"), msg: None, state: StateUpdate { on_off: Some(0), brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 1F, 06, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 1F, 03, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B7]), NotifyHumidifierMode { mode: 2, param: 0 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE]), Generic([AA, 10, 01, 43, 30, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, C9]), Generic([AA, 17, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, BD]), Generic([AA, 19, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 22, 00, 00, 78, 78, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 88]), Generic([AA, 19, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 23, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 89]), Generic([AA, 1B, 05, 00, 00, 55, 55, 0A, 01, 00, 55, 00, 00, 50, 50, 55, 00, 55, 00, EA])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:20:25 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }
[2024-01-10T18:20:26 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("status"), msg: None, state: StateUpdate { on_off: Some(0), brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 1F, 06, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B2]), Generic([AA, 1F, 03, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B7]), NotifyHumidifierMode { mode: 2, param: 0 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE]), Generic([AA, 10, 01, 43, 30, 01, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, C9]), Generic([AA, 17, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, BD]), Generic([AA, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B3]), Generic([AA, 22, 00, 00, 78, 78, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 88]), Generic([AA, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B3]), Generic([AA, 23, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 89]), Generic([AA, 1B, 05, 00, 00, 55, 55, 0A, 01, 00, 55, 00, 00, 50, 50, 55, 00, 55, 00, EA])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:20:26 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Change to Green tea preset (Did not turn on, just selected preset)

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(82),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(177),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(3),
                },
            },
        },
    ],
}
[2024-01-10T18:22:15 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [NotifyHumidifierMode { mode: 3, param: 1 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, 46, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, BB]), Generic([AA, 05, 03, 01, CC, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 4E])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:22:15 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Change to Black Tea (Same as before, did not turn on)

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(100),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(175),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(3),
                },
            },
        },
    ],
}
[2024-01-10T18:23:08 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [NotifyHumidifierMode { mode: 3, param: 2 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, 52, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, BB]), Generic([AA, 05, 03, 01, CC, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 4E])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:23:08 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Oolong

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(91),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(174),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(3),
                },
            },
        },
    ],
}
[2024-01-10T18:23:58 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [NotifyHumidifierMode { mode: 3, param: 3 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:23:58 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Coffee 1 (This appears to be a DIY setting/override for Coffee)

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(96),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(172),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(4),
                },
            },
        },
    ],
}
[2024-01-10T18:24:55 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [NotifyHumidifierMode { mode: 4, param: 1 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:24:55 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

DIY (Warm - 105°F)

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(41),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(172),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(1),
                },
            },
        },
    ],
}
[2024-01-10T18:25:37 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [NotifyHumidifierMode { mode: 1, param: 1 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:25:37 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Flipping the 'Keep Warm' toggle

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(41),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(171),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(1),
                },
            },
        },
    ],
}
[2024-01-10T18:25:37 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [NotifyHumidifierMode { mode: 1, param: 1 }, Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:25:37 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Setting a temperature manually - not a preset

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(66),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(170),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(5),
                },
            },
        },
    ],
}
[2024-01-10T18:27:13 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 05, 00, 05, 3A, 98, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08]), Generic([AA, 05, 01, 00, 29, 04, 01, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, 82]), Generic([AA, 05, 01, 01, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, AF]), Generic([AA, 05, 04, 00, 50, 14, 01, 00, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, EF]), Generic([AA, 05, 04, 01, FF, FF, FF, FF, FF, FF, FF, FF, 01, 00, 00, 00, 00, 00, 00, AB]), Generic([AA, 05, 03, 00, C6, 50, 01, 00, D2, D0, 02, 00, 00, 00, 00, 00, 00, 00, 00, 3B]), Generic([AA, 05, 03, 01, 4C, 2C, 03, 00, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, 00, CE])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:27:13 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

Lastly, setting a scheduled start time.

HttpDeviceState {
    sku: "H7173",
    device: "1E:6E:60:74:F4:5F:3E:1E",
    capabilities: [
        DeviceCapabilityState {
            kind: Online,
            instance: "online",
            state: Object {
                "value": Bool(true),
            },
        },
        DeviceCapabilityState {
            kind: OnOff,
            instance: "powerSwitch",
            state: Object {
                "value": Number(0),
            },
        },
        DeviceCapabilityState {
            kind: TemperatureSetting,
            instance: "sliderTemperature",
            state: Object {
                "value": Object {
                    "targetTemperature": Number(66),
                    "unit": String("Celsius"),
                },
            },
        },
        DeviceCapabilityState {
            kind: Property,
            instance: "sensorTemperature",
            state: Object {
                "value": Number(167),
            },
        },
        DeviceCapabilityState {
            kind: WorkMode,
            instance: "workMode",
            state: Object {
                "value": Object {
                    "workMode": Number(5),
                },
            },
        },
    ],
}
[2024-01-10T18:29:36 DEBUG govee::service::iot] Packet { sku: Some("H7173"), device: Some("1E:6E:60:74:F4:5F:3E:1E"), cmd: Some("multiSync"), msg: None, state: StateUpdate { on_off: None, brightness: None, color: None, color_temperature_kelvin: None, sku: None, device: None }, op: Some(OpData { command: [Generic([AA, 19, 06, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, B5]), Generic([AA, 23, 01, 00, F0, 65, 9F, 8A, D1, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, D9])], mode_value: [], sleep_value: [], wakeup_value: [], timer_value: [] }) }
[2024-01-10T18:29:36 WARN  govee::hass_mqtt::enumerator] Do something about TemperatureSetting sliderTemperature for Bev (1E:6E:60:74:F4:5F:3E:1E) DeviceCapability { kind: TemperatureSetting, instance: "sliderTemperature", parameters: Some(Struct { fields: [StructField { field_name: "temperature", field_type: Integer { unit: None, range: IntegerRange { min: 40, max: 100, precision: 1 } }, default_value: None, required: true }, StructField { field_name: "unit", field_type: Enum { options: [EnumOption { name: "Celsius", value: String("Celsius"), extras: {} }, EnumOption { name: "Fahrenheit", value: String("Fahrenheit"), extras: {} }] }, default_value: Some(String("Celsius")), required: true }] }), alarm_type: None, event_state: None }

There are likely some options I overlooked, as I was rushing a bit. LMK if there is any glaring oversights, or something else you'd like to me test.

Regarding the Temperature sensor in HA. It did show up after I updated. However like others have mentioned the scale seems off. Currently reading 1.66°C. Brrr

Thanks again

Idaho947 commented 9 months ago

Hello same thing with my H713a and H713b. If you want some information tell me.

wez commented 9 months ago

I'd appreciate hearing how well this works in the latest version of the addon!

tankdeer commented 9 months ago

I'd appreciate hearing how well this works in the latest version of the addon!

Me too, ha ha. We actually had a big storm here that knocked out power and internet. Power is back, but waiting on internet still. Will keep you posted.

Along those lines, I've noticed that with the Internet down, the addon won't start at all due to DNS errors. I know it wouldn't help the kettle, but I feel like for lights and stuff that do have LAN control, the addon should still start and run in a limited capacity. I thought I saw something similar mentioned in another issue, but I'm not finding it now. LMK is this is a known issue or limitation, or if you want me to open another issue for it.

Thanks again.

Valdorama commented 9 months ago

Just tried it and there is more functionality there than previously:

image

If I turn the switch on the kettle does start heating using the specified mode. However when I tried to change the mode to 'boil' and turn the switch on, the kettle was still in Tea mode. I then noticed that when changing the Mode entity to something other than Tea, after a few seconds it reverted back to Tea. Notice also that the Boiling Parameter entity is disabled.

Edit: these are my settings:

wez commented 9 months ago

I've noticed that with the Internet down, the addon won't start at all due to DNS errors.

@tankdeer please share the errors that you see in this case, in a separate issue, thanks!

tankdeer commented 9 months ago

Sure, here's the log from trying to start with no internet connectivity.

s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
GOVEE_API_KEY=REDACTED
GOVEE_MQTT_HOST=core-mosquitto
GOVEE_EMAIL=REDACTED
GOVEE_PASSWORD=REDACTED
GOVEE_MQTT_PASSWORD=REDACTED
GOVEE_MQTT_USER=addons
GOVEE_MQTT_PORT=1883
++ cd /app
++ exec /app/govee serve
[2024-01-15T17:25:05 INFO  govee::commands::serve] Starting service. version 2024.01.13-b7277f05
[2024-01-15T17:25:05 INFO  govee::commands::serve] Querying platform API for device list
[2024-01-15T17:25:10 WARN  govee::cache] error sending request for url (https://openapi.api.govee.com/router/api/v1/user/devices): error trying to connect: dns error: failed to lookup address information: Try again: error trying to connect: dns error: failed to lookup address information: Try again: dns error: failed to lookup address information: Try again: failed to lookup address information: Try again, will use prior results
Error: error sending request for url (https://openapi.api.govee.com/router/api/v1/user/devices): error trying to connect: dns error: failed to lookup address information: Try again: error trying to connect: dns error: failed to lookup address information: Try again: dns error: failed to lookup address information: Try again: failed to lookup address information: Try again

Stack backtrace:
   0: anyhow::error::<impl anyhow::Error>::msg
   1: anyhow::__private::format_err
   2: govee::cache::CacheResult<T>::into_result
   3: govee::platform_api::GoveeApiClient::get_devices::{{closure}}
   4: govee::commands::serve::ServeCommand::run::{{closure}}
   5: govee::Args::run::{{closure}}
   6: tokio::runtime::park::CachedParkThread::block_on
   7: tokio::runtime::runtime::Runtime::block_on
   8: govee::main
   9: std::sys_common::backtrace::__rust_begin_short_backtrace
  10: std::rt::lang_start::{{closure}}
  11: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/core/src/ops/function.rs:284:13
  12: std::panicking::try::do_call
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs:552:40
  13: std::panicking::try
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs:516:19
  14: std::panic::catch_unwind
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panic.rs:142:14
  15: std::rt::lang_start_internal::{{closure}}
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/rt.rs:148:48
  16: std::panicking::try::do_call
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs:552:40
  17: std::panicking::try
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs:516:19
  18: std::panic::catch_unwind
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panic.rs:142:14
  19: std::rt::lang_start_internal
             at /rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/rt.rs:148:20
  20: std::rt::lang_start
s6-rc: info: service legacy-services: stopping
s6-rc: info: service legacy-services successfully stopped
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
wez commented 9 months ago

I'd recommend deleting the kettle device and restarting the addon so that it gets recreated; I think the reason that the boiling parameter is unavailable in the UI is because govee2mqtt no longer generates a number entity for it, since the metadata provides no way to control that parameter.

When activating a work mode from the select box, we pick the lowest of the possible values from the metadata. In the case of boiling parameter that is the default value of 0. We send that command to the platform API, and what happens next is up to Govee. It usually results in the mode changing and device-dependent stuff happening. For my humidifier, if I pick "Auto" mode it will use the last humidity target percentage that was requested. For custom mode on that device, I have no idea what it does because I don't understand what that does in the app itself(!) but I think it activates some kind of custom preset based on a prior complex interaction.

In summary: there's not really anything govee2mqtt can do to activate that mode "better" with the platform API. Reverse engineering the IoT/BLE packets might enable more useful functionality, but that is complex and I don't know that we can do it well enough without sniffing BLE traffic somehow.

wez commented 9 months ago

Temperature related entities have changed in the latest version of the addon. There are some steps you need to take when upgrading:

If your device has a temperature reading, there is now only a single sensor entity that will report the value using the temperature scale that you configured with govee2mqtt. (There isn't a simple way to automatically get this from hass).

If your device has a temperature control, there should now be a number entity that will allow you to set the temperature. It will use the temperature scale that you configured with govee2mqtt.

tankdeer commented 9 months ago

Great, thanks. Here's my observations after updating to the latest version.

Obviously being a kettle, this would never be above 212°F. I believe this should be the current kettle temperature, correct? If so, the app is showing it at 136°F.

It looks like it's taking a value in F, thinking it's C, and converting it. (136 * 9/5) + 32 = 276.8.

It also seems to only update the temperature when the power switch is on. I have a feeling that is an API limitation and we are not receiving any info when not actively powering it, but wanted to mention it just in case

wez commented 9 months ago
  • This device does have a temperature control, however no entity was created in HA for it.

Please set the debug level to govee=trace and restart the addon, and share the logs. Looking at the metadata you shared previously, the temperature setting has a different name from other devices, but otherwise looks to have the same shape, so I'd expect the entity to be created, but not controllable.

Another possibility is that HASS didn't like the entity and has logged an error about it in your HASS logs; please take a look and share here.

  • The scaling on the temperature sensor is still off.

I'll add a quirk to indicate that this device operates using Farenheit

  • Changing the sliders/numbers for each mode does not change the setting on the device, but does basically the same as changing the select. For example, changing the Tea slider turns the kettle on with the Tea index of 0. It doesn't matter what value you pick.

Hmm, I think this may be an issue with the API for this device. The sliders use the same logic as that in my humidifier, and setting the manual mist level with the slider works correctly for me. Are there error messages in the addon logs? If not, I think this may be a govee bug.

Valdorama commented 9 months ago

I'm seeing pretty much the same behaviour as @tankdeer. What I'm seeing is that changing the sliders does seem to automatically turn the kettle on and set the target temp accordingly. For example my tea set up is:

image

If I set the slider to 1 it starts the kettle in Green Tea mode (as observed in the phone app). If I set the slider to 3 it changes it to Oolong Tea (as observed in the app).

tankdeer commented 9 months ago

Ok, it looks like there was something wrong on my end regarding the sliders. I noticed the options got corrupted in the app, but after deleting them and re-adding, the sliders seem to work as expected now (Sets the correct target, and turns the kettle on).

Regarding the target temperature, you're right. There was an error I missed in the log:

2024-01-16 09:40:55.544 ERROR (MainThread) [homeassistant.components.mqtt.mixins] Error 'string value is None for dictionary value @ data['state_topic']' when processing MQTT discovery message topic: 'homeassistant/number/1E6E6074F45F3E1E-slidertemperature/config', message: '{'availability_topic': 'gv2mqtt/availability', 'name': 'Target Temperature', 'origin': {'name': 'gv2mqtt', 'sw_version': '2024.01.16-f8ed644b', 'support_url': 'https://github.com/wez/govee2mqtt'}, 'device': {'name': 'Bev', 'manufacturer': 'Govee', 'model': 'H7173', 'via_device': 'gv2mqtt', 'identifiers': ['gv2mqtt-1E6E6074F45F3E1E']}, 'unique_id': '1E6E6074F45F3E1E-slidertemperature', 'icon': 'mdi:thermometer', 'command_topic': 'gv2mqtt/1E6E6074F45F3E1E/set-temperature/°C', 'state_topic': None, 'min': 40.0, 'max': 100.0, 'step': 1.0, 'unit_of_measurement': '°C', 'platform': 'mqtt'}'

Here's the trace log on startup. I did not strip out the info for my other deice as I did not want to accidentally remove something meaningful.

s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service legacy-services: starting
s6-rc: info: service legacy-services successfully started
GOVEE_API_KEY=REDACTED
GOVEE_MQTT_HOST=core-mosquitto
GOVEE_TEMPERATURE_SCALE=F
GOVEE_EMAIL=REDACTED
GOVEE_PASSWORD=REDACTED
GOVEE_MQTT_PASSWORD=REDACTED
GOVEE_MQTT_USER=addons
GOVEE_MQTT_PORT=1883
++ cd /app
++ exec /app/govee serve
[2024-01-16T13:12:46 INFO  govee::commands::serve] Starting service. version 2024.01.16-f8ed644b
[2024-01-16T13:12:46 INFO  govee::commands::serve] Querying platform API for device list
[2024-01-16T13:12:46 TRACE govee::cache] cache miss for device-list
[2024-01-16T13:12:47 INFO  govee::commands::serve] Querying undocumented API for device + room list
[2024-01-16T13:12:47 TRACE govee::cache] cache miss for account-info
[2024-01-16T13:12:48 TRACE govee::service::iot] LoginAccountResponse {
    a: REDACTED,
    b: REDACTED,
    account_id: REDACTED,
    client: REDACTED,
    is_savvy_user: true,
    refresh_token: Some(
        REDACTED,
    ),
    client_name: Some(
        "",
    ),
    push_token: Some(
        REDACTED,
    ),
    version_code: Some(
        "",
    ),
    version_name: Some(
        "",
    ),
    sys_version: Some(
        "",
    ),
    token: REDACTED,
    token_expire_cycle: 57600,
    topic: REDACTED,
}
[2024-01-16T13:12:48 TRACE govee::cache] cache hit for iot-key
[2024-01-16T13:12:48 TRACE govee::service::iot] IotKey {
    endpoint: "aqm3wd1qlc3dy-ats.iot.us-east-1.amazonaws.com",
    log: "pro0",
    p12: REDACTED,
    p12_pass: REDACTED,
}
[2024-01-16T13:12:48 TRACE govee::service::iot] parsing IoT PFX key
[2024-01-16T13:12:48 TRACE govee::service::iot] Connecting to IoT aqm3wd1qlc3dy-ats.iot.us-east-1.amazonaws.com port 8883
[2024-01-16T13:12:48 INFO  govee::service::iot] Connected to IoT: CONNACK code 0: Connection Accepted.
[2024-01-16T13:12:48 INFO  govee::service::iot] IoT (re)connected with status CONNACK code 0: Connection Accepted.
[2024-01-16T13:12:48 INFO  govee::commands::serve] Starting LAN discovery
[2024-01-16T13:12:48 TRACE govee::lan_api] Send disco packet to 239.255.255.250
[2024-01-16T13:12:48 INFO  govee::commands::serve] Waiting 10 seconds for LAN API discovery
[2024-01-16T13:12:48 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54695 data={"msg":{"cmd":"scan","data":{"ip":"192.168.30.199","device":"A4:2A:CC:38:32:30:55:39","sku":"H7066","bleVersionHard":"3.01.01","bleVersionSoft":"1.00.08","wifiVersionHard":"1.02.00","wifiVersionSoft":"2.05.08"}}}
[2024-01-16T13:12:48 TRACE govee::commands::serve] LAN disco: LanDevice { ip: 192.168.30.199, device: "A4:2A:CC:38:32:30:55:39", sku: "H7066", ble_version_hard: "3.01.01", ble_version_soft: "1.00.08", wifi_version_hard: "1.02.00", wifi_version_soft: "2.05.08" }
[2024-01-16T13:12:48 TRACE govee::lan_api] query status of 192.168.30.199
[2024-01-16T13:12:48 TRACE govee::lan_api] LanDevice::send_request to 192.168.30.199 DevStatus
[2024-01-16T13:12:48 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54696 data={"msg":{"cmd":"devStatus","data":{"onOff":0,"brightness":100,"color":{"r":255,"g":7,"b":151},"colorTemInKelvin":0}}}
[2024-01-16T13:12:48 TRACE govee::commands::serve] LAN disco: update and notify A4:2A:CC:38:32:30:55:39
[2024-01-16T13:12:50 TRACE govee::lan_api] Send disco packet to 239.255.255.250
[2024-01-16T13:12:50 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54697 data={"msg":{"cmd":"scan","data":{"ip":"192.168.30.199","device":"A4:2A:CC:38:32:30:55:39","sku":"H7066","bleVersionHard":"3.01.01","bleVersionSoft":"1.00.08","wifiVersionHard":"1.02.00","wifiVersionSoft":"2.05.08"}}}
[2024-01-16T13:12:50 TRACE govee::commands::serve] LAN disco: LanDevice { ip: 192.168.30.199, device: "A4:2A:CC:38:32:30:55:39", sku: "H7066", ble_version_hard: "3.01.01", ble_version_soft: "1.00.08", wifi_version_hard: "1.02.00", wifi_version_soft: "2.05.08" }
[2024-01-16T13:12:50 TRACE govee::lan_api] query status of 192.168.30.199
[2024-01-16T13:12:50 TRACE govee::lan_api] LanDevice::send_request to 192.168.30.199 DevStatus
[2024-01-16T13:12:50 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54698 data={"msg":{"cmd":"devStatus","data":{"onOff":0,"brightness":100,"color":{"r":255,"g":7,"b":151},"colorTemInKelvin":0}}}
[2024-01-16T13:12:50 TRACE govee::commands::serve] LAN disco: update and notify A4:2A:CC:38:32:30:55:39
2024-01-16T13:13:02 TRACE govee::cache] cache hit for scene-list-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:02 TRACE govee::cache] cache hit for scene-list-diy-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:02 TRACE govee::cache] cache hit for scenes-H7066
[2024-01-16T13:13:02 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/state -> Available
[2024-01-16T13:13:02 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/attributes -> {"http":null,"iot":null,"lan":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:02.734181687Z"},"overall":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:02.734181687Z"},"platform_metadata":{"capabilities":[{"alarmType":null,"eventState":null,"instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.on_off"},{"alarmType":null,"eventState":null,"instance":"gradientToggle","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.toggle"},{"alarmType":null,"eventState":null,"instance":"brightness","parameters":{"dataType":"INTEGER","range":{"max":100,"min":1,"precision":1},"unit":"unit.percent"},"type":"devices.capabilities.range"},{"alarmType":null,"eventState":null,"instance":"segmentedBrightness","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"brightness","range":{"max":100,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"segmentedColorRgb","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"colorRgb","parameters":{"dataType":"INTEGER","range":{"max":16777215,"min":0,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"colorTemperatureK","parameters":{"dataType":"INTEGER","range":{"max":9000,"min":2000,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"lightScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"},{"alarmType":null,"eventState":null,"instance":"musicMode","parameters":{"dataType":"STRUCT","fields":[{"dataType":"ENUM","defaultValue":null,"fieldName":"musicMode","options":[{"name":"Rhythm","value":1},{"name":"Shiny","value":2},{"name":"Luminous","value":3},{"name":"Hopping","value":4},{"name":"Sprouting","value":5}],"required":true},{"dataType":"INTEGER","defaultValue":null,"fieldName":"sensitivity","range":{"max":100,"min":0,"precision":1},"required":true,"unit":"unit.percent"},{"dataType":"ENUM","defaultValue":null,"fieldName":"autoColor","options":[{"name":"on","value":1},{"name":"off","value":0}],"required":false},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":false,"unit":null}]},"type":"devices.capabilities.music_setting"},{"alarmType":null,"eventState":null,"instance":"diyScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"}],"device":"A4:2A:CC:38:32:30:55:39","deviceName":"Backyard Spotlights","sku":"H7066","type":"devices.types.light"},"platform_state":null}
[2024-01-16T13:13:02 TRACE govee::hass_mqtt::light] LightConfig::notify_state: state is DeviceState { on: false, online: None, kelvin: 0, color: DeviceColor { r: 255, g: 7, b: 151 }, brightness: 100, scene: None, source: "LAN API", updated: 2024-01-16T21:13:02.734181687Z }
[2024-01-16T13:13:02 TRACE govee::service::hass] gv2mqtt/light/A42ACC3832305539/state -> {"state":"OFF"}
[2024-01-16T13:13:02 TRACE govee::service::hass] gv2mqtt/switch/A42ACC3832305539/powerSwitch/state -> OFF
[2024-01-16T13:13:02 TRACE govee::hass_mqtt::switch] CapabilitySwitch::notify_state: didn't find state for Backyard Spotlights (A4:2A:CC:38:32:30:55:39 H7066) gradientToggle
[2024-01-16T13:13:03 TRACE govee::cache] cache hit for community-login
[2024-01-16T13:13:03 TRACE govee::cache] cache hit for one-click-shortcuts
[2024-01-16T13:13:03 TRACE govee::cache] cache hit for scene-list-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:03 TRACE govee::cache] cache hit for scene-list-diy-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:03 TRACE govee::cache] cache hit for scenes-H7066
[2024-01-16T13:13:03 TRACE govee::service::hass] register_with_hass: register entities
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/sensor/global-version/config -> {"availability_topic":"gv2mqtt/availability","name":"Version","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Govee to MQTT","manufacturer":"Wez Furlong","model":"govee2mqtt","sw_version":"2024.01.16-f8ed644b","identifiers":["gv2mqtt"]},"unique_id":"global-version","entity_category":"diagnostic","state_topic":"gv2mqtt/sensor/global-version/state"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/button/global-purge_caches/config -> {"availability_topic":"gv2mqtt/availability","name":"Purge Caches","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Govee to MQTT","manufacturer":"Wez Furlong","model":"govee2mqtt","sw_version":"2024.01.16-f8ed644b","identifiers":["gv2mqtt"]},"unique_id":"global-purge_caches","command_topic":"gv2mqtt/purge-caches"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/config -> {"availability_topic":"gv2mqtt/availability","name":"Status","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"sensor-1E6E6074F45F3E1E-gv2mqtt-status","entity_category":"diagnostic","state_topic":"gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/state","json_attributes_topic":"gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/attributes"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/button/gv2mqtt-1E6E6074F45F3E1E-request-platform-data/config -> {"availability_topic":"gv2mqtt/availability","name":"Request Platform API State","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"gv2mqtt-1E6E6074F45F3E1E-request-platform-data","entity_category":"diagnostic","command_topic":"gv2mqtt/1E6E6074F45F3E1E/request-platform-data"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/switch/gv2mqtt-1E6E6074F45F3E1E-powerSwitch/config -> {"availability_topic":"gv2mqtt/availability","name":"Power Switch","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"gv2mqtt-1E6E6074F45F3E1E-powerSwitch","command_topic":"gv2mqtt/switch/1E6E6074F45F3E1E/command/powerSwitch","state_topic":"gv2mqtt/switch/1E6E6074F45F3E1E/powerSwitch/state"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/number/1E6E6074F45F3E1E-slidertemperature/config -> {"availability_topic":"gv2mqtt/availability","name":"Target Temperature","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"1E6E6074F45F3E1E-slidertemperature","icon":"mdi:thermometer","command_topic":"gv2mqtt/1E6E6074F45F3E1E/set-temperature/°F","state_topic":null,"min":40.0,"max":100.0,"step":1.0,"unit_of_measurement":"°F"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/sensor/sensor-1E6E6074F45F3E1E-sensortemperature/config -> {"availability_topic":"gv2mqtt/availability","name":"Temperature","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"sensor-1E6E6074F45F3E1E-sensortemperature","entity_category":"diagnostic","state_topic":"gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-sensortemperature/state","unit_of_measurement":"°F"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/number/gv2mqtt-1E6E6074F45F3E1E-Coffee-number/config -> {"availability_topic":"gv2mqtt/availability","name":"Coffee Parameter","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"gv2mqtt-1E6E6074F45F3E1E-Coffee-number","command_topic":"gv2mqtt/number/1E6E6074F45F3E1E/command/Coffee/4","state_topic":"gv2mqtt/number/1E6E6074F45F3E1E/state/coffee","min":1.0,"max":4.0,"step":1.0}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/number/gv2mqtt-1E6E6074F45F3E1E-Tea-number/config -> {"availability_topic":"gv2mqtt/availability","name":"Tea Parameter","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"gv2mqtt-1E6E6074F45F3E1E-Tea-number","command_topic":"gv2mqtt/number/1E6E6074F45F3E1E/command/Tea/3","state_topic":"gv2mqtt/number/1E6E6074F45F3E1E/state/tea","min":1.0,"max":4.0,"step":1.0}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/number/gv2mqtt-1E6E6074F45F3E1E-DIY-number/config -> {"availability_topic":"gv2mqtt/availability","name":"DIY Parameter","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"gv2mqtt-1E6E6074F45F3E1E-DIY-number","command_topic":"gv2mqtt/number/1E6E6074F45F3E1E/command/DIY/1","state_topic":"gv2mqtt/number/1E6E6074F45F3E1E/state/diy","min":1.0,"max":4.0,"step":1.0}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/select/gv2mqtt-1E6E6074F45F3E1E-workMode/config -> {"availability_topic":"gv2mqtt/availability","name":"Mode","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Bev","manufacturer":"Govee","model":"H7173","via_device":"gv2mqtt","identifiers":["gv2mqtt-1E6E6074F45F3E1E"]},"unique_id":"gv2mqtt-1E6E6074F45F3E1E-workMode","command_topic":"gv2mqtt/1E6E6074F45F3E1E/set-work-mode","options":["Boiling","Coffee","DIY","Tea"],"state_topic":"gv2mqtt/1E6E6074F45F3E1E/notify-work-mode"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/sensor/sensor-A42ACC3832305539-gv2mqtt-status/config -> {"availability_topic":"gv2mqtt/availability","name":"Status","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"sensor-A42ACC3832305539-gv2mqtt-status","entity_category":"diagnostic","state_topic":"gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/state","json_attributes_topic":"gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/attributes"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/button/gv2mqtt-A42ACC3832305539-request-platform-data/config -> {"availability_topic":"gv2mqtt/availability","name":"Request Platform API State","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-request-platform-data","entity_category":"diagnostic","command_topic":"gv2mqtt/A42ACC3832305539/request-platform-data"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/light/gv2mqtt-A42ACC3832305539/config -> {"availability_topic":"gv2mqtt/availability","name":null,"origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539","schema":"json","command_topic":"gv2mqtt/light/A42ACC3832305539/command","state_topic":"gv2mqtt/light/A42ACC3832305539/state","optimistic":false,"supported_color_modes":["rgb","color_temp"],"color_mode":true,"brightness":true,"brightness_scale":100,"icon":"mdi:light-bulb","effect":true,"effect_list":["Aurora","Blossom","Cherry blossoms","Christmas","Christmas Gift","Christmas Tree","Crossing","Desert","Dreamlike","Dynamic","Fall","Father's Day","Fire","Firefly","Flower Field","Forest","Glacier","Halloween","Halloween B","Halloween C","Happy","Moonlight","Mother's Day","Music: Hopping","Music: Luminous","Music: Rhythm","Music: Shiny","Music: Sprouting","Party","Rainbow","Seasonal","Sled","Spring","Star","Summer","Sunrise","Sunset","Thunderstorm","Valentine's Day","Winter"],"min_mireds":111,"max_mireds":500,"payload_available":"online"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/switch/gv2mqtt-A42ACC3832305539-powerSwitch/config -> {"availability_topic":"gv2mqtt/availability","name":"Power Switch","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-powerSwitch","command_topic":"gv2mqtt/switch/A42ACC3832305539/command/powerSwitch","state_topic":"gv2mqtt/switch/A42ACC3832305539/powerSwitch/state"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/switch/gv2mqtt-A42ACC3832305539-gradientToggle/config -> {"availability_topic":"gv2mqtt/availability","name":"Gradient Toggle","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-gradientToggle","command_topic":"gv2mqtt/switch/A42ACC3832305539/command/gradientToggle","state_topic":"gv2mqtt/switch/A42ACC3832305539/gradientToggle/state"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/light/gv2mqtt-A42ACC3832305539-0/config -> {"availability_topic":"gv2mqtt/availability","name":"Segment 001","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-0","schema":"json","command_topic":"gv2mqtt/light/A42ACC3832305539/command/0","state_topic":"gv2mqtt/light/A42ACC3832305539/state/0","optimistic":true,"supported_color_modes":["rgb"],"color_mode":true,"brightness":true,"brightness_scale":100,"effect":true,"payload_available":"online"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/light/gv2mqtt-A42ACC3832305539-1/config -> {"availability_topic":"gv2mqtt/availability","name":"Segment 002","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-1","schema":"json","command_topic":"gv2mqtt/light/A42ACC3832305539/command/1","state_topic":"gv2mqtt/light/A42ACC3832305539/state/1","optimistic":true,"supported_color_modes":["rgb"],"color_mode":true,"brightness":true,"brightness_scale":100,"effect":true,"payload_available":"online"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/light/gv2mqtt-A42ACC3832305539-2/config -> {"availability_topic":"gv2mqtt/availability","name":"Segment 003","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-2","schema":"json","command_topic":"gv2mqtt/light/A42ACC3832305539/command/2","state_topic":"gv2mqtt/light/A42ACC3832305539/state/2","optimistic":true,"supported_color_modes":["rgb"],"color_mode":true,"brightness":true,"brightness_scale":100,"effect":true,"payload_available":"online"}
[2024-01-16T13:13:03 TRACE govee::service::hass] homeassistant/light/gv2mqtt-A42ACC3832305539-3/config -> {"availability_topic":"gv2mqtt/availability","name":"Segment 004","origin":{"name":"gv2mqtt","sw_version":"2024.01.16-f8ed644b","url":"https://github.com/wez/govee2mqtt"},"device":{"name":"Backyard Spotlights","manufacturer":"Govee","model":"H7066","via_device":"gv2mqtt","identifiers":["gv2mqtt-A42ACC3832305539"]},"unique_id":"gv2mqtt-A42ACC3832305539-3","schema":"json","command_topic":"gv2mqtt/light/A42ACC3832305539/command/3","state_topic":"gv2mqtt/light/A42ACC3832305539/state/3","optimistic":true,"supported_color_modes":["rgb"],"color_mode":true,"brightness":true,"brightness_scale":100,"effect":true,"payload_available":"online"}
[2024-01-16T13:13:03 INFO  govee::service::hass] Wait 1s for hass to settle on 20 entity configs
[2024-01-16T13:13:04 TRACE govee::service::hass] register_with_hass: mark as online
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/availability -> online
[2024-01-16T13:13:04 TRACE govee::service::hass] register_with_hass: reporting state
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/sensor/global-version/state -> 2024.01.16-f8ed644b
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/state -> Unknown
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/attributes -> {"http":null,"iot":null,"lan":null,"overall":null,"platform_metadata":{"capabilities":[{"alarmType":null,"eventState":null,"instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.on_off"},{"alarmType":null,"eventState":null,"instance":"sliderTemperature","parameters":{"dataType":"STRUCT","fields":[{"dataType":"INTEGER","defaultValue":null,"fieldName":"temperature","range":{"max":100,"min":40,"precision":1},"required":true,"unit":null},{"dataType":"ENUM","defaultValue":"Celsius","fieldName":"unit","options":[{"name":"Celsius","value":"Celsius"},{"name":"Fahrenheit","value":"Fahrenheit"}],"required":true}]},"type":"devices.capabilities.temperature_setting"},{"alarmType":null,"eventState":null,"instance":"sensorTemperature","parameters":null,"type":"devices.capabilities.property"},{"alarmType":null,"eventState":null,"instance":"workMode","parameters":{"dataType":"STRUCT","fields":[{"dataType":"ENUM","defaultValue":null,"fieldName":"workMode","options":[{"name":"DIY","value":1},{"name":"Boiling","value":2},{"name":"Tea","value":3},{"name":"Coffee","value":4}],"required":true},{"dataType":"ENUM","defaultValue":null,"fieldName":"modeValue","options":[{"defaultValue":0,"name":"Boiling","value":null},{"dataType":"ENUM","name":"Tea","options":[{"value":1},{"value":2},{"value":3},{"value":4}],"value":null},{"dataType":"ENUM","name":"Coffee","options":[{"value":1},{"value":2},{"value":3},{"value":4}],"value":null},{"dataType":"ENUM","name":"DIY","options":[{"value":1},{"value":2},{"value":3},{"value":4}],"value":null}],"required":false}]},"type":"devices.capabilities.work_mode"}],"device":"1E:6E:60:74:F4:5F:3E:1E","deviceName":"Bev","sku":"H7173","type":"devices.types.kettle"},"platform_state":null}
[2024-01-16T13:13:04 TRACE govee::hass_mqtt::sensor] CapabilitySensor::notify_state: didn't find state for Bev (1E:6E:60:74:F4:5F:3E:1E H7173) sensorTemperature
[2024-01-16T13:13:04 DEBUG govee::hass_mqtt::number] Don't know how to report state for 1E:6E:60:74:F4:5F:3E:1E workMode Coffee value
[2024-01-16T13:13:04 DEBUG govee::hass_mqtt::number] Don't know how to report state for 1E:6E:60:74:F4:5F:3E:1E workMode Tea value
[2024-01-16T13:13:04 DEBUG govee::hass_mqtt::number] Don't know how to report state for 1E:6E:60:74:F4:5F:3E:1E workMode DIY value
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/state -> Available
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/attributes -> {"http":null,"iot":null,"lan":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:02.734181687Z"},"overall":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:02.734181687Z"},"platform_metadata":{"capabilities":[{"alarmType":null,"eventState":null,"instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.on_off"},{"alarmType":null,"eventState":null,"instance":"gradientToggle","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.toggle"},{"alarmType":null,"eventState":null,"instance":"brightness","parameters":{"dataType":"INTEGER","range":{"max":100,"min":1,"precision":1},"unit":"unit.percent"},"type":"devices.capabilities.range"},{"alarmType":null,"eventState":null,"instance":"segmentedBrightness","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"brightness","range":{"max":100,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"segmentedColorRgb","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"colorRgb","parameters":{"dataType":"INTEGER","range":{"max":16777215,"min":0,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"colorTemperatureK","parameters":{"dataType":"INTEGER","range":{"max":9000,"min":2000,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"lightScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"},{"alarmType":null,"eventState":null,"instance":"musicMode","parameters":{"dataType":"STRUCT","fields":[{"dataType":"ENUM","defaultValue":null,"fieldName":"musicMode","options":[{"name":"Rhythm","value":1},{"name":"Shiny","value":2},{"name":"Luminous","value":3},{"name":"Hopping","value":4},{"name":"Sprouting","value":5}],"required":true},{"dataType":"INTEGER","defaultValue":null,"fieldName":"sensitivity","range":{"max":100,"min":0,"precision":1},"required":true,"unit":"unit.percent"},{"dataType":"ENUM","defaultValue":null,"fieldName":"autoColor","options":[{"name":"on","value":1},{"name":"off","value":0}],"required":false},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":false,"unit":null}]},"type":"devices.capabilities.music_setting"},{"alarmType":null,"eventState":null,"instance":"diyScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"}],"device":"A4:2A:CC:38:32:30:55:39","deviceName":"Backyard Spotlights","sku":"H7066","type":"devices.types.light"},"platform_state":null}
[2024-01-16T13:13:04 TRACE govee::hass_mqtt::light] LightConfig::notify_state: state is DeviceState { on: false, online: None, kelvin: 0, color: DeviceColor { r: 255, g: 7, b: 151 }, brightness: 100, scene: None, source: "LAN API", updated: 2024-01-16T21:13:02.734181687Z }
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/light/A42ACC3832305539/state -> {"state":"OFF"}
[2024-01-16T13:13:04 TRACE govee::service::hass] gv2mqtt/switch/A42ACC3832305539/powerSwitch/state -> OFF
[2024-01-16T13:13:04 TRACE govee::hass_mqtt::switch] CapabilitySwitch::notify_state: didn't find state for Backyard Spotlights (A4:2A:CC:38:32:30:55:39 H7066) gradientToggle
[2024-01-16T13:13:04 TRACE govee::service::hass] register_with_hass: done
[2024-01-16T13:13:04 INFO  govee::service::hass] MQTT connected with status=CONNACK code 0: Connection Accepted.
[2024-01-16T13:13:18 TRACE govee::lan_api] Send disco packet to 239.255.255.250
[2024-01-16T13:13:18 INFO  govee::service::state] requesting update via Platform API Bev (1E:6E:60:74:F4:5F:3E:1E H7173) None
[2024-01-16T13:13:18 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54703 data={"msg":{"cmd":"scan","data":{"ip":"192.168.30.199","device":"A4:2A:CC:38:32:30:55:39","sku":"H7066","bleVersionHard":"3.01.01","bleVersionSoft":"1.00.08","wifiVersionHard":"1.02.00","wifiVersionSoft":"2.05.08"}}}
[2024-01-16T13:13:18 TRACE govee::commands::serve] LAN disco: LanDevice { ip: 192.168.30.199, device: "A4:2A:CC:38:32:30:55:39", sku: "H7066", ble_version_hard: "3.01.01", ble_version_soft: "1.00.08", wifi_version_hard: "1.02.00", wifi_version_soft: "2.05.08" }
[2024-01-16T13:13:18 TRACE govee::lan_api] query status of 192.168.30.199
[2024-01-16T13:13:18 TRACE govee::lan_api] LanDevice::send_request to 192.168.30.199 DevStatus
[2024-01-16T13:13:18 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54704 data={"msg":{"cmd":"devStatus","data":{"onOff":0,"brightness":100,"color":{"r":255,"g":7,"b":151},"colorTemInKelvin":0}}}
[2024-01-16T13:13:18 TRACE govee::commands::serve] LAN disco: update and notify A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:18 TRACE govee::cache] cache hit for scene-list-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:18 TRACE govee::cache] cache hit for scene-list-diy-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:18 TRACE govee::cache] cache hit for scenes-H7066
[2024-01-16T13:13:18 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/state -> Available
[2024-01-16T13:13:18 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/attributes -> {"http":null,"iot":null,"lan":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:18.738206593Z"},"overall":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:18.738206593Z"},"platform_metadata":{"capabilities":[{"alarmType":null,"eventState":null,"instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.on_off"},{"alarmType":null,"eventState":null,"instance":"gradientToggle","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.toggle"},{"alarmType":null,"eventState":null,"instance":"brightness","parameters":{"dataType":"INTEGER","range":{"max":100,"min":1,"precision":1},"unit":"unit.percent"},"type":"devices.capabilities.range"},{"alarmType":null,"eventState":null,"instance":"segmentedBrightness","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"brightness","range":{"max":100,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"segmentedColorRgb","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"colorRgb","parameters":{"dataType":"INTEGER","range":{"max":16777215,"min":0,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"colorTemperatureK","parameters":{"dataType":"INTEGER","range":{"max":9000,"min":2000,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"lightScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"},{"alarmType":null,"eventState":null,"instance":"musicMode","parameters":{"dataType":"STRUCT","fields":[{"dataType":"ENUM","defaultValue":null,"fieldName":"musicMode","options":[{"name":"Rhythm","value":1},{"name":"Shiny","value":2},{"name":"Luminous","value":3},{"name":"Hopping","value":4},{"name":"Sprouting","value":5}],"required":true},{"dataType":"INTEGER","defaultValue":null,"fieldName":"sensitivity","range":{"max":100,"min":0,"precision":1},"required":true,"unit":"unit.percent"},{"dataType":"ENUM","defaultValue":null,"fieldName":"autoColor","options":[{"name":"on","value":1},{"name":"off","value":0}],"required":false},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":false,"unit":null}]},"type":"devices.capabilities.music_setting"},{"alarmType":null,"eventState":null,"instance":"diyScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"}],"device":"A4:2A:CC:38:32:30:55:39","deviceName":"Backyard Spotlights","sku":"H7066","type":"devices.types.light"},"platform_state":null}
[2024-01-16T13:13:18 TRACE govee::hass_mqtt::light] LightConfig::notify_state: state is DeviceState { on: false, online: None, kelvin: 0, color: DeviceColor { r: 255, g: 7, b: 151 }, brightness: 100, scene: None, source: "LAN API", updated: 2024-01-16T21:13:18.738206593Z }
[2024-01-16T13:13:18 TRACE govee::service::hass] gv2mqtt/light/A42ACC3832305539/state -> {"state":"OFF"}
[2024-01-16T13:13:18 TRACE govee::service::hass] gv2mqtt/switch/A42ACC3832305539/powerSwitch/state -> OFF
[2024-01-16T13:13:18 TRACE govee::hass_mqtt::switch] CapabilitySwitch::notify_state: didn't find state for Backyard Spotlights (A4:2A:CC:38:32:30:55:39 H7066) gradientToggle
[2024-01-16T13:13:19 TRACE govee::service::state] updated state for Bev (1E:6E:60:74:F4:5F:3E:1E H7173)
[2024-01-16T13:13:19 TRACE govee::service::hass] gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/state -> Available
[2024-01-16T13:13:19 TRACE govee::service::hass] gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-gv2mqtt-status/attributes -> {"http":{"brightness":0,"color":{"b":0,"g":0,"r":0},"kelvin":0,"on":false,"online":true,"scene":null,"source":"PLATFORM API","updated":"2024-01-16T21:13:19.266347569Z"},"iot":null,"lan":null,"overall":{"brightness":0,"color":{"b":0,"g":0,"r":0},"kelvin":0,"on":false,"online":true,"scene":null,"source":"PLATFORM API","updated":"2024-01-16T21:13:19.266347569Z"},"platform_metadata":{"capabilities":[{"alarmType":null,"eventState":null,"instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.on_off"},{"alarmType":null,"eventState":null,"instance":"sliderTemperature","parameters":{"dataType":"STRUCT","fields":[{"dataType":"INTEGER","defaultValue":null,"fieldName":"temperature","range":{"max":100,"min":40,"precision":1},"required":true,"unit":null},{"dataType":"ENUM","defaultValue":"Celsius","fieldName":"unit","options":[{"name":"Celsius","value":"Celsius"},{"name":"Fahrenheit","value":"Fahrenheit"}],"required":true}]},"type":"devices.capabilities.temperature_setting"},{"alarmType":null,"eventState":null,"instance":"sensorTemperature","parameters":null,"type":"devices.capabilities.property"},{"alarmType":null,"eventState":null,"instance":"workMode","parameters":{"dataType":"STRUCT","fields":[{"dataType":"ENUM","defaultValue":null,"fieldName":"workMode","options":[{"name":"DIY","value":1},{"name":"Boiling","value":2},{"name":"Tea","value":3},{"name":"Coffee","value":4}],"required":true},{"dataType":"ENUM","defaultValue":null,"fieldName":"modeValue","options":[{"defaultValue":0,"name":"Boiling","value":null},{"dataType":"ENUM","name":"Tea","options":[{"value":1},{"value":2},{"value":3},{"value":4}],"value":null},{"dataType":"ENUM","name":"Coffee","options":[{"value":1},{"value":2},{"value":3},{"value":4}],"value":null},{"dataType":"ENUM","name":"DIY","options":[{"value":1},{"value":2},{"value":3},{"value":4}],"value":null}],"required":false}]},"type":"devices.capabilities.work_mode"}],"device":"1E:6E:60:74:F4:5F:3E:1E","deviceName":"Bev","sku":"H7173","type":"devices.types.kettle"},"platform_state":{"capabilities":[{"instance":"online","state":{"value":true},"type":"devices.capabilities.online"},{"instance":"powerSwitch","state":{"value":0},"type":"devices.capabilities.on_off"},{"instance":"sliderTemperature","state":{"value":{"targetTemperature":82,"unit":"Celsius"}},"type":"devices.capabilities.temperature_setting"},{"instance":"sensorTemperature","state":{"value":88},"type":"devices.capabilities.property"},{"instance":"workMode","state":{"value":{"workMode":3}},"type":"devices.capabilities.work_mode"}],"device":"1E:6E:60:74:F4:5F:3E:1E","sku":"H7173"}}
[2024-01-16T13:13:19 TRACE govee::service::hass] gv2mqtt/switch/1E6E6074F45F3E1E/powerSwitch/state -> OFF
[2024-01-16T13:13:19 TRACE govee::service::hass] gv2mqtt/sensor/sensor-1E6E6074F45F3E1E-sensortemperature/state -> 190
[2024-01-16T13:13:19 DEBUG govee::hass_mqtt::number] Don't know how to report state for 1E:6E:60:74:F4:5F:3E:1E workMode Tea value
[2024-01-16T13:13:19 DEBUG govee::hass_mqtt::number] Don't know how to report state for 1E:6E:60:74:F4:5F:3E:1E workMode DIY value
[2024-01-16T13:13:19 DEBUG govee::hass_mqtt::number] Don't know how to report state for 1E:6E:60:74:F4:5F:3E:1E workMode Coffee value
[2024-01-16T13:13:19 TRACE govee::service::hass] gv2mqtt/1E6E6074F45F3E1E/notify-work-mode -> Tea
[2024-01-16T13:13:50 TRACE govee::lan_api] Send disco packet to 239.255.255.250
[2024-01-16T13:13:50 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54705 data={"msg":{"cmd":"scan","data":{"ip":"192.168.30.199","device":"A4:2A:CC:38:32:30:55:39","sku":"H7066","bleVersionHard":"3.01.01","bleVersionSoft":"1.00.08","wifiVersionHard":"1.02.00","wifiVersionSoft":"2.05.08"}}}
[2024-01-16T13:13:50 TRACE govee::commands::serve] LAN disco: LanDevice { ip: 192.168.30.199, device: "A4:2A:CC:38:32:30:55:39", sku: "H7066", ble_version_hard: "3.01.01", ble_version_soft: "1.00.08", wifi_version_hard: "1.02.00", wifi_version_soft: "2.05.08" }
[2024-01-16T13:13:50 TRACE govee::lan_api] query status of 192.168.30.199
[2024-01-16T13:13:50 TRACE govee::lan_api] LanDevice::send_request to 192.168.30.199 DevStatus
[2024-01-16T13:13:50 TRACE govee::lan_api] process_packet: addr=192.168.30.199:54706 data={"msg":{"cmd":"devStatus","data":{"onOff":0,"brightness":100,"color":{"r":255,"g":7,"b":151},"colorTemInKelvin":0}}}
[2024-01-16T13:13:50 TRACE govee::commands::serve] LAN disco: update and notify A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:50 TRACE govee::cache] cache hit for scene-list-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:50 TRACE govee::cache] cache hit for scene-list-diy-H7066-A4:2A:CC:38:32:30:55:39
[2024-01-16T13:13:50 TRACE govee::cache] cache hit for scenes-H7066
[2024-01-16T13:13:50 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/state -> Available
[2024-01-16T13:13:50 TRACE govee::service::hass] gv2mqtt/sensor/sensor-A42ACC3832305539-gv2mqtt-status/attributes -> {"http":null,"iot":null,"lan":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:50.770325925Z"},"overall":{"brightness":100,"color":{"b":151,"g":7,"r":255},"kelvin":0,"on":false,"online":null,"scene":null,"source":"LAN API","updated":"2024-01-16T21:13:50.770325925Z"},"platform_metadata":{"capabilities":[{"alarmType":null,"eventState":null,"instance":"powerSwitch","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.on_off"},{"alarmType":null,"eventState":null,"instance":"gradientToggle","parameters":{"dataType":"ENUM","options":[{"name":"on","value":1},{"name":"off","value":0}]},"type":"devices.capabilities.toggle"},{"alarmType":null,"eventState":null,"instance":"brightness","parameters":{"dataType":"INTEGER","range":{"max":100,"min":1,"precision":1},"unit":"unit.percent"},"type":"devices.capabilities.range"},{"alarmType":null,"eventState":null,"instance":"segmentedBrightness","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"brightness","range":{"max":100,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"segmentedColorRgb","parameters":{"dataType":"STRUCT","fields":[{"dataType":"Array","defaultValue":null,"elementRange":{"max":14,"min":0},"elementType":"INTEGER","fieldName":"segment","options":[],"required":true,"size":{"max":4,"min":1}},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":true,"unit":null}]},"type":"devices.capabilities.segment_color_setting"},{"alarmType":null,"eventState":null,"instance":"colorRgb","parameters":{"dataType":"INTEGER","range":{"max":16777215,"min":0,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"colorTemperatureK","parameters":{"dataType":"INTEGER","range":{"max":9000,"min":2000,"precision":1},"unit":null},"type":"devices.capabilities.color_setting"},{"alarmType":null,"eventState":null,"instance":"lightScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"},{"alarmType":null,"eventState":null,"instance":"musicMode","parameters":{"dataType":"STRUCT","fields":[{"dataType":"ENUM","defaultValue":null,"fieldName":"musicMode","options":[{"name":"Rhythm","value":1},{"name":"Shiny","value":2},{"name":"Luminous","value":3},{"name":"Hopping","value":4},{"name":"Sprouting","value":5}],"required":true},{"dataType":"INTEGER","defaultValue":null,"fieldName":"sensitivity","range":{"max":100,"min":0,"precision":1},"required":true,"unit":"unit.percent"},{"dataType":"ENUM","defaultValue":null,"fieldName":"autoColor","options":[{"name":"on","value":1},{"name":"off","value":0}],"required":false},{"dataType":"INTEGER","defaultValue":null,"fieldName":"rgb","range":{"max":16777215,"min":0,"precision":1},"required":false,"unit":null}]},"type":"devices.capabilities.music_setting"},{"alarmType":null,"eventState":null,"instance":"diyScene","parameters":{"dataType":"ENUM","options":[]},"type":"devices.capabilities.dynamic_scene"}],"device":"A4:2A:CC:38:32:30:55:39","deviceName":"Backyard Spotlights","sku":"H7066","type":"devices.types.light"},"platform_state":null}
[2024-01-16T13:13:50 TRACE govee::hass_mqtt::light] LightConfig::notify_state: state is DeviceState { on: false, online: None, kelvin: 0, color: DeviceColor { r: 255, g: 7, b: 151 }, brightness: 100, scene: None, source: "LAN API", updated: 2024-01-16T21:13:50.770325925Z }
[2024-01-16T13:13:50 TRACE govee::service::hass] gv2mqtt/light/A42ACC3832305539/state -> {"state":"OFF"}
[2024-01-16T13:13:50 TRACE govee::service::hass] gv2mqtt/switch/A42ACC3832305539/powerSwitch/state -> OFF
[2024-01-16T13:13:50 TRACE govee::hass_mqtt::switch] CapabilitySwitch::notify_state: didn't find state for Backyard Spotlights (A4:2A:CC:38:32:30:55:39 H7066) gradientToggle
wez commented 9 months ago

Thanks; I think this should be resolved in the latest version. I'd suggest removing the device and restarting the addon, as I've also changed how the modes show up for this device; rather than number sliders, you should now see buttons for each of the presets that you can rename to match what you see in the app.

Valdorama commented 9 months ago

Deployed the latest version. Observations thus far:

  1. This is what I have in terms of entities:

image

  1. Pressing Request Platform API State works well - the kettle was in use and pressing the button instantly updated the Power Switch state and current temp.
  2. Current temp is correct now.
  3. Power Switch correctly corresponds to the state of the kettle i.e. it is on for the duration that the kettle is heating.
  4. Mode correctly updates itself based on the selected mode.
  5. The three non-boiling modes obviously have the same name currently but do map to separate modes. Pressing the first '1' button started the kettle in coffee mode. Pressing the second '1' button started the kettle in tea mode. I could just rename them as appropriate.
  6. The Target Temperature slider doesn't seem to work and could be a disconnect between the control scale and the preferred scale i.e. the slider scale seems to be Celcius (1-100) whereas the kettle is using Fahrenheit. This is the error from the logs when changing the slider:

2024-01-17T10:21:33 ERROR govee::service::hass] While dispatching Message { topic: "gv2mqtt/19156074F483AA0E/set-temperature/slidertemperature/°F", payload: "100", qos: AtMostOnce, retain: false, mid: 0 }: request https://openapi.api.govee.com/router/api/v1/device/control status 200: OK: parsing https://openapi.api.govee.com/router/api/v1/device/control response: Failed with status 400 Bad Request Bad Request: Request to https://openapi.api.govee.com/router/api/v1/device/control failed with code 400 Bad Request Parameter value out of range. Full response: {"requestId":"uuid","msg":"Parameter value out of range","code":400,"capability":{"type":"devices.capabilities.temperature_setting","instance":"sliderTemperature","state":{"status":"failure","errorCode":400,"errorMsg":"Parameter value out of range"},"value":{"temperature":37.77777777777778,"unit":"Celsius"}}}

Thanks again for your efforts in making this work.

wez commented 9 months ago

re: temperature out of range error, can you tell me more about what you did that triggered that?

From the metadata you shared above:

        {
          "type": "devices.capabilities.temperature_setting",
          "instance": "sliderTemperature",
          "parameters": {
            "dataType": "STRUCT",
            "fields": [
              {
                "fieldName": "temperature",
                "dataType": "INTEGER",
                "range": {
                  "min": 40,
                  "max": 100,
                  "precision": 1
                },
                "required": true
              },
              {
                "fieldName": "unit",
                "defaultValue": "Celsius",
                "dataType": "ENUM",
                "options": [
                  {
                    "name": "Celsius",
                    "value": "Celsius"
                  },
                  {
                    "name": "Fahrenheit",
                    "value": "Fahrenheit"
                  }
                ],
                "required": true
              }
            ]
          }
        },

we should have set up the temperature range to constrain the input correctly.

Please click on the mqtt info for the device in the hass UI and find the section that corresponds to the target temperature, and share the Payload data with me; you need to expand it to see it. That will show me what hass things the entity is configured as.

wez commented 9 months ago

re: the preset buttons, thanks for sharing how they look; they are obviously wrong. I'll fix the labels in the next version. They should be labelled like "Activate DIY Preset 1"

tankdeer commented 9 months ago

Thanks Valdorama for testing this before I had a chance to.

Testing now and seeing more or less the same results as them. My buttons are in a slightly different order, but having the names updated will fix any confusion there. Same error on the slider. Here is the payload. I think it might be a unit of measurement conflict again (Wish Govee would be consistent with that!). The unit of measurement is F, but the range is C

availability_topic: gv2mqtt/availability
name: Target Temperature
origin:
  name: gv2mqtt
  sw_version: 2024.01.17-2c728a28
  support_url: https://github.com/wez/govee2mqtt
device:
  name: Bev
  manufacturer: Govee
  model: H7173
  via_device: gv2mqtt
  identifiers:
    - gv2mqtt-1E6E6074F45F3E1E
unique_id: 1E6E6074F45F3E1E-slidertemperature
icon: mdi:thermometer
command_topic: gv2mqtt/1E6E6074F45F3E1E/set-temperature/slidertemperature/°F
min: 40
max: 100
step: 1
unit_of_measurement: °F
platform: mqtt

Not sure if this will help with the slider, but maybe with the current temperature, you can set device_class to temperature and HA will allow you to change the unit & do the conversion for you. However I suspect it doesn't change anything on the backend.

wez commented 9 months ago

Thanks; I think these are now addressed in the latest version. I recommend deleting the device and restarting the addon so that the updated names are picked up.

tankdeer commented 9 months ago

Ok. Latest version installed. Getting closer. Buttons look great, and do what they say they should. I'll need to re-read this whole thread again, but IIRC you had stated that there's no real way to pick up the rest of the presets, right? Just the first index for each? That's fine if that's a limitation, just clarifying.

Temperature slider is still not working. Shows the following errors in the log:

[2024-01-17T09:35:53 INFO  govee::hass_mqtt::climate] Command: set-temperature for 1E6E6074F45F3E1E: 171.6
[2024-01-17T09:35:53 ERROR govee::service::hass] While dispatching Message { topic: "gv2mqtt/1E6E6074F45F3E1E/set-temperature/slidertemperature/°F", payload: "171.6", qos: AtMostOnce, retain: false, mid: 0 }: Unknown temperature scale .6
[2024-01-17T09:36:01 INFO  govee::hass_mqtt::climate] Command: set-temperature for 1E6E6074F45F3E1E: 205.4
[2024-01-17T09:36:01 ERROR govee::service::hass] While dispatching Message { topic: "gv2mqtt/1E6E6074F45F3E1E/set-temperature/slidertemperature/°F", payload: "205.4", qos: AtMostOnce, retain: false, mid: 0 }: Unknown temperature scale .4

As alluded to in the error, I noticed the values seem a little wonky. While they are in Fahrenheit now, the increments and values for the slider seem random. In the govee the slider has a 1°F resolution, and a range of 104° to 212° (40C-100C).

image

Valdorama commented 9 months ago

Same observation as @tankdeer.

I did try to set the target temp manually using the number.set_value service call (to 165F) and that did work successfully. The entity value changed and the kettle starting heating to the specified temp.

tankdeer commented 9 months ago

Same observation as @tankdeer.

I did try to set the target temp manually using the number.set_value service call (to 165F) and that did work successfully. The entity value changed and the kettle starting heating to the specified temp.

Good call, I didn't try that. I bet it's just not liking the fractional resolution on the slider.

wez commented 9 months ago

yeah, it's a bug parsing the floating point number; I have a fix ready. re: preset buttons, based on this metadata you shared:

              {
                "fieldName": "modeValue",
                "dataType": "ENUM",
                "options": [
                  {
                    "defaultValue": 0,
                    "name": "Boiling"
                  },
                  {
                    "dataType": "ENUM",
                    "name": "Tea",
                    "options": [
                      {
                        "value": 1
                      },
                      {
                        "value": 2
                      },
                      {
                        "value": 3
                      },
                      {
                        "value": 4
                      }
                    ]
                  },
                  {
                    "dataType": "ENUM",
                    "name": "Coffee",
                    "options": [
                      {
                        "value": 1
                      },
                      {
                        "value": 2
                      },
                      {
                        "value": 3
                      },
                      {
                        "value": 4
                      }
                    ]
                  },
                  {
                    "dataType": "ENUM",
                    "name": "DIY",
                    "options": [
                      {
                        "value": 1
                      },
                      {
                        "value": 2
                      },
                      {
                        "value": 3
                      },
                      {
                        "value": 4
                      }
                    ]
                  }
                ],

I would expect you to see the following buttons:

tankdeer commented 9 months ago

Ok, that was my initial thought as well but I started second guessing myself. I'm only seeing the first index of each

image

wez commented 9 months ago

is there anything in the hass logs that might indicate why the others aren't showing up?

wez commented 9 months ago

I think I see it. release building now

tankdeer commented 9 months ago

Ok, getting very close. All buttons are showing up, and appear to work as expected. Selecting an out of range/undefined button selects the last used value in that category, which is great.

The number slider works with number.set_number as mentioned before, and the slider works no longer throws an error. The only remaining issue I can see is that the resolution of the slider is still wonky. For example:

image

image

It's still displaying odd fractional values, and moving the slider moves in ~30° increments. I suspect setting some more info on the entity would resolve that. Min, max & step. Possible device class: https://developers.home-assistant.io/docs/core/entity/number/

Valdorama commented 9 months ago

Not had a chance to install the latest update yet, but the step looks to be the issue:

image

wez commented 9 months ago

aha, yes, I think I understand what is happening there

wez commented 9 months ago

step size should be fixed in the latest version: 2024.01.17-e8eb8dd7

tankdeer commented 9 months ago

Yup, that got it!

I am assuming the platform API does not allow us to enable/disable the keep warm function? That's pretty minor, but about the only thing I can think of. Other that that, as far as I can tell that's just about everything.

Valdorama commented 9 months ago

Working a treat now. Now I just wish the kettle had a 'low water level' indicator so you know when to fill it up before turning it on.

Brilliant job to get this working fully in HA! Your efforts surely warrant documenting via a Christopher Nolan piece..

wez commented 9 months ago

I am assuming the platform API does not allow us to enable/disable the keep warm function?

Only what shows up in the metadata; I don't see anything like that in what you shared in https://github.com/wez/govee2mqtt/issues/30#issuecomment-1883852131 so I'm assuming that it isn't available.

What has worked for lights is to save a tap-to-run shortcut in the app. Those get mapped in as scenes (so look at your list of scenes in hass). If you can tell the govee app to set things up with that keep warm mode there, then the scene may well work at enabling it as well.

tankdeer commented 9 months ago

Awesome. Thanks again. Knocked it out of the park on this one