fix rain sensor for some rare velux windows (#160504)

This commit is contained in:
wollew
2026-01-08 12:19:40 +01:00
committed by GitHub
parent dd84b52c7b
commit a1edf0a77c
2 changed files with 22 additions and 6 deletions

View File

@@ -74,6 +74,8 @@ class VeluxRainSensor(VeluxEntity, BinarySensorEntity):
self._attr_available = True
# Velux windows with rain sensors report an opening limitation of 93 or 100 (Velux GPU) when rain is detected.
# So far, only 93 and 100 have been observed in practice, documentation on this is non-existent AFAIK.
self._attr_is_on = limitation.min_value in {93, 100}
# Velux windows with rain sensors report an opening limitation when rain is detected.
# So far we've seen 89, 91, 93 (most cases) or 100 (Velux GPU). It probably makes sense to
# assume that any large enough limitation (we use >=89) means rain is detected.
# Documentation on this is non-existent AFAIK.
self._attr_is_on = limitation.min_value >= 89

View File

@@ -49,15 +49,29 @@ async def test_rain_sensor_state(
assert state is not None
assert state.state == STATE_ON
# simulate rain detected (other Velux models report 93)
# simulate rain detected (most Velux models report 93)
mock_window.get_limitation.return_value.min_value = 93
await update_polled_entities(hass, freezer)
state = hass.states.get(test_entity_id)
assert state is not None
assert state.state == STATE_ON
# simulate rain detected (other Velux models report 89)
mock_window.get_limitation.return_value.min_value = 89
await update_polled_entities(hass, freezer)
state = hass.states.get(test_entity_id)
assert state is not None
assert state.state == STATE_ON
# simulate other limits which do not indicate rain detected
mock_window.get_limitation.return_value.min_value = 88
await update_polled_entities(hass, freezer)
state = hass.states.get(test_entity_id)
assert state is not None
assert state.state == STATE_OFF
# simulate no rain detected again
mock_window.get_limitation.return_value.min_value = 95
mock_window.get_limitation.return_value.min_value = 0
await update_polled_entities(hass, freezer)
state = hass.states.get(test_entity_id)
assert state is not None
@@ -144,7 +158,7 @@ async def test_rain_sensor_unavailability(
# Simulate recovery
mock_window.get_limitation.side_effect = None
mock_window.get_limitation.return_value.min_value = 95
mock_window.get_limitation.return_value.min_value = 0
await update_polled_entities(hass, freezer)
# Entity should be available again