HUAWEI FreeLace Pro configuration protocol

This post describe FreeLace Pro specific configuration protocol notices.

Base protocol is the same as in HUAWEI FreeBuds 4i, so main information is available here. This page contains only differences from their.

Read commands difference

In all read commands, you should add empty parameters of fields which you want to get in response. For example, if you send Package(b"\x2b\x2a", []) (read ANC mode request), you’ll got a empty response. So you must place (2, b"") in parameters array to get values from device.

Commands that match with FreeBuds 4i

Except read request difference described above.

Commands that aren't available

Commands that have some differences

Fetch battery info

Request: To get current battery level, build and send command with ID 0108.

GET battery Length Value (Description)
Command ID 2 Constant HEX 0108 (1, 8)
Parameter 2 0 Empty string

Playground example: Package(b"\x01\x08", [(2, b"")]).send().

Response: After that, you’ll got package like this. And the same package device will send if battery state will change while socket is connected.

Battery state Length Value (Description)
Command ID 2 0108 (1, 8) — Response for request above;
0127 (1, 39) — Battery changed notification
Parameter 1 1 Current battery level, one byte integer
Parameter 2 1 Same as parameter 1
Parameter 3 1 Charging state for headphones, one byte. 0 — not charging, 1 — charging

Noise-cancellation

Request: If you want to request current ANC mode, send command ID 2B2A.

GET current mode Length Value (Description)
Command ID 2 Constant HEX 2B2A (43, 42)
Parameter 1 0 Empty string

Playground example: Package(b"\x2b\x2a", [(1, b"")]).send().

Response: When you send that command, you’ll got a incoming package like that:

Current ANC mode Length Value (Description)
Command ID 2 Constant HEX 2B2A (43, 42)
Parameter 1 2 Current ANC mode, see table bellow

Change detection: When ANC mode is changed with touch button on deivce, you’ll get this package. Yes, command ID is the same as in FreeBuds 4i in-ear state change event. Also, sometimes it drop’s a package with 2b2a command ID and structure like above (response), but not all times…

Current ANC mode Length Value (Description)
Command ID 2 Constant HEX 2B03 (43, 3)
Parameter 1 1 New ANC mode (0-2)

Write: To change ANC mode, build and send this package:

Change ANC mode Length Value (Description)
Command ID 2 Constant HEX 2B04 (43, 4)
Parameter 1 2 New mode, see bellow

Playground example: Package(b"\x2b\x04", [(1, NEW_MODE)]).send(), where NEW_MODE should two byte string, eg b"\x01\x02".

Value (HEX) Description
0000 No ANC
01ff Cancellation, kept level
0101 Cancellation, lowest
0100 Cancellation, normal
0102 Cancellation, ultra
0202 Awareness

Power button double tap action

Request: To fetch current option value, send package with command ID 0120 (command ID is the same as double tap in 4i).

GET double-tap Length Value (Description)
Command ID 2 Constant HEX 0120 (1, 32)
Parameter 1 0 Empty
Parameter 2 0 Empty

Playground: Package(b"\x01\x20", [(1, b""),(2, b"")]).send().

Response:

Double-tap opt value Length Value (Description)
Command ID 2 Constant HEX 0120 (1, 32)
Parameter 1 1 Signed integer, tap action for power button (check table bellow for value description)
Parameter 2 1 Same as parameter 1

Write: To change this option, send package with command ID 011f, and place new option value to parameters 1 AND 2

Set double-tap act Length Value (Description)
Command ID 2 Constant HEX 011f (1, 31)
Parameter 1 1 Signed integer, tap action for power button (check table bellow for value description)
Parameter 2 1 Same as parameter 1

Playground: Package(b"\x01\x1f", [(1, NEW_VALUE),(2, NEW_VALUE),]).send() where NEW_VALUE should be from table below.

Available options:

Value Description
-1 Do nothing
12 Switch device

Long tap action option

Request: To fetch current option value, send package with command ID 2B17.

GET long-tap Length Value (Description)
Command ID 2 Constant HEX 2B17 (43, 23)
Parameter 1 0 Empty
Parameter 2 0 Empty

Playground: Package(b"\x2b\x17", []).send().

Response:

Long-tap opt value Length Value (Description)
Command ID 2 Constant HEX 2B17 (43, 23)
Parameter 1 1 Signed integer, long tap action for left headphone (check table bellow for value description)
Parameter 2 1 Same as parameter 1
Parameter 3 5 ??

Write: Command ID is 2b16.

Set double-tap act Length Value (Description)
Command ID 2 Constant HEX 2b16 (43, 22)
Parameter 1 1 Signed integer, double tap action for left headphone (check table bellow for value description)
Parameter 2 1 Same as parameter 1

Playground: Package(b"\x2b\x16", [(1, NEW_VALUE),(2, NEW_VALUE),]).send() where NEW_VALUE should be from table below.

Available options:

Value Description
-1 Do nothing
3 Switch ANC Off/Cancellation
5 Switch through all ANC modes
6 Switch ANC Cancellation/Awareness
9 Switch ANC Off/Awareness
thumb_up 2 thumb_down 0 chat Comments (0) favorite Donate