<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged connection</title>
<link>https://coderlegion.com/tag/connection</link>
<description>Powered by Question2Answer</description>
<item>
<title>Your Serverless Is Lying To You About Scale!</title>
<link>https://coderlegion.com/21056/your-serverless-is-lying-to-you-about-scale</link>
<description>
&lt;h2 id=&quot;your-serverless-is-lying-to-you-about-scale&quot;&gt;Your Serverless Is Lying To You About Scale!&lt;/h2&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;The promise of serverless computing is irresistible: infinite scalability, pay-per-use, and zero operational overhead. We&amp;rsquo;ve eagerly embraced platforms like AWS Lambda, Google Cloud Run, and Azure Container Apps, pushing them to scale horizontally with unprecedented agility. Yet, a recent surge in backend outages tells a different story. The culprit isn&amp;rsquo;t typically the compute layer, but a silent, often overlooked bottleneck: &lt;strong&gt;database connection storms&lt;/strong&gt;. While your serverless functions might explode with instances, your underlying relational database often remains a fixed-capacity component, throttling your &amp;ldquo;elastic&amp;rdquo; backend and leading to frustrating, intermittent service disruptions.&lt;/p&gt;

&lt;h3 id=&quot;the-dirty-secret-database-connection-storms&quot;&gt;The &amp;ldquo;Dirty Secret&amp;rdquo;: Database Connection Storms&lt;/h3&gt;

&lt;p&gt;The fundamental disconnect lies in the architecture. Each instance of a serverless function, by default, often attempts to establish its own fresh connection to the database. When a sudden spike in traffic triggers hundreds or thousands of function instances, this translates directly into an equivalent surge of simultaneous connection requests hitting your PostgreSQL, MySQL, or other relational database instance.&lt;/p&gt;

&lt;p&gt;Even highly provisioned databases have hard limits on concurrent connections. Once this limit is reached, new connection attempts are queued, rejected, or timeout. This manifests as increased latency, 5xx errors, and ultimately, backend outages, despite your serverless compute scaling perfectly. This &amp;ldquo;dirty secret&amp;rdquo; means that while your Cloud Run containers might be ready to serve millions of requests, your humble Postgres instance can only handle so many concurrent sessions before it buckles, silently undermining your entire scalability strategy.&lt;/p&gt;

&lt;h3 id=&quot;architectural-layoutwalkthrough-designing-for-true-data-elasticity&quot;&gt;Architectural Layout/Walkthrough: Designing for True Data Elasticity&lt;/h3&gt;

&lt;p&gt;Overcoming this limitation requires a strategic shift in how we manage database access in serverless environments. The fix isn&amp;rsquo;t just provisioning a larger database; it&amp;rsquo;s about intelligent, distributed connection management and a re-evaluation of data consistency models.&lt;/p&gt;

&lt;h4 id=&quot;1-intelligent-distributed-connection-pooling-at-the-edge&quot;&gt;1. Intelligent, Distributed Connection Pooling at the Edge&lt;/h4&gt;

&lt;p&gt;The most immediate and impactful solution is to introduce a dedicated connection pooling layer. This layer acts as an intermediary, multiplexing many client connections (from your serverless functions) over a fewer, persistent pool of connections to the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conceptual Flow:&lt;/strong&gt;
Instead of: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Serverless Function (N instances) -&amp;gt; N direct connections -&amp;gt; Database&lt;/code&gt;
You&amp;rsquo;d have: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Serverless Function (N instances) -&amp;gt; N connections -&amp;gt; Edge Connection Proxy -&amp;gt; M pooled connections (M &amp;lt;&amp;lt; N) -&amp;gt; Database&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation Considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Cloud-Native Proxies:&lt;/strong&gt; Services like AWS RDS Proxy or Google Cloud SQL Proxy are designed specifically for this challenge. Your serverless functions connect to the proxy endpoint, which then manages the connection pool to your RDS or Cloud SQL instance. This requires minimal code changes; you simply update your database connection string to point to the proxy.
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Example Serverless Function Environment Variable&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;postgresql://user:password@&amp;lt;RDS_PROXY_ENDPOINT&amp;gt;:5432/mydb&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Third-Party/Specialized Proxies:&lt;/strong&gt; Solutions like PgBouncer can be deployed as a separate service (e.g., in a container or VM) or integrated into managed database services (like Neon or Supabase) that offer built-in pooling optimized for serverless workloads.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Connection Lifecycle:&lt;/strong&gt; Configure your proxy for &amp;ldquo;session pooling&amp;rdquo; or &amp;ldquo;transaction pooling&amp;rdquo; based on your application&amp;rsquo;s needs. Transaction pooling is generally more efficient for serverless as connections are returned to the pool immediately after each transaction, maximizing reuse.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;2-dynamic-data-proxy-layers&quot;&gt;2. Dynamic Data Proxy Layers&lt;/h4&gt;

