MQTT und Zigbee2mqtt als Docker installieren

Bei mir läuft zur zeit Home Assistant Docker, daher habe ich keine Möglichkeit Add-ons zu installieren.

Gestern habe ich zugbee2mqtt als Docker installiert.

docker rm --force zigbee2mqtt #remove old Container
docker run -it \
   --name zigbee2mqtt \
   --restart=unless-stopped \
   --device=/dev/serial/by-id/usb-ITEAD_SONOFF_Zigbee_3.0_USB_Dongle_Plus_V2_20230829141847-if00:/dev/ttyACM0 \
   -p 8080:8080 \
   -v /storage/zigbee2mqtt:/app/data \
   -v /run/udev:/run/udev:ro \
   -e TZ=Europe/Berlin \
	koenkk/zigbee2mqtt

Ich verwende zuerst immer docker run -it, um zu sehen, ob alles normal läuft, wenn ich zufrieden bin ändere ich -it zu -d
Die Zigbee2mqtt configuration.yaml sieht so aus.

homeassistant: false
frontend: true
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://localhost:1883
serial:
  port: /dev/ttyACM0
advanced:
  network_key:
    - 29
    - 228
    - 123
    - 20
    - 56
    - 233
    - 208
    - 75
    - 26
    - 176
    - 29
    - 234
    - 80
    - 24
    - 6
    - 164
  pan_id: 64465
  ext_pan_id:
    - 142
    - 202
    - 37
    - 98
    - 91
    - 42
    - 137
    - 110
  homeassistant_legacy_entity_attributes: false
  legacy_api: false
  legacy_availability_payload: false
device_options:
  legacy: false

hier der MQTT Broker

docker run -d \
	--name mqtt \
	-p 1883:1883 \
	-v /storage/zigbee2mqtt/mqtt:/mosquitto \
	eclipse-mosquitto

Der MQTT Broker startet ohne Fehlermeldungen die mosquitto.conf sieht so aus

persistence true
persistence_location /mosquitto/data/
log_type subscribe
log_type unsubscribe
log_type websockets
log_type error
log_type warning
log_type notice
log_type information
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout

# MQTT Default listener
listener 1883 0.0.0.0

# MQTT over WebSockets
listener 9001 0.0.0.0
protocol websockets

bei Starten von Zigbee2mqtt erhalte ich dieses Error


