ESPHome control Novy hood with FS1000A RF transmitter and increase range

I have a wroom board running with an RF transmitter (FS1000A) to control my Novy hood. I have put the config together from various configs found on the internet.

I have put together the following config:

esphome:
  name: novy-hood
  friendly_name: novy_hood

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Web server.
web_server:
  port: 80

# Enable Home Assistant API
api:
  encryption:
    key: "Random"

ota:
  - platform: esphome
    password: "Random"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  manual_ip:
    static_ip: 192.168.22.22
    gateway: !secret gateway_ip
    subnet: !secret netmask
    dns1: !secret dns1

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Novy-Hood Fallback Hotspot"
    password: "Random"

captive_portal:
    
remote_transmitter:
  pin: GPIO022
  # RF uses a 100% carrier signal
  carrier_duty_percent: 100%  

#remote_receiver:
#  pin: GPIO023 
#  dump: all
#  # Settings to optimize recognition of RF devices
#  tolerance: 50%
#  filter: 250us
#  idle: 4ms
#  buffer_size: 2kb

button:
  - platform: template
    name: Novy FAN Plus
    id: novy_fan_plus
    on_press:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '010101010101'
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms  
  - platform: template
    name: Novy FAN Min
    id: novy_fan_min
    on_press:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '010101010110'
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms
  - platform: template
    name: Afzuigkap
    id: novy_aanuit_button
    on_press:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '010101010111010011'
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms
  - platform: template
    name: Licht toggle
    id: novy_licht_button
    on_press:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '010101010111010001'
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms

    # pattern to make sure the hood is off.
  - platform: template
    name: Ensure Off
    id: novy_ensure_off
    on_press:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001011001' # FAN Plus
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms  
      - delay: 500ms
      - remote_transmitter.transmit_rc_switch_raw:
          code:  '1011001011001011001011001011001001011' # Fan Min
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms
      - delay: 500ms
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011001001' # On / Off
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms
 
switch:
  # Licht  
  - platform: template
    name: Licht
    restore_mode: ALWAYS_OFF 
    id: novy_licht
    turn_on_action:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011011001'
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms
      - switch.template.publish:
          id: novy_licht
          state: ON
    turn_off_action:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011011001'
          protocol:
            pulse_length: 320
            sync: [36, 1]
            zero: [1, 2]
            one: [2, 1]
            inverted: True
          repeat:
            times: 2
            wait_time: 10ms 
      - switch.template.publish:
          id: novy_licht
          state: OFF
  # Kap
  - platform: template
    name: Afzuigkap
    restore_mode: ALWAYS_OFF 
    id: novy_aanuit
    turn_on_action:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011001001'
          repeat:
            times: 1
          protocol:
            zero: [0, 1]
            one: [1, 0]
            pulse_length: 380
      - switch.template.publish:
          id: novy_aanuit
          state: ON
    turn_off_action:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011001001'
          repeat:
            times: 1
          protocol:
            zero: [0, 1]
            one: [1, 0]
            pulse_length: 380  
      - delay: 2s
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011001001'
          repeat:
            times: 1
          protocol:
            zero: [0, 1]
            one: [1, 0]
            pulse_length: 380
      - switch.template.publish:
          id: novy_aanuit
          state: OFF

esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: true

bluetooth_proxy:
  active: true

