FP300 Zigbee firmware sends duplicate temperature/humidity reports

FP300 Zigbee firmware sends duplicate temperature/humidity reports

Firmware: 0.0.0_5841 (build 20260105)

When reporting temperature, the FP300 sends the msTemperatureMeasurement cluster value 2-3 times in rapid succession. The first values are correct (e.g. 2479 = 24.79°C), but the final value is rounded to whole degrees (e.g. 2400 = 24.00°C). Same issue with humidity.

This causes graphs to show a “comb” pattern as values flip between correct decimals and rounded integers.

Evidence from Zigbee2MQTT debug logs showing raw cluster values attached.

zigbee2mqtt | MODERN_DEBUG temperature model: PS-S04D cluster: msTemperatureMeasurement raw: 2460 scale: 100

zigbee2mqtt | MODERN_DEBUG temperature model: PS-S04D cluster: msTemperatureMeasurement raw: 2460 scale: 100

zigbee2mqtt | MODERN_DEBUG temperature model: PS-S04D cluster: msTemperatureMeasurement raw: 2400 scale: 100

zigbee2mqtt | MODERN_DEBUG humidity model: PS-S04D cluster: msRelativeHumidity raw: 6525 scale: 100

zigbee2mqtt | MODERN_DEBUG humidity model: PS-S04D cluster: msRelativeHumidity raw: 6500 scale: 100

anyone else noticed this or have seen a firmware fix?

6 Likes

example of incorrect payload (received 2800):
zigbee2mqtt | [2026-01-13 17:51:38] debug: zh:ember:ezsp: ezspIncomingMessageHandler: type=UNICAST apsFrame={“profileId”:260,“clusterId”:1026,“sourceEndpoint”:1,“destinationEndpoint”:1,“options”:256,“groupId”:0,“sequence”:23} packetInfo:{“senderShortId”:41645,“senderLongId”:“0x0000000000000000”,“bindingIndex”:255,“addressIndex”:255,“lastHopLqi”:136,“lastHopRssi”:-77,“lastHopTimestamp”:267507543} messageContents=18030a000029f00a
zigbee2mqtt | [2026-01-13 17:51:38] debug: zh:controller: Received payload: clusterID=1026, address=41645, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuality=136, frame={“header”:{“frameControl”:{“frameType”:0,“manufacturerSpecific”:false,“direction”:1,“disableDefaultResponse”:true,“reservedBits”:0},“transactionSequenceNumber”:3,“commandIdentifier”:10},“payload”:[{“attrId”:0,“dataType”:41,“attrData”:2800}],“command”:{“ID”:10,“name”:“report”,“parameters”:[{“name”:“attrId”,“type”:9},{“name”:“dataType”,“type”:8},{“name”:“attrData”,“type”:1000}]}}
zigbee2mqtt | [2026-01-13 17:51:38] debug: z2m: Received Zigbee message from ‘FP300 Living Room’, type ‘attributeReport’, cluster ‘msTemperatureMeasurement’, data ‘{“measuredValue”:2800}’ from endpoint 1 with groupID 0
zigbee2mqtt | [2026-01-13T06:51:38.044Z] MODERN_DEBUG numeric name: temperature model: PS-S04D cluster: msTemperatureMeasurement raw: 2800 scale: 100
zigbee2mqtt | [2026-01-13T06:51:38.044Z] MODERN_DEBUG numeric name: temperature model: PS-S04D final: 28