&lt;p&gt;Beyond simple connection pooling, a more advanced data proxy can offer additional benefits for serverless scalability:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Read/Write Splitting:&lt;/strong&gt; Route read queries to read replicas and write queries to the primary instance, offloading the primary database.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Caching:&lt;/strong&gt; Cache frequently accessed data at the proxy layer, reducing direct database hits.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Query Rewriting/Optimization:&lt;/strong&gt; Optimize queries before they reach the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These proxies effectively abstract the database topology from your serverless functions, allowing the data layer to scale and adapt independently.&lt;/p&gt;

&lt;h4 id=&quot;3-eventual-consistency-where-possible&quot;&gt;3. Eventual Consistency Where Possible&lt;/h4&gt;

&lt;p&gt;The most fundamental architectural shift involves questioning the necessity of &lt;em&gt;synchronous&lt;/em&gt; database writes for every operation. Many actions don&amp;rsquo;t require immediate, transactional consistency across all systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conceptual Flow:&lt;/strong&gt;
Instead of: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;User Action -&amp;gt; Serverless Function -&amp;gt; Synchronous DB Write -&amp;gt; Response&lt;/code&gt;
You&amp;rsquo;d have: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;User Action -&amp;gt; Serverless Function -&amp;gt; Publish Event to Message Queue (e.g., SQS, Pub/Sub) -&amp;gt; Immediate Response&lt;/code&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Another Serverless Function (triggered by queue) -&amp;gt; Asynchronous DB Write&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation Considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Identify Use Cases:&lt;/strong&gt; Log events, analytics updates, notification sending, inventory decrements (if stock checks happen upstream), order status updates that can tolerate a slight delay.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Messaging Services:&lt;/strong&gt; Utilize cloud-native message queues (AWS SQS, Google Cloud Pub/Sub, Azure Service Bus) or event streaming platforms (Kafka).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Event-Driven Architecture:&lt;/strong&gt; Your initial serverless function publishes an event and returns a response quickly, offloading the database interaction to a separate, asynchronous process. This drastically reduces the synchronous load on your database.
    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Pseudo-code for Eventual Consistency
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;boto3&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;sqs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boto3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'sqs'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;QUEUE_URL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;your-sqs-queue-url&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;handle_request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ... process incoming request data ...
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;payload&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;user_id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;123&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;product_viewed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;product_id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;XYZ&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Publish event for asynchronous processing
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;sqs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;QueueUrl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;QUEUE_URL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;MessageBody&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dumps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;statusCode&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;202&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Accepted
&lt;/span&gt;        &lt;span class=&quot;s&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Request accepted for processing.&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Separately, another function handles the queue:
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process_event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;record&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'Records'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;message_body&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loads&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'body'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# ... connect to DB, insert data ...
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# Ensure proper error handling and retries for DB writes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;True serverless elasticity extends beyond just scaling compute. The core challenge often lies in the fixed-capacity nature of traditional relational databases. By intelligently layering distributed connection pools and dynamic data proxies, you can mitigate connection storms and create a robust buffer between your bursting serverless functions and your database. More profoundly, an architectural shift towards eventual consistency for appropriate workloads can dramatically offload synchronous database writes, allowing your backend to handle peak loads gracefully. Stop provisioning for theoretical maximums; design for truly elastic data access from the ground up.&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/21056/your-serverless-is-lying-to-you-about-scale</guid>
<pubDate>Sun, 21 Jun 2026 05:37:13 +0000</pubDate>
</item>
<item>
<title>How to Set Up PainlessMesh With a NodeMCUv2 (ESP8266) Board?</title>
<link>https://coderlegion.com/13370/how-to-set-up-painlessmesh-with-a-nodemcuv2-esp8266-board</link>
<description>
&lt;p&gt;Hello, I'm Ganesh. I'm building &lt;em&gt;git-lrc&lt;/em&gt;, an AI code reviewer that runs on every commit. It is free, unlimited, and source-available on Github. &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/p&gt;

