OLD Version – Home Automation – RF Protocols

 

RF Protocol descriptions

This page is an attempt to gather information I have found on the topic of different RF protocols used in the Home Automation field of simple devices. The below protocols are all using the On-Off Keying modulation, which is a very simple form of Amplitude Shift Keying, at 433.92 MHz frequency.

Nexa/Proove simple

Information from, elektronikforumet.syntaxis.se/wiki/index.php/RF_Protokoll_-_Nexa/Proove_(äldre,_ej_självlärande).

The RF remote control transmitters/receivers from NEXA and PROOVE seems to originate from ARC Technology Co Ltd, Taiwan. There are several versions of these products but they seem to share the same protocol.

The bit coding used by the encoder chips, for example M3E. from MOSDESIGN SEMICONDUCTOR, allows for trinary codes, ie '0','1' and 'X' (OPEN/FLOATING). However, it seems that only '0' and 'X' is currently used in the NEXA/PROOVE remotes. The high level in the ASCII-graphs below denotes the transmission of the 433 MHz carrier. The low level means no carrier.

Bit representation

'0' bit:
 ____              ____
|    |            |    |
|    |            |    |
|    |____________|    |____________

|----|------------|----|------------|
   T       3T        T       3T

'1' bit:
 ____________      ____________
|            |    |            |
|            |    |            |
|            |____|            |____

|------------|----|------------|----|
      3T        T       3T        T

'X' (OPEN) bit:
 ____              ____________
|    |            |            |
|    |            |            |
|    |____________|            |____

|----|------------|------------|----|
   T       3T            3T       T

'STOP/SYNC' bit (Note! Longer than the data bit):
 ____
|    |
|    |
|    |__________________________...____

|----|--------------------------...----|
   T                32T

If the time T is 350us, one data bit time is 8 T; 2.8ms.

Packet format
Each packet is made up of 12 trinary bits followed by a stop/sync bit. Packets are sent n*4 times or more.
If we call the 12 data bits b0..b11 where b0 is sent first, they will have the following meaning:

b0..b3 (4 bits) - House (address)
0000 - A
X000 - B
0X00 - C
XX00 - D
00X0 - E
X0X0 - F
0XX0 - G
XXX0 - H
000X - I
X00X - J
0X0X - K
XX0X - L
00XX - M
X0XX - N
0XXX - O
XXXX - P

b4..b7 - Unit
0000 - 1
X000 - 2
0X00 - 3
XX00 - 4
00X0 - 5
X0X0 - 6
0XX0 - 7
XXX0 - 8
000X - 9
X00X - 10
0X0X - 11
XX0X - 12
00XX - 13
X0XX - 14
0XXX - 15
XXXX - 16

b8..b10 - Unknown
0XX

b11 - Activation
0 - OFF
X - ON

Nexa l

Nexa l, also known as Nexa Self learning is a protocol for power outlet switches of the brand Nexa.
Description found at http://elektronikforumet.syntaxis.se/wiki/index.php?title=RF_Protokoll_-_Nexa_sj%C3%A4lvl%C3%A4rande, modified and translated.<br>

Bit format
'1' bit:
 _____
|     |
|     |
|     |_____

|-----|-----|
   T     T

'0' bit:
 _____
|     |
|     |
|     |_________________________

|-----|-------------------------|
   T               5T

'SYNC' bit:
 _____
|     |
|     |
|     |__________________________________________________

|-----|--------------------------------------------------|
   T                         10T

'PAUSE' bit:
_______________________ . . . ____

|---------------------- . . . ----|
             40T

T = 250 us
(5T = 1250 us)
(10T = 2500 us)
(40T = 10 ms)
Timing might vary a bit, depending on hardware.

A packet is in total 65 bits.
Every other bit is the is redundant data, just the inverted value of the former bit.
'1' -> 10
'0' -> 01

A packet starts with a Sync bit, and is resent four times with a Paus bit in between.
Every packet is ended with a zero bit.

SHHHH HHHH HHHH HHHH HHHH HHHH HHGO EE BB DDDD 0 P

