floriandotorg/um24cSource project:
src/App.jsThis note captures protocol knowledge inferred from the external floriandotorg/um24c project.
It applies to:
UM24CUM25CUM34CIt does not appear to cover:
TC-66CThe external project uses:
0xFFE00xFFE10xFFE10xF0 to trigger a new measurement snapshotThe connection flow matches the HM-10 style radio path already present in our project.
The external project maps:
0x0963 -> UM24C0x09c9 -> UM25C0x0d4c -> UM34CThis is useful as a concrete reference for the 16-bit model field found at payload offset 0.
The external project accumulates notification fragments until a total payload size of 130 bytes is available.
It then parses that 130-byte buffer as one UM snapshot and schedules the next 0xF0 request after about 500 ms.
Important note:
130-byte UM payload10 bytes long as a protocol guaranteeAll offsets below are byte offsets into the 130-byte UM payload.
| Offset | Size | External interpretation | Notes |
|---|---|---|---|
0 |
2 | modelId |
Used with the model map above |
2 |
2 | voltage |
UM25C: raw / 1000 V, UM24C and UM34C: raw / 100 V |
4 |
2 | amperage |
External project displays raw / 1000 A |
6 |
4 | wattage |
Displayed as raw / 1000 W |
10 |
2 | temperature |
External project uses only one temperature field here |
14 |
2 | group |
Selected data group |
16 + group * 8 |
4 | capacityAmperage |
Group-specific accumulated charge |
20 + group * 8 |
4 | capacityWattage |
Group-specific accumulated energy |
96 |
2 | negativeDataLineVoltage |
External project treats offset 96 as D- |
98 |
2 | positiveDataLineVoltage |
External project treats offset 98 as D+ |
100 |
2 | chargingMode |
Uses the charging mode map below |
112 |
4 | duration |
External project interprets as seconds and multiplies by 1000 for ms formatting |
122 |
4 | impedance |
Displayed as raw / 10 ohms |
The external project maps the charging mode field at offset 100 as:
1 -> QC22 -> QC33 -> APP2.4A4 -> APP2.1A5 -> APP1.0A6 -> APP0.5A7 -> DCP1.5A8 -> SAMSUNGThe external project confirms several parts of our existing UM parser:
0xF0130014112122It also exposes a few differences that should be treated as verification targets:
UM25COur code currently uses:
UM25C: raw / 10000UM34C: raw / 1000The external project uses:
1000 for the shared amperage fieldThis is a high-value point to verify against real captures or device behavior.
Our code currently divides group values by 1000 for:
The external project appears to present these values directly, without that division.
This may indicate:
Our code currently interprets:
96 as usbPlusVoltage98 as usbMinusVoltageThe external project interprets:
96 as negative data line voltage98 as positive data line voltageThis should be verified carefully.
Our UM parser also handles fields that the external project does not expose in its UI, including:
12These may still be correct, but the external project does not help validate them.
When new captures or device access become available, verify in this order:
UM25C current scalingThis external project is useful mainly because it provides:
It should be treated as a strong comparison source, but not as final protocol truth.