v0.0.0
EN SV

AkvaLink

Battery-powered Matter pool & aquatic temperature sensor

Single-SoC on u-blox NORA-W40 (ESP32-C6, Wi-Fi 6 + Thread + BLE 5.3).
Multi-year battery life · Local Matter connectivity · No cloud, ever.

View on GitHub Download firmware How it works

See it live

Connect straight to a nearby AkvaLink over Bluetooth — no app, right in your browser.

Needs a device already flashed with the BLE-only variant (see downloads below) — the other variants don't expose this.

°C
Not connected

Connect via Bluetooth

Why AkvaLink?

For pools, spas, aquariums, wine cellars and cold storage — places where the temperature barely changes, but you want to know immediately when it does.

🔋

Years on 2× AA

Adaptive sampling, Matter Sleepy End Device, and threshold reporting keep the radio asleep.

📱

Apple / Google / Alexa

A standard Matter Temperature Sensor — commission by scanning a QR, no app to install.

🌐

No cloud

Local Matter over Thread or Wi-Fi. Your data never leaves your home network.

💧

Waterproof probe

DS18B20 in stainless steel, 10 m+ cable possible — drop it in and forget it.

🛠️

Open source

Built on esp-matter, Apache-2.0 licensed. Single-SoC — no companion MCU.

🩺

Honest engineering

Battery math, RF rules and known limitations are documented, not hand-waved.

One firmware family, more silicon

Same Matter/BLE app, same web & app frontend — AkvaLink isn't tied to one chip. Everything on this page is the NORA-W40 build; other modules are landing over time.

📟

NORA-W40 Available now

Espressif ESP32-C6 — Wi-Fi 6, Thread, BLE 5.3. The flagship build documented below.

🧭

NORA-B2 In development

Nordic nRF54L — BLE, Thread, Matter. A non-Espressif option, for customers who want silicon made outside China.

Hardware

One tiny module, one sensor, one pull-up resistor.

ComponentPartWhy
ModuleNORA-W401 / NORA-W406Wi-Fi 6 + Thread + BLE in one module
MCUESP32-C6 (RISC-V @ 160 MHz)Inside NORA-W40
SensorDS18B20 (stainless probe)±0.5 °C, 12-bit (0.0625 °C), 1-Wire, ~$3
Power2× AA alkaline (or 18650 Li)~12 years on 2× AA in pool conditions
4.7 kΩ NORA-W40 ESP32-C6 3V3 GPIO15 GND GPIO9 ADCx DS18B20 one wire sensor VDD DQ GND BOOT hold 5 s → erase Wi-Fi · re-provision future · not yet populated BAT+ R1 390 kΩ R2 100 kΩ

GPIO15 → DS18B20. One 4.7 kΩ pull-up. GPIO9 (BOOT) doubles as a re-provisioning button. Dashed box = future battery ADC circuit (R1/R2 voltage divider, 390 kΩ / 100 kΩ).

Battery life

Heated pool at 28–29 °C with a 0.25 °C report threshold.

BatteryThread SEDWi-Fi (TWT)Wi-Fi (disconnect)
CR2477 (1000 mAh)~5 years~6 months~3.3 years
2× AAA (1200 mAh)~6 years~8 months~4 years
2× AA (2800 mAh)~12 years~1.8 years~9 years
18650 (3400 mAh)~15+ years~2.2 years~11 years

Estimates from the power model — real measurement (PPK2/Joulescope) is on the roadmap. In practice, alkaline AA self-discharge and shelf-life cap real-world life at roughly 5–7 years regardless of draw; lithium AA (e.g. Energizer L91) last longer and cope far better with outdoor cold.

How it works

Everything runs on the one ESP32-C6 inside NORA-W40 — no companion MCU.

1

Sense

Read the DS18B20 over 1-Wire with adaptive sampling — fast while changing, slow when stable.

2

Gate

Only report when the temperature moves past a threshold, so the radio stays asleep.

3

Report

Push the reading over Matter — Thread (Sleepy End Device) or Wi-Fi (TWT).

4

Show

It appears in Apple Home, Google Home or Alexa as a standard temperature sensor.

Build variants

One codebase, one SoC — pick the network at build time.