zigbee2mqtt
Using '/app/data' as data directory
Zigbee2MQTT:info  2023-11-02 14:17:12: Logging to console and directory: '/app/data/log/2023-11-02.14-17-12' filename: log.txt
Zigbee2MQTT:info  2023-11-02 14:17:12: Starting Zigbee2MQTT version 1.33.2 (commit #9996c93)
Zigbee2MQTT:info  2023-11-02 14:17:12: Starting zigbee-herdsman (0.21.0)
Assertion failed: Command (setConfigurationValue) returned unexpected state: [object Object]
Zigbee2MQTT:info  2023-11-02 14:17:17: zigbee-herdsman started (resumed)
Zigbee2MQTT:info  2023-11-02 14:17:17: Coordinator firmware version: '{"meta":{"maintrel":"1 ","majorrel":"7","minorrel":"3","product":12,"revision":"7.3.1.0 build 176"},"type":"EZSP v12"}'
Zigbee2MQTT:info  2023-11-02 14:17:17: Currently 0 devices are joined:
Zigbee2MQTT:info  2023-11-02 14:17:17: Zigbee: disabling joining new devices.
Zigbee2MQTT:info  2023-11-02 14:17:17: Connecting to MQTT server at mqtt://localhost:1883
Zigbee2MQTT:error 2023-11-02 14:17:17: MQTT error: connect ECONNREFUSED 127.0.0.1:1883
Zigbee2MQTT:error 2023-11-02 14:17:17: MQTT failed to connect, exiting...
Zigbee2MQTT:info  2023-11-02 14:17:17: Stopping zigbee-herdsman...
Zigbee2MQTT:info  2023-11-02 14:17:17: Stopped zigbee-herdsman

Weiß jemand zufällig, wo es hängt?

Ich hab es jetzt doch geschafft.

mit diesem Script, setzt man Zigbe2mqtt und Mqtt Docker auf.
ist für alle zu gebrauchen die Home Assistant auch als Docker laufen haben und nicht als OS.
Wurde für ZBDongle-E angepasst, wenn ihr einen anderen Gerät verwendet, dann müsst ihr die Zeilen 64, 69 anpassen.

Bei jedem ausführen, wird man aufgefordert einen pfad einzutragen. Dort werden die Zigbee2mqtt und Mqtt configs hinterlegt.

Dann werden alle angeschlossenen Geräte vorgeschlagen, eins muss ausgewählt werden.

Ab jetzt wird alles Automatisch Heruntergeladen, erstellt und gestartet.

Ich habe leider nur einen Sonoff Stick, somit kann ich die Funktion nicht testen, ob es bei mehreren Ports auch richtig alles anzeigt und weiter macht.

Docker Zigbe2mqtt Script.sh.yaml (4,4 KB)

ich kann hier keine .sh files hochladen, vor dem ausführen muss man .yaml entfernen

Hi @Kampfader ich habe das selbe Problem, allerdings habe ich HA als OS aufgesetzt. Ich hab mittlerweile homeassistent und mosquitto und z2m 3 Mal neu Aufgesetzt und habe immer die Fehlermeldung:

Assertion failed: Command (setConfigurationValue) returned unexpected state: [object Object]

Problem bei mir ist, dass ich übers Dashboard die Temperatur meiner Thermostate nicht mehr verändern kann. Wenn ich die Temperatur verändere, springt der Wert nach etwa 3s wieder zurück auf den ursprünglichen Wert.

Wenn du HA als OS betreibst, dann installiere z2m über das Addon Menü, nicht mein script verwenden.

Wenn man Home Assistant als Docker verwendet, hat man keine Addons.
Daher muss man jedes Addon über docker befehle installieren

1 „Gefällt mir“

Hallo, vielen Dank für das Script.

Ich stehe gerade vor ähnlicher Herausfoderung, die sich nur etwas unterscheidet. Ich habe HA als Docker (ohne AddOns) eingerichtet und auch Z2M und den MQTT Broker jeweils als Docker laufen. Das funktioniert bei mir auch soweit, und alles startet ohne Fehler.

HA ist als Host eingerichtet, die anderen beiden nicht.

Nun meine Frage (Ich vermute, dass Script brauche ich dabei gar nicht):
Wie verbinde ich HA dann mit dem Broker? Muss in HA (MQTT habe ich dort installiert) die IP des Brokers oder von Z2M angeben?

[EDIT]:
Ich meine den Port des Brokers. Ich werde es versuchen. Vielen Dank. :slight_smile:

Ok, ich kapituliere. Ich kriege es nicht hin. :frowning:

  • HA Container funktioniert und arbeitet aktuell mit ZHA
  • Z2M startet ohne Fehler und scheint auch in den “such” Modus zu wechseln
  • MQTT startet mit einem Hinweis, dass die DB nicht die richtigen Berechtigungen hat, aber trotzdem funktionieren sollte

Hier ist die Meldung:

Warning: File /mosquitto/data/mosquitto.db.new has world readable permissions. Future versions will refuse to load this file.
To fix this, use `chmod 0700 /mosquitto/data/mosquitto.db.new`.

MQTT Broker scheint auch mit Z2M verbunden, so verstehe ich es zumindest.
Aber HA bekomme ich mit dem Broker nicht verbunden.

Ich hatte mir das Video von Simon42 zur Migration angeschaut und habe gehofft, dass es auch funktioniert, wenn ich unterschiedliche Container nutze. Aber Z2M findet beim anlernen nichts. Leider.

Vielleicht muss ich doch alle Geräte neu anlernen? Den Aufwand würde ich aber erst gern betreiben, wenn ich wirklich eine Verbindung zwischen HA und MQTT bekomme. Daran scheitert es derzeit. Kann mir da jemand helfen?

Ich habe HA als Host erstellt. MQTT und Z2M eben nicht.
Im MQTT AddOn im HA habe ich dann die IP des Host mit dem Port 1883 probiert. Vielleicht liegt es aber auch einfach am User? Kann das sein?

Ist es korrekt, das Z2M nicht wie bei Simon43 im Video zur Migration angegeben die Geräte findet, wenn die Netzwerkeinstellungen korrekt eingestellt sind?

Moin,

das ist eine Warnung, kein Fehler :wink:
Das sagt nur, dass die Rechte der Datenbankdatei zu offen ist und Rechte für jedermann hat.

Andersherum wird ein Schuh draus, Z2M verbindet sich mit dem Broker.

Welche IPs haben die denn weil wenn Du von HA keinen Ping auf den Docker mit MQTT machen kannst, dann kann sich da auch nichts verbinden.

Es kann alles Mögliche sein, dazu müsste man aber sehr viel mehr von Deiner Installation, Konfiguration sehen, um Dir helfen zu können!

Alleine schon wo Dein Docker läuft usw.

VG
Bernd

Vielen Dank erstmal.

So habe ich es auch verstanden und habe dem keine weitere Beachtung geschenkt (erstmal).

Ping habe ich gar nicht ausprobiert, guter Hinweis. HA hat die IP des Host Systems, also 192.168.178.x.
MQTT, also der Broker, hat eine interne Docker IP (172.0.0.3). Allerdings habe ich ja den Port nach außen gemappt, so dass ich doch über die Host-IP mit dem Port drauf zugreifen müsste. Oder nicht?

Ich habe Docker auf einer Synology DS installiert.
HA, Z2M und MQTT: Das ganze mit docker-compose.yml Dateien eingerichtet.

Hier die Inhalte der docker-compose für Z2M und MQTT:

version: '3'

services:

  zigbee2mqtt:
    image: koenkk/zigbee2mqtt:latest
    container_name: z2m
    hostname: z2m
    ports:
      - 8888:8080
    volumes:
      - /volume1/docker/zigbee2mqtt/z2m/data:/app/data
      - /run/udev:/run/udev:ro
    environment:
      - TZ=Europe/Berlin
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
    labels:
      - "com.centurylinklabs.watchtower.monitor-only=true"
    restart: unless-stopped

  mqtt:
    image: eclipse-mosquitto:latest
    container_name: mqtt
    hostname: mqtt
    ports:
      - "1883:1883"
      - "9001:9001"
    volumes:
      - /volume1/docker/zigbee2mqtt/mqtt/config:/mosquitto/config
      - /volume1/docker/zigbee2mqtt/mqtt/data:/mosquitto/data
      - /volume1/docker/zigbee2mqtt/mqtt/log:/mosquitto/log
#      - /volume1/docker/zigbee2mqtt/mqtt/mqtt_config/mosquitto.conf:/mosquitto/config/mosquitto.conf
#    command: "mosquitto -c /mosquitto-no-auth.conf"    
    labels:
      - "com.centurylinklabs.watchtower.monitor-only=true"
    restart: unless-stopped

Hier die Config von MQTT:

listener 1883
## protocol websockets ##
persistence true
persistence_location /mosquitto/data
log_dest file /mosquitto/log/mqtt.log
allow_anonymous false
password_file /mosquitto/config/passwd.txt

Und hier die config von Z2M:

homeassistant: true
frontend: true
permit_join: true
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://172.0.0.3:1883
  user: mqtt-USER
  password: mqtt-PW
serial:
  port: /dev/ttyUSB0
advanced:
  network_key:
    - 224
    - 151
    - 170
    - 173
    - 181
    - 175
    - 82
    - 69
    - 46
    - 233
    - 87
    - 243
    - 124
    - 118
    - 66
    - 55
  pan_id: 56019
  ext_pan_id:
    - 200
    - 177
    - 159
    - 103
    - 175
    - 187
    - 133
    - 233
  homeassistant_legacy_entity_attributes: false
  legacy_api: false
  legacy_availability_payload: false
  channel: 25
device_options:
  legacy: false

Moin,

so mit den Informationen sollte das ja dann korrekt sein.

Das sollte schon mal passen.

Du hast im MQTT Broker ein Passwort angegeben?

  user: mqtt-USER
  password: mqtt-PW

Die verwendest Du auch in HA?

Du kannst ja auch schauen, ob der Port auf der Synology geöffnet ist, mittels Portscan.

VG
Bernd

1 „Gefällt mir“

Vielen Dank nochmal. Meine Vermutung und Dein Hinweis nochmal waren richtig. Irgendwie scheine ich bei der Eingabe des Users etwas falsch gemacht zu haben. Es lag am User. Nun bekomme ich auch die Verbindung zustande.

Dazu hätte ich aber tatsächlich noch eine Frage:
Der Benutzer ist ja der, den auch Z2M (Zigbee2MQTT) nutzt. Können die sich wirklich einen User teilen, oder sollte man da für beide getrennte Nutzer anlegen?

Jetzt muss ich bei Z2M nur noch das mit dem Netzwerk lösen, damit die Geräte gefunden werden und ich ggf. nicht alles neu anlernen muss. Das wäre echt super. Schaue ich mir später noch an.

Kannst du machen, wie du willst. Ich z.B. nutze nur den einen mqtt Nutzer.

1 „Gefällt mir“

Moin,

ich nutze kein Mosquitto, ich nutze EMQX, da habe ich für den Admin, einen User und einen User für alle Clients, die sich mit dem Broker verbinden.
Aber so wie Du, das aktuell machst, ist das ok.

Das verstehe ich nicht, kannst Du das Problem noch mal beschreiben?

VG
Bernd

1 „Gefällt mir“

Super, vielen Dank Euch beiden.

Was ich damit meine ist folgendes:
Simon42 hat ein Video zum Wechsel von ZHA zu Z2M auf YT veröffentlicht, wo er beschreibt, wie man mit etwas Handarbeit die Geräte von ZHA auf Z2M “migrieren” kann. (siehe hier: https://www.youtube.com/watch?v=B8bgC1CM8fY)

(Ich habe aktuell noch ZHA im Einsatz und dort 27 Geräte angelernt.)

Klar sagt er, dass es keine echte Migration ist, aber es erleichtert den Umstieg, da (so verstehe ich es) nicht alle Geräte neu angelernt werden müssen.

Dazu soll man die Netzwerkdaten aus dem ZHA Netzwerk (PanID, externalID und network_key) von ZHA auf Z2M übertragen. Anschließend soll die Suche nach Geräten in Z2M wieder alle Stromgenutzen Geräte direkt anzeigen, ohne sie neu anlernen zu müssen.

Ich versuche nun also den Z2M Container mit den ursprünglichen Netzwerkangaben von ZHA zu starten, so dass im ersten Suchdurchlauf gleich die festinstallierten Geräte gefunden werden.

Dazu habe ich eine configuration.yaml Datei angelegt, die die Daten für den ersten Start enthalten:

# Let Zigbee2MQTT generate a new network key on first start
advanced:
  network_key: [0xc5, 0x78, 0xc8, 0x4d, 0x9b, 0xd5, 0xd4, 0x4d, 0x06, 0x7c, 0x7b, 0xcd, 0x8b, 0xfe, 0x4a, 0x38]
  pan_id: 0x7887
  ext_pan_id: [0x73, 0x21, 0x78, 0x73, 0x20, 0x9b, 0xb4, 0xf9]
  channel: 25

Ich habe nur gerade die Befürchtung, dass die nicht korrekt gezogen wird.

Moin,

meine Meinung, lass das, das birgt mehr Probleme, als dass es Dir Zeit einspart.
Entferne die Geräte aus ZHA, lösche ZHA, dann lerne die Geräte neu in Z2M an.

VG
Bernd

1 „Gefällt mir“

Für 27 Geräte würde ich mir den Stress auch nicht antun und die Geräte unter z2m neu pairen.

Danke. Ich befürchte das Ihr recht habt. Ich hatte es mir nur einfacher vorgestellt, weil ich einige Geräte wirklich verbaut habe und dafür erstmal wieder Schubladen ausbauen muss, um an die Geräte heranzukommen.

Ich hatte es gerade auch versucht, und bin zumindest soweit gekommen, dass das Netzwerk übernommen wird. Dann bekomme ich aber den Fehler, dass das Netzwerk irgendwo schon existiert und die panID verwendet wird. Vielleicht sollte ich mich damit nicht weiter beschäftigen. :frowning: