from __future__ import annotations from app.ha.models import HaEntitySummary from app.rules.heating import HeatingRule from app.rules.recommender import Recommender 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: return HaEntitySummary(entity_id=entity_id, domain="climate") def test_heating_rule_triggers() -> None: rule = HeatingRule() assert rule.matches([_climate("climate.living_room")]) # 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: recommender = Recommender(rules=[HeatingRule()]) assert recommender.run([_climate("climate.living_room")]) == [ "Prüfe Heizungsregelung: Aktiviere energiesparenden Modus bei Abwesenheit." ]