from contextlib import asynccontextmanager from fastapi import FastAPI from app.api.v1.entities import router as entities_router from app.core.exception_handlers import register_exception_handlers from app.ha.client import HaClient, HaClientSettings from app.ha.reader import HaReader from app.rules.recommender import Recommender from app.rules.heating import HeatingRule @asynccontextmanager async def lifespan(app: FastAPI): settings = app.state.settings ha_url = getattr(settings, "ha_url", None) ha_token = getattr(settings, "ha_token", None) client = HaClient( settings=HaClientSettings( url=ha_url or "", token=ha_token or "", ) ) app.state.ha_reader = HaReader(client=client) app.state.recommender = Recommender(rules=[HeatingRule()]) yield class Settings: ha_url: str = "http://localhost:8123" ha_token: str = "" app = FastAPI( title="SillyHome Next API", description="Lokales Smart-Home-Intelligenzsystem für Home Assistant.", version="0.1.0", lifespan=lifespan, ) app.state.settings = Settings() register_exception_handlers(app) app.include_router(entities_router) @app.get("/health") def health() -> dict[str, str]: return {"status": "ok"} @app.get("/") def root() -> dict[str, str]: return {"service": "sillyhome-next", "docs": "/docs"}