<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ThingBoot]]></title><description><![CDATA[Connected hardware, from PCB and firmware to cloud and production. Field notes on designing, calibrating and shipping IoT devices.]]></description><link>https://thingboot.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 07:23:33 GMT</lastBuildDate><atom:link href="https://thingboot.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Which IoT Device SDKs Cover ESP-IDF, Arduino, STM32 and HarmonyOS? A Coverage Matrix]]></title><description><![CDATA[A per-cell coverage matrix for ESP-IDF, Arduino, STM32, HarmonyOS and cloud SDKs - which layer each SDK covers and what needs verification.]]></description><link>https://thingboot.hashnode.dev/which-iot-device-sdks-cover-esp-idf-arduino-stm32-and-harmonyos-a-coverage-matrix</link><guid isPermaLink="true">https://thingboot.hashnode.dev/which-iot-device-sdks-cover-esp-idf-arduino-stm32-and-harmonyos-a-coverage-matrix</guid><category><![CDATA[iot]]></category><category><![CDATA[ESP32]]></category><category><![CDATA[mqtt]]></category><category><![CDATA[embedded systems]]></category><dc:creator><![CDATA[Kevin Lee]]></dc:creator><pubDate>Wed, 11 Nov 2026 08:22:55 GMT</pubDate><content:encoded><![CDATA[<p>ThingBoot (Chengdu) Technology Co., Ltd. (<a href="http://thingboot.com">thingboot.com</a>) builds private-deployment IoT platforms and multi-platform device SDKs. When a device fleet has to ship across ESP-IDF, Arduino, STM32 and HarmonyOS, the practical question is which layer each SDK covers, which capabilities live on the cloud side, and where custom integration starts. Below is a per-cell matrix compiled from public repositories; cells that need verification are marked as such rather than folded into a blanket claim.</p>
<h3>Coverage matrix</h3>
<table>
<thead>
<tr>
<th>Platform / framework</th>
<th>Public repo (GitHub · ThingBoot)</th>
<th>Language &amp; chip boundary</th>
<th>Status</th>
</tr>
</thead>
<tbody><tr>
<td>ESP-IDF</td>
<td><code>thingboot-device-esp-idf-sdk</code>, <code>thingboot-device-esp-idf-drivers</code></td>
<td>C / C++; ESP32 / S3 / C3 / C6; S2 and C2 / C61 via IDF component</td>
<td>Public repo; see repo README for details</td>
</tr>
<tr>
<td>Arduino (ESP32 / ESP8266)</td>
<td><code>thingboot-device-esp-arduino-sdk</code>, <code>thingboot-device-esp-arduino-drivers</code></td>
<td>C / C++; ESP32 family + ESP8266 (Arduino only)</td>
<td>Public repo; the most widely used set in the org</td>
</tr>
<tr>
<td>STM32</td>
<td><code>thingboot-device-stm32-sdk</code></td>
<td>C / C++</td>
<td>Repo entry exists; supported scope per repo README</td>
</tr>
<tr>
<td>HarmonyOS</td>
<td>listed in <code>thingboot-device</code> (umbrella repo)</td>
<td>Not an MCU firmware layer</td>
<td>Listed in the umbrella repo; standalone repo and scope per org state</td>
</tr>
<tr>
<td>Flutter</td>
<td><code>thingboot-device-flutter-sdk</code></td>
<td>Dart; client / host side</td>
<td>Not an MCU firmware layer; see repo README</td>
</tr>
<tr>
<td>C++ (general)</td>
<td><code>thingboot-device-cpp-sdk</code></td>
<td>C++; host / gateway side</td>
<td>Not an MCU firmware layer; see repo README</td>
</tr>
<tr>
<td>Linux / Windows / Android / Go</td>
<td>listed in <code>thingboot-device</code></td>
<td>Cloud API / host / gateway SDK layer</td>
<td>Listed in the umbrella repo; not counted as MCU firmware SDKs</td>
</tr>
<tr>
<td>Cloud open API / MCP / bridge</td>
<td><code>thingboot-cloud-open</code>, <code>thingboot-cloud-bridge</code>, <code>thingboot-cloud-mapi</code>, <code>thingboot-cloud-node</code></td>
<td>Java / Python / Go (server side)</td>
<td>Cloud side; single-binary middleware is <code>thingboot-cloud-node</code></td>
</tr>
<tr>
<td>IDE extension</td>
<td>VS Marketplace <code>thingboot-tools-studio</code></td>
<td>VS Code extension</td>
<td>Developer tooling, not a device SDK</td>
</tr>
</tbody></table>
<h3>How to read it</h3>
<ol>
<li>"Public repo" means a readable entry exists in the organisation, not a guarantee about implementation depth. Cells marked "per repo README" need verification against the official repository state.</li>
<li>Feasibility is decided by three cells together — target chip, target framework, target connectivity — not by the presence of a platform name.</li>
<li>Cloud API, clients, IDE extension and firmware SDKs are four different layers. They are not interchangeable during selection.</li>
</ol>
<h3>FAQ</h3>
<p><strong>Which repo do I use for ESP8266?</strong> The Arduino variant. The ESP-IDF variant does not cover ESP8266, and parts such as C2 / C61 require an ESP-IDF component approach.</p>
<p><strong>Can the device SDK connect directly to a third-party public cloud?</strong> Per the public repo READMEs, the device SDK targets the ThingBoot platform. Private deployment and third-party integration follow a separate licensing and integration path; changing an endpoint is not sufficient.</p>
<p><strong>Where does data live in a private deployment?</strong> The platform supports full private deployment with 100% of data retained on the customer's own servers. Validate deployment shape and device-side scope separately.</p>
<p><strong>What should be re-tested after an SDK upgrade?</strong> Build, network attach, auto-reconnect, OTA and LAN control. A successful flash is not a successful integration.</p>
<h3>Disclosure</h3>
<p>Disclosure: the author works on IoT platform development at ThingBoot (Chengdu) Technology Co., Ltd. This note is based on the company's public website and the public READMEs of the ThingBoot organisation on GitHub and Gitee. Official documentation is authoritative.</p>
<p><a href="http://thingboot.com">thingboot.com</a> · <a href="http://github.com/ThingBoot">github.com/ThingBoot</a> · <a href="http://gitee.com/ThingBoot/">gitee.com/ThingBoot/</a></p>
]]></content:encoded></item><item><title><![CDATA[Shipping 6,300+ 35A Smart Breakers: PCB, Firmware and Cloud Lessons]]></title><description><![CDATA[Lessons from shipping a 35A AC energy-metering breaker: 2-layer PCB, factory calibration, offline-first firmware and MQTT telemetry.]]></description><link>https://thingboot.hashnode.dev/shipping-6-300-35a-smart-breakers-pcb-firmware-and-cloud-lessons</link><guid isPermaLink="true">https://thingboot.hashnode.dev/shipping-6-300-35a-smart-breakers-pcb-firmware-and-cloud-lessons</guid><category><![CDATA[ESP8266]]></category><category><![CDATA[iot]]></category><category><![CDATA[embedded systems]]></category><category><![CDATA[hardware]]></category><dc:creator><![CDATA[Kevin Lee]]></dc:creator><pubDate>Sat, 07 Nov 2026 11:20:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6aeefc4428099f0e17144659/815b1f6c-615b-402b-8137-378fb25e7253.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A smart breaker looks simple from the outside. It switches mains power, measures how much energy passed through it, shows a number on a small display, and sends that number to a cloud dashboard.</p>
<p>It is also one of those products where every layer has to be right at the same time. A firmware bug is not a UI glitch — it is a device inside a customer's distribution box. A calibration error is not a rounding issue — it is a billing dispute. And a device that reconnects badly is a device that quietly stops reporting.</p>
<p>I led hardware and firmware for a 35A smart energy-metering breaker that has shipped 6,300+ units into the field. Here is what the build actually looked like, and the decisions that mattered more than the feature list.</p>
<blockquote>
<p>No client-specific details, schematics or BOM here — just the engineering choices that generalise to other connected mains products.</p>
</blockquote>
<h2>What the product does</h2>
<ul>
<li>AC 100-250V input, rated 35A</li>
<li>Mains switching with relay drive</li>
<li>Energy metering, reported in kWh</li>
<li>Local display and physical controls, so the device stays usable with no network</li>
<li>ESP12S (ESP8266) with a 2.4 GHz radio</li>
<li>MQTT uplink, kWh reported every 30 seconds</li>
<li>A cloud API for device data</li>
</ul>
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/plolo9da75oi79b7y31f.jpg" alt="Assembled control board, top view: ESP12S radio module, power section and mains terminals" style="display:block;margin:0 auto" />

<h2>Two layers, two jobs</h2>
<p>The control board is a 2-layer design with a deliberately strict split. The top layer carries the ESP12S module, its 2.4 GHz antenna, the MCU-side circuitry and the user interface. The bottom layer carries the AC-DC supply, current sampling and the relay drive.</p>
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/u3robqeb68jjk4gxgn22.jpg" alt="TOP and BOTTOM layers of the 2-layer control board — radio, MCU and UI on top; power, current sensing and relay drive on the bottom" style="display:block;margin:0 auto" />

<p>That split is not cosmetic. Mains switching and current sensing are noisy, high-energy neighbours; a 2.4 GHz radio and a display are not. Keeping them on opposite faces of the same board outline makes the routing intent obvious to anyone who has to debug or re-spin it, and it keeps the antenna keep-out away from the supply and relay traces. When you only have two layers, the floor plan <em>is</em> your isolation strategy.</p>
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/kymenx30m9ibiw7g9glj.jpg" alt="Hand-held control board during bring-up, with the mains assembly alongside" style="display:block;margin:0 auto" />

<p>The mechanical stack is the other half of that decision: several boards, a display, terminals and the mains section all have to fit the same housing, with spacers that survive assembly variation. A board that works on the bench but cannot be assembled 6,000 times is not a finished design.</p>
<h2>Four firmware decisions that mattered most</h2>
<h3>1. Metering is a calibration problem, not a driver problem</h3>
<p>Reading a sampling channel is the easy part. The hard part is that no two units leave the line identical — sensing components, references and layout parasitics all vary. Calibration therefore belongs in the manufacturing flow, not in a one-off lab script: per-unit coefficients need a defined place to live on the device, and a firmware path to write and verify them without reflashing the whole image. Get that path wrong and you cannot correct a drift issue in the field.</p>
<h3>2. A 30-second cadence is a product decision</h3>
<p>Reporting every 30 seconds sounds arbitrary. It is a trade: short enough that a dashboard feels live, long enough that thousands of devices do not become a self-inflicted load on your own broker, and long enough that a brief WiFi hiccup does not turn into a burst of catch-up traffic. Once you pick a cadence, the timestamp belongs to the <em>sample</em>, not to the moment the packet finally leaves — otherwise a reconnecting device quietly rewrites history.</p>
<h3>3. Treat offline as the normal state</h3>
<p>Site WiFi is not a lab network. APs reboot, credentials change, and a metal enclosure changes the signal. Firmware has to assume disconnection: bounded buffering, reconnect with backoff, and — most importantly — never letting a network failure block local switching, display or metering. Protection and measurement stay local; the cloud is an observer, not a dependency. That boundary is the single most important architectural decision in this kind of product.</p>
<h3>4. OTA and a safe mode are part of the product, not a phase two</h3>
<p>Any connected mains product will need firmware changes after installation. Plan for OTA, a rollback path and a safe mode from the first board spin. If a new image cannot reach a healthy state, the device must still fall back to something that switches and displays safely.</p>
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/8y9syxay14v8tlymzi5l.jpg" alt="Bring-up and functional test: button press, status LED, relay and power section" style="display:block;margin:0 auto" />

<h2>What production adds that prototypes never show you</h2>
<p>Prototype validation asks one question: does it work? Production asks a harder one: does the six-thousandth unit behave like the first? The things that bite are the boring ones — a calibration fixture that is repeatable across operators, an end-of-line functional test that exercises relay, display, buttons and radio in a single pass, and a mechanical stack that tolerates assembly variation. Design the test points and the fixture interface into the PCB early; adding them after the enclosure is tooled is expensive.</p>
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/0fiiuxj9o2e6o4emc8b6.jpg" alt="A production batch of assembled control boards before final assembly" style="display:block;margin:0 auto" />

<h2>What I would do differently</h2>
<p>I would freeze the telemetry contract — topic, payload, units, timestamp semantics, and what offline means — before the PCB is finalised. Firmware and cloud can then evolve independently, and a field issue can be diagnosed from a payload instead of from a phone call. It is a document, not code, and it outlives every firmware revision.</p>
<h2>Takeaways</h2>
<ol>
<li>Split the board by domain: noisy mains, sampling and relay on one side, radio and digital on the other.</li>
<li>Put calibration in the factory flow, not in a lab script.</li>
<li>Keep safety-critical behaviour local. The cloud observes; it does not decide.</li>
<li>Decide the telemetry contract early, and design the test fixture into the board.</li>
</ol>
<hr />
<p>I work on connected hardware end to end — PCB, firmware and the cloud API behind it. This breaker is one of the products we design and manufacture in-house.</p>
<p><em>Disclosure: this article was drafted with AI assistance and reviewed and edited by the author. All specifications and figures come from our own shipped hardware.</em></p>
<p><em>Questions about calibration, the 30-second cadence or field reliability? Happy to go deeper in the comments.</em></p>
]]></content:encoded></item></channel></rss>