From 63b86841973e22afe8c72774621a6b76664008c4 Mon Sep 17 00:00:00 2001 From: Otto Date: Wed, 17 Jun 2026 07:45:30 +0200 Subject: [PATCH] Document v1 acceptance and dashboard stats --- CHANGELOG.md | 7 +++ README.md | 2 + addon/config.yaml | 2 +- app/main.py | 2 +- app/static/index.html | 15 ++++++- docs/V1_0_0_OPERATING_GUIDE.md | 4 ++ docs/V1_0_ACCEPTANCE.md | 80 ++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- 8 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 docs/V1_0_ACCEPTANCE.md diff --git a/CHANGELOG.md b/CHANGELOG.md index a0089e6..b89dabe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 1.0.2 - 2026-06-17 +- v1.0-Abnahme als `docs/V1_0_ACCEPTANCE.md` dokumentiert: erledigte, + teilweise erledigte und offene v1.0.x-Punkte sind getrennt sichtbar. +- Dashboard-Startstatistik erweitert: Freigabebereitschaft, Aktiv/Shadow, + Gelernt/Wartet und gelernte Handlungen werden direkt im Startbereich + zusammengefasst. + ## 1.0.1 - 2026-06-17 - Dashboard-UI nach v1-Korrektur neu strukturiert: feste Steuerungsleiste, separate Geräteübersicht, klare Freigabe-/Detailfläche und Statusbereich. diff --git a/README.md b/README.md index 78938c1..4dbbd86 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ nach einer ausdrücklichen Freigabe ausführen. [`docs/OPERATIONS.md`](docs/OPERATIONS.md) - Version 1.0.0 bedienen und prüfen: [`docs/V1_0_0_OPERATING_GUIDE.md`](docs/V1_0_0_OPERATING_GUIDE.md) +- Version 1.0.x Abnahme und offene Punkte: + [`docs/V1_0_ACCEPTANCE.md`](docs/V1_0_ACCEPTANCE.md) - Arbeitsregeln für Coding-Agenten: [`AGENTS.md`](AGENTS.md) ## Reifegrad diff --git a/addon/config.yaml b/addon/config.yaml index 6c01046..4826c77 100644 --- a/addon/config.yaml +++ b/addon/config.yaml @@ -1,5 +1,5 @@ name: SillyHome Next -version: "1.0.1" +version: "1.0.2" slug: sillyhome_next description: Lernt automatisch aus deinem Verhalten und steuert freigegebene Aktoren url: http://192.168.6.31:3000/pino/sillyhome-next diff --git a/app/main.py b/app/main.py index b04493f..6027191 100644 --- a/app/main.py +++ b/app/main.py @@ -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() diff --git a/app/static/index.html b/app/static/index.html index a8d60eb..864bcab 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -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) { `Prüfen: ${escapeHtml(system.review_required ?? 0)}`, ].join(""); stats.innerHTML = [ - `
Geladene Startdaten${escapeHtml((dashboard.actuators || []).length)} Geräte
`, + `
Geladene Startdaten${escapeHtml(actuators.length)} Geräte
`, + `
Freigabebereit${escapeHtml(readyCount)} Geräte
`, + `
Aktiv / Shadow${escapeHtml(activeCount)} / ${escapeHtml(shadowCount)}
`, + `
Gelernt / Wartet${escapeHtml(trainedCount)} / ${escapeHtml(pendingCount)}
`, + `
Gelernte Handlungen${escapeHtml(sampleTotal)}
`, `
Discovery-Gruppen${escapeHtml(discoveryGroups.length)} Kategorien
`, `
Cache-Zeitpunkt${escapeHtml(cache.updated_at || "noch offen")}
`, ].join(""); diff --git a/docs/V1_0_0_OPERATING_GUIDE.md b/docs/V1_0_0_OPERATING_GUIDE.md index 6915f88..28503f4 100644 --- a/docs/V1_0_0_OPERATING_GUIDE.md +++ b/docs/V1_0_0_OPERATING_GUIDE.md @@ -4,6 +4,10 @@ Diese Version stabilisiert den produktiven Kern: schnelle Dashboard-Nutzung, lokales Caching, klare Aktor-/Sensor-Kategorien und nachvollziehbare Freigabe gelernter Aktionen. +Die detaillierte Abnahme steht in +[`V1_0_ACCEPTANCE.md`](V1_0_ACCEPTANCE.md). Dort sind erledigte, teilweise +erledigte und fuer v1.0.x offene Punkte getrennt dokumentiert. + ## Grundprinzip - Home Assistant bleibt die Quelle fuer aktuelle States und Services. diff --git a/docs/V1_0_ACCEPTANCE.md b/docs/V1_0_ACCEPTANCE.md new file mode 100644 index 0000000..5065287 --- /dev/null +++ b/docs/V1_0_ACCEPTANCE.md @@ -0,0 +1,80 @@ +# SillyHome Next v1.0 Acceptance + +Stand: 2026-06-17 + +Diese Abnahme trennt belegte Umsetzung von offenen v1.0.x-Nacharbeiten. Der +Funktionskern bleibt aktorzentriert: Nutzer waehlen Aktoren, SillyHome lernt +Kontext und Verhalten, laeuft zuerst im Shadow-Modus und schaltet erst nach +expliziter Freigabe. + +## Erfuellt + +- Versioniert, gepusht und installiert: + - `v1.0.0`: API-/Cache-Umbau + - `v1.0.1`: Dashboard-/Performance-Korrektur +- Startpfad: + - `/v1/actuators/dashboard` liefert lokale Startdaten aus Store und Cache. + - Dashboard blockiert nicht mehr auf Discovery, Vorschlaegen oder + Automation-Refresh. + - Frontend bricht den Startdaten-Request nach 4,5 Sekunden ab und bleibt + bedienbar. +- Cache: + - HA-Entity-Metadaten werden als `ha_entity_cache.json` gespeichert. + - Summary und Dashboard verwenden Friendly Name, Area und Device aus Cache. +- Keine externen Abfragen im Dashboard-Startpfad: + - Kein Cloud-Ping, keine Fremd-API. + - HA-Zugriffe bleiben lokal gegen Home Assistant. +- Dashboard: + - Orange ist Primaerfarbe. + - Cyan ist sichtbare Komplementaerfarbe. + - Rote UI-Flaechen wurden entfernt. + - Steuerung, beobachtete Geraete, Lernfortschritt/Freigabe und Systemstatus + sind getrennte Bereiche. + - Discovery, Vorschlaege und Automation-Suche laden erst bei Nutzeraktion. +- Lernfortschritt und Freigabe: + - Karten zeigen Modus, Status, Handlungen, Vorhersage und Freigabestatus. + - Detailansicht zeigt Zuordnung, Sicherheit, Lernstand, Vorhersage, + Feedback, passende HA-Automationen und verwendete Sensoren/Zustaende. +- Direkte HA-Nutzung: + - Aktor-Schaltungen laufen ueber Home-Assistant-Serviceaufrufe. + - Automation-Steuerung nutzt Home-Assistant-Endpunkte und gecachte + Automation-Metadaten. +- Qualitaet: + - `pytest -q` + - `ruff check .` + - `mypy app backend tests` + - `git diff --check` + +## Teilweise Erfuellt + +- Bessere Statistik: + - Startbereich zeigt Aktoren, Freigabebereitschaft, Aktiv/Shadow, + Gelernt/Wartet, gelernte Handlungen, Discovery-Gruppen und Cache-Zeitpunkt. + - Noch offen: Verlaufsgrafiken, p95-Latenzen und Trendstatistik je Aktor. +- Kontrollierte Abarbeitung und Queue: + - Reconciliation/Training laufen kontrolliert im Prozess und sind testbar. + - Noch offen: sichtbare Job-Queue mit Laufzeit, Fehlern und Retry-Status im + Dashboard. +- Saubere Issues: + - v1.0.0-Issues #41 bis #47 wurden geschlossen. + - Rueckblickend waren sie zu grob; v1.0.x bekommt feinere Folgeissues fuer + Statistik, Queue-Sichtbarkeit und Performance-Budgets. + +## Offen Fuer v1.0.x + +- Echte Dashboard-Performance-Budget-Tests, die Start-HTML und + `/v1/actuators/dashboard` gegen ein 5-Sekunden-Limit messen. +- Dashboard-Jobstatus fuer Reconciliation, Training, Discovery und + Automation-Refresh. +- Mehr Entscheidungsstatistik pro Aktor: welche Sensoren wie stark + beigetragen haben, wie sich Confidence und Sample Count entwickeln. +- Dokumentierte HA-Installationspruefung mit Supervisor-/Ingress-Hinweisen, + weil direkte Container-HTTP-Pruefung ausserhalb HA nicht immer routbar ist. + +## Rollback + +- Git-Bundle-Backups liegen unter + `/root/.openclaw/workspace/backups/sillyhome-next/`. +- Vor `v1.0.1` wurde ein Home-Assistant-Teilbackup des Add-ons angelegt. + Referenz: `18a5b387`. +- Letzter Vor-1.0-Stand: `v0.7.21`. diff --git a/pyproject.toml b/pyproject.toml index 0c3efcc..e30b8a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "sillyhome-next" -version = "1.0.1" +version = "1.0.2" description = "Lokales Smart-Home-Intelligenzsystem für Home Assistant" requires-python = ">=3.11" dependencies = [