s0_Blog

More 433MHz Fan Fun: Bunnings Arlec Fan Remote

More 433MHz Fan Fun -- Bunnings Arlec Fan Remote Reverse Engineering

I've done some more reverse engineering along the same lines as my previous post, but this time in a way that's much more likely to be useful for other people -- this is the main currently-available 433MHz remote control fan controller from Bunnings, the national hardware chain.

Specifically, I REed this product: https://www.bunnings.com.au/arlec-remote-control-ceiling-fan-kit_p0101918 CFR325

I used the same technique, taking an IQ recording from GQRX with an RTL-SDR tuned to 433.9MHz, then opening it with Universal Radio Hacker, and adjusting the auto-detected parameters slightly until the repeated messages all decoded exactly the same. Then, I used URH's analyser to try substitution for the sequences -- this time, I didn't have different length symbols, and the sync sequence was made of valid high-level symbols, so the built-in substitution tool worked fine.

ASK (Semi-decoded) Captures

Message: light on 1000100010001000100011101000111010001110100010001000100010001110100010001000100010001000111010001
Preamble: 10001000100010001000
Rest: 11101000111010001110100010001000100010001110100010001000100010001000111010001

Message light off 1000100010001000100011101000111010001110100010001000100010001110111011101110111010001000100010001000
Rest: 11101000111010001110100010001000100010001110111011101110111010001000100010001

MESSAGE: 111110101011111000001111

Timing

440µs per bit pulse.

RC Switch symbols

Sync: 0000000000000 (No real sync apart from long leading zeroes).

Symbol 1: 1000 (Aka [1, 3])

Symbol 0: 1110 (Aka [3, 1])

Message structure

Bits Purpose
11111 Sync/preamble
010 Model number? unknown
XX XX XX XX Address formatted in 0=11;1=10, MSB-LSB bit order
XXXX 1111= something on; 0000= all off ?
XX Fan mode
X Light mode
XX Probably timer mode, not confirmed

Decoded Commands

Command Message
Light on 11111   010 10111110 1111 11 0 11
All Off 11111   010 10111110 0000 11 1 11
Fan High/on 11111   010 10111110 1111 00 1 11
Fan mid 11111   010 10111110 1111 10 1 11
Fan low 11111   010 10111110 1111 01 1 11
Timer settings Haven't captured yet...

Addressing

There's a sub-encoding for the address! Each DIP switch bit becomes 2 bits of RC sequence (or you could say, becomes the even bits in an 8 bit sequence). Probably just to expand 4-way DIP switch to 8 available bits. Maybe odd bit lines are just grounded? Also the LSB-MSB DIP switch swaps order when it comes to the packet (MSB-LSB).

DIP Switch ID field
0000 010 11 11 11 11
1000 010 11 11 11 10
0100 010 11 11 10 11
0010 010 11 10 11 11
0001 010 10 11 11 11

ESPHome Config

Here's some snippets of how to use ESPHome to transmit these codes!


remote_transmitter:
  pin: GPIO4        # Or any output hooked up to a 433MHz transmitter data pin.
  carrier_duty_percent: 100%    # Disable high-freq modulation that's used for IR.

# Just an example that uses a button in home assistant interface -- you can change this to anything that takes a template "then:"
button:
  - platform: template
    name: Test Remote
    id: button_remote
    # Optional variables:
    icon: "mdi:remote"
    on_press:
      then:
       # Light toggle
        - remote_transmitter.transmit_rc_switch_raw: 
            code: '1111101010111110111111011'    # The bit sequence assembled with the preamble, model, address, on/off, fan, light, timer bits above.
            protocol:
              pulse_length: 220   # For some reason the pulses come out double the length?? actually 440us. I think this was a specific ESPHome version bug
              #sync: [1, 30]    # The default sync is fine, it just needs some leading zeroes 
              zero: [3, 1]
              one: [1, 3]
              inverted: false
            repeat:
              times: 5
              wait_time: 0ms