HiveInside is a stand-alone, battery-powered in-hive environmental and
acoustic sensor. It sits inside the hive, measures climate, vibration and
sound, and broadcasts the result as a BLE beacon that a
HiveHub / HiveScale picks up with a passive
scan and forwards to the backend.
V0.1 could only be built. This release ships the firmware itself: prebuilt,
signed images for both build profiles, a factory image you can flash over the
board's USB-C cable with one command, and the tools to do it β no Zephyr
toolchain, no west workspace, no external probe. A node that is already running
takes the same firmware over the air through HiveHub.
π How to flash it β
π₯ Flash it without building it
Which file do I need?
| File | What it is | Flash it with |
|---|---|---|
hiveinside-nrf54lm20a-v0.5.0-<variant>-factory.hex |
MCUboot at 0x0 plus the signed application in slot 0 β a complete, bootable device image |
SWD over USB-C |
hiveinside-nrf54lm20a-v0.5.0-<variant>.signed.bin |
The signed application alone β the BLE OTA payload | HiveHub, over the air |
β¦and pick the right variant:
lowpowerβ the deployment profile: no console, no LED, minimum idle
current. This is the one that goes into a hive.bringupβ console on at 115200 8N1, for bench work and wiring up an
SHT40.
Both advertise identically, so a bringup image in a sealed hive looks perfectly
healthy from HiveHub and simply drains the battery. Check the suffix before you
flash.
β οΈ Never flash a.signed.binover SWD. It links behind an MCUboot header
at the slot-0 offset, so on its own it leaves nothing at0x0: the CPU faults
beforemain()and the node goes completely silent β no console, no BLE. The
flashing scripts refuse it for you.
A fresh board, over USB-C
Download hiveinside-flash-tools.zip and the factory hex for your variant, unzip,
and run:
./flash.sh hiveinside-nrf54lm20a-v0.5.0-lowpower-factory.hex.\flash.ps1 -Image hiveinside-nrf54lm20a-v0.5.0-lowpower-factory.hexOpenOCD on PATH is the only prerequisite. The XIAO's on-board SAMD11 CMSIS-DAP
debugger does the rest over the same cable that powers it β no external probe.
The scripts run the same OpenOCD sequence west flash --verify runs, read the
image back to verify it, and correct the board's RRAM loader first: upstream
leaves the 16-byte write buffer enabled and never commits it, so the tail of any
image that is not 16-byte aligned never reaches RRAM and MCUboot then rejects
slot 0 β silently, on a dark device. That one-character difference is the
difference between a working node and an unexplained brick.
Full instructions, the manual OpenOCD command, and the troubleshooting path:
docs/flashing.md.
A node that is already running, over the air
Upload the .signed.bin in HiveHub's firmware form. It reads the target and the
version straight out of the file name, streams the image into the node's
secondary slot, and MCUboot test-swaps it with automatic rollback. Nothing is
committed until size and CRC-32 verify, so a dropped or corrupted transfer always
leaves the node on its old firmware.
See docs/ota-over-ble.md.
Verify what you downloaded
sha256sum -c SHA256SUMS # shasum -a 256 -c SHA256SUMS on macOSmanifest.txt lists each payload's byte size and CRC-32 β the two values the OTA
BEGIN frame carries β plus the commit, the pinned Zephyr revision, and the
build that produced them. west-manifest-frozen.yml and build-info-<variant>.zip
(both images' Kconfig, the domain layout, the devicetree) are attached so anyone
can rebuild these exact images.
π On authenticity. These images are signed with MCUboot's development
key, which is public. That gives image formatting, not proof of origin: a
device running them accepts any image signed with the same public key. Check
the SHA-256 to know you got the file we built, and for a deployment you control,
provision your own signing key and build your own images β see the
production checklist.
π·οΈ Per-node names (firmware 0.4.7 β 0.5.0)
Every node used to advertise the bare name HiveInside. In a yard running more
than one, a scanner listed several identical entries and the only thing telling
them apart was the raw BLE address β which is not written on the enclosure and
not something anybody has memorised.
Each node now advertises as HiveInside-8A3F: the last two bytes of its own
BLE identity address, in hex. Several nodes in one apiary are distinguishable in
any scanner app and in HiveHub's dashboard with no provisioning step at all,
and because the suffix is derived from the address rather than stored, it
survives a factory erase and every firmware update. The GAP Device Name
characteristic is kept in step with the scan response, so a node never calls
itself one thing while advertising another.
The measurement advertisement is untouched β still the same 29-byte
manufacturer-data frame, format version 2, at the same offsets. Only the scan
response carries the name, so existing HiveHub decoders keep working unchanged.
Two build-time asserts hold the sizing against the 31-byte legacy advertising
limit, so the name can never silently push the identity record off the air.
π¦ Also in this release
- The 3D-printable enclosure β bottom and top STL, the STEP and Fusion
source, sized for the XIAO Sense, the SHT40 and a 500 mAh LiPo. Attached as
hiveinside-enclosure.zip, so printing it needs no repository clone. - A project website β macnite.github.io/HiveInside:
the feature set, the hardware, and the full BLE frame layout on one page. - Every CI build keeps its images, so a change can be tried on real hardware
before it is ever tagged.
π Assets in this release
| Asset | Purpose |
|---|---|
hiveinside-nrf54lm20a-v0.5.0-lowpower-factory.hex |
Deployment image, SWD over USB-C |
hiveinside-nrf54lm20a-v0.5.0-lowpower.signed.bin |
Deployment image, BLE OTA payload |
hiveinside-nrf54lm20a-v0.5.0-bringup-factory.hex |
Bench image with console, SWD over USB-C |
hiveinside-nrf54lm20a-v0.5.0-bringup.signed.bin |
Bench image with console, BLE OTA payload |
hiveinside-flash-tools.zip |
flash.sh / flash.ps1, the board's OpenOCD config, and a README |
hiveinside-enclosure.zip |
STL / STEP / F3Z enclosure files |
manifest.txt |
Size + CRC-32 per payload, commit, Zephyr revision, signing-key note |
SHA256SUMS |
Checksums for every asset above |
west-manifest-frozen.yml, build-info-<variant>.zip |
Everything needed to reproduce these images |
π§© Component versions in this release
| Component | Version | Notes |
|---|---|---|
| HiveInside firmware | 0.5.0 | firmware-nrf54lm20a/, Zephyr + west --sysbuild |
| Target board | Seeed XIAO nRF54LM20A Sense | on-board LSM6DS3TR-C, MSM261DGT006, nPM1300 |
| External sensor | SHT40 | IΒ²C 0x44, on the XIAO IΒ²C header |
| BLE beacon format | version 2 | 29 bytes, unchanged since V0.1 |
| Scan response | name + identity record v1 | HiveInside-XXXX, board ID 2, major/minor/patch |
| Bootloader | MCUboot (dual-slot, 449 KiB per slot) | via sysbuild |
| Signing key | MCUboot development key (public) | see the authenticity note above |
| Requires | HiveHub V0.4 or newer | identity readout, version gating, OTA relay |
β¬οΈ Upgrading from V0.1
- Over the air: upload
hiveinside-nrf54lm20a-v0.5.0-lowpower.signed.binin
HiveHub. Nothing else to do; the node reboots and reports 0.5.0. - Over USB: flash the matching
-factory.hexwith the bundled script. - After the update the node appears as
HiveInside-XXXXinstead of
HiveInsidein scanner apps. The measurement frame is unchanged, so nothing
downstream needs adjusting.
π§ Status & known limitations
- The firmware is complete and OTA is verified on hardware. Long-term field
validation in a live colony is still ongoing β treat this as a solid
release, not as a multi-season-proven product. - The prebuilt images are built and checked by CI, not yet flashed from this
release onto a board by hand. If the very first thing you try is the
factory hex, keep a USB cable and
docs/flashing.md
within reach. flash.ps1(Windows) has not yet been run on Windows.flash.shis the
tested path.- The measurement advertisement fills the 31-byte legacy limit exactly, so the
optional BLE Flags element is omitted. The node is therefore formally
non-discoverable: generic scanner apps that filter on the discoverable bits
may not list it. HiveHub's passive scan and a direct connect by address are
unaffected. - Idle current is an audit based on component and configuration analysis; a
power-analyzer measurement of the assembled board is still the number that
counts.
π Documentation
docs/flashing.mdβ prebuilt images, flashing, and troubleshootingdocs/ota-over-ble.mdβ the OTA protocol and the release checklistdocs/low-power.mdβ the deployment profiledocs/wiring.mdβ XIAO β SHT40 connectionsdocs/vscode-build.mdβ building from VS Code / VSCodiumdocs/homeassistant.mdβ Home Assistant through HiveHubfirmware-nrf54lm20a/README.mdβ readout format, BLE frame layout, roadmap
License
MIT β see LICENSE.