S = Sync bit.
H = The first 26 bits are transmitter unique codes, and it is this code that the reciever "learns" to recognize.
G = Group code, set to one for the whole group.
O = On/Off bit. Set to 1 for on, 0 for off.
E = Unit to be turned on or off. The code is inverted, i.e. '11' equals 1, '00' equals 4.
B = Button code. The code is inverted, i.e. '11' equals 1, '00' equals 4.
D = Dim level bits.
0 = packet always ends with a zero.
P = Pause, a 10 ms pause in between re-send.

Unit code:
11 = 1
10 = 2
01 = 3
00 = 4

Button code:
11 = 1
10 = 2
01 = 3
00 = 4

Dim levels
level(value) =  bits
1  (16) = 0001
2  (8)  = 1001
3  (12) = 0101
4  (4)  = 1101
5  (14) = 0011
6  (6)  = 1011
7  (10) = 0111
8  (2)  = 1111
9  (15) = 0010
10 (7)  = 1010
11 (11) = 0110
12 (3)  = 1110
13 (13) = 0100
14 (5)  = 1100
15 (9)  = 1000
16 (1)  =

Dim values in raw format (from 16 to 2 top down)
01010110
01011001
01011010
01100101
01100110
01101001
01101010
10010101
10010110
10011001
10011010
10100101
10100110
10101001
10101010

 

Nexa l - update

Got some information on the Nexa I protocol emailed to me today stating some differences compared to the above translation.

First of all the '1' and '0' bit seems to be reversed (and be the same as Jula I protocol below), i.e.

'0' bit:
 _____
|     |
|     |
|     |_____

|-----|-----|
   T     T

'1' bit:
 _____
|     |
|     |
|     |_________________________

|-----|-------------------------|
   T               5T

Secondly, to get the absolute dimming function to work the 'GO' part of

SHHHH HHHH HHHH HHHH HHHH HHHH HHGO EE BB DDDD 0 P
was replaced by '0000' (four zeroes in a row).

As I do not have any Nexa gear supporting dimming myself, I have _not_ been able to try this out myself.
But I am confident the information sent to me is correct.

 

Jula l

''Jula l'' protocol description from http://elektronikforumet.syntaxis.se/wiki/index.php/RF_Protokoll_-_JULA-Anslut, modified and translated.

Bit format

'0' bit:
 _____
|     |
|     |
|     |_____

|-----|-----|
   T     T

'1' bit:
 _____
|     |
|     |
|     |_________________________

|-----|-------------------------|
   T               5T

'START' bit:
 _____
|     |
|     |
|     |__________________________________________________

|-----|--------------------------------------------------|
   T                         10T

'STOP' bit:
 _____
|     |
|     |
|     |_______________________ . . . ____

|-----|----------------------- . . . ----|
   T                40T

T = 250 us
(5T = 1250 us)
(10T = 2500 us)
(40T = 10 ms)

Bitcoding
The data on the physical link is code so that every bit is sent as two bits.
'0' => '01'
'1' => '10'
Example: For the datastream 0111, this 01101010 is sent over the air.

Packetformat
Every packet consists of a startbit followed by 26 + 2 + 4 (total 32 databits) and is ended by a stopbit.
For every button press, three identical packets are sent.

HHHH HHHH HHHH HHHH HHHH HHHH HHGO EEEE
H = The first 26 bits are transmitter unique codes, and it is this code that the reciever "learns" to recognize.
G = Group code, set to one for the whole group.
O = On/Off bit. Set to 1 for on, 0 for off.
EEEE = Unit to be turned on or off. THe Unit code is inverted, 1111 = unit 0, 1110 = unit 1, etc.
Some noted differences between Nexa_l and Jula_l.

  • The Jula zero pulse is a Nexa one pulse, and vice versa. (Or is it just an interpretation thing?)
  • The Jula protocol only repeat the command three times, while Nexa does it four times.
  •  The Jula protocol speaks nothing about dimming levels, but they might actually exist anyway.
  • The Jula protocol defines the Startbit as the Nexa Sync bit.
  • The Jula protocol defines the Stopbit as Nexa Pause bit (almost, the Nexa pause has no high part I think).

 