&lt;p&gt;In this article, I will be demonstrating how to use PainlessMesh with a NodeMCUv2 (ESP8266) board.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Problem we are solving?
&lt;/h2&gt;

&lt;p&gt;ESP8266 is a low-cost Wi-Fi microcontroller. It is a popular choice for IoT projects. &lt;/p&gt;

&lt;p&gt;Main advantage is it can connect to Wi-Fi network. &lt;/p&gt;

&lt;p&gt;If it connect to network and it can transmit data wirelessly. &lt;/p&gt;

&lt;p&gt;This make it suitable for IoT projects. Where we need to collect data from sensor and transmit to cloud or any other device.&lt;/p&gt;

&lt;p&gt;But this also comes with a limitation. If we need to connect each ESP8266 board to router, then we need to have router in range of each ESP8266 board. &lt;/p&gt;

&lt;p&gt;For Example I will name ESP8266 boards as Node A, Node B, Node C.&lt;/p&gt;

&lt;p&gt;If Node A and B are within range of and connected to the gateway&lt;br&gt;
If Node C is OUT of the range of the gateway and node B, but Node C is IN of the range of Node A&lt;/p&gt;

&lt;p&gt;Node C cannot transmit data to cloud directly.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g48xmdfes165u9lzi5y.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5g48xmdfes165u9lzi5y.png&quot; alt=&quot;&quot; width=&quot;773&quot; height=&quot;1164&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To Solve this problem we need a mesh or ad-hoc network. Where Node C can transmit data to Node A, and Node A can transmit data to router and then to cloud.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwe3svm2jxcks6qh3bwm.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwe3svm2jxcks6qh3bwm.png&quot; alt=&quot;&quot; width=&quot;773&quot; height=&quot;1167&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, There are many ways to solve this problem. Multi Gateway, Repeater, Star Network, Mesh Network.&lt;/p&gt;

&lt;p&gt;As, I did few experiments with ESP8266. I found PainlessMesh is a good solution for this problem.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is &lt;a href=&quot;https://gitlab.com/painlessMesh/painlessMesh&quot; rel=&quot;noopener&quot;&gt;PainlessMesh&lt;/a&gt;?
&lt;/h2&gt;

&lt;p&gt;PainlessMesh creates a self organizing and repairing network where all nodes are connected. &lt;/p&gt;

&lt;p&gt;All nodes in the mesh are equal. The network uses a star topology, avoiding any circular paths. &lt;/p&gt;

&lt;p&gt;Messages between different nodes are sent in JSON format, making them easy to understand and produce. &lt;/p&gt;

&lt;p&gt;So, Basicaly it is very easy to use and understand library for connecting multiple ESP8266 boards in a mesh network.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Features of PainlessMesh
&lt;/h2&gt;

&lt;p&gt;We can see how network are connected in the image below.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsy098w04j2pp0lrvqabt.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsy098w04j2pp0lrvqabt.png&quot; alt=&quot;&quot; width=&quot;665&quot; height=&quot;386&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is True ad-hoc networking: Which means all nodes are equal and can communicate with each other. These self organizing and repairing network. &lt;/p&gt;

&lt;p&gt;The number of nodes is limited only by the memory of the ESP8266 board. &lt;/p&gt;

&lt;p&gt;JSON based: Messages between different nodes are sent in JSON format, making them easy to understand and produce. &lt;/p&gt;

&lt;p&gt;Wifi &amp;amp; Networking: It uses ESP8266's wifi radio to create a mesh network. &lt;/p&gt;

&lt;p&gt;painlessMesh is not IP networking: It does not use IP networking. It use esp8266's node id for communication for identifying nodes.&lt;/p&gt;
&lt;h2&gt;
  
  
  What are limitations of PainlessMesh?
&lt;/h2&gt;

&lt;p&gt;If you know little bit about IOT you would have already identified limitations of PainlessMesh.&lt;/p&gt;

&lt;p&gt;As it uses json based communication. More data will be consumed for just sending data.&lt;/p&gt;

