Skip to content

HiveInside V0.5 β€” flash it, don't build it 🐝

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Aug 05:18
· 14 commits to main since this release
6aa497f

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.bin over SWD. It links behind an MCUboot header
at the slot-0 offset, so on its own it leaves nothing at 0x0: the CPU faults
before main() 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.hex

OpenOCD 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 macOS

manifest.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.bin in
    HiveHub. Nothing else to do; the node reboots and reports 0.5.0.
  • Over USB: flash the matching -factory.hex with the bundled script.
  • After the update the node appears as HiveInside-XXXX instead of
    HiveInside in 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.sh is 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

License

MIT β€” see LICENSE.