Proove l

Proove self learning protocol. Another brand of remote controlled power outlet in Sweden.

Bit format

'1' bit:
 _____
|     |
|     |
|     |_____

|-----|-----|
   T     T

'0' bit:
 _____
|     |
|     |
|     |_________________________

|-----|-------------------------|
   T               5T

'SYNC' bit:
 _____
|     |
|     |
|     |__________________________________________________

|-----|--------------------------------------------------|
   T                         10T

'PAUSE' bit:
 _____
|     |
|     |
|     |_______________________ . . . ____

|-----|----------------------- . . . ----|
   T                40T

T = 250 us
(5T = 1250 us)
(10T = 2500 us)
(40T = 10 ms)

Bitcoding
The data on the physical link is code so that every bit is sent as two bits.
'0' => '01'
'1' => '10'
Example: For the datastream 0111, this 01101010 is sent over the air.

Packetformat
Every packet consists of a sync bit followed by 26 + 2 + 4 (total 32 databits) and is ended by a pause bit.
For every button press, four identical packets are sent.

HHHH HHHH HHHH HHHH HHHH HHHH HHGO CCEE
H = The first 26 bits are transmitter unique codes, and it is this code that the reciever "learns" to recognize.
G = Group code. Set to 0 for on, 1 for off.
O = On/Off bit. Set to 0 for on, 1 for off.
C = Channel bits.
E = Unit bits. Device to be turned on or off. Unit #1 = 00, #2 = 01, #3 = 10.
Some noted differences between Nexa_l and Proove_l.

  • The Proove protocol Pause bit has a high part of 250 usecs, where Nexa has none.

A simple Arduino library made is uploaded to GitHub.

 

Other standards

Just for the interested reader, here are some alternative standards in the field of Home Automation.

http://www.zigbee.org/Products/CertifiedProducts/ZigBeeLightLink.aspx

  7 Responses to “OLD Version – Home Automation – RF Protocols”

  1. Your post, Home Automation – RF Protocols » A Tech Blog, is really well written and insightful. Glad I found your website, warm regards from Daniella!

  2. Really liked what you had to say in your post, Home Automation – RF Protocols » A Tech Blog, thanks for the good read!
    — Kourtney

    http://www.terrazoa.com

  3. Thanks for this excellent info!

    Additional info 2014-02-01:
    “Nexa I” transmitters seem to send trinary values, even if not used in receivers. Otherwise “11” bits would not occur, right? So second bit-half is NOT only inverse of first.

    Waveman switches (simple 12-bit protocol) seems to send “OFF”-command only WHILE pushed and send last packets with “ON” again. So use first 2-3 packet only for stable decoding.

    /BdeB

    • Hi!

      Thanks for your comment.

      I haven’t decoded the ‘Nexa I’ transmitter myself, but if it is the same (or similar) as the Proove devices there is no ’11’ bit sent as trinary value. They most probably belong to two diferent bytes.
      I.e. ‘.. 10 10 01 10 ..’ sent in the air (physical layer) corresponds to ‘.. 1 1 0 1 ..’ on the protocol layer.

      Regards, Joakim

      • Hi Joakim!

        Interesting… Will try to get my hands on Proove transmitter.

        I´m quite confident of my Nexa decoding though – I get ID “12345” if I send to ID “12345” from TellStick software. At the moment tested with 8 different Nexa devices.

        All the best:

        /BdeB

        • Can confirm Proove remote (via Kjell&Co, Sweden) uses no trinary values!

          I decode my “trinarys” if second bit-half is short AND first bit-half was short.
          See any misses in that logic?

          Regards:

          /BdeB

          • Thank you for the confirmation on the Proove remote not using trinary vakues. Regarding the Nexa self-learning, I am not sure. Do you mean something like the ‘Nexa/Proove simple’ described at the top of this page, or something else?
            Regards, Joakim