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:
@@ -44,7 +44,7 @@ flowchart LR
|
|||||||
METEO -->|HTTPS| RAIN
|
METEO -->|HTTPS| RAIN
|
||||||
|
|
||||||
SOLARLOG -->|zisterne| MGR
|
SOLARLOG -->|zisterne| MGR
|
||||||
MGR -->|"EnergyFlow · skoda"| SOLARLOG
|
MGR -->|"EnergyFlow · skoda<br/>skoda_ladepunkte"| SOLARLOG
|
||||||
|
|
||||||
MGR -->|"solarManager/#"| BROKER
|
MGR -->|"solarManager/#"| BROKER
|
||||||
WPB -->|"wattpilot/#"| 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` |
|
| `homeassistant/#` | die Geräte selbst | `device_discovery.py` |
|
||||||
| **`solarLog`** | `solarManager.py` | `ajax/*.php`, `gatherWaterData` |
|
| **`solarLog`** | `solarManager.py` | `ajax/*.php`, `gatherWaterData` |
|
||||||
| **`homeMesh`** | `device_discovery.py`, Runner, Web-Editor | Runner, `ajax/*.php` |
|
| **`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
|
## 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.
|
im Kopf, wie dasselbe im Dashboard von Hand geht.
|
||||||
|
|
||||||
Damit ist die Weckzeit dort einstellbar, wo alles andere auch eingestellt
|
Damit ist die Weckzeit dort einstellbar, wo alles andere auch eingestellt
|
||||||
wird — unter „Automatismen", Etage EG. Die Datenbank `alarm` liest niemand
|
wird — unter „Automatismen", Etage EG. Die Datenbank `alarm` ist gelöscht,
|
||||||
mehr; sie steht noch da, mitsamt dem Abschnitt `[alarm]` in der `config.ini`,
|
und `config.ini.example` hat keinen Abschnitt `[alarm]` mehr. Ein
|
||||||
und kann weg, sobald der erste Morgen ohne `wecker.py` durch ist.
|
übriggebliebener `[alarm]` in einer echten `config.ini` stört nicht, liest
|
||||||
|
aber auch niemand.
|
||||||
|
|
||||||
## Konfiguration
|
## Konfiguration
|
||||||
|
|
||||||
Zugangsdaten und Standort stehen in `config.ini` (Vorlage:
|
Zugangsdaten und Standort stehen in `config.ini` (Vorlage:
|
||||||
`config.ini.example`), gelesen über `konfig.py`; der Runner hat seine eigene
|
`config.ini.example`), gelesen über `konfig.py`; der Runner hat seine eigene
|
||||||
unter `autoActions/`. Beide sind per `.gitignore` ausgenommen — nichts davon
|
unter `autoActions/`. Die Zugangsschlüssel der MyŠkoda-API stehen getrennt in
|
||||||
gehört in den Quelltext.
|
`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
|
Mehr zum Runner selbst, zum Aufbau einer Automatik und zu den Transporten
|
||||||
steht in [autoActions/README.md](autoActions/README.md).
|
steht in [autoActions/README.md](autoActions/README.md).
|
||||||
|
|||||||
+19
-11
@@ -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
|
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
|
übersprang. Jetzt gilt die Bedingung fünf Minuten lang (einstellbar), die
|
||||||
Flanke sorgt weiterhin für genau einen Lauf, und ein Neustart mitten im
|
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`
|
Fenster holt den Lauf nach.
|
||||||
folgen derselben Überlegung.
|
|
||||||
|
|
||||||
Beim Sonnenauf- und -untergang ist der Wert ein Versatz, und der kann davor
|
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
|
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
|
## 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,
|
Drei Dinge entscheiden das: die Wochentagsmaske (`weekdays`, ein Bit je Tag,
|
||||||
Montag ist Bit 0), und Ferien und Feiertage aus `calendar_days`.
|
Montag ist Bit 0), und Ferien und Feiertage aus `calendar_days`.
|
||||||
|
|
||||||
@@ -223,8 +223,9 @@ der Zeitpunkt der letzten Auslösung:
|
|||||||
|
|
||||||
```
|
```
|
||||||
Wecker Magdalena um 05:50 → Licht auf Wakeup
|
Wecker Magdalena um 05:50 → Licht auf Wakeup
|
||||||
Rollladen Magdalena Wecker Magdalena + 00:10
|
Wecker Magdalena Rollos Wecker Magdalena ab + 00:10
|
||||||
UND Sonnenaufgang ab + 00:00 → Rollladen auf
|
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
|
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
|
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 < 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 < 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 fetch_calendar.py # Feiertage und Ferien holen
|
||||||
python3 autoaction_runner.py --once --dry-run --verbose # Probelauf
|
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.
|
wählen.
|
||||||
|
|
||||||
`rahmen_erweitern.sql` gehört zum Rahmen: es beschriftet `on_vacation` und
|
`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
|
`on_holiday` mit ihren drei Bedeutungen und legt `once_per_day` an.
|
||||||
Skripte sind idempotent — ein zweiter Lauf schadet nicht.
|
`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
|
`--dry-run` schaltet nichts, protokolliert aber jedes Kommando, das geschickt
|
||||||
würde. `--once` macht einen einzigen Durchlauf.
|
würde. `--once` macht einen einzigen Durchlauf.
|
||||||
@@ -412,13 +415,15 @@ nicht im Web-Verzeichnis:
|
|||||||
```
|
```
|
||||||
/volume1/homes/wagner/SolarManager/
|
/volume1/homes/wagner/SolarManager/
|
||||||
├── solarManager.py
|
├── solarManager.py
|
||||||
├── startSolarServer.sh startet beide, siehe unten
|
├── gatherRainData.py
|
||||||
|
├── startSolarServer.sh startet alle drei, siehe unten
|
||||||
└── autoActions/
|
└── autoActions/
|
||||||
├── autoaction_runner.py
|
├── autoaction_runner.py
|
||||||
├── transports.py
|
├── transports.py
|
||||||
├── fetch_calendar.py
|
├── fetch_calendar.py
|
||||||
├── automatik_ausloeser.sql einmalig, siehe Einrichten
|
├── automatik_ausloeser.sql einmalig, siehe Einrichten
|
||||||
├── rahmen_erweitern.sql einmalig, siehe Einrichten
|
├── rahmen_erweitern.sql einmalig, siehe Einrichten
|
||||||
|
├── vorabend.sql einmalig, siehe Einrichten
|
||||||
└── config.ini Zugangsdaten, nicht im Git
|
└── 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
|
sobald im Browser etwas gespeichert wurde; ein Neustart nach jeder Änderung ist
|
||||||
nicht nötig.
|
nicht nötig.
|
||||||
|
|
||||||
`startSolarServer.sh` startet `solarManager.py` und den Runner gemeinsam und
|
`startSolarServer.sh` startet `solarManager.py`, den Runner und
|
||||||
beendet vorher, was schon läuft. Aufgerufen wird es beim Booten (auf der
|
`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
|
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
|
Zwei Instanzen dürfen nie gleichzeitig laufen — sie würden jedes Kommando
|
||||||
doppelt schicken und sich gegenseitig vom MQTT-Broker werfen, weil beide
|
doppelt schicken und sich gegenseitig vom MQTT-Broker werfen, weil beide
|
||||||
dieselbe Client-Kennung benutzen. Genau davor schützt das Beenden am Anfang.
|
dieselbe Client-Kennung benutzen. Genau davor schützt das Beenden am Anfang.
|
||||||
|
|||||||
@@ -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
|
Flanke. Das Nachholfenster bei "um" ist der Ersatz fuer die frueher
|
||||||
verlangte Punktgenauigkeit: ein Neustart, ein haengendes Geraet oder ein
|
verlangte Punktgenauigkeit: ein Neustart, ein haengendes Geraet oder ein
|
||||||
langsamer Durchlauf kosten die Automatik nicht mehr den ganzen Tag, und weil
|
langsamer Durchlauf kosten die Automatik nicht mehr den ganzen Tag, und weil
|
||||||
nur die Flanke zaehlt, laeuft sie trotzdem hoechstens einmal. Dieselbe
|
nur die Flanke zaehlt, laeuft sie trotzdem hoechstens einmal.
|
||||||
Ueberlegung steht hinter den breiten Zeitfenstern in auto_watering.py.
|
|
||||||
|
|
||||||
Beim Sonnenauf- und -untergang traegt der Operator zusaetzlich das
|
Beim Sonnenauf- und -untergang traegt der Operator zusaetzlich das
|
||||||
Vorzeichen des Versatzes: "+ 00:30" eine halbe Stunde danach, ">=- 00:30"
|
Vorzeichen des Versatzes: "+ 00:30" eine halbe Stunde danach, ">=- 00:30"
|
||||||
|
|||||||
+1
-11
@@ -11,7 +11,7 @@
|
|||||||
; Messwerte (solarLog)
|
; Messwerte (solarLog)
|
||||||
; ===========================================================================
|
; ===========================================================================
|
||||||
; Benutzt von solarManager.py, gatherWaterData.py, gatherSkodaData.py,
|
; Benutzt von solarManager.py, gatherWaterData.py, gatherSkodaData.py,
|
||||||
; skoda_testdaten.py und zeit.py.
|
; skoda_testdaten.py und skoda_ladepunkte_nachtragen.py.
|
||||||
[database]
|
[database]
|
||||||
host = localhost
|
host = localhost
|
||||||
port = 3310
|
port = 3310
|
||||||
@@ -19,16 +19,6 @@ user = solarLog
|
|||||||
password =
|
password =
|
||||||
database = solarLog
|
database = solarLog
|
||||||
|
|
||||||
; ===========================================================================
|
|
||||||
; Wecker (wecker.py)
|
|
||||||
; ===========================================================================
|
|
||||||
[alarm]
|
|
||||||
host = localhost
|
|
||||||
port = 3310
|
|
||||||
user = alarm
|
|
||||||
password =
|
|
||||||
database = alarm
|
|
||||||
|
|
||||||
; ===========================================================================
|
; ===========================================================================
|
||||||
; Wallbox
|
; Wallbox
|
||||||
; ===========================================================================
|
; ===========================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user