Open gitcnd opened 5 months ago
Update; while adding b'\xff\xff\xff\xff\xff\xff' as a peer seems to stop the error - the corresponding receiver listening to broadcast traffic does not receive anything.
I'm planning to take a look at this and https://github.com/adafruit/circuitpython/issues/7903. For reference: ( https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/error-codes.html )
ESP_ERR_ESPNOW_INTERNAL (0x306a): Internal error
ESP_ERR_ESPNOW_NOT_FOUND (0x3069): ESPNOW peer is not found
leave a note here if you've done (or are doing) any work on it, so no effort gets duplicated.
I was unable to get circuitpython to reliably (or in most cases - at all) communicate with micropython over espnow (packet corruption and loss mostly when it semi-worked, or nothing at all most of the time probably due to code issue in the peer address setup/handling). I was unable to work out where/how in the code to fix this, or where the issue might be (I used "printf()" in the C to emit debug info - couldn't work it out still). For now - I'm giving up on this.
Adding b'\xff\xff\xff\xff\xff\xff' as a peer does not work for me :
peer = espnow.Peer(b'\xff\xff\xff\xff\xff\xff')
I get error message espidf.IDFError: ESP-NOW error 0x3069
((0x3069): ESPNOW peer is not found)
Without the possibility of sending gratuitous broadcast packets and receiving them, it is not possible to pair ESPNow devices.
Is there any update on this?
I am using circuitpython + ESPNow for a custom sensor and this has been working reliably for the past few months - also using the broadcast adress.
My receiver is additionally using wifi, so I had to fix the Wifi channel in my router settings (in this case to channel 6). One then has to force the transmitter to also use this channel. As far as I know, this can only be done using the wifi api and not using the ESPNow api.
Here are snippets of my code: Receiver:
async def handle_esp_now():
e = espnow.ESPNow()
while True:
await asyncio.sleep(0.1)
if not e: continue
packet = e.read()
last_received_data = json.loads(packet.msg.decode())
if "topic" in last_received_data:
mqtt_client.publish(last_received_data["topic"], json.dumps(last_received_data))
Transmitter:
# hack to switch channel that is used for ESPNow
# this takes just a few milliseconds, so doesn't waste a lot of power
wifi.radio.start_ap(" ", "", channel=6, max_connections=0)
wifi.radio.stop_ap()
e = espnow.ESPNow()
peer = espnow.Peer(mac=b'\xff\xff\xff\xff\xff\xff', channel=6)
e.peers.append(peer)
...
data = {
"voltage": voltage,
"topic": "state/circuitpy-sensor3"
}
message = json.dumps(data)
e.send(message, peer)
If I remember correctly, the seeming redundancy (specifying the channel twice, i.e. once in the wifi settings as well as in the Peer
) and the redundancy of specifying the peer both in e.peers
as well as in e.send
was both necessary. I had briefly looked into CircuitPython's source but came to the conclusion that its not CircuitPython that is causing the friction here, but that we are instead seeing quirks of the underlying esp-idf
.
Well, this is precious information! I wish this were documented in the circuitpython documentation. Thanks @Sola85 !
Switch to MicroPython - it properly supports channel selection and broadcast addresses.
Sadly, MicroPython has other issues that make it even less desirable for me. For example, the default hardware transmission mode of Circuitpython gives me twice the range of MicroPython's default mode (neither can be switched, it's another bug see https://github.com/adafruit/circuitpython/issues/9790 and https://github.com/micropython/micropython/issues/16179).
CircuitPython version
Code/REPL
Behavior
Description
Change the "if 0:" to "if 1:" and this is what we see:-
The logically identical code in micropython works fine
MicroPython version:
Additional information
It also does not allow channel numbers - the below errors out:-
peer = espnow.Peer(b'\x24\xdc\xc3\x8b\xe1\xc8', channel=9)
as mentioned in https://github.com/adafruit/circuitpython/issues/7903The "receiver" side of the code does seem to semi-work (gets packets from my micro-python version) but experiences a very high number of read error exceptions
espnowclient.py