Example of correct payload (received 2814):
zigbee2mqtt | [2026-01-13 17:51:18] ^[[34mdebug^[[39m: zh:ember:ezsp: ezspIncomingMessageHandler: type=UNICAST apsFrame={“profileId”:260,“clusterId”:1026,“sourceEndpoint”:1,"destinationEndpointt
":1,“options”:256,“groupId”:0,“sequence”:18} packetInfo:{“senderShortId”:41645,“senderLongId”:“0x0000000000000000”,“bindingIndex”:255,“addressIndex”:255,“lastHopLqi”:140,“lastHopRssi”:-76,“lastHopTimestt
amp”:248353602} messageContents=187c0a000029fe0a
zigbee2mqtt | [2026-01-13 17:51:18] ^[[34mdebug^[[39m: zh:controller: Received payload: clusterID=1026, address=41645, groupID=0, endpoint=1, destinationEndpoint=1, wasBroadcast=false, linkQuall
ity=140, frame={“header”:{“frameControl”:{“frameType”:0,“manufacturerSpecific”:false,“direction”:1,“disableDefaultResponse”:true,“reservedBits”:0},“transactionSequenceNumber”:124,“commandIdentifier”:10}}
,“payload”:[{“attrId”:0,“dataType”:41,“attrData”:2814}],“command”:{“ID”:10,“name”:“report”,“parameters”:[{“name”:“attrId”,“type”:9},{“name”:“dataType”,“type”:8},{“name”:“attrData”,“type”:1000}]}}
zigbee2mqtt | [2026-01-13 17:51:18] ^[[34mdebug^[[39m: z2m: Received Zigbee message from ‘FP300 Living Room’, type ‘attributeReport’, cluster ‘msTemperatureMeasurement’, data ‘{“measuredValue”::
2814}’ from endpoint 1 with groupID 0
zigbee2mqtt | [2026-01-13T06:51:18.884Z] MODERN_DEBUG numeric name: temperature model: PS-S04D cluster: msTemperatureMeasurement raw: 2814 scale: 100
zigbee2mqtt | [2026-01-13T06:51:18.884Z] MODERN_DEBUG numeric name: temperature model: PS-S04D final: 28.14

3 Likes

FP300 Temperature/Humidity Flip-Flop Issue - Root Cause Found

TL;DR: The FP300 firmware sends two ZCL reports per sample cycle - a rounded placeholder value followed by the real measured value ~60-80 seconds later. This is proven at the raw radio frame level. it may send more then one duplicate at higher frequency depending on your configured device settings.

Evidence

Raw Ember/EZSP messageContents showing bytes directly from the radio:

19:24:11 messageContents=18290a000029f00a  → 0x0AF0 = 2800 (rounded)
19:25:57 messageContents=182b0a000029200b  → 0x0B20 = 2848 (real)

Full debug log showing the pattern over multiple 5-minute sample cycles:

08:34:21 - temperature raw: 2800 (28.00°C) ← rounded
08:35:42 - temperature raw: 2881 (28.81°C) ← real (+81s)

08:39:26 - temperature raw: 2800 (28.00°C) ← rounded (+224s)
08:40:35 - temperature raw: 2869 (28.69°C) ← real (+69s)

08:44:31 - temperature raw: 2800 (28.00°C) ← rounded (+236s)
08:45:28 - temperature raw: 2892 (28.92°C) ← real (+57s)

Same pattern for humidity - values ending in 00 are rounded placeholders.

Conclusion

  • Sampling interval is working correctly (~300s between real values)
  • ZCL reporting configuration has no effect on this behaviour
  • The device firmware itself transmits two values per sample cycle
  • This is NOT a Z2M or zigbee-herdsman bug - the rounded values are in the raw ZCL frames from the radio
4 Likes

Can you provide a more complete ZIGBEE message log?
I need to know:

  1. The full ZIGBEE message to pinpoint the issue.
  2. The sensor configuration details to reproduce the problem.
1 Like

Hi,

Please find below the complete Zigbee message log and sensor configuration as requested.

TIMELINE SUMMARY

[2026-01-15 20:16:46] RECV TEMP raw=18480a000029f809 value=2552 (25.52°C)
[2026-01-15 20:16:47] (+1s) RECV TEMP raw=184a0a000029f809 value=2552 (25.52°C)
[2026-01-15 20:16:47] (+0s) RECV HUMID raw=184b0a000021941a value=6804 (68.04%)
[2026-01-15 20:18:14] (+87s) RECV HUMID raw=184c0a000021901a value=6800 (68.0%) ** ROUNDED **
[2026-01-15 20:21:51] (+217s) RECV TEMP raw=18550a000029c409 value=2500 (25.0°C) ** ROUNDED **
[2026-01-15 20:26:42] (+291s) RECV TEMP raw=18580a000029f209 value=2546 (25.46°C)
[2026-01-15 20:26:42] (+0s) RECV HUMID raw=18590a000021461a value=6726 (67.26%)
[2026-01-15 20:26:56] (+14s) RECV TEMP raw=185a0a000029c409 value=2500 (25.0°C) ** ROUNDED **
[2026-01-15 20:28:19] (+83s) RECV HUMID raw=185b0a0000212c1a value=6700 (67.0%) ** ROUNDED **
[2026-01-15 20:36:37] (+498s) RECV TEMP raw=18620a000029f209 value=2546 (25.46°C)
[2026-01-15 20:36:37] (+0s) RECV TEMP raw=18640a000029f209 value=2546 (25.46°C)
[2026-01-15 20:36:37] (+0s) RECV HUMID raw=18650a0000213f1a value=6719 (67.19%)
[2026-01-15 20:38:24] (+107s) RECV HUMID raw=18660a0000212c1a value=6700 (67.0%) ** ROUNDED **

DEVICE INFORMATION:
IEEE Address: 0x54ef44100146f68e
Model: PS-S04D (FP300)
Model ID: lumi.sensor_occupy.agl8
Firmware: 0.0.0_5841
Date Code: 20260105
Manufacturer: Aqara

SENSOR CONFIGURATION (from device state):

Temperature & Humidity:
temp_and_humidity_sampling: “custom”
temp_and_humidity_sampling_period: 305
temp_reporting_mode: “threshold and interval”
temp_reporting_interval: 600
temp_reporting_threshold: 0.2
humidity_report_mode: “threshold and interval”
humidity_reporting_interval: 600
humidity_reporting_threshold: 2

Illuminance:
light_sampling: “custom”
light_sampling_period: 10
light_report_mode: “threshold and interval”
light_reporting_interval: 600
light_reporting_threshold: 10

Presence Detection:
presence_detection_options: “both”
motion_sensitivity: “medium”
ai_sensitivity_adaptive: “ON”
ai_interference_source_selfidentification: “OFF”
absence_delay_timer: 15
pir_detection_interval: 30
detection_range: 16777215 (all zones enabled)

Other:
led_disabled_night: false
schedule_start_time: “21:01”
schedule_end_time: “09:00”
battery: 100
voltage: 3112

CONFIGURED REPORTINGS (ZCL attribute reporting configuration):
msTemperatureMeasurement: min_interval=305s, max_interval=605s, reportable_change=20
msRelativeHumidity: min_interval=305s, max_interval=605s, reportable_change=200
msIlluminanceMeasurement: min_interval=10s, max_interval=600s, reportable_change=5


RAW ZIGBEE MESSAGES (Clusters 0x0402 & 0x0405)

[2026-01-15 20:16:46] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 72
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 156
lastHopRssi: -72
messageContents: 18480a000029f809
ZCL Decode:
Frame Control: 0x18 (cluster-specific, server-to-client, disable default response)
ZCL Sequence: 72
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2552
Decoded: 25.52°C

[2026-01-15 20:16:47] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 73
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 168
lastHopRssi: -69
messageContents: 184a0a000029f809
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 74
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2552
Decoded: 25.52°C

[2026-01-15 20:16:47] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1029 (0x0405 msRelativeHumidity)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 74
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 152
lastHopRssi: -73
messageContents: 184b0a000021941a
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 75
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x21 (UINT16)
Raw Value: 6804
Decoded: 68.04%

[2026-01-15 20:18:14] INCOMING MESSAGE ** ROUNDED VALUE **
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1029 (0x0405 msRelativeHumidity)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 75
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 152
lastHopRssi: -73
messageContents: 184c0a000021901a
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 76
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x21 (UINT16)
Raw Value: 6800 [ROUNDED - divisible by 100]
Decoded: 68.0%

[2026-01-15 20:21:51] INCOMING MESSAGE ** ROUNDED VALUE **
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 81
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 18550a000029c409
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 85
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2500 [ROUNDED - divisible by 100]
Decoded: 25.0°C

[2026-01-15 20:26:42] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 82
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 18580a000029f209
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 88
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2546
Decoded: 25.46°C

[2026-01-15 20:26:42] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1029 (0x0405 msRelativeHumidity)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 83
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 18590a000021461a
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 89
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x21 (UINT16)
Raw Value: 6726
Decoded: 67.26%

[2026-01-15 20:26:56] INCOMING MESSAGE ** ROUNDED VALUE **
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 84
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 185a0a000029c409
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 90
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2500 [ROUNDED - divisible by 100]
Decoded: 25.0°C

[2026-01-15 20:28:19] INCOMING MESSAGE ** ROUNDED VALUE **
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1029 (0x0405 msRelativeHumidity)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 85
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 185b0a0000212c1a
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 91
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x21 (UINT16)
Raw Value: 6700 [ROUNDED - divisible by 100]
Decoded: 67.0%

[2026-01-15 20:36:37] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 89
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 152
lastHopRssi: -73
messageContents: 18620a000029f209
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 98
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2546
Decoded: 25.46°C

[2026-01-15 20:36:37] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1026 (0x0402 msTemperatureMeasurement)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 90
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 18640a000029f209
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 100
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x29 (INT16S)
Raw Value: 2546
Decoded: 25.46°C

[2026-01-15 20:36:37] INCOMING MESSAGE
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1029 (0x0405 msRelativeHumidity)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 91
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 180
lastHopRssi: -66
messageContents: 18650a0000213f1a
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 101
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x21 (UINT16)
Raw Value: 6719
Decoded: 67.19%

[2026-01-15 20:38:24] INCOMING MESSAGE ** ROUNDED VALUE **
Type: UNICAST
APS Frame:
profileId: 260 (0x0104 Home Automation)
clusterId: 1029 (0x0405 msRelativeHumidity)
sourceEndpoint: 1
destinationEndpoint: 1
options: 256
groupId: 0
sequence: 92
Packet Info:
senderShortId: 41645 (0xA2AD)
lastHopLqi: 148
lastHopRssi: -74
messageContents: 18660a0000212c1a
ZCL Decode:
Frame Control: 0x18
ZCL Sequence: 102
Command: 0x0A (ReportAttributes)
Attribute ID: 0x0000 (MeasuredValue)
Data Type: 0x21 (UINT16)
Raw Value: 6700 [ROUNDED - divisible by 100]
Decoded: 67.0%


BUG ANALYSIS SUMMARY

TEMPERATURE (Cluster 0x0402):
Total reports: 7
Precise values (e.g., 2552 = 25.52°C): 5
Rounded values (e.g., 2500 = 25.00°C): 2

Value sequence:
2026-01-15 20:16:46: 2552 (25.52°C)
2026-01-15 20:16:47: 2552 (25.52°C)
2026-01-15 20:21:51: 2500 (25.0°C) ← ROUNDED (divisible by 100)
2026-01-15 20:26:42: 2546 (25.46°C)
2026-01-15 20:26:56: 2500 (25.0°C) ← ROUNDED (divisible by 100)
2026-01-15 20:36:37: 2546 (25.46°C)
2026-01-15 20:36:37: 2546 (25.46°C)

HUMIDITY (Cluster 0x0405):
Total reports: 6
Precise values (e.g., 6804 = 68.04%): 3
Rounded values (e.g., 6800 = 68.00%): 3

Value sequence:
2026-01-15 20:16:47: 6804 (68.04%)
2026-01-15 20:18:14: 6800 (68.0%) ← ROUNDED (divisible by 100)
2026-01-15 20:26:42: 6726 (67.26%)
2026-01-15 20:28:19: 6700 (67.0%) ← ROUNDED (divisible by 100)
2026-01-15 20:36:37: 6719 (67.19%)
2026-01-15 20:38:24: 6700 (67.0%) ← ROUNDED (divisible by 100)


OBSERVED BEHAVIOR:

The FP300 sensor sends both precise and rounded ZCL attribute reports
for temperature and humidity measurements.

Pattern observed with current configuration:

  • Precise value reported (e.g., 6719 = 67.19%)
  • Rounded value follows ~90-110 seconds later (e.g., 6700 = 67.00%)

The rounded values are truncated to whole degrees/percent (raw values
divisible by 100), causing a “comb pattern” in time-series graphs.

This occurs at the raw Zigbee ZCL level (see messageContents hex),
indicating the issue is in the sensor firmware, not the receiving stack.


CONFIGURATION NOTE:

The frequency and pattern of rounded values may vary depending on
sensor configuration. With different settings, patterns such as
“1 precise, 2 rounded” triplets could occur.

2 Likes

Update: Bug appears to be sampling-interval dependent

Further testing reveals the rounding bug correlates with the sampling interval setting:
┌───────────────────┬───────────────────────────┐
│ Sampling Interval │ Bug Present? │
├───────────────────┼───────────────────────────┤
│ 30s │ No │
├───────────────────┼───────────────────────────┤
│ 120s │ No (may need longer test) │
├───────────────────┼───────────────────────────┤
│ 240s │ Yes │
├───────────────────┼───────────────────────────┤
│ 305s │ Yes │
└───────────────────┴───────────────────────────┘
With 240s sampling, rounded values appear but not at consistent intervals - temperature rounds appears consistently - every 1 hour, humidity rounds appear ~20 minutes later, but timing varies.

This suggests a possible edge case in the firmware when sampling_interval approaches reporting_interval (600s) - perhaps insufficient samples collected before a reporting trigger.

@peterChengg, not sure if you work for Aqara: do you have any further thoughts on this?

1 Like

Using your identical configuration, I captured ZCL messages and found that the FP300 does not perform the division by 100 operation you described.
Could it be that the coordinator is performing a read operation on the sensor or similar?
Below are my ZCL messages, which clearly show no two data points are reported within a single reporting cycle (10 minutes).

Indeed, if such reporting behaviour existed, other FP300 units connected to Aqara would show identical patterns in their logs. To date, we have received no such feedback.

1 Like

Having the same issue.
Temperature value will be sent twice, one is precise value and one is rounded value.
But this doesn’t happen on humidity.

1 Like

I’m having the same issue, but only with 3 out of the 4 FP300 I bought. They have all identical settings, but one looks like this:


while the others show the comb-pattern: