Summary

Escea DS Series network-enabled gas fireplace controlled over UDP on LAN. 15-byte binary packet protocol with start byte 0x47 ('G'), command ID, data, CRC, and end byte 0x46 ('F'). Supports power on/off, fan boost, flame effect, and temperature setpoint. Discovery via broadcast SEARCH_FOR_FIRES.

Transport

protocols:
  - udp
addressing:
  port: 3300
  # broadcast discovery: destination subnet broadcast (e.g. 192.168.0.255), port 3300
auth:
  type: none  # inferred: no per-command auth procedure in source.
  # Pairing PIN is exchanged during SEARCH_FOR_FIRES/I_AM_A_FIRE discovery and
  # verified by the remote out-of-band; the fireplace itself does not gate
  # command/response on the PIN per the documented protocol.

Packet Structure

# 15-byte fixed-length packets for both commands and responses.
# | byte 1 | byte 2      | byte 3   | bytes 4-13 | byte 14 | byte 15 |
# | 0x47   | ID          | DataSize | Data       | CRC      | 0x46    |
# CRC = sum(bytes 2..13 inclusive) mod 256
start_byte: 0x47  # ASCII 'G'
end_byte: 0x46    # ASCII 'F'
crc:
  algorithm: sum_mod_256
  range: bytes_2_to_13_inclusive
data_field_bytes: 10  # always present; bytes beyond DataSize are don't-care

Traits

traits:
  - powerable   # POWER_ON / POWER_OFF commands
  - queryable   # STATUS_PLEASE query returns STATUS response
  - levelable   # NEW_SET_TEMP sets desired room temperature

Actions

# Each command is one 15-byte UDP packet. Full payload shown as a hex string
# in source order; CRC computed as documented (sum of bytes 2..13 mod 256).
# For zero-data commands the CRC equals the command ID (e.g. STATUS_PLEASE -> 0x31).

- id: status_please
  label: Status Request
  kind: query
  command: "47 31 00 00 00 00 00 00 00 00 00 00 00 31 46"
  params: []
  notes: "Example packet verbatim from source: 0x473100000000000000000000003146"

- id: power_on
  label: Power On
  kind: action
  command: "47 39 00 00 00 00 00 00 00 00 00 00 00 39 46"
  params: []

- id: power_off
  label: Power Off
  kind: action
  command: "47 3A 00 00 00 00 00 00 00 00 00 00 00 3A 46"
  params: []

- id: search_for_fires
  label: Search For Fires
  kind: action
  command: "47 50 00 00 00 00 00 00 00 00 00 00 00 50 46"
  params: []
  notes: "Broadcast to subnet (e.g. 192.168.0.255:3300). Fireplaces reply with I_AM_A_FIRE."

- id: fan_boost_on
  label: Fan Boost On
  kind: action
  command: "47 37 00 00 00 00 00 00 00 00 00 00 00 37 46"
  params: []

- id: fan_boost_off
  label: Fan Boost Off
  kind: action
  command: "47 38 00 00 00 00 00 00 00 00 00 00 00 38 46"
  params: []

- id: flame_effect_on
  label: Flame Effect On
  kind: action
  command: "47 56 00 00 00 00 00 00 00 00 00 00 00 56 46"
  params: []

- id: flame_effect_off
  label: Flame Effect Off
  kind: action
  command: "47 55 00 00 00 00 00 00 00 00 00 00 00 55 46"
  params: []

- id: new_set_temp
  label: New Set Temperature
  kind: action
  command: "47 57 01 {temp} 00 00 00 00 00 00 00 00 {crc} 46"
  params:
    - name: temp
      type: integer
      description: "Desired room temperature in °C. Valid range 3 < temp < 31."
      min: 4
      max: 30
  notes: "DataSize=1. CRC = sum(bytes 2..13) mod 256 = (0x57 + 0x01 + temp) mod 256."

Feedbacks

# Observable states returned in STATUS response (ID 0x80, 6 data bytes).
# Example response packet from source: 0x478006000100001B1800000000BA46

- id: has_new_timers
  type: boolean
  source: STATUS Data[0]

- id: fire_on
  type: boolean
  source: STATUS Data[1]

- id: fan_boost_on_state
  type: boolean
  source: STATUS Data[2]

- id: flame_effect_on_state
  type: boolean
  source: STATUS Data[3]

- id: desired_temperature
  type: integer
  unit: "°C"
  source: STATUS Data[4]

- id: room_temperature
  type: integer
  unit: "°C"
  source: STATUS Data[5]

Variables

