-
v0.2.0-rc.25
Pre-releaseSome checks failedCI / Shell scripts and documentation links (push) Successful in 21sCI / Test the dependency floors the package advertises (push) Successful in 58sCI / Lint, type-check, test (library, 3.14) (push) Successful in 1m6sCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 1m6sPublish / Publish to PyPI (push) Successful in 23sCI / Type-check + test the integration (push) Has been cancelledPublish / Bridge the macOS .pkg → NAS (push) Has been cancelledPublish / Prune the candidates this release supersedes (push) Has been cancelledPublish / Update the Homebrew tap formula (stable or -rc per tag) (push) Has been cancelledPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Has been cancelledreleased this
2026-08-16 23:12:56 -07:00 | 52 commits to main since this releaseThe release where the robot stopped being read-only. Whiskerless could always
watch a Litter-Robot 4 and change its settings; it could not press anything. The
panel button register turned out to be writable, so Clean cycle and Reset are
real buttons now — they emit the exact code the panel does, which means the
firmware's pinch, cat-detect and bonnet interlocks apply to them just as they do
to a finger. Two other things changed the day-to-day: provisioning no longer
fails silently when you mistype the WiFi password, and the CLI remembers your
robots instead of wanting a wall of flags on every command.Thanks 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/.Breaking changes
Worth reading before you upgrade; the rest of the list is safe to skim.
-
Broker usernames and passwords are gone.
--username,--passwordand
WHISKERLESS_PASSWORDno longer exist, and neither does the profile field. The
robot cannot send credentials at all, so running two authentication schemes
against one broker only bought complexity — everything identifies by
certificate now, the CLI included. -
One broker per machine. The broker, its port and its CA moved off each
robot and into the store, because every robot in a house talks to the same one.
--host,--port,--caand--insecureare gone from the everyday commands
and live onsetup, which is where the broker is established. A genuinely
separate broker is a separate store: pointWHISKERLESS_HOMEat it. -
whiskerless adoptis removed. With the broker no longer per-robot it only
recorded a serial, and it could never give the robot the certificate it now
needs. Re-provision instead. -
The store moved to
~/whiskerless— no leading dot, so the folder you are
told to back up is one you can find. Your existing~/.whiskerlessis moved
there automatically the first time you run anything. -
binary_sensor.<robot>_waste_drawer_removed→sensor.<robot>_waste_drawer_last_moved.
The robot reports that the drawer moved and never which way, so a binary
sensor was claiming more than the hardware says. -
switch.<robot>_panel_sleep_mode→ a binary sensor. The firmware refuses
direct writes to it, so the switch could only ever fail. The weekday schedule
entities are the control. -
Clean cycle wait time is a number (3–30 minutes), not a select.
-
Library:
Hazard.MOTOR,MotorCommandErrorandallow_motorare gone. A
written press is the same event as a physical one, so that gate gated a hazard
that does not exist — and every caller passed the flag unconditionally, which
made the real gates look like the same formality. Power still requires
allow_dangerous. -
Library:
LitterRobot4ClientandWhiskerlessAuthErrorare removed. Nothing
used them, and the client had become a third, already-drifting copy of the
write-verify loop. -
Homebrew installs now compile, and take minutes rather than seconds.
Certificates became core function, socryptographyis a hard dependency — and
Homebrew builds every resource from source, wherecryptographyis a Rust
extension. The formula gainedrustas a build dependency andopenssl@3;
nothing about the installed result changes. Every other install path
(PyPI/pipx/uvx, the macOS.pkg,.deb/.rpm) uses wheels and is unaffected.
Added
- Clean cycle and Reset buttons, and they actually work. Proven on ESP 1.1.75
and 1.4.4. This is the project's first recovered action command; the old "no
action commands exist" framing is dead. - Empty cycle, Power and WiFi, shipped disabled and named
(danger)— an
empty cycle costs a litter refill, and a robot that is switched off, or has had
its WiFi switched off, has left the network, so nothing over MQTT brings it
back. WiFi is the panel's Connect button: it took the robot off the broker
in 0.8 seconds, panel light white, and only a physical press undoes it. The CLI
gainsempty-cycle,powerandwifi-toggle; all three prompt first, and the
two that can end the connection have no--yes. - Provisioning verifies the WiFi join. A mistyped passphrase used to sail
through silently — the robot accepted everything, rebooted, and simply never
appeared on any network, which is indistinguishable from a dead unit. The robot
names that failure if asked, so provisioning now polls the join status and stops
with "mistyped WiFi password" before touching the broker config; a confirmed
join prints the robot's IP and moves on early. Firmware that stays silent gets
the old wait. - The CLI remembers your robots.
provisionsaves the serial, broker and CA
under~/whiskerless; later commands run bare.
robots,useandforgetlist, pick and drop them — 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. whiskerless setupis a new command, run once before any robot. It
establishes your broker's address and its certificates, and prints the three
files to install on the broker. Deliberately separate fromprovision:
between generating those files and a robot being able to use them, somebody has
to install them and restart the broker — and a robot in pairing mode is holding
a short window open the whole time.provisionnow refuses on a machine that
has not been set up, and says so.- whiskerless runs a certificate authority for you. The Litter-Robot cannot
send a username or a password — its firmware has no field for one, because it
was built for AWS IoT, which authenticates clients by certificate. So
certificates are the only authentication it has, and the firstprovisionon a
machine offers to set the whole thing up: a CA, your broker's server
certificate, and an identity for this machine. Press enter and it is done. It
prints the three files your broker needs and which mosquitto directive each one
goes with. Already have a CA? Point at it with--ca, add--ca-keyif you
want certificates issued here, and it is copied into place under our names. whiskerless backupandwhiskerless restore. "Back up~/whiskerless"
is advice people follow exactly as often as it is convenient, and the CA
private key in there is the one thing that cannot be regenerated — losing it
costs you the ability to add or re-provision a robot without walking to every
robot you own.backupwrites one file;restoreputs it back. Leave the
path off either and it asks —restorelists the backups it can see, newest
first, and takes a number. Each archive is named for the moment it was made
and never replaces an earlier one, because that earlier file may be the copy
from before whatever you are about to change; the timestamp lives in the
name because it is the only part that survives being copied to a stick or
pulled out of a snapshot. It offers to
encrypt (AES-256-GCM, scrypt) and an unattended run has to say--no-password
or setWHISKERLESS_BACKUP_PASSWORDrather than write a signing key in the
clear by default. Unencrypted it is an ordinary.tar.gz, because this is a
file you open once, years later, possibly on a machine with no whiskerless on
it.restorerefuses to replace an existing setup unless you pass--force,
and the refusal says whether the CA differs and names the robots that would
stop trusting your broker;--forcemoves the old store aside rather than
deleting it.- Each robot gets its own certificate, signed by your CA, written over BLE
exactly the way the Whisker app writes its own — same order, same 100-byte
chunks, same single apply. Its common name is the robot's serial, so
use_identity_as_usernamemakes your broker log the robot by name. Nothing
keeps a copy: the robot holds the only one, and a replacement is one
re-provision away. - Your broker can stop accepting anonymous clients. That was never a
workaround for a missing feature — it was the only option when the robot had no
identity of its own to present. Now it has one. Without a CA key to sign with,
provisioning says so loudly and leaves the robot's factory certificate alone,
which is exactly how whiskerless worked before. - Litter level as a percentage — self-calibrating over time, or pinned
instantly by one button press with the globe filled the way you consider full. - LitterHopper support: connected, fill gauge, and an out-of-litter alert the
firmware never raises. The entities enable themselves at the first dispense. - 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 own panel. whiskerless status— the robot in plain terms from a single fresh reading:
level, drawer, faults, calibration. It names what needs a listener rather than
printing zeros.whiskerless calibrate full|emptystores your own litter
reference per robot and refuses a reading that cannot be one, and
whiskerless panel-resetpresses Reset.- Activity-derived entities survive a restart instead of reading unknown until
the next cat visit. - New install channels: Homebrew,
.deb/.rpm, and standalone Linux binaries
for amd64 and arm64 — none of which need a system Python. - The CLI shows liveness and colour: a spinner on the BLE scan (heartbeat lines
when piped), banners on the dangerous prompts,NO_COLORhonoured.
whiskerless --versionworks, and a barewhiskerlessprints an
orientation instead of a usage error. - The README covers the whole journey: prerequisites, per-platform installs
including Homebrew, everyday use, upgrading, the rc channel, uninstalling. - The integration has an icon and a logo, shipped inside it and served by Home
Assistant 2026.3+; older versions simply show what they show today.
Fixed
- Provisioning stops scanning the moment it finds your robot. It used to run
the whole--scan-timeouteven after the robot answered — and since a robot
only advertises while you hold Connect, that spent the pairing window instead
of using it. One bench attempt found the robot and then failed to connect,
because it had gone quiet by the time the scan ended. - The WiFi check no longer reports
0.0.0.0as your robot's address. The
robot says "connected" the instant it associates, before DHCP hands out a
lease, so the join is confirmed but the address is not yet known — and printing
the unset one claimed a fact it did not have. - Pet weight is right again (raw ÷ 100, the cloud's own units) — recent rc
builds doubled the reading. - The weekday sleep schedule arms every day, not just Sunday, and the panel
sleep and wake times can actually be set — they now write the per-day
registers instead of one the firmware only computes. robotStatus10 is the clean cycle, with the boot cycle and filter wizard
mapped too. Left unmapped, their readings were published as real litter levels.- Litter readings are suppressed while the globe is not level — mid-cycle the
sensors are looking at the globe, not the litter. The first reading after a
restart is no longer discarded either. - The globe motor fault sensor watches the activity stream, where the fault
actually appears — the state document sat at 0 through a real fifty-minute
fault. A restored fault can also clear after a missed clear event, on the proof
of a clean cycle completing. - 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 — and
handling the robot no longer counts as a visit. - A long cat visit is no longer dropped. The close was matched against a
90-second window, and the cats that sit longest fell outside it. Last cat
visit now updates on every robot, stamping from occupancy rather than only
from weight events, which one robot never sends. - Hopper telemetry stopped lying about itself. Detection now means litter was
actually delivered, because the link register reports healthy on a bench and
"disconnected" during a refill — so nothing reads it for connectivity any more.
The level survives a restart instead of reading unknown for days, a robot that
dispenses but rarely reports its link keeps its telemetry, one dispense cannot
prove an empty hopper, and the upgrade sweep no longer removes hopper entities
from a robot that has one. - 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 was
still flowing. - A restored excess-weight alarm clears once the robot reports the pan clear,
instead of re-firing on every later visit. - 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 — and a detection
re-sweep no longer disables entities you enabled yourself. 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.- Errors are sentences, not stack traces. A Bluetooth failure reads "BLE scan
failed: Bluetooth device is turned off";~expands everywhere; every provision
answer is checked at its prompt, including that the CA really is a PEM; file and
broker errors print one line.--debugstill gives you the traceback. - 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.whiskerless set night-light-mode autoworks — every accepted spelling used
to crash.- Every settings write is verified by read-back, multi-register writes no
longer lose parts, and broker failures print instead of raising. - Fewer unknowns while calibration settles: the calibration reference shows the
built-in default (marked as such) and the hopper level a labelled estimate. - "A short press does nothing" was wrong, and dangerous. A short press of the
robot's Connect button toggles its WiFi off — the light bar turns white
and the robot vanishes from your broker, looking for all the world like a dead
unit. The README and the recovery guide both told you it was harmless. Hold
Connect for pairing mode; tap it only to put the radio back. - The status a robot reports while powering down is no longer labelled
"powering up", now that each half of a power cycle has been captured on its
own rather than together. - The waste-drawer register no longer claims to know direction. A brief rule
("it speaks on a seat and stays silent on a removal") held on one robot and
failed on the other; whiskerless still reports only when the drawer last
moved, which is all the hardware supports. - The declared Home Assistant minimum is correct (2025.3.0, not 2025.2.0).
Changed
- Some entities were renamed, and existing installs are moved with them:
Start clean cycle → Clean cycle, the two calibration buttons →
Calibrate full / Calibrate empty, Hopper fill (raw) → Hopper
reading, Litter calibration reference → Litter reference. Entity IDs you
chose yourself are left alone, and every rename is logged — check automations
that referenced the old IDs. - The manual calibration buttons now ship disabled. The robot calibrates
itself; enable them if you want to pin the scale to a measurement of your own. - Last visit duration ships disabled and enables itself at your robot's first
report — not every robot emits it, and that is not a firmware split. - Litter distances read in millimetres, not inches converted to thirteen
decimal places — the unit the protocol and the docs use. Per-entity overrides
still win. - The raw hopper reading, last dispense and clean-cycle count moved to
Diagnostics, leaving the sensor list to the things worth a glance. - 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. - Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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
-
-
v0.2.0-rc.24
Pre-releaseAll checks were successfulCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 35sCI / Lint, type-check, test (library, 3.14) (push) Successful in 35sCI / Shell scripts and documentation links (push) Successful in 16sCI / Test the dependency floors the package advertises (push) Successful in 26sPublish / Publish to PyPI (push) Successful in 27sCI / Type-check + test the integration (push) Successful in 2m44sPublish / Update the Homebrew tap formula (stable or -rc per tag) (push) Successful in 4m42sPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Successful in 23m49sPublish / Bridge the macOS .pkg → NAS (push) Successful in 3sPublish / Prune the candidates this release supersedes (push) Has been skippedreleased this
2026-08-15 23:05:24 -07:00 | 72 commits to main since this releaseThe release where the robot stopped being read-only. Whiskerless could always
watch a Litter-Robot 4 and change its settings; it could not press anything. The
panel button register turned out to be writable, so Clean cycle and Reset are
real buttons now — they emit the exact code the panel does, which means the
firmware's pinch, cat-detect and bonnet interlocks apply to them just as they do
to a finger. Two other things changed the day-to-day: provisioning no longer
fails silently when you mistype the WiFi password, and the CLI remembers your
robots instead of wanting a wall of flags on every command.Thanks 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/.Breaking changes
Worth reading before you upgrade; the rest of the list is safe to skim.
binary_sensor.<robot>_waste_drawer_removed→sensor.<robot>_waste_drawer_last_moved.
The robot reports that the drawer moved and never which way, so a binary
sensor was claiming more than the hardware says.switch.<robot>_panel_sleep_mode→ a binary sensor. The firmware refuses
direct writes to it, so the switch could only ever fail. The weekday schedule
entities are the control.- Clean cycle wait time is a number (3–30 minutes), not a select.
- Library:
Hazard.MOTOR,MotorCommandErrorandallow_motorare gone. A
written press is the same event as a physical one, so that gate gated a hazard
that does not exist — and every caller passed the flag unconditionally, which
made the real gates look like the same formality. Power still requires
allow_dangerous. - Library:
LitterRobot4ClientandWhiskerlessAuthErrorare removed. Nothing
used them, and the client had become a third, already-drifting copy of the
write-verify loop.
Added
- Clean cycle and Reset buttons, and they actually work. Proven on ESP 1.1.75
and 1.4.4. This is the project's first recovered action command; the old "no
action commands exist" framing is dead. - Empty cycle and Power, shipped disabled and named
(danger)— an empty
cycle costs a litter refill, and a robot switched off has left the network, so
nothing over MQTT can switch it back on. The CLI gainsempty-cycleand
power, which prompt first. - Provisioning verifies the WiFi join. A mistyped passphrase used to sail
through silently — the robot accepted everything, rebooted, and simply never
appeared on any network, which is indistinguishable from a dead unit. The robot
names that failure if asked, so provisioning now polls the join status and stops
with "mistyped WiFi password" before touching the broker config; a confirmed
join prints the robot's IP and moves on early. Firmware that stays silent gets
the old wait. - 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 them — damaged profiles are
shown as such and can still be removed. whiskerless adopttells the CLI about a robot you provisioned before the
profile store existed, so it stops needing--serial/--host/--caon every
command. It writes the same profileprovisionwould and contacts nothing —
which also means it cannot check the serial, so confirm withwhiskerless state.- 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, and the robot's
factory certificate is never touched.provisiondoes now ask for the broker
username (optional, offered from what your other robots use), so an
authenticated broker no longer needs--usernameon every later command. - Litter level as a percentage — self-calibrating over time, or pinned
instantly by one button press with the globe filled the way you consider full. - LitterHopper support: connected, fill gauge, and an out-of-litter alert the
firmware never raises. The entities enable themselves at the first dispense. - 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 own panel. whiskerless status— the robot in plain terms from a single fresh reading:
level, drawer, faults, calibration. It names what needs a listener rather than
printing zeros.whiskerless calibrate full|emptystores your own litter
reference per robot and refuses a reading that cannot be one, and
whiskerless panel-resetpresses Reset.- Activity-derived entities survive a restart instead of reading unknown until
the next cat visit. - New install channels: Homebrew,
.deb/.rpm, and standalone Linux binaries
for amd64 and arm64 — none of which need a system Python. - The CLI shows liveness and colour: a spinner on the BLE scan (heartbeat lines
when piped), banners on the dangerous prompts,NO_COLORhonoured.
whiskerless --versionworks, and a barewhiskerlessprints an
orientation instead of a usage error. - The README covers the whole journey: prerequisites, per-platform installs
including Homebrew, everyday use, upgrading, the rc channel, uninstalling. - The integration has an icon and a logo, shipped inside it and served by Home
Assistant 2026.3+; older versions simply show what they show today.
Fixed
- Provisioning stops scanning the moment it finds your robot. It used to run
the whole--scan-timeouteven after the robot answered — and since a robot
only advertises while you hold Connect, that spent the pairing window instead
of using it. One bench attempt found the robot and then failed to connect,
because it had gone quiet by the time the scan ended. - The WiFi check no longer reports
0.0.0.0as your robot's address. The
robot says "connected" the instant it associates, before DHCP hands out a
lease, so the join is confirmed but the address is not yet known — and printing
the unset one claimed a fact it did not have. - Pet weight is right again (raw ÷ 100, the cloud's own units) — recent rc
builds doubled the reading. - The weekday sleep schedule arms every day, not just Sunday, and the panel
sleep and wake times can actually be set — they now write the per-day
registers instead of one the firmware only computes. robotStatus10 is the clean cycle, with the boot cycle and filter wizard
mapped too. Left unmapped, their readings were published as real litter levels.- Litter readings are suppressed while the globe is not level — mid-cycle the
sensors are looking at the globe, not the litter. The first reading after a
restart is no longer discarded either. - The globe motor fault sensor watches the activity stream, where the fault
actually appears — the state document sat at 0 through a real fifty-minute
fault. A restored fault can also clear after a missed clear event, on the proof
of a clean cycle completing. - 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 — and
handling the robot no longer counts as a visit. - A long cat visit is no longer dropped. The close was matched against a
90-second window, and the cats that sit longest fell outside it. Last cat
visit now updates on every robot, stamping from occupancy rather than only
from weight events, which one robot never sends. - Hopper telemetry stopped lying about itself. Detection now means litter was
actually delivered, because the link register reports healthy on a bench and
"disconnected" during a refill — so nothing reads it for connectivity any more.
The level survives a restart instead of reading unknown for days, a robot that
dispenses but rarely reports its link keeps its telemetry, one dispense cannot
prove an empty hopper, and the upgrade sweep no longer removes hopper entities
from a robot that has one. - 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 was
still flowing. - A restored excess-weight alarm clears once the robot reports the pan clear,
instead of re-firing on every later visit. - 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 — and a detection
re-sweep no longer disables entities you enabled yourself. 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.- Errors are sentences, not stack traces. A Bluetooth failure reads "BLE scan
failed: Bluetooth device is turned off";~expands everywhere; every provision
answer is checked at its prompt, including that the CA really is a PEM; file and
broker errors print one line.--debugstill gives you the traceback. - 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.whiskerless set night-light-mode autoworks — every accepted spelling used
to crash.- Every settings write is verified by read-back, multi-register writes no
longer lose parts, and broker failures print instead of raising. - Fewer unknowns while calibration settles: the calibration reference shows the
built-in default (marked as such) and the hopper level a labelled estimate. - "A short press does nothing" was wrong, and dangerous. A short press of the
robot's Connect button toggles its WiFi off — the light bar turns white
and the robot vanishes from your broker, looking for all the world like a dead
unit. The README and the recovery guide both told you it was harmless. Hold
Connect for pairing mode; tap it only to put the radio back. - The status a robot reports while powering down is no longer labelled
"powering up", now that each half of a power cycle has been captured on its
own rather than together. - The waste-drawer register no longer claims to know direction. A brief rule
("it speaks on a seat and stays silent on a removal") held on one robot and
failed on the other; whiskerless still reports only when the drawer last
moved, which is all the hardware supports. - The declared Home Assistant minimum is correct (2025.3.0, not 2025.2.0).
Changed
- Some entities were renamed, and existing installs are moved with them:
Start clean cycle → Clean cycle, the two calibration buttons →
Calibrate full / Calibrate empty, Hopper fill (raw) → Hopper
reading, Litter calibration reference → Litter reference. Entity IDs you
chose yourself are left alone, and every rename is logged — check automations
that referenced the old IDs. - The manual calibration buttons now ship disabled. The robot calibrates
itself; enable them if you want to pin the scale to a measurement of your own. - Last visit duration ships disabled and enables itself at your robot's first
report — not every robot emits it, and that is not a firmware split. - Litter distances read in millimetres, not inches converted to thirteen
decimal places — the unit the protocol and the docs use. Per-entity overrides
still win. - The raw hopper reading, last dispense and clean-cycle count moved to
Diagnostics, leaving the sensor list to the things worth a glance. - 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. - Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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
-
v0.2.0-rc.23
Pre-releaseSome checks failedCI / Shell scripts and documentation links (push) Successful in 17sCI / Lint, type-check, test (library, 3.14) (push) Successful in 35sCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 39sCI / Test the dependency floors the package advertises (push) Successful in 30sPublish / Publish to PyPI (push) Successful in 27sCI / Type-check + test the integration (push) Successful in 2m23sPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Failing after 3m23sPublish / Bridge the macOS .pkg → NAS (push) Has been skippedPublish / Prune the candidates this release supersedes (push) Has been skippedPublish / Update the Homebrew tap formula (stable or -rc per tag) (push) Successful in 3m49sreleased this
2026-08-15 22:53:22 -07:00 | 72 commits to main since this releaseThe release where the robot stopped being read-only. Whiskerless could always
watch a Litter-Robot 4 and change its settings; it could not press anything. The
panel button register turned out to be writable, so Clean cycle and Reset are
real buttons now — they emit the exact code the panel does, which means the
firmware's pinch, cat-detect and bonnet interlocks apply to them just as they do
to a finger. Two other things changed the day-to-day: provisioning no longer
fails silently when you mistype the WiFi password, and the CLI remembers your
robots instead of wanting a wall of flags on every command.Thanks 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/.Breaking changes
Worth reading before you upgrade; the rest of the list is safe to skim.
binary_sensor.<robot>_waste_drawer_removed→sensor.<robot>_waste_drawer_last_moved.
The robot reports that the drawer moved and never which way, so a binary
sensor was claiming more than the hardware says.switch.<robot>_panel_sleep_mode→ a binary sensor. The firmware refuses
direct writes to it, so the switch could only ever fail. The weekday schedule
entities are the control.- Clean cycle wait time is a number (3–30 minutes), not a select.
- Library:
Hazard.MOTOR,MotorCommandErrorandallow_motorare gone. A
written press is the same event as a physical one, so that gate gated a hazard
that does not exist — and every caller passed the flag unconditionally, which
made the real gates look like the same formality. Power still requires
allow_dangerous. - Library:
LitterRobot4ClientandWhiskerlessAuthErrorare removed. Nothing
used them, and the client had become a third, already-drifting copy of the
write-verify loop.
Added
- Clean cycle and Reset buttons, and they actually work. Proven on ESP 1.1.75
and 1.4.4. This is the project's first recovered action command; the old "no
action commands exist" framing is dead. - Empty cycle and Power, shipped disabled and named
(danger)— an empty
cycle costs a litter refill, and a robot switched off has left the network, so
nothing over MQTT can switch it back on. The CLI gainsempty-cycleand
power, which prompt first. - Provisioning verifies the WiFi join. A mistyped passphrase used to sail
through silently — the robot accepted everything, rebooted, and simply never
appeared on any network, which is indistinguishable from a dead unit. The robot
names that failure if asked, so provisioning now polls the join status and stops
with "mistyped WiFi password" before touching the broker config; a confirmed
join prints the robot's IP and moves on early. Firmware that stays silent gets
the old wait. - 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 them — damaged profiles are
shown as such and can still be removed. whiskerless adopttells the CLI about a robot you provisioned before the
profile store existed, so it stops needing--serial/--host/--caon every
command. It writes the same profileprovisionwould and contacts nothing —
which also means it cannot check the serial, so confirm withwhiskerless state.- 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, and the robot's
factory certificate is never touched.provisiondoes now ask for the broker
username (optional, offered from what your other robots use), so an
authenticated broker no longer needs--usernameon every later command. - Litter level as a percentage — self-calibrating over time, or pinned
instantly by one button press with the globe filled the way you consider full. - LitterHopper support: connected, fill gauge, and an out-of-litter alert the
firmware never raises. The entities enable themselves at the first dispense. - 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 own panel. whiskerless status— the robot in plain terms from a single fresh reading:
level, drawer, faults, calibration. It names what needs a listener rather than
printing zeros.whiskerless calibrate full|emptystores your own litter
reference per robot and refuses a reading that cannot be one, and
whiskerless panel-resetpresses Reset.- Activity-derived entities survive a restart instead of reading unknown until
the next cat visit. - New install channels: Homebrew,
.deb/.rpm, and standalone Linux binaries
for amd64 and arm64 — none of which need a system Python. - The CLI shows liveness and colour: a spinner on the BLE scan (heartbeat lines
when piped), banners on the dangerous prompts,NO_COLORhonoured.
whiskerless --versionworks, and a barewhiskerlessprints an
orientation instead of a usage error. - The README covers the whole journey: prerequisites, per-platform installs
including Homebrew, everyday use, upgrading, the rc channel, uninstalling. - The integration has an icon and a logo, shipped inside it and served by Home
Assistant 2026.3+; older versions simply show what they show today.
Fixed
- Provisioning stops scanning the moment it finds your robot. It used to run
the whole--scan-timeouteven after the robot answered — and since a robot
only advertises while you hold Connect, that spent the pairing window instead
of using it. One bench attempt found the robot and then failed to connect,
because it had gone quiet by the time the scan ended. - The WiFi check no longer reports
0.0.0.0as your robot's address. The
robot says "connected" the instant it associates, before DHCP hands out a
lease, so the join is confirmed but the address is not yet known — and printing
the unset one claimed a fact it did not have. - Pet weight is right again (raw ÷ 100, the cloud's own units) — recent rc
builds doubled the reading. - The weekday sleep schedule arms every day, not just Sunday, and the panel
sleep and wake times can actually be set — they now write the per-day
registers instead of one the firmware only computes. robotStatus10 is the clean cycle, with the boot cycle and filter wizard
mapped too. Left unmapped, their readings were published as real litter levels.- Litter readings are suppressed while the globe is not level — mid-cycle the
sensors are looking at the globe, not the litter. The first reading after a
restart is no longer discarded either. - The globe motor fault sensor watches the activity stream, where the fault
actually appears — the state document sat at 0 through a real fifty-minute
fault. A restored fault can also clear after a missed clear event, on the proof
of a clean cycle completing. - 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 — and
handling the robot no longer counts as a visit. - A long cat visit is no longer dropped. The close was matched against a
90-second window, and the cats that sit longest fell outside it. Last cat
visit now updates on every robot, stamping from occupancy rather than only
from weight events, which one robot never sends. - Hopper telemetry stopped lying about itself. Detection now means litter was
actually delivered, because the link register reports healthy on a bench and
"disconnected" during a refill — so nothing reads it for connectivity any more.
The level survives a restart instead of reading unknown for days, a robot that
dispenses but rarely reports its link keeps its telemetry, one dispense cannot
prove an empty hopper, and the upgrade sweep no longer removes hopper entities
from a robot that has one. - 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 was
still flowing. - A restored excess-weight alarm clears once the robot reports the pan clear,
instead of re-firing on every later visit. - 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 — and a detection
re-sweep no longer disables entities you enabled yourself. 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.- Errors are sentences, not stack traces. A Bluetooth failure reads "BLE scan
failed: Bluetooth device is turned off";~expands everywhere; every provision
answer is checked at its prompt, including that the CA really is a PEM; file and
broker errors print one line.--debugstill gives you the traceback. - 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.whiskerless set night-light-mode autoworks — every accepted spelling used
to crash.- Every settings write is verified by read-back, multi-register writes no
longer lose parts, and broker failures print instead of raising. - Fewer unknowns while calibration settles: the calibration reference shows the
built-in default (marked as such) and the hopper level a labelled estimate. - "A short press does nothing" was wrong, and dangerous. A short press of the
robot's Connect button toggles its WiFi off — the light bar turns white
and the robot vanishes from your broker, looking for all the world like a dead
unit. The README and the recovery guide both told you it was harmless. Hold
Connect for pairing mode; tap it only to put the radio back. - The status a robot reports while powering down is no longer labelled
"powering up", now that each half of a power cycle has been captured on its
own rather than together. - The waste-drawer register no longer claims to know direction. A brief rule
("it speaks on a seat and stays silent on a removal") held on one robot and
failed on the other; whiskerless still reports only when the drawer last
moved, which is all the hardware supports. - The declared Home Assistant minimum is correct (2025.3.0, not 2025.2.0).
Changed
- Some entities were renamed, and existing installs are moved with them:
Start clean cycle → Clean cycle, the two calibration buttons →
Calibrate full / Calibrate empty, Hopper fill (raw) → Hopper
reading, Litter calibration reference → Litter reference. Entity IDs you
chose yourself are left alone, and every rename is logged — check automations
that referenced the old IDs. - The manual calibration buttons now ship disabled. The robot calibrates
itself; enable them if you want to pin the scale to a measurement of your own. - Last visit duration ships disabled and enables itself at your robot's first
report — not every robot emits it, and that is not a firmware split. - Litter distances read in millimetres, not inches converted to thirteen
decimal places — the unit the protocol and the docs use. Per-entity overrides
still win. - The raw hopper reading, last dispense and clean-cycle count moved to
Diagnostics, leaving the sensor list to the things worth a glance. - 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. - Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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
-
v0.2.0-rc.22
Pre-releaseAll checks were successfulCI / Shell scripts and documentation links (push) Successful in 16sCI / Lint, type-check, test (library, 3.14) (push) Successful in 42sCI / Test the dependency floors the package advertises (push) Successful in 41sCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 45sPublish / Publish to PyPI (push) Successful in 27sCI / Type-check + test the integration (push) Successful in 2m23sPublish / Update the Homebrew tap formula (stable or -rc per tag) (push) Successful in 5m13sPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Successful in 26m16sPublish / Bridge the macOS .pkg → NAS (push) Successful in 3sPublish / Prune the candidates this release supersedes (push) Has been skippedreleased this
2026-08-15 19:31:36 -07:00 | 79 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. - Provisioning asks for a broker username (optional, and offered from what your
other robots use) — an authenticated broker used to need--usernameon every
later command. The password is still per-run and never written down. - Provisioning verifies the WiFi join. A mistyped passphrase used to sail
through silently — the robot accepted everything, rebooted, and simply never
appeared on any network. The robot itself names that failure if asked, so
provisioning now polls the join status and stops with "mistyped WiFi
password" before touching the broker config; a confirmed join prints the
robot's IP and moves on early. Firmware that stays silent gets the old wait. whiskerless status— the robot in plain terms from a single fresh reading:
level, drawer, faults, calibration. It names what needs a listener rather than printing zeros.whiskerless calibrate full|emptystores your own litter reference per robot,
and refuses a reading that cannot be one.whiskerless panel-resetpresses Reset.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. - The integration has an icon and a logo, shipped inside it and served by
Home Assistant 2026.3+; older versions simply show what they show today.
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 Bluetooth failure is a sentence too — "BLE scan failed: Bluetooth device is
turned off" instead of a bleak traceback. - 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.
- A long cat visit is no longer dropped — the close was matched against a
90-second window, and the cats that sit longest fell outside it. - The first litter reading after a restart is no longer discarded, and a
hopper's own readings can no longer be undone by the upgrade that enabled it.
Changed
- Some entities were renamed, and existing installs are moved with them:
Start clean cycle → Clean cycle, the two calibration buttons → Calibrate
full / Calibrate empty, Hopper fill (raw) → Hopper reading, Litter
calibration reference → Litter reference. Entity IDs you chose yourself are
left alone; every rename is logged, so check automations that used the old IDs. - The raw hopper reading, last dispense and clean-cycle count moved to
Diagnostics, leaving the sensor list to the things worth a glance. - The manual calibration buttons now ship disabled. The robot calibrates
itself; enable them if you want to pin the scale to a measurement of your own. - Litter distances read in millimetres, not inches converted to thirteen
decimal places — the unit the protocol and the docs use. Per-entity overrides win. - Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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.
-
v0.2.0-rc.21
Pre-releaseAll checks were successfulCI / Shell scripts and documentation links (push) Successful in 16sCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 37sCI / Lint, type-check, test (library, 3.14) (push) Successful in 38sCI / Test the dependency floors the package advertises (push) Successful in 28sPublish / Publish to PyPI (push) Successful in 31sCI / Type-check + test the integration (push) Successful in 2m27sPublish / Update the Homebrew tap formula (stable or -rc per tag) (push) Successful in 4m31sPublish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Successful in 26m15sPublish / Bridge the macOS .pkg → NAS (push) Successful in 3sPublish / Prune the candidates this release supersedes (push) Has been skippedreleased this
2026-08-15 18:46:52 -07:00 | 80 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. - Provisioning asks for a broker username (optional, and offered from what your
other robots use) — an authenticated broker used to need--usernameon every
later command. The password is still per-run and never written down. - Provisioning verifies the WiFi join. A mistyped passphrase used to sail
through silently — the robot accepted everything, rebooted, and simply never
appeared on any network. The robot itself names that failure if asked, so
provisioning now polls the join status and stops with "mistyped WiFi
password" before touching the broker config; a confirmed join prints the
robot's IP and moves on early. Firmware that stays silent gets the old wait. whiskerless status— the robot in plain terms from a single fresh reading:
level, drawer, faults, calibration. It names what needs a listener rather than printing zeros.whiskerless calibrate full|emptystores your own litter reference per robot,
and refuses a reading that cannot be one.whiskerless panel-resetpresses Reset.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. - The integration has an icon and a logo, shipped inside it and served by
Home Assistant 2026.3+; older versions simply show what they show today.
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 Bluetooth failure is a sentence too — "BLE scan failed: Bluetooth device is
turned off" instead of a bleak traceback. - 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.
- A long cat visit is no longer dropped — the close was matched against a
90-second window, and the cats that sit longest fell outside it. - The first litter reading after a restart is no longer discarded, and a
hopper's own readings can no longer be undone by the upgrade that enabled it.
Changed
- Some entities were renamed, and existing installs are moved with them:
Start clean cycle → Clean cycle, the two calibration buttons → Calibrate
full / Calibrate empty, Hopper fill (raw) → Hopper reading, Litter
calibration reference → Litter reference. Entity IDs you chose yourself are
left alone; every rename is logged, so check automations that used the old IDs. - The raw hopper reading, last dispense and clean-cycle count moved to
Diagnostics, leaving the sensor list to the things worth a glance. - The manual calibration buttons now ship disabled. The robot calibrates
itself; enable them if you want to pin the scale to a measurement of your own. - Litter distances read in millimetres, not inches converted to thirteen
decimal places — the unit the protocol and the docs use. Per-entity overrides win. - Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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.
-
v0.2.0-rc.20
Pre-releaseSome checks failedCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 37sCI / Shell scripts and documentation links (push) Successful in 21sCI / Lint, type-check, test (library, 3.14) (push) Successful in 50sCI / Test the dependency floors the package advertises (push) Successful in 29sPublish / Publish to PyPI (push) Successful in 26sCI / Type-check + test the integration (push) Successful in 2m53sPublish / 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-15 14:50:24 -07:00 | 94 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 status— the robot in plain terms from a single fresh reading:
level, drawer, faults, calibration. It names what needs a listener rather than printing zeros.whiskerless calibrate full|emptystores your own litter reference per robot,
and refuses a reading that cannot be one.whiskerless panel-resetpresses Reset.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.
- A long cat visit is no longer dropped — the close was matched against a
90-second window, and the cats that sit longest fell outside it. - The first litter reading after a restart is no longer discarded, and a
hopper's own readings can no longer be undone by the upgrade that enabled it.
Changed
- Some entities were renamed, and existing installs are moved with them:
Start clean cycle → Clean cycle, the two calibration buttons → Calibrate
full / Calibrate empty, Hopper fill (raw) → Hopper reading, Litter
calibration reference → Litter reference. Entity IDs you chose yourself are
left alone; every rename is logged, so check automations that used the old IDs. - The raw hopper reading, last dispense and clean-cycle count moved to
Diagnostics, leaving the sensor list to the things worth a glance. - The manual calibration buttons now ship disabled. The robot calibrates
itself; enable them if you want to pin the scale to a measurement of your own. - Litter distances read in millimetres, not inches converted to thirteen
decimal places — the unit the protocol and the docs use. Per-entity overrides win. - Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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.
-
v0.2.0-rc.19
Pre-releaseSome checks failedCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 34sCI / Shell scripts and documentation links (push) Successful in 16sCI / Lint, type-check, test (library, 3.14) (push) Successful in 39sCI / Test the dependency floors the package advertises (push) Successful in 23sPublish / Publish to PyPI (push) Successful in 24sCI / Type-check + test the integration (push) Successful in 2m38sPublish / 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-15 09:48:15 -07:00 | 101 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.
- A long cat visit is no longer dropped — the close was matched against a
90-second window, and the cats that sit longest fell outside it. - The first litter reading after a restart is no longer discarded, and a
hopper's own readings can no longer be undone by the upgrade that enabled it.
Changed
- Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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.
-
v0.2.0-rc.18
Pre-releaseSome checks failedCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 41sCI / Shell scripts and documentation links (push) Successful in 16sCI / Lint, type-check, test (library, 3.14) (push) Successful in 41sCI / Test the dependency floors the package advertises (push) Successful in 26sPublish / Publish to PyPI (push) Successful in 26sCI / Type-check + test the integration (push) Successful in 2m56sPublish / 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-15 09:12:59 -07:00 | 102 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.
- A long cat visit is no longer dropped — the close was matched against a
90-second window, and the cats that sit longest fell outside it. - The first litter reading after a restart is no longer discarded, and a
hopper's own readings can no longer be undone by the upgrade that enabled it.
Changed
- Detections remember what proved them, so tightening one rule can no longer
cost you entities another rule had already earned. - All the derived telemetry moved into the library, which is what will let the
CLI show everything Home Assistant shows without a second implementation. - 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.
-
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.
-
v0.2.0-rc.16
Pre-releaseSome checks failedCI / Lint, type-check, test (library, 3.11.0) (push) Successful in 33sCI / Shell scripts and documentation links (push) Successful in 32sCI / Lint, type-check, test (library, 3.14) (push) Successful in 54sCI / Test the dependency floors the package advertises (push) Successful in 28sPublish / Publish to PyPI (push) Successful in 29sCI / Type-check + test the integration (push) Successful in 2m35sPublish / 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 09:37:37 -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.