This is quick how-to share CC2652RB over network to zigbee2mqtt (Home Assistant) via ser2net. This tutorial is for RaspberryPi.
In this tutorial ser2net will be named as ser2net2
. To not have collision in case you will install older version from repository via apt install ser2net
. Also it will listen on port 3452
in configuration below.
Clone ser2net
and gensio
. We will use master
branch because contains some changes which were not in past versions (compatibility issue with bootloader of CC2652RB DTR/RTS…)
cd /opt
git clone [email protected]:cminyard/ser2net.git
git clone [email protected]:cminyard/gensio.git
cd gensio
apt-install python3-dev libtool automake
./reconf
./configure
./make
./make install
cd ../ser2net
apt install libyaml-dev
./reconf
./configure
./make
./make install
Create sh control service:
vim /opt/ser2net_service.sh
#! /bin/bash
#
# ser2net init script for ser2net
#
# Written by Miquel van Smoorenburg <[email protected]>.
# Modified for Debian GNU/Linux
# by Ian Murdock <[email protected]>.
# Modified for ser2net by Marc Haber <[email protected]>
### BEGIN INIT INFO
# Provides: ser2net
# Required-Start: $network $remote_fs
# Required-Stop: $network $remote_fs
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Allows network connections to serial ports
# Description: This daemon allows telnet and tcp sessions to be established with a unit's serial ports.
### END INIT INFO
set -e
if [ -r "/lib/lsb/init-functions" ]; then
. /lib/lsb/init-functions
else
echo "E: /lib/lsb/init-functions not found, lsb-base (>= 3.0-6) needed"
exit 1
fi
if [ -n "$SER2NETDEBUG" ]; then
echo "now debugging $0 $@"
set -x
fi
LANG=C
export LANG
PATH=/usr/local/sbin
DAEMON=/usr/local/sbin/ser2net
NAME=ser2net2
DESC="Serial port to network proxy"
PIDFILE=/run/$NAME.pid
test -f $DAEMON || exit 0
# Defaults
CONFFILE="/etc/ser2net/ser2net.yaml"
OPTIONS=""
CONTROLPORT=""
# Read config file (will override defaults above)
#[ -r /etc/default/ser2net ] && . /etc/default/ser2net
# this is from madduck on IRC, 2006-07-06
# There should be a better possibility to give daemon error messages
# and/or to log things
log()
{
case "$1" in
[[:digit:]]*) success=$1; shift;;
*) :;;
esac
log_action_begin_msg "$1"; shift
log_action_end_msg ${success:-0} "$*"
}
start () {
if ! pidofproc -p "$PIDFILE" "$DAEMON" >/dev/null; then
start_daemon -p $PIDFILE $DAEMON ${CONTROLPORT:+-p} $CONTROLPORT -c $CONFFILE -P $PIDFILE $OPTIONS
ret=$?
else
log_failure_msg "already running!"
log_end_msg 1
exit 1
fi
return $ret
}
stop () {
# this is a workaround for #451529 as ser2net 2.5 does not delete its pidfile
SIG="${1:--TERM}"
killproc -p "$PIDFILE" "$DAEMON" "$SIG"
# this is a workaround for killproc -TERM not zapping the pidfile
if ! pidofproc -p "$PIDFILE" "$DAEMON" >/dev/null; then
rm -f $PIDFILE
fi
}
status()
{
log_action_begin_msg "checking $DESC"
if pidofproc -p "$PIDFILE" "$DAEMON" >/dev/null; then
log_action_end_msg 0 "$NAME running"
else
if [ -e "$PIDFILE" ]; then
log_action_end_msg 1 "$NAME failed"
exit 1
else
log_action_end_msg 0 "$NAME not running"
exit 3
fi
fi
}
if ! [ -e "$CONFFILE" ]; then
log_failure_msg "Not starting ser2net: Conffile $CONFFILE missing"
log_end_msg 1
exit 1
fi
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
start
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
if ! [ -e "$CONFFILE" ]; then
log_failure_msg "Not starting ser2net: Conffile $CONFFILE missing"
log_end_msg 1
exit 1
fi
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
start
log_end_msg 0
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
stop
log_end_msg 0
;;
reload|force-reload)
log_daemon_msg "Reloading $DESC" "$NAME"
stop "-HUP"
log_end_msg 0
;;
restart)
log_daemon_msg "Restarting $DESC" "$NAME"
stop
sleep 1
start
log_end_msg 0
;;
status)
status
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
exit 1
;;
esac
exit 0
Create ser2net
config file: vim /etc/ser2net/ser2net.yaml
(replace XX_XX_XX_XX_XX_XX
values with your serial number by listing ls -lah /dev/serial/by-id/
)
%YAML 1.1
---
define: &confver 1.0
connection: &con01
accepter: tcp,3452
connector: serialdev,
/dev/serial/by-id/usb-Silicon_Labs_slae.sh_cc2652rb_stick_-_slaesh_s_iot_stuff_XX_XX_XX_XX_XX_XX-if00-port0,115200n81,
local,
dtr=off,
rts=off
options:
kickolduser: true
Startup ser2net
ln -s /opt/ser2net2_service.sh /etc/init.d/ser2net2
update-rc.d ser2net2 defaults
systemctl enable ser2net2
systemctl start ser2net2
Verify ser2net
is running and listening on desired port:
netstat -tupln | grep ser2net
tcp6 0 0 :::3452 :::* LISTEN 583/ser2net
Configure zigbee2mqtt
to use configured serial via ser2net (replace according your IP):
…
serial:
port: tcp://192.168.1.XX:3452
disable_led: false
…
socat:
enabled: false
master: pty,raw,echo=0,link=/dev/ttyZ2M,mode=777
slave: tcp-listen:8485,keepalive,nodelay,reuseaddr,keepidle=1,keepintvl=1,keepcnt=5
options: '-d -d'
log: false
restartdelay: 1
initialdelay: 1