---
author:
email: mail@petermolnar.net
image: https://petermolnar.net/favicon.jpg
name: Peter Molnar
url: https://petermolnar.net
copies:
- http://web.archive.org/web/20200209085138/https://petermolnar.net/freenas-domoticz-zigbee-zwave-rflink/
lang: en
published: '2020-02-07T19:00:00+00:00'
summary: How to make an Aeotec Z-Wave Z-Stick, a CC2531 Zigbee2MQTT, and an RFLink
work with a FreeNAS jail running Domoticz
tags:
- server
title: Consistent USB device naming in a FreeNAS jail
---
My current home server is a FreeNAS[^1] with a bunch of jails and
plugins; one of these is Domoticz. While I barely do anything above
collecting sensor data with it, I still had to make it work with
RFLink[^2], Zigbee2MQTT[^3], and an Aeotec Z-Stick Gen 5[^4].
I'm not going into the installation of Domoticz on FreeNAS, there are
excellent tutorials on the iX Community forums:
- \[HOWTO\] Domoticz and open-zwave in a FreeNAS 11 jail![^5]
- Install script for Domoticz with open-zwave driver in iocage jail
[^6]
Note: zigbee2mqtt is a node.js daemon; I'm using pm2[^7] to run it.
## iocage hooks
The `iocage` jail controller has some hooks that can run scripts on the
host for the jail. The two hooks needed in this case are the
`exec_poststart` and `exec_prestart` hooks. The prestart runs before the
jails is created; the post start runs once the jail filesystem is up,
but nothing is started yet.
My ZFS dataset for the iocage is called `server`. Modify the paths
according to that, and create the `bin` directory on it.
`/mnt/server/bin/domoticz-prestart.sh`
``` {.bash}
#!/bin/bash
# add devfs rules to allow USB devices to be seen from within domoticz
if ! grep -q "devfsrules_jail=5" /etc/devfs.rules; then
cat <<"EOF" >> /etc/devfs.rules
[devfsrules_jail=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path zfs unhide
add path 'tty*' unhide
add path 'ugen*' unhide
add path 'cu*' unhide
add path 'usb/*' unhide
EOF
/usr/sbin/service devfs restart
fi
```
`/mnt/server/bin/domoticz-poststart.sh`
``` {.bash}
#!/bin/bash
function get_tty () {
local vendor="${1}"
local product="${2}"
# return the tty{} value, eg; U2
sysctl dev.umodem | grep "vendor=${vendor} product=${product}" | sed -r 's/.*ttyname=([^\s]+) .*/\1/'
}
function create_symlink () {
local source="${1}"
# failsafe
if [ "${source}" == 'tty' ]; then return; fi
local target="/mnt/server/iocage/jails/domoticz/root/dev/${2}"
if [ -e "${target}" ]; then rm -f "${target}"; fi
ln -s "${source}" "${target}"
}
# rflink is an arduino mega
create_symlink "tty$(get_tty '0x2341' '0x0010')" "ttyUrflink"
# zigbee is a Texas Instrument CC2531
create_symlink "tty$(get_tty '0x0451' '0x16a8')" "ttyUzigbee"
# zwave is a Z-Stick Gen 5
# note: it needs the 'cua' device in domoticz, not the tty device
create_symlink "cua$(get_tty '0x0658' '0x0200')" "cuaUzwave"
```
**Note: these commands are meant to be ran *after* domoticz was
successfully installed in a jail named `domoticz`**
``` {.bash}
chmod 0755 /mnt/server/bin/domoticz-poststart.sh
chmod 0755 /mnt/server/bin/domoticz-prestart.sh
iocage stop domoticz
iocage set exec_poststart=/mnt/server/bin/domoticz-poststart.sh domoticz
iocage set exec_prestart=/mnt/server/bin/domoticz-prestart.sh domoticz
iocage set devfs_ruleset=5 domoticz
iocage start domoticz
```
## Hardware configurations inside domoticz
### Z-wave
![Domoticz hardware configuration for aeotec z-wave stick with path of
cuaUzwave](domoticz-freenas-zwave.png)
### RFLink
![Domoticz hardware configuration for rflink with path of
ttyUrflink](domoticz-freenas-rflink.png)
### zigbee
![Domoticz hardware configuration for
zigbee2mqtt](domoticz-freenas-zigbee.png)
`/opt/zigbee2mqtt/data/configuration.yaml`
``` {.yaml}
homeassistant: false
permit_join: false
mqtt:
base_topic: zigbee2mqtt
server: 'mqtt://localhost'
serial:
port: /dev/ttyUzigbee
advanced:
channel: 25
```
## Caveats
There's a weird behaviour of the CC2531 for which I haven't found a
reason or a fix for: after being plugged in, on the very first start the
tty interface shuts down and gets reassigned to another position, eg.
from `ttyU0` it becomes `ttyU4`. I've tried using `devd` rules to
trigger a restart of domoticz or a recreation of the symlink, but so
far, none of them provided good results. I'm not completely happy with
the zigbee2mqtt project anyway, because it requires a separate node.js
daemon to run in the background - one more moving element -, therefore
I'm not too keen to find a fix. Instead l'll probably look into
alternatives, like the dresden elektronik ConBee[^8]
[^1]:
[^2]:
[^3]:
[^4]:
[^5]:
[^6]:
[^7]:
[^8]: