Skip to main content

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

  1. Go to GitHub → Actions
  2. Select "Publish rvt-monitor to PyPI"
  3. Click "Run workflow"

Related

  • Firmware: v1/common_components/ - Device-side BLE implementation
  • OTA Tool: ota/ota.py - Firmware deployment

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rvt_monitor-0.3.1.tar.gz (48.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rvt_monitor-0.3.1-py3-none-any.whl (58.0 kB view details)

Uploaded Python 3

File details

Details for the file rvt_monitor-0.3.1.tar.gz.

File metadata

  • Download URL: rvt_monitor-0.3.1.tar.gz
  • Upload date:
  • Size: 48.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rvt_monitor-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1aa35051f8ad11fd4dc7d5aa01f30d557db6324440c93b4c735a639a4dc33d44
MD5 6e388ea79f7faa13f74615a712bdcdf5
BLAKE2b-256 d0d7365bb0213e7768f1c2ac741d87d45c366557f228dc9d3aede2de5fe32057

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvt_monitor-0.3.1.tar.gz:

Publisher: rvt-monitor-publish.yml on rovothome/firmware

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rvt_monitor-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: rvt_monitor-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 58.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rvt_monitor-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 60ca90960e11b9059e538d3237e31643469353fb50b3230040c57e14c649d2c6
MD5 f01349c298b5b29013153c37d13f5db6
BLAKE2b-256 6a73ace979daa1e98efbb0a0646df2c887e962084d963545f9b0b0b3885f390b

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvt_monitor-0.3.1-py3-none-any.whl:

Publisher: rvt-monitor-publish.yml on rovothome/firmware

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page