smartblinds-ble — local control for MySmartBlinds / Tilt smart blinds (no hub, no cloud)
Keep your MySmartBlinds / Tilt motorized blinds working even after the cloud
shuts down. smartblinds-ble controls the shade motors locally over Bluetooth
LE — no proprietary hub, no cloud account, no phone app required — and is
built to run through Home Assistant and cheap ESP32 / ESPHome Bluetooth
Proxies.
Status: pre-alpha / bring-up. The BLE protocol was reverse-engineered in 2018 and is not yet re-verified on current firmware — see
docs/ROADMAP.md(Milestone 0 gates everything). The cloud key-export tool below works today, independent of that.Unofficial project. Not affiliated with, authorized by, or endorsed by MySmartBlinds, Tilt, or SmarterHome. Use at your own risk; may void your warranty.
Is this you?
If you're searching for any of the following, you're in the right place:
- "Is MySmartBlinds / Tilt shutting down / discontinued / out of business?" —
the signs point that way (
tiltsmarthome.comnow redirects to a wind-down page, parts are unavailable, support has gone quiet). - "MySmartBlinds app not working / won't connect / no one answers support."
- "How do I control MySmartBlinds without the hub / without the cloud / without the app?"
- "MySmartBlinds / Tilt Home Assistant integration" — a local one, not the old laggy cloud bridge.
- "Will my smart blinds keep working if the servers go offline?"
- "MySmartBlinds ESP32 / ESPHome / Bluetooth local control."
⏳ Rescue your keys now (do this before the cloud goes dark)
Each motor needs a small BLE key to accept commands. While the vendor cloud is still online, it will hand back the real key for every shade on your account after a single login. Once the cloud shuts down, keys are only recoverable the hard way (brute-force or Bluetooth sniffing). This step needs no extra hardware:
# Not on PyPI yet — install from GitHub. Use the maintained docBliny fork of the
# cloud client (PyPI's build is stale and no longer logs in):
pip install "git+https://github.com/docBliny/smartblinds-client.git" \
"git+https://github.com/benbalter/smartblinds-ble.git"
smartblinds-import-cloud # cloud email/password -> smartblinds-keys.json
If pip errors with
externally-managed-environment, run it in a venv:python3 -m venv .venv && . .venv/bin/activatethen re-run the install. Once this is published to PyPI, the above collapses topip install "smartblinds-ble[cloud]".
The output holds {name, mac, key} per shade and is your offline insurance if
the cloud disappears. Keep it safe — it contains secrets (gitignored by default).
Legacy app only. This exports from the legacy MySmartBlinds cloud. If you set your shades up in the newer Tilt app, they live in a separate backend and won't appear here (login works but returns zero blinds). In that case, skip the cloud and read the key directly over BLE with
smartblinds-find-key.
The importer logs into your own account to retrieve your own devices' keys, for interoperability with hardware you own. Use your own credentials, at your own risk.
Why this exists
The motors are ordinary Bluetooth LE devices. The only reason the vendor's hub exists is to bridge Wi-Fi → cloud → Bluetooth. With the company winding down, that cloud is a single point of failure that could take your blinds offline. This project talks to the motors directly and locally, so:
- No hub, no cloud, no account — everything stays on your LAN.
- Control routes through inexpensive ESP32 ESPHome Bluetooth Proxies for whole-home coverage, or any Home Assistant Bluetooth adapter.
- Your MySmartBlinds keep working after the cloud shuts down.
How it works
Two layers:
smartblinds-ble(this repo) — a small async,bleak-based Python library for talking to the motors over BLE.ha-smartblinds-ble(in progress) — a HACS-installable Home Assistant integration exposing each shade as an optimistic tiltcover, working through ESPHome Bluetooth Proxies.
Two things everyone gets stuck on
- The per-motor key. Best: export it from the cloud with
smartblinds-import-cloud(above) while you still can. Offline fallback: brute-force the first byte withsmartblinds-find-key, or sniff the app once. Seedocs/PROTOCOL.md. - No state feedback. The motors are open-loop (reads return
0xFF). Position is tracked optimistically; changes made from the app or a physical wand are invisible.
Quick start (bring-up, local adapter)
pip install -e ".[dev]"
smartblinds-find-key # scan + brute-force keys for nearby motors
pytest # protocol/encoding unit tests (mocked BLE)
import asyncio
from smartblinds_ble import SmartBlind, discover
async def main():
(device,) = await discover()
blind = SmartBlind(device, key="2a") # from the cloud export or find-key
await blind.set_tilt_percent(50) # flat-ish
asyncio.run(main())
FAQ
Is MySmartBlinds / Tilt going out of business?
There's no formal shutdown announcement, but the signals are strong: the operator
(SmarterHome, a Hall Labs subsidiary) is winding down, tiltsmarthome.com
permanently redirects to that wind-down page, replacement parts have been
unavailable for a while, and support has gone quiet. The app still received updates
into 2025, so the cloud is alive for now — which is exactly why you should
export your keys today.
Will my blinds stop working if the cloud/app shuts down?
The blinds themselves are local Bluetooth devices, so they don't need the cloud — but the official app and hub depend on it, and you need each motor's key to control it locally. That's what this project (and the key-export tool) is for: keeping your MySmartBlinds working after the cloud goes offline.
How do I control MySmartBlinds without the hub or the app?
Get each motor's key (cloud export or brute-force), then send BLE commands with this library — directly from a computer/Raspberry Pi, or through Home Assistant + an ESP32 Bluetooth Proxy.
Does this work with Home Assistant?
That's the goal — a local HACS integration (ha-smartblinds-ble) exposing each
shade as a tilt cover, no cloud bridge. It's in progress and gated on hardware
validation (see the roadmap).
Do I need an ESP32 / ESPHome Bluetooth Proxy?
Only for range. Any Home Assistant Bluetooth adapter works if it's near the shades; ESP32 ESPHome Bluetooth Proxies (a few dollars each) extend coverage across a house.
Does it work with the Tilt app still installed?
Avoid using both at once — the app and this library can fight over position, since the motors don't report their true state.
Credits
dnschneid/pysmartblinds— the original reverse engineering (Apache-2.0); this is a modern async port. SeeNOTICE.ianlevesque/smartblinds-clientanddocBliny/ha-mysmartblinds— the cloud client and (cloud-based) HA integration this borrows the key-export idea from.LennP/ha-motionblinds_ble— the template for the Home Assistant integration layer.
Keywords
MySmartBlinds · Tilt · Tilt SmartHome · SmarterHome · Hall Labs · smart blinds · motorized blinds · local control · no cloud · no hub · cloud shutdown · discontinued · Home Assistant · HACS · Bluetooth · BLE · bleak · ESP32 · ESPHome · Bluetooth Proxy · retire the hub · keep working after cloud shutdown
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file smartblinds_ble-0.1.1.tar.gz.
File metadata
- Download URL: smartblinds_ble-0.1.1.tar.gz
- Upload date:
- Size: 45.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b0484339ce1668fc12a0267f27c52a61f7688a34740ec233ff48c3a196ffc7d
|
|
| MD5 |
4e9841202439c6990b0695653cab4510
|
|
| BLAKE2b-256 |
a40fbb4d44ea0b0579e3dbef6f791e05dcb89a59c4c93238a49755b29c970c72
|
Provenance
The following attestation bundles were made for smartblinds_ble-0.1.1.tar.gz:
Publisher:
release.yml on benbalter/smartblinds-ble
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
smartblinds_ble-0.1.1.tar.gz -
Subject digest:
9b0484339ce1668fc12a0267f27c52a61f7688a34740ec233ff48c3a196ffc7d - Sigstore transparency entry: 2799546996
- Sigstore integration time:
-
Permalink:
benbalter/smartblinds-ble@9157d23724e602574741cd5ada0dd9c9e8750383 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/benbalter
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9157d23724e602574741cd5ada0dd9c9e8750383 -
Trigger Event:
push
-
Statement type:
File details
Details for the file smartblinds_ble-0.1.1-py3-none-any.whl.
File metadata
- Download URL: smartblinds_ble-0.1.1-py3-none-any.whl
- Upload date:
- Size: 31.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f07b95042f9d4e240de72890d51bf0ecd7283da8cac6eb083c5ac0433733759
|
|
| MD5 |
c69b2e068ec10186a7a48e4aa82e6c7e
|
|
| BLAKE2b-256 |
dc7ef58e562147f2662d2f9484c800a301f5d4490d2c4dfc2d38e7cd86a76cf2
|
Provenance
The following attestation bundles were made for smartblinds_ble-0.1.1-py3-none-any.whl:
Publisher:
release.yml on benbalter/smartblinds-ble
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
smartblinds_ble-0.1.1-py3-none-any.whl -
Subject digest:
1f07b95042f9d4e240de72890d51bf0ecd7283da8cac6eb083c5ac0433733759 - Sigstore transparency entry: 2799547010
- Sigstore integration time:
-
Permalink:
benbalter/smartblinds-ble@9157d23724e602574741cd5ada0dd9c9e8750383 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/benbalter
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9157d23724e602574741cd5ada0dd9c9e8750383 -
Trigger Event:
push
-
Statement type: