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: , , , ,


Comments: Kommentar veröffentlichen

<< Home

This page is powered by Blogger. Isn't yours?