-
v0.2.0-rc.1
Pre-releaseSome checks failedCI / Lint, type-check, test (library, 3.11) (push) Successful in 29sCI / Lint, type-check, test (library, 3.14) (push) Successful in 28sPublish / Publish to PyPI (push) Successful in 28sCI / Type-check + test the integration (push) Successful in 2m0sPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Failing after 35sPublish / Bridge the macOS .pkg → NAS (push) Has been skippedreleased this
2026-08-09 01:29:07 -07:00 | 192 commits to main since this releaseMost of this release came from a field install by
@CryingPecan, who ran a real Litter-Robot 4
with a LitterHopper on ESP 1.4.4 for two weeks of continuous MQTT capture and
turned it into four PRs and a pile of protocol findings.Added
- Pet weight actually works. Weight (register
0x09) is reported only in the
activity stream, which the coordinator previously used as a poll trigger and
discarded — socat_weightwas permanently null. New libraryevents.py
decodes the activity stream into typed events. - New entities: last cat visit, last visit duration (register
0xBC, which
also gates whether a weight event fires at all), waste drawer removed
(register0x56— something the cloud integration does not offer), and panel
brightness for bright and dark rooms. - LitterHopper support: hopper connected, hopper fill gauge, and a hopper
out-of-litter alert. The firmware never flags an empty hopper — it keeps
running a full dispense every cycle, delivering nothing — so the gauge is read
from dispense phase 1, calibrated across a live drain-to-refill arc. Neither
the cloud nor the Whisker app offers this. These four ship disabled: the
hopper is optional hardware and invisible in the local state document, so
enable them once if your robot has one. - Litter percentage calibration.
litterLevelis a distance, and the cloud
converts it against a per-robot reference that is not in the local state
document. One button press with the globe filled to the line anchors the
percentage to your robot; an optional second press with it empty upgrades to a
true two-point scale. - Activity-derived entities survive a restart instead of reading unknown
until the next cat visit or dispense.
Fixed
robotStatus10 is the clean cycle, on every firmware. This table has said
10= cat/weight pause and13= cycling since the first commit, tagged
PROVEN. It came from a static firmware-RE brief and was never checked against a
live cycle. A narrated manual cycle on ESP 1.1.75 holdsrobotStatusat10
for the entire cycle withcatDetectat0throughout, and13has never
appeared on either captured firmware. Also adds5,6/7and25.- The cycle phase ladder
2 → 3 → 4 → 5 → 1(the cloud names them DUMP, DFI,
LEVEL, HOME, IDLE). The map previously stopped at 3, so every robot published
unknown_4mid-cycle.robotCycleState 4is the cat-interrupt pause, which
self-clears without a button press. - Litter readings are suppressed while the globe is not level — mid-cycle the
sensors read the rotating globe rather than the litter bed (575 mm observed on
a 453 mm fill), which was published as a real percentage. Also covers the
filter-change wizard, which parks the globe inverted. - Broker failures are reported, not raised as a traceback. An unreachable
broker or rejected certificate produced a raw Python stack trace. - The CLI works against a CA generated by this project's own documentation.
Python 3.13 enables strict X.509 verification, which rejects a CA without a
keyUsageextension — and the macOS installer has no older interpreter to fall
back to. Strictness is now relaxed only for an explicitly pinned CA, which is
also now the only certificate trusted on that connection. pic_firmware, previously always null, composed from the localmb*fields.- Entities a previous version created but this one no longer produces are removed
from the registry instead of lingering forever as unavailable.
Changed
- Clean cycle wait time is now a number (3–30 minutes), not a select. The
robot accepts any value in the range; the five presets were inherited from
pylitterbot and made any other setting read asunknown. Breaking:
automations referencingselect.<robot>_clean_cycle_wait_timemust move to
number.<robot>_clean_cycle_wait_time. - Panel brightness High/Low name the ambient light level, not the brightness
rank — proven by a two-observation behavioural test. The stock 40/50 is
deliberately brighter at night. - Releases are never published before the library version they pin exists on
PyPI, and CI now exercises the Python 3.11 floor it advertises.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Pet weight actually works. Weight (register