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.4.0.tar.gz (52.0 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.4.0-py3-none-any.whl (62.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: rvt_monitor-0.4.0.tar.gz
  • Upload date:
  • Size: 52.0 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.4.0.tar.gz
Algorithm Hash digest
SHA256 bd836725cc7ccee16645c4832260318e0e67bad8085d162f09e3540199c45837
MD5 94dffb6eb77c8e7054c66969d79e003f
BLAKE2b-256 0debbd8726d83e74a3439682c0d9f8ee7b41868cce07ef896d5296ae28693389

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvt_monitor-0.4.0.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.4.0-py3-none-any.whl.

File metadata

  • Download URL: rvt_monitor-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 62.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.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 161cec3fc3becf1c12d2cdf80d7c829477f27b51a2952fdcc46002ba9e4204cc
MD5 aecc5d10e3bf8b2c82d858f19d28efc8
BLAKE2b-256 f7eb540272efeb9b5c29e63da5df324b120b1b3960df9f3a104000cade7f7282

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvt_monitor-0.4.0-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