BUG-003: HeatingRule auf heizungsrelevante Sensoren begrenzen

- matches(): nur climate oder sensor mit device_class in {temperature, humidity, occupancy, presence, heating}
- Tests: ergänzt für relevante und nicht-relevante Sensoren
- Verhindert falsche Empfehlungen bei Strom-/Tür-/Wetter-Sensoren
This commit is contained in:
2026-06-10 21:30:25 +02:00
parent 6540d62ff7
commit b8012de934
2 changed files with 33 additions and 4 deletions

View File

@@ -5,8 +5,8 @@ from app.rules.heating import HeatingRule
from app.rules.recommender import Recommender
def _sensor(entity_id: str) -> HaEntitySummary:
return HaEntitySummary(entity_id=entity_id, domain="sensor")
def _sensor(entity_id: str, device_class: str | None = None) -> HaEntitySummary:
return HaEntitySummary(entity_id=entity_id, domain="sensor", device_class=device_class)
def _climate(entity_id: str) -> HaEntitySummary:
@@ -16,7 +16,22 @@ def _climate(entity_id: str) -> HaEntitySummary:
def test_heating_rule_triggers() -> None:
rule = HeatingRule()
assert rule.matches([_climate("climate.living_room")])
assert rule.matches([_sensor("sensor.temperature_living")])
# Relevante Sensoren
assert rule.matches([_sensor("sensor.temperature_living", device_class="temperature")])
assert rule.matches([_sensor("sensor.humidity_bath", device_class="humidity")])
assert rule.matches([_sensor("sensor.occupancy_living", device_class="occupancy")])
assert rule.matches([_sensor("sensor.presence_entry", device_class="presence")])
assert rule.matches([_sensor("sensor.heating_status", device_class="heating")])
def test_heating_rule_ignores_non_relevant_sensors() -> None:
rule = HeatingRule()
# Nicht-relevante Sensoren
assert not rule.matches([_sensor("sensor.power", device_class="power")])
assert not rule.matches([_sensor("sensor.voltage", device_class="voltage")])
assert not rule.matches([_sensor("sensor.door", device_class="door")])
assert not rule.matches([_sensor("sensor.window", device_class="window")])
assert not rule.matches([_sensor("sensor.light", device_class="illuminance")])
def test_recommender_uses_rule() -> None: