Thinger.io
A Visual Studio Code extension that provides remote OTA updates over Thinger.io for devices based on Arduino Framework. Supported boards (any board with an OTA header in the Thinger.io Arduino Library):
| Boards |
Compression |
| Espressif ESP32, ESP32-S2, S3, C3, C5, C6, P4, Arduino Nano ESP32, Seeed XIAO ESP32 |
zlib |
| Espressif ESP8266 |
gzip (with ATOMIC_FS_UPDATE) |
| Raspberry Pi Pico W, Pico 2 W (Arduino-Pico core) |
gzip (with THINGER_OTA_COMPRESSION 1) |
| Arduino Portenta H7, Opta |
lzss |
| Arduino Nano 33 IoT, MKR WiFi 1010 |
|
| Arduino Nano RP2040 Connect |
|
| Arduino MKR NB 1500 |
|
| Arduino UNO R4 WiFi (experimental) |
|
| Thinger NB-IoT Core (BC660) |
zlib |
This extension integrates with PlatformIO to automatically build and upload the firmware to your devices over the Internet.

Features
- OTA updates directly from the Internet over Thinger.io
- Device switcher to search & select the target device for the update
- Real-time device connection status
- Compatible with multiple PlatformIO configuration environments inside a Project
- Automatic build and upload over the Internet in a single click
- OTA with compression (zlib, gzip or lzss, as requested by the device)
- Per-device OTA timeout and block size, with optional overrides for slow connections
- OTA check: warns before installing a firmware built for different hardware
OTA Check
Devices sharing the same board can have different hardware (PCB model, sensors, display...). To avoid installing the wrong firmware, declare the hardware fields in the sketch before including the OTA header (requires Thinger.io Arduino Library 2.47.0 or newer):
#define THINGER_OTA_CHECK(FIELD) \
FIELD("PCB_MODEL", "SENSOR_I2C") \
FIELD("PCB_VERSION", "V2")
#include <ThingerESP32OTA.h>
The fields are embedded in the firmware and reported by the device. Before updating, the extension compares the fields of the running device with the ones of the new firmware:
- Equal fields: the update starts as usual.
- Different fields, or a firmware without fields for a device that has them: the changed, added and removed fields are shown, and the update needs confirmation. When updating a product, the answer can be applied to all its devices (Continue for All or Skip All).
- Devices without fields are updated as usual.
An equal firmware version does not skip the update when the fields do not match. Fields are case-sensitive strings: up to 16 fields, with keys up to 32 bytes and values up to 128 bytes.
The device also enforces the check: it rejects any update whose fields are not equal to its own, unless the update was confirmed. Devices with OTA check require this extension version 1.2.0 or newer.
Recommendations
- To improve performance in the OTA update, set
Application > Proxy > Proxy Support to fallback instead of default override.
Requirements
- VSCode PlatformIO extension for building firmware.
- Thinger.io Arduino Library (2.41.0 or newer for per-device timeouts, 2.42.0 or newer for Raspberry Pi Pico, 2.47.0 or newer for OTA check).
Extension Settings
This extension contributes the following settings:
thinger-io.host: Thinger.io instance host. Defaults to community instances.
thinger-io.port: Thinger.io instance port. Defaults to 443.
thinger-io.ssl : Use SSL/TLS encryption. Default to true.
thinger-io.secure: Verify SSL/TLS connection. Defaults to true.
thinger-io.token: Thinger.io instance token for access devices.
thinger-io.otaTimeout: Override the OTA timeout in seconds. Defaults to 0 (use the device timeout, or 30 seconds if the device does not report one).
thinger-io.otaBlockSize: Override the OTA block size in bytes. Defaults to 0 (use the device default). Useful to reduce the packet size on slow connections.