diff --git a/README.md b/README.md
index 67f9cc9..7384cca 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,7 @@ flowchart LR
MGR["solarManager.py
gatherModbusData · gatherOpenDTUData
gatherDTUBIData · gatherShellyEM3Data EG/UG
gatherHeaterData · gatherSkodaData
gatherBYDData · gatherWaterData
charger_goE"]
WPB["wattpilot_bruecke.py"]
WSB["wsMQTTbridge.py"]
+ FCS["gatherForecastData.py
Open-Meteo"]
RAIN["gatherRainData.py"]
BROKER{{"MQTT-Broker"}}
@@ -44,9 +45,11 @@ flowchart LR
WPILOT -->|WebSocket| WPB
STATION -->|WebSocket| WSB
METEO -->|HTTPS| RAIN
+ METEO -->|HTTPS| FCS
SOLARLOG -->|zisterne| MGR
MGR -->|"EnergyFlow · skoda
skoda_ladepunkte · byd
byd_zellen"| SOLARLOG
+ FCS -->|"weatherHours · weatherDays
weatherTilted · weatherForecastLog"| SOLARLOG
MGR -->|"solarManager/#"| BROKER
WPB -->|"wattpilot/#"| BROKER
@@ -60,11 +63,11 @@ flowchart LR
classDef skript fill:#fff6e5,stroke:#d0a548
classDef speicher fill:#eaf5ee,stroke:#6fa981
class WR,EM3,HEIZ,BYD,GOE,WPILOT,SKODA,STATION,METEO,VENTILE,HAUSGER quelle
- class MGR,WPB,WSB,RAIN skript
+ class MGR,WPB,WSB,RAIN,FCS skript
class BROKER,SOLARLOG speicher
```
-Vier Prozesse holen aktiv etwas ab. Alles andere meldet sich von selbst: die
+Fünf Prozesse holen aktiv etwas ab. Alles andere meldet sich von selbst: die
Ventilsteuerungen, die Wallbox und jedes Gerät, das
Home-Assistant-Discovery spricht, schreiben ohne Umweg auf den Broker. Für
deren Messwerte ist also **kein Skript** zuständig — wer sie sucht, sucht am
@@ -85,6 +88,19 @@ kurz danach — der Sammler klopft deshalb jede Sekunde an und bekommt so rund
alle 100 Sekunden einen vollständigen Satz. Einzelheiten im Kopf des Moduls
und, ausführlich, im Web-Repository unter `doku/byd.md`.
+`gatherForecastData` holt alle zwanzig Minuten die Wettervorhersage von
+Open-Meteo und schreibt sie nach `solarLog` (`weatherHours`, `weatherDays`,
+`weatherForecastLog`, `weatherTilted`) — Grundlage des Meteogramms der
+Weboberfläche. Es ist der einzige Sammler, der nichts nach MQTT
+veröffentlicht: ein Meteogramm liest niemand im Sekundentakt.
+
+**Es löscht nichts.** Die Tabellen sind zugleich ein Archiv — aus der
+Einstrahlung und `EnergyFlow_hourly.pv_kwh` soll später eine eigene
+Ertragsprognose gerechnet werden. `wetterarchiv_nachtragen.py` hat sie
+einmalig aus der ERA5-Schnittstelle von Open-Meteo bis zum 02.04.2022
+zurückgefüllt. Einzelheiten stehen im Web-Repository unter
+`doku/meteogramm.md`.
+
Die Zisterne fällt aus der Reihe — ihr Stand steht in `solarLog`, und
`gatherWaterData` liest ihn von dort. Die Daten laufen also durch die
Datenbank hindurch von einem Prozess zum nächsten.
@@ -160,6 +176,7 @@ von Hand, wenn sich am Bestand etwas geändert hat.
| `homeassistant/#` | die Geräte selbst | `device_discovery.py` |
| **`solarLog`** | `solarManager.py` | `ajax/*.php`, `gatherWaterData` |
| `byd`, `byd_zellen` (in `solarLog`) | `gatherBYDData.py`, alle 5 bzw. 15 Minuten | Web-Repo (`solarLog_byd.sql`) |
+| `weatherHours`, `weatherDays`, `weatherTilted`, `weatherForecastLog` (in `solarLog`) | `gatherForecastData.py`, alle 20 Minuten; nichts wird geloescht | Web-Repo (`solarLog_weather.sql`) |
| **`homeMesh`** | `device_discovery.py`, Runner, Web-Editor | Runner, `ajax/*.php` |
| `skoda.conf` | Einstellungen → Fahrzeug (`restricted/skodaKeys.php`) oder von Hand | `gatherSkodaData.py`, `ajax/skodaCmd.php` |
@@ -170,6 +187,7 @@ von Hand, wenn sich am Bestand etwas geändert hat.
| `solarManager.py` | `startSolarServer.sh` (Aufgabenplaner, beim Hochfahren) |
| `autoActions/autoaction_runner.py` | dito |
| `gatherRainData.py` | dito |
+| `gatherForecastData.py` | dito |
| `wsMQTTbridge.py` | `startMQTTbridge.sh` |
| `wattpilot_bruecke.py` | `startWattpilotMQTT.sh` |
| `autoActions/fetch_calendar.py` | Cronjob, einmal im Jahr |