Repository navigation
Releases: binarylogic/py-wftnp
Release list
wftnp 0.1.2
This release fixes two callback shutdown edge cases found during a repository audit and adds repeatable tests against real WFTNP equipment.
- Track callback task lifetime separately from subscription intent, so shutdown waits for callback cleanup after a failed subscription is replaced or removed.
- Avoid deadlock when callback cleanup calls
stop()while another shutdown is already joining that callback. - Log discovery resolution failures at debug level.
- Add
task test:hardware: one opt-in, serial lane with local configuration and a write-blocking TCP proxy. Ordinary CI never connects to equipment.
Validation: 91 simulator/unit tests pass with 96% combined coverage; formatting, lint, source typing, and strict package metadata checks pass. The hardware lane passed against KICKR BIKE and KICKR RUN: 30-second streams with interleaved reads, three real TCP interruptions per device, automatic subscription recovery, and notification disable/re-enable. The final run received 121 bike packets and 61 treadmill packets during the streams. No equipment-control commands were sent.
See the audit and hardware validation for details, instructions, and limitations. Hardware checks used idle equipment; simultaneous ROUVY/Zwift operation and long workouts remain unverified.
pip install 'wftnp[discovery]==0.1.2'wftnp 0.1.1
First PyPI release of wftnp, a typed asyncio implementation of WFTNP (Wahoo Direct Connect).
This patch updates the publishing action to support Core Metadata 2.5 emitted by Hatchling. Protocol library behavior is unchanged from 0.1.0.
The library provides service/characteristic discovery, opaque reads and writes, and bounded notification streaming. It manages reconnects and restores subscriptions without replaying application requests. Optional mDNS discovery is available; the core has no runtime dependencies. Requires Python 3.11+.
pip install wftnp==0.1.1
# With mDNS discovery:
pip install 'wftnp[discovery]==0.1.1'Validation: 87 tests, 96% combined statement/branch coverage, Python 3.11–3.14 on Linux, and Python 3.12 on macOS and Windows. KICKR BIKE and KICKR RUN supplied live notifications and recovered subscriptions after three deliberate connection interruptions during read-only hardware validation.
Fitness-profile decoding and Home Assistant integration are outside this package. Hardware checks used idle equipment; concurrent ROUVY/Zwift operation and long workouts have not been validated. See architecture and hardware observations.
wftnp 0.1.0
Initial release of wftnp, a standalone, typed asyncio implementation of WFTNP (Wahoo Direct Connect).
The client discovers services and characteristics, reads and writes opaque bytes, and streams notifications. It manages reconnects and restores subscriptions while never replaying application requests or writes.
- Explicit deadlines and cancellation behavior; serialized request/response correlation.
- Read-only health probes and exponential reconnect backoff.
- Bounded, ordered callback or async-iterator delivery with explicit overflow and callback errors.
- Optional mDNS discovery; dependency-free core; Python 3.11+; Apache-2.0.
Validation: 87 tests, 96% combined statement/branch coverage, Python 3.11–3.14 on Linux, and Python 3.12 on macOS and Windows. Wheel/source distributions pass strict metadata checks. The installed wheel was tested against KICKR BIKE and KICKR RUN; both supplied notifications and recovered subscriptions after three deliberate socket interruptions.
This release implements the transport protocol. Fitness metric decoding and Home Assistant integration belong above it. Hardware tests were read-only and performed with idle devices; concurrent ROUVY/Zwift operation and long workouts have not been validated. See architecture and hardware observations.
Wheel and source distributions are attached. PyPI publishing is handled by the release workflow.