Datenbankverbindung vor den Sonnenzeiten pruefen, Logs sparsamer drehen

Die Verbindung zur solarLog-Datenbank steht den ganzen Tag ungenutzt herum
und wird vom Server irgendwann geschlossen; das Lesen der Sonnenzeiten war
dann der erste Zugriff, der ins Leere lief. Ein ping(reconnect=True) davor
holt sie zurueck.

Ausserdem stehen die abgefangenen Fehler jetzt mit %r im Protokoll: bei
manchen Ausnahmen ist str() leer, und dann stand dort eine Warnung ohne
Grund.

logrotate dreht monatlich statt taeglich, dafuer schon ab 10 MB.
This commit is contained in:
2026-09-09 00:06:42 +02:00
parent f643e37676
commit 1e7b1d8b21
2 changed files with 10 additions and 9 deletions
+8 -7
View File
@@ -718,6 +718,7 @@ class Runner:
return self._sonne[1], self._sonne[2] return self._sonne[1], self._sonne[2]
auf, unter = "00:00", "00:00" auf, unter = "00:00", "00:00"
try: try:
self.solar.ping(reconnect=True) # re-establish connection if it dropped
with self.solar.cursor() as c: with self.solar.cursor() as c:
c.execute("SELECT sunrise, sunset FROM daylight WHERE date = %s", (heute,)) c.execute("SELECT sunrise, sunset FROM daylight WHERE date = %s", (heute,))
zeile = c.fetchone() zeile = c.fetchone()
@@ -727,7 +728,7 @@ class Runner:
else: else:
logger.warning("Kein Eintrag in daylight fuer %s", heute) logger.warning("Kein Eintrag in daylight fuer %s", heute)
except Exception as fehler: except Exception as fehler:
logger.warning("Sonnenzeiten nicht lesbar: %s", fehler) logger.warning("Sonnenzeiten nicht lesbar: %r", fehler)
self._sonne = (heute, auf, unter) self._sonne = (heute, auf, unter)
return auf, unter return auf, unter
@@ -752,7 +753,7 @@ class Runner:
if zeile: if zeile:
stand = {"feiertag": bool(zeile["holiday"]), "ferien": bool(zeile["vacation"])} stand = {"feiertag": bool(zeile["holiday"]), "ferien": bool(zeile["vacation"])}
except Exception as fehler: except Exception as fehler:
logger.warning("Kalender nicht lesbar: %s", fehler) logger.warning("Kalender nicht lesbar: %r", fehler)
self._kalender = (heute, stand) self._kalender = (heute, stand)
return stand return stand
@@ -816,7 +817,7 @@ class Runner:
self.geschrieben[state_id] = wert self.geschrieben[state_id] = wert
self.geschrieben_um[state_id] = jetzt self.geschrieben_um[state_id] = jetzt
except Exception as fehler: except Exception as fehler:
logger.warning("current_value nicht schreibbar: %s", fehler) logger.warning("current_value nicht schreibbar: %r", fehler)
# --- Ausfuehren ------------------------------------------------------ # --- Ausfuehren ------------------------------------------------------
@@ -865,7 +866,7 @@ class Runner:
c.execute("""INSERT INTO automation_log (automation_id, result, detail) c.execute("""INSERT INTO automation_log (automation_id, result, detail)
VALUES (%s, %s, %s)""", (automatik["id"], ergebnis, detail)) VALUES (%s, %s, %s)""", (automatik["id"], ergebnis, detail))
except Exception as fehler: except Exception as fehler:
logger.warning("Protokoll nicht schreibbar: %s", fehler) logger.warning("Protokoll nicht schreibbar: %r", fehler)
automatik["last_run"] = datetime.now() automatik["last_run"] = datetime.now()
self.lief_im_fenster[automatik["id"]] = True self.lief_im_fenster[automatik["id"]] = True
@@ -899,7 +900,7 @@ class Runner:
c.execute("""UPDATE automations SET cond_met = %s, changed = changed c.execute("""UPDATE automations SET cond_met = %s, changed = changed
WHERE id = %s""", (automatik["cond_met"], automatik["id"])) WHERE id = %s""", (automatik["cond_met"], automatik["id"]))
except Exception as fehler: except Exception as fehler:
logger.warning("cond_met nicht schreibbar: %s", fehler) logger.warning("cond_met nicht schreibbar: %r", fehler)
def durchlauf(self, fenster=NACHHOLFENSTER): def durchlauf(self, fenster=NACHHOLFENSTER):
jetzt = datetime.now() jetzt = datetime.now()
@@ -979,7 +980,7 @@ class Runner:
c.execute("DELETE FROM automation_log WHERE ts < NOW() - INTERVAL %s DAY", c.execute("DELETE FROM automation_log WHERE ts < NOW() - INTERVAL %s DAY",
(LOG_AUFBEWAHRUNG_TAGE,)) (LOG_AUFBEWAHRUNG_TAGE,))
except Exception as fehler: except Exception as fehler:
logger.warning("Protokoll nicht aufraeumbar: %s", fehler) logger.warning("Protokoll nicht aufraeumbar: %r", fehler)
# --- Hauptschleife --------------------------------------------------- # --- Hauptschleife ---------------------------------------------------
@@ -1012,7 +1013,7 @@ class Runner:
logger.info("Regelwerk hat sich geaendert, wird neu geladen") logger.info("Regelwerk hat sich geaendert, wird neu geladen")
self.regelwerk_laden() self.regelwerk_laden()
except Exception as fehler: except Exception as fehler:
logger.warning("Regelwerk nicht pruefbar: %s", fehler) logger.warning("Regelwerk nicht pruefbar: %r", fehler)
if nur_einmal: if nur_einmal:
return return
+2 -2
View File
@@ -24,14 +24,14 @@
/volume1/homes/wagner/SolarManager/wsMQTTbridge.log /volume1/homes/wagner/SolarManager/wsMQTTbridge.log
/volume1/homes/wagner/SolarManager/wecker.log /volume1/homes/wagner/SolarManager/wecker.log
{ {
daily monthly
# Zwei Wochen zurueck. Weiter zurueck hat noch nie jemand gesucht, und # Zwei Wochen zurueck. Weiter zurueck hat noch nie jemand gesucht, und
# was aelter ist, steht ohnehin als Messwert in der Datenbank. # was aelter ist, steht ohnehin als Messwert in der Datenbank.
rotate 14 rotate 14
# Zusaetzlich zur Tagesgrenze: was ueber 20 MB geht, wird sofort # Zusaetzlich zur Tagesgrenze: was ueber 20 MB geht, wird sofort
# rotiert. Sonst koennte ein Prozess, der in eine Fehlerschleife # rotiert. Sonst koennte ein Prozess, der in eine Fehlerschleife
# geraet, an einem einzigen Tag das Volume fuellen. # geraet, an einem einzigen Tag das Volume fuellen.
maxsize 20M maxsize 10M
compress compress
# Eine leere Datei zu rotieren bringt nichts ausser vierzehn leeren # Eine leere Datei zu rotieren bringt nichts ausser vierzehn leeren
# Archiven - der Wecker meldet an den meisten Tagen gar nichts. # Archiven - der Wecker meldet an den meisten Tagen gar nichts.