diff --git a/README.md b/README.md index d9a8f30..dcd5402 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ flowchart LR METEO -->|HTTPS| RAIN SOLARLOG -->|zisterne| MGR - MGR -->|"EnergyFlow · skoda"| SOLARLOG + MGR -->|"EnergyFlow · skoda
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). diff --git a/autoActions/README.md b/autoActions/README.md index 33c2936..234434c 100644 --- a/autoActions/README.md +++ b/autoActions/README.md @@ -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. diff --git a/autoActions/autoaction_runner.py b/autoActions/autoaction_runner.py index 95a8008..49c256a 100644 --- a/autoActions/autoaction_runner.py +++ b/autoActions/autoaction_runner.py @@ -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" diff --git a/config.ini.example b/config.ini.example index 007df30..d7dcc3c 100644 --- a/config.ini.example +++ b/config.ini.example @@ -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 ; ===========================================================================