BLE Device Monitor for Ceily/Wally
Project description
RVT-Monitor
BLE Device Monitor and Control Tool for Ceily/Wally devices.
Installation
pip install rvt-monitor
Or install from source:
cd rvt-monitor
pip install -e .
Usage
rvt-monitor
Opens web UI at http://127.0.0.1:8000
BLE Protocol Reference
Device Information Service (0x180A)
Standard BLE SIG service for device identification.
| Characteristic | UUID | Format | Example |
|---|---|---|---|
| Model Number | 0x2A24 | {device}-p{protocol} |
ceily-p2, wally-p2 |
| Hardware Revision | 0x2A27 | v{version} |
v0, v1 |
| Firmware Revision | 0x2A26 | semver | 2.0.0 |
Custom Services
| Service | UUID | Description |
|---|---|---|
| Control | 0000ff20-... |
Motion control |
| System Status | 501a8cf5-98a7-4370-bb97-632c84910000 |
Device state |
| Dimension | cc9762a6-bbb7-4b21-b2e2-153059030000 |
Device config |
| LED | 07ecc81b-b952-47e6-a1f1-0999577f0000 |
LED control |
| Log | cc9762a6-bbb7-4b21-b2e2-153059032200 |
Event logs |
Motion Commands
Write to MOTION_CONTROL characteristic (0x0000ff21-...):
| Command | Value | Ceily | Wally |
|---|---|---|---|
| STOP | 0x00 | Stop | Stop |
| UP/OPEN | 0x01 | Up | Open |
| DOWN/CLOSE | 0x02 | Down | Close |
Motion States
Read from SYSTEM_STATUS characteristic (byte 0):
| State | Value | Description |
|---|---|---|
| DOWN/CLOSED | 0 | At bottom/closed position |
| UP/OPENED | 1 | At top/opened position |
| MOVING_DOWN | 2 | Moving down/closing |
| MOVING_UP | 3 | Moving up/opening |
| STOP | 4 | Stopped mid-motion |
| EMERGENCY | 5 | Emergency stop |
| INIT | 255 | Initializing |
Protocol Version Detection
By Device Info Service
from bleak import BleakClient
MODEL_NUMBER_UUID = "00002a24-0000-1000-8000-00805f9b34fb"
async def detect_protocol(client: BleakClient) -> int:
"""Detect protocol version from Model Number."""
try:
data = await client.read_gatt_char(MODEL_NUMBER_UUID)
model = data.decode("utf-8").rstrip("\x00")
# Format: "ceily-p2" or "wally-p2"
if "-p" in model:
return int(model.split("-p")[1])
except Exception:
pass
return 1 # Legacy fallback
By Service Discovery
DEVICE_INFO_SERVICE = "0000180a-0000-1000-8000-00805f9b34fb"
async def detect_by_services(client: BleakClient) -> int:
"""Detect by checking for Device Info Service."""
for service in client.services:
if service.uuid.lower() == DEVICE_INFO_SERVICE:
return 2
return 1 # Legacy (no Device Info Service)
Example: Connect and Control
from bleak import BleakClient
MOTION_CONTROL_UUID = "0000ff21-0000-1000-8000-00805f9b34fb"
SYSTEM_STATUS_UUID = "501a8cf5-98a7-4370-bb97-632c84910001"
async def control_device(address: str):
async with BleakClient(address) as client:
# Read status
data = await client.read_gatt_char(SYSTEM_STATUS_UUID)
state = data[0]
print(f"Current state: {state}")
# Send UP command
await client.write_gatt_char(MOTION_CONTROL_UUID, bytes([0x01]))
Project Structure
rvt-monitor/
├── rvt_monitor/
│ ├── ble/
│ │ ├── manager.py # BLE connection management
│ │ ├── profiles.py # Protocol version profiles
│ │ ├── protocol.py # UUID definitions & parsers
│ │ └── scanner.py # Device discovery
│ ├── server/
│ │ ├── app.py # FastAPI server
│ │ └── routes/ # API endpoints
│ └── static/ # Web UI
└── pyproject.toml
Publishing to PyPI
Via Git Tag (Recommended)
# Update version in pyproject.toml first
git add pyproject.toml
git commit -m "chore(rvt-monitor): Bump version to x.y.z"
# Create and push tag
git tag rvt-monitor-vX.Y.Z
git push origin main --tags
CI/CD will automatically build and publish to PyPI.
Manual Trigger
- Go to GitHub → Actions
- Select "Publish rvt-monitor to PyPI"
- Click "Run workflow"
Related
- Firmware:
v1/common_components/- Device-side BLE implementation - OTA Tool:
ota/ota.py- Firmware deployment
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 rvt_monitor-1.1.0.tar.gz.
File metadata
- Download URL: rvt_monitor-1.1.0.tar.gz
- Upload date:
- Size: 65.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd2f9418cc24e96120b2e605430f6596f86c90e0d40d512bffd53247fb7ff9af
|
|
| MD5 |
67f1327d38f11d3d3bea4ea64b74daa1
|
|
| BLAKE2b-256 |
d6163bed7733eaa97ac1f945d8481bc2298978b426da89e6d6163819e6e14c22
|
Provenance
The following attestation bundles were made for rvt_monitor-1.1.0.tar.gz:
Publisher:
rvt-monitor-publish.yml on rovothome/firmware
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rvt_monitor-1.1.0.tar.gz -
Subject digest:
cd2f9418cc24e96120b2e605430f6596f86c90e0d40d512bffd53247fb7ff9af - Sigstore transparency entry: 1673485176
- Sigstore integration time:
-
Permalink:
rovothome/firmware@ed25ec1c1a56794d5ba12aea2ea15d7384e13521 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rovothome
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
rvt-monitor-publish.yml@ed25ec1c1a56794d5ba12aea2ea15d7384e13521 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rvt_monitor-1.1.0-py3-none-any.whl.
File metadata
- Download URL: rvt_monitor-1.1.0-py3-none-any.whl
- Upload date:
- Size: 82.1 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 |
f45486df53c9a15acce719b3e3f5b5480be65308347a2c62b1fc9339e50f1054
|
|
| MD5 |
24b632b6ef9049c97b0be26abe60ae52
|
|
| BLAKE2b-256 |
ccbdabd2e3eaedab8a52642475771814ecfd59587b93e32c4a9f851848175f77
|
Provenance
The following attestation bundles were made for rvt_monitor-1.1.0-py3-none-any.whl:
Publisher:
rvt-monitor-publish.yml on rovothome/firmware
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rvt_monitor-1.1.0-py3-none-any.whl -
Subject digest:
f45486df53c9a15acce719b3e3f5b5480be65308347a2c62b1fc9339e50f1054 - Sigstore transparency entry: 1673485178
- Sigstore integration time:
-
Permalink:
rovothome/firmware@ed25ec1c1a56794d5ba12aea2ea15d7384e13521 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rovothome
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
rvt-monitor-publish.yml@ed25ec1c1a56794d5ba12aea2ea15d7384e13521 -
Trigger Event:
push
-
Statement type: