16. Oktober 2020
OpenHAB2 - Mühsam ernährt sich das Eichhörnchen
Einige Notizen (keine vollständige Anleitung: bin selbst Anfänger) zu OpenHAB2, inkl. Backup
Die Einrichtung von OpenHAB2 nach der holprigen Installation ist erstmal nicht so schwierig, man bekommt es leicht ans Rennen. Aber:
- Die Software bringt ihre eigene Nomenklatur mit: Bindings, Services, Things, Items, Channels. Wozu das alles gut ist, habe ich bisher noch nicht verstanden.
- MQTT ist nicht ab Werk dabei und muss nachinstalliert werden
- Die Konfiguration ist völlig wir. Konfigurationsdateien? Gibt es an zwei verschiedenen Orten. Außerdem noch Paper UI für die Konfiguration. Wo speichert das die Konfiguration?
- Der Systemstart dauert extrem lange. 10 Minuten lang rödelt der Raspi auf 90% CPU, und das wo ich bisher nur eine Steckdose eingebunden habe...
Ich werde vermutlich auch Home Assistant ausprobieren. Das ist mir eh sympathischer, da Python-basiert.
Andererseits gefällt mir die Android APP von OpenHAB2, insb. die Möglichkeit, per Mikro (über Google Spracherkennung) Befehle an die Software zu übermitteln - auch wenn ich noch nicht weiß, was ich da noch konkret konfigurieren muss.
Ich habe bisher manuell folgende Konfigurationsdateien angelegt:
Zum Anlegen habe ich die Unterstützung des Sitemap Designers (oder so ähnlich) im Browser verwendet.
Datei /etc/openhab2/items/kronocken.items
Hier ist die bisher einzige Steckdose konfiguriert:
Group    Home                  "Kronocken"      <house>                                   ["Building"]
Group    GF                    "Erdgeschoss"    <groundfloor>   (Home)                    ["GroundFloor"]
Group    FF                    "Erster Stock"   <firstfloor>    (Home)                    ["FirstFloor"]
Group    C                     "Keller"         <cellar>        (Home)                    ["Basement"]
Group    OU                    "Draußen"        <garden>        (Home)                    ["Outdoor"]
Group    GF_LivingRoom         "Wohnzimmer"     <sofa>          (Home, GF)                ["LivingRoom"]
Group    GF_Kitchen            "Küche"          <kitchen>       (Home, GF)                ["Kitchen"]
Group    GF_Bathroom           "Badezimmer"     <bath>          (Home, GF)                ["Bathroom"]
Group    FF_Bedroom            "Schlafzimmer"   <bedroom>       (Home, FF)                ["Bedroom"]
Group    FF_KidsRoom           "Kinderzimmer"   <girl_3>        (Home, FF)                ["Room"]
Group    FF_Bathroom           "Badezimmer"     <bath>          (Home, FF)                ["Bathroom"]
Group    C_Basement            "Keller"         <cellar>        (Home, C)                 ["Basement"]
Group    OU_Driveway           "Auffahrt"                       (Home, OU)                ["Outdoor"]
Group    OU_Terrace            "Terrasse"       <terrace>       (Home, OU)                ["Terrace"]
Switch   GF_LivingRoom_Power   "Steckdose 1"      <poweroutlet>   (GF_LivingRoom, gPower)   ["Switch", "Switchable"]   {mqtt=">[mqtt_service:/cmnd/steckdose1:power:ON:1],>[mqtt_service:/cmnd/steckdose1:power:OFF:0]"}
Switch   FF_Bedroom_Power      "Steckdose 2"      <poweroutlet>   (FF_Bedroom, gPower)      ["Switch", "Switchable"]   {channel=""}
Group:Switch:OR(ON, OFF)   gPower   "Steckdose"   <poweroutlet>   (Home)   ["Switch", "Switchable"]
Datei /etc/openhab2/sitemaps/kronocken.sitemap
sitemap kronocken label="Kronocken" {
    Frame label="Erdgeschoss" icon="groundfloor" {
        Group item=GF_LivingRoom
        Group item=GF_Kitchen
        Group item=GF_Bathroom
    }
    Frame label="Erster Stock" icon="firstfloor" {
        Group item=FF_Bedroom
        Group item=FF_KidsRoom
        Group item=FF_Bathroom
    }
    Frame label="Keller" icon="cellar" {
        Group item=C_Basement
    }
    Frame label="Draußen" icon="garden" {
        Group item=OU_Driveway
        Group item=OU_Terrace
    }
    Frame {
        Text label="Steckdose" icon="poweroutlet" {
            Default item=GF_LivingRoom_Power label="Wohnzimmer"
            Default item=FF_Bedroom_Power label="Schlafzimmer"
        }
    }
}
Diverse andere Dateien...
... habe ich im Backup unter userdata/config/org/openhab gefunden. Das sind anscheinend die Dateien mit Konfigurationsdaten, die ich im"Paper UI" angelegt habe. Dazu gehört unter anderem die Datei mqtt.config mit dem Inhalt
:org.apache.felix.configadmin.revision:=L"1"
broker.pwd="openhabian"
broker.url="tcp://localhost:1883"
broker.user="openhabian"
service.pid="org.openhab.mqtt"
Sprich, hier ist der MQTT Broker konfiguriert, den ich über das MQTT Binding definiert habe.
Die Datei addons.config enthält die Liste der installierten Add-Ons.
Backup und Restore
Mit Hilfe von Skripten auf Windows- und Linux-Seite und ssh habe ich eine einfache Backup- und Restore-Möglichkeit gefunden (hoffe ich...).
Windows-Seite
Skript backup.cmd
@echo off
setlocal
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,14%
ssh -i .ssh\id_rsa pi@192.168.178.21 -t "backup"
scp -i .ssh\id_rsa pi@192.168.178.21:/home/pi/openhab-backup.zip backups\backup-%ldt%.zip
set DATEIGROESSE=0
for %%I in (backups\backup-%ldt%.zip) do set DATEIGROESSE=%%~zI
if not exist backups\backup-%ldt%.zip echo Backup ist fehlgeschlagen - Backup-Datei fehlt && goto :fehler
if %DATEIGROESSE% EQU 0 echo Backup ist fehlgeschlagen - Backup-Datei ist leer. && goto :fehler
if %DATEIGROESSE% GTR 0 echo Backup erfolgreich, Dateigroesse %DATEIGROESSE%
endlocal
goto :EOF
:fehler
endlocal
exit /b 1
Skript restore.cmd
@echo off
setlocal
set backup_file=%1
if not defined backup_file echo Bitte eine Datei aus backups\ als Parameter beim Aufruf angeben && goto :fehler
if not exist %backup_file% echo Backup ist fehlgeschlagen - Backup-Datei fehlt && goto :fehler
scp -i .ssh\id_rsa %backup_file% pi@192.168.178.21:/home/pi/openhab-backup.zip
if errorlevel 1 echo SCP ist fehlgeschlagen. && goto :fehler
ssh -i .ssh\id_rsa pi@192.168.178.21 -t "restore"
if errorlevel 1 echo Restore ist fehlgeschlagen. && goto :fehler
echo Fertig.
endlocal
goto :EOF
:fehler
endlocal
exit /b 1
Linux-Seite
Datei /home/pi/.ssh/authorized_keys
command="/home/pi/openhab-backup",no-agent-forwarding,no-port-forwarding ssh-rsa AAA...
Datei /home/pi/openhab-backup
#!/bin/bash
. /etc/profile.d/openhab2.sh
#echo "Befehl: $SSH_ORIGINAL_COMMAND"
case "$SSH_ORIGINAL_COMMAND" in
    "backup")
        sudo $OPENHAB_RUNTIME/bin/backup openhab-backup.zip
        sudo chown pi openhab-backup.zip
        ;;
    "scp -f /home/pi/openhab-backup.zip")
        $SSH_ORIGINAL_COMMAND
        ;;
    "scp -t /home/pi/openhab-backup.zip")
        $SSH_ORIGINAL_COMMAND
        ;;
    "restore")
        echo  Das wird mehrere Minuten dauern...
        sudo systemctl stop openhab2
        sudo $OPENHAB_RUNTIME/bin/restore openhab-backup.zip
        sudo systemctl start openhab2
        echo Fertig.
        ;;
    *)
        echo "Access denied: $SSH_ORIGINAL_COMMAND"
        exit 1
        ;;
