From 348d70e71c543240878b72bf031bc9883014b2b8 Mon Sep 17 00:00:00 2001
From: Christian Elberfeld <6413499+elberfeld@users.noreply.github.com>
Date: Sat, 3 Aug 2024 17:23:01 +0200
Subject: [PATCH] Zigbee Adapter for Homeassistant

---
 group_vars/prod                               |  4 +++
 host_vars/ogg                                 |  1 +
 intern/docker_zigbee2mqtt/tasks/main.yml      | 32 +++++++++++++++++
 .../templates/data/configuration.yaml         | 36 +++++++++++++++++++
 .../templates/docker-compose.yml              | 26 ++++++++++++++
 site.yml                                      |  7 ++++
 .../etc/icinga/conf.d/hosts_manual.conf       |  8 +++++
 7 files changed, 114 insertions(+)
 create mode 100644 intern/docker_zigbee2mqtt/tasks/main.yml
 create mode 100644 intern/docker_zigbee2mqtt/templates/data/configuration.yaml
 create mode 100644 intern/docker_zigbee2mqtt/templates/docker-compose.yml

diff --git a/group_vars/prod b/group_vars/prod
index 7f47694c..187b24eb 100644
--- a/group_vars/prod
+++ b/group_vars/prod
@@ -122,6 +122,10 @@ eq3max:
     - { name: "E-Werkstatt-Mitte", id: "MEQ1814738" }
 #    - { name: "HeizungKlo", id: "OEQ0663079" }
 
+# SLZB-06 Zigbee Adapter 
+slzb06:
+  host: 192.168.0.16
+
 # Globale OAuth Server Settings
 oauth_global:
   authorize_url: https://uffd.warpzone.ms/oauth2/authorize
diff --git a/host_vars/ogg b/host_vars/ogg
index 1520fe2a..90b4d20f 100644
--- a/host_vars/ogg
+++ b/host_vars/ogg
@@ -69,6 +69,7 @@ alert:
     - { name: "tasmoadmin-app-1" }
     - { name: "traefik-app-1" }
     - { name: "watchtower-app-1" }
+    - { name: "zigbee2mqtt-app-1" }
   disks:
     - { mountpoint: "/", warn: "5 GB", crit: "1 GB" }
     - { mountpoint: "/srv", warn: "5 GB", crit: "1 GB" }
diff --git a/intern/docker_zigbee2mqtt/tasks/main.yml b/intern/docker_zigbee2mqtt/tasks/main.yml
new file mode 100644
index 00000000..17ea1582
--- /dev/null
+++ b/intern/docker_zigbee2mqtt/tasks/main.yml
@@ -0,0 +1,32 @@
+---
+
+- name: "create folder struct for {{ basedir }}"
+  file: 
+    path: "{{ item }}"
+    state: "directory"
+  with_items:
+    - "{{ basedir }}"
+    - "{{ basedir }}/data/"
+
+
+- name: "copy config files for {{ basedir }}"
+  template:
+    src: "{{ item }}"
+    dest: "{{ basedir }}/{{ item }}"
+  with_items:
+    - docker-compose.yml
+    - data/configuration.yaml
+  register: config_files
+
+
+- name: "stop {{ servicename }} docker"
+  community.docker.docker_compose_v2:
+    project_src: "{{ basedir }}"
+    state: absent
+  when: config_files.changed 
+
+
+- name: "start {{ servicename }} docker"
+  community.docker.docker_compose_v2:
+    project_src: "{{ basedir }}"
+    state: present
diff --git a/intern/docker_zigbee2mqtt/templates/data/configuration.yaml b/intern/docker_zigbee2mqtt/templates/data/configuration.yaml
new file mode 100644
index 00000000..5a516d90
--- /dev/null
+++ b/intern/docker_zigbee2mqtt/templates/data/configuration.yaml
@@ -0,0 +1,36 @@
+# Home Assistant integration (MQTT discovery)
+homeassistant: true
+
+# allow new devices to join
+permit_join: true
+
+# MQTT settings
+mqtt:
+  # MQTT base topic for zigbee2mqtt MQTT messages
+  base_topic: zigbee2mqtt
+  # MQTT server URL
+  server: mqtt://{{ int_ip4 }}
+  # MQTT server authentication, uncomment if required:
+  # user: my_user
+  # password: my_password
+
+# SLZB-06 Zigbee coordinator settings
+serial:
+# Location of SLZB-06M
+  port: tcp://{{ slzb06.host }}:6638
+  baudrate: 115200
+  rtscts: false
+  adapter: ember
+
+# Web Frontend
+# https://www.zigbee2mqtt.io/guide/configuration/frontend.html
+frontend:
+  # Optional, default 8080
+  port: 8080
+
+# Logging
+# https://www.zigbee2mqtt.io/guide/configuration/logging.html
+advanced:
+  log_level: info
+  log_namespaced_levels:
+    z2m:mqtt: warning
diff --git a/intern/docker_zigbee2mqtt/templates/docker-compose.yml b/intern/docker_zigbee2mqtt/templates/docker-compose.yml
new file mode 100644
index 00000000..4cd93aaa
--- /dev/null
+++ b/intern/docker_zigbee2mqtt/templates/docker-compose.yml
@@ -0,0 +1,26 @@
+
+services:
+
+  # Zigbee USB Stick must be Mounted as /dev/ttyNabuCasaSkyConnect
+  # see https://gist.github.com/crundberg/a77b22de856e92a7e14c81f40e7a74bd?permalink_comment_id=4524937
+
+  app:
+    image: koenkk/zigbee2mqtt:latest
+    restart: always
+    volumes:
+      - "{{ basedir }}/data:/app/data"
+      - /run/udev:/run/udev:ro
+    environment:
+      - TZ=Europe/Berlin
+    labels:
+      - traefik.enable=true
+      - traefik.http.routers.{{ servicename }}.rule=Host(`{{ domain }}`)
+      - traefik.http.routers.{{ servicename }}.entrypoints=websecure
+      - traefik.http.services.{{ servicename }}.loadbalancer.server.port=8080
+    networks:
+      - default
+      - web
+
+networks:
+  web:
+    external: true
diff --git a/site.yml b/site.yml
index c5927933..2ffbeac6 100644
--- a/site.yml
+++ b/site.yml
@@ -235,6 +235,13 @@
         basedir: /srv/fridgeserver,
         domain: "fridgeserver.warpzone.lan"
       }
+    - { 
+        role: intern/docker_zigbee2mqtt, tags: [ zigbee2mqtt, docker_services ],
+        servicename: zigbee2mqtt,
+        basedir: /srv/zigbee2mqtt,
+        domain: "zigbee2mqtt.warpzone.lan"
+      }
+
 
 - hosts: webserver
   remote_user: root
diff --git a/webserver/docker_icinga/templates/etc/icinga/conf.d/hosts_manual.conf b/webserver/docker_icinga/templates/etc/icinga/conf.d/hosts_manual.conf
index d1f7c2a8..c01c783a 100644
--- a/webserver/docker_icinga/templates/etc/icinga/conf.d/hosts_manual.conf
+++ b/webserver/docker_icinga/templates/etc/icinga/conf.d/hosts_manual.conf
@@ -81,3 +81,11 @@ object Host "eq3max-cube" {
 
   groups = [ "network" ]
 }
+
+object Host "slzb-06-zigbee" {
+  import "generic-host"
+
+  address = "{{ slzb06.host }}"
+
+  groups = [ "network" ]
+}
-- 
GitLab