from __future__ import annotations from datetime import datetime from typing import List from fastapi import APIRouter, Depends, HTTPException, Query, status from app.dependencies import get_ha_reader from app.ha.discovery import DiscoveredEntity from app.ha.history import EntityHistorySeries from app.ha.models import HaEntitySummary from app.ha.reader import HaReader router = APIRouter(prefix="/v1", tags=["entities"]) @router.get( "/entities", summary="Home-Assistant-Entities auflisten", description="Gibt eine kompakte Zusammenfassung aller erreichbaren HA-Entitäten zurück.", response_model=List[HaEntitySummary], ) def list_entities(ha_reader: HaReader = Depends(get_ha_reader)) -> List[HaEntitySummary]: return list(ha_reader.read_entities()) @router.get( "/discovery", summary="Home-Assistant-Entities klassifizieren", description="Klassifiziert Entities nach Lernrelevanz, Kontextquelle und Aktor-Rolle.", response_model=List[DiscoveredEntity], ) def discovery( domain: List[str] | None = Query(default=None), learnable: bool | None = None, ha_reader: HaReader = Depends(get_ha_reader), ) -> List[DiscoveredEntity]: return list( ha_reader.discover( domains=set(domain) if domain else None, learnable=learnable, ) ) @router.get( "/history", summary="Numerische Home-Assistant-Historie lesen", description="Lädt und normalisiert numerische Zustände ausgewählter Entities.", response_model=List[EntityHistorySeries], ) def history( entity_id: List[str] = Query(), start_time: datetime = Query(), end_time: datetime = Query(), ha_reader: HaReader = Depends(get_ha_reader), ) -> List[EntityHistorySeries]: try: return list(ha_reader.read_history(entity_id, start_time, end_time)) except ValueError as exc: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_CONTENT, detail=str(exc), ) from exc