Files
adminandClaude Opus 5 79843aa2ae SolarManager unter Versionsverwaltung
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>
2026-09-02 20:46:59 +02:00

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")}