Changelog (since v1.2.0)
New Features
- LCD info panel mode during therapy
A new display mode option ("Show info panel during therapy") is now
available in the web UI alongside the existing live graph and backlight-off
modes. When selected, the LCD shows a real-time leak rate reading
(L/min) in a large, colour-coded font — green under 12, yellow 12–24,
orange 24–36, red 36+ — and a session runtime clock (H:MM) counting
from therapy start. Both values are rendered at double size for
readability on the 1.54" display.
Bug Fixes
-
Crash on therapy-stop push notification (alert_routine panic)
The alert escalation task had a 4 KB stack, which was insufficient for
the TLS handshake (mbedtls ECDH/curve25519) performed when sending an
ntfy push notification. The stack overflowed into adjacent PSRAM heap
metadata, causing a PANIC reboot. Stack increased to 16 KB. -
Gen1 O2 Ring BLE protocol reliability
- Fixed the service write-characteristic UUID (two bytes were wrong),
which prevented communication with some Gen1 O2 Ring firmware
versions. - Gen1 rings are now detected by service UUID in BLE advertisement
data instead of relying solely on device name matching, eliminating
false positives with Gen2 devices (e.g. SHQO2Pro). - Switched all BLE writes from write-without-response to
write-with-response, preventing data drops on rings with small ATT
buffers. - Added multi-frame notification reassembly with automatic resync on
decode errors, improving data integrity during oximetry downloads. - Removed unreliable worn-state sensor check (CMD_READ_SENSORS) that
caused false "device not worn" readings; Gen1 rings advertise only
when off-finger, making this redundant.
- Fixed the service write-characteristic UUID (two bytes were wrong),
Documentation
- Expanded README with logo, detailed hardware requirements, and
clarified ResMed AirSense 11 / O2 Ring device compatibility. - Added GitHub badges for OTA firmware download counts.
- Clarified that no WiFi SD card is needed for wireless therapy data
transfer.