Ich wollte von meinem DMR-Repeater gerne wissen, was er denn so treibt in seiner freien und besetzten Zeit. Der wird mit einem Raspberry Pi gesteuert, also über ein Linux Derivat, was sich darauf befindet. Und Linux hat den Charme alles in irgendwelchen Logdateien abzulegen.

Natürlich kann man sich wöchentlich, täglich oder stündlich diese Dateien nach Unregelmäßigkeiten durchsuchen. Man kann sich aber auch bestimmte Einträge schicken lassen, und dies besonders gut über einen MQTT-Broker. 

Ich habe hier eine Methode gefunden bestimmte Einträge aus dem MMDVM-Log an mich zu übermitteln. So aber immer nur die Einträge, die neu hinzukommen. Diese Einträge werden dann beim MQTT-Abonnenten, also bei mir oder bei dir, wenn es dich interessiert, weiter behandelt. Reaktionen auf spezielle Ereignisse sind dann nur noch ein Kinderspiel, ohne dass man ständig die Logs selbst durchforsten muss.

MMDVM liefert bereits eine Menge Informationen in seinen Log-Dateien. Neben Start- und Stop-Ereignissen des MMDVM-Dienstes u.a. aber auch die Aktivitäten während seiner Arbeiten. Hier ein Auszug:

M: 2021-08-04 18:44:22.496 DMR Slot 2, received network end of voice transmission, 0.8 seconds, 0% packet loss, BER: 0.0%
M: 2021-08-04 18:44:31.190 DMR Slot 2, received network voice header from DONT to TG 2629
M: 2021-08-04 18:44:31.756 DMR Talker Alias (Data Format 3, Received 3/5 char): 'DO8'
M: 2021-08-04 18:44:31.756 DMR Slot 2, Embedded Talker Alias Header
M: 2021-08-04 18:44:31.756 0000: 04 00 CA 00 44 00 4F 00 *....D.O.*
M: 2021-08-04 18:44:32.220 DMR Slot 2, received network end of voice transmission, 1.2 seconds, 0% packet loss, BER: 0.0%
M: 2021-08-04 18:44:43.228 DMR Slot 2, received network voice header from 262584 to TG 2629
M: 2021-08-04 18:44:43.752 DMR Talker Alias (Data Format 3, Received 3/6 char): 'DL9'
M: 2021-08-04 18:44:43.752 DMR Slot 2, Embedded Talker Alias Header
M: 2021-08-04 18:44:43.752 0000: 04 00 CC 00 44 00 4C 00 39 *....D.L.9*
M: 2021-08-04 18:44:44.231 DMR Slot 2, received network end of voice transmission, 1.2 seconds, 0% packet loss, BER: 0.0%
M: 2021-08-04 18:44:53.150 DMR Slot 2, received network voice header from DONT to TG 2629
M: 2021-08-04 18:44:55.058 DMR Slot 2, received network end of voice transmission, 1.6 seconds, 59% packet loss, BER: 0.0%
M: 2021-08-04 18:54:58.032 DMR Slot 2, received network voice header from DGLHC to TG 2629
M: 2021-08-04 18:54:58.571 DMR Talker Alias (Data Format 3, Received 3/13 char): 'DG'
M: 2021-08-04 18:54:58.571 DMR Slot 2, Embedded Talker Alias Header
M: 2021-08-04 18:54:58.571 0000: 04 00 DA 00 44 00 47 00 *....D.G.*
M: 2021-08-04 18:54:58.708 DMR Slot 2, received network end of voice transmission, 0.8 seconds, 0% packet loss, BER: 0.0%
M: 2021-08-04 18:55:21.757 DMR Slot 2, received network voice header from DKCQ to TG 2629
M: 2021-08-04 18:55:22.338 DMR Talker Alias (Data Format 3, Received 3/10 char): 'DK'
M: 2021-08-04 18:55:22.338 DMR Slot 2, Embedded Talker Alias Header
M: 2021-08-04 18:55:22.339 0000: 04 00 D4 00 44 00 4B 00 *....D.K.*
M: 2021-08-04 18:55:23.170 DMR Talker Alias (Data Format 3, Received 6/10 char): 'DKCQ '
M: 2021-08-04 18:55:23.171 DMR Slot 2, Embedded Talker Alias Block 1
M: 2021-08-04 18:55:23.171 0000: 05 00 00 43 00 51 00 20 00 *...C.Q. .*
M: 2021-08-04 18:55:23.893 DMR Talker Alias (Data Format 3, Received 10/10 char): 'DKCQ Hins'
M: 2021-08-04 18:55:23.893 DMR Slot 2, Embedded Talker Alias Block 2
M: 2021-08-04 18:55:23.893 0000: 06 00 48 00 62 00 6E 00 73 *..H.i.n.s*
M: 2021-08-04 18:55:25.812 DMR Slot 2, received network end of voice transmission, 4.1 seconds, 0% packet loss, BER: 0.0%
M: 2021-08-04 19:07:32.113 DMR Slot 2, received network voice header from DKCQ to TG 2629
M: 2021-08-04 19:07:32.654 DMR Talker Alias (Data Format 3, Received 3/10 char): 'DK'
M: 2021-08-04 19:07:32.654 DMR Slot 2, Embedded Talker Alias Header
M: 2021-08-04 19:07:32.654 0000: 04 00 D4 00 44 00 4B 00 *....D.K.*
M: 2021-08-04 19:07:33.374 DMR Talker Alias (Data Format 3, Received 6/10 char): 'DKCQ '
M: 2021-08-04 19:07:33.375 DMR Slot 2, Embedded Talker Alias Block 1
M: 2021-08-04 19:07:33.375 0000: 05 00 00 43 00 51 00 20 00 *...C.Q. .*
M: 2021-08-04 19:07:34.097 DMR Talker Alias (Data Format 3, Received 10/10 char): 'DKCQ Hins'
M: 2021-08-04 19:07:34.097 DMR Slot 2, Embedded Talker Alias Block 2
M: 2021-08-04 19:07:34.098 0000: 06 00 48 00 62 00 6E 00 73 *..H.i.n.s*
M: 2021-08-04 19:07:34.579 DMR Slot 2, received network end of voice transmission, 2.6 seconds, 0% packet loss, BER: 0.0%
M: 2021-08-04 21:23:19.935 DMR Slot 2, received network voice header from DFEE to TG 8
M: 2021-08-04 21:23:20.485 DMR Talker Alias (Data Format 3, Received 3/12 char): 'DF'
M: 2021-08-04 21:23:20.485 DMR Slot 2, Embedded Talker Alias Header
M: 2021-08-04 21:23:20.485 0000: 04 00 D8 00 44 00 46 00 *....D.F.*
M: 2021-08-04 21:23:21.224 DMR Talker Alias (Data Format 3, Received 6/12 char): 'DFEE '
M: 2021-08-04 21:23:21.224 DMR Slot 2, Embedded Talker Alias Block 1
M: 2021-08-04 21:23:21.224 0000: 05 00 00 45 00 45 00 20 00 *...E.E. .*
M: 2021-08-04 21:23:22.875 DMR Slot 2, received network end of voice transmission, 2.7 seconds, 26% packet loss, BER: 0.3%

