Homegear auf docker - erste Schritte

Hallo

verschiedene Gründe haben mich dazu gebracht von homegear mit einem raspi 2, Stretch, ro filesystem auf einen raspi 3b+, buster und ssd umzusteigen. auch wollte ich jetzt docker nutzen.

Als homematic bidcos interface nutze ich den SCC - Stackable CC1101.

Die wichtigsten apps

  • homegear (stable)
  • eclipse mosquitto

docker Installation

  • curl -sSL https://get.docker.com | sh
  • sudo usermod -aG docker pi

homegear Installation
Im Wesentlichen folgte ich der Beschreibung: Docker Hub
wenn man genau liest steht auch alles Wichtige dort beschrieben.

Da ich nur mit dem user pi arbeite und nicht permanent als user root arbeiten möchte ein paar Änderungen:

Das Anlegen der Directories für homegear:

sudo mkdir -p /homegear-data/etc
sudo mkdir /homegear-data/lib
sudo mkdir /homegear-data/log

Docker Netzwerk für die Kommunikation zwischen homegear und mosquitto:

docker network create \
 --driver bridge \
 home-net

Der Vorteil eines eigenen docker Netzwerkes anstelle des default Netzwerkes besteht darin, dass die docker Container mit Namen untereinander kommunizieren können und keine IP’s angegeben werden müssen. (Networking with standalone containers | Docker Documentation)

Starten von homegear:

docker run -d \
 --restart always \
 -v /homegear-data/etc:/etc/homegear:Z \
 -v /homegear-data/lib:/var/lib/homegear:Z \
 -v /homegear-data/log:/var/log/homegear:Z \
 -v /sys:/sys \
 -e TZ=Europe/Berlin -e HOST_USER_ID=$(id -u) \
 -e HOST_USER_GID=$(id -g) \
 -p 2001:2001 \
 -p 2002:2002 \
 -p 2003:2003 \
 --device=/dev/ttyAMA0 \
 --name homegear \
 --hostname homegear \
 --network home-net \
 homegear/homegear:stable

Zur Erklärung - angepasst nach Kommentaren siehe unten:

  • --restart always erlaub das starten beim hochfahren des Raspi.
  • -v /sys:/sys ist notwendig um die GPIO pins aus dem docker container anzusprechen (SCC Modul)
  • --hostname homegear setzt den intern verwendeten hostname der docker Instanz (nicht zwingend notwendig - mach die instanz lesbarer)
  • --name homegear damit kann die docker Instanz mit einem Namen von anderen Instanzen aus adressiert werden (vom mosquitto container aus: ping homegear)
  • --network home-net hinzufügen zu einem Netzwerk
  • --rm würde den Container nach Beendigung löschen. Möchte ich aber nicht.

Starten von eclipse-mosquitto:
Für Interessierte. Durch das eigene Netzwerk, kann jetzt aus dem homegear container der mosquitto container mit dem Namen mosquito addressiert werden. Interessant für flows und mqtt Konfigurationen.

docker run -d \
 --restart always \
 -p 1883:1883 \
 -p 8883:8883 \
 -v /mosquitto-data/config:/mosquitto/config \
 -v /mosquitto-data/log:/mosquitto/log \
 -v /mosquitto-data/data:/mosquitto/data \
 --hostname mosquitto \
 --name mosquitto \
 --network home-net \
 eclipse-mosquitto

vielen Dank für die Hilfe des Forums :slight_smile:

3 Likes

Hallo @jipp,

sehr schöne Anleitung!

Viele Grüße

Sathya

@Sim, magst du das mit in die Doku aufnehmen oder in den Starterguide?

Anbei ein Beispiel für die ein Docker Compose setup incl. IPv6:
(docker: 20.10.1, docker-compose: 1.27.4)
ip6tables ist noch nicht 100% ausgereift, deshalb auf false, Siehe auch ip6tables command am Ende.

/etc/docker/daemon.json:

{
  "debug": false,
  "experimental": true,
  "ipv6": true,
  "ip6tables": false, 
  "bip": "192.168.1.1/24",
  "fixed-cidr-v6": "fd00:0:0:1::/64"
}

homegear.yml:

networks:
  homegear:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-homegear
    enable_ipv6: true
    ipam:
      config:
      - subnet: 192.168.2.0/24
      - subnet: fd00:0:0:2::/64
      driver: default
    name: homegear
services:
  homegear:
    container_name: homegear
    depends_on:
      mosquitto:
        condition: service_started
    devices:
# Anpassen je nach angeschlossenem Device
    - /dev/ttyAMA0:/dev/ttyAMA0
    - /dev/ttyACM0:/dev/ttyACM0
    environment:
# $(id -u) und $(id -g) müssen von Hand eingetragen werden da docker-compose nicht automatisch auswertet
      HOST_USER_GID: '1000'
      HOST_USER_ID: '1000'
      TZ: Europe/Berlin
    hostname: homegear
