Batteridriven Matter-temperatursensor för pool och vatten
Single-SoC baserad på u-blox NORA-W40 (ESP32-C6, Wi-Fi 6 + Thread + BLE 5.3).
Batteritid på flera år · Lokal Matter-kommunikation · Ingen molnanslutning, någonsin.
Visa på GitHub Ladda ner firmware Ladda ner app Hur det fungerar
För pooler, spas, akvarium, vinkällare och kylrum — platser där temperaturen knappt förändras, men du vill veta omedelbart när den gör det.
Adaptiv sampling, Matter Sleepy End Device och tröskelrapportering håller radion i viloläge.
En standard Matter-temperatursensor — driftsätt via QR-kod, ingen app att installera.
Lokal Matter via Thread eller Wi-Fi. Din data lämnar aldrig ditt hemnätverk.
DS18B20 i rostfritt stål, kabel på 10+ m möjlig — doppa den och glöm den.
Byggd på esp-matter, Apache-2.0-licensierad. Single-SoC — ingen kompanjon-MCU.
Batteriräkneexempel, RF-regler och kända begränsningar är dokumenterade, inte bortförklarade.
Varför inte bara köpa en Inkbird- eller Govee-pooltermometer (~250 kr)? De fungerar bra — men de skickar din vattentemperatur genom leverantörens moln, app och konto. AkvaLink gör samma jobb utan konto, utan appkrav och utan beroende av att ett företag stannar kvar i drift.
En Flutter-kodbas, fem plattformar — live-temperatur över Bluetooth eller Wi-Fi, uppvärmnings-/ avsvalningstakt (°C/h), hög/låg-temperaturlarm som sparas i enheten, historik för 24 h / 7 d, OTA med ett klick som väljer rätt firmware automatiskt, och ett demoläge som kör hela appen på simulerad pooldata — ingen hårdvara behövs för att prova. Samma inga-moln-regel som firmwaren.
Kompanjonapp för iPhone / iPad. Byggs med Xcode på en Mac.
akvalink.sh --app --iosFärdigbyggd .zip (osignerad), eller bygg & kör från källkod.
akvalink.cmd --app --runBygg & kör här på skrivbordet.
akvalink.sh --app --runXcode krävs, samma som iOS.
akvalink.sh --app --macosWindows och Android är färdigbyggda och bifogas varje GitHub-release. Windows-bygget är osignerat (SmartScreen varnar vid första körning) och APK:n kräver "installera från okända källor" — ingen appbutik ännu. iOS, macOS och Linux byggs fortfarande från källkod; det finns ingen Apple- eller Linux-CI att signera/paketera dem med.
Apple, Android, Windows och Linux/Tux är varumärken eller symboler som tillhör respektive ägare, nämnda här enbart för att visa plattformsstöd — ikonerna ovan är våra egna enfärgade glyfer, inte de officiella logotyperna.
Förbyggda enfilsbinärer för NORA-W40 (ESP32-C6) — alltid senaste releasen.
Hur vill du nå den till vardags?
Har du redan en Thread-gränsrouter — HomePod mini/2, Apple TV 4K, Nest Hub (2:a gen+) eller Echo (4:e gen+)?
Vill du ha noll extra konfiguration, eller kör du redan MQTT?
Har du Wi-Fi att ge den, eller vill du ha en fristående hotspot utan router?
Rekommenderas: — Hoppa till den ↓
Välj en variant, flasha sedan hela avbildningen — kommandoraden, eller direkt från webbläsaren via USB.
Matter via Thread · bäst batteri. Kräver en hub — HomePod, Apple TV, Nest eller Echo.
Matter via Wi-Fi · ingen Thread-hub. Går också på batteri — men färre år. Din router + valfri Matter-app.
Ingen hub, inget moln · direkt till din telefon via Bluetooth.
Inbyggt Home Assistant-API — ingen MQTT-broker behövs. Flasha en gång, adoptera i ESPHome-dashboarden, OTA-uppdatera från Home Assistant. Driftsätts med Improv via USB-seriell.
Öppet nätverk “AkvaLink” · anslut, sidan öppnas automatiskt. Ingen router, ingen app, vilken telefon som helst. Kräver nät/USB-ström.
Ansluter till ditt hemma-Wi-Fi (driftsätts en gång via BLE). Öppna akvalink-<sista4mac>.local i valfri webbläsare på ditt LAN. Autodetekteras av Home Assistant via MQTT. Flera enheter får unika värdnamn. Kräver nät/USB-ström.
Deep-sleep-utsändning — vaknar, läser DS18B20, skickar ett paket till valfri ESP32 på samma Wi-Fi-kanal, sover. Ingen hub, ingen driftsättning, maximal batteritid. Mottagaren behöver en ESP32-skiss.
Flasha via USB — klicka, välj serieporten, klart. Ingen installation, inga drivrutiner: flashar direkt från webbläsaren via Web Serial API. Kräver Chrome, Edge eller Opera (dator, v89+) — Firefox och Safari saknar stöd för Web Serial, så knappen döljer sig själv där.
esptool .bin — samma fullständiga bild, flashad från kommandoraden istället: pip install esptool (ett litet fristående PyPI-paket — hela ESP-IDF behövs inte), sedan esptool --chip esp32c6 write-flash 0x0 <fil>.bin. Vill du hellre slippa Python? Hämta en färdigbyggd binär från esptools release-sida istället. Obs: esptool v5 döpte om underkommandon med bindestreck (write-flash, merge-bin) — v4 använde understreck (write_flash); om ett kopierat kommando ger fel är det oftast därför.
OTA .bin — enbart app-partition. Använd för uppdatering inom samma variant (BLE→BLE, Thread→Thread osv.) utan att påverka NVS eller driftsättningsdata. Korsvariant-OTA (t.ex. BLE→Thread) är möjlig men kräver fabråterställning efterpå. · Alla releaser & ändringslogg
Wi-Fi®, Bluetooth®, Thread® och Matter™ är varumärken som tillhör Wi-Fi Alliance, Bluetooth SIG, Thread Group respektive Connectivity Standards Alliance — nämns här enbart för att beskriva kompatibilitet. AkvaLink är inte officiellt certifierad av någon av dem; ikonerna ovan är ritade i vår egen enfärgade stil, inte organisationernas officiella färgade certifieringslogotyper.
Redan flashat varianten Endast BLE? Uppdatera igen utan någon kabel alls — sidan kan hämta och flasha ny firmware direkt via Bluetooth.
Fungerar bara om enheten just nu kör firmware-varianten Endast BLE — det är den enda varianten med denna uppdateringstjänst inbyggd. Flashar du en helt ny enhet för första gången? Använd USB-flash eller esptool istället.
Alternativ A — ett klick
— eller —
Alternativ B — välj en specifik fil
Installera om en äldre version, eller korsflasha till en annan variant (kräver fabriksåterställning efteråt).
Ingen fil valdFöredrar du en egen app framför webbläsaren? Samma live-temperatur och OTA med ett klick, utan Web Bluetooth.
iOS, macOS och Linux byggs fortfarande från källkod — se följarapp-sektionen ovan för detaljer.
Anslut direkt till en AkvaLink i närheten via Bluetooth — ingen app, direkt i din webbläsare.
Kräver en enhet som redan flashats med varianten Endast BLE (se nedladdningarna ovan) — de andra varianterna exponerar inte detta.
Temperaturlarm
Sparas i enheten själv, i °C. Den flaggar en varning när vattnet passerar en gräns — lämna fältet tomt för att stänga av det.
Vad som faktiskt ligger på länken — hela GATT-tjänstetabellen som exponeras av Endast BLE-firmware, med UUID:er och allt, om du vill bygga din egen klient:
| Tjänst | Karakteristik | UUID | Egenskaper | Nyttolast |
|---|---|---|---|---|
Environmental Sensing0x181A | Temperatur | 0x2A6E | Läs, meddela | sint16, 0,01 °C, little-endian — kortet ovan prenumererar på denna |
Device Information0x180A | Tillverkare | 0x2A29 | Läs | "u-blox" |
| Modell | 0x2A24 | Läs | "AkvaLink NORA-W40" | |
| Firmwareversion | 0x2A26 | Läs | "{version}-{variant}" — det "Flasha senaste firmware" jämför mot | |
Battery0x180F | Batterinivå | 0x2A19 | Läs | uint8, 0–100 % — läsningen misslyckas tills en verklig mätning finns, så klienter visar "okänt" i stället för en påhittad nivå. Ingen spänningsdelare är monterad än; slå på CONFIG_AKVALINK_BATTERY_ADC när en finns. |
AkvaLink (egen)…6c0001 | Drifttid | …6c0002 | Läs | uint32, sekunder sedan start |
| Enhetsnamn | …6c0003 | Läs, skriv | UTF-8-sträng, sparas i NVS, gäller från nästa omstart | |
| Larm hög | …6c0004 | Läs, skriv | sint16, 0,01 °C, sparas i NVS, 0 = avstängt | |
| Larm låg | …6c0005 | Läs, skriv | sint16, 0,01 °C, sparas i NVS, 0 = avstängt | |
AkvaLink OTA (egen)…6c0010 | Kontroll | …6c0011 | Skriv, meddela | 0x01 BEGIN / 0x02 END / 0x03 ABORT; meddelar [opcode, resultat] |
| Data | …6c0012 | Skriv, skriv-utan-svar | Rå firmware i bitar, i ordning — används av "Uppdatera firmware via Bluetooth" ovan |
De egna tjänsterna AkvaLink och AkvaLink OTA delar en 128-bitars bas-UUID, f0a00001-6e40-4a71-9b2c-6b6e696c00XX — bara sista byten (visas ovan som …6cXX) ändras per tjänst/karakteristik. Fullständigt kontrakt i docs/CONNECTIVITY.md.
Nyfiken på hur det faktiskt fungerar? Kiselval, koppling, batterimatematik, protokollflödet och alla byggvarianter — den djupa tekniska detaljen börjar här.
Samma Matter/BLE-app, samma webb- och app-gränssnitt — AkvaLink är inte bundet till ett chip. Allt på den här sidan är NORA-W40-bygget; fler moduler kommer efter hand.
Espressif ESP32-C6 — Wi-Fi 6, Thread, BLE 5.3. Flaggskeppsbygget som dokumenteras nedan.
Nordic nRF54L — BLE, Thread, Matter. Ett alternativ utan Espressif-kisel, för team som behöver en andra kiselkälla eller har särskilda krav på leverantörskedjan.
Utzoomat från kopplingsschemat nedan — så tar sig en avläsning från proben till din telefon, och varför inget däremellan är en molnserver.
Varje pil ovan stannar på ditt lokala nätverk eller en direkt Bluetooth-länk — samma inget-moln-regel som resten av AkvaLink.
En liten modul, en sensor, ett pull-up-motstånd.
| Komponent | Del | Varför |
|---|---|---|
| Modul | NORA-W401 / NORA-W406 | Wi-Fi 6 + Thread + BLE i en modul |
| MCU | ESP32-C6 (RISC-V @ 160 MHz) | Inuti NORA-W40 |
| Sensor | DS18B20 (rostfri givare) | ±0,5 °C, 12-bit (0,0625 °C), 1-Wire, ~$3 |
| Strömförsörjning | 2× AA alkaline (eller 18650 Li) | ~5–7 år realistiskt på 2× AA (Thread SED, poolförhållanden)* |
GPIO15 → DS18B20. Ett 4,7 kΩ pull-up. GPIO9 (BOOT) dubblar som ominställningsknapp. Streckad ruta = framtida batteri-ADC-krets (R1/R2 spänningsdelare, 390 kΩ / 100 kΩ).
Skarpt läge: EVK-NORA-W40 med DS18B20-sonden kopplad till GPIO15.
4,7 kΩ pull-up, inlött och krympslangat rakt vid sensorkabelns skarv.
Var man får tag i det: utvecklingskortet EVK-NORA-W40 exponerar alla pinnar på en kopplingsdäcksvänlig header — ingen egen PCB-design behövs för att komma igång. DS18B20-sonder i rostfritt stål är en vanlig ~30 kr-del, som säljs brett på Amazon, AliExpress och elektronikdistributörer — för saltklorerade pooler, välj specifikt 316 rostfritt; 304 gropfräter i klorerat saltvatten över tid. Ingen produktionskapsling eller "köp en färdig sensor"-lösning ännu — se färdplanen nedan.
Noggrannhetsnotis: DS18B20:s upplösning på 0,0625 °C är inte samma sak som en noggrannhet på 0,0625 °C — databladets specifikation är ±0,5 °C. Placeringen betyder mer än upplösningen: en sond på en solvärmd kabel, nära ytan, eller grunt i vattnet reagerar snabbare och driver högre än bulkvattnets temperatur; sänk ner den på ett representativt djup, borta från direkt sol och munstycken/retur, för en mätning du kan lita på.
Uppvärmd pool vid 28–29 °C med 0,25 °C rapporteringströskel. Vi leder med den realistiska siffran för varje cell: alkaliska (AAA/AA) självurladdas och litiumjon (18650) åldras kalendariskt, vilket begränsar den verkliga livslängden till ungefär 5–7 år oavsett vad den förbrukningsberoende modellen ensam förutspår — den gränsen visas där modellen överskrider den. CR2477 (litium primärcell) har bäst hållbarhet av de fyra och behöver ingen sådan gräns — dess modellsiffra är redan den realistiska.
| Batteri | Thread SED | Wi-Fi (TWT) | Wi-Fi (frånkopplad) |
|---|---|---|---|
| CR2477 (1000 mAh) | ~5 år | ~6 månader | ~3,3 år |
| 2× AAA (1200 mAh) | ~5–6 år | ~8 månader | ~4 år |
| 2× AA (2800 mAh) | ~5–7 år (modell: ~12 år) | ~1,8 år | ~5–7 år (modell: ~9 år) |
| 18650 litiumjon (3400 mAh) | år, inte decennier (modell: ~15+ år) | ~2,2 år | år, inte decennier (modell: ~11 år) |
Den kursiverade (modell: ...)-siffran är det teoretiska, förbrukningsberoende taket — visas bara där den är märkbart högre än den realistiska siffran. Alkaliska celler självurladdas oavsett belastning; litiumjon åldras kalendariskt och självurladdas ännu snabbare, så "år, inte decennier" ersätter en exakt siffra tills en riktig PPK2/Joulescope-mätning finns. Riktig mätning finns på färdplanen.
Myntcellsbygge (CR2477): myntceller går sönder på toppström, inte kapacitet. En Wi-Fi- eller Thread-sändningsburst kan dra några hundra mA, mer än en CR2477:s inre impedans gillar — lägg till en bulkkondensator (några hundra µF) över modulens matningsskena, annars faller regulatorn ur vid sändningsbursterna.
Allt körs på en ESP32-C6 inuti NORA-W40 — ingen kompanjon-MCU.
Läs DS18B20 via 1-Wire med adaptiv sampling — snabbt vid förändring, långsamt vid stabilitet.
Rapportera bara när temperaturen passerar ett tröskelvärde, så radion förblir i viloläge.
Skicka mätvärdet via Matter — Thread (Sleepy End Device) eller Wi-Fi (TWT).
Det visas i Apple Home, Google Home eller Alexa som en standard-temperatursensor.
En kodbas, en SoC — välj nätverk vid byggtid.
| Variant | Flagga | Stack |
|---|---|---|
| Matter / Thread (standard) | (ingen) | esp-matter, OpenThread, BLE-driftsättning |
| Matter / Wi-Fi | --wifi | esp-matter, Wi-Fi, BLE-driftsättning |
| Endast BLE | --ble | NimBLE GATT — ingen hub, ingen router |
| Wi-Fi AP (nät/USB) | --ap | SoftAP "AkvaLink" + webbsida, vilken telefon som helst; ingen router |
| Wi-Fi station (nät/USB) | --station | Ansluter till hemma-Wi-Fi (BLE-driftsätts), unik sida på akvalink-<sista4mac>.local + HA MQTT; ingen hub |
| Sensortest | --sensor | Läs & logga givaren enbart |
Koppla in kortet med USB och läs loggen direkt här — ingen PuTTY, ingen idf.py monitor, inget att installera. Låst till 115200 baud, 8-N-1, ingen flödeskontroll, vilket är vad alla AkvaLink-byggen använder.
Den håller också utkik efter Matter-kopplingskoden i loggen och ritar om den nedan, stor och mörk mot vitt, så att mobilkameran faktiskt kan läsa den.
Anslut ett kort och tryck sedan på Starta om kortet — QR-koden skrivs bara ut vid uppstart.
Skanna den med Apple Home, Google Home eller Alexa för att lägga till sensorn i ditt hem.
Ett program per port. Koppla ner här innan du använder Flasha via USB eller idf.py monitor — operativsystemet låter bara ett av dem hålla serieporten åt gången.
Starta om kortet pulsar DTR/RTS-linjerna på samma sätt som esptool gör, vilket startar om modulen utan att du drar ur sladden. QR-koden, firmwareversionen och sensorns ID skrivs alla ut under de första två sekunderna, så det är oftast snabbaste sättet att se dem.
Terminalen bara lyssnar. Den skickar aldrig något till enheten, och det är med flit: att ta emot kommandon skulle kräva en uppgift som ligger vaken på serieporten, vilket är precis vad den fleråriga batteritiden bygger på att slippa. Använd Bluetooth eller enhetens egen webbsida för att ändra inställningar. Kräver Chrome, Edge eller Opera (dator, v89+) — Firefox och Safari har inte Web Serial-API:et, så kortet döljer sina knappar där.
Vad AkvaLink skyddar — och vad den inte gör. Ingen molntjänst betyder mindre att försvara, men inte noll.
Inget lämnar ditt nätverk. Det finns ingen server att bryta sig in i och inget konto att läcka.
Den egna BLE-uppdateringstjänsten accepterar vilken avbild som helst som skickas till den — det finns ingen kryptografisk signaturkontroll idag. Vem som helst inom Bluetooth-räckvidd kan skicka firmware. Fungerar för en hobbyenhet på din egen bänk; lita inte på det som enda skydd för något känsligt.
--ap-bygget har medvetet ingen lösenordsskyddad SoftAP (valfri telefon, ingen konfiguration). Exponeringen är begränsad till den som är inom Wi-Fi-räckvidd och den lokala sidan — samma förtroendemodell som många reserouters och IoT-konfigureringshotspots.
Vanlig Matter PASE/CASE-driftsättning via den tryckta konfigureringskoden — samma säkerhetsmodell som alla andra Matter-enheter, inget AkvaLink lägger till eller försvagar.
ESP-NOW-varianten sänder temperaturvärden i klartext utan kryptering eller autentisering. Vem som helst inom räckvidd kan läsa dem — eller förfalska en avläsning. Fungerar för en hobbysensor; inte lämpligt mot en motiverad angripare.
Stationsbyggets lokala webbsida (akvalink.local) har ingen inloggning. Om din MQTT-mäklare kräver användarnamn/lösenord ligger det inbäddat i mäklar-URL:en och kompileras rakt in i firmware-avbilden — vem som helst som extraherar binären kan läsa det. Använd en mäklare på ett betrott lokalt nätverk, eller ett dedikerat MQTT-konto med begränsad behörighet.
Windows-appens nedladdning är för närvarande osignerad. AkvaLinks plan är gratis Authenticode-signering via SignPath.io (certifikat från SignPath Foundation) — se hela policyn för kodsignering för vad som signeras, av vem, och hur man verifierar det.
Exakta versioner i det här bygget — jämför dem mot publika CVE-databaser själv, vi sitter inte på information om sårbarheter.
| Komponent | Version | Roll |
|---|---|---|
| ESP-IDF | v5.5.5 | Espressifs SDK — byggsystem, drivrutiner, strömhantering |
| esp-matter / connectedhomeip | release/v1.5 | Matter (CHIP) applikationsstack |
| OpenThread | medföljer ESP-IDF v5.5.5 | Thread-nätverk (mesh) |
| lwIP | 2.2.0 | TCP/IP-stack (Wi-Fi-varianter) |
| mbedTLS | 3.6.6 | TLS/kryptering — Matter PASE/CASE, Wi-Fi-säkerhet |
| NimBLE | medföljer ESP-IDF v5.5.5 | Bluetooth Low Energy-värdstack |
Versioner är låsta per firmware-utgåva. Se den exakta utgåvetaggen på GitHub, eller läs karakteristiken Firmware Revision (Device Information-tjänsten, se GATT-tabellen ovan) från en körande enhet.
Ett designspråk för de fysiska produkter AkvaLink ännu inte säljer — en sensorflotte och en e-ink-display. Inte hårdvaran du kan köpa idag; en referens för vart den är på väg.
Så lite design som möjligt, ärlig om vad enheten faktiskt kan mäta, begriplig vid en blick, byggd för att inte åldras.
1900-talets mitt-modernism byggd kring stark sol och en pool — platta solskyddande tak, ventilerande håltegel, paletten pool-turkos mot puts.
Allt är ben, papper och bläck — utom larm, avvikelser och den enda fysiska knappen, som får den enda accentfärgen och inget annat gör det.
Koncept för e-ink-display — åldern på avläsningen (“uppdaterad för 2 min sedan”) är medvetet lika framträdande som själva talet. Inget här är färdig hårdvara.
Display — benvit stomme, ram i anodiserad aluminium, baksida i valnöt, lutad 12° så den syns över hela poolkanten.
Sensorflotte — ligger precis i vattenytan, omärkt ovansida; färgen är den enda skillnaden mellan enheter.
Tidiga industridesignskisser, inte färdig hårdvara — material och kulörer är fortfarande öppna frågor (se dokumentet nedan).
Fullständig genomgång — färgpalett, typografi, ärlighetsreglerna bakom färskhetsstämpeln, och de två höljena (sensorflotte kontra display) — i docs/DESIGN_LANGUAGE.md (engelska).
Fungerar idag, och vart det är på väg.