Website: heyjmo.com/iLE
A Pixel-native remote for Sleep Number 360 beds. iLE / FlexFit 3 beds are Fuzion generation — they do not speak the older i8 MCR Bluetooth protocol. This build signs into SleepIQ and drives the bed with the same Bamkey commands the official app uses, without their UI. Bluetooth scan still finds “Smart bed XXXXXX” for pairing.
That is the point: their app holds the BLE link exclusively, then flakes and needs a reset. This one connects on demand, reconnects itself, and never goes through their UI.
| Control | Left | Right | Notes |
|---|---|---|---|
| Sleep Number 5–100 | yes | yes | One side at a time while the pump runs |
| Favorite Sleep Number | yes | yes | Save / recall |
| Head angle 0–100 | yes | yes | Independent actuators |
| Foot angle 0–100 | shared | shared | One foot actuator on FlexFit |
| Presets | Flat, Zero G, Snore, Read, Watch TV, Favorite | per side | |
| Underbed light | shared | ||
| Foot warming | yes | yes | Shown if the base reports the feature |
| Stop pump / stop motion | yes | ||
| Occupancy, pause SleepIQ | optional cloud | Official app also uses the cloud for presence |
Scenes on the home screen: Sleep (both flat, light/warmers off), Movie (Watch TV + light), Zero G, Both flat.
Quick Settings tiles: Bed light, Bed flat, Zero G.
- Force-stop Sleep Number (Settings → Apps → Sleep Number → Force stop). Leave it stopped. It will steal Bluetooth if it is running.
- USB debugging on, cable in.
- From this folder:
.\Install-To-Pixel.ps1Or build only:
.\build.ps1Sideload i8-remote.apk. Grant Nearby devices (and notifications if asked).
- Open i8 Remote → Scan for bed → tap the BAM (name is usually the MAC).
- After the first connect it remembers the MAC and reconnects next launch.
- Official app is running. Force-stop it. This is the #1 cause.
- Stand next to the bed. BLE range is short through a mattress and steel base.
- Power-cycle the bed (unplug 60 seconds) only if the BAM is wedged — you should not need this routinely.
- Newer “Fuzion” firmware uses a different GATT service. The i8 360 / FlexFit 2 generation uses MCR (
ffffd1fd-…fee0), which this app speaks. If scan finds a device but handshake fails with “MCR service missing”, say so and we can add the Fuzion/Bamkey path.
Settings → SleepIQ cloud. Same email/password as the official app.
Use it for:
- In-bed / out-of-bed (not available over BLE on 0.4.x firmware)
- Pause SleepIQ tracking
- Fallback commands if you are away from Bluetooth
Firmness, presets, head/foot, and the light do not need this.
pip install -r python\requirements.txt
python python\sleepnumber_ble.py scan
python python\sleepnumber_ble.py --mac AA:BB:CC:DD:EE:FF status
python python\sleepnumber_ble.py --mac AA:BB:CC:DD:EE:FF sn left 40
python python\sleepnumber_ble.py --mac AA:BB:CC:DD:EE:FF preset right flat
python python\sleepnumber_ble.py --mac AA:BB:CC:DD:EE:FF light onWindows Bluetooth works with Bleak; stay close to the bed.
Sleep Number 360 beds have a BAM (BLE + Wi‑Fi) under the mattress. It exposes a GATT UART that carries a binary MCR protocol:
- Pump / Sleep Number (
cmd 0x02) - Foundation / FlexFit (
cmd 0x42) - Init handshake, then request/response. No push notifications.
Protocol details were reverse-engineered from SleepIQ Android 5.3.32 and live-tested on an i8 Flextop King / FlexFit 2 (firmware 0.4.1d9). See JonGilmore/sleepnumber-ble.
This project is not affiliated with Sleep Number.
Foundation position writes use the official 12-byte masked payload so unused actuators are left alone (0xFF). Do not send raw func=17 foundation frames with an empty payload — the base treats zeros as “go to 0”.