#    image: homegear/homegear:latest
    image: homegear/homegear:testing
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 2001
      target: 2001
    - protocol: tcp
      published: 2002
      target: 2002
    - protocol: tcp
      published: 2003
      target: 2003
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
    - /docker/homegear/etc:/etc/homegear:Z
    - /docker/homegear/lib:/var/lib/homegear:Z
    - /docker/homegear/log:/var/log/homegear:Z
    - /sys:/sys:rw
  mosquitto:
    container_name: mosquitto
    environment:
      TZ: Europe/Berlin
    hostname: mosquitto
    image: eclipse-mosquitto:latest
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 1883
      target: 1883
    - protocol: tcp
      published: 8883
      target: 8883
    restart: unless-stopped
    volumes:
    - /docker/mosquitto/config:/mosquitto/config:rw
    - /docker/mosquitto/data:/mosquitto/data:rw
    - /docker/mosquitto/log:/mosquitto/log:rw
version: '3'
  • Starten: docker-compose -f homegear.yml up -d
  • Stoppen: docker-compose -f homegear.yml down
  • Logs: docker-compose -f homegear.yml logs -f

IPv6 connect aus dem Container heraus benötigt:
ip6tables -t nat -A POSTROUTING -s fd00:0:0:2::/64 ! -o br-homegear -j MASQUERADE

/boot/cmdline.txt sollte das folgende beinhalten:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

2 Likes

Jein. hostname setzt den Host-Namen im Container, die Adressierung von außen geschieht aber über den Container-Namen (name).

Insofern kann der hostname-Parameter entfallen.

2 Likes

du hast recht.

name ist verantwortlich für die Erreichbarkeit mit Namen zwischen den docker Containern.
Trotzdem würde ich nicht auf hostname verzichten. Ich glaube das in der Admin UI der Systemname mit einer von Docker gewählten ID gesetzt wird.

Ein explizit gesatzer Hostname schadet nicht, insofern ist dein aktualisierter Hinweis im initialen Post völlig korrekt. Wie Du richtig bemerkst, wird er u.a. für die Anzeige im Admin UI verwendet (daran sieht man auch, dass ich ihn nicht gesetzt habe :slight_smile: )

Hallo @jipp,

darf ich das in die offizielle Doku übernehmen?

Viele Grüße

Sathya

Gerne
Bin ja froh etwas beizutragen :+1:

1 Like

Drin: Docker Hub

Hier ein Update der config von oben:

  • docker IPv6 Änderungen
  • healthcheck für homegear main Prozess, damit der Container automatisch neu startet falls der Hauptprozess sich beendet (danke an Neuer_User)
  • hinzufügen der port 80, 443 für spätere updates

Anbei ein Beispiel für die ein Docker Compose setup incl. IPv6:
(docker: 20.10.6, docker-compose: 1.29.0) ip6tables erzeugt automatisch die benötigten Filter für IPv6.

/etc/docker/daemon.json:

{
  "debug": false,
  "experimental": true,
  "ipv6": true,
  "ip6tables": true, 
  "bip": "192.168.1.1/24",
  "fixed-cidr-v6": "fd00:0:0:1::/64",
  "dns": ["192.168.178.1"]
}

homegear.yml:

networks:
  homegear:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-homegear
    enable_ipv6: true
    ipam:
      config:
      - subnet: 192.168.2.0/24
      - subnet: fd00:0:0:2::/64
      driver: default
    name: homegear
services:
  homegear:
    container_name: homegear
    depends_on:
      mosquitto:
        condition: service_started
    devices:
# Anpassen je nach angeschlossenem Device
    - /dev/ttyAMA0:/dev/ttyAMA0
    - /dev/ttyACM0:/dev/ttyACM0
    environment:
# $(id -u) und $(id -g) müssen von Hand eingetragen werden da docker-compose nicht automatisch auswertet
      HOST_USER_GID: '1000'
      HOST_USER_ID: '1000'
      TZ: Europe/Berlin
    healthcheck:
      test: ps -q `cat /var/run/homegear/homegear.pid` || bash -c 'kill -s 15 -1'
      interval: 10s
      timeout: 5s
      retries: 1
    hostname: homegear
#    image: homegear/homegear:latest
    image: homegear/homegear:testing
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 80
      target: 80
    - protocol: tcp
      published: 443
      target: 443
    - protocol: tcp
      published: 2001
      target: 2001
    - protocol: tcp
      published: 2002
      target: 2002
    - protocol: tcp
      published: 2003
      target: 2003
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
    - /docker/homegear/etc:/etc/homegear:Z
    - /docker/homegear/lib:/var/lib/homegear:Z
    - /docker/homegear/log:/var/log/homegear:Z
    - /sys:/sys:rw
  mosquitto:
    container_name: mosquitto
    environment:
      TZ: Europe/Berlin
    hostname: mosquitto
    image: eclipse-mosquitto:latest
    labels:
      docker.group: homegear
    networks:
      homegear: null
    ports:
    - protocol: tcp
      published: 1883
      target: 1883
    - protocol: tcp
      published: 8883
      target: 8883
    restart: unless-stopped
    volumes:
    - /docker/mosquitto/config:/mosquitto/config:rw
    - /docker/mosquitto/data:/mosquitto/data:rw
    - /docker/mosquitto/log:/mosquitto/log:rw
