Smart Home openHAB Installation Teil 4 – Monitoring / Systemsteuerung
Update 12.11.2020
Ab Dezember 2020 habe ich das Glück, ein Eigenheim zu besitzen. Mit dem Umzug werde ich mein Smart Home zukünftig mit Home Assistant steuern, sodass die Serie Smart Home openHAB Installation nicht länger fortgeführt und gepflegt wird.
In Teil 4 meiner Reihe Smart Home openHAB Installation möchte ich ein rudimentäres Monitoring meiner Smart Home Geräte inkl. des openHAB Server selbst implementieren. Zudem möchte ich den openHAB Server über die Sitemap steuern können (Dienste und System).
Dazu verwende ich drei Bindings:
- Network
- Systeminfo
- Exec
Binding: Network
Das Network Binding dient dazu, Geräte per Ping zu monitoren. Dabei wird einerseits geprüft, ob das Gerät online ist, andererseits die Antwortzeit. Ein weiteres Feature ist ein Check der Internet Geschwindigkeit (letztere Funktion verwende ich aber aktuell nicht).
$OPENHAB_CONF/things/network.things
Thing network:pingdevice:server1 "Network Device: Server 1" [ hostname="xxx.xxx.1.1", retry=1, timeout=5000, refreshInterval=60000 ] Thing network:pingdevice:server2 "Network Device: Server 2" [ hostname="xxx.xxx.1.2", retry=1, timeout=5000, refreshInterval=60000 ]
$OPENHAB_CONF/items/network.items
Switch Server1_OnlineState "Network Device: Server 1 Online Status" { channel="network:pingdevice:server1:online" } Number:Time Server1_ResponseTime "Network Device: Server 1 Response Time" { channel="network:pingdevice:server1:latency" } DateTime Server1_LastSeen "Network Device: Server 1 Last Seen" { channel="network:pingdevice:server1:lastseen" }
$OPENHAB_CONF/sitemaps/home.sitemap
Abschließend konfiguriere ich meine Sitemap. Hier lege ich einen Eintrag für den Online Status an, auf den man weiterklicken kann zu den Details:
Frame label="Monitoring" { Text item=Server1_OnlineState label="Server 1 [%s]" icon="network" { Text item=Server1_ResponseTime label="Antwortzeit [%s ms]" icon="qualityofservice" Text item=Server1_LastSeen label="Letzter Kontakt [%1$td.%1$tm.%1$tY %1$tH:%1$tM]" icon="time" } }
Fehlermeldung: Execution failed (… Cannot run program „arping“)
Nach Abschluss der Installation und Konfiguration des Bindings sollte das openhab.log
auf den folgenden Fehler hin geprüft werden:
[WARN ] [lipse.smarthome.io.net.exec.ExecUtil] - Execution failed (Exit value: -559038737. Caused by java.io.IOException: Cannot run program "arping" (in directory "."): error=2, No such file or directory)
Wird der Fehler im Log protokolliert, fehlt das arping
Tool und der Pfad in der network.cfg
ist falsch. Das arping Tool kann über SSH einfach nachinstalliert werden:
sudo apt-get install arping
Danach muss in der network.cfg
der Wert für den binding.network:arpPingToolPath
Parameter entsprechend angepasst werden:
$OPENHAB_CONF/services/network.cfg
binding.network:arpPingToolPath=/usr/sbin/arping
Binding: Systeminfo
Mit dem Systeminfo Binding lassen sich lokale Parameter des openHAB Server – z.B. CPU, RAM, Disk, etc. – auslesen und in Sitemaps darstellen. Dabei lässt sich eine Vielzahl von Parametern durch einzelne Items auslesen, ich beschränke mich allerdings auf die wirklich sinnvollen, um das System zu überwachen. Werte wie z.B. „Display“ oder „Battery“ sind bei einem Server weniger interessant und da ich openHAB in einer VM laufen lasse, funktionieren einige Hardware Parameter nicht oder sind nicht aussagekräftig. Dementsprechend lege ich nicht für alle verfügbaren Channels auch Items an.
$OPENHAB_CONF/things/systeminfo.things
systeminfo:computer:oh2server [interval_high=3, interval_medium=60]
$OPENHAB_CONF/items/systeminfo.items
/* Network information*/ String Network_AdapterName "Systeminfo: OH2 Network Adapter Name" <network> { channel="systeminfo:computer:oh2server:network#networkDisplayName" } String Network_Name "Systeminfo: OH2 Network Name" <network> { channel="systeminfo:computer:oh2server:network#networkName" } String Network_Ip "Systeminfo: OH2 Network IP Address" <network> { channel="systeminfo:computer:oh2server:network#ip" } String Network_Mac "Systeminfo: OH2 Network Mac Address" <network> { channel="systeminfo:computer:oh2server:network#mac" } Number Network_DataSent "Systeminfo: OH2 Network Data Sent" <flowpipe> { channel="systeminfo:computer:oh2server:network#dataSent" } Number Network_DataReceived "Systeminfo: OH2 Network Data Received" <returnpipe> { channel="systeminfo:computer:oh2server:network#dataReceived" } Number Network_PacketsSent "Systeminfo: OH2 Network Packets Sent" <flowpipe> { channel="systeminfo:computer:oh2server:network#packetsSent" } Number Network_PacketsReceived "Systeminfo: OH2 Network Packets Received" <returnpipe> { channel="systeminfo:computer:oh2server:network#packetsReceived" } /* CPU information*/ String Cpu_Name "Systeminfo: OH2 CPU Name" <none> { channel="systeminfo:computer:oh2server:cpu#name" } String Cpu_Description "Systeminfo: OH2 CPU Description" <none> { channel="systeminfo:computer:oh2server:cpu#description" } Number Cpu_Load1 "Systeminfo: OH2 CPU Load (1 min)" <none> { channel="systeminfo:computer:oh2server:cpu#load1" } Number Cpu_Load5 "Systeminfo: OH2 CPU Load (5 min)" <none> { channel="systeminfo:computer:oh2server:cpu#load5" } Number Cpu_Load15 "Systeminfo: OH2 CPU Load (15 min)" <none> { channel="systeminfo:computer:oh2server:cpu#load15" } Number Cpu_Threads "Systeminfo: OH2 CPU Threads" <none> { channel="systeminfo:computer:oh2server:cpu#threads" } Number Cpu_Uptime "Systeminfo: OH2 CPU Uptime" <time> { channel="systeminfo:computer:oh2server:cpu#uptime" } /* Storage information*/ String Storage_Name "Systeminfo: OH2 Storage Name" <none> { channel="systeminfo:computer:oh2server:storage#name" } String Storage_Type "Systeminfo: OH2 Storage Type" <none> { channel="systeminfo:computer:oh2server:storage#type" } String Storage_Description "Systeminfo: OH2 Storage Description" <none> { channel="systeminfo:computer:oh2server:storage#description" } Number Storage_Total "Systeminfo: OH2 Storage Total" <none> { channel="systeminfo:computer:oh2server:storage#total" } Number Storage_Available "Systeminfo: OH2 Storage Available" <none> { channel="systeminfo:computer:oh2server:storage#available" } Number Storage_Used "Systeminfo: OH2 Storage Used" <none> { channel="systeminfo:computer:oh2server:storage#used" } Number Storage_AvailablePercent "Systeminfo: OH2 Storage Available (%)" <none> { channel="systeminfo:computer:oh2server:storage#availablePercent" } Number Storage_UsedPercent "Systeminfo: OH2 Storage Used (%)" <none> { channel="systeminfo:computer:oh2server:storage#usedPercent" } /* Memory information*/ Number Memory_Total "Systeminfo: OH2 Memory Total" <none> { channel="systeminfo:computer:oh2server:memory#total" } Number Memory_Available "Systeminfo: OH2 Memory Available" <none> { channel="systeminfo:computer:oh2server:memory#available" } Number Memory_Used "Systeminfo: OH2 Memory Used" <none> { channel="systeminfo:computer:oh2server:memory#used" } Number Memory_AvailablePercent "Systeminfo: OH2 Memory Available (%)" <none> { channel="systeminfo:computer:oh2server:memory#availablePercent" } Number Memory_UsedPercent "Systeminfo: OH2 Memory Used (%)" <none> { channel="systeminfo:computer:oh2server:memory#usedPercent" } /* Swap memory information*/ Number Swap_Total "Systeminfo: OH2 Swap Memory Total" <none> { channel="systeminfo:computer:oh2server:swap#total" } Number Swap_Available "Systeminfo: OH2 Swap Memory Available" <none> { channel="systeminfo:computer:oh2server:swap#available" } Number Swap_Used "Systeminfo: OH2 Swap Memory Used" <none> { channel="systeminfo:computer:oh2server:swap#used" } Number Swap_AvailablePercent "Systeminfo: OH2 Swap Memory Available (%)" <none> { channel="systeminfo:computer:oh2server:swap#availablePercent" } Number Swap_UsedPercent "Systeminfo: OH2 Swap Memory Used (%)" <none> { channel="systeminfo:computer:oh2server:swap#usedPercent" } /* Sensors information*/ Number Sensor_CpuTemp "Systeminfo: OH2 CPU Temperature" <temperature> { channel="systeminfo:computer:oh2server:sensors#cpuTemp" } Number Sensor_CpuVoltage "Systeminfo: OH2 CPU Voltage" <energy> { channel="systeminfo:computer:oh2server:sensors#cpuVoltage" } Number Sensor_FanSpeed "Systeminfo: OH2 Fan speed" <fan> { channel="systeminfo:computer:oh2server:sensors#fanSpeed" } /* Process information*/ Number Process_Load "Systeminfo: OH2 Process Load" <none> { channel="systeminfo:computer:oh2server:process#load" } Number Process_Used "Systeminfo: OH2 Process Used" <none> { channel="systeminfo:computer:oh2server:process#used" } String Process_Name "Systeminfo: OH2 Process Name" <none> { channel="systeminfo:computer:oh2server:process#name" } Number Process_Threads "Systeminfo: OH2 Process Threads" <none> { channel="systeminfo:computer:oh2server:process#threads" } String Process_Path "Systeminfo: OH2 Process Path" <none> { channel="systeminfo:computer:oh2server:process#path" }
$OPENHAB_CONF/sitemaps/home.sitemap
Abschließend konfiguriere ich meine Sitemap. Hier lege ich einen Eintrag für den Online Status an, auf den man weiterklicken kann zu den Details:
Frame label="openHAB 2 Server" { Text label="Server Status" { Group item=Systeminfo_Cpu label="Prozessor" icon="systeminfo_cpu" { Default item=Cpu_Load1 label="CPU Auslastung (1 Min.)" icon="systeminfo_cpu" Default item=Cpu_Load5 label="CPU Auslastung (5 Min.)" icon="systeminfo_cpu" Default item=Cpu_Load15 label="CPU Auslastung (15 Min.)" icon="systeminfo_cpu" Default item=Cpu_Threads label="Threads" icon="none" Default item=Cpu_Uptime label="CPU Uptime" icon="time" Default item=Sensor_CpuTemp label="CPU Temperatur" icon="temperature" Default item=Sensor_CpuVoltage label="CPU Spannung" icon="energy" } Group item=Systeminfo_Memory label="Arbeitsspeicher" icon="systeminfo_memory" { Default item=Memory_Total label="RAM gesamt" icon="systeminfo_memory" Default item=Memory_UsedPercent label="RAM verwendet (%)" icon="systeminfo_memory" Default item=Memory_AvailablePercent label="RAM verfügbar (%)" icon="systeminfo_memory" } Group item=Systeminfo_Storage label="Festplattenspeicher" icon="systeminfo_storage" { Default item=Storage_Total label="HDD gesamt" icon="systeminfo_storage" Default item=Storage_UsedPercent label="HDD verwendet (%)" icon="systeminfo_storage" Default item=Storage_AvailablePercent label="HDD verfügbar (%)" icon="systeminfo_storage" } Group item=Systeminfo_Network label="Netzwerk" icon="systeminfo_network" { Default item=Network_Ip label="IP Adresse" icon="network" Default item=Network_Mac label="MAC Adresse" icon="network" Default item=Network_DataSent label="Daten gesendet" icon="flowpipe" Default item=Network_DataReceived label="Daten empfangen" icon="returnpipe" Default item=Network_PacketsSent label="Packete gesendet" icon="flowpipe" Default item=Network_PacketsReceived label="Packete empfangen" icon="returnpipe" } } }
Binding: Exec
Das Exec Binding ermöglicht es, Befehle/Commands/Scripts auf Betriebssystem-Ebene auszuführen. Ich verwende es vorrangig, um den openHAB Server über die Sitemap, bzw. die App zu steuern. In den folgenden Zeilen möchte ich es einrichten, den openHAB Dienst über einen Button auf der Sitemap neu zu starten, sowie das ganze System zu rebooten oder auszuschalten. Das erspart mit das lästige einloggen per SSH auf den Server und funktioniert dank der openHAB-Cloud auch von unterwegs.
Da das Unterfangen Systembefehle beinhaltet, die ein sudo
benötigen, darf da natürlich keine Passwortabfrage erforderlich sein:
sudo systemctl restart openhab2.service sudo shutdown sudo reboot
In der openHAB App oder in den UIs kommt natürlich kein Popup für ein Passwort, weswegen ich es meinem openHAB Benutzer einrichten muss, dass er die benötigten Befehl ohne Passwortabfrage für sudo
ausführen darf. Dazu logge ich mich per SSH auf dem Server ein und editiere eine sudoers.d
Datei (oder lege sie neu an) mit dem visudo
Tool (normales vi
oder nano
funktioniert hier nicht):
sudo visudo -f /etc/sudoers.d/oh2
In der Datei erstelle ich folgenden Eintrag:
openhab ALL=(ALL) NOPASSWD: /bin/systemctl restart openhab2.service, /sbin/shutdown, /sbin/reboot
Die durch Komma getrennten Werte am Ende der Zeile (ab NOPASSWD:
) geben die Befehle ein, die der User ohne Passworteingabe ausführen darf. Möchte man dies nicht einschränken, reicht die Eingabe NOPASSWD: ALL
.
Nachdem das Ubuntu Betriebssystem nun soweit vorbereitet ist, geht’s an die openHAB Konfiguration.
$OPENHAB_CONF/things/exec.things
Für die beiden Funktionen OH2 Service und OH2 System lege ich zwei Things an, mit den entsprechenden Befehlen, die ausführt werden sollen. Der Parameter %2$s „vertritt“ dabei die Variable, die durch das Betätigen des Buttons in der Sitemap deklariert und aufgelöst wird. Der Autorun-Parameter bewirkt eine sofortige Ausführung des Befehls.
Thing exec:command:oh2server [command="sudo %2$s", autorun=true] Thing exec:command:oh2service [command="sudo /bin/systemctl %2$s openhab2.service", autorun=true]
$OPENHAB_CONF/items/exec.items
Für jedes der beiden Things ist ein Item anzulegen, dass durch den Channel input
eine Benutzereingabe über die Sitemap definiert.
String Exec_Ctrl_Oh2Server "Execute: openHAB 2 Server Reboot/Shutdown" <exec_restart> { channel="exec:command:oh2server:input" } String Exec_Ctrl_Oh2Service "Execute: openHAB 2 Service Restart" <exec_restart> { channel="exec:command:oh2service:input" }
$OPENHAB_CONF/sitemaps/home.sitemap
Abschließend werden die beiden Items in Form von Switches in der Sitemap angelegt. Die Steuerung lege ich als zusätzlichen Menüpunkt in meinem oben angelegten Frame openHAB 2 Server
an. Durch das Mapping werden die im Thing deklarierten Variablen befüllt und statt eines Switches werden Buttons eingeblendet mit dem jeweiligen Text.
Frame label="openHAB 2 Server" { ... <Systeminfo_Daten> ... Text label="Server Steuerung" { Switch item=Exec_Ctrl_Oh2Service label="OH2 Service" icon="exec_restart" mappings=[restart="Restart" ] Switch item=Exec_Ctrl_Oh2Server label="OH2 Server" icon="exec_restart" mappings=[reboot="Reboot", shutdown="Shutdown"] } }
Update 06.05.2020
Mit Version 2.5.2 wurde ein neues Sicherheitsfeature eingeführt, um zu vermeiden, dass Systembefehle unkontrolliert ausgeführt werden können. Daher müssen alle Befehle, die ausgeführt werden dürfen, in eine Whitelist-Datei eingetragen werden.
$OPENHAB_CONF/misc/exec.whitelist
sudo %2$s sudo /bin/systemctl %2$s openhab2.service