Mich interessiert an dieser Stelle die Auslastung der DMR-Slots. Das Ziel ist über bestimmte Ereignisse automatisch informiert zu werden, um entweder manuell oder automatisch darauf reagieren zu können. Als erstes muss ich sicherstellen, dass die letzte Zeile, also ein neuer Eintrag an mich übermittelt wird und nicht immer die komplette Log-Datei.

Das tail-Kommando als Bestandteil von Linux ist eine gute Hilfe:

tail -fn 1 /var/log/mmdvm/mmdvm.log

Mit diesem Eintrag wartet das Kommando auf eine neue Zeile in der angegebenen Datei.

Jetzt möchte ich diesen Eintrag an einen MQTT-Broker senden, an dem ich mich mit meinem Client ‘subscribed’ habe. Gleichzeitig lasse ich prüfen, ob die neue Zeile eine bestimmte Zeichenkette “, received” enthält und eben nur diese Zeile übermittelt:

tail -fn 1 /var/log/mmdvm/mmdvm.log | while read -r LINE; do if [[ "$LINE" =~ ", received" ]] ; then mosquitto_pub -h broker.mqttbroker.net -t digitalfunk/dl8aap/mmdvm -m "'$LINE'"; fi; done

Was passiert hier?

Die letzte Zeile aus dem Log wird über das Pipe-Kommando an die nachstehende Schleife übermittelt und zwischen do und done ausgewertet. Das Kommando mosquitto_pub publiziert das Ergebnis an den MQTT-Broker broker.mqttbroker.net im Internet in den “Ordner” digitalfunk/dl8aap/mmdvm. Ein nachgelagerter Subscriber, der sich diesen “Ordner” abonniert hat und dort horcht, wird also umgehend mit der letzten Zeile des MMDVM-Logs beliefert. Weitere Auswertungen werden dann vor Ort beim Client vorgenommen. Da kann man sich Nodered vorstellen, das ständig mit seinem MQTT-Client auf neue Daten wartet und in seinen Data-Flows bestimmte Sachen damit anstellt. Z.B. eine E-Mail oder Telegram-Nachricht versendet.

Diese Zeile muss nun nur noch in eine Skript-Datei verpackt und beim Systemstart angestoßen werden. Hinweis: die hier gemachten Angaben enthalten keine realen Verweise auf Server- und Dateinamen und sollten vor Übernahme auf die eigenen Bedürfnisse angepasst werden. Also bitte nicht gleich blind abtippeln.

Auf diese Weise können alle Logdateien eines Linux-Rechners beobachtet werden. Bestimmte Einträge werden so gefiltert, verarbeitet und an das letzte Glied einer Informationskette gezielt versendet. Machen das die Großen mit ihren supertollen GUIs (z.B. PRTG, Qualys) nicht auch irgendwie so?

Zugegeben, für mich als Großvater von derzeit zwei ganz wunderbaren Enkeln hat es ein wenig gedauert diese Syntax zu ermitteln, aber letztlich funktioniert es so. Und natürlich habe ich das nur hier für mich zur Erinnerung als Gedankenstütze abgelegt.

Atmega 328 mit einem Arduino Uno programmieren
InfluxDB startet nicht mehr nach Update

Kommentar hinterlassen

Your email address will not be published. Required fields are marked *

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.