Skip to main content

lumalou (Python)

Fork notice. lumalou-gld09 is an independent fork of stramanu/lumalou by Emanuele Strazzullo, maintained at pavlikru/lumalou. It ships the changes proposed in stramanu/lumalou#2 (strict profile reads, typed schedule codecs and setters, authenticated device-key binding, injectable BLE client factory) until they are released upstream. The import package is still lumalou; do not install it alongside the upstream lumalou distribution. MIT licensed, original attribution preserved.

Where to report problems:

Local BLE control for the Fisher-Price Lumalou. Pure Python (async, bleak).

pip install lumalou-gld09

Library

import asyncio
from lumalou import LumalouClient, Color

async def main():
    devices = await LumalouClient.scan()
    async with LumalouClient(devices[0]["address"]) as luma:
        await luma.light_color(Color.RAINBOW)
        await luma.play(0)            # guided sleep playlist
        await luma.volume(5)
        print(await luma.request_state())

asyncio.run(main())

request_state() returns a fresh, strictly validated GLOBAL_STATE snapshot; it is not a complete device backup. For other blocks use request_named() or request_day_routine(), which return a ResponseEnvelope bound to the current session. The device pushes GLOBAL_STATE and other responses after commands and on physical changes; pass on_state / on_response to receive them. As in upstream, frames the client cannot use are ignored and never end the session. See the repository's client contract and schedule codec reference.

CLI

lumalou scan
lumalou light --color blue --brightness 7
lumalou sound --source ocean --volume 5
lumalou soother                 # --off to stop
lumalou time                    # sync clock
lumalou state                   # read a fresh GLOBAL_STATE snapshot
lumalou send 3c05               # decode raw app_data (opcode + args), send nothing
lumalou send --yes 3c05         # send it

Add -a <address> to target a device; otherwise it auto-scans.

lumalou send prints the decoded opcode and sends only with --yes. It always refuses the spec's unsafe opcodes 0x52 (SET_TIME_PRESCALER) and 0x34 (SEND_PAIRING_COMPLETE). Whole-device writes 0x01 (SET_GLOBAL_STATE) and 0x03 (SET_GLOBAL_ON), and any opcode that is not in the protocol spec, also need --dangerous. Prefer the typed subcommands; raw bytes can leave the device in an unexpected state.

Requires Python 3.10+, a Bluetooth LE adapter, and radio range of the device.

Development

pip install -e ".[dev]"
pytest        # runs the shared golden vectors (spec/vectors.json)

Disclaimer

Independent reverse-engineering project for interoperability. Not affiliated with or endorsed by Mattel or Fisher-Price. "Fisher-Price" and "Lumalou" are trademarks of their respective owners. Use at your own risk.

License

MIT. See the repository's LICENSE.

Release files for lumalou-gld09 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lumalou-gld09 0.3.1
File Size Uploaded
lumalou_gld09-0.3.1.tar.gz 52.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lumalou-gld09 0.3.1
File Interpreter ABI Platform
lumalou_gld09-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 87.9 kB

Release files / lumalou_gld09-0.3.1.tar.gz

Download URL lumalou_gld09-0.3.1.tar.gz
Size 52.1 kB
Tags Source
SHA-256 checksum
How to use checksums
aac1ac33d98aabcb768fa70e0baa2816be49c8eb749cf20eaddc153518153807
BLAKE2b-256 checksum
How to use checksums
ff29bdc54b689da0c00e8fb25dab170064f9ad478df2351fcd262838959534de
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / lumalou_gld09-0.3.1-py3-none-any.whl

Download URL lumalou_gld09-0.3.1-py3-none-any.whl
Size 35.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
838c36e260ba6e81f696e0cfadb810654ed9d5577fbd714c88f15395c4bb390b
BLAKE2b-256 checksum
How to use checksums
90466a916fab2e8faeb2162e89de7225eef25944c4e04760cd72e4f24bc553e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page