CCU-Historian im Container auf ThinClient

Da der CCU-Historian sehr viele Ressourcen benötigt, ist ein Betrieb außerhalb der CCU3 ein echter Performance-Schub. Dank Docker und vorgefertigten Containern ist der Betrieb auf einem ThinClient keine große Sache. Auch ein Umzug einer bestehenden CCU-Historian-Instanz ist ohne Weiteres möglich und wird nachfolgend beschrieben.

Vorbereitung#

Für den Umzug mit Datenübernahme müssen alle CCU-Historian-Instanzen für kurze Zeit gestoppt werden. Wenn alles gut vorbereitet ist, gehen nur wenige Stunden an Daten verloren.

Vorbereitung auf dem ThinClient#

Nach kurzer Recherche habe ich mich für das Docker-Image von jokay entschieden:

Den Download des Images kann man schon einmal starten: docker pull xjokay/ccu-historian

Anschließend muss die Datenablage vorbereitet werden.

Ich verwende gern bind-mount-Volumes für meine Container. So komme ich ohne weiteres auch “von außen” an die Daten heran.

Alle Docker-bezogenen Daten liegen auf einer separaten SSD, die mit Hilfe von btrfs-Volumes gemountet ist. Das Subvolume für die Daten ist unter /opt/docker-data eingebunden. Daher sind folgende Kommandos notwendig:

sudo mkdir -vp /opt/docker-data/homematic/ccu-historian/database
sudo mkdir -vp /opt/docker-data/homematic/ccu-historian/config
sudo chown -vR :docker /opt/docker-data/homematic
sudo chmod -vR g+w /opt/docker-data/homematic

Nun erzeugen und starten wir kurz den Container, damit dieser alle weiteren Strukturen unterhalb der vorbereiteten Verzeichnisse anlegen kann. Dabei konnte ich keine Konflikte mit meiner noch aktiven CCU-Historian-Instanz auf meiner CCU3 feststellen.

Wichtig ist, dass bei CONFIG_CCU_IP die IP-Adresse der CCU3 und bei CONFIG_HOST_IP die IP-Adresse des ThinClient eingetragen wird. Diese bekommt man beispielsweise mit dem Befehl id address show heraus, oder durch einen Blick in die Web-Oberfläche des Routers. Außerdem sollten die Optionen CONFIG_KEEP_MONTHS und CONFIG_MAINTENANCE nach eigenem Bedarf gesetzt werden. Mit dem Vorschlag unten werden alle Daten verworfen die älter als 36 Monate sind.

docker run --detach \
  --volume /opt/docker-data/homematic/ccu-historian/database:/database \
  --volume /opt/docker-data/homematic/ccu-historian/config:/opt/ccu-historian/config \
  --publish 80:80 \
  --publish 2098:2098 \
  --publish 2099:2099 \
  --publish 8082:8082 \
  --publish 9092:9092 \
  --publish 5435:5435 \
  --env TZ=Europe/Berlin \
  --env CONFIG_CCU_TYPE=CCU3 \
  --env CONFIG_CCU_IP=10.0.0.1  \
  --env CONFIG_HOST_IP=10.0.0.2 \
  --env CONFIG_HOST_BINRPCPORT=2099 \
  --env CONFIG_HOST_XMLRPCPORT=2098 \
  --env CONFIG_CCU_PLUGIN1_TYPE=CUXD \
  --env CONFIG_KEEP_MONTHS=36 \
  --name=CCU-Historian \
  docker.io/xjokay/ccu-historian:latest

Kurz nach dem (hoffentlich erfolgreichen) Start des Containers kann dieser mit docker stop CCU-Historian wieder gestoppt werden.

Vorbereitung auf der CCU3#

Die ersten beiden Schritte verstehen sich von selbst.

  1. Backup einer vorhandenen CCU-Historian-Datenbank
  2. Backup der CCU3

Für den externen CCU-Historian müssen zudem einige Ports freigegeben werden. Meine Wahl fiel nach dem Studium der Dokumentation1 auf:

8701;
8181;
2010;
2002;
2001;
2000;

Als letzten Schritt sichert man sich die Konfiguration der CCU-Historian-Instanz auf der CCU3, um Teile davon bei Bedarf auf den ThinClient zu übernehmen. An die Konfiguration gelangt man beispielsweise per SSH (Putty). Nach dem Einloggen auf der CCU3 einfach

cat /usr/local/addons/ccu-historian/ccu-historian.config

