Cycle Data Decoding Guide

A technical reference for decoding Samsung EHS heat pump telemetry from the SmartThings ehsCycleData capability.

What is cycle data?

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.

NASA protocol

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.

Overview

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:

  1. If the device's binaryId (firmware identifier) is recognised, use its registered byte layout
  2. Otherwise, fall back to a length-based heuristic (24, 31, or 36 bytes)
  3. If neither matches, return null (unknown format)

Known Device Models

Each Samsung EHS heat pump reports a binaryId that identifies its firmware and platform. This determines the indoor data length and byte layout.

binaryIdIndoorOutdoorComponentFlow Rate
SAC_EHS_MONO24B18BINDOORbyte[7] direct (integer LPM)
SAC_EHS_SPLIT24B18BINDOORbyte[7] direct (integer LPM)
SAC_DVM_HE24B18BINDOORbyte[7] direct (integer LPM)
TP1X_DA_AC_EHS_01001_000031B28BINDOOR1byte[7] / 10 (decimal LPM)
S905D3_SAC_EHS_2436B28BINDOOR1Indoor unreliable — use outdoor fallback
  • INDOOR components use 24-byte data with integer-precision flow rates
  • INDOOR1 components use 31 or 36-byte data with decimal-precision flow rates
  • Unknown binaryIds fall back to length-based layout selection

Air vs Water Reference

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 Cycle Data

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)
PositionFieldFormulaStatus
Bytes 0–1Compressor frequencyint16 BE (Hz)Cross-referenced
Bytes 2–3Target compressor frequencyint16 BE (Hz)Cross-referenced
Byte 5Discharge gas temperaturebyte − 55 (°C)Cross-referenced
Byte 8Outdoor temperaturebyte − 55 (°C)Validated

18-byte example

00 1E 00 1E 5E 75 3B FF 3E 02 00 F1 01 C2 00 01 00 00
  • bytes[0:2] BE = 30 Hz (compressor freq)
  • byte[5] − 55 = 62°C (discharge temp)
  • byte[8] − 55 = 7°C (outdoor temp)

28-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 00
  • bytes[0:2] BE = 50 Hz (compressor freq)
  • byte[5] − 55 = 34°C (discharge temp)
  • byte[8] − 55 = 5°C (outdoor temp)
  • Outdoor bytes 20–21 (28-byte only) were previously used for flow rate but are unreliable during startup/transitions. Use indoor data instead.

Indoor Cycle Data (24-byte)

Used 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)
PositionFieldFormulaStatus
Byte 0Evaporator inlet temperaturebyte − 55 (°C)Cross-referenced
Byte 1Evaporator outlet temperaturebyte − 55 (°C)Cross-referenced
Byte 2Return water temperaturebyte − 55 (°C)Cross-referenced
Byte 4Flow temperature (air-reference only)byte − 55 (°C)Validated
Byte 7Flow ratebyte directly (LPM)Validated
Byte 8Inverter pump speedbyte 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 21
  • byte[0] − 55 = 31°C (evaporator IN)
  • byte[1] − 55 = 33°C (evaporator OUT)
  • byte[2] − 55 = 29°C (return water temp)
  • byte[4] = 0x56 — same as byte[0] on this device (byte[3] and byte[5] are 0x05 sentinels)
  • byte[7] = 34 L/min (flow rate)
  • byte[8] = 66% (pump speed)
  • On air-reference devices, byte[4] contains the flow temperature (byte − 55). On water-reference devices, byte[4] may duplicate byte[0] or show 0x05.
  • Bytes 9–20 are typically all zeros during operation. Bytes 21–23 may be counters or timestamps.

Indoor Cycle Data (31-byte)

Used 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)
PositionFieldFormulaStatus
Byte 2Return water temperaturebyte − 55 (°C)Cross-referenced
Byte 3Flow temperaturebyte − 55 (°C)Validated
Byte 7Flow ratebyte / 10 (LPM)Validated
Byte 8Inverter pump speedbyte 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 4B
  • byte[2] − 55 = 23°C (return water temp)
  • byte[3] − 55 = 25°C (flow temp)
  • byte[7] = 0xD2 (210) / 10 = 21.0 LPM (flow rate)
  • byte[8] = 100% (pump speed)
  • Bytes 0–1 differ from the 24-byte format. Byte[1] = 0x05 does not decode to a plausible temperature.
  • Byte 27 appears to contain DHW tank temperature (byte − 55), redundant with the API's dhwTemp value.

Indoor Cycle Data (36-byte)

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.

PositionFieldFormulaStatus
Byte 2Return water temperaturebyte − 55 (°C)Cross-referenced
Byte 3Flow temperaturebyte − 55 (°C)Cross-referenced
Byte 7Flow rateUnreliable
Byte 8Inverter pump speedbyte directly (%)Cross-referenced
  • Indoor flow rate is unreliable for this format. The outdoor bytes 20–21 fallback (int16 BE / 10) is used instead, though it too can be inaccurate during startup transitions.
  • The 5 extra trailing bytes (positions 31–35) have not yet been identified.

Decoding Formulas

Summary of all formulas used to convert raw bytes into meaningful values.

FormulaResultUsed for
byte − 55Temperature (°C)Outdoor temp, discharge temp, return water temp, flow temp, evaporator temps
byte / 10Flow rate (LPM)31-byte and 36-byte indoor formats (decimal precision)
byte directlyFlow rate (LPM)24-byte indoor format (integer precision)
byte directlyPump speed (%)Inverter pump speed, all indoor formats (byte 8)
int16 BEFrequency (Hz)Compressor frequency (outdoor bytes 0–1)
int16 BE / 10Flow rate (LPM)Outdoor bytes 20–21 (unreliable — prefer indoor source)

NASA Protocol Registers

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 DataRegisterNameDecoding
Outdoor bytes 0–10x8238Compressor 1 Current Freqint16 BE (Hz)
Outdoor bytes 2–30x8236/0x8237Compressor Target Freqint16 BE (Hz)
Outdoor byte 50x820ADischarge 1 Temperaturebyte − 55 (°C)
Outdoor byte 80x8204Outdoor Temperaturebyte − 55 (°C)
Indoor byte 0 (24-byte)~0x82DEEVA In Temperaturebyte − 55 (°C)
Indoor byte 1 (24-byte)~0x8218Heat Exchanger Outletbyte − 55 (°C)
Indoor byte 2~0x42D9Water Inlet (Return)byte − 55 (°C)
Indoor byte 70x42E9Water FlowLPM (see format)
Indoor byte 80x40C4PWM Water Pumpbyte directly (%)

Registers prefixed with ~ are approximate mappings based on value correlation, not confirmed by Samsung documentation.

System Off Behaviour

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:

  • Flow rate should be set to 0 when the system is off, regardless of what the hex data contains
  • Outdoor temperature may also be stale and should not be treated as a live reading
  • When the system turns back on, it may take one polling interval (typically 5 minutes) before fresh data appears

Validation Evidence

Each decoded field has been validated or cross-referenced using one or more of the following methods:

Outdoor temperature

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.

Flow rate (31-byte INDOOR1)

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).

Flow rate (24-byte INDOOR)

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.

Inverter pump speed

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%).

Home Assistant cross-reference

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

  • This guide is based on reverse-engineering the SmartThings API responses from Samsung EHS heat pumps. Samsung does not officially document the ehsCycleData byte layout.
  • Byte positions and formulas may vary for device models not listed in the known models table. If you have a Samsung EHS unit with different behaviour, we'd welcome contributions.
  • All temperature values are in degrees Celsius. Flow rates are in litres per minute (LPM).