Add room management settings
This commit is contained in:
@@ -141,6 +141,46 @@ def test_reconciliation_auto_assigns_and_trains_numeric_model(tmp_path: Path) ->
|
||||
assert "binary_sensor.abstellkammer_motion" not in artifact.supported_sensors
|
||||
|
||||
|
||||
def test_light_with_opening_context_does_not_require_brightness_sensor(tmp_path: Path) -> None:
|
||||
start = datetime.now(timezone.utc) - timedelta(days=1)
|
||||
entities = [
|
||||
HaEntitySummary(
|
||||
entity_id="light.abstellkammer",
|
||||
domain="light",
|
||||
friendly_name="Abstellkammer Licht",
|
||||
area_name="Abstellkammer",
|
||||
),
|
||||
HaEntitySummary(
|
||||
entity_id="sensor.abstellkammer_illuminance",
|
||||
domain="sensor",
|
||||
device_class="illuminance",
|
||||
state_class="measurement",
|
||||
unit_of_measurement="lx",
|
||||
friendly_name="Abstellkammer Helligkeit",
|
||||
area_name="Abstellkammer",
|
||||
),
|
||||
HaEntitySummary(
|
||||
entity_id="binary_sensor.abstellkammer_tuer",
|
||||
domain="binary_sensor",
|
||||
device_class="door",
|
||||
friendly_name="Tür Abstellkammer",
|
||||
area_name="Abstellkammer",
|
||||
),
|
||||
]
|
||||
service = _service(
|
||||
tmp_path,
|
||||
entities,
|
||||
{"sensor.abstellkammer_illuminance": _points(8, start, 10.0)},
|
||||
)
|
||||
|
||||
record = service.configure_actuator("light.abstellkammer")
|
||||
|
||||
assert record.assignment.selected_numeric_entity_id is None
|
||||
assert record.assignment.selected_context_entity_ids == ["binary_sensor.abstellkammer_tuer"]
|
||||
assert record.assignment.review_required is False
|
||||
assert "kein Helligkeitssensor erforderlich" in record.assignment.reason
|
||||
|
||||
|
||||
def test_reconciliation_rejects_ambiguous_numeric_mapping(tmp_path: Path) -> None:
|
||||
start = datetime(2026, 6, 1, tzinfo=timezone.utc)
|
||||
entities = [
|
||||
|
||||
@@ -623,6 +623,25 @@ def test_dashboard_system_and_start_do_not_materialize_entity_cache(
|
||||
assert start_response.json()["actuators"][0]["friendly_name"] == "Abstellkammer Licht"
|
||||
|
||||
|
||||
def test_room_management_overview_groups_actuators_with_sensors_and_rules(tmp_path: Path) -> None:
|
||||
with TestClient(app) as client:
|
||||
_install_service(tmp_path)
|
||||
client.post("/v1/actuators", json={"actuator_entity_id": "light.abstellkammer"})
|
||||
|
||||
response = client.get("/v1/actuators/settings/rooms")
|
||||
|
||||
assert response.status_code == 200
|
||||
payload = response.json()
|
||||
room = payload["rooms"][0]
|
||||
assert room["room"] == "Abstellkammer"
|
||||
assert room["actuator_count"] == 1
|
||||
actuator = room["actuators"][0]
|
||||
assert actuator["actuator_entity_id"] == "light.abstellkammer"
|
||||
assert actuator["sensors"]
|
||||
assert actuator["prediction_rules"]
|
||||
assert any(sensor["entity_id"] == "binary_sensor.abstellkammer_motion" for sensor in room["sensors"])
|
||||
|
||||
|
||||
def test_actuator_detail_uses_compact_payload(tmp_path: Path) -> None:
|
||||
with TestClient(app) as client:
|
||||
_install_service(tmp_path)
|
||||
|
||||
@@ -22,6 +22,10 @@ def test_dashboard_is_served_at_root() -> None:
|
||||
assert "Ohne deine spätere Freigabe wird nichts geschaltet" not in response.text
|
||||
assert "Du wählst keine Sensoren und erstellst keine Regeln" not in response.text
|
||||
assert "Freigabestatus" in response.text
|
||||
assert "Sprache, Räume, Sensoren, Aktoren und Vorhersagen an einem Ort." in response.text
|
||||
assert "room-management" in response.text
|
||||
assert 'api("v1/actuators/settings/rooms")' in response.text
|
||||
assert "Auswahl speichern" in response.text
|
||||
assert "SillyHome übernehmen lassen" in response.text
|
||||
assert "Passende Home-Assistant-Automationen" in response.text
|
||||
assert "Pausieren" in response.text
|
||||
|
||||
Reference in New Issue
Block a user