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-1.0.0.tar.gz (64.9 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-1.0.0-py3-none-any.whl (80.7 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for rvt_monitor-1.0.0.tar.gz
Algorithm Hash digest
SHA256 af00bb999989829fea16de3a410292d238995b5ac2f738d7e5dbe059a967a872
MD5 6f2dad547108e933f95e0a0fa7e66834
BLAKE2b-256 eac1a263a5f59150e238382a14332fe9a9ee8d660aa92c03cf45ac823e20a003

See more details on using hashes here.

Provenance

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

File metadata

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

File hashes

Hashes for rvt_monitor-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6f461257527ede1a0b3fd74d2e4a8b9b80c465e2fb14bd240fcf5412230363c2
MD5 39d01e94ad45a76a16031198e68e2ebd
BLAKE2b-256 b64bed969712f50fbd1cb734660f54ca0a48661833ca9e00accc150181475e26

See more details on using hashes here.

Provenance

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