mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 04:37:06 +00:00
Improve the HomeKit (de)humidifier min/max humidity handling (#90854)
This commit is contained in:
parent
3538844181
commit
5c2af99520
@ -115,20 +115,12 @@ class HumidifierDehumidifier(HomeAccessory):
|
|||||||
CHAR_CURRENT_HUMIDITY, value=0
|
CHAR_CURRENT_HUMIDITY, value=0
|
||||||
)
|
)
|
||||||
|
|
||||||
max_humidity = state.attributes.get(ATTR_MAX_HUMIDITY, DEFAULT_MAX_HUMIDITY)
|
|
||||||
max_humidity = round(max_humidity)
|
|
||||||
max_humidity = min(max_humidity, 100)
|
|
||||||
|
|
||||||
min_humidity = state.attributes.get(ATTR_MIN_HUMIDITY, DEFAULT_MIN_HUMIDITY)
|
|
||||||
min_humidity = round(min_humidity)
|
|
||||||
min_humidity = max(min_humidity, 0)
|
|
||||||
|
|
||||||
self.char_target_humidity = serv_humidifier_dehumidifier.configure_char(
|
self.char_target_humidity = serv_humidifier_dehumidifier.configure_char(
|
||||||
self._target_humidity_char_name,
|
self._target_humidity_char_name,
|
||||||
value=45,
|
value=45,
|
||||||
properties={
|
properties={
|
||||||
PROP_MIN_VALUE: min_humidity,
|
PROP_MIN_VALUE: DEFAULT_MIN_HUMIDITY,
|
||||||
PROP_MAX_VALUE: max_humidity,
|
PROP_MAX_VALUE: DEFAULT_MAX_HUMIDITY,
|
||||||
PROP_MIN_STEP: 1,
|
PROP_MIN_STEP: 1,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -219,7 +211,23 @@ class HumidifierDehumidifier(HomeAccessory):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if self._target_humidity_char_name in char_values:
|
if self._target_humidity_char_name in char_values:
|
||||||
|
state = self.hass.states.get(self.entity_id)
|
||||||
|
max_humidity = state.attributes.get(ATTR_MAX_HUMIDITY, DEFAULT_MAX_HUMIDITY)
|
||||||
|
max_humidity = round(max_humidity)
|
||||||
|
max_humidity = min(max_humidity, 100)
|
||||||
|
|
||||||
|
min_humidity = state.attributes.get(ATTR_MIN_HUMIDITY, DEFAULT_MIN_HUMIDITY)
|
||||||
|
min_humidity = round(min_humidity)
|
||||||
|
min_humidity = max(min_humidity, 0)
|
||||||
|
|
||||||
humidity = round(char_values[self._target_humidity_char_name])
|
humidity = round(char_values[self._target_humidity_char_name])
|
||||||
|
|
||||||
|
if (humidity < min_humidity) or (humidity > max_humidity):
|
||||||
|
humidity = min(max_humidity, max(min_humidity, humidity))
|
||||||
|
# Update the HomeKit value to the clamped humidity, so the user will get a visual feedback that they
|
||||||
|
# cannot not set to a value below/above the min/max.
|
||||||
|
self.char_target_humidity.set_value(humidity)
|
||||||
|
|
||||||
self.async_call_service(
|
self.async_call_service(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
SERVICE_SET_HUMIDITY,
|
SERVICE_SET_HUMIDITY,
|
||||||
|
@ -286,7 +286,9 @@ async def test_hygrostat_power_state(hass: HomeAssistant, hk_driver, events) ->
|
|||||||
assert events[-1].data[ATTR_VALUE] == "Active to 0"
|
assert events[-1].data[ATTR_VALUE] == "Active to 0"
|
||||||
|
|
||||||
|
|
||||||
async def test_hygrostat_get_humidity_range(hass: HomeAssistant, hk_driver) -> None:
|
async def test_hygrostat_get_humidity_range(
|
||||||
|
hass: HomeAssistant, hk_driver, events
|
||||||
|
) -> None:
|
||||||
"""Test if humidity range is evaluated correctly."""
|
"""Test if humidity range is evaluated correctly."""
|
||||||
entity_id = "humidifier.test"
|
entity_id = "humidifier.test"
|
||||||
|
|
||||||
@ -302,8 +304,48 @@ async def test_hygrostat_get_humidity_range(hass: HomeAssistant, hk_driver) -> N
|
|||||||
await acc.run()
|
await acc.run()
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert acc.char_target_humidity.properties[PROP_MAX_VALUE] == 45
|
# Set from HomeKit
|
||||||
assert acc.char_target_humidity.properties[PROP_MIN_VALUE] == 40
|
call_set_humidity = async_mock_service(hass, DOMAIN, SERVICE_SET_HUMIDITY)
|
||||||
|
|
||||||
|
char_target_humidity_iid = acc.char_target_humidity.to_HAP()[HAP_REPR_IID]
|
||||||
|
|
||||||
|
hk_driver.set_characteristics(
|
||||||
|
{
|
||||||
|
HAP_REPR_CHARS: [
|
||||||
|
{
|
||||||
|
HAP_REPR_AID: acc.aid,
|
||||||
|
HAP_REPR_IID: char_target_humidity_iid,
|
||||||
|
HAP_REPR_VALUE: 12.0,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mock_addr",
|
||||||
|
)
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert call_set_humidity[-1].data[ATTR_ENTITY_ID] == entity_id
|
||||||
|
assert call_set_humidity[-1].data[ATTR_HUMIDITY] == 40.0
|
||||||
|
assert acc.char_target_humidity.value == 40.0
|
||||||
|
assert events[-1].data[ATTR_VALUE] == "RelativeHumidityHumidifierThreshold to 12.0%"
|
||||||
|
|
||||||
|
hk_driver.set_characteristics(
|
||||||
|
{
|
||||||
|
HAP_REPR_CHARS: [
|
||||||
|
{
|
||||||
|
HAP_REPR_AID: acc.aid,
|
||||||
|
HAP_REPR_IID: char_target_humidity_iid,
|
||||||
|
HAP_REPR_VALUE: 80.0,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mock_addr",
|
||||||
|
)
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert call_set_humidity[-1].data[ATTR_ENTITY_ID] == entity_id
|
||||||
|
assert call_set_humidity[-1].data[ATTR_HUMIDITY] == 45.0
|
||||||
|
assert acc.char_target_humidity.value == 45.0
|
||||||
|
assert events[-1].data[ATTR_VALUE] == "RelativeHumidityHumidifierThreshold to 80.0%"
|
||||||
|
|
||||||
|
|
||||||
async def test_humidifier_with_linked_humidity_sensor(
|
async def test_humidifier_with_linked_humidity_sensor(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user