Предисловие )))

У меня тут образовалось новое увлечение – сделать дом [поло]умным. Датчики/выключатели и прочие сущности я решил набирать с протоколом Zigbee, как наиболее дешевые и широко распространенные. Привязываться к одному производителю я не захотел, поэтому шлюз у меня будет свой. Координатор Zigbee я купил с рук у «кулибиных» что собирают их из модулей, выбрал последний — V4 Rev 1.5 на CC2652P.

Платформу автоматизации выбрал изначально – Home-Assistant, как наиболее гибкую и открытую. Ессно всё уже придумано давно и простым решением было бы купить Raspberry Pi, и установить на нем уже готовый образ. Тем более он с супервайзором для докеров и все сторонние плюшки ставятся чуть ли не одним кликом. Но так как у меня уже дома трудится HP microserver, под управлением TrueNAS (ex. FreeNAS), я решил всё завести на нем. Но так как это уже будет в джейле, мечтать об установке одним кликом не получится) придется все ставить ручками ))

Схема всей этой [поло]умности выглядит как-то так:

Image from https://github.com/Koenkk/zigbee2mqtt

На удивление, для TrueNAS есть плагины (jail plugin)  и для Home-Assistant Core, и для Mosquitto MQTT broker, и даже для z-Wave а вот для zigbee – нету. Поэтому, ставим Home-Assistant Core и Mosquitto broker из плагинов а Zigbee2MQTT будем ставить ручками. (Хотя есть репозиториях и шаблон для джейла, с которого я вдохновился)

Приступим к делу:

Предположим что у нас домашняя сеть — 10.1.1.0/24, адрес инет-шлюза 10.1.1.1, адрес джейла с HomeAssistant — 10.1.1.10, адрес Mosquitto — 10.1.1.11. Почти все можно сделать и из GUI TrueNAS-a, но я предпочитаю так:


[[email protected] ~]# iocage create -n zbee2mqtt -r 12.2-RELEASE ip4_addr="vnet0|10.1.1.12/24" defaultrouter="10.1.1.1" vnet="on" allow_raw_sockets="1" boot="on"
[[email protected] ~]# iocage set devfs_ruleset=3 zbee2mqtt
[[email protected] ~]# iocage start zbee2mqtt
[[email protected] ~]# iocage console zbee2mqtt
[[email protected] ~]# pkg update
[[email protected] ~]# pkg install ca_root_nss curl git node npm nano
[[email protected] ~]# pw useradd -u 3881 -n zigbee2mqtt -d /nonexistent -s /sbin/nologin -w no -G dialer
[[email protected] ~]# mkdir /opt/zigbee2mqtt
[[email protected] ~]# git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
[[email protected] ~]# cd /opt/zigbee2mqtt
[[email protected] ~]# npm ci --production
[[email protected] ~]# mkdir /usr/local/etc/zigbee2mqtt

Далее создаем 3 файла в этой папке:

[[email protected] ~]# nano /usr/local/etc/zigbee2mqtt/configuration.yaml

homeassistant: true
permit_join: false
mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://10.1.1.11'
  keepalive: 60
  password: mqtt
  reject_unauthorized: true
  user: mqtt
  version: 4
serial:
  port: /dev/cuaU0
advanced:
  network_key:
    - 134
    - 170
    - 213
    - 137
    - 36
    - 101
    - 180
    - 186
    - 32
    - 5
    - 28
    - 226
    - 191
    - 165
    - 72
    - 118
  log_output:
    - console
frontend:
  port: 8080
experimental:
  new_api: true
devices: devices.yaml
groups: groups.yaml

[[email protected] ~]# nano /usr/local/etc/zigbee2mqtt/devices.yaml

{}

[[email protected] ~]# nano /usr/local/etc/zigbee2mqtt/groups.yaml

{}

Ну и чтобы все это запустить, делаем загрузочный скрипт

[[email protected] ~]# nano /etc/rc.d/zigbee2mqtt

#!/bin/sh
#
# PROVIDE: zigbee2mqtt
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr
name="zigbee2mqtt"
rcvar="${name}_enable"

pidfile_child="/var/run/${name}.pid"
pidfile="/var/run/${name}_daemon.pid"
logfile="/var/log/${name}_daemon.log"

: ${zigbee2mqtt_enable:="NO"}
: ${zigbee2mqtt_user:="zigbee2mqtt"}
: ${zigbee2mqtt_group:="zigbee2mqtt"}
: ${zigbee2mqtt_data_dir:="/usr/local/etc/zigbee2mqtt"}

load_rc_config ${name}

command=/usr/sbin/daemon
extra_commands=upgrade

export ZIGBEE2MQTT_DATA=/usr/local/etc/zigbee2mqtt
ZIGBEE2MQTT_DIR=/opt/zigbee2mqtt

upgrade_cmd="${name}_upgrade"
zigbee2mqtt_upgrade() {
	run_rc_command stop 2>/dev/null; _rcstop_=$?
	(cd "$ZIGBEE2MQTT_DIR" && /usr/local/bin/npm ci)
	[ $? -eq 0 ] && [ ${_rcstop_} -eq 0 ] && run_rc_command start
}

start_precmd="${name}_prestart"
zigbee2mqtt_prestart() {
	NODE=/usr/local/bin/node

	[ ! -e "${pidfile_child}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${pidfile_child}"
	[ ! -e "${pidfile}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${pidfile}"
	[ ! -e "${logfile}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${logfile}"

	rc_flags="-f -o ${logfile} -P ${pidfile} -p ${pidfile_child} $NODE ${ZIGBEE2MQTT_DIR}/cli.js ${rc_flags}"
}

stop_postcmd="${name}_poststop"
zigbee2mqtt_poststop() {
	rm -f -- "${pidfile_child}"
}
run_rc_command "$1"

Заводим нашу шарманку:

[[email protected] ~]# chown -R zigbee2mqtt /usr/local/etc/zigbee2mqtt
[[email protected] ~]# chmod +x /etc/rc.d/zigbee2mqtt
[[email protected] ~]# sysrc -f /etc/rc.conf zigbee2mqtt_enable="YES"
[[email protected] ~]# service zigbee2mqtt start

Ну соббсно и все.

Если координтор не видит USB стик, проверьте если он в /dev/cuaU0, как указано в конфигурации. Команда ls /dev/cua* покажет какие у вас есть последовательные устройства. Если нет, поменяйте на нужный порт конфигу. Указанный ранее devfs_ruleset=3 как раз и разрешает проброс внутрь джейлов внешних устройств.

Веб-морда доступна по адресу джейла: http://10.1.1.12:8080, её можно добавить в морду Home Assistant cсылкой на панели, которая будет открывать во фрейме страницу координатора примерно такой конструкцией в configuration.yaml Home-Assistant-a

panel_iframe:
  zigbee2mqtt:
    title: Zigbee2MQTT
    icon: mdi:alpha-z-circle
    require_admin: true
    url: http://10.1.1.12:8080

Ссылки:

Home-Assistant https://www.home-assistant.io/
Mosquitto broker https://github.com/tprelog/iocage-mosquitto
zigbee2mqtt https://www.zigbee2mqtt.io/, https://github.com/Koenkk/zigbee2mqtt
iocage-zigbee2mqtt https://github.com/paxswill/iocage-zigbee2mqtt
MQTT Explorer http://mqtt-explorer.com/

Если этот пост вам в чем-то помог, можете мне купить кофе-другой, по ссылке https://www.buymeacoffee.com/webxs или желтой кнопочкой ниже))