Linux und Windows HelpDesk

Monitor ID in Zoneminder ändern.

Die Monitor ID wird in Zoneminder unabhängig davon ob Monitore wieder entfernt sind, immer weiter hochgezählt. So kann es insbesondere auf gewachsenen Systemen, auf denen Monitore hinzugefügt und später wieder entfernt wurden so sein, dass man Monitore mit der ID 1, 4, 12, 18, 24, 46, 118... hat. Auf die Funktion von Zoneminder hat das keinerlei Einfluss, doch dem Einen oder Anderen - wie auch mir - gefällt das nicht und man möchte gern durchnummerierte Monitor IDs (1, 2, 3...) für die vorhandenen Monitore.

Leider ist das editieren der Monitor ID in Zoneminder nach wie vor nicht vorgesehen und so bleibt nur ein etwas umständlicher Weg, bei dem die Datenbank direkt editiert werden muss. Man geht Problemen aus dem Weg, wenn man dies direkt nach dem Erstellen eines Monitor erledigt, wenn noch keine Ereignisse oder Archive gespeichert sind und auch sonst noch keine weiteren Einstellungen am Monitor vorgenommen wurden. Zuvor sollte das System dafür natürlich gesichert werden, um es im schlimmsten Fall wieder in die Ausgangssituation zurücksetzen zu können.

Zunächst wird Zoneminder gestoppt und das Ereignisverzeichnis des jeweiligen Monitor, mit der gewünschte Monitor ID umbenannt. (Der Standardpfad des Ereignisverzeichnis ist /var/cache/zoneminder/events/)
Anschließend loggt man sich als Root in den MySQL Server ein.

# systemctl stop zoneminder
# mv /var/cache/zoneminder/events/12 /var/cache/zoneminder/events/3
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2506
Server version: 10.11.3-MariaDB-1 Debian 12

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Standardmäßig ist zm der Name der Zoneminder Datenbank, die nun ausgewählt wird. Außerdem sollte die referenzielle Integritätsprüfungen vorübergehend deaktiviert werden, um Fehlermeldungen wegen gegenseitiger Abhängigkeiten zu vermeiden.

# use zm;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
# SET FOREIGN_KEY_CHECKS=0;
Query OK, 0 rows affected (0,001 sec)

Nun lässt man sich wenn man es für einen besseren Überblick möchte, alle Tabellen der Zoneminder Datenbank anzeigen.

# show tables;
+-----------------+
| Tables_in_zm    |
+-----------------+
| Config          |
| ControlPresets  |
| Controls        |
| Devices         |
| Event_Summaries |
| Events          |
| Events_Archived |
| Events_Day      |
| Events_Hour     |
| Events_Month    |
| Events_Week     |
| Filters         |
| Frames          |
| Groups          |
| Groups_Monitors |
| Logs            |
| Manufacturers   |
| Maps            |
| Models          |
| MonitorPresets  |
| Monitor_Status  |
| Monitors        |
| MontageLayouts  |
| Servers         |
| Sessions        |
| Snapshot_Events |
| Snapshots       |
| States          |
| Stats           |
| Storage         |
| TriggersX10     |
| Users           |
| ZonePresets     |
| Zones           |
+-----------------+
34 rows in set (0,001 sec)

Es ist insbesondere in den Tabellen Events, Events_Archived, Events_Day, Events_Hour, Events_Month, Events_Week, Groups_Monitors, Monitor_Status, Monitors, Users und Zones nachzusehen, ob dort der jeweilige Monitor aufgeführt und dementsprechend zu ändern ist.
Bei sehr breite Tabellen, wie sie z.B. unter Monitors zu finden sind, kann der Befehl auch mit \G anstelle ; abgeschlossen werden. Damit wird der Inhalt in einzelnen Datenblöcken untereinander aufgelistet.

# select * from Monitor_Status;
+-----------+------------+------------+-------------+------------------+
| MonitorId | Status     | CaptureFPS | AnalysisFPS | CaptureBandwidth |
+-----------+------------+------------+-------------+------------------+
|         1 | NotRunning |      12.50 |       12.50 |            15079 |
|         2 | NotRunning |      12.50 |        0.00 |            56111 |
|         8 | NotRunning |       0.00 |        0.00 |                0 |
|        12 | NotRunning |      12.39 |        0.00 |            55608 |
+-----------+------------+------------+-------------+------------------+
4 rows in set (0,001 sec)

# update Monitor_Status set MonitorID="3" where MonitorID="12";
Query OK, 1 row affected (0,008 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Je nach Tabelle ist zu beachten, dass die Monitor Spalte "MonitorID" oder nur "ID" heißen kann, was für den Update Aufruf natürlich zu berücksichtigen ist.

Zum Abschluss verlässt man die Datenbank und startet Zoneminder wieder.

# exit
Bye
# systemctl start zoneminder

Im Log von Zoneminder verfolgt man nun, ob Fehlermeldungen auf übersehene Einträge in der Datenbank hindeuten und ändert sie dementsprechend.