iphong / esphome-espnow

Direct communication between esp devices without home assistant
201 stars 11 forks source link

Channel setting is not wifi channel, and workarounds #3

Open dbuezas opened 2 years ago

dbuezas commented 2 years ago

I spent some time to make this work, so I'll share my findings here to save some time to the next person :)

Findings:

  1. The channel passed to begin is not the wifi channel, which is very important if only one of the sensors is connected to wifi.
  2. Setting the third param of "esp_now_add_peer" to the channel somehow also doesn't work in keeping the channel.
  3. Don't use power_save_mode: HIGH in the receiver wifi component (doh!)
  4. Set the channel on the sender right before sending, using wifi_set_channel(RECEIVER_WIFI_CHANNEL);

If the receiver device is connected to wifi and the sender isn't (typical battery application), then the receiver will be listening in whatever channel the wifi AP is. To fix this, change the channel of the sender right before sending:

sensor:
  - platform: adc
    pin: A0
    name: "battery-sensor v"
    on_value:
      then:
        - lambda: |-
            wifi_set_channel(RECEIVER_WIFI_CHANNEL); // <---- this!
            EspRC.send("battery-sensor-v", String(x, 5));

yes, it has too be done before sending and every time. I don't know why.

Deep sleeping right after works perfectly.

dbuezas commented 2 years ago

My suggestion is to note these caveats in the readme. I tried this with esp8266 boards.

dbuezas commented 2 years ago

Also, if a node doesn't use the wifi: component, this needs to be added to the libraries:

esphome:
  name: battery-sensor
  includes:
    - EspRC.h
  libraries:
    - ESP8266WiFi # add this if not using the esphome wifi component