Get desktop application:
View/edit binary Protocol Buffers messages
Deprecated, should be removed in 2027.8 - https://github.com/esphome/esphome/pull/10318
==================== BLUETOOTH CONNECTION PARAMS ====================
units of 1.25ms
units of 1.25ms
units of 10ms
legacy, for older peers, newer ones should use CLIMATE_PRESET_AWAY in preset Deprecated in API version 1.5
Deprecated in API version 1.5
legacy: command has been removed in 1.13 clients/servers must still send/accept it until the next protocol change Deprecated in API version 1.1
Deprecated in API version 1.1
(message has no fields)
DeviceInfoResponse max_data_length values: name = 31 (ESPHOME_DEVICE_NAME_MAX_LEN, validated by validate_hostname) friendly_name = 120 (core/config.FRIENDLY_NAME_MAX_LEN) mac_address/bluetooth_mac_address = 17 (MAC_ADDRESS_PRETTY_BUFFER_SIZE - 1, constexpr) esphome_version = 32 (ESPHOME_VERSION string literal) compilation_time = 25 (Application::BUILD_TIME_STR_SIZE - 1, constexpr) manufacturer = 20 (longest hardcoded literal: "Nordic Semiconductor") model = 127 (core/config.BOARD_MAX_LENGTH, validated in platform schemas) project_name/project_version = 127 (core/config.PROJECT_MAX_LENGTH) suggested_area = 120 (core/config.FRIENDLY_NAME_MAX_LEN via AREA_SCHEMA)
Deprecated in ESPHome 2026.1.0, but kept for backward compatibility with older ESPHome versions that still send this field.
The name of the node, given by "App.set_name()" - device hostname
The mac address of the device. For example "AC:BC:32:89:0E:A9"
A string describing the ESPHome version. For example "1.10.0"
A string describing the date of compilation, this is generated by the compiler and therefore may not be in the same format all the time. If the user isn't using ESPHome, this will also not be set.
The model of the board. For example NodeMCU max_data_length matches core/config.BOARD_MAX_LENGTH (validated in platform schemas)
The esphome project details if set max_data_length matches core/config.PROJECT_MAX_LENGTH
Deprecated in API version 1.9
Deprecated in API version 1.10
The Bluetooth mac address of the device. For example "AC:BC:32:89:0E:AA"
Supports receiving and saving api encryption key
Top-level area info to phase out suggested_area
Indicates if Z-Wave proxy support is available and features supported
Serial proxy instance metadata
Device is unprovisioned and accepts Noise handshakes with the well-known all-zeros PSK, so the api encryption key can be provisioned without being sent in plaintext (protects against passive sniffing, not active MITM)
REMOVED in ESPHome 2026.1.0: rpc authenticate (AuthenticationRequest) returns (AuthenticationResponse)
Request to close the connection. Can be sent by both the client and server
Optional reason the connection is being closed. Older peers that do not send this field will report DISCONNECT_REASON_UNSPECIFIED (0).
(message has no fields)
Deprecated in API version 1.6
Deprecated in API version 1.6
Message sent at the beginning of each connection Can only be sent by the client and only at the beginning of the connection
Description of client (like User Agent) For example "Home Assistant" Not strictly necessary to send but nice for debugging purposes.
Confirmation of successful connection request. Can only be sent by the server and only at the beginning of the connection
The version of the API to use. The _client_ (for example Home Assistant) needs to check for compatibility and if necessary adopt to an older API. Major is for breaking changes in the base protocol - a mismatch will lead to immediate disconnect_client_ Minor is for breaking changes in individual messages - a mismatch will lead to a warning message
A string identifying the server (ESP); like client info this may be empty and only exists for debugging/logging purposes. Currently set to ESPHOME_VERSION string literal.
The name of the server (App.get_name() - device hostname) max_data_length matches ESPHOME_DEVICE_NAME_MAX_LEN (validated by validate_hostname)
Command to transmit infrared/RF data using raw timings
Key identifying the transmitter instance
Carrier frequency in Hz
Number of times to transmit (1 = once, 2 = twice, etc.)
Raw timings in microseconds (zigzag-encoded): positive = mark (LED/TX on), negative = space (LED/TX off)
RadioFrequencyModulation enum value (0 = OOK; ignored for IR entities)
(message has no fields)
Not yet implemented:
==================== NOISE ENCRYPTION ====================
(message has no fields)
(message has no fields)
Configure UART parameters for a serial proxy instance
Instance index (0-based)
Baud rate in bits per second
Enable hardware flow control
Parity setting
Number of stop bits (1 or 2)
Number of data bits (5-8)
Request current modem control pin states
Instance index (0-based)
Generic request message for simple serial proxy operations
Instance index (0-based)
Request type
Set modem control pin states (RTS and DTR)
Instance index (0-based)
Bitmask of SerialProxyLineStateFlags
Write data to a serial device
Instance index (0-based)
Raw data to write to the serial device
(message has no fields)
==================== BLUETOOTH ====================
==================== IMPORT HOME ASSISTANT STATES ==================== 1. Client sends SubscribeHomeAssistantStatesRequest 2. Server responds with zero or more SubscribeHomeAssistantStateResponse (async) 3. Client sends HomeAssistantStateResponse for state changes.
(message has no fields)
==================== HOMEASSISTANT.SERVICE ====================
(message has no fields)
(message has no fields)
(message has no fields)
Bitmask of which fields are set (see WaterHeaterCommandHasField)
State flags bitmask (bit 0 = away, bit 1 = on)
==================== ALARM CONTROL PANEL ====================
Used in:
Used in:
Used in:
max_data_length matches core/config.FRIENDLY_NAME_MAX_LEN via AREA_SCHEMA
DEPRECATED in ESPHome 2026.1.0 - Password authentication is no longer supported. These messages are kept for protocol documentation but are not processed by the server. Use noise encryption instead: https://esphome.io/components/api/#configuration-variables
If the binary sensor does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
Used in:
V1 removed, use V3 variants
Used in:
New field for efficient UUID (v1.12+) Only one of uuid or short_uuid will be set. short_uuid is used for both 16-bit and 32-bit UUIDs with v1.12+ clients. 128-bit UUIDs always use the uuid field for backwards compatibility.
16-bit or 32-bit UUID
Used in:
New field for efficient UUID (v1.12+) Only one of uuid or short_uuid will be set. short_uuid is used for both 16-bit and 32-bit UUIDs with v1.12+ clients. 128-bit UUIDs always use the uuid field for backwards compatibility.
16-bit or 32-bit UUID
Used in:
New field for efficient UUID (v1.12+) Only one of uuid or short_uuid will be set. short_uuid is used for both 16-bit and 32-bit UUIDs with v1.12+ clients. 128-bit UUIDs always use the uuid field for backwards compatibility.
16-bit or 32-bit UUID
Removed in ESPHome 2025.8.0 - use BluetoothLERawAdvertisementsResponse instead
Used in:
Used in: ,
Used in:
Deprecated - only used by deprecated BluetoothLEAdvertisementResponse
Used in:
Deprecated in API version 1.7
Removed in api version 1.7
Added in api version 1.7
Used in:
values same as mode for readability
Used in: , ,
==================== CLIMATE ====================
Used in: , ,
Used in: , ,
For older peers, equal to preset == CLIMATE_PRESET_AWAY Deprecated in API version 1.5
Used in: , ,
==================== LIGHT ====================
Used in: , ,
Used in:
legacy: state has been removed in 1.13 clients/servers must still send/accept it until the next protocol change Deprecated in API version 1.1
Used in:
Used in:
If the date does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
If the datetime does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
Used in:
max_data_length matches core/config.FRIENDLY_NAME_MAX_LEN via DEVICE_SCHEMA
Reason a party is requesting the connection be closed.
Used in:
No specific reason / not provided (default for older peers).
The device's provisioning window has expired. The device must be reset (power-cycled) to reopen the provisioning window before it will accept a connection again.
Used in: , , , , , , , , , , , , , , , , , , , , , , , , ,
Used in:
ESPHome 1.14 (api v1.3) make int a signed value
Message sent by ESPHome to Home Assistant with service execution response data
Matches the call_id from ExecuteServiceRequest
Whether the service execution succeeded
Error message if success = false
Used in: ,
Deprecated in API version 1.6 - only used in deprecated fields
Used in: ,
Deprecated in API version 1.6
==================== IMPORT TIME ====================
(message has no fields)
Message sent by Home Assistant to ESPHome with service call response data
Matches the call_id from HomeassistantActionRequest
Whether the service call succeeded
Error message if success = false
Used in:
Event message for received infrared/RF data
Key identifying the receiver instance
Raw timings in microseconds (zigzag-encoded): alternating mark/space periods
Deprecated in API version 1.1
Used in:
Deprecated in API version 1.1
Used in:
==================== BINARY SENSOR ====================
==================== BUTTON ====================
==================== CAMERA ====================
Deprecated: use feature_flags
Deprecated: use feature_flags
for older peer versions - in new system this is if CLIMATE_PRESET_AWAY exists is supported_presets Deprecated in API version 1.5
Deprecated: use feature_flags
Deprecated: use feature_flags
Deprecated: use feature_flags
==================== COVER ====================
==================== DATETIME DATE ====================
==================== DATETIME DATETIME ====================
(message has no fields)
==================== EVENT ====================
==================== FAN ====================
Listing of infrared instances
Bitfield of InfraredCapabilityFlags
Demodulation frequency of the IR receiver in Hz (0 = unspecified)
next four supports_* are for legacy clients, newer clients should use color modes Deprecated in API version 1.6
Deprecated in API version 1.6
Deprecated in API version 1.6
Deprecated in API version 1.6
Not yet implemented:
Lists available radio frequency entity instances
Bitmask of RadioFrequencyCapabilityFlags: bit 0 = transmitter, bit 1 = receiver
Minimum tunable frequency in Hz; if min == max (non-zero): fixed frequency; 0 = unspecified
Maximum tunable frequency in Hz; 0 = unspecified
Bitmask of supported RadioFrequencyModulation values (bit N = modulation N supported)
==================== SELECT ====================
Last reset type removed in 2021.9.0 Deprecated in API version 1.5
Used in:
==================== SIREN ====================
==================== SWITCH ====================
==================== TEXT SENSOR ====================
==================== DATETIME TIME ====================
==================== UPDATE ====================
==================== VALVE ====================
Bitmask of WaterHeaterFeature flags
Used in:
==================== LOCK ====================
Used in:
==================== SUBSCRIBE LOGS ====================
Used in: ,
Used in:
Used in:
==================== MEDIA PLAYER ====================
Used in:
Used in:
==================== NUMBER ====================
Used in:
If the number does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
Used in:
If the select does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
Deprecated in API version 1.5
Used in:
==================== SENSOR ====================
Used in:
If the sensor does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
Data received from a serial device, forwarded to clients
Instance index (0-based)
Raw data received from the serial device
Response with current modem control pin states
Instance index (0-based)
Bitmask of SerialProxyLineStateFlags
Used in:
Human-readable port name
Port type (RS232, RS485)
Used in:
Used in:
Response to a SerialProxyRequest (e.g. flush completion or failure)
Instance index (0-based)
Which request type this responds to
Result status
Additional detail on failure (optional)
Used in: ,
Subscribe to receive data from this serial proxy instance
Unsubscribe from this serial proxy instance
Flush the serial port (block until all TX data is sent)
Used in:
Completed successfully; TX drain confirmed
Platform cannot confirm TX drain; success assumed
Driver or hardware error
Timed out before TX completed
Request type not supported by this instance
==================== USER-DEFINES SERVICES ====================
Used in:
Used in:
Status-only response - reports success/error without data payload Value is higher to avoid conflicts with future Home Assistant values
==================== TEMPERATURE UNIT ====================
Used in: ,
===================== TEXT =====================
Used in:
If the text sensor does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
If the Text does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
If the time does not have a valid state yet. Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
Used in:
Used in:
Used in:
Used in:
Used in:
Used in:
==================== VOICE ASSISTANT ====================
Used in:
Used in:
Bitmask for WaterHeaterCommandRequest.has_fields
==================== WATER_HEATER ====================
Used in: , ,
Bitmask of current state flags (bit 0 = away, bit 1 = on)
Used in:
Used as response type in: APIConnection.alarm_control_panel_command, APIConnection.bluetooth_device_request, APIConnection.bluetooth_gatt_get_services, APIConnection.bluetooth_gatt_notify, APIConnection.bluetooth_gatt_read, APIConnection.bluetooth_gatt_read_descriptor, APIConnection.bluetooth_gatt_write, APIConnection.bluetooth_gatt_write_descriptor, APIConnection.bluetooth_scanner_set_mode, APIConnection.button_command, APIConnection.camera_image, APIConnection.climate_command, APIConnection.cover_command, APIConnection.date_command, APIConnection.datetime_command, APIConnection.execute_service, APIConnection.fan_command, APIConnection.infrared_rf_transmit_raw_timings, APIConnection.light_command, APIConnection.list_entities, APIConnection.lock_command, APIConnection.media_player_command, APIConnection.number_command, APIConnection.select_command, APIConnection.serial_proxy_configure, APIConnection.serial_proxy_get_modem_pins, APIConnection.serial_proxy_request, APIConnection.serial_proxy_set_modem_pins, APIConnection.serial_proxy_write, APIConnection.siren_command, APIConnection.subscribe_bluetooth_le_advertisements, APIConnection.subscribe_home_assistant_states, APIConnection.subscribe_homeassistant_services, APIConnection.subscribe_logs, APIConnection.subscribe_states, APIConnection.subscribe_voice_assistant, APIConnection.switch_command, APIConnection.text_command, APIConnection.time_command, APIConnection.unsubscribe_bluetooth_le_advertisements, APIConnection.update_command, APIConnection.valve_command, APIConnection.voice_assistant_set_configuration, APIConnection.water_heater_command, APIConnection.zwave_proxy_frame, APIConnection.zwave_proxy_request
(message has no fields)