65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
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
|