kamera geht

This commit is contained in:
marcinator_2 committed 2026-10-14 05:07:07 +02:00
1 parent bfecfd0640
commit d370f992ce
19 files changed
+1365 -1128

No files matched your search

+35 -1
View File
@@ -14,6 +14,7 @@ from pydantic import BaseModel, Field
from .camera import CameraStream
from .controller import Controller, MODES
from .event_store import EventStore
from .detection import DetectionService
PAGE = (Path(__file__).parent / "index.html").read_text(encoding="utf-8")
@@ -43,6 +44,7 @@ def create_app(demo: bool = False, state_dir: Path | None = None) -> FastAPI:
camera = CameraStream(demo=demo)
controller = Controller(directory)
events = EventStore(directory)
detection = DetectionService(camera, controller, events, directory)
@asynccontextmanager
async def lifespan(app: FastAPI):
@@ -54,11 +56,23 @@ def create_app(demo: bool = False, state_dir: Path | None = None) -> FastAPI:
except sqlite3.Error:
LOGGER.exception("Abgelaufene Profile konnten nicht gelöscht werden")
async def detection_watchdog():
while True:
detection.watchdog()
await asyncio.sleep(0.1)
camera.start()
detection.start()
watchdog_task = asyncio.create_task(detection_watchdog())
cleanup_task = asyncio.create_task(periodic_profile_cleanup())
try:
yield
finally:
controller.stop()
watchdog_task.cancel()
with suppress(asyncio.CancelledError):
await watchdog_task
detection.stop()
cleanup_task.cancel()
with suppress(asyncio.CancelledError):
await cleanup_task
@@ -68,6 +82,7 @@ def create_app(demo: bool = False, state_dir: Path | None = None) -> FastAPI:
app.state.camera = camera
app.state.controller = controller
app.state.events = events
app.state.detection = detection
@app.middleware("http")
async def security_headers(request: Request, call_next):
@@ -84,7 +99,25 @@ def create_app(demo: bool = False, state_dir: Path | None = None) -> FastAPI:
@app.get("/api/status")
async def status():
return {"controller": controller.status(), "camera": camera.status()}
return {"controller": controller.status(), "camera": camera.status(),
"detection": detection.status()}
@app.get("/api/detection")
async def detection_result():
return detection.snapshot()
@app.get("/api/detection/config")
async def detection_config():
return detection.get_config()
@app.post("/api/detection/config", dependencies=[Depends(require_ui)])
async def configure_detection(payload: dict):
try:
return detection.configure(payload)
except (ValueError, TypeError, KeyError, IndexError) as exc:
raise HTTPException(status_code=422, detail=str(exc)) from exc
except OSError as exc:
raise HTTPException(status_code=500, detail=f"Einstellung nicht gespeichert: {exc}") from exc
@app.get("/api/events")
async def recent_events(limit: int = Query(20, ge=1, le=100)):
@@ -165,6 +198,7 @@ def create_app(demo: bool = False, state_dir: Path | None = None) -> FastAPI:
@app.post("/api/reset", dependencies=[Depends(require_ui)])
async def reset():
controller.reset()
detection.reset()
return controller.status()
@app.get("/snapshot.jpg")