ESPHome 2026.8.0b4
Loading...
Searching...
No Matches
esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts > Class Template Reference

modbus_client.read_write_multiple_registers (FC 0x17): writes one register block and reads another back in one transaction (write first, per Modbus 6.17). More...

#include <modbus_client.h>

Inheritance diagram for esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >:
esphome::modbus_client::TypedClientActionBase< Ts... > esphome::modbus_client::ClientActionBase< Ts... > esphome::Action< Ts... > esphome::modbus::ModbusClientDevice

Data Structures

union  Values
 

Public Member Functions

 TEMPLATABLE_VALUE (uint16_t, read_address) TEMPLATABLE_VALUE(uint16_t
 
read_count TEMPLATABLE_VALUE (uint16_t, write_address) void set_values_static(const uint16_t *values
 Static config: the write registers live in flash, so play() neither allocates nor copies.
 
void set_values_template (std::vector< uint16_t >(*func)(Ts...))
 Lambda config: the write registers are only known at play() time.
 
Trigger< std::span< const uint16_t > > * get_response_trigger ()
 
void play (const Ts &...x) override
 
void on_read_registers (modbus::EntityType entity_type, uint16_t start_address, std::span< const uint16_t > registers, modbus::ResponseStatus status) override
 
- Public Member Functions inherited from esphome::modbus_client::TypedClientActionBase< Ts... >
Trigger< std::span< const uint8_t >, std::span< const uint8_t > > * get_custom_response_trigger ()
 
void set_custom_response_handled ()
 Set by codegen when the config declares on_custom_response.
 
void on_custom_response (std::span< const uint8_t > request_pdu, std::span< const uint8_t > response_pdu, modbus::ResponseStatus status) override
 
- Public Member Functions inherited from esphome::modbus_client::ClientActionBase< Ts... >
 TEMPLATABLE_VALUE (uint8_t, target_address) Trigger< std
 
Trigger< std::span< const uint8_t >, modbus::ExceptionCode > * get_error_trigger ()
 
Trigger< std::span< const uint8_t > > * get_no_response_trigger ()
 
Trigger< std::span< const uint8_t > > * get_not_sent_trigger ()
 
void set_retry (retry_func_t f)
 
void on_sent (std::span< const uint8_t > request_pdu) override
 The frame was written to the wire: fires once per transmission, before any reply, and never for a send that ended in on_not_sent.
 
void on_not_sent (std::span< const uint8_t > request_pdu) override
 Never reached the wire, from either of two sources.
 
void on_error (std::span< const uint8_t > request_pdu, modbus::ExceptionCode exception_code) override
 A Modbus exception reply.
 
bool on_no_response (std::span< const uint8_t > request_pdu) override
 No reply within send_wait_time.
 
void play_complex (const Ts &...x) override
 Stamp the templated device address before every play(): subclasses cannot forget it, and the hub routes each reply by device pointer, so a changed address never mis-routes earlier replies.
 
- Public Member Functions inherited from esphome::Action< Ts... >
virtual void stop_complex ()
 
virtual bool is_running ()
 Check if this or any of the following actions are currently running.
 
int num_running_total ()
 The total number of actions that are currently running in this plus any of the following actions in the chain.
 
- Public Member Functions inherited from esphome::modbus::ModbusClientDevice
 ModbusClientDevice ()=default
 
 ModbusClientDevice (ModbusClientHub *parent, uint8_t address)
 
virtual ~ModbusClientDevice ()
 
 ModbusClientDevice (const ModbusClientDevice &)=delete
 
ModbusClientDeviceoperator= (const ModbusClientDevice &)=delete
 
 ModbusClientDevice (ModbusClientDevice &&)=delete
 
ModbusClientDeviceoperator= (ModbusClientDevice &&)=delete
 
void set_parent (ModbusClientHub *parent)
 
void set_address (uint8_t address)
 
virtual void on_response (std::span< const uint8_t > request_pdu, std::span< const uint8_t > response_pdu)
 Low-level response hook: called with the request PDU this device sent and the response PDU received The spans are only valid for the duration of the call - copy the bytes if they must outlive it.
 
 ESPDEPRECATED ("Override on_not_sent() instead. Removed in 2027.2.0", "2026.8.0") virtual void on_modbus_not_sent()
 
 ESPDEPRECATED ("Override on_no_response() instead. Removed in 2027.2.0", "2026.8.0") virtual bool on_modbus_no_response()
 
virtual void on_read_holding_registers (uint16_t start_address, std::span< const uint16_t > registers, ResponseStatus status)
 
virtual void on_read_input_registers (uint16_t start_address, std::span< const uint16_t > registers, ResponseStatus status)
 
virtual void on_read_bits (EntityType entity_type, uint16_t start_address, PackedBits bits, ResponseStatus status)
 Coil/discrete-input reads are delivered as a PackedBits view (bit 0 = the bit at start_address, bits.size() = the count requested).
 
virtual void on_read_coils (uint16_t start_address, PackedBits bits, ResponseStatus status)
 
virtual void on_read_discrete_inputs (uint16_t start_address, PackedBits bits, ResponseStatus status)
 
virtual void on_write_single_register (uint16_t address, uint16_t value, ResponseStatus status)
 Write acknowledgements.
 
virtual void on_write_single_coil (uint16_t address, bool value, ResponseStatus status)
 
virtual void on_write_multiple_registers (uint16_t start_address, std::span< const uint16_t > registers, ResponseStatus status)
 
virtual void on_write_multiple_coils (uint16_t start_address, PackedBits bits, ResponseStatus status)
 
 ESPDEPRECATED ("Use the typed read_*/write_* helpers or queue_pdu() instead. Removed in 2027.2.0", "2026.8.0") void send(uint8_t function
 

Data Fields

read_count size_t len
 
this len_ = static_cast<ssize_t>(len)
 
- Data Fields inherited from esphome::modbus::ModbusClientDevice
uint16_t start_address
 
uint16_t uint16_t number_of_entities
 
uint16_t uint16_t uint8_t payload_len = 0
 
uint16_t uint16_t uint8_t const uint8_t * payload
 
ModbusClientHubparent_ {nullptr}
 
uint8_t address_ {0}
 
bool custom_response_warned_ {false}
 

Protected Attributes

Trigger< std::span< const uint16_t > > response_trigger_
 
ssize_t len_ {-1}
 
union esphome::modbus_client::ReadWriteMultipleRegistersAction::Values values_
 
- Protected Attributes inherited from esphome::modbus_client::TypedClientActionBase< Ts... >
Trigger< std::span< const uint8_t >, std::span< const uint8_t > > custom_response_trigger_
 
bool custom_response_handled_
 
- Protected Attributes inherited from esphome::modbus_client::ClientActionBase< Ts... >
Trigger< std::span< const uint8_t > > sent_trigger_
 
Trigger< std::span< const uint8_t >, modbus::ExceptionCodeerror_trigger_
 
Trigger< std::span< const uint8_t > > no_response_trigger_
 
Trigger< std::span< const uint8_t > > not_sent_trigger_
 
retry_func_t retry_func_
 
- Protected Attributes inherited from esphome::Action< Ts... >
friend ActionList< Ts... >
 
Action< Ts... > * next_
 
int num_running_
 The number of instances of this sequence in the list of actions that is currently being executed.
 

Additional Inherited Members

- Public Types inherited from esphome::modbus_client::ClientActionBase< Ts... >
using retry_func_t
 The retry decision for on_no_response: given the request PDU, return true to have the hub re-queue the frame.
 
- Protected Member Functions inherited from esphome::modbus_client::ClientActionBase< Ts... >
void send_or_resolve_ (std::span< const uint8_t > pdu)
 The hub refuses some sends at the door with no callback (a duplicate write already pending, a full queue, or an empty PDU - which is how the create_*_pdu() builders reject out-of-spec input).
 
- Protected Member Functions inherited from esphome::Action< Ts... >
void play_next_ (const Ts &...x)
 
void play_next_tuple_ (const std::tuple< Ts... > &tuple, std::index_sequence< S... >)
 
void play_next_tuple_ (const std::tuple< Ts... > &tuple)
 
virtual void stop ()
 
void stop_next_ ()
 
bool is_running_next_ ()
 

Detailed Description

template<typename... Ts>
class esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >

modbus_client.read_write_multiple_registers (FC 0x17): writes one register block and reads another back in one transaction (write first, per Modbus 6.17).

on_response delivers the read-back words as values.

Definition at line 338 of file modbus_client.h.

Member Function Documentation

◆ get_response_trigger()

template<typename... Ts>
Trigger< std::span< const uint16_t > > * esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::get_response_trigger ( )
inline

Definition at line 355 of file modbus_client.h.

◆ on_read_registers()

template<typename... Ts>
void esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::on_read_registers ( modbus::EntityType entity_type,
uint16_t start_address,
std::span< const uint16_t > registers,
modbus::ResponseStatus status )
inlineoverridevirtual

Reimplemented from esphome::modbus::ModbusClientDevice.

Definition at line 373 of file modbus_client.h.

◆ play()

template<typename... Ts>
void esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::play ( const Ts &... x)
inlineoverridevirtual

Implements esphome::Action< Ts... >.

Definition at line 357 of file modbus_client.h.

◆ set_values_template()

template<typename... Ts>
void esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::set_values_template ( std::vector< uint16_t >(* func )(Ts...))
inline

Lambda config: the write registers are only known at play() time.

Definition at line 350 of file modbus_client.h.

◆ TEMPLATABLE_VALUE() [1/2]

template<typename... Ts>
esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::TEMPLATABLE_VALUE ( uint16_t ,
read_address  )

◆ TEMPLATABLE_VALUE() [2/2]

template<typename... Ts>
read_count esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::TEMPLATABLE_VALUE ( uint16_t ,
write_address  ) const

Static config: the write registers live in flash, so play() neither allocates nor copies.

Field Documentation

◆ len

template<typename... Ts>
read_count size_t esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::len
Initial value:
{
this->values_.data = values
union esphome::modbus_client::ReadWriteMultipleRegistersAction::Values values_

Definition at line 345 of file modbus_client.h.

◆ len_ [1/2]

template<typename... Ts>
this esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::len_ = static_cast<ssize_t>(len)

Definition at line 347 of file modbus_client.h.

◆ len_ [2/2]

template<typename... Ts>
ssize_t esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::len_ {-1}
protected

Definition at line 381 of file modbus_client.h.

◆ response_trigger_

template<typename... Ts>
Trigger<std::span<const uint16_t> > esphome::modbus_client::ReadWriteMultipleRegistersAction< Ts >::response_trigger_
protected

Definition at line 380 of file modbus_client.h.

◆ values_


The documentation for this class was generated from the following file: