Skip to content

Releases: oncra/life

Life node v1 golden image (2026-10-13)

Pre-release

Choose a tag to compare

@svenjense svenjense released this 13 Oct 19:50
e0a4c00

Golden image for the Life node v1, built from e0a4c00 on 13 October 2026. Replaces image-v5, which no node ran.

New since image-v5 (#94, content/spec.md 2.2)

One listening window, the same every day of the season.

Months Listening windows, the hours the readings count
March to October 4 h from civil dawn + 1 h from sunset
November to February 2 h from sunrise
  • The node listens to exactly these windows. The 6 h dawn core of May to July and the battery-conditional extra hours of image-v5 are gone, and life-extra with them. A node's effort is now the same on every day it is compared over.
  • The windows are computed for the node's place at every boot (life-schedule-wpi). The script runs exactly to the next day's first window, so 1 March and 1 November switch cleanly.

The battery guards itself.

  • life-wittypi sets the Witty Pi's own low-voltage stop and recovery level at every boot: WITTYPI_LOW_V 12.6 V and WITTYPI_RECOVERY_V 13.2 V by default (registers 19 and 22, written only when they change). Below 12.6 V at its input the board shuts the Pi down cleanly. After such a stop it switches the Pi on again above 13.2 V, which on a node means the panel is charging.
  • Both levels are needed. With only the low level the board skips a scheduled start while the battery is low, and that alarm does not come round for a month. A recovery level alone keeps switching the Pi on. So WITTYPI_LOW_V=0, for a node on a mains adapter, switches both off.
  • life-window handles a boot the board makes by itself outside the windows (battery recovered, power back on the load output). The node sends its post and powers off 10 minutes after boot (OFFWINDOW_GRACE_MIN), with the board's next start set to the next window. Until now such a boot stayed on until the end of the next window. A boot by hand (button, reboot, USB supply) stays on as before.
  • Every heartbeat carries window, offWindow, lowV, recoveryV and lvOff; on the way down after a guard stop, wake is low-voltage. The oracle opens low battery under 12.8 V or on such a shutdown, and closes it at 13.2 V.

Checked before publishing: the build's own checks, which run life-schedule-wpi and life-window check --dry-run inside the image. Also the schedule script on dates across the year and at both month switches, life-window check and stop for in-window, off-window, by-hand and bench boots, and life-wittypi against a stub board for every combination of levels.

Published as a pre-release until node 1 has booted it. Not yet checked on a real node: a boot, a scheduled shutdown and wake, the guard stopping the Pi at 12.6 V, the board switching it on again with the panel charging, and the off-window power-off. Node 1 waits for its battery, which its BMS switched off on 12 October. After node 1 runs this image, the release becomes the latest and the per-box images at /box move to it.

Flash life-node-v1.img.xz as it is, then put a filled-in life-node.env on the boot partition, or use node/image/personalize.sh. See node/image/README.md.

sha256 081263dd354e740ceff0304e6ffa9f986120644b73f7a2d6faa47950e5c0d235

Life node v1 golden image (2026-10-12)

Pre-release

Choose a tag to compare

@svenjense svenjense released this 12 Oct 16:20
6520ae2

Superseded by image-v6 (13 October 2026) before any node ran it. image-v6 listens to one window all season (4 h from civil dawn and 1 h from sunset, March to October) instead of the core and extra hours below, and the Witty Pi now guards the battery itself. Use image-v6.

Golden image for the Life node v1, built from 6520ae2 on 12 October 2026.

New since image-v4: the listening schedule has a core and extra hours (#90, content/spec.md 2.2)

Months Core, the hours the readings count Extra, when the battery allows
May, June, July 6 h from civil dawn + 1 h from sunset the second hour after sunset
March, April, August, September, October 4 h from civil dawn + 1 h from sunset the dawn window to 6 h after civil dawn, the second hour after sunset
November to February 2 h from sunrise none
  • The Witty Pi gets the full windows, computed for the node's place at every boot (life-schedule-wpi). The script runs exactly to the next day's first window, so 1 March and 1 November switch cleanly.
  • life-extra reads the battery through the Witty Pi at wake-up. At EXTRA_MIN_V (13.1 V) or more the window runs to its end; below it the node clears the Witty Pi's shutdown alarm and powers off at the end of the core. The next start stays as scheduled.
  • The winter window follows sunrise. The old fixed 07:00 hour ended before civil dawn in December and January.
  • Every heartbeat carries window, extra and extraV.
  • SCHEDULE is season, bench or none. DAY_HOURS and DUSK_HOURS are gone and ignored if still in an env file.

Also new since image-v4: sound, heartbeat and soil go out on one connection (#71), and the node posts every three hours (#73).

Checked before publishing: the build's own checks (life-schedule-wpi and life-extra --dry-run run inside the image), the schedule script on dates across the year and both clock changes, and the extra-hours decision for a battery above and below the threshold.

Published as a pre-release until node 1 has booted it. Not yet checked on a real node: a boot, a scheduled shutdown and wake, and an early shutdown at the end of a core on the Witty Pi. After node 1 runs it, this release becomes the latest and the per-box images at /box move to it.

Flash life-node-v1.img.xz as it is, then put a filled-in life-node.env on the boot partition, or use node/image/personalize.sh. See node/image/README.md.

sha256 0f466b1770137d4ac60b18a73b3883329ed333e29376e5e9ece03490d5c48b08

Life node v1 golden image (2026-10-11)

Choose a tag to compare

@svenjense svenjense released this 11 Oct 15:18
e9536d0

Golden image for the Life node v1, built from e9536d0 on 11 October 2026 and booted on node 1 before it was published.

New since image-v3

  • Route order: a network cable first, WiFi second, the 4G stick only when neither is there (#64). Before this the stick was treated as a cable and carried everything, also on a desk.
  • No two-minute wait at boot on a network service that manages nothing on the node (#66). The soil timer now fires two minutes after boot and the hourly push three.

Checked on node 1 (Raspberry Pi 4, Witty Pi 4, INMP441, two SEN0600 probes, E3372-325 stick with a 1NCE SIM)

  • First boot grows /data to the card and takes life-node.env from the boot partition.
  • WiFi comes up; default routes are WiFi at metric 600 and the stick at 700.
  • Both soil probes are read on the first timer run.
  • BirdNET-Go analyses the microphone; clip saving is off.
  • The first hourly push is answered by the oracle.
  • The Witty Pi's default state is ON.

Not checked on this image: a scheduled shutdown and wake, and a full day on 4G alone.

Known: userconfig.service keeps running, so systemd never reports the boot as finished (the node's own services are not held up by it), and the persistent journal directory on /data stays empty.

Flash life-node-v1.img.xz as it is, then put a filled-in life-node.env on the boot partition, or use node/image/personalize.sh. See node/image/README.md.

sha256 b12bde19a870926463f6659f3e88858ced743e142020bb649d64f5ca234c7a13

Life node v1 golden image (2026-10-10)

Choose a tag to compare

@svenjense svenjense released this 10 Oct 13:52
90d9902

The golden image for Life node v1, with the node's health on its hourly heartbeat. Same base as the image of 7 October (tested on node 1 on 8 October); two changes under node/:

  • The heartbeat now carries the node's power and condition: from the Witty Pi 4 its input voltage (the battery on a 12 V node), what the Pi draws, the temperature inside the box and why it last switched the Pi on; from the Victron charge controller, when a VE.Direct-to-USB cable is plugged in, battery volts and amps, panel watts, charge state, error code and the yield of today and yesterday. About 250 bytes on the post that is sent anyway. The oracle raises low battery under 12.0 V. (#61)
  • SCHEDULE=none in life-node.env keeps the node on, for work on the desk.

Not yet run on hardware: the build is tested, the boot on a Pi is not. The image of 7 October stays available as release image-v2.

Use:

  • Flash: xz -dc life-node-v1.img.xz | sudo dd of=/dev/<card> bs=4M status=progress conv=fsync (Linux) or ... of=/dev/rdiskN bs=4m (macOS). 9 GiB written, any card of 16 GB or more.
  • Login on the bench: user life, password lifebox, at ssh life@<NODE_HOSTNAME>.local. Set NODE_PASSWORD or NODE_SSH_KEY in life-node.env before the node leaves the desk; a key has spaces, so it goes in single quotes. Both are applied at every boot.
  • Verify: sha256sum -c life-node-v1.img.xz.sha256.
  • How it was built: node/image/build.sh at this commit. The step-by-step is https://life.oncra.org/node.

Life node v1 golden image (2026-10-07)

Choose a tag to compare

@svenjense svenjense released this 08 Oct 15:54
5cb3d1d

The golden image for Life node v1: Raspberry Pi OS Lite 64-bit with BirdNET-Go and Perch v2 (audio clip saving off), the node agents, the Witty Pi 4 daemon and the schedules. Read-only root, writable /data partition that grows to the card at the first boot. Nothing per-node is inside: put life-node.env on the boot partition after flashing (the example is there), or get an image made for your box at https://life.oncra.org/box.

This replaces the image of 29 September, which did not boot on a Raspberry Pi. Tested on node 1 on 8 October 2026: the first boot comes up on the right time, the microphone is heard and detections reach the oracle, and a shutdown ends with the Witty Pi cutting power (0.0 W on the meter).

Fixed since the first image:

  • It boots: the card keeps the disk identifier that cmdline.txt and fstab name.
  • WiFi comes up from WIFI_SSID and WIFI_PSK in the env file; trailing comments in the env file no longer end up in the values.
  • BirdNET-Go listens to the I2S microphone (:0,0), and life-push reads the current BirdNET-Go database, so detections and the heartbeat reach the oracle.
  • Witty Pi 4: UART0 on GPIO-14 and wiringPi for its daemon, so the board sees the Pi shut down and cuts power; the board is set to switch the Pi on as soon as power arrives; the daemon and the schedule run only when the board sits in the supply path.
  • The clock is synced and written to the Witty Pi before any schedule is computed; with no trustworthy clock the node stays on and tries again.
  • The summer schedule follows the sun at the place of the node (8 h from civil dawn, 2 h from sunset).

Use:

  • Flash: xz -dc life-node-v1.img.xz | sudo dd of=/dev/<card> bs=4M status=progress conv=fsync (Linux) or ... of=/dev/rdiskN bs=4m (macOS). 9 GiB written, any card of 16 GB or more.
  • Login on the bench: user life, password lifebox, at ssh life@<NODE_HOSTNAME>.local. Set NODE_PASSWORD or NODE_SSH_KEY in life-node.env before the node leaves the desk; a key has spaces, so it goes in single quotes. Both are applied at every boot.
  • Verify: sha256sum -c life-node-v1.img.xz.sha256.
  • How it was built: node/image/build.sh at this commit. The step-by-step is https://life.oncra.org/lifebox.

Life node v1 golden image (2026-09-29)

Choose a tag to compare

@svenjense svenjense released this 29 Sep 20:40
f74dff6

The golden image for Life node v1: Raspberry Pi OS Lite 64-bit with BirdNET-Go (audio clip saving off), the node agents, the Witty Pi 4 daemon and the seasonal schedules. Read-only root, writable /data partition that grows to the card at the first boot. Nothing per-node is inside: put life-node.env on the boot partition after flashing (the example is there).

  • Flash: xz -dc life-node-v1.img.xz | sudo dd of=/dev/<card> bs=4M status=progress conv=fsync (Linux) or ... of=/dev/rdiskN bs=4m (macOS). 9 GiB written, any card of 16 GB or more.
  • Login on the bench: user life, password lifebox, at ssh life@<NODE_HOSTNAME>.local. Set NODE_PASSWORD or NODE_SSH_KEY in life-node.env before the node leaves the desk; both are applied at every boot.
  • Verify: sha256sum -c life-node-v1.img.xz.sha256.
  • How it was built: node/image/build.sh at this commit. The step-by-step is https://life.oncra.org/lifebox/0-before.