VariantFlagStack
Matter / Thread (default)(none)esp-matter, OpenThread, BLE commissioning
Matter / Wi-Fi--wifiesp-matter, Wi-Fi, BLE commissioning
BLE-only--bleNimBLE GATT — no hub, no router
Wi-Fi AP (mains/USB)--apSoftAP “AkvaLink” + captive web page, any phone; no router needed
Wi-Fi station (mains/USB)--stationJoins home Wi-Fi (BLE-provisioned), unique akvalink-<last4mac>.local + HA MQTT autodiscovery; no hub
Sensor test--sensorRead & log the probe only

Download firmware

Prebuilt single-image binaries for the NORA-W40 (ESP32-C6) — always the latest release.

Not sure which? Thread and Wi-Fi join Apple / Google / Alexa as a standard Matter sensor. ESPHome integrates natively with Home Assistant. BLE-only talks straight to your phone. AP and Station serve a live web page — no hub, no app, just a browser (need mains/USB power).

Latest release

1Flash it

Pick a variant, then flash the full image — command line, or straight from the browser over USB.

Thread

Matter over Thread · best battery. Needs a hub — HomePod, Apple TV, Nest or Echo.

Wi-Fi

Matter over Wi-Fi · no Thread hub. Runs on battery too — just fewer years. Your router + any Matter app.

BLE-only

No hub, no cloud · straight to your phone over Bluetooth.

Wi-Fi AP

Open hotspot “AkvaLink” · join it, the page opens automatically. No router, no app, any phone. Needs mains/USB power.

Wi-Fi station

Joins your home Wi-Fi (provisioned once over BLE). Open akvalink-<last4mac>.local in any browser on your LAN. Auto-discovered by Home Assistant via MQTT. Multiple devices get unique hostnames. Needs mains/USB power.

ESP-NOW

Deep-sleep broadcast — wakes, reads DS18B20, sends one packet to any ESP32 on the same Wi-Fi channel, sleeps. No hub, no provisioning, maximum battery life. Receiver needs an ESP32 sketch.

ESPHome

Native Home Assistant API — no MQTT broker needed. Flash once, adopt in the ESPHome dashboard, OTA-update from Home Assistant. Provisioned with Improv over USB serial.

⚡ Flash via USB — click it, pick the serial port, done. No install, no drivers: it flashes straight from the browser over the Web Serial API. Needs Chrome, Edge, or Opera (desktop, v89+) — Firefox and Safari don't support Web Serial, so the button hides itself there.

esptool .bin — the same full merged image, flashed from the command line instead: pip install esptool (a small standalone PyPI package — no full ESP-IDF needed), then esptool --chip esp32c6 write-flash 0x0 <file>.bin. Rather not touch Python? Grab a prebuilt binary from the esptool releases page instead. Note: esptool v5 renamed subcommands with hyphens (write-flash, merge-bin) — v4 used underscores (write_flash); if a copied command errors, that's usually why.

OTA .bin — app partition only. Use for updating within the same variant (BLE→BLE, Thread→Thread, etc.) without touching NVS or commissioning data. Cross-variant OTA is possible but requires a factory reset after. · All releases & changelog

Wi-Fi®, Bluetooth®, Thread® and Matter™ are trademarks of the Wi-Fi Alliance, Bluetooth SIG, Thread Group and Connectivity Standards Alliance — named here only to describe compatibility. AkvaLink is not officially certified by any of them; the icons above are drawn in our own monochrome style, not the organizations' official colored certification logos.


2Update it wirelessly

Already flashed the BLE-only variant? Update it again with no cable at all — this page can fetch and flash new firmware straight over Bluetooth.

Firmware update over Bluetooth

Only works if the device is currently running the BLE-only firmware — it's the only variant with this update service built in. Flashing a brand-new device for the first time? Use USB flash or esptool instead.

Option A — one click

Flash latest firmware

— or —

Option B — pick a specific file

Reinstall an older version, or cross-flash to a different variant (needs a factory reset after).

No file chosen

Update firmware

Prefer a native app over the browser? The AkvaLink companion app (Windows/Linux/macOS/Android/iOS) shows live temperature and flashes OTA updates too — build it from source.

Status & roadmap

Working today, and where it's headed.