"""Einstellungen der Oberfläche (seit 24.09.2026). KI-Box (Rolle box): GET /api/einstellungen Update-Zeitfenster und Radar-Schalter samt Zustand laut systemd POST /api/einstellungen/update-fenster {tag: 1–7, uhrzeit: "HH:MM"} POST /api/einstellungen/radar {an: true|false} POST /api/einstellungen/telegram-test Testmeldung über notify.sh, Ergebnis aus dem Melde-Log Homelab-Teil (Rolle homelab): POST /api/homelab/einstellungen/telegram-test dasselbe für den Meldeweg des Homelab-Teils Die Oberfläche schickt alles unter /api/homelab/… an den Homelab-Teil und den Rest an die KI-Box (lib/instanz.ts) — so erreicht jeder Test-Knopf die richtige Instanz, egal welche die Seite ausliefert. Dünn: die Logik liegt in services/einstellungen.py. """ from fastapi import APIRouter, HTTPException from pydantic import BaseModel from services import einstellungen router = APIRouter(prefix="/api/einstellungen", tags=["einstellungen"]) homelab_router = APIRouter(prefix="/api/homelab/einstellungen", tags=["einstellungen"]) class Zeitfenster(BaseModel): tag: int uhrzeit: str class Schalter(BaseModel): an: bool def _antwort(ergebnis: dict) -> dict: if not ergebnis.get("ok"): raise HTTPException(status_code=409, detail=ergebnis.get("detail") or "Das ging gerade nicht.") return ergebnis @router.get("") def stand() -> dict: return einstellungen.stand() @router.post("/update-fenster") def update_fenster(fenster: Zeitfenster) -> dict: return _antwort(einstellungen.update_fenster_setzen(fenster.tag, fenster.uhrzeit)) @router.post("/radar") def radar(schalter: Schalter) -> dict: return _antwort(einstellungen.radar_schalten(schalter.an)) @router.post("/telegram-test") def telegram_test() -> dict: """Gesendet oder nicht, beides ist eine Antwort (200) — der Grund steht im Ergebnis.""" return einstellungen.telegram_test() @homelab_router.post("/telegram-test") def telegram_test_homelab() -> dict: return einstellungen.telegram_test()