Der Cron ist das Herz der Automatisierung. Er ruft regelmäßig /cron.php
auf, prüft das Mail-Postfach, parst neue Alarm-Mails und legt daraus
Einsätze an.
Was im Cron passiert
Bei jedem Aufruf:
- Token-Check — passt der
?token=…-Parameter zum konfiguriertencron_token? Wenn nein: 403. -
Wartung — läuft vor allem anderen und auch bei abgeschaltetem Alarmpush: abgelaufene Einsatz-Rollen zurücknehmen, verbrauchte und abgelaufene Einladungslinks für Web Push wegräumen, abgelaufene Geräte-Anmeldungen („angemeldet bleiben", siehe Profil) aufräumen — widerrufene Zeilen bleiben dabei 30 Tage stehen, sie sind der einzige Beleg für ein als gestohlen erkanntes Cookie —, alte Rückmeldungen nach der eingestellten Frist entfernen und fällige Sammelmeldungen verschicken (siehe Meldungen).
ℹ️ Die Frist für Rückmeldungen steht unter Meldungen → Rückmeldungen, Vorgabe drei Tage. Sie wirkt nur, wenn dieser Cron-Job läuft — ohne ihn räumt niemand auf, und die Einträge bleiben liegen. Hat der Lauf etwas entfernt, steht es in seiner Ausgabe:
Hinweise: - Rueckmeldungen aufgeraeumt: 12 (aelter als 3 Tage) - Wetter-Kacheln warmhalten — nur bei gebuchtem Wetter-Modul: Der jeweils neueste Zeitschritt von Regenradar und Blitzen wird für Euer Gemeindegebiet schon geholt, bevor ihn jemand braucht. Ohne das wartet immer die erste Person, die die Karte öffnet, auf den Deutschen Wetterdienst — alle fünf Minuten aufs Neue. Im selben Schritt wird der Bildspeicher auf sein Budget von 200 MB gestutzt. Bei einem Fünf-Minuten-Takt der Daten hat nur etwa jeder zehnte Lauf überhaupt etwas zu tun. Im selben Schritt sichert der Cron die Gewitter-Vergangenheit: Der Dienst kennt nur „ab jetzt", also hebt das ETB alle fünf Minuten den ersten Zeitschritt auf — nach zwei Stunden ist die Zeitleiste vollständig. Das läuft unabhängig davon, ob gerade jemand die Karte offen hat: Ein nicht geholter Zeitschritt ist für immer verloren.
- Telegram-Rückmeldungen abholen — nur, wenn Du den Rückweg auf Abholen gestellt hast (siehe Webhook-Status). Läuft ebenfalls auch bei abgeschaltetem Alarmpush: Was jemand im Chat zurückgemeldet hat, ist auch dann einzusammeln.
- Mail-Postfach abfragen — neue Mails seit dem letzten Lauf.
- Subject-Filter — passt das Betreff zu den konfigurierten Pattern
(
mail_subject_alarm/mail_subject_unwetter)? - Pro passender Mail:
- Parser extrahiert Felder (Stichwort, Adresse, Sachverhalt, EMs, Melder)
- Geocoding löst die Adresse zu Koordinaten auf (mit Cache)
- Einsatz anlegen — mit allem, was der Parser gefunden hat
- Auto-Zuweisung zum Schwerpunkt, falls der Ort zu einem aktiven Schwerpunkt im Modus „Orte" passt
- Alarmierung über den eingestellten Zustellweg
- Heartbeat schreiben in
logs/last-cron-beat.txt - Statistik im Cron-Log (
logs/cron-YYYYMMDD.log)
ℹ️ Lief ein Abholvorgang, steht das in der Antwort des Cron-Aufrufs — unter „Hinweise:", z. B.
Rückmeldungen abgeholt: 3 (davon 3 verarbeitet)oder, wenn Telegram nicht mitspielt,Rückmeldungen konnten nicht abgeholt werden: …. So siehst Du beim Aufruf von Hand sofort, ob das Abholen überhaupt arbeitet. Ist der Rückweg auf Webhook gestellt, fehlt die Zeile.
Crontab-Eintrag
Empfohlen: alle 2 Minuten. Mehr belastet das Postfach unnötig, weniger verzögert Alarme zu spürbar.
*/2 * * * * curl -fsS "https://etb.example.de/cron.php?token=DEIN_TOKEN" >/dev/null
Den Token findest Du unter /admin/config.php (Setting cron_token) oder im
Setup-Wizard, der ihn beim Erst-Setup generiert.
⚠️ Holst Du die Telegram-Rückmeldungen ab, ist der Takt keine Empfehlung mehr, sondern eine Zusage an die Führung. Er bestimmt, wie schnell eine Rückmeldung aus dem Chat im Lagebild steht: Bei zwei Minuten ist sie spätestens nach zwei Minuten da, bei einem Fünfzehn-Minuten-Takt eben nach einer Viertelstunde — und dann taugt die Sammelmeldung nicht mehr für die Frage „wer kommt?". Läuft der Cron gar nicht, kommt keine einzige Rückmeldung an. Beim Webhook spielt der Takt dafür keine Rolle.
⚠️ Achtung: Der Token ist ein gemeinsames Geheimnis — wer ihn kennt, kann beliebig oft
/cron.phptriggern. Schütze die Crontab-Datei mit den üblichen Unix-Permissions (chmod 600) und rotiere den Token, wenn er versehentlich nach außen gelangt.
Alternativen zum Crontab
- systemd-Timer: Wenn Dein System systemd hat, ist das die modernere
Variante. Erstelle
etb-cron.serviceundetb-cron.timer. - Externer Scheduler: Cron-Jobs aus der Cloud (z. B. cron-job.org) können die URL stündlich abfragen — taugt aber nur als Notnagel, weil ein guter Alarm-Push minutengenau sein soll. Holst Du zusätzlich die Telegram-Rückmeldungen ab, gilt das doppelt: Stündlich abgeholte Zusagen sind für die Führung wertlos.
Mail-Parser im Detail
Der Parser extrahiert aus dem Mail-Body diese Felder:
| Feld | Wo es im Mail-Body steht (typisch) |
|---|---|
| Stichwort | „Stichwort: …" |
| Adresse | „Straße: …", „Ort: …", „Hausnummer: …" |
| Sachverhalt | „Sachverhalt: …" (mehrzeilig) |
| Einsatzmittel | „Alarmiert: …" (komma-separiert) |
| Melder | „Melder: Name, Telefon" |
| Alarmzeit | „Eingegangen: …" |
| Zusatz-Info | „Bemerkung: …" |
Die Erkennungsmuster sind fest im Programm hinterlegt und auf das Format einer konkreten Leitstelle zugeschnitten (das der Referenz-Installation). Wenn Deine Leitstelle ein anderes Format schickt, musst Du den Parser anpassen — das ist ein eigenes Projekt, eine reine Konfiguration reicht da nicht. Sprich uns an.
ℹ️ Auch der Mail-Parser nutzt den Stichwort-Katalog. Passt das Mail-Stichwort auf einen Katalog-Eintrag, wird dessen Anzeige-Variante gespeichert; passt keiner, bleibt das volle Stichwort der Mail stehen. Siehe Einsatz anlegen & bearbeiten und Stammdaten.
Geocoding
Adressen werden gegen den Nominatim-Server von OpenStreetMap aufgelöst. Damit
Deine lokale „Hauptstraße 5" nicht in einem anderen Bundesland landet, wird
der konfigurierte geocode_suffix an die Adresse angehängt (z. B. „12345
Musterstadt").
Cache: Jede aufgelöste Adresse landet im Adress-Zwischenspeicher. Beim
nächsten Treffer wird der Cache genutzt — schont Nominatim und bringt
sub-second Response. Unter /geocode-admin.php siehst Du den Cache und
kannst einzelne Einträge löschen oder neu auflösen.
Heartbeat
Der Cron schreibt alle 6 Stunden einen Heartbeat-Eintrag und der tägliche
Heartbeat (separater Cron-Job auf /api/heartbeat.php?token=…) schickt eine
ausführliche Statusmeldung an die Administratoren — über den eingestellten
Zustellweg:
🟢 Alarmpush-Heartbeat
Letzte 24 Stunden:
• 📋 Verarbeitete Alarme: 7
• 📑 Log-Einträge: 142
• ⚠️ Warnungen: 0
• ❌ Fehler: 0
Seit letztem ETB-Reset:
• 🚒 Einsätze gesamt: 23
Der Counter „Verarbeitete Alarme" zählt echte Einsätze aus der
einsaetze-Tabelle (24 h bzw. seit ETB-Reset) — nicht die Cron-Aufrufe
selbst. So bleibt der Zähler aussagekräftig, auch wenn der Cron alle 30
Sekunden läuft und 99 % der Aufrufe leer sind.
ℹ️ Der „Seit letztem ETB-Reset"-Counter setzt sich automatisch zurück, wenn der ETB-Reset (manuell oder morgendlich) läuft — kein zusätzlicher Counter-State nötig.
ℹ️ Ist der kostenpflichtige Dienst what3words aktiv (siehe Einstellungen), trägt der Heartbeat zusätzlich eine Zeile „📍 what3words" mit dem Monatsverbrauch — bei gesetztem Limit als verbleibende Aufrufe (mit ⚠️ ab 80 %), sonst als reine Zählung. Ohne aktives what3words fehlt die Zeile. Denselben Wert zeigt die Karte what3words-Kontingent unter System-Status.
Wartung im Heartbeat-Lauf
Der Heartbeat verschickt nicht nur eine Nachricht, er räumt auch auf. Dazu gehört der Zwischenspeicher der verkleinerten Bilder für den PDF-Export: Fassungen, die seit 30 Tagen nicht mehr gebraucht wurden, fliegen raus — und liegt der Ordner danach immer noch über der Obergrenze von 250 MB, zusätzlich die ältesten, bis er wieder passt. Wurde etwas entfernt, steht das in der Nachricht:
• 🖼 Export-Bilder aufgeräumt: 42 (18,4 MB frei)
Gab es nichts zu tun, bleibt die Zeile weg. Die aktuelle Belegung siehst Du jederzeit auf der Karte Export-Bild-Cache unter System-Status.
ℹ️ Dieses Aufräumen läuft unabhängig von Telegram: Auch auf einer Instanz ohne Alarmpush oder Telegram-Anbindung genügt der Heartbeat-Cron-Job, damit der Ordner nicht dauerhaft wächst. Umgekehrt gilt: Ohne eingerichteten Heartbeat-Job räumt niemand auf.
ℹ️ Der Zwischenspeicher ist gefahrlos — er enthält nur aus den Anhängen berechnete Kopien. Die Originale bleiben unangetastet, gelöschte Fassungen entstehen beim nächsten Export automatisch neu.
Was wenn der Cron nicht läuft?
- Manuell aufrufen:
curl "https://etb.example.de/cron.php?token=…"— siehst Du die JSON-Response? Wenn nein, ist es ein Webserver-/PHP-Problem. - Crontab prüfen:
crontab -l -u www-data(oder der User, unter dem Dein Cron läuft). - Cron-Logs:
/var/log/syslog | grep CRONzeigt, ob der Job überhaupt getriggert wurde. - System-Status öffnen (
/admin/system-status.php) — zeigt das Alter des letzten Cron-Laufs.
⚠️ Ein stehender Cron fällt doppelt auf die Füße, wenn der Rückweg auf Abholen steht: Es entstehen keine Einsätze aus Mails und es kommt keine Rückmeldung mehr an. Wann zuletzt abgeholt wurde, steht unter Webhook-Status in der Zeile „Letzter Abholvorgang".
Was als nächstes?
- Backup & Updates — wie Du sicher upgradest
- Telegram-Grundlagen — die andere Hälfte der Automatisierung
- Webhook-Status — Webhook oder Abholen: der Rückweg aus dem Chat
- Diagnose — System-Status und Logs