From 2f7b1a0aa275dfb81ac4c88944ea22aafe242194 Mon Sep 17 00:00:00 2001 From: Micha Date: Mon, 4 May 2026 13:29:06 +0200 Subject: [PATCH] Prepare Home Assistant weather export to InfluxDB Prepare Home Assistant weather export to InfluxDB --- HOMELAB_ARCHITECTURE_MASTER_V2.md | 8 +- README.md | 2 +- docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md | 112 ++++++++++++++++++++++++ docs/MIGRATION_LOG.md | 8 +- ops/grafana-influxdb/README.md | 9 +- ops/grafana-influxdb/docker-compose.yml | 2 + ops/grafana-influxdb/stack.env.example | 1 + 7 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md create mode 100644 ops/grafana-influxdb/stack.env.example diff --git a/HOMELAB_ARCHITECTURE_MASTER_V2.md b/HOMELAB_ARCHITECTURE_MASTER_V2.md index b9f65b8..f26050f 100644 --- a/HOMELAB_ARCHITECTURE_MASTER_V2.md +++ b/HOMELAB_ARCHITECTURE_MASTER_V2.md @@ -290,8 +290,8 @@ Legende Status: | `glances` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `glances.kaleschke.info` | — | | `scrutiny` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `scrutiny.kaleschke.info`, Git-Stack | `privileged` später prüfen | | `speedtest-tracker` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `speedtest.kaleschke.info` | — | -| `grafana` | ✅ vorbereitet | `frontend_net`, `grafana_influx_internal` | Traefik + Middleware | vorbereitet via `grafana.kaleschke.info`, InfluxDB-Datenquelle provisioniert | Secrets anlegen, Deploy offen | -| `influxdb3-core` | ✅ vorbereitet | `grafana_influx_internal` | intern | InfluxDB 3 Core fuer Metriken; keine direkte Host-/Traefik-Freigabe | Token und Datenbank `homelab` anlegen, Deploy offen | +| `grafana` | ✅ | `frontend_net`, `grafana_influx_internal` | Traefik + Middleware | aktiv via `grafana.kaleschke.info`, InfluxDB-Datenquelle provisioniert | Wetter-/HA-Dashboard aufbauen | +| `influxdb3-core` | ✅ | `grafana_influx_internal` + optional LAN-Bind | LAN-Port nur fuer interne Writer | InfluxDB 3 Core fuer Metriken; keine Traefik-/Public-Freigabe | HA-Write-Token und Sensor-Export finalisieren | ### 7.7 Noch offene Sonderfälle @@ -528,8 +528,8 @@ Mutable Tags wie `latest`, `stable`, `release` oder reine Major-Tags wurden auf ### BentoPDF und Grafana/InfluxDB vorbereitet (2026-04-30) - `bentopdf` ersetzt repo-seitig `stirling-pdf` auf der bestehenden Domain `pdf.kaleschke.info`, bleibt aber bis zum bewussten Komodo-Deploy nur vorbereitet. - BentoPDF benoetigt fuer Office-Konvertierung die Cross-Origin-Isolation-Header `Cross-Origin-Opener-Policy: same-origin` und `Cross-Origin-Embedder-Policy: require-corp`; diese werden per Traefik-Docker-Middleware gesetzt. -- `grafana` wird als geschuetztes Monitoring-UI unter `grafana.kaleschke.info` vorbereitet. -- `influxdb3-core` bleibt als interne Datenbank ohne direkten Host-Port im Compose-internen Netz `grafana_influx_internal`. +- `grafana` wird als geschuetztes Monitoring-UI unter `grafana.kaleschke.info` betrieben. +- `influxdb3-core` bleibt ohne Traefik-/Public-Route; fuer interne Writer wie Home Assistant kann Port `8181` per `INFLUXDB_BIND_IP` auf eine LAN-Adresse gebunden werden. - InfluxDB 3 Core nutzt einen festen Versionstag statt `latest`, weil der InfluxDB-`latest`-Tag versionsstrategisch im Umbruch ist. ### ddns-updater — Netz-Ausnahme diff --git a/README.md b/README.md index 4ad65df..c64e781 100644 --- a/README.md +++ b/README.md @@ -64,4 +64,4 @@ Bei Restore-, Host-Ausfall- oder Wiederanlauf-Fragen zusaetzlich: - Mutable Image-Tags sind auf die aktuell laufenden Digests eingefroren; echte Versions-Upgrades erfolgen bewusst separat. - Disaster-Recovery und dienstspezifische Restore-Quellen sind in `docs/DISASTER_RECOVERY.md` und `docs/RESTORE_MATRIX.md` beschrieben. - Der verbindliche Detailablauf steht in `docs/WORKFLOW.md`. -- `nextcloud`, `bentopdf` und `grafana-influxdb` sind repo-seitig vorbereitet und folgen dem dokumentierten Netz-/Secret-/Traefik-Modell. +- `nextcloud`, `bentopdf` und `grafana-influxdb` folgen dem dokumentierten Netz-/Secret-/Traefik-Modell; Grafana/InfluxDB ist fuer Home-Assistant-Wetterdaten vorbereitet. diff --git a/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md b/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md new file mode 100644 index 0000000..3770bca --- /dev/null +++ b/docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md @@ -0,0 +1,112 @@ +# Home Assistant -> InfluxDB 3 -> Grafana + +Ziel: Home Assistant schreibt ausgewaehlte Ecowitt- und Energiesensoren nach InfluxDB 3 Core. Grafana bleibt das Langzeit-Dashboard, Home Assistant bleibt die Automationszentrale. + +## 1. InfluxDB fuer Home Assistant erreichbar machen + +Der Stack haelt InfluxDB bewusst ohne Traefik-Route. Fuer Home Assistant wird nur der HTTP-Port `8181` auf einer internen LAN-Adresse veroeffentlicht. + +In Komodo/Stack-Environment fuer `ops/grafana-influxdb` setzen: + +```env +INFLUXDB_BIND_IP=192.168.178.X +``` + +`192.168.178.X` ist die LAN-IP des Docker-Hosts, auf dem `influxdb3-core` laeuft. Nicht `0.0.0.0` verwenden, wenn es nicht notwendig ist. + +Danach den Stack neu deployen und von Home Assistant aus pruefen: + +```bash +curl -I http://192.168.178.X:8181/health +``` + +## 2. Token fuer Home Assistant + +Am besten einen eigenen Write-Token fuer Home Assistant verwenden. Fuer den ersten Test kann der bestehende Admin-Token funktionieren; langfristig sollte der HA-Token nur in die Datenbank `homelab` schreiben duerfen. + +Den Token in Home Assistant eintragen: + +```yaml +# /homeassistant/secrets.yaml +influxdb3_homeassistant_token: "apiv3_REPLACE_WITH_WRITE_TOKEN" +``` + +## 3. Home Assistant konfigurieren + +Minimaler Startblock fuer `/homeassistant/configuration.yaml`: + +```yaml +influxdb: + api_version: 2 + ssl: false + host: 192.168.178.X + port: 8181 + token: !secret influxdb3_homeassistant_token + organization: homelab + bucket: homelab + max_retries: 3 + default_measurement: state + include: + entity_globs: + - sensor.*ecowitt* + - sensor.*gw* + - sensor.netzbezug_live + - sensor.ins_netz_live + - sensor.ins_haus_live + - sensor.pv_ueberschuss_live + - sensor.batterie_soc_live + - sensor.wallbox_leistung_live + - sensor.pv_produktion_heute + - sensor.wallbox_energie_heute +``` + +Die `sensor.*gw*`-Regel ist nur ein Startpunkt, weil Ecowitt-Gateways haeufig `gw...` im Entity-Namen haben. Nach dem ersten Export in Grafana pruefen und die Liste enger machen. + +Nach dem Edit: + +```bash +ha core check +ha core restart +``` + +## 4. Grafana Smoke-Test + +In Grafana mit der bestehenden Datenquelle `InfluxDB 3 Core` eine SQL-Abfrage testen: + +```sql +SHOW TABLES +``` + +Danach eine konkrete Tabelle pruefen. Home Assistant schreibt Measurements je nach Konfiguration und Entity-Typ; typische Tabellen sind `state`, `degC`, `%`, `W`, `kWh` oder aehnliche Measurement-Namen. + +Beispiel fuer die ersten Werte: + +```sql +SELECT * +FROM state +ORDER BY time DESC +LIMIT 20 +``` + +## 5. Dashboard-Kandidaten + +Sinnvolle Panels fuer das erste Wetter-Dashboard: + +- Aussentemperatur und Luftfeuchte +- Luftdruck +- Windgeschwindigkeit und Boeen +- Regenrate und Regen heute +- UV und Solarstrahlung +- Batterielevel der Ecowitt-Sensoren +- PV-Ueberschuss vs. Wetter +- Wallbox-Leistung vs. PV-Ueberschuss + +## 6. Erste Automationen + +Home Assistant bleibt fuer Reaktionen zustaendig: + +- Regen startet -> Dachfenster/Fenster pruefen +- Windboee ueber Grenzwert -> Markise/Rolllaeden schuetzen +- Frostwarnung -> Garten/Wasser/Auto-Hinweis +- Genug Regen heute -> Bewaesserung ueberspringen +- Ecowitt-Batterie niedrig -> ntfy/HA-Benachrichtigung diff --git a/docs/MIGRATION_LOG.md b/docs/MIGRATION_LOG.md index 86fb19c..9ed0953 100644 --- a/docs/MIGRATION_LOG.md +++ b/docs/MIGRATION_LOG.md @@ -71,10 +71,10 @@ Dieses Dokument ist nur noch ein historischer Verlauf. Der aktuelle operative Ab - `stirling-pdf` repo-seitig durch `bentopdf` ersetzt; Domain `pdf.kaleschke.info` bleibt erhalten. - BentoPDF laeuft als geschuetztes browserseitiges PDF-Tool hinter `authelia@file,secure-headers@file` und setzt zusaetzlich COOP/COEP-Header fuer SharedArrayBuffer-basierte Office-Konvertierung. -- `ops/grafana-influxdb` als neuer Monitoring-Stack vorbereitet, aber noch nicht deployed. -- Grafana wird hinter Traefik + Authelia unter `grafana.kaleschke.info` geplant. -- InfluxDB 3 Core bleibt intern im Compose-Netz und wird ueber eine provisionierte Grafana-Datenquelle angebunden. -- Secrets fuer Grafana-Admin-Passwort, InfluxDB-Admin-Token und Grafana-Datasource-Token sind als Host-Dateien unter `/mnt/user/appdata/secrets/` dokumentiert und muessen vor dem ersten Deploy angelegt werden. +- `ops/grafana-influxdb` als neuer Monitoring-Stack vorbereitet und spaeter in Betrieb genommen. +- Grafana laeuft hinter Traefik + Authelia unter `grafana.kaleschke.info`. +- InfluxDB 3 Core bleibt ohne Public Route und wird ueber eine provisionierte Grafana-Datenquelle angebunden. +- Secrets fuer Grafana-Admin-Passwort, InfluxDB-Admin-Token und Grafana-Datasource-Token sind als Host-Dateien unter `/mnt/user/appdata/secrets/` dokumentiert. --- diff --git a/ops/grafana-influxdb/README.md b/ops/grafana-influxdb/README.md index 4f4f2af..e0e4059 100644 --- a/ops/grafana-influxdb/README.md +++ b/ops/grafana-influxdb/README.md @@ -1,17 +1,18 @@ # Grafana + InfluxDB 3 Core -Vorbereiteter Monitoring-Stack. Noch nicht deployen, bis die Secrets und der erste InfluxDB-Token sauber angelegt sind. +Monitoring-Stack fuer Grafana + InfluxDB 3 Core. InfluxDB bleibt ohne Public Route; interne Writer wie Home Assistant koennen ueber einen gezielt gebundenen LAN-Port schreiben. ## Quellen / Entscheidungen - Grafana nutzt das offizielle OSS-Image `grafana/grafana:12.4.3`. - InfluxDB nutzt `influxdb:3.9.1-core`, nicht `latest`, weil `latest` bei InfluxDB aktiv in Richtung InfluxDB 3 umgestellt wird. - Grafana wird ueber Traefik + `authelia@file,secure-headers@file` unter `grafana.kaleschke.info` veroeffentlicht. -- InfluxDB bleibt ohne direkten Host-Port und ohne Traefik-Route im internen Compose-Netz `grafana_influx_internal`. +- InfluxDB bleibt ohne Traefik-Route. Der HTTP-Port `8181` kann fuer interne Writer wie Home Assistant ueber `INFLUXDB_BIND_IP` auf eine LAN-Adresse gebunden werden; Default ist `127.0.0.1`. - Grafana provisioning legt eine SQL-Datenquelle fuer InfluxDB 3 Core mit der Datenbank `homelab` an. - Der Grafana-Datasource-Token liegt als Secret-Datei auf dem Host und wird beim Containerstart nur containerintern in die fuer Grafana-Provisioning noetige Environment-Variable geladen. +- Home Assistant schreibt mit der InfluxDB-v2-API-Kompatibilitaet nach InfluxDB 3; Details: `docs/HOME_ASSISTANT_INFLUXDB_ECOWITT.md`. -## Vor dem ersten Deploy +## Initiale Einrichtung 1. Secret fuer Grafana anlegen: @@ -55,7 +56,7 @@ Vorbereiteter Monitoring-Stack. Noch nicht deployen, bis die Secrets und der ers - `https://grafana.kaleschke.info` oeffnet nach Authelia die Grafana-Loginseite. - Grafana `Connections -> Data sources -> InfluxDB 3 Core -> Save & test` ist erfolgreich. -- InfluxDB bleibt von aussen nicht direkt erreichbar. +- InfluxDB bleibt ohne Public Route. Falls `INFLUXDB_BIND_IP` auf die LAN-IP gesetzt ist, ist Port `8181` nur im internen Netz fuer Writer wie Home Assistant erreichbar. ## Rollback diff --git a/ops/grafana-influxdb/docker-compose.yml b/ops/grafana-influxdb/docker-compose.yml index 9a21895..df713d0 100644 --- a/ops/grafana-influxdb/docker-compose.yml +++ b/ops/grafana-influxdb/docker-compose.yml @@ -47,6 +47,8 @@ services: container_name: influxdb3-core restart: unless-stopped user: "0" + ports: + - "${INFLUXDB_BIND_IP:-127.0.0.1}:8181:8181" command: - influxdb3 - serve diff --git a/ops/grafana-influxdb/stack.env.example b/ops/grafana-influxdb/stack.env.example new file mode 100644 index 0000000..6a1aa53 --- /dev/null +++ b/ops/grafana-influxdb/stack.env.example @@ -0,0 +1 @@ +INFLUXDB_BIND_IP=127.0.0.1