Document v1 acceptance and dashboard stats
This commit is contained in:
@@ -105,7 +105,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
|
||||
app = FastAPI(
|
||||
title="SillyHome Next API",
|
||||
description="Lokales Smart-Home-Intelligenzsystem für Home Assistant.",
|
||||
version="1.0.1",
|
||||
version="1.0.2",
|
||||
lifespan=lifespan,
|
||||
)
|
||||
app.state.settings = load_settings()
|
||||
|
||||
@@ -479,7 +479,16 @@ function renderDashboardStatus(dashboard) {
|
||||
const stats = document.getElementById("dashboard-stats");
|
||||
const system = dashboard.system || {};
|
||||
const cache = dashboard.cache || {};
|
||||
const actuators = dashboard.actuators || [];
|
||||
const discoveryGroups = dashboard.discovery_groups || [];
|
||||
const activeCount = actuators.filter(record => record.behavior_mode === "active").length;
|
||||
const shadowCount = actuators.filter(record => record.behavior_mode !== "active").length;
|
||||
const readyCount = actuators.filter(record => record.activation_ready).length;
|
||||
const pendingCount = actuators.filter(record =>
|
||||
["pending_history", "pending_assignment", "archived"].includes(record.lifecycle_status)
|
||||
).length;
|
||||
const trainedCount = actuators.filter(record => record.behavior_status === "trained").length;
|
||||
const sampleTotal = actuators.reduce((sum, record) => sum + Number(record.sample_count || 0), 0);
|
||||
const cacheLabel = cache.available
|
||||
? `Cache aktuell mit ${cache.entity_count} Entities`
|
||||
: "Cache wird nach Discovery aufgebaut";
|
||||
@@ -497,7 +506,11 @@ function renderDashboardStatus(dashboard) {
|
||||
`<span class="chip">Prüfen: ${escapeHtml(system.review_required ?? 0)}</span>`,
|
||||
].join("");
|
||||
stats.innerHTML = [
|
||||
`<div class="metric"><strong>Geladene Startdaten</strong>${escapeHtml((dashboard.actuators || []).length)} Geräte</div>`,
|
||||
`<div class="metric"><strong>Geladene Startdaten</strong>${escapeHtml(actuators.length)} Geräte</div>`,
|
||||
`<div class="metric"><strong>Freigabebereit</strong>${escapeHtml(readyCount)} Geräte</div>`,
|
||||
`<div class="metric"><strong>Aktiv / Shadow</strong>${escapeHtml(activeCount)} / ${escapeHtml(shadowCount)}</div>`,
|
||||
`<div class="metric"><strong>Gelernt / Wartet</strong>${escapeHtml(trainedCount)} / ${escapeHtml(pendingCount)}</div>`,
|
||||
`<div class="metric"><strong>Gelernte Handlungen</strong>${escapeHtml(sampleTotal)}</div>`,
|
||||
`<div class="metric"><strong>Discovery-Gruppen</strong>${escapeHtml(discoveryGroups.length)} Kategorien</div>`,
|
||||
`<div class="metric"><strong>Cache-Zeitpunkt</strong>${escapeHtml(cache.updated_at || "noch offen")}</div>`,
|
||||
].join("");
|
||||
|
||||
Reference in New Issue
Block a user