# Settable parameters that are not discrete actions are represented via Actions
# above (NEW_SET_TEMP). No additional settable variables documented.

Events

# Unsolicited notifications: none documented. Fireplace only replies to commands.
# SEARCH_FOR_FIRES -> I_AM_A_FIRE is a solicited response (to a broadcast).

Macros

# UNRESOLVED: no multi-step sequences described explicitly in source.

Discovery

# Documented discovery flow (solicited broadcast, not unsolicited event):
# 1. Remote broadcasts SEARCH_FOR_FIRES (0x50) to subnet broadcast IP, port 3300.
# 2. Each fireplace replies with I_AM_A_FIRE (0x90) containing Serial Number + PIN.
# 3. I_AM_A_FIRE packet (15 bytes): 47 90 06 {serial 4 bytes BE} {pin 2 bytes BE} 00 00 00 00 {crc} 46
# 4. Remote presents Serial Number to user, verifies PIN, then sends further
#    commands directly to that fireplace's unicast IP.
response:
  id: i_am_a_fire
  response_id: 0x90
  data_size: 6
  fields:
    serial_number:
      type: uint32
      endian: big
      bytes: "Data[0..3]"
    pin:
      type: uint16
      endian: big
      bytes: "Data[4..5]"
response_time: "<3s typical"

Response Acknowledgements

# Each non-query command has a matching ACK response (0 data bytes).
- command: POWER_ON
  ack_id: 0x8D
- command: POWER_OFF
  ack_id: 0x8F
- command: FAN_BOOST_ON
  ack_id: 0x89
- command: FAN_BOOST_OFF
  ack_id: 0x8B
- command: FLAME_EFFECT_ON
  ack_id: 0x61
- command: FLAME_EFFECT_OFF
  ack_id: 0x60
- command: NEW_SET_TEMP
  ack_id: 0x66

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source describes only the LAN protocol. No safety warnings,
# interlock procedures, or power-on sequencing requirements are documented
# in this protocol spec. Fireplace appliance safety (gas interlocks, overheat,
# flame-failure) is out of scope of the LAN comms doc.

Notes

  • Document version 0.3, prepared by Kamahi Electronics Ltd, dated 11 March 2014.
  • All packets are exactly 15 bytes regardless of DataSize; bytes 4..13 are always sent, with bytes beyond DataSize treated as don't-care.
  • CRC is a single-byte additive checksum (sum of bytes 2..13 mod 256), not a CRC polynomial despite the field name.
  • For zero-data commands the CRC byte equals the command ID byte (since DataSize=0 and data bytes are 0).
  • Discovery uses subnet broadcast; subsequent commands are unicast to the discovered fireplace IP.
  • Temperature valid range per source: 3 < °C < 31 (exclusive bounds), so integer values 4..30.
  • Pin pairing is verified by the remote out-of-band; the fireplace does not enforce the PIN on individual commands per the documented protocol.

## Provenance

```yaml
source_domains:
  - github.com
  - home-assistant.io
source_urls:
  - https://github.com/snikch/escea/files/644165/630260_3.Escea.Fireplace.LAN.Comms.Spec.pdf
  - https://github.com/snikch/escea/blob/master/CODES.md
  - https://github.com/snikch/escea/blob/master/escea/message.py
  - https://github.com/snikch/escea/blob/master/escea/fire.py
  - https://www.home-assistant.io/integrations/escea/
retrieved_at: 2026-06-19T18:11:54.916Z
last_checked_at: 2026-06-22T11:50:24.170Z

Verification Summary

verdict: verified
checked_at: 2026-06-22T11:50:24.170Z
matched_actions: 9
action_count: 9
confidence: medium
summary: "All 9 spec commands matched verbatim in source Table 1; transport (UDP, port 3300) verified; complete coverage of documented protocol. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source identifies product family as \"Escea gas fireplace\" / \"Escea DS Series\" generically; no specific model number(s) listed. Pinning to DS Series per input."
- "protocol version is 0.3 of the spec doc dated 11 March 2014; device firmware compatibility not stated."
- "no power/voltage/current specs in source (fireplace appliance ratings out of scope of LAN protocol doc)."
- "no multi-step sequences described explicitly in source."
- "source describes only the LAN protocol. No safety warnings,"
- "specific DS-series model numbers (e.g. DS1400, DS1450) not enumerated in source."
- "no firmware version compatibility stated."
- "appliance electrical/gas ratings out of scope for this protocol doc."
- "user-supplied \"Known protocol: TCP/IP\" conflicts with source; source states UDP port 3300 and the protocol is fundamentally datagram-based (broadcast discovery). Used UDP per source."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0