# Check this out... ESP-NOW (communication protocol)

**URL:** <https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221>\
**Category:** General\
**Created:** [22 January 2026 18:53 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221 "2026-01-22T18:53:16Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![craigcurtin](https://avatars.discourse-cdn.com/v4/letter/c/94ad74/32.png) [@craigcurtin](https://discourse.nodered.org/u/craigcurtin)\
**Post date:** [2 April 2026 04:32 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/22 "2026-04-02T04:32:32Z")

</div>

Careful Dave - that rabbit burrow is getting pretty deep !!

Craig

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [17 April 2026 09:05 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/23 "2026-04-17T09:05:50Z")

</div>

Just been informed the PiHut now has [stock of these devices](https://thepihut.com/products/seeed-xiao-esp32c3) for £4.80 inc VAT + delivery.

> **[Seeed XIAO ESP32C3](https://thepihut.com/products/seeed-xiao-esp32c3)**
>
> The Seeed XIAO ESP32C3 has a highly-integrated ESP32-C3 chip, built around a 32-bit RISC-V chip processor with a four-stage pipeline that operates at up to 160 MHz.

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [22 April 2026 07:12 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/24 "2026-04-22T07:12:20Z")

</div>

**ESP-NOW Node Setup and System Status** update

I currently have six ESP-NOW nodes _(using ESP32-C3-Super-Mini with IPEX socket for an external antenna)_ in operation: four Sensor nodes, one Relay node, and a Base station.

My latest dashboard is built around an Agent-to-Agent (A2A) concept, which made it straightforward to duplicate sections of the flow as I added each new node.

Yesterday afternoon, I took voltage readings for each node — measuring Vin (approximately 5V) and Vreg (targeting 3.3V). From there, I moved on to calibrating the scaling factors for both values across all nodes from my office setup.

This wasn’t entirely new ground. I carried out a similar exercise previously when Paul @zenofmud and I were working with our Single Sensor Nodes (SSN) over a shared MQTT broker on my Oracle VM. At that time, we effectively had a three-way setup: Paul in Boston, my son-in-law’s growing frame in his garden (managed by my grandson), and my own nodes here.

On a technical note, the system is proving to be very robust. I’ve tested nodes across various locations — house, garage, garden, and greenhouse — powering them via a power bank and confirming reliable communication. This includes both the relay and base stations. As expected, this reliability comes from using the Wi-Fi 2.4GHz link layer directly, rather than establishing full Wi-Fi network connections.

The only real downside has been the time investment — I’d estimate this has taken around a month of focused effort to reach this stage.

 ![wednesdaynewdashboard](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/1/e/1eb61ece0c4cd19209747b76dc86768fa19ad853.jpeg)  
 ![wednesdaynewdashboardflow](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/c/3/c3a5035425e8c55067eb1e2a8c866b26ecb3a8fa.jpeg)  
The PCB's layout would accommodate either an ESP32-C3-S-M or ESP32-S2-Mini.  
 ![mondaynewnodeB](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/2/8/2802b2301ebfd369f42c21b26b024abb24bfae7c.jpeg)  
 ![mondaynewnodeA](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/a/e/ae0dfb110c1a4526788bf3af786f8998a7e4dfc3.jpeg)  
 ![mondaynewnodeC](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/2/e/2e6961c27cf190dc5ded2ce494950c8ca1646294.jpeg)  
Here's part of my testbench I use to 'exercise' and 'adjust' the settings of the nodes...  
 ![wednesdaytestbenchA](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/0/8/08e9f94b17f6513f9b66df3e5f272f9c1c68eaea.jpeg)

---

<div class="post-metadata">

**Author:** ![mudwalker](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@mudwalker](https://discourse.nodered.org/u/mudwalker)\
**Post date:** [22 April 2026 08:56 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/25 "2026-04-22T08:56:27Z")

</div>

Well, all I can say after seeing the work that has gone in, the detail and care over calibration. Why the Sticky Tape Label?? I feel quality could be greatly improved here!!🤣 🤣 😂

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [22 April 2026 09:25 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/26 "2026-04-22T09:25:34Z")

</div>

Some technical points...

- I used Micro-Python for all the coding

- I ended-up using the ESP32-C3-Super-Mini with an IPEX socket for an ext antenna  
The one I use is by DIY-Malls and has the coupling capacitor fitted for an ext antenna

- I wrote code to handle 'chunking' of the msg.payload in the UpLink  
Note: There is a 250-byte limit on the size of the payload without 'chunking'

- On the ESP32-C3-S-M `tx_power` needs to be lowered to 15 (due to power regulation)  
e.g. `wlan.config(tx_power=15)` [Actually set via my config.json file]

**EDIT** : Due to time and cost constraints, I used handwritten sticky labels to identify each node.

---

<div class="post-metadata">

**Author:** ![mudwalker](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@mudwalker](https://discourse.nodered.org/u/mudwalker)\
**Post date:** [22 April 2026 11:57 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/27 "2026-04-22T11:57:17Z")

</div>

See, more relevant detail. When is the Label Printer arriving, or will you make your own Label Printer?😝

---

<div class="post-metadata">

**Author:** ![krambriw](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/krambriw/32/5429_2.png) [@krambriw](https://discourse.nodered.org/u/krambriw)\
**Post date:** [24 April 2026 04:14 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/28 "2026-04-24T04:14:54Z")

</div>

David, you are a real hero! Amazing all the pretty designs you have presented to us!! My own creations normally look like a bird's nest

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [24 April 2026 07:22 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/29 "2026-04-24T07:22:24Z")

</div>

**Remote Downlink Management – Working Implementation**

I can report that I’ve successfully implemented two new commands to remotely manage _downlinks_ in my network.

### 🔧 New Commands

- **`SET-DOWNLINK`**
  - Inserts a new downlink if the `node_id` does not already exist
  - Overwrites the existing entry if it _does_ exist

- **`DEL-DOWNLINK`**
  - Deletes a downlink if it exists
  - Silently ignores the request if it does not

* * *

### 🧪 Test Scenario

To properly validate this, I started from scratch with a new node:

- Fresh **ESP32-C3 Super Mini (DIY-Malls, with IPEX)**
- Flashed with MicroPython
- Installed a Sensor Station build (`NOW-01-S`)
- Updated `node_id` → `NOW-02-S` in `config.json`
- Powered up and verified connection to the NOW network

In Node-RED, I could immediately see `NOW-02-S` reporting every 60 seconds — expected behaviour, as the Sensor Station already had the Relay Station MAC address configured.

* * *

### 🚀 Dynamic Network Update

Here’s where it gets interesting:

1. **Base Station update**

- Added `NOW-02-S`
- Defined routing via the Relay Station downlink

1. **Relay Station update**

- Added `NOW-02-S`
- Provided its actual MAC address

1. After each change, issued a **`SAVE-CONFIG`** command  
→ Persisted live downlinks back to `config.json`

* * *

### ✅ Result

Apart from a couple of minor scripting errors (quickly fixed), everything worked as intended.

This proves that:

- Downlinks can be updated **remotely**
- Nodes can be **added or removed dynamically**
- Changes can be **persisted reliably**

* * *

### 📦 Example Commands

**SET-DOWNLINK**

```auto
msg.payload = {
  "src_id": "node-red",
  "dst_id": dst_id,
  "dir": "down",
  "cmd": "SET-DOWNLINK",
  "downlink": {
    "node_id": "NOW-02-S",
    "mac": "90:70:69:C1:E9:14",
    "role": "SENSOR"
  }
}

```

**DEL-DOWNLINK**

```auto
msg.payload = {
  "src_id": "node-red",
  "dst_id": dst_id,
  "dir": "down",
  "cmd": "DEL-DOWNLINK",
  "downlink": {
    "node_id": "NOW-08-S"
  }
}

```

When I get some spare time I suppose I'll have to gather together all my pieces of paper and create some proper documentation so other people could try out this project (ha, ha).

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [24 April 2026 08:09 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/30 "2026-04-24T08:09:32Z")

</div>

_ **OMG - I've just asked ChatGPT to describe what it thinks of my efforts...** _

**I** ’d describe your ESP-NOW setup as a **remotely managed, multi-hop mesh-style network with central orchestration** —but with a few nuances that make it more interesting than a typical “mesh” label suggests.

* * *

### 🧠 High-level description

Your network is essentially a:

> **Hierarchical ESP-NOW network with dynamic routing and remote configuration control via Node-RED**

* * *

### 🔍 What makes it distinctive

**1. Not a pure mesh (and that’s a good thing)**  
Traditional mesh networks (like Zigbee) rely on distributed routing decisions.  
Your system is different:

- The **Base Station** acts as a central controller
- Routing is **explicitly defined** via _downlinks_
- Nodes don’t “discover” routes — they’re **told** what to do

👉 This makes it more deterministic and easier to debug.

* * *

**2. Multi-hop capability via relay nodes**

- Sensor nodes don’t need direct access to the Base Station
- Traffic can be routed via **Relay Stations**
- You’ve effectively created **ESP-NOW multi-hop** , which isn’t native

👉 That’s a big step beyond typical ESP-NOW use.

* * *

**3. Software-defined network topology**

This is where your system really stands out:

- Downlinks can be:
  - Added (`SET-DOWNLINK`)
  - Removed (`DEL-DOWNLINK`)
  - Persisted (`SAVE-CONFIG`)

- All done **remotely** , without reflashing devices

👉 You’ve built a **control plane** on top of ESP-NOW.

* * *

**4. Central orchestration via Node-RED**

Using Node-RED as the control interface means:

- You have a **visual network controller**
- You can automate provisioning, updates, and monitoring
- Messages act like **network management commands**

👉 This is very similar in concept to SDN (Software-Defined Networking).

---

<div class="post-metadata">

**Author:** ![markost](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@markost](https://discourse.nodered.org/u/markost)\
**Post date:** [24 April 2026 17:51 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/31 "2026-04-24T17:51:02Z")

</div>

Was AI consulted for this project?

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [24 April 2026 18:10 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/32 "2026-04-24T18:10:40Z")

</div>

I've written quite a few Python scripts in the past for sensor nodes that @zenofmud and myself had created prior to the advent of AI, so I took a lot of that material and adapted it. One area where I did use AI was getting the WiFi connection sequence sorted out for the Base Station. This station has to make a Wifi connection to the link-layer as well joining one of my AP points on my home WiFi network. I used AI to resolve the sequencing issue as I was banging 'head-against-brick-wall'. I found that unless you specify exactly what you are doing and the conditions under which you are doing it - the AI will give a different answer (doesn't necessarily remember the stage you were at). This is a bit frustrating as you get led up the wrong path and waste time.

---

<div class="post-metadata">

**Author:** ![markost](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@markost](https://discourse.nodered.org/u/markost)\
**Post date:** [24 April 2026 18:21 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/33 "2026-04-24T18:21:00Z")

</div>

I'm asking out of curiosity, I also had my own LoRa project with Attiny1614. I said, I'm going to try how ESP32 saves data relative to Attiny's EEPROM... That's how it started, and ended with +2000 lines of code 😂  
I was quite surprised how it all works. What are some good AIs for coding in your experience?

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [24 April 2026 18:24 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/34 "2026-04-24T18:24:59Z")

</div>

I use Micro-Python for the scripts inside my ESP32-C3 and S2 devices and found Claude is brilliant for Python. Next point of call is ChatGPT. Only issue is I run out of usage with Claude quickly - suppose I should stump-up some cash and get a subscription.

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [24 April 2026 18:32 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/35 "2026-04-24T18:32:52Z")

</div>

> [@markost](#):
>
> I'm going to try how ESP32 saves data relative to Attiny's EEPROM

The ESP32-S2-Mini and C3-Super-Mini have 4MB of flash and 2MB of PSRAM as well as EEPROM.

> **[S2 mini — WEMOS documentation](https://www.wemos.cc/en/latest/s2/s2_mini.html)**

I've been looking into bolting an 512Mb serial EEPROM like the 24LC512 onto my ESP32s. It has an I2C interface so should be dead easy to store my ESP-NOW config files in there.

---

<div class="post-metadata">

**Author:** ![markost](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@markost](https://discourse.nodered.org/u/markost)\
**Post date:** [24 April 2026 18:54 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/36 "2026-04-24T18:54:27Z")

</div>

Claude is ok, I also use Gemini in parallel, mostly for verification and analysis.  
Try Z.ai, it's wicked "thinking" for coding, while Gemini handles logic in Node-RED (functions) extremely well.

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [26 April 2026 15:38 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/37 "2026-04-26T15:38:37Z")

</div>

I’ve had a _very_ frustrating morning with MicroPython…

Last week I received a batch of PCBs for my ESP-NOW network. These boards are designed to interface with my infrared detectors and dummy cameras. I quickly adapted one of my existing ESP-NOW scripts to support the IR side, and added a small feature to send an `IR_TEST` message to a node so I could simulate an intruder trigger.

The hardware side behaved nicely too — the board includes a 3V3→12V buck-boost converter, and I added a simple voltage divider into an ADC channel so I can monitor the supply voltage remotely.

Got everything working… _yippee!_ 😄

Feeling confident, I updated `main.py` so the script would auto-run on power-up.

That worked as well… _double yippee!_ 😄

Then reality kicked in…

I realised I’d forgotten to include a way to adjust the ADC scaling factor dynamically.

No problem, I thought — I’ll just stop the script and tweak it.

Except… I couldn’t stop it. At all.

I tried everything I could think of — no way to halt or interrupt the running script. And of course, I hadn’t taken a backup because I’d only made “a small change”.

At that point I was stuck. The only option left was to reflash a fresh ESP32-S2-Mini and try to reconstruct all the little improvements I’d made.

Lesson learned the hard way.

Second time around, once I got things working again, I immediately backed everything up.

Here’s a photo of the new board:

 ![sundayfrustration](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/7/2/72977887be2de8d00bb243a3b935a3c6f562f353.jpeg)

---

<div class="post-metadata">

**Author:** ![mudwalker](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@mudwalker](https://discourse.nodered.org/u/mudwalker)\
**Post date:** [27 April 2026 07:57 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/38 "2026-04-27T07:57:31Z")

</div>

Seems you got 'edgy' with the PSU PCB. Does save some space on the PCB, as long as it fits in the box!

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [27 April 2026 08:29 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/39 "2026-04-27T08:29:39Z")

</div>

I changed the orientation of the pins on the SMPS on Sunday - it now fits flat to the board.

 ![mondayreversedpins](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/0/c/0ce795ec5c5ebfffb2d5b9b9899903ffa8921980.jpeg)

---

<div class="post-metadata">

**Author:** ![mudwalker](https://avatars.discourse-cdn.com/v4/letter/m/47e85d/32.png) [@mudwalker](https://discourse.nodered.org/u/mudwalker)\
**Post date:** [27 April 2026 09:00 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/40 "2026-04-27T09:00:21Z")

</div>

I suppose overall the volume will be less for the box...

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [26 July 2026 09:00 UTC](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221/41 "2026-07-26T09:00:34Z")

</div>

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.

[Previous page](https://discourse.nodered.org/t/check-this-out-esp-now-communication-protocol/100221.md?page=1)
