Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 63b8684197 |
@@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# 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
|
## 1.0.1 - 2026-06-17
|
||||||
- Dashboard-UI nach v1-Korrektur neu strukturiert: feste Steuerungsleiste,
|
- Dashboard-UI nach v1-Korrektur neu strukturiert: feste Steuerungsleiste,
|
||||||
separate Geräteübersicht, klare Freigabe-/Detailfläche und Statusbereich.
|
separate Geräteübersicht, klare Freigabe-/Detailfläche und Statusbereich.
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ nach einer ausdrücklichen Freigabe ausführen.
|
|||||||
[`docs/OPERATIONS.md`](docs/OPERATIONS.md)
|
[`docs/OPERATIONS.md`](docs/OPERATIONS.md)
|
||||||
- Version 1.0.0 bedienen und prüfen:
|
- Version 1.0.0 bedienen und prüfen:
|
||||||
[`docs/V1_0_0_OPERATING_GUIDE.md`](docs/V1_0_0_OPERATING_GUIDE.md)
|
[`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)
|
- Arbeitsregeln für Coding-Agenten: [`AGENTS.md`](AGENTS.md)
|
||||||
|
|
||||||
## Reifegrad
|
## Reifegrad
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name: SillyHome Next
|
name: SillyHome Next
|
||||||
version: "1.0.1"
|
version: "1.0.2"
|
||||||
slug: sillyhome_next
|
slug: sillyhome_next
|
||||||
description: Lernt automatisch aus deinem Verhalten und steuert freigegebene Aktoren
|
description: Lernt automatisch aus deinem Verhalten und steuert freigegebene Aktoren
|
||||||
url: http://192.168.6.31:3000/pino/sillyhome-next
|
url: http://192.168.6.31:3000/pino/sillyhome-next
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ async def lifespan(app: FastAPI) -> AsyncIterator[None]:
|
|||||||
app = FastAPI(
|
app = FastAPI(
|
||||||
title="SillyHome Next API",
|
title="SillyHome Next API",
|
||||||
description="Lokales Smart-Home-Intelligenzsystem für Home Assistant.",
|
description="Lokales Smart-Home-Intelligenzsystem für Home Assistant.",
|
||||||
version="1.0.1",
|
version="1.0.2",
|
||||||
lifespan=lifespan,
|
lifespan=lifespan,
|
||||||
)
|
)
|
||||||
app.state.settings = load_settings()
|
app.state.settings = load_settings()
|
||||||
|
|||||||
@@ -479,7 +479,16 @@ function renderDashboardStatus(dashboard) {
|
|||||||
const stats = document.getElementById("dashboard-stats");
|
const stats = document.getElementById("dashboard-stats");
|
||||||
const system = dashboard.system || {};
|
const system = dashboard.system || {};
|
||||||
const cache = dashboard.cache || {};
|
const cache = dashboard.cache || {};
|
||||||
|
const actuators = dashboard.actuators || [];
|
||||||
const discoveryGroups = dashboard.discovery_groups || [];
|
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
|
const cacheLabel = cache.available
|
||||||
? `Cache aktuell mit ${cache.entity_count} Entities`
|
? `Cache aktuell mit ${cache.entity_count} Entities`
|
||||||
: "Cache wird nach Discovery aufgebaut";
|
: "Cache wird nach Discovery aufgebaut";
|
||||||
@@ -497,7 +506,11 @@ function renderDashboardStatus(dashboard) {
|
|||||||
`<span class="chip">Prüfen: ${escapeHtml(system.review_required ?? 0)}</span>`,
|
`<span class="chip">Prüfen: ${escapeHtml(system.review_required ?? 0)}</span>`,
|
||||||
].join("");
|
].join("");
|
||||||
stats.innerHTML = [
|
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>Discovery-Gruppen</strong>${escapeHtml(discoveryGroups.length)} Kategorien</div>`,
|
||||||
`<div class="metric"><strong>Cache-Zeitpunkt</strong>${escapeHtml(cache.updated_at || "noch offen")}</div>`,
|
`<div class="metric"><strong>Cache-Zeitpunkt</strong>${escapeHtml(cache.updated_at || "noch offen")}</div>`,
|
||||||
].join("");
|
].join("");
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ Diese Version stabilisiert den produktiven Kern: schnelle Dashboard-Nutzung,
|
|||||||
lokales Caching, klare Aktor-/Sensor-Kategorien und nachvollziehbare Freigabe
|
lokales Caching, klare Aktor-/Sensor-Kategorien und nachvollziehbare Freigabe
|
||||||
gelernter Aktionen.
|
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
|
## Grundprinzip
|
||||||
|
|
||||||
- Home Assistant bleibt die Quelle fuer aktuelle States und Services.
|
- Home Assistant bleibt die Quelle fuer aktuelle States und Services.
|
||||||
|
|||||||
80
docs/V1_0_ACCEPTANCE.md
Normal file
80
docs/V1_0_ACCEPTANCE.md
Normal file
@@ -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`.
|
||||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "sillyhome-next"
|
name = "sillyhome-next"
|
||||||
version = "1.0.1"
|
version = "1.0.2"
|
||||||
description = "Lokales Smart-Home-Intelligenzsystem für Home Assistant"
|
description = "Lokales Smart-Home-Intelligenzsystem für Home Assistant"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
Reference in New Issue
Block a user