• v0.2.0-rc.1 7e2d84e2fb

    v0.2.0-rc.1
    Some checks failed
    CI / Lint, type-check, test (library, 3.11) (push) Successful in 29s
    CI / Lint, type-check, test (library, 3.14) (push) Successful in 28s
    Publish / Publish to PyPI (push) Successful in 28s
    CI / Type-check + test the integration (push) Successful in 2m0s
    Publish / Create releases + Linux binary (Forgejo, NAS, GitHub) (push) Failing after 35s
    Publish / Bridge the macOS .pkg → NAS (push) Has been skipped
    Pre-release

    Cody Bryant released this 2026-08-09 01:29:07 -07:00 | 192 commits to main since this release

    Most of this release came from a field install by
    @CryingPecan, who ran a real Litter-Robot 4
    with a LitterHopper on ESP 1.4.4 for two weeks of continuous MQTT capture and
    turned it into four PRs and a pile of protocol findings.

    Added

    • Pet weight actually works. Weight (register 0x09) is reported only in the
      activity stream, which the coordinator previously used as a poll trigger and
      discarded — so cat_weight was permanently null. New library events.py
      decodes the activity stream into typed events.
    • New entities: last cat visit, last visit duration (register 0xBC, which
      also gates whether a weight event fires at all), waste drawer removed
      (register 0x56 — something the cloud integration does not offer), and panel
      brightness for bright and dark rooms.
    • LitterHopper support: hopper connected, hopper fill gauge, and a hopper
      out-of-litter alert. The firmware never flags an empty hopper — it keeps
      running a full dispense every cycle, delivering nothing — so the gauge is read
      from dispense phase 1, calibrated across a live drain-to-refill arc. Neither
      the cloud nor the Whisker app offers this. These four ship disabled: the
      hopper is optional hardware and invisible in the local state document, so
      enable them once if your robot has one.
    • Litter percentage calibration. litterLevel is a distance, and the cloud
      converts it against a per-robot reference that is not in the local state
      document. One button press with the globe filled to the line anchors the
      percentage to your robot; an optional second press with it empty upgrades to a
      true two-point scale.
    • Activity-derived entities survive a restart instead of reading unknown
      until the next cat visit or dispense.

    Fixed

    • robotStatus 10 is the clean cycle, on every firmware. This table has said
      10 = cat/weight pause and 13 = cycling since the first commit, tagged
      PROVEN. It came from a static firmware-RE brief and was never checked against a
      live cycle. A narrated manual cycle on ESP 1.1.75 holds robotStatus at 10
      for the entire cycle with catDetect at 0 throughout, and 13 has never
      appeared on either captured firmware. Also adds 5, 6/7 and 25.
    • The cycle phase ladder 2 → 3 → 4 → 5 → 1 (the cloud names them DUMP, DFI,
      LEVEL, HOME, IDLE). The map previously stopped at 3, so every robot published
      unknown_4 mid-cycle. robotCycleState 4 is the cat-interrupt pause, which
      self-clears without a button press.
    • Litter readings are suppressed while the globe is not level — mid-cycle the
      sensors read the rotating globe rather than the litter bed (575 mm observed on
      a 453 mm fill), which was published as a real percentage. Also covers the
      filter-change wizard, which parks the globe inverted.
    • Broker failures are reported, not raised as a traceback. An unreachable
      broker or rejected certificate produced a raw Python stack trace.
    • The CLI works against a CA generated by this project's own documentation.
      Python 3.13 enables strict X.509 verification, which rejects a CA without a
      keyUsage extension — and the macOS installer has no older interpreter to fall
      back to. Strictness is now relaxed only for an explicitly pinned CA, which is
      also now the only certificate trusted on that connection.
    • pic_firmware, previously always null, composed from the local mb* fields.
    • Entities a previous version created but this one no longer produces are removed
      from the registry instead of lingering forever as unavailable.

    Changed

    • Clean cycle wait time is now a number (3–30 minutes), not a select. The
      robot accepts any value in the range; the five presets were inherited from
      pylitterbot and made any other setting read as unknown. Breaking:
      automations referencing select.<robot>_clean_cycle_wait_time must move to
      number.<robot>_clean_cycle_wait_time.
    • Panel brightness High/Low name the ambient light level, not the brightness
      rank — proven by a two-observation behavioural test. The stock 40/50 is
      deliberately brighter at night.
    • Releases are never published before the library version they pin exists on
      PyPI, and CI now exercises the Python 3.11 floor it advertises.
    Downloads