Skip to content

Turning off the light entity can stop an active boiling cycle #95

Description

@notabene00

Summary

Calling light.turn_off for the main SkyKettle light entity can stop an active boiling or heating cycle.

We encountered this because a Home Assistant automation turned off all lights in the kitchen area when room presence disappeared:

action: light.turn_off
target:
  area_id: kitchen

The SkyKettle device belongs to the kitchen area, so Home Assistant included its main light entity in the service target:

light.skykettle_rk_g210s_light

Although this light entity was already shown as off while the kettle was boiling, its async_turn_off() method was still called. This caused the entire kettle to switch to off and immediately stopped heating.

Environment

  • Kettle: Redmond SkyKettle RK-G210S
  • Firmware: 3.8
  • Integration version: 2.7
  • The same relevant async_turn_off() implementation appears to still be present in version 2.8

Observed behavior

We captured two occurrences in Home Assistant state history.

Occurrence 1

19:50:29.100531
Kitchen presence: on → off

19:50:29.701713
Kettle switch: on → off
Water temperature: 50°C

The kettle stopped approximately 0.60 seconds after the absence automation called light.turn_off for the kitchen area.

Occurrence 2

19:51:06.933408
Kitchen presence: on → off

19:51:07.553106
Kettle switch: on → off
Water temperature: 64°C

The kettle again stopped approximately 0.62 seconds after the absence automation ran.

A separate normal completion at 100°C worked as expected, so the 50°C and 64°C transitions were premature shutdowns rather than completed boiling cycles.

Relevant code

The behavior appears to originate in custom_components/skykettle/light.py:

async def async_turn_off(self, **kwargs):
    """Turn the light off."""
    _LOGGER.debug(f"Turn off ({self.light_type}): {kwargs}")
    if self.light_type == LIGHT_GAME:
        await self.kettle.set_target_mode(STATE_OFF)
        self.on = False
    self.hass.async_add_executor_job(
        dispatcher_send,
        self.hass,
        DISPATCHER_UPDATE,
    )

For the main light entity, async_turn_off() unconditionally calls:

await self.kettle.set_target_mode(STATE_OFF)

It does not first check whether the kettle is currently in the light mode managed by that entity.

Consequently, calling light.turn_off while the kettle is in Boil, Heat, or Boil+Heat sends a command that switches off the complete kettle operation.

Expected behavior

Turning off the main light entity should not interrupt an active boiling or heating mode.

Before sending STATE_OFF, the implementation needs to check that the current or target kettle mode is actually the light mode represented by this entity.

Reproduction steps

  1. Assign the SkyKettle device to a Home Assistant area.

  2. Start boiling through switch.kettle or water_heater.kettle.

  3. While the kettle is still heating, call:

    action: light.turn_off
    target:
      entity_id: light.skykettle_rk_g210s_light

    Alternatively, call light.turn_off for the whole area containing the kettle.

  4. Observe that the active boiling cycle stops before the target temperature is reached.


Hermes Agent, running GPT-5.6-sol, helped trace this from the Home Assistant automation down to the relevant integration code. The investigation and final write-up were reviewed and verified by a human.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions