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
.mobtemplate 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-scancommand 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.
Related
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).
Metadata
Release files for python-mobius 0.10.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| python_mobius-0.10.2.tar.gz | 246.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| python_mobius-0.10.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 356.7 kB
Release files / python_mobius-0.10.2.tar.gz
| Download URL | python_mobius-0.10.2.tar.gz |
|---|---|
| Size | 246.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9e235fa49565b9e95f621c2fe5081646cac29384ec1b1d926d91918ea6481221
|
|
BLAKE2b-256 checksum How to use checksums |
a209bcb610ceed8b5385b4ac673efb684b1204f31cbc073e83f5fb13c96b1850
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / python_mobius-0.10.2-py3-none-any.whl
| Download URL | python_mobius-0.10.2-py3-none-any.whl |
|---|---|
| Size | 109.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
02337eaf5d690da0da2c432d084b61fb90cdf054bf5a09d2849b22cf18b42391
|
|
BLAKE2b-256 checksum How to use checksums |
066443fef5e80f216ed51461692b2523fa137a0e511dc43c921e3d3438ad479a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|