commit 9affaac82ff99be1c87565e77d371bf58a34ff50 Author: Pino Date: Wed Jun 10 07:18:14 2026 +0200 Initialisiere SillyHome Next Analyseprojekt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e8bf15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Projekt-Scope: thesillyhome-reanalysis +# Vermeide Störungen aus dem übergeordneten Workspace. + +# Isolation: projektinterne Hüterdateien ignorieren, +# aber keine Steuerdateien aus dem Workspace-Root stumm abschalten. +!memory/ +!memory/* +!second-brain/ +!second-brain/* + +# Secrets und Umgebungsvariablen +.env +.env.local +.env.*.local + +# Vermischte Backup- und temporäre Dateien +*.sqlite.bak +*.sqlite.bak-* +*.log +*.tmp +*.swp +*.swo + +# Editor/IDE +.idea +.vscode +*.code-workspace diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..aacadba --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,13 @@ +# SillyHome Next — Architekturübersicht + +Ziel ist ein lokales, datensparsames, erklärbares Smart-Home-Intelligenzsystem für Home Assistant. Es analysiert Historie, erkennt Gewohnheiten, erstellt Vorhersagen, empfiehlt Automationen und kann auf Wunsch einfach in Automationen übersetzen. Vier Intelligenzebenen sind vorgesehen: regelbasiert, ML-gestützt, LLM-unterstützt und autonomer Hausagent. + +## Leitentscheidungen + +- Lokal-first und datensparsam; keine Cloudpflicht. +- Trennung von Datenintegration, Trainingspipeline, Vorhersageservice und Erklärungsschicht. +- Standardintegration über MQTT und Home Assistant WebSocket plus REST. +- Schnittstellen über FastAPI und OpenAI-kompatible Endpunkte. +- Langzeitdaten in PostgreSQL und TimescaleDB; Vektoren für semantische Suche optional. +- Deployment über Docker Compose; Kubernetes optional für erweiterte Betriebsgrößen. +- Tests, Docs und Changelog sind Pflichtbestandteil jeder Änderung. diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f39fa92 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## Unreleased +- Projektinitiierung +- Architektur, ADRs und Roadmap diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..bab435e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contributing + +Branch nach Feature. Pull Requests mit ADR-Änderungen, Tests und Doku sind Pflicht. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e983512 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# SillyHome Next + +Modern, lokal-first und datenschutzfreundliches Smart-Home-Intelligenzsystem für Home Assistant. + +## Motivation +TheSillyHome zeigte die Idee: statt statischer Regeln das Zuhause aus Verhaltensmustern verstehen. Diese Architektur modernisiert den Ansatz in Richtung Explainable AI, hybride Intelligenzebenen und langlebige Wartbarkeit. + +## Ziele +- Home Assistant und Sensoren/Aktoren verstehen +- Historie auswerten und Gewohnheiten erkennen +- Vorhersagen erstellen und erklären +- Automationen vorschlagen und direkt generieren +- Lokal-first ohne Cloudpflicht +- Erweiterbar, testbar, dokumentiert diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..b1aa232 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,15 @@ +# Roadmap + +## Phase 0 — Analyse und Architektur +- Quellenanalyse +- ADRs +- Repo-Setup + +## Phase 1 — MVP +- HA-Integration, Sensordiskover, Modelltraining, Vorhersage-API, Erklärung, UI, Addon-Setup, Tests + +## Phase 2 — Erweiterte Intelligenz +- Zeitreihenmodelle, Reinforcement-Learning-Prototypen, Agentic-Systeme mit Ollama/Litellm + +## Phase 3 — Betrieb und Produktivierung +- Rollback, Backup/Restore, Releases, Dokumentation, Community-Anbindung diff --git a/docs/adr/ADR-001-data-flow.md b/docs/adr/ADR-001-data-flow.md new file mode 100644 index 0000000..23995aa --- /dev/null +++ b/docs/adr/ADR-001-data-flow.md @@ -0,0 +1,17 @@ +# ADR-001: Datenfluss zwischen Home Assistant und Trainingsdaten + +## Status +Angenommen + +## Kontext +Das System muss Historie lesen und Live-Events verarbeiten. OAuth-HA-Zugriff ist aufwändiger, Long-Lived-Tokens sind in lokalen Netzen vertretbar. + +## Entscheidung +- Home Assistant Integration via Long-Lived Access Token oder Supervisor-Service-Account. +- Historische Daten via SQL-Export/Backup, Lesezugriff auf die Recorder-Datenbank oder REST `/api/history/period`. +- Live-Events via WebSocket und optional MQTT. + +## Konsequenzen +- Vereinfachung der Integration. +- Kein permanentes MQTT-Bridge-Setup zwingend. +- Backup-Granularität und lokale Datenschutzprüfung bleiben erforderlich. diff --git a/docs/adr/ADR-002-ml-stack.md b/docs/adr/ADR-002-ml-stack.md new file mode 100644 index 0000000..a860f6f --- /dev/null +++ b/docs/adr/ADR-002-ml-stack.md @@ -0,0 +1,17 @@ +# ADR-002: ML-Stack und Modellwahl + +## Status +Angenommen + +## Kontext +Es soll lokal laufen, erklärbar bleiben und ohne zwingende Cloud auskommen. + +## Entscheidung +- Regel- und ML-Ebene mit PyTorch, scikit-learn und XGBoost. +- LLM-Ebene über Ollama-kompatible Modelle oder OpenAI-kompatible LiteLLM-Proxy-Anbindung lokal. +- Semantik über Sentence-Transformers oder lokale Embeddings. + +## Konsequenzen +- Lokal-first-Betrieb bleibt machbar. +- Modellwechsel ist durch Schnittstellen-Abstraktion möglich. +- GPU-Einsatz ist optional und bleibt trennbar. diff --git a/docs/adr/ADR-003-api-gateway.md b/docs/adr/ADR-003-api-gateway.md new file mode 100644 index 0000000..9abeac2 --- /dev/null +++ b/docs/adr/ADR-003-api-gateway.md @@ -0,0 +1,16 @@ +# ADR-003: API und Integration Gateway + +## Status +Angenommen + +## Kontext +HA, Addon, UI und externe Dienste müssen stabil integrierbar sein. + +## Entscheidung +- FastAPI als zentraler API-Layer. +- Endpunkte für Geräte, Sensoren, Vorhersagen, Erklärungen, Automationen und Insights. +- OpenAI-kompatible Endpunkte für LLM-gestützte Assistenz. + +## Konsequenzen +- Standardisierte Anbindung und klare Versionierung. +- Einfache Erweiterung für zusätzliche Integrationen. diff --git a/docs/adr/ADR-004-deployment.md b/docs/adr/ADR-004-deployment.md new file mode 100644 index 0000000..1a65c84 --- /dev/null +++ b/docs/adr/ADR-004-deployment.md @@ -0,0 +1,16 @@ +# ADR-004: Deploymentmodell + +## Status +Angenommen + +## Kontext +Das System soll einfach installierbar sein, lokal laufen und wartbar bleiben. + +## Entscheidung +- Docker Compose für Core-Services. +- HA Addon-Rezepte und Lua-Skripte als optionale Integrationshilfe. +- Kubernetes-Support bleibt möglich, aber optional. + +## Konsequenzen +- Schneller Einstieg in bestehende HA-Umgebungen. +- Flexibilität für künftige Betriebsgrößen. diff --git a/scripts/gitea_setup.py b/scripts/gitea_setup.py new file mode 100644 index 0000000..f9f46a2 --- /dev/null +++ b/scripts/gitea_setup.py @@ -0,0 +1,52 @@ +import requests +import json +from pathlib import Path + +p = Path('/root/.openclaw/secrets/gitea.env') +env = {} +for line in p.read_text().splitlines(): + if '=' in line: + k, v = line.split('=', 1) + env[k.strip()] = v.strip() +token = env['GITEA_TOKEN'] +base = 'http://192.168.6.31:3000/api/v1' +repo = 'pino/sillyhome-next' +session = requests.Session() +session.headers.update({'Authorization': f'token {token}', 'Content-Type': 'application/json'}) + +label_names = ['enhancement','bug','documentation','ai','integration','infra','frontend','backend','tests','devops'] +labels = {} +for name in label_names: + r = session.post(f'{base}/repos/{repo}/labels', json={'name': name, 'color': '0e8a16'}) + if r.status_code not in (201, 200): + print('label create failed', name, r.status_code, r.text[:120]) + else: + labels[name] = r.json()['id'] +print('labels:', labels) + +issues = [ + ('ARCH-001: Projektstruktur und Entwicklungsrichtlinien', '## Aufgabe\n- CONTRIBUTING.md vervollständigen\n- Sprint-Rhythmus festlegen: 2 Wochen, Review Montag\n\n## Akzeptanz\n- CONTRIBUTING.md aktuell', [labels.get('documentation')], 10), + ('ARCH-002: ADRs finalisieren und Entscheidungen fixieren', '## Aufgabe\n- ADR-005 Explainability\n- ADR-006 Retention\n\n## Akzeptanz\n- Mindestens 6 ADRs dokumentiert', [labels.get('documentation')], 10), + ('INFRA-001: Docker Compose Grundgerüst für lokalen Betrieb', '## Aufgabe\n- docker-compose.yml für API, Scheduler, Worker\n- .env.example und README-Quickstart\n\n## Akzeptanz\n- Lokaler Start in <5 Minuten', [labels.get('infra'), labels.get('devops')], 10), + ('DOC-001: README, CHANGELOG und Release-Checkliste pflegen', '## Aufgabe\n- README finalisieren\n- CHANGELOG starten\n- Release-Checkliste anlegen', [labels.get('documentation')], 10), + ('INT-001: Home Assistant Datenintegration (REST + Recorder-Lesezugriff)', '## Aufgabe\n- HA REST Client\n- Historische States auslesen\n- Entities erkennen\n\n## Akzeptanz\n- Sensoren/Aktoren erkannt', [labels.get('integration'), labels.get('backend')], 11), + ('ML-001: Datenvorverarbeitung und Feature-Pipeline', '## Aufgabe\n- Normalisierung und Zeitfeatures\n- Trainingsformat definieren\n\n## Akzeptanz\n- Reproduzierbare Transformation', [labels.get('backend'), labels.get('ai')], 11), + ('ML-002: Regelbasierte Empfehlungen (Ebene 1)', '## Aufgabe\n- Heuristiken implementieren\n- Empfehlungs-API\n\n## Akzeptanz\n- Erste Empfehlungen ausgespielt', [labels.get('ai'), labels.get('backend')], 11), + ('API-001: FastAPI-Kern und OpenAPI-Spezifikation', '## Aufgabe\n- FastAPI Grundgerüst\n- Basisendpunkte und Swagger\n\n## Akzeptanz\n- Swagger UI erreichbar', [labels.get('backend'), labels.get('infra')], 11), +] + +existing = session.get(f'{base}/repos/{repo}/issues?state=all&per_page=100').json() +existing_titles = {i['title'] for i in existing} + +for title, body, label_ids, milestone_id in issues: + if title in existing_titles: + print('skip existing', title) + continue + payload = { + 'title': title, + 'body': body, + 'labels': [lid for lid in label_ids if lid], + 'milestone': milestone_id, + } + r = session.post(f'{base}/repos/{repo}/issues', json=payload) + print('issue', title, r.status_code, r.text[:120] if r.status_code not in (201,) else 'created')