I’m adding a bit of technical info of what has been learnt from this device to document the issue:
The Aqara W100 uses a proprietary Lumi cluster (cluster ID: 64704 or 0xFCD0, called manuSpecificLumi) to communicate specific data that isn’t covered by standard Zigbee clusters. All thermostat mode logic and the PMTSD protocol are handled through this cluster.
The key attribute: 65522 (0xFFF2)
All thermostat mode communication goes through attribute 65522 (0xFFF2) of the manuSpecificLumi cluster. This attribute carries binary data (type 65 or 0x41) containing frames encoded according to various Aqara protocols.
1. Thermostat Mode Activation/Deactivation
Activation (thermostat_mode = ON)
Frame sent to attribute 65522:
aa 71 32 44 [random] [random] 02 41 2f 68 91 [random] [random] 18
[device_MAC_8_bytes] 00 00 [hub_MAC_6_bytes] 08 00 08 44 15 0a 01 09
e7 a9 ba e8 b0 83 e5 8a 9f 00 00 00 00 00 01 01 2a 40
Key components:
- Header:
aa 71 32 44 - Protocol identifier
- Device MAC: 8 bytes representing the W100’s IEEE address
- Hub MAC: 6 bytes (hardcoded:
54ef4480711a)
- Signature:
08 00 08 44 - Marks the start of the encrypted payload
- Encrypted payload: Contains Chinese characters and activation commands
Effect:
- The middle line on the display becomes visible
- Buttons send encrypted payloads instead of action events
- The device enters “thermostat control” mode
Deactivation (thermostat_mode = OFF)
Frame sent to attribute 65522:
aa 71 1c 44 [random] [checksum] 04 41 19 68 91 [random] [random] 18
[device_MAC_8_bytes] [padding_to_34_bytes]
Key components:
- Different header:
aa 71 1c 44 - Deactivation protocol
- Shorter frame: Only 34 bytes total (vs ~60 for activation)
- Device MAC: Required to target the specific device
Effect:
- Middle line disappears from the display
- Buttons return to sending standard action events (single, double, hold)
- Exits thermostat mode
2. PMTSD Protocol - Thermostat Control Communication
PMTSD stands for the 5 parameters controlled: Power, Mode, Temperature, Speed, D(unknown/unused)
PMTSD Request from Device (08 00 08 44 sequence)
The W100 periodically sends a request via attribute 65522:
[variable_header] 08 00 08 44
The sequence 08 00 08 44 is the signature that indicates: “I’m requesting the current PMTSD state”
Converter response: When this signature is detected, Z2M must respond with the current PMTSD state.
PMTSD Frame Format (Z2M → W100)
When Z2M needs to send thermostat settings to the W100:
Frame structure sent to attribute 65522:
aa 71 1f 44 [counter] [checksum] 05 41 1c 00 00
54 ef 44 80 71 1a 08 00 08 44 [length] [ASCII_PMTSD_string]
Key components:
- Header:
aa 71 1f 44 - PMTSD protocol identifier
- Counter: Random byte (position 4)
- Checksum: Sum of all bytes & 0xFF (position 5)
- Hub signature:
54 ef 44 80 71 1a - Hardcoded hub identifier
- PMTSD marker:
08 00 08 44 - Indicates PMTSD payload follows
- Length: Single byte indicating the ASCII string length
- ASCII payload: Example:
P0_M1_T22_S0_D0
PMTSD Parameters Explained:
| Parameter |
Name |
Values |
Description |
| P |
Power |
0 = ON, 1 = OFF |
Controls whether the HVAC system is on or off |
| M |
Mode |
0 = cool, 1 = heat, 2 = auto |
HVAC operating mode |
| T |
Temperature |
5-30 (configurable range) |
Target temperature setpoint in °C |
| S |
Speed/Fan |
0 = auto, 1 = low, 2 = medium, 3 = high |
Fan speed setting |
| D |
Unused |
0 or 1 |
Unknown parameter (possibly wind direction or another feature) |
Example: P0_M1_T22_S0_D0 means:
- Power ON
- Heat mode
- Target temperature 22°C
- Fan speed Auto
- D parameter = 0
PMTSD Response from Device (W100 → Z2M)
When the user manually changes settings on the W100 display, it sends the new values:
[variable_header] 08 44 [length] [ASCII_PMTSD_string]
The Big issue is the inconsistencie of the device screen allowing to set 0.5° precision as temperature setpoint. But the protocol implemented only handle plain integer values.
A simple firmware update could solve this easily.