&lt;p&gt;As painlessmesh uses json to keep network alive. It will consume more power. That means instead of sending data esp8266 will be consuming lot of power to keep network alive.&lt;/p&gt;

&lt;p&gt;There are many other limitations too. Also I found 2 articles which they had made performance check of painlessmesh. Here is one of the article &lt;a href=&quot;https://www.mdpi.com/2078-2489/13/5/210&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;Performance Assessment of ESP8266 Wireless Mesh Networks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But despite all these limitations, painlessmesh is a good library for small scale projects. which is compatible with ESP8266 boards.&lt;/p&gt;

&lt;p&gt;Let's start with setting up painlessmesh with ESP8266.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to use PainlessMesh With a NodeMCUv2 (ESP8266) Board?
&lt;/h2&gt;

&lt;p&gt;In Previous article we saw how to use DHT22 sensor with ESP8266 in platformio.&lt;/p&gt;

&lt;p&gt;Do refer if don't know how to setup platformio.&lt;/p&gt;

&lt;p&gt;Now let's focus on setting up painlessmesh with ESP8266.&lt;/p&gt;

&lt;p&gt;In the examples folder of painlessmesh library we can find many examples.&lt;/p&gt;

&lt;p&gt;Let's start with the basic example.&lt;/p&gt;

&lt;p&gt;Add this in platformio.ini file.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
upload_speed = 115200
monitor_speed = 115200
upload_port = /dev/ttyUSB0
monitor_port = /dev/ttyUSB0
lib_deps = 
    painlessmesh/painlessMesh @ ^1.5.0
    bblanchon/ArduinoJson @ ^7.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And upload the same code to 2 ESP8266 boards.&lt;/p&gt;

&lt;p&gt;Add this in main.cpp file.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;Arduino.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;
#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;painlessMesh.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;
#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;ArduinoJson.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#define   MESH_PREFIX     &quot;MyMeshNetwork&quot;
#define   MESH_PASSWORD   &quot;SecretPassword&quot;
#define   MESH_PORT       5555
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;userScheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// to control your personal task&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;painlessMesh&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Prototype&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;receivedCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Send my ID every 10 seconds to inform others that I am the Server&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;logServerTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TASK_FOREVER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;JsonDocument&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jsonBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;JsonObject&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jsonBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;JsonObject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;topic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;logServer&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nodeId&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getNodeId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;serializeJson&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sendBroadcast&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// log to serial&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;serializeJson&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;115200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Keep debug messages clean: only show errors and connections&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setDebugMsgTypes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ERROR&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONNECTION&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;  

  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MESH_PREFIX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MESH_PASSWORD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;userScheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MESH_PORT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WIFI_AP_STA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;onReceive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;receivedCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;onNewConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([](&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;New Connection %u&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;onDroppedConnection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([](&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Dropped Connection %u&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Add the task to your scheduler&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;userScheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;addTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logServerTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;logServerTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;mesh&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;receivedCallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;logServer: Received from %u msg=%s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialize the mesh network.&lt;/p&gt;

&lt;p&gt;Add debug messages.&lt;/p&gt;

&lt;p&gt;Add new connection callback.&lt;/p&gt;

&lt;p&gt;Add dropped connection callback.&lt;/p&gt;

&lt;p&gt;Add the task to your scheduler. To make the wifi keep alive.&lt;/p&gt;

&lt;p&gt;Compile and upload the code to 2 ESP8266 boards.&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;New Connection 1
New Connection 2
logServer: Received from 1 &lt;span class=&quot;nv&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;topic&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;logServer&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;nodeId&quot;&lt;/span&gt;:1&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
logServer: Received from 2 &lt;span class=&quot;nv&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;={&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;topic&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;logServer&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;nodeId&quot;&lt;/span&gt;:2&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Will be shareing detailed example on how to connect painlessmesh with DHT22 sensor in next article.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabn6nl3iehrohehnxgje.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;373&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It&amp;rsquo;s online, source-available, and ready for anyone to use. &lt;br&gt;
&amp;#11088; Star it on GitHub: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;https://github.com/HexmosTech/git-lrc&lt;/a&gt;&lt;/p&gt;


</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13370/how-to-set-up-painlessmesh-with-a-nodemcuv2-esp8266-board</guid>
<pubDate>Sat, 04 Apr 2026 08:38:27 +0000</pubDate>
</item>
</channel>
</rss>