Sunday, December 04, 2016

Using Conrad RSL sockets with RFXCom and Home Assistant

I wanted to get my Conrad RSL sockets (RSL3660R-UK) working with Home Assistant

The user guide for the RFXCom describes how to get them working, but I needed to work out what the device id for Home Assistant. Luckily Home Assistant just uses the parsing of a RFXtrx packet to work this out, so I just had to work out the format. I used the user guide and pyRFXtrx code to work it out. The bytes break down as follows:
  1. 09 - length
  2. 13 - lighting 4
  3. 00 - subtype = PT2262
  4. 04 - sequence number
  5. XX - cmd 1 - Group:
    • 15 - Group I
    • 45 - Group II
    • 51 - Group III
    • 54 - Group IV
  6. YY - cmd 2 - Unit:
    • 15 - Unit 1
    • 45 - Unit 2
    • 51 - Unit 3
    • 54 - Unit 4
  7. ZZ - cmd 3 - State:
    • 55 - On
    • 54 - Off
  8. 01 - high byte of pulse timing (425ms)
  9. A9 - low byte of pulse timing (425ms)
  10. 00 - seems to always be null
However there isn't any way to send lighting 4 packets directly from Home Assistant. Luckily Linux is happy to share ttys, so the following commands work:
# Group I, unit 1 - on
echo -ne '\x09\x13\x00\x04\x15\x15\x55\x01\xA9\x00' > /dev/serial/by-id/usb-RFXCOM_RFXtrx433_A1WRPM1W-if00-port0
Trying to work out the correct stack of escaping of text in both YAML and shell (which will be dash on Ubuntu and Debian systems) makes it far easier to write a script to do this. So I put the following into /home/hass/bin/switch_rsl.sh:
#!/bin/bash

set -e

# Path to your RFXCOM device
RFXCOM_DEV=/dev/serial/by-id/usb-RFXCOM_RFXtrx433_A1WRPM1W-if00-port0
# Number of times to send the command
REPEAT=2
# Pause between each command being sent
REPEAT_DELAY=0.2

function print_usage()
{
  echo "Usage: $0 [I|II|III|IV] [1|2|3|4] [On|Off]"
}

case $1 in
I)
  GROUP=15
  ;;
II)
  GROUP=45
  ;;
III)
  GROUP=51
  ;;
IV)
  GROUP=54
  ;;
*)
  echo "Invalid group: $1"
  print_usage
  exit 1
  ;;
esac

case $2 in
1)
  UNIT=15
  ;;
2)
  UNIT=45
  ;;
3)
  UNIT=51
  ;;
4)
  UNIT=54
  ;;
*)
  echo "Invalid unit: $2"
  print_usage
  exit 1
  ;;
esac

case $3 in
On|on|1)
  STATE=55
  ;;
Off|off|0)
  STATE=54
  ;;
*)
  echo "Invalid state: $3"
  print_usage
  exit 1
  ;;
esac

for V in 1 .. $REPEAT
do
  echo -ne "\\x09\\x13\\x00\\x04\\x$GROUP\\x$UNIT\\x$STATE\\x01\\xA9\\x00" > "$RFXCOM_DEV"
  sleep $REPEAT_DELAY
done
Then the configuration for Home Assistant is just:
switch:
  - platform: command_line
    switches:
      rsl_i_1:
        command_on:  "/home/hass/bin/switch_rsl.sh I 1 On"
        command_off: "/home/hass/bin/switch_rsl.sh I 1 Off"
      rsl_i_2:
        command_on:  "/home/hass/bin/switch_rsl.sh I 2 On"
        command_off: "/home/hass/bin/switch_rsl.sh I 2 Off"
      rsl_i_3:
        command_on:  "/home/hass/bin/switch_rsl.sh I 3 On"
        command_off: "/home/hass/bin/switch_rsl.sh I 3 Off"