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
+44 -19
View File
@@ -240,24 +240,49 @@ $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 --
$rumpf = @{ # auch wenn gar kein Webhook konfiguriert war oder das Senden fehlschlug. Beim
username = 'Sicherungs-Abholung' # ersten echten Test ist genau das passiert: ein Lauf OHNE -Webhook hat den
embeds = @(@{ # Alarm als "gemeldet" abgehakt, und der naechste Lauf MIT Webhook waere still
title = 'Bei dir zu Hause kommt keine Sicherung mehr an' # geblieben.
description = $jetzt #
color = 15158332 # Ein Merker bedeutet "dieser Zustand wurde berichtet". Wenn nichts berichtet
fields = @(@{ name = 'Ablage'; value = "``$zVoll``"; inline = $false }) # wurde, darf er nicht gesetzt werden -- sonst verschluckt genau der Fehlerfall
footer = @{ text = 'D4RKST3R // ABHOLUNG' } # die Meldung, fuer die das Ganze da ist.
})
} | ConvertTo-Json -Depth 6 if (-not $jetzt) {
$code = $rumpf | curl.exe -s -o NUL -w '%{http_code}' -X POST ` # Alles in Ordnung: Entwarnung braucht keine Nachricht, aber der Merker
-H 'content-type: application/json' --data-binary '@-' $Webhook # muss weg, damit derselbe Zustand spaeter wieder gemeldet werden kann.
Write-Host '' if ($zuletzt) { Set-Content $merker '' -Encoding UTF8; Gut 'Wieder in Ordnung.' }
if ($code -in '200', '204') { Gut "Gemeldet (HTTP $code)." } else { Schlecht "Melden fehlgeschlagen: HTTP $code" } } elseif ($jetzt -eq $zuletzt) {
}
} elseif ($jetzt) {
Warn 'Schon gemeldet -- bleibt still, bis sich etwas aendert.' 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 = @{
username = 'Sicherungs-Abholung'
embeds = @(@{
title = 'Bei dir zu Hause kommt keine Sicherung mehr an'
description = $jetzt
color = 15158332
fields = @(@{ name = 'Ablage'; value = "``$zVoll``"; inline = $false })
footer = @{ text = 'D4RKST3R // ABHOLUNG' }
})
} | ConvertTo-Json -Depth 6
$code = $rumpf | curl.exe -s -o NUL -w '%{http_code}' -X POST `
-H 'content-type: application/json' --data-binary '@-' $Webhook
Write-Host ''
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."
}
} }