It works, but I do find the range is very poor. I did tie a 17cm copper wire to it (power wire with loose wires so to speak, because with solid core were too thick that I have. If I put it directly under it, it responds pretty well. However, if I put him in the kitchen cabinet where I want him, he responds, but sometimes misses commands.

The reason I want it in that spot is because of the BLE tracking in conjunction with Bermuda.

Is there any way to make the range better? For example, is there an official-like antenna that works better?

In addition, as indicated I created my config from multiple configs, now however I do not understand something.

When I use my receiver to see what comes in when I press the light button it is the following:

[11:06:29][I][remote.pronto:231]: Received Pronto: data=
[11:06:29][I][remote.pronto:233]: 0000 006D 000B 0000 003E 0014 0041 0011 003F 0014 003E 0015 003D 0016 0013 0016 0013 0017 003B 0017 0064 000A 001E 0019 0010 009B 
[11:06:29][I][remote.canalsatld:100]: Received CanalSatLD: device=0x49, address=0x09, command=0x13, repeat=0x0
[11:06:29][I][remote.pronto:231]: Received Pronto: data=
[11:06:29][I][remote.pronto:233]: 0000 006D 0013 0000 000F 000C 001D 0019 0010 000C 001D 001A 0010 000C 001D 001A 000F 000C 001D 001A 000E 000E 001D 001A 000F 001A 000F 001A 000F 000D 001C 001A 000F 000D 001C 000D 001C 000D 001C 001B 000F 009B 
[11:06:29][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='010101010111010001'
[11:06:29][I][remote.canalsatld:100]: Received CanalSatLD: device=0x49, address=0x08, command=0x27, repeat=0x0
[11:06:29][I][remote.pronto:231]: Received Pronto: data=
[11:06:29][I][remote.pronto:233]: 0000 006D 0013 0000 000E 000D 001C 001B 000F 000D 001C 001B 000E 000E 001C 001B 000F 000D 001C 001B 000F 0019 0010 001B 000E 001B 000E 001B 000E 000D 001C 001B 000E 000E 001C 000E 001C 000E 001A 001C 000E 009B 
[11:06:29][I][remote.rc_switch:261]: Received RCSwitch Raw: protocol=6 data='010101011111010001'

The following code works:

 platform: template
  name: Licht toggle
  id: novy_licht_button
    on_press:
      remote_transmitter.transmit_rc_switch_raw:
        code: '010101010111010001'
        protocol:
          pulse_length: 320
          sync: [36, 1]
          zero: [1, 2]
          one: [2, 1]
          inverted: True
        repeat:
          times: 2
          wait_time: 10ms

The following code doesn’t:

 platform: template
    name: Licht toggle
    id: novy_licht_button
    on_press:
      - remote_transmitter.transmit_rc_switch_raw:
          code: '1011001011001011001011001011001001001011001011011011001'
          repeat:
            times: 1
          protocol:
            zero: [0, 1]
            one: [1, 0]
            pulse_length: 380

The last one, which so does not work is from some guy on a forum, which I assume does work for him (tried asking but doesn’t answer). So is that simply a different code that Novy came up with? Or is there also something in that protocol; zero, one, and pulse length and thus can be improved looking at my RAW code?

So basically 2 questions.

  1. How can I improve the range?
  2. How do I make logic out of what is sent?

FS1000A has not got a good reputation for reception.

Any better alternative ?

SRX882
I even made a ground plane antenna to replace the tiny antenna. Those coil loaded antenna that tend to come with all the modules are poor.

So even the better transmitter needs a ‘bigger’ antenna? Would it be to much of trouble to make a picture of it? Maybe i can replicate it.


Just ordered the SRX882, hopefully it’ll work a bit better.

Any thoughts on the code compared to the RAW code?

It should just be interchangable with FS1000A. Very basic. 3.3V, ground and data. I don’t tend to use esphome with RF for 433. Find it too difficult. I tend to use OpenMqttGateway or tasmota. In order to relace the coil antenna its easist to replace it with a sma connector on one end and uFL on other end( cut uFL off and solder ground(outer shield) to ground and inner core to ANT.
Pictures include a basic ground plane antenna and a super J pole( a collinear). Depend on your space and willingness to expirement with antennas. It’s a whole new rabbit hole to go down.
You could even start with a monopole (17cm or so ) or even a dipole.

OpenMqttGateway
OMG connects well to HA and is much simpler than

You can fit the transmitter and receiver on the same esp device. The transmitter is the smaller unit. They are usually sold as a pair. The ground that you connect the esp to is the same ground you would connect the ground of the antenna to. All grounds are connected. You have to desolder the old coil antenna

1 Like

How big is the remote that currently works? and at what distance with what reliability?

It has been at least a decade since I used RF switched outlets for control (well before the esp8266 came out and Wi-Fi became possible and cheap). RF is both hard and not hard. It is easy to find transmitters and receivers, getting them to work reliably is hard. Part of this depends on the protocol that the designers chose.

Many of the protocols have toggle for something. That makes it incredibly hard to get it right. Since I was buying things for a particular project I avoided remotes that had a single power button and had only purchased ones with independent on and off controls.

When I first started, I controlled the outlet by wiring directly to the remote. So I was automating pushing the button by doing that electrically. That worked well, but I wanted to do better.

I got a receiver and a logic analyzer and reverse engineered the protocol that the remote was using. I then wrote the code to implement that. Since ON was a unique code I could send it multiple times and not worry that the outlet would interpret that as a double toggle.

In testing I found range to be good, but I never needed to go very far.

So, if your remote works reliably from the location you want, you should be able to do it with automation. The tools available today make things much easier, but don’t require the knowledge of the protocols that was once required. When the tools don’t work, you need to get the knowledge to make the tools do the right thing.

1 Like

Difficult to debug like this. You should make a test setup with only transmitter code on Esphome and test the range like that without BLE etc. Antenna length from 17cm to 17.5cm can make noticeable difference.

1 Like

The current remote is a rfxcom connected to my ha box. Works fairly well but I’m moving things over in the house a bit making the current clear line of sight impossible. There will be walls in between. And even now it sometimes misses a command. The funny thing is, with the original remote it never misses a command which has no external antenna.

I’ll first try with the new rf transmitter which arrives Tuesday. Maybe that’ll be better, if not I’ll try and add an external antenna.

I was hoping the raw commands would suggest the light toggle not pushing the optimal signal and find some optimization there too.

No external antenna doesn’t mean no antenna. The remote has finely tuned pcb antenna (similar to Esp). Also, FS1000A is the cheapest transmitter you can buy, Maybe $0.5 in AE so we can’t expect too much from it…

Yes, Ali asked 0,30, but bought it through Amazon for 5,00, but received 5. So if anyone is interested :wink: but waiting now for the new module and let’s see what happens.

Have you tried increasing the number of repeats in your code?