- 
      
- 
        Save anecdata/f46a1d07add5fc60cfbcf42dc7be6528 to your computer and use it in GitHub Desktop. 
| # SPDX-FileCopyrightText: 2023 anecdata | |
| # | |
| # SPDX-License-Identifier: MIT | |
| import time | |
| import traceback | |
| import supervisor | |
| import os | |
| import rtc | |
| import espnow | |
| import espidf | |
| import wifi | |
| import socketpool | |
| import adafruit_ntp | |
| from sekrets import * | |
| #### ESPNOW Receiver | |
| TZ_DEFAULT = -5 | |
| SNDR_CH = 0 # channel 1 (unless connected to an AP or acting as an AP) | |
| def struct_time_to_iso_time(): | |
| st = time.localtime() | |
| tz = TZ_DEFAULT | |
| return f"{st[0]:04d}-{st[1]:02d}-{st[2]:02d}T{st[3]:02d}:{st[4]:02d}:{st[5]:02d}{tz:+03}:00" | |
| def connect(): | |
| try: | |
| wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"), bssid=AP_BSSID) # use AP on channel <> 1 | |
| time.sleep(1) # wait for ap_info | |
| print(f"{struct_time_to_iso_time()} ipv4={wifi.radio.ipv4_address} channel={wifi.radio.ap_info.channel} rssi={wifi.radio.ap_info.rssi}") | |
| except ConnectionError as ex: | |
| traceback.print_exception(ex, ex, ex.__traceback__) | |
| def ntp_to_rtc(): | |
| wifi.radio.enabled = True | |
| connect() | |
| try: | |
| ntp = adafruit_ntp.NTP(pool, tz_offset=TZ_DEFAULT) | |
| rtc.RTC().datetime = ntp.datetime | |
| print(f"{struct_time_to_iso_time()} RTC time set with NTP time") | |
| except Exception as e: | |
| traceback.print_exception(e, e, e.__traceback__) | |
| wifi.radio.enabled = False # lose the wifi channel | |
| time.sleep(3) # wait for serial | |
| print(f"{'='*25}") | |
| pool = socketpool.SocketPool(wifi.radio) | |
| ntp_to_rtc() | |
| peers = [espnow.Peer(mac=SNDR_MAC, lmk=SNDR_LMK, encrypted=True, channel=SNDR_CH),] | |
| while True: | |
| with espnow.ESPNow() as e: | |
| e.set_pmk(RCVR_PMK) | |
| peers_report = "" | |
| for peer in peers: | |
| e.peers.append(peer) | |
| peers_report += f"mac={peer.mac} lmk={peer.lmk} ch={peer.channel} if={peer.interface} enc={peer.encrypted}\n" | |
| print(f"{'-'*25}\n{struct_time_to_iso_time()} Receiving...", end=" ") | |
| while True: | |
| if e: | |
| try: | |
| packet = e.read() | |
| print(f"{packet}") | |
| break | |
| except ValueError as ex: # Invalid buffer | |
| traceback.print_exception(ex, ex, ex.__traceback__) | |
| supervisor.reload() | |
| break | |
| print(f"send=[{e.send_success} {e.send_failure}] read=[{e.read_success} {e.read_failure}] buf={e.buffer_size} phy={e.phy_rate} peers={peers_report}", end="") | 
oh yeah, good question, PMK and LMK are bytes (or, ReadableBuffer), e.g., b'shufyrgetsfdtfyg'
https://docs.circuitpython.org/en/latest/shared-bindings/espnow/index.html#espnow.Peer
https://docs.circuitpython.org/en/latest/shared-bindings/espnow/index.html#espnow.ESPNow.set_pmk
Similarly, MAC address like b'\x00\x1A\xDD\x17\xC2\xA5' (or any equivalent form)
https://docs.circuitpython.org/en/latest/shared-bindings/espnow/index.html#espnow.ESPNowPacket.mac
Thanks!
How about setting the data rate for long range?
The doc says "espnow.ESPNow(buffer_size:  = 526, phy_rate: int = 0), but I don't see what 0 means (1mbps? 56mbps?)
The values in the reference https://docs.espressif.com/projects/esp-idf/en/release-v4.4/esp32/api-reference/network/esp_wifi.html#_CPPv415wifi_phy_rate_t are not integer values, as expected by the Circuitpython library.
@stanelie it's an enumeration, so increasing integer values
https://github.com/espressif/esp-idf/blob/a9d0f22193acdf47a5a4db36832ae7068818962b/components/esp_wifi/include/esp_wifi_types.h#L594
the default is 0 (1Mbps), but you can change it
Thanks. Is there a better place for my questions than this thread?
I've tried all the phy_rate values between 0 and 32, and 16 and up do not work. So, I am unable to select the 31 or 32nd values (lora 250 and lora 500) that I want to enable long range. Where should I file a bug report about this issue?
Do you have examples of how this data should be formatted? For example, the mac address should be AB:CD:EF:GH:IJ or something like ['0x24', '0xec', '0x4a', '0x26', '0x8d', '0xb0'] ?