Erster Stand der Hintergrundprozesse, die auf der Synology unter /volume1/homes/wagner/SolarManager laufen: der Manager selbst, die Sammler je Geraet, die MQTT-Bruecke, der Wecker und - neu hinzugezogen - der AutoAction-Runner, der als Hintergrundprozess hierher gehoert und nicht ins Web-Verzeichnis. Zugangsdaten stehen nicht mehr im Quelltext, sondern in config.ini, die nicht mit eingecheckt wird. Vorlage ist config.ini.example, gelesen wird sie von konfig.py. Betroffen waren solarManager.py (Datenbank und Wattpilot), zeit.py, gatherWaterData.py, wecker.py und skoda_testdaten.py, das sich das Passwort bisher aus dem Quelltext eines anderen Moduls herausgesucht hat. Die Kia-Anbindung ist mit dem Fahrzeug entfallen: kiaTest.py, gatherCarData.py und hyundai_kia_connect_api sind nicht mehr dabei, ebenso gatherInverterData.py, auf das nur noch eine auskommentierte Zeile zeigte. Die mitgelieferten Bibliotheken bleiben im Repository - die NAS hat kein pip, sie muessen neben den Skripten liegen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
"""Zugangsdaten aus config.ini.
|
|
|
|
Passwoerter standen frueher im Quelltext - in solarManager.py, zeit.py,
|
|
gatherWaterData.py und wecker.py jeweils noch einmal. Beim Anlegen des
|
|
Repositorys waeren sie damit dauerhaft in der Historie gelandet, und genau das
|
|
musste beim Web-Repository schon einmal muehsam rueckgaengig gemacht werden.
|
|
|
|
Jetzt steht alles in config.ini, die nicht mit eingecheckt wird. Was dort
|
|
hineingehoert, zeigt config.ini.example - beim Aufsetzen kopieren und
|
|
ausfuellen. Dasselbe Verfahren benutzt der AutoAction-Runner unter
|
|
autoActions/ schon laenger.
|
|
|
|
import konfig
|
|
zug = konfig.datenbank() # dict fuer mysql.connector.connect
|
|
with connect(**zug) as c:
|
|
...
|
|
|
|
pw = konfig.wert("wattpilot", "password")
|
|
"""
|
|
import configparser
|
|
import os
|
|
|
|
_PFAD = os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.ini")
|
|
_konf = None
|
|
|
|
|
|
def _lesen():
|
|
"""Die Datei einmal einlesen und behalten."""
|
|
global _konf
|
|
if _konf is None:
|
|
_konf = configparser.ConfigParser(interpolation=None) # Prozentzeichen im Passwort
|
|
if not _konf.read(_PFAD, encoding="utf-8"):
|
|
raise SystemExit(
|
|
"%s fehlt - config.ini.example kopieren und ausfuellen." % _PFAD)
|
|
return _konf
|
|
|
|
|
|
def wert(abschnitt, schluessel, vorgabe=None):
|
|
"""Ein einzelner Eintrag. Ohne Vorgabe ist ein fehlender Eintrag ein Fehler.
|
|
|
|
Lieber hier laut abbrechen als spaeter mit einem leeren Passwort an der
|
|
Datenbank scheitern - der Grund waere dann nicht mehr zu sehen.
|
|
"""
|
|
konf = _lesen()
|
|
if konf.has_option(abschnitt, schluessel):
|
|
return konf.get(abschnitt, schluessel)
|
|
if vorgabe is not None:
|
|
return vorgabe
|
|
raise SystemExit("config.ini: [%s] %s fehlt." % (abschnitt, schluessel))
|
|
|
|
|
|
def datenbank(abschnitt="database"):
|
|
"""Verbindungsdaten als dict, direkt fuer mysql.connector.connect geeignet.
|
|
|
|
Der Port bleibt Text, weil connect() beides nimmt und der Aufrufer ihn
|
|
frueher auch als Text stehen hatte.
|
|
"""
|
|
return {"host": wert(abschnitt, "host", "localhost"),
|
|
"port": wert(abschnitt, "port", "3310"),
|
|
"user": wert(abschnitt, "user"),
|
|
"password": wert(abschnitt, "password"),
|
|
"database": wert(abschnitt, "database")}
|