Introduction
EmonTx3 is a measurement node for an energy measurement system. It has measurement inputs for 4 current transformers, AC voltage, 6 DS1820B temperature sensors and a meter pulse counting sensor.
The standard configuration uses a HopeRF RFM69CW radio transceiver to emonhub running on some host.
This article describes modifications to the system to use a wired serial connection to the emonhub host.
Above is the emonTx3 board.
The approach taken is a minimal change to existing firmware and software, no change to existing hardware, and inexpensive components to extend the connection.
Outline of the solution
The existing firmware writes a debug stream to the connector used for firmware upgrade. It is a different format to that used for the radio link, and there are good reasons for that, but it means writing an interface handler for emonhub to parse the debug stream.
emonTx V3.4 Discrete Sampling V2.80 OpenEnergyMonitor.org No EEPROM config RFM69CW Node: 8 Freq: 433Mhz Group: 210 ct1:-51,ct2:0,ct3:0,ct4:0,vrms:23910,pulse:0,t0:223 ct1:-71,ct2:0,ct3:0,ct4:0,vrms:23924,pulse:0,t0:223 ct1:-6,ct2:0,ct3:0,ct4:0,vrms:23921,pulse:0,t0:223
The solution involves some hardware to interface the emonTx3 to the wire line, and a similar interface at the other end to the host running emonhub.
Hardware
Above is the debug stream from the modified firmware.
Above is an adapter (~$3) from the TTL levels of the UART port to RS485. The port is currently run at 115200bps, and that can be carried 800m with good noise immunity on good copper using RS485.
Above is the host end adapter.
Firmware changes
The firmware was changed to repurpose the output that may be used for switching power to the DS19B20 sensors, it is now used primarily as an RTS signal to the RS485 adapter to reduce current consumption when there is no traffic. In fact, the RTS signal has been asserted also at times when the DS18B20 sensors are read and it could also be used for its original purpose without conflict.
Host changes
Assigning a consistent name to the RS485 adapter
A problem with USB serial adapters is that they may acquire different device names depending on the order in which they are started.
This is solved in this solution by use of FTDI adapters which have a serial number that uniquely identifies the adapter, and setting udev rules to assign a consistent symbolic link to the device. It is this symbolic link that is used in emonhub.conf
The link is achieved by adding the file /etc/udev/rules.d/75-RS485.rules with the contents below (the contents must match the actual adapter).
#Assign fixed symlink to RS485 adapter for emonttx SUBSYSTEM=="tty", ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_A9WRVDPD",SYMLINK+="ttyRS485-0"
The udevadm command will provide the information needed.
root@emonpi(rw):log# udevadm info -n /dev/ttyUSB0 P: /devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 S: serial/by-id/usb-FTDI_FT232R_USB_UART_A9WRVDPD-if00-port0 S: serial/by-path/platform-20980000.usb-usb-0:1.2:1.0-port0 S: ttyRS485-0 E: DEVLINKS=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A9WRVDPD-if00-port0 /dev/serial/by-path/platform-20980000.usb-usb-0:1.2:1.0-port0 /dev/ttyRS485-0 E: DEVNAME=/dev/ttyUSB0 E: DEVPATH=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0/tty/ttyUSB0 E: ID_BUS=usb E: ID_MODEL=FT232R_USB_UART E: ID_MODEL_ENC=FT232R\x20USB\x20UART E: ID_MODEL_FROM_DATABASE=FT232 USB-Serial (UART) IC E: ID_MODEL_ID=6001 E: ID_PATH=platform-20980000.usb-usb-0:1.2:1.0 E: ID_PATH_TAG=platform-20980000_usb-usb-0_1_2_1_0 E: ID_REVISION=0600 E: ID_SERIAL=FTDI_FT232R_USB_UART_A9WRVDPD E: ID_SERIAL_SHORT=A9WRVDPD E: ID_TYPE=generic E: ID_USB_DRIVER=ftdi_sio E: ID_USB_INTERFACES=:ffffff: E: ID_USB_INTERFACE_NUM=00 E: ID_VENDOR=FTDI E: ID_VENDOR_ENC=FTDI E: ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd E: ID_VENDOR_ID=0403 E: MAJOR=188 E: MINOR=0 E: SUBSYSTEM=tty E: TAGS=:systemd: E: USEC_INITIALIZED=8089809829
Interfacer module to parse the debug stream
An additional interfacer module was written to parse the debug stream, and it was hooked to the main module.
The interfacer is configured in emonhub and port layout copied in from source.
(the contents must match the actual adapter).
#Assign fixed symlink to RS485 adapter for emonttx SUBSYSTEM=="tty", ENV{DEVLINKS}=="*usb-FTDI_FT232R_USB_UART_A9WRVDPD*",SYMLINK+="ttyRS485-0"
Code source
Code source is available the original git emonhub repo, and in the following git repository forked from the official repo:
Test
The wired configuration is under test with emonhub installed on a Ubuntu server, and about 40m of cat5e cabling from emonTx3 to host. No issues have arisen.