version: '3'
  • Starten: docker-compose -f homegear.yml up -d
  • Stoppen: docker-compose -f homegear.yml down
  • Logs: docker-compose -f homegear.yml logs -f

/boot/cmdline.txt sollte das folgende beinhalten:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Für IPv6 autoconfiguration sollte /usr/lib/dhcpcd/dhcpcd-hooks/99-sysctl erstellt werden und folgendes beinhalten (eth0 an das benutzte Interface anpassen):

sysctl net.ipv6.conf.eth0.accept_ra=2

Dies ist notwendig damit das Interface nicht nur nach einem Reboot, sondern auch später noch router advertisements empfangen kann.

Hallo Zusammen,

ich habe aktuell Homegear in der Version 0.7.45-3101 auf einer OpenHABian Installation im Einsatz. OpenHab läuft hier noch in der Version 2.5.

Nun möchte ich in Summe auf aktuelle Versionen wechseln und wenn es irgendwie geht, sowohl OpenHAB als auch Homegear unter Docker betreiben.

Das ganze wird auf einem Raspberry 4 laufen (was auch dem aktuellen Setup entspricht).

Zum Testen habe ich bereits einen weiteren Pi 4 mit aktuellen OS auf Basis von Bullseye sowie Docker inkl. Portainer aufgesetzt. OpenHAB läuft bereits im Container und hier habe ich auch schon testweise meine alte Config eingespielt - was gut aussieht.

Gestern habe ich nun auch einen Docker Container für Homegear aufgesetzt. Aber leider komme ich hier nicht wirklich weiter.
Nach Start des Containers (erstmal ohne meine alte Config) läuft der Container zwar, aber ich komme nicht auf die Web-Oberfläche. Noch habe ich am Test-Raspberry keinen USB-Stick zur Kommunikation mit den Homematic-Komponenten angeschlossen (den brauche ich ja noch für das aktuelle produktive System - inkl. Heizungs-Steuerung).

Frage 1: Wenn ich den Container ohne jegliche Config starte - sollte ich dann auf die Web-Oberfläche kommen?

Frage 2: Ich benötige mqtt nicht und würde diesen Teil gerne aus dem docker-compose rauslassen. Geht das oder gibt es hier Abhängigkeiten?

Frage 3: Wozu die spezifischen network-settings im compose-file? Ist es nicht ausreichen nach aussen die relevanten Ports zu mappen und dann mit der festen IP des PI’s zuzugreifen?

Aktuell versuche ich mit folgendem abgespeckten compose-file:

version: '3'
services:
  homegear:
    container_name: homegear
    environment:
      HOST_USER_GID: '1000'
      HOST_USER_ID: '1000'
      TZ: Europe/Berlin
    hostname: homegear
    image: homegear/homegear:latest
    ports:
    - protocol: tcp
      published: 8080
      target: 80
    - protocol: tcp
      published: 8443
      target: 443
    - protocol: tcp
      published: 2001
      target: 2001
    - protocol: tcp
      published: 2002
      target: 2002
    - protocol: tcp
      published: 2003
      target: 2003
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
    - /home/pi/docker/homegear/etc:/etc/homegear:Z
    - /home/pi/docker/homegear/lib:/var/lib/homegear:Z
    - /home/pi/docker/homegear/log:/var/log/homegear:Z
    - /sys:/sys:rw

Das Device (also den USB-Stick) würde ich dann aufnehmen, wenn er auch angeschlossen ist.
Sollte es auch mit diesem compose-file laufen?

Hat jemand die Konstellation OpenHAB3 und Homegear auf einem Raspberry mit Docker laufen und kann aushelfen?

Hallo

Ich geh die Fragen mal der Reihe nach durch.

  1. auch ohne config sollte das Web Interface erreichbar sein. Schicke bitte docker logs von dem Container. Es kann sein, dass die Anzahl der Threads überschritten ist.

  2. den mqtt Teil kannst du ruhig weglassen - dann auch die dependencies. Sieht auf den ersten Blick gut aus.

  3. Ich habe das Netzwerk explizit angegeben. Ansonsten nimmt sich docker selbstständig ein privates Netzwerk. Also ja - die Definition kann man weglassen, dann macht docker das automatisch.

USB Stick einbinden geht auch, dieser muss dann als Devise gemapt werden, da der Container sonst nicht darauf zugreifen kann.