-
v0.2.0-rc.17
Pre-releaseSome checks failedCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 34sCI / Lint, type-check, test (library, 3.14) (push) Successful in 41sCI / Shell scripts and documentation links (push) Successful in 18sCI / Test the dependency floors the package advertises (push) Successful in 32sPublish / Publish to PyPI (push) Successful in 31sCI / Type-check + test the integration (push) Successful in 2m34sPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Has been cancelledPublish / Update the Homebrew tap formula (stable or -rc per tag) (push) Has been cancelledPublish / Bridge the macOS .pkg → NAS (push) Has been cancelledreleased this
2026-08-14 10:06:26 -07:00 | 114 commits to main since this releaseThanks to @CryingPecan, whose LitterHopper robot
on ESP 1.4.4 is behind much of what's below. Protocol detail lives in
docs/devices/litter-robot-4/.Added
- The CLI remembers your robots.
provisionsaves the serial, broker and CA
under~/.whiskerless; later commands run bare, and every flag still overrides. robots,useandforgetlist, pick and drop saved robots — damaged
profiles are shown as such and can still be removed.- A second robot inherits the saved setup — each prompt offers what your robots
already share, so you type only the serial and the WiFi password. - No secret is ever saved: the broker password is per-run (
WHISKERLESS_PASSWORD),
the WiFi passphrase is never kept, the factory certificate is never touched. whiskerless --version, and a barewhiskerlessprints an orientation
instead of a usage error.- The CLI shows liveness and color: a spinner on the BLE scan (heartbeat lines
when piped), banners on the dangerous prompts,NO_COLORhonored. - The README covers the whole journey: prerequisites, per-platform installs
including Homebrew, everyday use, upgrading, the rc channel, uninstalling. - Clean cycle and Reset buttons are back, and they work — they synthesise the
panel's own button press. Proven on ESP 1.1.75 and 1.4.4. - Empty cycle and Power buttons, disabled by default and named
(danger);
the CLI gainsempty-cycleandpower, which prompt first. - Pet weight actually works (raw ÷ 100, the cloud's own units) — recent rc
builds doubled the reading. - LitterHopper support: connected, fill gauge, and an out-of-litter alert the
firmware never raises; the entities enable themselves at the first dispense. - Litter level as a percentage — self-calibrating over time, or pinned
instantly by one button press with the globe filled to the line. - New entities: last cat visit, last visit duration, waste drawer last moved,
panel brightness for bright and dark rooms, and excess-weight detection (the
stuck-scale condition the robot otherwise only shows on its panel). - Activity-derived entities survive a restart instead of reading unknown
until the next cat visit. - New install channels: Homebrew,
.deb/.rpmand standalone Linux binaries
for amd64 and arm64 — none of them need a system Python.
Removed
LitterRobot4ClientandWhiskerlessAuthError— nothing used them, and
the client was a third, already-drifting copy of the write-verify loop.
Fixed
- The hopper level no longer reads unknown for days after a restart — a gauge
stranded in the restore cache is carried into the saved options at every startup. brew install sisyphusmd/tap/whiskerlessworks again (the formula pinned a
bleak whose build backend Homebrew cannot build), and every release now
install-tests the formula before the tap publishes.- A mistyped path is a sentence, not a stack trace:
~expands everywhere,
every provision answer is checked at its prompt (including that the CA really
is a PEM), and file or broker errors print one line —--debugfor tracebacks. - The serial validator rejects the model number (
LR4-0301-00-US) printed
beside the real serial on the label. --dry-runmarks everything it prints, so a simulation no longer describes
writes that never happened.- Hopper entities no longer disappear from a robot that has one — the upgrade
sweep accepts a recorded fill gauge as proof, since only a dispense produces one. - Handling the robot no longer counts as a cat visit — a visit requires the
beam actually broken, which a hand on the bonnet does not do. - The globe motor fault sensor watches the activity stream too — the state
document stayed at 0 through a real fifty-minute fault. - Hopper detection means litter actually delivered — the link register fires
healthy on a bench and "disconnected" on a refill, so nothing reads it anymore. - A robot that dispenses but rarely reports its link keeps its hopper telemetry.
- The hopper level survives a restart — the last gauge is remembered instead
of reading unknown until the next dispense. - Event sensors appear only once their fact has been reported — some firmware
never emits a drawer event or a weight, and those sensors sat unknown forever;
a one-time sweep applies the same standard to existing installs. - Last cat visit updates on every robot — it stamps from occupancy, not only
from weight events, which one robot never sends. - Cat detection no longer mistakes weight on the scale for a cat — occupancy
uses the bit that tracks the animal, not the one a misseated bonnet holds. - Fewer unknowns while calibration settles: the calibration reference shows
the built-in default (marked so) and the hopper level a labelled estimate. - The weekday sleep schedule arms every day, not just Sunday.
- The panel sleep and wake times can actually be set — they now write the
per-day registers instead of one the firmware only computes. - Litter readings are suppressed while the globe is not level — mid-cycle the
sensors see the globe, not the litter. robotStatus10 is the clean cycle, and the boot cycle and filter wizard
are mapped too — unmapped, their readings published as real litter levels.whiskerless set night-light-mode autoworks — every accepted spelling
used to crash.- The declared Home Assistant minimum is correct (2025.3.0, not 2025.2.0).
- Every settings write is verified by read-back, multi-register writes no
longer lose parts, and broker failures print instead of raising. - The hopper no longer drops to unknown on a non-disconnect link code, and one
dispense cannot prove an empty hopper on its own. - The out-of-litter alert judges against your robot's own learned floor —
floors differ per unit, and a fixed cutoff could cry empty while litter flowed. - A restored excess-weight alarm clears once the robot reports the pan clear,
instead of re-firing on every later visit. - A restored globe-motor fault can clear after a missed clear event — a clean
cycle completing without a fault event is the proof. - A detection re-sweep no longer disables entities you enabled yourself.
Changed
- Auto-calibration got a statistics upgrade: a median-based outlier gate keeps
in-band anomalies (a paw reads like an overfull globe) away from the litter
anchors, and the hopper floor is learned from declined-into flatline runs — in
both directions, so a floor that moved up is found as readily as one below. - Breaking:
binary_sensor.<robot>_waste_drawer_removedis now
sensor.<robot>_waste_drawer_last_moved— the robot never says which way it moved. - Breaking: clean cycle wait time is a number (3–30 minutes), not a select.
- Breaking (library):
Hazard.MOTOR,MotorCommandErrorandallow_motor
are gone — a written press is the same event as a physical one. Power still
requiresallow_dangerous. - Breaking:
switch.<robot>_panel_sleep_modeis now a binary sensor — the
firmware refuses direct writes, so the switch could only fail; the weekday
schedule entities are the control. - Last visit duration ships disabled and enables at your robot's first report —
not every robot emits it, and it is not a firmware split. - Release binaries and the macOS installer carry the version in the filename
(whiskerless-<version>-linux-x86_64); the scheme is inpackaging/README.md.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The CLI remembers your robots.