Python BLE library for Grouw robotic mowers using the Daye Power protocol
Project description
pyGrouw
Python library for local Bluetooth Low Energy communication with Grouw robotic
mowers that use the Daye Power app protocol (com.dayepower.dayeappleaf).
This package contains the device/protocol code intended to be used by Home Assistant integrations and other Python applications. It has no Home Assistant runtime dependency.
Status
The library currently targets the DYM-era Grouw mower generation observed in the Daye Power APK and redacted real-hardware captures.
Durable protocol and reverse-engineering notes live in reverse_engineered/index.md.
Supported protocol helpers:
- DYM status, start/resume, pause/stop, dock, session start, and auth query payload encoding.
- DYM status and auth/PIN notification parsing.
- APK-shaped BlueKey debug payload encoding and parsing helpers for protocol research.
- Optional BLE discovery helpers that match the Home Assistant integration's supported name/service UUID filters.
- Serialized BLE request flow using
bleakandbleak-retry-connector.
Not yet supported:
- Cloud or Wi-Fi control.
- Settings writes for rain, schedules, multi-area, PIN change, or firmware update.
Installation For Development
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -e ".[test]"
pytest -q
Usage
Applications should resolve a connectable BLE device themselves, then pass it to the client. Home Assistant integrations should use Home Assistant's Bluetooth manager and inject the resolved device.
from pygrouw import GrouwBleMower, GrouwBleMowerClient
client = GrouwBleMowerClient(
address="AA:BB:CC:DD:EE:FF",
name="Robot Mower_DYM",
pin="1234",
device_provider=lambda: ble_device,
)
mower = GrouwMower(client)
state = await mower.async_update()
await mower.async_start()
device_provider may be synchronous or asynchronous. It must return a
connectable bleak.backends.device.BLEDevice or None.
For standalone scripts, the library also exposes optional discovery helpers:
from pygrouw import GrouwBleMower, GrouwBleMowerClient, discover_devices
devices = await discover_devices(timeout=5)
client = await GrouwBleMowerClient.from_discovery(
address=devices[0].address,
pin="1234",
)
mower = GrouwMower(client)
state = await mower.async_update()
Home Assistant integrations should still prefer Home Assistant's Bluetooth manager over calling these scanning helpers from inside Home Assistant.
Home Assistant Development
When testing an unpublished editable library inside Home Assistant:
pip3 install -e ../pyGrouw
hass --skip-pip-packages pygrouw
That follows Home Assistant's guidance for standalone API/protocol libraries: protocol-specific code lives outside the integration and package releases are eventually published to PyPI from tagged source releases.
Release Publishing
GitHub Actions runs tests for pull requests and pushes to main. Published
GitHub releases also run the full test/build/check flow before uploading to
PyPI.
PyPI publishing is configured for Trusted Publishing. On PyPI, create a Trusted Publisher for this project with:
- Repository owner:
Bjorkan - Repository name:
pyGrouw - Workflow name:
publish.yml - Environment name:
pypi
If pygrouw does not exist on PyPI yet, create a pending publisher from your
PyPI account sidebar under Publishing. If the project already exists, open
the project on PyPI, go to Manage project -> Publishing, and add the
GitHub Actions publisher there.
Before publishing a release, update version in pyproject.toml, merge to
main, create a matching tag, and publish a GitHub Release from that tag. The
publish workflow requires the release tag to match the package version, with or
without a v prefix. For version 0.1.0, both 0.1.0 and v0.1.0 are valid.
Dependency Updates
Renovate is configured in renovate.json. The GitHub workflow runs Renovate
at 00:00 UTC, and can also be started manually from the Actions tab.
Add a repository secret named RENOVATE_TOKEN with permission to create
branches and pull requests. Do not use the default GITHUB_TOKEN for Renovate:
pull requests created with it do not reliably trigger the normal PR checks.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pygrouw-0.1.1.tar.gz.
File metadata
- Download URL: pygrouw-0.1.1.tar.gz
- Upload date:
- Size: 40.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a173dfe97c85eaa0b36684edcc4b061f5c1859903569e64d20ae81ca111f21b7
|
|
| MD5 |
9e02bf4e5d72f5357d40d93ae5705418
|
|
| BLAKE2b-256 |
81d1e12d23058f6a59ad7723cb829348f33b82ae68e679954cdd0d2cce710e5f
|
Provenance
The following attestation bundles were made for pygrouw-0.1.1.tar.gz:
Publisher:
publish.yml on Bjorkan/pyGrouw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygrouw-0.1.1.tar.gz -
Subject digest:
a173dfe97c85eaa0b36684edcc4b061f5c1859903569e64d20ae81ca111f21b7 - Sigstore transparency entry: 1982844699
- Sigstore integration time:
-
Permalink:
Bjorkan/pyGrouw@27222f272e7ed39283e1261edc4af1849f897824 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Bjorkan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@27222f272e7ed39283e1261edc4af1849f897824 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pygrouw-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pygrouw-0.1.1-py3-none-any.whl
- Upload date:
- Size: 16.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da788d37ed402c94ae99e2259fd2f40a0da0ff4b0b218c9d591650320c7320c9
|
|
| MD5 |
6a9aee2776ec560d7c1f451dcb9e6bcb
|
|
| BLAKE2b-256 |
49bc7044c06527d9d92c2382ec1f7c604ba722554066355b9e5e676b82591be6
|
Provenance
The following attestation bundles were made for pygrouw-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Bjorkan/pyGrouw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygrouw-0.1.1-py3-none-any.whl -
Subject digest:
da788d37ed402c94ae99e2259fd2f40a0da0ff4b0b218c9d591650320c7320c9 - Sigstore transparency entry: 1982844773
- Sigstore integration time:
-
Permalink:
Bjorkan/pyGrouw@27222f272e7ed39283e1261edc4af1849f897824 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Bjorkan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@27222f272e7ed39283e1261edc4af1849f897824 -
Trigger Event:
release
-
Statement type: