Skip to main content

python-mobius

A reverse-engineered Python client for the BLE protocol used by "Mobius Ready" aquarium equipment — EcoTech Marine (VorTech pumps, Radion lights), AquaIllumination (Prime, Hydra), Neptune Systems, and NYOS.

Built on bleak for cross-platform BLE.

Not affiliated with or endorsed by any of these companies. This is an independent reimplementation of the wire protocol for interoperability with hardware you own, derived from public community reverse-engineering work and analysis of the publicly-distributed Mobius Android app. See documentation/ for the full protocol writeup, with every field marked as either directly confirmed or explicitly flagged as inferred/experimental.

Status

Alpha. Core protocol (framing, CRC, attribute get/set, scenes), pump telemetry, pump schedules, light schedules, and device discovery/grouping are implemented and verified against real hardware (two VorTech MP40QD pumps, two Radion XR15 G6 Pro lights). See documentation/10-known-gaps-and-open-questions.md for what isn't covered yet (dosers, environmental sensors, Thread/CoAP device relay).

Install

pip install python-mobius
# or, for more robust BLE connection retries (recommended):
pip install python-mobius[retry]

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"  {device.address}  {info.model.name}  {info.serial}")

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

asyncio.run(main())

Or from the command line:

mobius-scan --adapter hci0

What you can do

  • Discover devices and group them by tank/mesh (pan_id), reading model/serial straight from BLE advertisements — no connection required.
  • Read pump telemetry: current speed, estimated flow (GPH), operation state, error state.
  • Read pump schedules: which mode (constant speed, tidal swell, pulse, etc.) is active at any given time, exactly as programmed.
  • Read light schedules: per-channel intensity at any given time, replicating the app's own client-side interpolation (there's no "current intensity" attribute — lights only expose the programmed curve).
  • Control scenes: start feed mode, resume the normal schedule, or any other configured scene.
  • Low-level protocol access (build_frame, get_attribute, set_attribute, ...) if you want to go beyond what's wrapped in MobiusDevice.

Supported device types

PrimitiveType Support Notes
VisualV1 (Radion, Prime, Hydra, etc.) ✅ Verified Lights
VorTechV1, PumpV1, VectraV1, AlpacaV1, TurtleV1 ✅ Verified Pumps
CoffeeV1 (NYOS Quantum) ⚠️ Experimental Same wire structure as pumps per the protocol, untested against real hardware
DoseV1, HotSauceV1 ❌ Unsupported Different primitive format; identity info only

MobiusDevice.get_device_summary() always tells you which tier applies via its "support" field — see documentation/04-device-identity.md.

Development

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

Tests are validated against real captured packets and real device manufacturer-data/serials where possible — see tests/.

License

GPLv2 — see LICENSE.

Acknowledgments

The protocol reverse-engineering and implementation in this library were carried out with substantial assistance from Claude (Anthropic), used to analyze a decompiled copy of the official Mobius Android app (JADX) and cross-reference it against prior public community research (notably the Reef2Reef "Controlling Mobius enabled VorTech pump using 0-10V and BLE" thread and the danmrossi/MobiusControl project), then to design, write, and test the Python implementation itself. See documentation/00-overview.md for the full methodology and confirmation-strength notes on every protocol detail.

Download files

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

Source Distribution

python_mobius-0.2.0.tar.gz (133.5 kB view details)

Uploaded Source

Built Distribution

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

python_mobius-0.2.0-py3-none-any.whl (73.5 kB view details)

Uploaded Python 3

File details

Details for the file python_mobius-0.2.0.tar.gz.

File metadata

  • Download URL: python_mobius-0.2.0.tar.gz
  • Upload date:
  • Size: 133.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for python_mobius-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8ffaabb21480c506f0d37ee7359014adfb9cab3a64a4b5caa88f9db3890f376a
MD5 742ad2e0c6e43b646a3f487af18d110e
BLAKE2b-256 1586f980d1a9271147bd4a21f93b8fc2bee7a6a3c81eba7e0f3bb32efb98abaf

See more details on using hashes here.

File details

Details for the file python_mobius-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: python_mobius-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 73.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for python_mobius-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 df4e9c8c0fe4f79fae37a5721d8ad139f9dd8d0803433da52e893dc76016af80
MD5 ff855143b2bc06eefbcd7f0b546fff4d
BLAKE2b-256 f273bb7747f36db6a14d817661ae05250927843481b2333be18c489ccc9306c8

See more details on using hashes here.

Supported by

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