From b209a1f71db33f613f7a8b0227a64216e0ef5b4c Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Tue, 4 Dec 2018 21:58:40 +0100 Subject: [PATCH] Created Beurer/Sanitas (markdown) --- Beurer-Sanitas.md | 176 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 Beurer-Sanitas.md diff --git a/Beurer-Sanitas.md b/Beurer-Sanitas.md new file mode 100644 index 0000000..2c25ae3 --- /dev/null +++ b/Beurer-Sanitas.md @@ -0,0 +1,176 @@ +Protocol description for Beurer/Sanitas scales ([code](https://github.com/oliexdev/openScale/blob/master/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothBeurerSanitas.java)). + +General +------- + +* ``: start byte (e7 or f7) +* ``: alternative start byte (eY or fY) +* ``: user ID (8 bytes, BE) +* ``: 3 characters (bytes) +* ``: unix timestamp (4 bytes) +* ``: 2 bytes, BE (unit g / 50) +* ``: 2 bytes, BE + +All protocol bytes are in hex. Writes are done to characteristic 0xffe1 on the service 0xffe0. This is also where notifications are received from. + + +Initialization +-------------- + +1. Enable notifications. +2. Write: ` 01` +3. Notification: ` 00 20` +4. Write: ` ` +5. Write: ` 4f ` +6. Notification: ` f0 4f ` + +`` can be given as all 0 (or other invalid user id) to query scale status only. + +* ``: battery level +* ``: weight threshold (unit g / 100) +* ``: fat threshold +* ``: 1 = kg, 2 = lb, 4 = st +* `, , `: user (reference weight, measurement) exists +* ``: scale version + + +### Configure threshold + +1. Write: ` 4e ` +2. Notification: ` f0 4e 00` + +Thresholds in original app: +* 0x28 0xdc (4.0 22.0) +* 0x14 0xdc (2.0 22.0) +* 0x0a 0x14 (1.0 2.0) + +After scale reset: 0x14 0x14 (2.0 2.0) + + +### Set unit + +1. Write: ` 4d ` +2. Notification: ` f0 4d 00` + + +### Force disconnect + +1. Write: ` 2` + + +Users +----- + +### Request user list + +1. Write: ` 33` +2. Notification: ` f0 33 00 ` +3. Notification: ` 34 ` +4. Write: ` f1 34 ` +5. Goto 3 if ` != ` + + +### Get user info + +1. Write: ` 36 ` +2. Notification: ` f0 36 00 ` + +* ``: January == 0 +* ``: sex (female = 0x00, male = 0x80) | activity level 1 - 5 + + +### Add new user + +1. Write: ` 31 ` +2. Notification: ` f0 31 00` +3. Perform initial measurement. + +Status in notification: 00 (ok), 01 (full), 02 (uid taken), 03 (name used) + +### Update user + +1. Write: ` 35 ... (same as when adding user)` +2. Notification: ` f0 35 00` + + +### Delete user + +1. Write: ` 32 ` +2. Notification: ` f0 32 00` + + +Measurements +------------ + +### Perform measurement + +1. Write: ` 40 ` +2. Notification: ` f0 40 00` +3. Notification: ` 58 ` +4. Write: ` f1 58 ` +5. Goto 3 if ` != 0` +6. Notification: ` 59 01 ` +7. Write: ` f1 59 ` +8. Notification: ` 59 <11 bytes data>` +9. Write: ` f1 59 ` +10. Goto 8 if ` != ` + +* Step 1 selects the user with the given ID. +* ``: 0 for stable measurement, 1 otherwise +* All `` from step 8 is joined and parsed as a measurement. + + +### Request saved measurements + +1. Write: ` 41 ` +2. Notification: ` f0 41 00` +3. Notification: ` 42 <11 bytes data>` +4. Write: ` f1 42 ` +5. Goto 3 if ` != ` + +* All `` from step 3 is joined and parsed as ` / 2` measurement(s). + + +### Delete saved measurements + +1. Write: ` 43 ` +2. Notification: ` f0 43 00` + + +### Measurement + +22 bytes of data: + +` + ` + + +Unknown measurements +-------------------- + +### Request unknown measurements + +1. Write: ` 46` +2. Notification: ` f0 46 00` +3. Notification: ` 47 ` +4. Write: ` f1 47 ` +5. Goto 3 if ` != ` + +* ``: index in memory (stays constant after removal) + + +### Assign unknown measurement + +1. Write: ` 4b ` +2. Notification: ` f0 4b 00` +3. Notification: ` 4c <11 bytes data>` +4. Write: ` f1 4c ` +5. Goto 3 if ` != ` + +* All `` from step 3 is joined and parsed as a measurement. + + +### Delete unknown measurement + +1. Write: ` 49 ` +2. Notification: ` f0 49 00`