esac
Sinn und Zweck der Dateien
Die Datei .ssh/authorized_keys (in der ab "ssh-rsa" alles aus der id_rsa.pub von der Windows-Seite kopiert ist) sorgt dafür, dass mit diesem Schlüsselpaar nur genau das Skript openhab-backup ohne Kennworteingabe ausgeführt werden kann. Innerhalb von openhab-backup wird mit $SSH_ORIGINAL_COMMAND auf das vom Windows-Client übergebene Kommando zugegriffen. Nur ganz bestimmte Kommandos sind erlaubt. Die OpenHAB-Umgebungsvariablen werden zu Beginn aus der Datei /etc/profile.d/openhab2.sh ausgelesen, insb. damit $OPENHAB_RUNTIME definiert ist. Die scp -f und scp -t Befehle sind für Backup (Übertragung from server to client) und Restore der Datei (Übertragung from client to server) - so arbeitet scp intern.
Das Windows-Programm backup.cmd erlaubt ein Backup der OpenHAB-Konfiguration. Per ssh wird zunächst auf dem Linux-Rechner ein Backup angelegt und dieses dann per scp zum Windows-Rechner übertragen und dort im Verzeichnis backups abgelegt, wobei ein Zeitstempel im Dateinamen ergänzt wird.
Das Windows-Programm restore.cmd arbeitet sozusagen genau umgekehrt. Dabei muss aber der Dateiname der Backup-ZIP-Datei explizit angegeben werden.
Labels: Backup, OpenHAB 2, scp, Smart Home, ssh


