meldungen: Lucy spricht – jede Telegram-Meldung in ihrem Ton
User 25.09.: „Hermes' Persona ist Lucy – das muss sich in all ihren Meldungen widerspiegeln“; das angehängte „(Diese Meldung kam auch an Lucy.)“ tat so, als wäre sie jemand anderes als der Absender. - notify.sh: Kopfzeile aus dem Betreff in Lucys Ton (SOUL.md: „Commander“, knapp, sachlich), bei Dringendem „Commander, das ist dringend.“; keine zweite Anrede, wenn der Text schon mit ihr beginnt. Morgenmeldung mit kurzen Marken statt Betreffen in Klammern; die des Homelabs sagt, woher sie kommt. - Wächter: Zusatz „kam auch an Lucy“ entfernt (der Briefkasten bekommt die Meldung weiter). - Melde-Log und Auswertungen unverändert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
2784c0ea32
commit
c31ef827fc
@@ -647,7 +647,9 @@ def _telegram(betreff: str, text: str) -> None:
|
||||
log.info("waechter (trocken): würde melden %s %s", betreff, text)
|
||||
return
|
||||
announce.add(text, subject=betreff, source="waechter")
|
||||
announce.notify_telegram(betreff, text + " (Diese Meldung kam auch an Lucy.)")
|
||||
# Bis 25.09.2026 hing hier „(Diese Meldung kam auch an Lucy.)“ an — als wäre Lucy jemand anderes als der Absender.
|
||||
# Sie IST der Absender (ihr Bot, ihre Stimme, siehe notify.sh); im Briefkasten oben liegt die Meldung trotzdem.
|
||||
announce.notify_telegram(betreff, text)
|
||||
|
||||
|
||||
def _auto_erlaubt(schluessel: str, jetzt: float) -> bool:
|
||||
|
||||
@@ -420,7 +420,9 @@ def test_telegram_test_ueber_hermes_auch_nachts(melden):
|
||||
ergebnis = einstellungen.telegram_test()
|
||||
assert ergebnis["ok"] and ergebnis["gesendet"] and ergebnis["weg"] == "hermes", ergebnis
|
||||
gesendet = protokoll.read_text(encoding="utf-8")
|
||||
assert "send --to telegram --subject [Test]" in gesendet and f"Kennung {ergebnis['kennung']}" in gesendet
|
||||
# Lucys Kopfzeile statt „[Test]“ (seit 25.09.2026, notify.sh).
|
||||
assert "send --to telegram --subject Commander, ein Test des Meldewegs." in gesendet
|
||||
assert f"Kennung {ergebnis['kennung']}" in gesendet
|
||||
assert not (tmp / "night-queue.txt").exists()
|
||||
assert "OK telegram: Testmeldung aus den Einstellungen" in (tmp / "notify.log").read_text(encoding="utf-8")
|
||||
|
||||
@@ -436,7 +438,8 @@ def test_telegram_test_ueber_den_zweitweg(melden, bot_api, monkeypatch):
|
||||
monkeypatch.setenv("STUB_EXIT", "1") # wie im Homelab-Teil: kein Hermes
|
||||
ergebnis = einstellungen.telegram_test()
|
||||
assert ergebnis["gesendet"] and ergebnis["weg"] == "direkt", ergebnis
|
||||
assert len(empfangen) == 1 and empfangen[0]["text"].startswith("[Test]\nTestmeldung aus den Einstellungen")
|
||||
assert len(empfangen) == 1
|
||||
assert empfangen[0]["text"].startswith("Commander, ein Test des Meldewegs.\nTestmeldung aus den Einstellungen")
|
||||
|
||||
|
||||
@braucht_bash
|
||||
|
||||
@@ -61,7 +61,8 @@ def test_nachts_wird_gesammelt(umgebung):
|
||||
tmp, env, protokoll = umgebung
|
||||
assert _notify(env, "-s", "[Box-Update]", "Engine aktualisiert").returncode == 0
|
||||
assert _gesendet(protokoll) == ""
|
||||
assert (tmp / "night-queue.txt").read_text(encoding="utf-8") == "- [Box-Update]: Engine aktualisiert\n"
|
||||
# Die Zeile der Morgenmeldung trägt Lucys kurze Marke statt des Betreffs in Klammern (25.09.2026).
|
||||
assert (tmp / "night-queue.txt").read_text(encoding="utf-8") == "- Box, Wartung: Engine aktualisiert\n"
|
||||
assert "QUEUED für Morgen-Digest: Engine aktualisiert" in (tmp / "notify.log").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
@@ -97,8 +98,9 @@ def test_morgenmeldung_schickt_alles_als_eine_nachricht(umgebung):
|
||||
assert _morgenmeldung(env).returncode == 0
|
||||
gesendet = _gesendet(protokoll)
|
||||
assert gesendet.count("send --to telegram") == 1
|
||||
assert "[Morgenmeldung]" in gesendet and "2 Meldungen" in gesendet
|
||||
assert "Router aktualisiert" in gesendet and "Kandidat bestanden" in gesendet
|
||||
assert "Guten Morgen, Commander. Heute Nacht gab es 2 Meldungen:" in gesendet
|
||||
assert "--subject" not in gesendet # die Anrede steht schon im Text, keine zweite Kopfzeile
|
||||
assert "Box, Wartung: Router aktualisiert" in gesendet and "Modell-Radar: Kandidat bestanden" in gesendet
|
||||
assert not (tmp / "night-queue.txt").exists()
|
||||
assert (tmp / "night-queue.txt.zuletzt-gesendet").exists()
|
||||
|
||||
@@ -170,7 +172,7 @@ def test_zweitweg_springt_ein_wenn_hermes_scheitert(umgebung, bot_api):
|
||||
lauf = _notify(env, "-s", "[Alarm]", "Hermes steht", stunde="12")
|
||||
assert lauf.returncode == 0
|
||||
assert empfangen == [{"pfad": "/bot123:abc/sendMessage", "chat_id": "4711",
|
||||
"text": "[Alarm]\nHermes steht"}]
|
||||
"text": "Commander, das ist dringend.\nHermes steht"}]
|
||||
assert "OK telegram direkt: Hermes steht" in (tmp / "notify.log").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
@@ -180,7 +182,8 @@ def test_zweitweg_nimmt_den_thread_mit(umgebung, bot_api):
|
||||
env = {**env, "STUB_EXIT": "1", "MC_TELEGRAM_API": url, "MC_TELEGRAM_ENV": _env_datei(
|
||||
tmp, "TELEGRAM_BOT_TOKEN='9:x'\r\nTELEGRAM_HOME_CHANNEL=-100\r\nTELEGRAM_HOME_CHANNEL_THREAD_ID=7\r\n")}
|
||||
assert _notify(env, "Ohne Betreff", stunde="12").returncode == 0
|
||||
assert empfangen == [{"pfad": "/bot9:x/sendMessage", "chat_id": "-100", "text": "Ohne Betreff",
|
||||
assert empfangen == [{"pfad": "/bot9:x/sendMessage", "chat_id": "-100",
|
||||
"text": "Commander, kurz gesagt:\nOhne Betreff",
|
||||
"message_thread_id": "7"}]
|
||||
|
||||
|
||||
@@ -208,3 +211,35 @@ def test_letzter_ausweg_wenn_auch_der_zweitweg_scheitert(umgebung, bot_api, inha
|
||||
lauf = _notify(env, "-s", "[Test]", "Geht nirgends hin", stunde="12")
|
||||
assert lauf.returncode == 1
|
||||
assert "FALLBACK (telegram fehlgeschlagen" in (tmp / "notify.log").read_text(encoding="utf-8")
|
||||
|
||||
|
||||
|
||||
@pytest.mark.parametrize("args, kopf", [
|
||||
(("-s", "[Homelab-Problem]", "Platte von AdGuard Home zu 94 % voll."), "Commander, im Homelab stimmt etwas nicht."),
|
||||
(("-s", "[Homelab wieder ok]", "Erledigt: Gitea antwortet nicht."), "Commander, Entwarnung im Homelab."),
|
||||
(("-s", "[Homelab-Update]", "Gitea: eingespielt, Prüfung grün."), "Commander, Bericht aus dem Homelab."),
|
||||
(("-s", "[Box-Problem]", "llama-swap steht."), "Commander, auf der Box stimmt etwas nicht."),
|
||||
(("-s", "[Alarm] Homelab-Update", "Gitea: Update gescheitert."), "Commander, das ist dringend."),
|
||||
(("-d", "-s", "[Test]", "Der Meldeweg geht."), "Commander, ein Test des Meldewegs."),
|
||||
(("-s", "[Modell-Radar]", "Kandidat bestanden."), "Commander, Bericht vom Modell-Radar."),
|
||||
])
|
||||
def test_lucy_spricht(umgebung, args, kopf):
|
||||
"""25.09.2026: Hermes' Persona ist Lucy — jede Meldung kommt von ihrem Bot, also in ihrem Ton (SOUL.md)."""
|
||||
_, env, protokoll = umgebung
|
||||
assert _notify(env, *args, stunde="12").returncode == 0
|
||||
assert f"--subject {kopf} -- {args[-1]}" in _gesendet(protokoll)
|
||||
|
||||
|
||||
def test_lucy_formuliert_selbst_keine_zweite_anrede(umgebung):
|
||||
_, env, protokoll = umgebung
|
||||
assert _notify(env, "-s", "[Box-Update]", "Commander, die Wochenpflege der Box ist durch.", stunde="12").returncode == 0
|
||||
assert _gesendet(protokoll) == "send --to telegram -- Commander, die Wochenpflege der Box ist durch.\n"
|
||||
|
||||
|
||||
def test_morgenmeldung_des_homelabs_sagt_woher(umgebung):
|
||||
_, env, protokoll = umgebung
|
||||
_notify(env, "-s", "[Homelab-Problem]", "NetBird antwortet nicht.")
|
||||
assert _morgenmeldung(env, MC_MORGENMELDUNG_BETREFF="[Morgenmeldung Homelab]").returncode == 0
|
||||
gesendet = _gesendet(protokoll)
|
||||
assert "Guten Morgen, Commander. Aus dem Homelab kamen heute Nacht 1 Meldung:" in gesendet
|
||||
assert "Homelab, Störung: NetBird antwortet nicht." in gesendet
|
||||
|
||||
Reference in New Issue
Block a user