Repository navigation
Releases: oncra/life
Release list
Life node v1 golden image (2026-10-13)
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-extrawith 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-wittypisets the Witty Pi's own low-voltage stop and recovery level at every boot:WITTYPI_LOW_V12.6 V andWITTYPI_RECOVERY_V13.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-windowhandles 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,recoveryVandlvOff; on the way down after a guard stop,wakeislow-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)
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-extrareads the battery through the Witty Pi at wake-up. AtEXTRA_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,extraandextraV. SCHEDULEisseason,benchornone.DAY_HOURSandDUSK_HOURSare 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)
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
/datato the card and takeslife-node.envfrom 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)
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=noneinlife-node.envkeeps 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, passwordlifebox, atssh life@<NODE_HOSTNAME>.local. SetNODE_PASSWORDorNODE_SSH_KEYinlife-node.envbefore 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.shat this commit. The step-by-step is https://life.oncra.org/node.
Life node v1 golden image (2026-10-07)
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.txtandfstabname. - WiFi comes up from
WIFI_SSIDandWIFI_PSKin 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), andlife-pushreads 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, passwordlifebox, atssh life@<NODE_HOSTNAME>.local. SetNODE_PASSWORDorNODE_SSH_KEYinlife-node.envbefore 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.shat this commit. The step-by-step is https://life.oncra.org/lifebox.
Life node v1 golden image (2026-09-29)
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, passwordlifebox, atssh life@<NODE_HOSTNAME>.local. SetNODE_PASSWORDorNODE_SSH_KEYinlife-node.envbefore 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.shat this commit. The step-by-step is https://life.oncra.org/lifebox/0-before.