Предисловие )))
У меня тут образовалось новое увлечение – сделать дом [поло]умным. Датчики/выключатели и прочие сущности я решил набирать с протоколом Zigbee, как наиболее дешевые и широко распространенные. Привязываться к одному производителю я не захотел, поэтому шлюз у меня будет свой. Координатор Zigbee я купил с рук у «кулибиных» что собирают их из модулей, выбрал последний — V4 Rev 1.5 на CC2652P.
Платформу автоматизации выбрал изначально – Home-Assistant, как наиболее гибкую и открытую. Ессно всё уже придумано давно и простым решением было бы купить Raspberry Pi, и установить на нем уже готовый образ. Тем более он с супервайзором для докеров и все сторонние плюшки ставятся чуть ли не одним кликом. Но так как у меня уже дома трудится HP microserver, под управлением TrueNAS (ex. FreeNAS), я решил всё завести на нем. Но так как это уже будет в джейле, мечтать об установке одним кликом не получится) придется все ставить ручками ))
Схема всей этой [поло]умности выглядит как-то так:
На удивление, для 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, но я предпочитаю так:
[root@truenas ~]# 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"
[root@truenas ~]# iocage set devfs_ruleset=3 zbee2mqtt
[root@truenas ~]# iocage start zbee2mqtt
[root@truenas ~]# iocage console zbee2mqtt
[root@zbee2mqtt ~]# pkg update
[root@zbee2mqtt ~]# pkg install ca_root_nss curl git node npm nano
[root@zbee2mqtt ~]# pw useradd -u 3881 -n zigbee2mqtt -d /nonexistent -s /sbin/nologin -w no -G dialer
[root@zbee2mqtt ~]# mkdir /opt/zigbee2mqtt
[root@zbee2mqtt ~]# git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
[root@zbee2mqtt ~]# cd /opt/zigbee2mqtt
[root@zbee2mqtt ~]# npm ci --production
[root@zbee2mqtt ~]# mkdir /usr/local/etc/zigbee2mqtt
Далее создаем 3 файла в этой папке:
[root@zbee2mqtt ~]# 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
[root@zbee2mqtt ~]# nano /usr/local/etc/zigbee2mqtt/devices.yaml
{}
[root@zbee2mqtt ~]# nano /usr/local/etc/zigbee2mqtt/groups.yaml
{}
Ну и чтобы все это запустить, делаем загрузочный скрипт
[root@zbee2mqtt ~]# 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"
Заводим нашу шарманку:
[root@zbee2mqtt ~]# chown -R zigbee2mqtt /usr/local/etc/zigbee2mqtt
[root@zbee2mqtt ~]# chmod +x /etc/rc.d/zigbee2mqtt
[root@zbee2mqtt ~]# sysrc -f /etc/rc.conf zigbee2mqtt_enable="YES"
[root@zbee2mqtt ~]# 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 или желтой кнопочкой ниже))