ausführen und das Ergebnis in eine lokale Textdatei kopieren.

Der Umzug#

Dieser Artikel konzentriert sich auf den Umzug mit Datenübernahme. Zudem wird davon ausgegangen, dass sich die zu übernehmende Historian-Datenbank auf einem externen Speichermedium befindet.

Für einen Umzug ohne Datenübernahme kann direkt zu Container als Produktiv-System starten gesprungen werden.

Umzug mit Datenübernahme#

Für den Umzug müssen die CCU-Historian-Instanz auf dem CCU3 und der Container auf dem ThinClient zumindest gestoppt sein. Ich empfehle, die CCU3 herunterzufahren, um die Fehlerquellen zu minimieren.

Für die Übernahme der Daten von der CCU3 auf den ThinClient kann die Datenbank einfach kopiert werden. Dadurch hat der Container über den gleichen Datenstand wie die CCU-Historian-Instanz auf der CCU3 und es geht fast nahtlos weiter.

Nach dem Herunterfahren der CCU3 wird das Speichermedium entfernt und an den ThinClient angeschlossen. Nach dem Anstecken (beispielsweise des bisher verwendeten USB-Sticks) muss dieser eingebunden (gemountet) werden. Dazu wird udisksctl empfohlen.

udisksctl mount --block-device /dev/sdc1

Der Name des Block-Device kann z.B. mit Hilfe von sudo dmesg ermittelt werden. In den letzten Zeilen der Ausgabe sollte etwas von Attached und sd stehen. In diesem Bereich wird sich auch der Name der Partition, zB. sdc1 finden. Alternativ bietet sich ein Blick in die Einträge unter /dev/disk/ an:

sudo ls -la /dev/disk/*

Nach erfolgreichem Ausführen von udisksctl erhält man eine Ausgabe wie Mounted /dev/sdc1 at /run/media/<user>/<label>, wobei <user> der aktuelle Nutzername und <label> ein dem Block-Device zugeordneter Name sind.

Nun kann die Datenbank einfach kopieren werden, wobei eine bestehende Datenbank unter /opt/docker-data/homematic/ccu-historian/database/ überschrieben werden kann.

cp -vf /run/media/<user>/<label>/ccu-historian/history.mv.db /opt/docker-data/homematic/ccu-historian/database/

Das Speichermedium muss vor dem Entfernen freigegeben werden. Dazu wird erneut udiskctl genutzt:

udisksctl unmount --block-device /dev/sdc1

Das Speichermedium kann nun wieder an die CCU3 gesteckt werden, um Komplikationen beim Neustart der CCU3 zu vermeiden.

Container als Produktiv-System starten#

Da der Container bereits beim Anlegen kurz gestartet wurde, existiert unter /opt/docker-data/homematic/ccu-historian/config eine Datei namens ccu-historian.config. Diese ist bereits mit Basisdaten gefüllt und kann nun an die eigenen Wünsche angepasst werden. Als Orientierung kann die von der CCU3 gesicherte ccu-historian.config verwendet werden. Beispiele für die Datenübernahme sind Einstellungen für Log-Dateien, Log-Level oder Menü-Links.

logSystem.fileLevel=Level.FINE
logSystem.fileName='/opt/ccu-historian/config/ccu-historian-%g.log'
logSystem.fileLimit=1000000
logSystem.fileCount=5
webServer.logLevel=Level.INFO
webServer.menuLinks.link1.text='H2-HighChart'
webServer.menuLinks.link1.address='/custom/h2-highchart/H2-HighChart.gy'

Sind alle Anpassungen übernommen, wird der Container gestartet:

docker start CCU-Historian

Nach dem Start werden je nach Konfiguration von CONFIG_KEEP_MONTHS und CONFIG_MAINTENANCE die Aktionen clean, recalc und compact ausgeführt.

Abschluss#

Spätestens jetzt kann die CCU3 wieder gestartet werden. Nach dem Start wird das CCU-Historian-Plugin deaktiviert, sodass ausschließlich in die Datenbank auf dem ThinClient geloggt wird.

Wenn sich der Betrieb mit externer CCU-Historian-Instanz als stabil erwiesen hat, kann das Plugin von der CCU3 entfernt werden, sodass auch nach einem Neustart der CCU3 keine Konflikte entstehen. Zudem kann das Speichermedium ausgeworfen (umount /dev/sda1) und abgezogen werden.