Status: ❓ Needs testing
Credit: Reverse engineering by kristofferR
- TiMOTION AHF devices advertising names starting with
AHF - Adjustable bed/recliner controllers with up to 5 motor channels
| Analyzed | App | Package ID |
|---|---|---|
| ✅ | AHF Remote | com.timotion.ahf |
| Feature | Supported |
|---|---|
| Motor Control | ✅ (up to 5 motors) |
| Position Feedback | ❌ |
| Memory Presets | ❌ |
| Factory Presets | ❌ |
| Under-bed Lights | ✅ (toggle semantics) |
| Massage | ❌ |
Service UUID: 6e400001-b5a3-f393-e0a9-e50e24dcca9e (Nordic UART)
Write Characteristic: 6e400002-b5a3-f393-e0a9-e50e24dcca9e
Notify Characteristic: 6e400003-b5a3-f393-e0a9-e50e24dcca9e
Format: 11-byte bitmask packet, no TX checksum
Auto-detection uses:
- Device name prefix
AHF - Nordic UART service as confidence boost
Because Nordic UART is shared by many bed types, AHF detection is name-led.
All commands are 11 bytes:
[0xDD, 0xDD, 0xFF, group1, group1, group2, group2, 0x00, 0x00, 0x00, 0x00]
group1controls motors 1-3group2controls motors 4-5 and light/chair toggles
| Action | Bitmask | Packet Core |
|---|---|---|
| Motor 1 Up / Down | 0x01 / 0x02 |
... group1=0x01/0x02 ... |
| Motor 2 Up / Down | 0x04 / 0x08 |
... group1=0x04/0x08 ... |
| Motor 3 Up / Down | 0x10 / 0x20 |
... group1=0x10/0x20 ... |
| Action | Bitmask | Packet Core |
|---|---|---|
| Motor 4 Up / Down | 0x01 / 0x02 |
... group2=0x01/0x02 ... |
| Motor 5 Up / Down | 0x04 / 0x08 |
... group2=0x04/0x08 ... |
| Night Light Toggle | 0x10 |
... group2=0x10 ... |
| Under-bed Light Toggle | 0x20 |
... group2=0x20 ... |
| Chair Mode Toggle | 0x40 |
... group2=0x40 ... |
| Action | Packet |
|---|---|
| Stop All | DD DD FF 00 00 00 00 00 00 00 00 |
Stop is sent 3 times at 100ms intervals.
Current integration mapping:
back-> motor 1legs-> motor 2head-> motor 3feet-> motor 4pillow-> motor 5 (exposed whenmotor_count >= 4)
Status notifications are 15 bytes and must pass checksum validation:
Header byte: 0x9D
Checksum: sum(bytes[2..13]) & 0x7F == byte[14]
Parsed fields:
- Byte 2: feature lock mask
- Byte 3: light state (
0=off,1=white,2=green,3=red)
| Operation | Repeat Count | Delay | Notes |
|---|---|---|---|
| Motor movement (default) | 10 | 100ms | Bed-type pulse defaults |
| Light toggle | 2 | 100ms | Repeated toggle command |
| Stop | 3 | 100ms | Explicit stop burst |
- This protocol has no memory preset or flat/Zero-G commands.
- Light control is toggle-only; there are no discrete on/off packets.
- The app does not send an explicit initialization command and relies on notifications after connect.
disassembly/output/com.timotion.ahf/ANALYSIS.md