Doku auf den Stand gebracht: Vorabend, skoda.conf, Wecker-Reste

- autoActions/README: Rahmen gilt heute oder am Vorabend fuer morgen,
  vorabend.sql beim Einrichten, startSolarServer.sh startet drei Prozesse,
  Beispiel der Verkettung wie die echten Automatiken, Neustart ueber SSH
- README: skoda_ladepunkte und skoda.conf, Werkzeuge-Tabelle, Datenbank
  alarm ist geloescht
- config.ini.example: [alarm] und zeit.py entfernt, die gibt es nicht mehr
- Runner-Kopfkommentar verweist nicht mehr auf auto_watering.py

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 09:53:08 +02:00
co-authored by Claude Opus 5
parent 8340e8356e
commit 46ef245f7c
4 changed files with 40 additions and 31 deletions
+18 -6
View File
@@ -44,7 +44,7 @@ flowchart LR
METEO -->|HTTPS| RAIN
SOLARLOG -->|zisterne| MGR
MGR -->|"EnergyFlow · skoda"| SOLARLOG
MGR -->|"EnergyFlow · skoda<br/>skoda_ladepunkte"| SOLARLOG
MGR -->|"solarManager/#"| BROKER
WPB -->|"wattpilot/#"| BROKER
@@ -148,6 +148,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` |
| **`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` |
## Was wann startet
@@ -197,16 +198,27 @@ nicht in den Ferien, nicht an Feiertagen, WLED-Preset 5 („Wakeup") auf
im Kopf, wie dasselbe im Dashboard von Hand geht.
Damit ist die Weckzeit dort einstellbar, wo alles andere auch eingestellt
wird — unter „Automatismen", Etage EG. Die Datenbank `alarm` liest niemand
mehr; sie steht noch da, mitsamt dem Abschnitt `[alarm]` in der `config.ini`,
und kann weg, sobald der erste Morgen ohne `wecker.py` durch ist.
wird — unter „Automatismen", Etage EG. Die Datenbank `alarm` ist gelöscht,
und `config.ini.example` hat keinen Abschnitt `[alarm]` mehr. Ein
übriggebliebener `[alarm]` in einer echten `config.ini` stört nicht, liest
aber auch niemand.
## Konfiguration
Zugangsdaten und Standort stehen in `config.ini` (Vorlage:
`config.ini.example`), gelesen über `konfig.py`; der Runner hat seine eigene
unter `autoActions/`. Beide sind per `.gitignore` ausgenommen — nichts davon
gehört in den Quelltext.
unter `autoActions/`. Die Zugangsschlüssel der MyŠkoda-API stehen getrennt in
`skoda.conf` (Vorlage: `skoda.conf.example`), weil auch die Weboberfläche sie
liest und im Reiter „Fahrzeug" neue einträgt. Alle drei sind per
`.gitignore` ausgenommen — nichts davon gehört in den Quelltext.
## Werkzeuge
| Skript | wofür |
|---|---|
| `skoda_test.py` | prüft Zerlegung und Kontingent-Buchführung von `gatherSkodaData.py` ohne Fahrzeug und ohne Netz |
| `skoda_ladepunkte_nachtragen.py` | holt den Wallbox-Verlauf vergangener Ladungen aus `EnergyFlow` nach `skoda_ladepunkte`, solange er dort noch nicht ausgedünnt ist (`--probe` schreibt nichts) |
| `wecker_zu_automatik.sql` | hat den alten Wecker als Automatik angelegt; nur noch zum Nachlesen |
Mehr zum Runner selbst, zum Aufbau einer Automatik und zu den Transporten
steht in [autoActions/README.md](autoActions/README.md).
+20 -12
View File
@@ -93,8 +93,7 @@ kostete jeder Aussetzer die Automatik für den ganzen Tag — und Aussetzer gab
es reichlich, weil die Uhr am Geräte-Poll hing und jede dritte Minute
übersprang. Jetzt gilt die Bedingung fünf Minuten lang (einstellbar), die
Flanke sorgt weiterhin für genau einen Lauf, und ein Neustart mitten im
Fenster holt den Lauf nach. Die breiten Zeitfenster in `auto_watering.py`
folgen derselben Überlegung.
Fenster holt den Lauf nach.
Beim Sonnenauf- und -untergang ist der Wert ein Versatz, und der kann davor
oder danach liegen — deshalb dieselben drei Fälle mal zwei: `+ 00:30` eine
@@ -116,7 +115,8 @@ das Fenster zugeht und in diesem Fenster noch nichts passiert ist.
## Der Rahmen
Vor jeder Auswertung fragt `tag_passt()`, ob der heutige Tag überhaupt zählt.
Vor jeder Auswertung fragt `tag_passt()`, ob der Tag überhaupt zählt — heute,
oder bei einer Vorabend-Regel morgen (siehe [Am Vorabend](#am-vorabend)).
Drei Dinge entscheiden das: die Wochentagsmaske (`weekdays`, ein Bit je Tag,
Montag ist Bit 0), und Ferien und Feiertage aus `calendar_days`.
@@ -222,9 +222,10 @@ vorhandenen „Zeitpunkt". Jede Automatik ist dort ein Messwert, ihr Wert ist
der Zeitpunkt der letzten Auslösung:
```
Wecker Magdalena um 05:50 → Licht auf Wakeup
Rollladen Magdalena Wecker Magdalena + 00:10
UND Sonnenaufgang ab + 00:00 → Rollladen auf
Wecker Magdalena um 05:50 → Licht auf Wakeup
Wecker Magdalena Rollos Wecker Magdalena ab + 00:10
UND Sonne Ost > 200 Lux → Rollläden auf
Schlafzimmer morgens Wecker Magdalena Rollos ab + 00:00 → Rollladen auf
```
Der Editor braucht dafür keine Zeile Änderung. Er listet Geräte und deren
@@ -387,6 +388,7 @@ Parameter dort keine eigene URL — ihr Name *ist* der Platzhalter.
cp config.ini.example config.ini # ausfüllen: Datenbank, MQTT, Tahoma
mysql -h 127.0.0.1 -P 3310 -u homeMesh -p homeMesh < automatik_ausloeser.sql
mysql -h 127.0.0.1 -P 3310 -u homeMesh -p homeMesh < rahmen_erweitern.sql
mysql -h 127.0.0.1 -P 3310 -u homeMesh -p homeMesh < vorabend.sql
python3 fetch_calendar.py # Feiertage und Ferien holen
python3 autoaction_runner.py --once --dry-run --verbose # Probelauf
```
@@ -398,8 +400,9 @@ Messwerte darunter legt der Runner selbst an. Ohne das Skript läuft alles
wählen.
`rahmen_erweitern.sql` gehört zum Rahmen: es beschriftet `on_vacation` und
`on_holiday` mit ihren drei Bedeutungen und legt `once_per_day` an. Beide
Skripte sind idempotent — ein zweiter Lauf schadet nicht.
`on_holiday` mit ihren drei Bedeutungen und legt `once_per_day` an.
`vorabend.sql` legt `next_day` an. Alle drei Skripte sind idempotent — ein
zweiter Lauf schadet nicht.
`--dry-run` schaltet nichts, protokolliert aber jedes Kommando, das geschickt
würde. `--once` macht einen einzigen Durchlauf.
@@ -412,13 +415,15 @@ nicht im Web-Verzeichnis:
```
/volume1/homes/wagner/SolarManager/
├── solarManager.py
├── startSolarServer.sh startet beide, siehe unten
├── gatherRainData.py
├── startSolarServer.sh startet alle drei, siehe unten
└── autoActions/
├── autoaction_runner.py
├── transports.py
├── fetch_calendar.py
├── automatik_ausloeser.sql einmalig, siehe Einrichten
├── rahmen_erweitern.sql einmalig, siehe Einrichten
├── vorabend.sql einmalig, siehe Einrichten
└── config.ini Zugangsdaten, nicht im Git
```
@@ -427,10 +432,13 @@ Das Web-UI kennt diesen Pfad nicht — Browser und Runner reden ausschließlich
sobald im Browser etwas gespeichert wurde; ein Neustart nach jeder Änderung ist
nicht nötig.
`startSolarServer.sh` startet `solarManager.py` und den Runner gemeinsam und
beendet vorher, was schon läuft. Aufgerufen wird es beim Booten (auf der
`startSolarServer.sh` startet `solarManager.py`, den Runner und
`gatherRainData.py` gemeinsam und beendet vorher, was schon läuft. Aufgerufen wird es beim Booten (auf der
Synology über den Aufgabenplaner, Ereignis „Hochfahren", als root); dasselbe
Skript von Hand aufzurufen ist der normale Weg, den Runner neu zu starten.
Skript von Hand aufzurufen ist der normale Weg, den Runner neu zu starten
als `wagner` genügt, ohne sudo. Über SSH abgekoppelt, damit die Prozesse das
Abmelden überleben:
`setsid nohup bash startSolarServer.sh > /tmp/restart_solar.out 2>&1 < /dev/null &`.
Zwei Instanzen dürfen nie gleichzeitig laufen — sie würden jedes Kommando
doppelt schicken und sich gegenseitig vom MQTT-Broker werfen, weil beide
dieselbe Client-Kennung benutzen. Genau davor schützt das Beenden am Anfang.
+1 -2
View File
@@ -41,8 +41,7 @@ dahin. Ausgeloest wird in allen drei Faellen nur einmal, eben wegen der
Flanke. Das Nachholfenster bei "um" ist der Ersatz fuer die frueher
verlangte Punktgenauigkeit: ein Neustart, ein haengendes Geraet oder ein
langsamer Durchlauf kosten die Automatik nicht mehr den ganzen Tag, und weil
nur die Flanke zaehlt, laeuft sie trotzdem hoechstens einmal. Dieselbe
Ueberlegung steht hinter den breiten Zeitfenstern in auto_watering.py.
nur die Flanke zaehlt, laeuft sie trotzdem hoechstens einmal.
Beim Sonnenauf- und -untergang traegt der Operator zusaetzlich das
Vorzeichen des Versatzes: "+ 00:30" eine halbe Stunde danach, ">=- 00:30"
+1 -11
View File
@@ -11,7 +11,7 @@
; Messwerte (solarLog)
; ===========================================================================
; Benutzt von solarManager.py, gatherWaterData.py, gatherSkodaData.py,
; skoda_testdaten.py und zeit.py.
; skoda_testdaten.py und skoda_ladepunkte_nachtragen.py.
[database]
host = localhost
port = 3310
@@ -19,16 +19,6 @@ user = solarLog
password =
database = solarLog
; ===========================================================================
; Wecker (wecker.py)
; ===========================================================================
[alarm]
host = localhost
port = 3310
user = alarm
password =
database = alarm
; ===========================================================================
; Wallbox
; ===========================================================================