DOCS-SYNC: README + RECOVERY + NETATMO.md aktualisiert, CHANGELOG neu
README.md: - Architektur-Diagramm: clock_wordclock + netatmo ergaenzt - Neue Sektion 'Shared Foundation' (palette.py + plugins/base.py) - Neue Sektion 'DeepSleep / Energie' (Weckzeiten, CPU-Throttle, /power Route) - Plugin-Tabelle korrigiert: alle Config-Felder auf aktuellen Stand (system: show_uptime/show_load/compact, strava: client_id/secret/refresh_token, spotify: Last.fm statt Spotify API, gmail: oauth_token_json, minimax: subscription_key, netatmo: client_id/secret/refresh_token) - Eigenes-Plugin-Sektion: Hinweis auf shared helper-Nutzung - Quick-Start config.json mit power-Block-Beispiel RECOVERY.md: - Neue Sektion 'Display-Refresh aus Admin-UI erzwingen' (POST /api/wake) - Neue Sektion 'DeepSleep-Fehlkonfiguration' (manueller Fix via SSH/Recovery-AP) plugins/NETATMO.md: - Sektion 3: Slot-Tabelle aktualisiert (compact / compact_2x2 / full_4x4) - Neues V1-Status-Update ASCII-Layout mit allen Sektionen - Design-Regeln explizit aufgelistet - Sektion 4 Optionen auf aktuellen Stand (refresh_token statt username/password, show_forecast statt show_secondary/show_compass, bar_gradient weg) - Sektion 6 Technische Details: Forecast-Quelle Open-Meteo, neue interne Methoden (_render_compact_2x2, _render_full_4x4, _get_12h_history, _get_forecast), shared helper explizit aufgelistet CHANGELOG.md (neu): - Keep-a-Changelog-Format mit [Unreleased] fuer aktuelle Aenderungen - FEAT-DEEPSLEEP + FEAT-NETATMO-06 + REFACTOR-PLUGINS dokumentiert - 'Earlier' Sektion mit letztem Git-Log der NETATMO-Iterationen
This commit is contained in:
+93
-17
@@ -97,12 +97,59 @@ In der Admin-UI ein Netatmo-Widget auf das Grid ziehen. Das Plugin ist
|
||||
|
||||
| Slot | Was du siehst |
|
||||
|---|---|
|
||||
| **1×1** | Große Außen-Temperatur, Mini-CO₂/Feuchte-Status |
|
||||
| **2×1** | Outdoor-Temperatur + Wind-Geschwindigkeit kompakt |
|
||||
| **4×1** | Indoor · Outdoor · Wind/Regen — drei Spalten |
|
||||
| **1×4** | Vertikale Liste aller Module |
|
||||
| **2×2** | Indoor-Card (mit CO₂-Bar) + Outdoor-Card + Wind/Regen-Bereich |
|
||||
| **4×4** | Volle Ansicht mit allen Modulen, Min/Max, Windrose |
|
||||
| **1×1** | `compact`: Große Außen-Temperatur + MIN/MAX + Tag-Status |
|
||||
| **2×2** | `compact_2x2`: Aussen + Wind/Regen-Bereich + Indoor-Liste |
|
||||
| **4×4** | `full_4x4`: Volle V1-Status-Update Ansicht (siehe unten) |
|
||||
|
||||
### V1-Status-Update Design (4×4)
|
||||
|
||||
Die grosse Ansicht ist als **V1-Status-Update** designed — minimal, weisser
|
||||
Hintergrund, kräftige Akzentfarben, klare Hierarchie:
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────┐
|
||||
│ DAHEIM Mo 31.08 00:36 │
|
||||
├──────────────┬──────────┬─────────────────────────────────────────┤
|
||||
│ AUSSEN ▮▮▮ │ WIND │ INNEN · 3 │
|
||||
│ │ N │ ┌─┐ │
|
||||
│ 12.6° │ 12 │ │M│ Daheim 21.5° │
|
||||
│ │ km/h │ └─┘ │
|
||||
│ MIN MAX F │ Bö 24 │ ▰▰▱▱▱▱▱▱ CO₂ 620 ppm ▮ 78% │
|
||||
│ 13° 21° 67% │ ─────── │ │
|
||||
│ DRUCK 1014▼ │ REGEN │ ┌─┐ │
|
||||
│ │ 0.0 │ │2│ Küche 23.5° │
|
||||
│ 12H VERLAUF │ mm/h │ └─┘ │
|
||||
│ ╱╲ │ │ ▰▰▰▰▱▱▱▱ CO₂ 980 ppm ▮ 88% │
|
||||
│ ╱ ╲ │ HEUTE │ │
|
||||
│ ╱ ╲── │ 6.2 mm │ ┌─┐ │
|
||||
│ 22°/10° jetzt│ ▮ 82% │ │3│ Schlafen 20.8° │
|
||||
│ │ │ └─┘ │
|
||||
│ │ │ ▰▰▰▰▰▱▱ CO₂ 1450 ppm ▮ 41% │
|
||||
├──────────────┴──────────┴─────────────────────────────────────────┤
|
||||
│ VORHERSAGE │
|
||||
│ MO ▮ 0.0 mm ☀ 9° 19° │
|
||||
│ DI ▮ 2.4 mm ☁ 11° 21° │
|
||||
│ MI ▮ 8.1 mm ☁ 8° 17° │
|
||||
└──────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Spalten:**
|
||||
- **Aussen (28%)** — Grosse Aussentemperatur + 4 Stats (MIN/MAX/FEUCHTE/DRUCK) +
|
||||
12h-Verlaufs-Chart (grüne Linie, 2 Y-Ticks min/max)
|
||||
- **Wind/Regen (16%)** — beide gestapelt, Wind oben mit Compass und Bö,
|
||||
Regen unten mit HEUTE-Menge und 1h/24h-Bars; jeder Block hat seine Batterie unten rechts
|
||||
- **Indoor (36%)** — pro Sensor eine Zeile: rote Tag-Box (M/2/3) | Name | grosser
|
||||
Temp-Wert (22pt, in Temperatur-Farbe) | CO₂-Bar (gelb/rot je nach ppm) | CO₂-Wert + Batterie
|
||||
- **Vorhersage (20%)** — pro Tag: Tag-Name + Regentropfen-Icon + Regenmenge in mm +
|
||||
Wetter-Icon (WMO), darunter riesige Min (blau) / Max (orange)
|
||||
|
||||
**Wichtige Design-Regeln:**
|
||||
- 7 ACeP-Farben nur (kein Grau, keine Verläufe, kein Anti-Aliasing)
|
||||
- Wichtige Werte (Temps, Regen) dominieren visuell
|
||||
- Batterie-Icons gehen in den Bottom-Right ihrer Sektion
|
||||
- Indoor-Sensoren haben rote Tag-Box (NICHT schwarz)
|
||||
- MIN/MAX kommen aus echter 12h-History (nicht estimated)
|
||||
- Forecast-Daten dynamisch via `datetime.now() + timedelta`
|
||||
|
||||
Das Plugin priorisiert bei der Layout-Wahl **wide/tall** vor `small`,
|
||||
damit 4×1- und 1×4-Slots nicht in die Mini-Ansicht fallen.
|
||||
@@ -115,20 +162,27 @@ damit 4×1- und 1×4-Slots nicht in die Mini-Ansicht fallen.
|
||||
|---|---|---|---|
|
||||
| `client_id` | secret | — | Netatmo App Client-ID |
|
||||
| `client_secret` | secret | — | Netatmo App Client-Secret |
|
||||
| `username` | secret | — | Netatmo Login (E-Mail) |
|
||||
| `password` | secret | — | Netatmo Passwort (nur RAM) |
|
||||
| `refresh_token` | secret | — | OAuth2 Refresh-Token (nur RAM, wird on-demand erneuert) |
|
||||
| `station_filter` | string | `""` | Substring-Filter auf Stations-/Modulname |
|
||||
| `show_indoor` | bool | `true` | Hauptmodul + zusätzliche Indoor-Sensoren anzeigen |
|
||||
| `show_outdoor` | bool | `true` | NAModule1 (Außen) anzeigen |
|
||||
| `show_wind` | bool | `true` | NAModule2 (Wind) anzeigen |
|
||||
| `show_rain` | bool | `true` | NAModule3 (Regen) anzeigen |
|
||||
| `show_compass` | bool | `true` | Windrose in der Wind-Card zeichnen |
|
||||
| `show_secondary` | bool | `true` | Min/Max + letzte Aktualisierung |
|
||||
| `show_indoor` | bool | `true` | Hauptmodul + zusätzliche Indoor-Sensoren anzeigen |
|
||||
| `show_forecast` | bool | `true` | Open-Meteo 3-Tage-Vorhersage anzeigen |
|
||||
| `co2_thresholds` | string | `ok@600,warn@1000,alert@1500` | CO₂-Bar Schwellen (ppm) |
|
||||
| `bar_gradient` | bool | `true` | Verlaufsmodus der Bar |
|
||||
| `temp_unit` | select | `C` | `C` oder `F` |
|
||||
| `wind_unit` | select | `kmh` | `kmh` oder `ms` |
|
||||
|
||||
### Auth-Flow (aktualisiert)
|
||||
|
||||
Das Plugin verwendet **OAuth2 mit Refresh-Token-Grant** (kein Passwort-Grant mehr).
|
||||
Beim ersten Setup musst du einmalig einen Refresh-Token holen — das geht z.B. mit
|
||||
dem Netatmo-Developer-Portal oder dem offiziellen OAuth-Tool. Danach wird der
|
||||
Token automatisch im RAM gecacht und alle 3h erneuert.
|
||||
|
||||
Falls du noch alte `username`/`password`-Config-Felder in deiner `config.json` hast:
|
||||
diese werden ignoriert. Setze statt dessen `refresh_token`.
|
||||
|
||||
### CO₂-Schwellen anpassen
|
||||
|
||||
`co2_thresholds` ist ein String im Format `farbe@ppm_in_ppm`.
|
||||
@@ -181,21 +235,43 @@ wird ein neuer Token geholt.
|
||||
|
||||
| Aspekt | Wert |
|
||||
|---|---|
|
||||
| API-Version | Netatmo Connect OAuth2 |
|
||||
| API-Version | Netatmo Connect OAuth2 (Refresh-Token-Grant) |
|
||||
| Endpoints | `POST /oauth2/token`, `GET /api/getstationsdata` |
|
||||
| Forecast-Quelle | Open-Meteo (`/v1/forecast`) — kein API-Key |
|
||||
| Token-Lebensdauer | 10800s (3h), Refresh on the fly |
|
||||
| Cache | In-Memory, kein Disk-IO pro Render |
|
||||
| Datenquelle | Netatmo Cloud (Update alle ~10 Min) |
|
||||
| Datenquelle Netatmo | Netatmo Cloud (Update alle ~10 Min) |
|
||||
| Modul-Typen | NAMain, NAModule1..4 |
|
||||
| `reachable`-Feld | „true" wenn das Modul in den letzten 4h gesehen wurde |
|
||||
|
||||
### Wichtige interne Methoden
|
||||
|
||||
- `_render_compact(x, y, w, h, ...)` — 1×1-Mini-Ansicht
|
||||
- `_render_compact_2x2(x, y, w, h, ...)` — 2×2-Ansicht
|
||||
- `_render_full_4x4(x, y, w, h, ...)` — V1-Status-Update für 4×4
|
||||
- `_get_12h_history(...)` — 12h-Temperaturverlauf (Quelle: Netatmo `getmeasure` API)
|
||||
- `_get_forecast(lat, lon, days=3)` — Open-Meteo 3-Tage-Vorhersage
|
||||
|
||||
### Shared Helper (aus `plugins/base.py` + `palette.py`)
|
||||
|
||||
Das Plugin nutzt konsequent die zentralen Render-Helper:
|
||||
- `draw_battery()`, `batt_color()` — Batterie-Icon mit 3-stufiger Farbe
|
||||
- `draw_compass()` — Windrose (mit N/O/S/W-Beschriftung optional)
|
||||
- `draw_weather_icon()`, `wmo_to_icon()` — 7 Wetter-Zustände (sun/cloud/rain/storm/snow/fog/partly)
|
||||
- `draw_line_chart()` — 12h-Verlaufs-Chart mit Y-Grid
|
||||
- `draw_mini_bar()` — 1h/24h-Regen-Bars
|
||||
- `de_weekday_long/short`, `de_date`, `de_time` — deutsche Datums-/Zeit-Formatter (locale-frei)
|
||||
- `temp_color()`, `co2_color()` — semantische Farben nach Schwellen
|
||||
|
||||
### Was wird pro Refresh gemacht?
|
||||
|
||||
1. Prüfe Token-Cache (RAM). Wenn abgelaufen oder fehlend → hole neuen
|
||||
Token via Password-Grant (initial) oder Refresh-Grant.
|
||||
Token via Refresh-Grant.
|
||||
2. `GET /api/getstationsdata?get_favorites=false` mit Bearer-Token.
|
||||
3. Parse Antwort, filtere nach `station_filter` und sichtbaren Modulen.
|
||||
4. Rendere je nach Slot-Größe (`small` / `wide` / `tall` / `standard`).
|
||||
3. Hole 12h-History (`getmeasure`) für MIN/MAX-Berechnung.
|
||||
4. Hole 3-Tage-Forecast von Open-Meteo.
|
||||
5. Parse Antwort, filtere nach `station_filter` und sichtbaren Modulen.
|
||||
6. Rendere je nach Slot-Größe (`compact` / `compact_2x2` / `full_4x4`).
|
||||
|
||||
Bei 401 wird der Token-Cache geleert und **einmal** neu authentifiziert.
|
||||
Wenn das auch fehlschlägt → roter Error-Banner mit der genauen HTTP-Meldung.
|
||||
Reference in New Issue
Block a user