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

Die dazugehörigen Items am Beispiel von Server 1 lauten wie folgt:
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

Quellen:
https://www.openhab.org/
https://onesmarthome.de/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

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