diff --git a/homeassistant/components/demo/humidifier.py b/homeassistant/components/demo/humidifier.py index 2bdbd22eef8..7f34c23751b 100644 --- a/homeassistant/components/demo/humidifier.py +++ b/homeassistant/components/demo/humidifier.py @@ -28,10 +28,11 @@ async def async_setup_entry( DemoHumidifier( name="Humidifier", mode=None, - target_humidity=68, + target_humidity=65, current_humidity=45, action=HumidifierAction.HUMIDIFYING, device_class=HumidifierDeviceClass.HUMIDIFIER, + target_humidity_step=5, ), DemoHumidifier( name="Dehumidifier", @@ -66,6 +67,7 @@ class DemoHumidifier(HumidifierEntity): is_on: bool = True, action: HumidifierAction | None = None, device_class: HumidifierDeviceClass | None = None, + target_humidity_step: float | None = None, ) -> None: """Initialize the humidifier device.""" self._attr_name = name @@ -79,6 +81,7 @@ class DemoHumidifier(HumidifierEntity): self._attr_mode = mode self._attr_available_modes = available_modes self._attr_device_class = device_class + self._attr_target_humidity_step = target_humidity_step async def async_turn_on(self, **kwargs: Any) -> None: """Turn the device on.""" diff --git a/homeassistant/components/humidifier/__init__.py b/homeassistant/components/humidifier/__init__.py index de9384edda6..8ee4a1eaf78 100644 --- a/homeassistant/components/humidifier/__init__.py +++ b/homeassistant/components/humidifier/__init__.py @@ -34,6 +34,7 @@ from .const import ( # noqa: F401 ATTR_HUMIDITY, ATTR_MAX_HUMIDITY, ATTR_MIN_HUMIDITY, + ATTR_TARGET_HUMIDITY_STEP, DEFAULT_MAX_HUMIDITY, DEFAULT_MIN_HUMIDITY, DOMAIN, @@ -141,6 +142,7 @@ CACHED_PROPERTIES_WITH_ATTR_ = { "min_humidity", "max_humidity", "supported_features", + "target_humidity_step", } @@ -148,7 +150,12 @@ class HumidifierEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_AT """Base class for humidifier entities.""" _entity_component_unrecorded_attributes = frozenset( - {ATTR_MIN_HUMIDITY, ATTR_MAX_HUMIDITY, ATTR_AVAILABLE_MODES} + { + ATTR_MIN_HUMIDITY, + ATTR_MAX_HUMIDITY, + ATTR_AVAILABLE_MODES, + ATTR_TARGET_HUMIDITY_STEP, + } ) entity_description: HumidifierEntityDescription @@ -161,6 +168,7 @@ class HumidifierEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_AT _attr_mode: str | None _attr_supported_features: HumidifierEntityFeature = HumidifierEntityFeature(0) _attr_target_humidity: float | None = None + _attr_target_humidity_step: float | None = None @property def capability_attributes(self) -> dict[str, Any]: @@ -169,6 +177,8 @@ class HumidifierEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_AT ATTR_MIN_HUMIDITY: self.min_humidity, ATTR_MAX_HUMIDITY: self.max_humidity, } + if self.target_humidity_step is not None: + data[ATTR_TARGET_HUMIDITY_STEP] = self.target_humidity_step if HumidifierEntityFeature.MODES in self.supported_features: data[ATTR_AVAILABLE_MODES] = self.available_modes @@ -251,6 +261,11 @@ class HumidifierEntity(ToggleEntity, cached_properties=CACHED_PROPERTIES_WITH_AT """Set new mode.""" await self.hass.async_add_executor_job(self.set_mode, mode) + @cached_property + def target_humidity_step(self) -> float | None: + """Return the supported step of humidity.""" + return self._attr_target_humidity_step + @cached_property def min_humidity(self) -> float: """Return the minimum humidity.""" diff --git a/homeassistant/components/humidifier/const.py b/homeassistant/components/humidifier/const.py index ceef0c5a890..494ff7e5409 100644 --- a/homeassistant/components/humidifier/const.py +++ b/homeassistant/components/humidifier/const.py @@ -28,6 +28,7 @@ ATTR_CURRENT_HUMIDITY = "current_humidity" ATTR_HUMIDITY = "humidity" ATTR_MAX_HUMIDITY = "max_humidity" ATTR_MIN_HUMIDITY = "min_humidity" +ATTR_TARGET_HUMIDITY_STEP = "target_humidity_step" DEFAULT_MIN_HUMIDITY = 0 DEFAULT_MAX_HUMIDITY = 100 diff --git a/tests/components/google_assistant/test_google_assistant.py b/tests/components/google_assistant/test_google_assistant.py index 26541d33613..3a7efe2b9b6 100644 --- a/tests/components/google_assistant/test_google_assistant.py +++ b/tests/components/google_assistant/test_google_assistant.py @@ -354,7 +354,7 @@ async def test_query_humidifier_request( assert devices["humidifier.humidifier"] == { "on": True, "online": True, - "humiditySetpointPercent": 68, + "humiditySetpointPercent": 65, "humidityAmbientPercent": 45, } assert devices["humidifier.dehumidifier"] == { diff --git a/tests/components/humidifier/test_recorder.py b/tests/components/humidifier/test_recorder.py index 733f505d0ab..155ae2874f5 100644 --- a/tests/components/humidifier/test_recorder.py +++ b/tests/components/humidifier/test_recorder.py @@ -9,6 +9,7 @@ from homeassistant.components.humidifier import ( ATTR_AVAILABLE_MODES, ATTR_MAX_HUMIDITY, ATTR_MIN_HUMIDITY, + ATTR_TARGET_HUMIDITY_STEP, ) from homeassistant.components.recorder import Recorder from homeassistant.components.recorder.history import get_significant_states @@ -46,3 +47,4 @@ async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) assert ATTR_MAX_HUMIDITY not in state.attributes assert ATTR_AVAILABLE_MODES not in state.attributes assert ATTR_FRIENDLY_NAME in state.attributes + assert ATTR_TARGET_HUMIDITY_STEP not in state.attributes