fix: der Merker wird erst gesetzt, wenn die Meldung wirklich rausging

Beim ersten echten Meldetest lief das Skript ohne -Webhook. Es hat den Alarm
angezeigt, NICHTS gesendet -- und den Zustand trotzdem als "gemeldet"
abgehakt. Der naechste Lauf MIT Webhook waere still geblieben.

Ein Merker bedeutet "dieser Zustand wurde berichtet". Wenn nichts berichtet
wurde, darf er nicht gesetzt werden -- sonst verschluckt ausgerechnet der
Fehlerfall die Meldung, fuer die das Ganze da ist.

Jetzt vier Faelle, sauber getrennt:

    alles gut         -> Merker leeren, keine Nachricht noetig
    schon gemeldet    -> still bleiben
    kein Webhook      -> sagen, dass NICHTS gemeldet wurde, Merker nicht setzen
    Webhook da        -> senden; NUR bei HTTP 200/204 den Merker setzen

Der letzte Punkt ist der zweite Teil derselben Sache: schlaegt das Senden fehl,
bleibt der Merker leer und der naechste Lauf versucht es erneut. Eine Meldung,
die im Netz haengengeblieben ist, ist keine Meldung.

Nachgemessen, beide Richtungen:

    Alarm ohne Webhook  -> "NICHTS gemeldet", Merker vorhanden: False
    derselbe mit Webhook -> "Gemeldet (HTTP 204)", Merker gesetzt: True

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 11:09:16 +02:00
co-authored by Claude Opus 5
parent befa393b84
commit 4af8366517
+31 -6
View File
@@ -240,9 +240,30 @@ $merker = Join-Path $zVoll '.letzter-alarm.txt'
$zuletzt = if (Test-Path $merker) { (Get-Content $merker -Raw).Trim() } else { '' } $zuletzt = if (Test-Path $merker) { (Get-Content $merker -Raw).Trim() } else { '' }
$jetzt = if ($text) { $text } else { '' } $jetzt = if ($text) { $text } else { '' }
if ($jetzt -ne $zuletzt) { # DER MERKER WIRD ERST GESETZT, WENN DIE MELDUNG WIRKLICH RAUSGING.
Set-Content $merker $jetzt -Encoding UTF8 #
if ($Webhook -and $jetzt) { # Vorher stand er ganz oben und wurde bei jedem Zustandswechsel geschrieben --
# auch wenn gar kein Webhook konfiguriert war oder das Senden fehlschlug. Beim
# ersten echten Test ist genau das passiert: ein Lauf OHNE -Webhook hat den
# Alarm als "gemeldet" abgehakt, und der naechste Lauf MIT Webhook waere still
# geblieben.
#
# Ein Merker bedeutet "dieser Zustand wurde berichtet". Wenn nichts berichtet
# wurde, darf er nicht gesetzt werden -- sonst verschluckt genau der Fehlerfall
# die Meldung, fuer die das Ganze da ist.
if (-not $jetzt) {
# Alles in Ordnung: Entwarnung braucht keine Nachricht, aber der Merker
# muss weg, damit derselbe Zustand spaeter wieder gemeldet werden kann.
if ($zuletzt) { Set-Content $merker '' -Encoding UTF8; Gut 'Wieder in Ordnung.' }
} elseif ($jetzt -eq $zuletzt) {
Warn 'Schon gemeldet -- bleibt still, bis sich etwas aendert.'
} elseif (-not $Webhook) {
Write-Host ''
Warn 'Kein -Webhook angegeben -- es wurde NICHTS gemeldet.'
Warn 'Der Merker bleibt deshalb leer: beim naechsten Lauf mit Webhook'
Warn 'geht die Meldung dann wirklich raus.'
} else {
$rumpf = @{ $rumpf = @{
username = 'Sicherungs-Abholung' username = 'Sicherungs-Abholung'
embeds = @(@{ embeds = @(@{
@@ -256,8 +277,12 @@ if ($jetzt -ne $zuletzt) {
$code = $rumpf | curl.exe -s -o NUL -w '%{http_code}' -X POST ` $code = $rumpf | curl.exe -s -o NUL -w '%{http_code}' -X POST `
-H 'content-type: application/json' --data-binary '@-' $Webhook -H 'content-type: application/json' --data-binary '@-' $Webhook
Write-Host '' Write-Host ''
if ($code -in '200', '204') { Gut "Gemeldet (HTTP $code)." } else { Schlecht "Melden fehlgeschlagen: HTTP $code" } if ($code -in '200', '204') {
Gut "Gemeldet (HTTP $code)."
Set-Content $merker $jetzt -Encoding UTF8
} else {
# NICHT merken: beim naechsten Lauf noch einmal versuchen. Eine
# Meldung, die im Netz haengengeblieben ist, ist keine Meldung.
Schlecht "Melden fehlgeschlagen: HTTP $code -- wird beim naechsten Lauf erneut versucht."
} }
} elseif ($jetzt) {
Warn 'Schon gemeldet -- bleibt still, bis sich etwas aendert.'
} }