Skip to main content

Robomow BLE protocol library

Project description

Robomow-BLE

Robomow-BLE is a standalone Python library for talking to Robomow mowers over Bluetooth Low Energy (BLE).

It provides a reusable BLE protocol layer for Robomow mowers and can be used directly in Python applications.

Currently it only supports RT models. Support for other models may be added in the future if there is demand and access to devices for testing.

API Overview

Please refer to the API documentation for details.

How to use

Install

Install from PyPI:

python -m pip install Robomow-BLE

Create a device client

Create a RobomowDevice with:

  • mainboard_serial: mower mainboard serial used during authentication.
  • update_callback (optional): called for each update as RobomowUpdate(key, value).
from robomow_ble import RobomowDevice

mower = RobomowDevice(
    mainboard_serial="12345678901234",
)

How to find mainboard_serial:

  1. Log in to myrobomow.robomow.com.
  2. Open your browser's Developer Tools (F12).
  3. Go to the Network tab.
  4. Reload the page.
  5. Look for a request ending in /api/customer/products.
  6. Click the request and open the Response tab.
  7. In the JSON response, find the field named MainboardSerial. This value is the actual mainboard serial number.

Connect and authenticate

Discover a BLE device with Bleak, then connect:

from bleak import BleakScanner

ble_device = await BleakScanner.find_device_by_address(address, timeout=15.0)
if ble_device is None:
    raise RuntimeError("Mower not found")

await mower.async_connect(ble_device)

Receive updates

Pass a callback to receive state changes:

from robomow_ble import RobomowUpdate, EntityKey


def on_update(update: RobomowUpdate) -> None:
    if update.key == EntityKey.BATTERY_LEVEL:
        print(f"Battery: {update.value}%")
    else:
        print(f"{update.key}: {update.value}")

Send commands

Common control methods:

  • await mower.async_start_mowing(duration_minutes=30)
  • await mower.async_start_mowing_edge()
  • await mower.async_stop_mowing()
  • await mower.async_return_to_home()

Common settings methods:

  • await mower.async_enable_schedule() / await mower.async_disable_schedule()
  • await mower.async_set_schedule(schedule)
  • await mower.async_enable_anti_theft() / await mower.async_disable_anti_theft()
  • await mower.async_enable_child_lock() / await mower.async_disable_child_lock()
  • await mower.async_set_wire_signal_type(wire_signal_type)

Read state

Example state properties:

  • Identity/version: family, model, mainboard_version, software_version
  • Live values: operating_state, message, battery_level, rssi
  • Status: schedule_enabled, next_departure, expected_duration

Disconnect cleanly

Always disconnect in a finally block:

try:
    ...
finally:
    await mower.async_disconnect()

Minimal example

import asyncio

from bleak import BleakScanner
from robomow_ble import RobomowDevice, RobomowUpdate, EntityKey


def on_update(update: RobomowUpdate) -> None:
    if update.key == EntityKey.BATTERY_LEVEL:
        print(f"Battery: {update.value}%")
    else:
        print(f"{update.key}: {update.value}")


async def main() -> None:
    # Replace these with your mower details
    address = "AA:BB:CC:DD:EE:FF"
    mainboard_serial = "12345678901234"

    ble_device = await BleakScanner.find_device_by_address(address, timeout=15.0)
    if ble_device is None:
        raise RuntimeError("Mower not found")

    mower = RobomowDevice(
        mainboard_serial=mainboard_serial,
        update_callback=on_update,
    )

    await mower.async_connect(ble_device)
    try:
        await mower.async_start_mowing(duration_minutes=30)
        await asyncio.sleep(5)
        print("State:", mower.operating_state)
    finally:
        await mower.async_disconnect()


if __name__ == "__main__":
    asyncio.run(main())

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

robomow_ble-1.0.0.tar.gz (25.7 kB view details)

Uploaded Source

Built Distribution

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

robomow_ble-1.0.0-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for robomow_ble-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d2a1e79fd4eff443f4c2a5fd64f432fe16703e8b9667fa50ff8fb6f79c9afd68
MD5 b4992b8c1a432703e6965d79a4e3826b
BLAKE2b-256 8aeb7a1571c32ee3b0e8519fcb6b87b492b3c409e86f27da20cde8a893cb7628

See more details on using hashes here.

Provenance

The following attestation bundles were made for robomow_ble-1.0.0.tar.gz:

Publisher: release.yml on arjanmels/robomow_ble

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

File details

Details for the file robomow_ble-1.0.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for robomow_ble-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 66921ce6bf35ae02a5fa1a16a79ff969488e1bf4bffb90dde786be511956c5c7
MD5 21cf9cc737d0de56627f36a1ad3af65e
BLAKE2b-256 2fbef4c08d4189c5ff40c98b46fc20c331daea62de2365df42677eff216e5fdd

See more details on using hashes here.

Provenance

The following attestation bundles were made for robomow_ble-1.0.0-py3-none-any.whl:

Publisher: release.yml on arjanmels/robomow_ble

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