Das Projekt ist eine Python 3 Anwendung des blaulichtSMS Einsatzmonitor. Folgende Features sind enthalten:
- Anzeigen des blaulichtSMS Einsatzmonitor Dashboards auf einem HDMI CEC fähigen Gerät
- Einschalten des HDMI CEC Gerätes beim Eintreffen eines neuen Alarms oder wahlweise auch bei neuen Informationen und Ausschalten des Gerätes nach einer vorgegebenen Zeit
- Senden des Logs eines Tages per Mail
- Senden einer Mail beim Auftreten eines Fehlers bzw. bei dessen Behebung
Für das Versenden von Mails ist ein Gmail Account erforderlich.
Zur Kommunikation mit dem blaulichtSMS Einsatzmonitor wird die Dashboard API verwendet.
Die Applikation ist entwickelt für Raspberry Pi in Kombination mit Raspbian Stretch Desktop. Für andere Systeme muss der Source Code angepasst werden.
Folgende Bibliotheken werden benötigt:
- APT Packete:
- cec-utils
- python3-cec
- Pip Packete:
- pyyaml
- cec
Zum Installieren der Äbhängigkeiten folgenden Befehle ausführen:
sudo apt install cec-utils python3-cec python3-yaml
Um Python Packete systemweit mit pip3 install --system
installieren zu können muss der User der die Installation ausführt in der Gruppe staff sein. Ein User kann zu dieser Gruppe mit:
sudo adduser <username> staff
hinzugefügt werden.
Mit diesem Befehl wird setup.sh
von github geladen und automatisch ausgeführt.
curl https://raw.githubusercontent.com/stg93/blaulichtsms_einsatzmonitor_tv_controller/master/setup.sh | bash -
Ist bereits eine config.ini
vorhanden, kann diese vor dem Ausführen im aktuellen Ordner abgelet werden.
Das setup script kopiert diese automatisch in das Ausführungsverzeichnis und startet nicht den Konfigurationswizard.
Zuerst muss via
python3 configure.py
die Anwendung konfiguriert werden. Bei der Konfiguration werden folgende Informationen abgefragt:
- blaulichtSMS Einsatzmonitor Login Daten
- Ob blaulichtSMS Informationen auch beachtet werden sollen
- Dauer nachdem das HDMI CEC Gerät nach einem Alarm wieder ausgeschaltet werden soll
- Der System Username unter welchem die Applikation ausgeführt werden soll
- Ob das Versenden von Mail Benachrichtigungen (Log des Tages um Mitternacht, Auftritt eines Fehlers und deren Behebung, Start der Applikation) erwünscht ist und falls ja
- Die Gmail Login Daten
- Die Empfänger des Logs
Nachdem die Konfiguration abgeschlossen ist können im File config.ini
fortgeschrittenere Einstellungen vorgenommen werden. Das Versenden des Logs kann mit dem Attribut send_log
im File logging_config.yaml
eingestellt werden.
Anschließend erfolgt die Installation via
sudo ./INSTALL
Der Source Code im aktuellen Verzeichnis wird für die Ausführung verwendet. Es ist daher sinnvoll den Code in sein finales Verzeichnis zu verschieben bevor die Installation erfolgt.
Die Deinstallation erfolgt mit
sudo ./UNINSTALL
Danach kann das Verzeichnis mit der Applikation gelöscht werden.
Bei der Installation wird ein Systemd Service eingerichtet über welchen die Anwendung kontrolliert werden kann.
Der Service wird beim Systemstart standardmäßig mitgestartet. Um den Autostart einzustellen kann
sudo systemctl enable/disable alarmmonitor
verwendet werden.
Nach der Installation ist der Service gestartet.
sudo systemctl start/stop alarmmonitor
startet bzw. stoppt den Service. Mit
sudo systemctl status alarmmonitor
kann der Status des Services abgefragt werden.
Die Applikation kann auch unabhängig von Systemd verwendet werden. Zum eigenständigen Starten reicht
python3 main.py
Zusätzlich zum Versenden des Logs einmal pro Tag per Mail, findet man im Verzeichnis ./log
die Logfiles der letzten 7 Tage.
Das Packet tests
enthält einen Systemtest.
Dieser Test simuliert mit Hilfe eines Mocks der blaulichtSMS Dashboard API eine Alarmierung.
Konkret sollte sich der Test folgendermaßen verhalten:
- Starten des alarmmonitor Services. Während des Starts wird das HDMI Gerät ausgeschaltet.
- 6 Abfragen der Mock API alle 10 Sekunden, die in keinen aktiven Alarmen resultieren.
- Nach der 6. Abfrage liefert die Mock API einen aktiven Alarm. Das HDMI Gerät wird eingeschaltet und der Einsatzmonitor eingezeigt.
- Nach einer Minute sind keine Alarme aktiv und das HDMI Gerät wird ausgeschaltet.
- Weitere Abfragen die keine aktiven Alarme zurückgeben.
- Anzeigen einer Zusammenfassung des Tests mit der Anzahl der Fehler und Warnungen und dem Pfad des abgespeicherten Logs.
Zum Ausführen des Systemtests muss die Environment Variable PYTHONPATH das Root Verzeichnis der Applikation enthalten.
Diese kann mit export PYTHONPATH=<absoluter_pfad_applikation_root>
gesetzt werden.
Danach kann mit
python3 tests/systemtest.py
der Systemtest gestartet werden. Die Ausführung des Tests kann nur vom Root Verzeichnis der Applikation gestartet werden.
Die Steuerung eines HDMI Gerätes erfolgt mittels HDMI CEC. Für diese Steuerung sind zwei Modi implementiert. Eine Implemetierung verwendet Pulse-Eight libCEC direkt, die andere verwendet die Python bindings der libCEC von trainmain419. Wird python-cec via pip installiert handelt es sich um Version 0.2.6. Bei dieser Version schlägt manchmal die Initialisierung fehl. Daher kann man auf die direkte Verwendung der libCEC umstellen.
Welche Implementierung verwendet wird kann in der config.ini
festgelegt werden:
# libCEC
cec_mode = 1
# python-cec
cec_mode = 2
Installiert man python-cec direkt vom source code, ist Version 0.2.7 aktuell. Ob das Initalisierungproblem darin behoben ist wurde nicht getestet.
Mit folgenden Befehlen kann ein HDMI CEC Gerät via libCEC direkt von einer Shell gesteuert werden:
# list known devices
cec-client -l
# scan for devices
echo "scan" | cec-client -s -d 1
# put device 0 to on
echo "on 0" | cec-client -s -d 1
# put device 0 to standby
echo "standby 0" | cec-client -s -d 1
# change source to current
echo "as" | cec-client -s -d 1
Einzelne Befehle via cec-client
an den TV schicken hat sich in manchen Fällen als nicht verlässlich heraus gestellt.
Für mehrere Commands einfach den cec-client
wie folgt starten:
# -d defines the debug level, see hdmiceccontroller.py
cec-client -d 4
# show available commands
help
Folgende Kommandos sind in unseren Tests verfügbar:
================================================================================
Available commands:
[tx] {bytes} transfer bytes over the CEC line.
[txn] {bytes} transfer bytes but don't wait for transmission ACK.
[on] {address} power on the device with the given logical address.
[standby] {address} put the device with the given address in standby mode.
[la] {logical address} change the logical address of the CEC adapter.
[p] {device} {port} change the HDMI port number of the CEC adapter.
[pa] {physical address} change the physical address of the CEC adapter.
[as] make the CEC adapter the active source.
[is] mark the CEC adapter as inactive source.
[osd] {addr} {string} set OSD message on the specified device.
[ver] {addr} get the CEC version of the specified device.
[ven] {addr} get the vendor ID of the specified device.
[lang] {addr} get the menu language of the specified device.
[pow] {addr} get the power status of the specified device.
[name] {addr} get the OSD name of the specified device.
[poll] {addr} poll the specified device.
[lad] lists active devices on the bus
[ad] {addr} checks whether the specified device is active.
[at] {type} checks whether the specified device type is active.
[sp] {addr} makes the specified physical address active.
[spl] {addr} makes the specified logical address active.
[volup] send a volume up command to the amp if present
[voldown] send a volume down command to the amp if present
[mute] send a mute/unmute command to the amp if present
[self] show the list of addresses controlled by libCEC
[scan] scan the CEC bus and display device info
[mon] {1|0} enable or disable CEC bus monitoring.
[log] {1 - 31} change the log level. see cectypes.h for values.
[ping] send a ping command to the CEC adapter.
[bl] to let the adapter enter the bootloader, to upgrade
the flash rom.
[r] reconnect to the CEC adapter.
[h] or [help] show this help.
[q] or [quit] to quit the CEC test client and switch off all
connected CEC devices.
================================================================================
r00tat danke für die libCEC Implementierung, die Alarmüberprüfung bei mehreren Alarmen und die Inkludierung der blaulichtSMS Infos.
Dieses Projekt ist unter der MIT License veröffentlicht. (siehe LICENSE)
Zusätzlich zur Anwendung selbst sind hier noch weitere sinnvolle Maßnahmen gelistet.
- ssh Zugang
- VNC Server
- ssh Zugang über remot3.it oder mittels Port Forwarding
-
Installieren von unclutter zum Ausblenden des Mauszeigers:
sudo apt install unclutter echo "@unclutter -d :0" >> ~/.config/lxsession/LXDE-pi/autostart
Nach einem Neustart wird der Mauszeiger nach 5 Sekunden Inaktivität ausgeblendet.
-
Installieren von xscreensaver zum Deaktivieren des Bildschirm schonens. Eine Beschreibung findet man auf raspberrypi.org
-
Bei Problemen mit der Erkennung des HDMI Gerätes aktivieren von HDMI Hotplug wie hier beschrieben.
-
Installieren von unattended-upgrades via
sudo apt install unattended-upgrades
zum automatischen Installieren von Sicherheitsupdates.
-
Ändern des Standard-Benutzers, erlauben von SSH nur mit Schlüsseln, installieren einer Firewall und von fail2ban wie hier beschrieben.
Achtung: Um auf Netzwerkgeräte zugreifen zu können muss ein User in der netdev Gruppe sein. Um auf den HDMI Controller zugreifen zu können muss ein User in der Gruppe video sein.
-
Die Konfigurationsdateien und die Logdateien enthalten sensible Daten und sollten nur berechtigte User lesbar sein.
Folgendes Berechtigungsschema ist für den User, welcher bei der Konfiguration festgelegt wird, sinnvoll:
sudo chown -R <username>:<usergroup> . sudo find . -type f -exec chmod 640 {} \; sudo chmod 740 INSTALL UNINSTALL sudo chmod 644 LICENSE README.md
Die Funktionalität der Anwendung ist mit folgenden Komponenten getestet:
- Raspberry Pi 3b
- Raspberry Pi Zero W
- Raspbian Raspbian Desktop Download
- Samsung TV LE40B530P7W
Für Fragen und Probleme (Bugs, Feature requests, ...) bitte ein Issue erstellen. Da es sich um ein reines Hobbyprojekt handelt wird das Projekt nur sehr sporadisch gewartet und weiterentwickelt. Bitte um Verständnis dafür.