A technical reference for decoding Samsung EHS heat pump telemetry from the SmartThings ehsCycleData capability.
Samsung EHS heat pumps expose operational telemetry through the samsungce.ehsCycleData SmartThings capability. This contains hex-encoded binary data for both outdoor and indoor units, encoding temperatures, flow rates, compressor frequency, and pump speeds.
The byte positions map to Samsung NASA (Network Air-conditioning Smart Application) protocol registers — the same registers accessible via MIM-B19N Modbus modules or ESPHome HVAC bus integrations, but encoded into hex blobs by the SmartThings cloud.
Samsung EHS heat pumps report telemetry through two SmartThings components: an outdoor unit (compressor, ambient conditions) and an indoor unit (water circuit, pump, flow). Each component's cycle data is a hex-encoded binary blob that varies in length depending on the device model.
Different device models produce different data lengths with subtly different byte layouts. Dwellsee uses a binaryId-keyed architecture to select the correct byte layout for each device:
binaryId (firmware identifier) is recognised, use its registered byte layoutEach Samsung EHS heat pump reports a binaryId that identifies its firmware and platform. This determines the indoor data length and byte layout.
| binaryId | Indoor | Outdoor | Component | Flow Rate |
|---|---|---|---|---|
| SAC_EHS_MONO | 24B | 18B | INDOOR | byte[7] direct (integer LPM) |
| SAC_EHS_SPLIT | 24B | 18B | INDOOR | byte[7] direct (integer LPM) |
| SAC_DVM_HE | 24B | 18B | INDOOR | byte[7] direct (integer LPM) |
| TP1X_DA_AC_EHS_01001_0000 | 31B | 28B | INDOOR1 | byte[7] / 10 (decimal LPM) |
| S905D3_SAC_EHS_24 | 36B | 28B | INDOOR1 | Indoor unreliable — use outdoor fallback |
Samsung EHS heat pumps have a temperatureReference setting that controls what the indoor temperature sensor measures:
Water reference (default)
The SmartThings temperatureMeasurement.temperature value on the INDOOR component reports the water flow temperature. Indoor cycle data byte[4] is 0x05 (a null sentinel).
Air reference
The INDOOR temperatureMeasurement.temperature reports the room air temperature instead. The water flow temperature is available at indoor cycle data byte[4] − 55 (°C).
The temperatureReference setting is reported by the samsungce.ehsTemperatureReference capability. To correctly decode flow temperature for all devices, check this value and use byte[4] only when the reference is “air” and byte[4] is not 0x05.
Outdoor data length varies by device (18 or 28 bytes). Both formats share the same byte positions for the first 18 bytes.
Position: 0 1 2 3 4 5 6 7 8
^^^^^ ^^^^^ ?? ^^ ^^
| | | | |
| | | | outdoor temp (byte − 55)
| | | discharge temp (byte − 55)
| | constant 0x5E (purpose unknown)
| target compressor freq (int16 BE, Hz)
current compressor freq (int16 BE, Hz)| Position | Field | Formula | Status |
|---|---|---|---|
| Bytes 0–1 | Compressor frequency | int16 BE (Hz) | Cross-referenced |
| Bytes 2–3 | Target compressor frequency | int16 BE (Hz) | Cross-referenced |
| Byte 5 | Discharge gas temperature | byte − 55 (°C) | Cross-referenced |
| Byte 8 | Outdoor temperature | byte − 55 (°C) | Validated |
18-byte example
00 1E 00 1E 5E 75 3B FF 3E 02 00 F1 01 C2 00 01 00 0028-byte example
00 32 00 32 5E 59 3A 3A 3C 02 02 65 01 F4 00 02 00 00 00 27 00 58 32 5F 00 00 00 00Used by INDOOR components (SAC_EHS_MONO, SAC_EHS_SPLIT, SAC_DVM_HE). Flow rate is encoded as an integer.
Position: 0 1 2 3 4 5 6 7 8 9
^^ ^^ ^^ ^^ ^^ ^^
| | | | | |
| | | | | pump speed (byte = %)
| | | | flow rate (LPM, integer)
| | | flow temp (byte − 55, air-ref only)
| | return water temp (byte − 55)
| evaporator OUT temp (byte − 55)
evaporator IN temp (byte − 55)| Position | Field | Formula | Status |
|---|---|---|---|
| Byte 0 | Evaporator inlet temperature | byte − 55 (°C) | Cross-referenced |
| Byte 1 | Evaporator outlet temperature | byte − 55 (°C) | Cross-referenced |
| Byte 2 | Return water temperature | byte − 55 (°C) | Cross-referenced |
| Byte 4 | Flow temperature (air-reference only) | byte − 55 (°C) | Validated |
| Byte 7 | Flow rate | byte directly (LPM) | Validated |
| Byte 8 | Inverter pump speed | byte directly (%) | Validated |
24-byte example (water-reference device)
56 58 54 05 56 05 00 22 42 00 00 00 00 00 00 00 00 01 00 00 00 0B 14 21Used by INDOOR1 components on the TP1X platform (TP1X_DA_AC_EHS_01001_0000). Flow rate has decimal precision.
Position: 0 1 2 3 4 5 6 7 8 9
^^ ^^ ^^ ^^
| | | |
| | | pump speed (byte = %)
| | flow rate (byte / 10 = LPM)
| flow temp (byte − 55)
return water temp (byte − 55)| Position | Field | Formula | Status |
|---|---|---|---|
| Byte 2 | Return water temperature | byte − 55 (°C) | Cross-referenced |
| Byte 3 | Flow temperature | byte − 55 (°C) | Validated |
| Byte 7 | Flow rate | byte / 10 (LPM) | Validated |
| Byte 8 | Inverter pump speed | byte directly (%) | Validated |
31-byte example
4E 05 4E 50 05 05 00 D2 64 00 00 00 00 00 00 00 00 01 00 00 00 01 B3 B3 00 00 00 6F 05 05 4BdhwTemp value.Used by INDOOR1 components on the S905D3 platform (S905D3_SAC_EHS_24, e.g. Samsung E50AJTAE1). Shares the same prefix layout as the 31-byte format with 5 additional trailing bytes.
| Position | Field | Formula | Status |
|---|---|---|---|
| Byte 2 | Return water temperature | byte − 55 (°C) | Cross-referenced |
| Byte 3 | Flow temperature | byte − 55 (°C) | Cross-referenced |
| Byte 7 | Flow rate | — | Unreliable |
| Byte 8 | Inverter pump speed | byte directly (%) | Cross-referenced |
Summary of all formulas used to convert raw bytes into meaningful values.
| Formula | Result | Used for |
|---|---|---|
| byte − 55 | Temperature (°C) | Outdoor temp, discharge temp, return water temp, flow temp, evaporator temps |
| byte / 10 | Flow rate (LPM) | 31-byte and 36-byte indoor formats (decimal precision) |
| byte directly | Flow rate (LPM) | 24-byte indoor format (integer precision) |
| byte directly | Pump speed (%) | Inverter pump speed, all indoor formats (byte 8) |
| int16 BE | Frequency (Hz) | Compressor frequency (outdoor bytes 0–1) |
| int16 BE / 10 | Flow rate (LPM) | Outdoor bytes 20–21 (unreliable — prefer indoor source) |
The cycle data bytes correspond to Samsung NASA protocol registers. This mapping helps cross-reference hex decoding against the well-documented Modbus register tables used by MIM-B19N modules and ESPHome integrations.
| Cycle Data | Register | Name | Decoding |
|---|---|---|---|
| Outdoor bytes 0–1 | 0x8238 | Compressor 1 Current Freq | int16 BE (Hz) |
| Outdoor bytes 2–3 | 0x8236/0x8237 | Compressor Target Freq | int16 BE (Hz) |
| Outdoor byte 5 | 0x820A | Discharge 1 Temperature | byte − 55 (°C) |
| Outdoor byte 8 | 0x8204 | Outdoor Temperature | byte − 55 (°C) |
| Indoor byte 0 (24-byte) | ~0x82DE | EVA In Temperature | byte − 55 (°C) |
| Indoor byte 1 (24-byte) | ~0x8218 | Heat Exchanger Outlet | byte − 55 (°C) |
| Indoor byte 2 | ~0x42D9 | Water Inlet (Return) | byte − 55 (°C) |
| Indoor byte 7 | 0x42E9 | Water Flow | LPM (see format) |
| Indoor byte 8 | 0x40C4 | PWM Water Pump | byte directly (%) |
Registers prefixed with ~ are approximate mappings based on value correlation, not confirmed by Samsung documentation.
Cycle data does not update when the system is off. When both the main system switch and heating circuit are off, the hex data is stale and reflects the last active reading.
This has important implications for consumers of decoded data:
Each decoded field has been validated or cross-referenced using one or more of the following methods:
24 hours of telemetry data compared against weather station readings. Formula byte[8] − 55 achieved r = 0.865 correlation, with 75% of hourly readings within ±1°C.
Compared against physical flow meter readings during system startup. Indoor byte[7] / 10 matched actual readings exactly (e.g. 21.0 LPM vs 21 LPM actual), while the outdoor-derived value was consistently wrong (4.4–9.4 LPM for the same period).
Validated across multiple readings showing plausible correlation between flow rate, compressor frequency, and flow temperature. Formula is byte[7] directly (integer LPM). Range observed: 13–39 LPM during active heating.
Confirmed by comparing stored telemetry against device display photos taken at known times. The byte value is used directly as the pump speed percentage (e.g. byte value 71 = 71%).
Decoded values were compared against a Home Assistant dashboard powered by a hardware NASA bus integration. This confirmed compressor frequency, discharge temperature, evaporator temps, and return water temperature fields. Values taken at different timestamps showed plausible variation.
Important notes