A reverse-engineered Python client for the BLE protocol used by "Mobius Ready" aquarium equipment
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Carlos Mogas da Silva dceb1a202c
All checks were successful
Release / release (push) Successful in 2m43s
Release 0.10.3
2026-10-11 16:23:22 +01:00
.forgejo fix: release-dir must never be empty for forgejo-release - point at dist/ (always has the built wheel/sdist) instead of an artificially empty subdirectory 2026-08-07 23:40:04 +01:00
documentation full poll: read schedule and scenes in requests of their own 2026-09-30 17:57:43 +01:00
src/mobius Release 0.10.3 2026-10-11 16:23:22 +01:00
tests Log frames that fail to parse or fail their CRC at debug level 2026-10-11 16:23:08 +01:00
.gitignore Initial commit 2026-07-30 22:37:08 +01:00
CHANGELOG.md Release 0.10.3 2026-10-11 16:23:22 +01:00
LICENSE Initial commit 2026-07-30 22:37:08 +01:00
pyproject.toml Release 0.10.3 2026-10-11 16:23:22 +01:00
README.md add pump battery settings and operation mode 2026-09-22 13:03:17 +01:00

python-mobius

A Python client for the Bluetooth protocol of "Mobius" aquarium devices: EcoTech Marine (VorTech and Vectra pumps, Radion lights), AquaIllumination (Prime, Hydra, Orbit, Axis), Neptune Systems and NYOS. Built on bleak.

Not affiliated with or endorsed by any of these companies. This is an independent implementation of the protocol for interoperability with hardware you own, based on reverse engineering of the Mobius app and public community research. The protocol is documented in documentation/, in enough detail to implement it in another language.

Features

  • Discovery without connecting: model, serial number and tank (pan_id) from BLE advertisements.
  • Lights: channels, schedules, and the current intensity computed the way the app does it (schedule intensity, lunar phases, acclimation, hyperdrive).
  • Pumps: speed, flow, motor power and other sensor values; schedules and the active mode; battery backup settings and whether the pump runs on battery.
  • Schedules: read and write, as editable JSON or as the app's .mob template files; light schedule groups are handled.
  • Scenes: list, start (whole tank) and cancel.
  • Settings and commands: advanced features (Local Control, LED auto dim, fan speed, fan shutdown), lunar phases, schedule intensity, time sync, reboot, restart all.
  • One connection per tank: every other device of the tank is reached through it over the Thread mesh (RelayedMobiusDevice).
  • Batched polling: everything a poll needs in one request.
  • Diagnostics: attribute dumps, firmware and hardware information, Thread and clock diagnostics.
  • mobius-scan command line tool.

Supported devices

PrimitiveType Devices Support
VisualV1 Radion, Prime, Hydra Tested
VorTechV1, TurtleV1 VorTech, Axis Tested
PumpV1, VectraV1, AlpacaV1 Nero, Vectra, Orbit Same format as the tested pumps; not tested
CoffeeV1 NYOS Quantum Experimental: decoded with the pump format, not tested
DoseV1, HotSauceV1 Dosers, sensors Identity only

See known gaps for what isn't covered or tested.

Install

pip install python-mobius
# recommended: more reliable connections
pip install "python-mobius[retry]"

Python 3.9 or newer.

Quick start

import asyncio
from mobius import scan_for_mobius_devices_with_info, group_by_pan_id, MobiusDevice

async def main():
    found = await scan_for_mobius_devices_with_info()
    for pan_id, members in group_by_pan_id(found).items():
        print(f"tank {pan_id:#06x}:")
        for device, info in members:
            print(f"  {info.serial}  {info.model.name if info.model else info.model_raw}")

    device, info = found[0]
    async with MobiusDevice(device, serial=info.serial) as d:
        print(await d.get_device_summary())

asyncio.run(main())

Reaching the rest of the tank through one connection:

from mobius import RelayedMobiusDevice

async with MobiusDevice(serial="00000000000002") as gateway:
    for peer in await gateway.discover_mesh_peers_auto():
        print(await RelayedMobiusDevice(gateway, peer).get_device_info())

Command line:

mobius-scan                                  # list devices by tank
mobius-scan --by-serial SERIAL --dump-schedule
mobius-scan --by-serial SERIAL --relay-target OTHER_SERIAL
mobius-scan --help

The full API and every CLI option are described in documentation/16-python-library.md.

Development

git clone https://code.r3pek.org/r3pek/python-mobius
cd python-mobius
pip install -e ".[dev]"
pytest

Tests use captured packets and advertisements from real devices where possible.

ha-mobius is a Home Assistant integration built on this library.

License

GPLv2, see LICENSE.

Acknowledgments

The Reef2Reef thread "Controlling Mobius enabled VorTech pump using 0-10V and BLE" and the danmrossi/MobiusControl project, whose work this builds on. The reverse engineering and implementation were done with substantial help from Claude (Anthropic).