Upgrade Notes
lager installandlager updatedeploy the CLI’s release tag by default, notmain. With no--version, lager 0.53.0 deploysv0.53.0. The box runs a release and uses the pre-built image. Pass--version mainto deploy the latest development code.- A default
lager updatenever rolls a box back. It leaves a box that is ahead of the CLI’s release where it is, even with--yes. Pass--versionto move such a box. - A plain
lager uninstallkeeps/etc/lager. Saved nets, box config and SSH key registrations survive the uninstall, and the next install uses them again. Pass--purge-configfor the old behavior. A purge first saves a backup to~/lager-backup-<timestamp>/on the box. After a purge, the nextlager installasks for the sudo password once.--allno longer implies a purge. lager installandlager updatestop when another container publishes a port that lager uses. They stop before they stop anything on the box, name the port and the container, and exit with code 1. On the box,start_box.sh --preflightexits with code 5 for this conflict. Free the port, then run the command again.- An output state that the box cannot read is reported as unknown, not off.
lager nets stateshows?in the on/off slot, for exampleCH1/?/3.30V/0.120A. Thestateactions oflager supply,lager batteryandlager eloadprintUNKNOWN. A script that treats anything other thanONas off must handle the new value. - A battery, watt meter or energy reading that fails is reported as missing, not as 0.
A script that reads
0.00Vor0%as a real value must handle the missing value.
Features
GET /nets/stateentries carry anenabledfield. The field istrueorfalsefor USB, power supply, battery and electronic load nets. It is present only when the box reads the on/off state, so a consumer does not parse thestatetext. The box’s/statusadvertises this ascapabilities.netsStateEnabled.lager energy --box <box>lists the energy analyzer nets of that box. The group-level--boxalso servesreadandstatswhen you give them no--box, as inlager watt.
Bug Fixes
-
A port conflict no longer leaves a box with no lager container.
lager installandlager updatestopped lager first, and then failed to start it again. Adocker runthat fails over a port now names that port and removes the half-created container. -
On a box with a gateway in front of lager, a start with no
--no-publishmarker does not publish over the gateway. If a container onlagernetpublishes the lager API ports,start_box.shstarts lager in--no-publishmode and writes the marker again. -
lager installandlager updatewarn when a gateway runs but/etc/lager/control_plane.jsonis missing. Re-link such a box from its control plane. -
The CLI reports a gateway’s
502as a lager service that does not answer. A gateway answers502withX-Gateway-Error: upstream_unavailablewhen lager is down behind it. The CLI now says so and suggestslager update, instead of a failed connection. -
lager uninstall --allremoves this machine’s key only from lager’s managed block ofauthorized_keys. A key that something else placed, or that another registration holds, stays in place, so a shared key keeps working on the other machines. -
Ctrl+C ends
lager uartin less than a second, and the box gets the end of the session. The socket.io clients let a library install its own Ctrl+C handler, which disconnected before the CLI sentstop_uart. The CLI now handles Ctrl+C itself. The UART and RTT teardowns wait 0.5 s maximum for the socket to close. -
lager ssh-setupinstalls its key on a key-only box that one of your keys already reaches. It refused with “none of your keys reaches it yet”. It now runsssh-copy-idover that key, with no password prompt. -
lager installwithout a terminal says that it needs one. When sudo on the box needed a password, the first error named a file that install failed to copy. Install now stops before the sudo session and tells you to run it in a terminal. -
The box’s BLE
Central()makes its own event loop when you pass none. It calledasyncio.get_event_loop(), which fails off the main thread and on Python 3.14. Passloop=to share a loop. -
A powered Acroname USB net reports
enabled.lager usb <net> state,lager nets stateandlager usb <net> toggleread the power and data bits together. A port with power on and data off readdisabled, andtoggleleft it on. They now follow port power on every Acroname model. -
A USB net with an integer
pinof0controls port 0. The box treated it as a net with no pin. - The box log warns about an Acroname net address with no hub serial when the box has more than one Acroname hub. Such a net binds the first hub that answers. Add the hub serial to the net address.
-
The Rigol DP800 power supply accepts
1and0as output state replies. It read them as off. The unknown state covers the Rigol DP800 and DP700, EA, Keithley 2281S and Rigol DL3021. - A YKUSH port whose state read fails is reported as unknown, not enabled.
-
A LabJack T7 GPIO, ADC or DAC net with an integer
pinof0reads inlager nets state. An ADC or DAC net on pin 0 also blanked all other ADC and DAC nets on that T7. - Two USB nets on the same hub port both report the port state. One of them showed as unreadable.
Improvements
lager helloshows(release)for a box on its release tag. The line wasVersion: 0.52.0 (v0.52.0@b73aa66); it is nowVersion: 0.52.0 (release). A branch, a commit, or a tag that does not match the version still shows<ref>@<commit>.

