Initialisiere SillyHome Next Analyseprojekt
This commit is contained in:
27
.gitignore
vendored
Normal file
27
.gitignore
vendored
Normal file
@@ -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
|
||||||
13
ARCHITECTURE.md
Normal file
13
ARCHITECTURE.md
Normal file
@@ -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.
|
||||||
5
CHANGELOG.md
Normal file
5
CHANGELOG.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
- Projektinitiierung
|
||||||
|
- Architektur, ADRs und Roadmap
|
||||||
3
CONTRIBUTING.md
Normal file
3
CONTRIBUTING.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Branch nach Feature. Pull Requests mit ADR-Änderungen, Tests und Doku sind Pflicht.
|
||||||
14
README.md
Normal file
14
README.md
Normal file
@@ -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
|
||||||
15
ROADMAP.md
Normal file
15
ROADMAP.md
Normal file
@@ -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
|
||||||
17
docs/adr/ADR-001-data-flow.md
Normal file
17
docs/adr/ADR-001-data-flow.md
Normal file
@@ -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.
|
||||||
17
docs/adr/ADR-002-ml-stack.md
Normal file
17
docs/adr/ADR-002-ml-stack.md
Normal file
@@ -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.
|
||||||
16
docs/adr/ADR-003-api-gateway.md
Normal file
16
docs/adr/ADR-003-api-gateway.md
Normal file
@@ -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.
|
||||||
16
docs/adr/ADR-004-deployment.md
Normal file
16
docs/adr/ADR-004-deployment.md
Normal file
@@ -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.
|
||||||
52
scripts/gitea_setup.py
Normal file
52
scripts/gitea_setup.py
Normal file
@@ -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')
|
||||||
Reference in New Issue
Block a user