7static const char *
const TAG =
"modbus_controller.output";
10static constexpr size_t MODBUS_OUTPUT_MAX_LOG_BYTES = 64;
16 std::vector<uint16_t>
data;
17 auto original_value = value;
24 if (
val.has_value()) {
25 ESP_LOGV(TAG,
"Value overwritten by lambda");
28 ESP_LOGV(TAG,
"Communication handled by lambda - exiting control");
39 ESP_LOGD(TAG,
"Updating register: start address=0x%X register count=%d new value=%.02f (val=%.02f)",
46 ESP_LOGW(TAG,
"No payload was created for updating output");
54 if (
data.size() > this->register_count) {
55 ESP_LOGE(TAG,
"Payload has %zu registers but register_count is %u; dropping write",
data.size(),
56 this->register_count);
61 optional<ModbusCommandItem> write_cmd;
73 ESP_LOGCONFIG(TAG,
"Modbus Float Output:");
74 LOG_FLOAT_OUTPUT(
this);
76 " Device start address: 0x%X\n"
77 " Register count: %d\n"
85 optional<ModbusCommandItem> cmd;
86 std::vector<uint8_t>
data;
94 if (
val.has_value()) {
95 ESP_LOGV(TAG,
"Value overwritten by lambda");
98 ESP_LOGV(TAG,
"Communication handled by lambda - exiting control");
103#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
106 ESP_LOGV(TAG,
"Modbus binary output write raw: %s",
114 ESP_LOGV(TAG,
"Write new state: value is %s, type is %d address = %X, offset = %x", ONOFF(
state),
119 std::vector<bool> states{
state};
131 ESP_LOGCONFIG(TAG,
"Modbus Binary Output:");
132 LOG_BINARY_OUTPUT(
this);
134 " Device start address: 0x%X\n"
135 " Register count: %d\n"
void write_state(bool state) override
optional< write_transform_func_t > write_transform_func_
ModbusController * parent_
void dump_config() override
static ModbusCommandItem create_write_multiple_coils(ModbusController *modbusdevice, uint16_t start_address, const std::vector< bool > &values)
Create modbus write multiple registers command Function 15 (0Fhex) Write Multiple Coils.
static ModbusCommandItem create_write_single_coil(ModbusController *modbusdevice, uint16_t address, bool value)
Create modbus write single registers command Function 05 (05hex) Write Single Coil.
static ModbusCommandItem create_write_single_command(ModbusController *modbusdevice, uint16_t start_address, uint16_t value)
Create modbus write multiple registers command Function 16 (10hex) Write Multiple Registers.
static ModbusCommandItem create_custom_command(ModbusController *modbusdevice, const std::vector< uint8_t > &values, std::function< void(EntityType register_type, uint16_t start_address, std::span< const uint8_t > data)> &&handler=nullptr)
Create custom modbus command.
static ModbusCommandItem create_write_multiple_command(ModbusController *modbusdevice, uint16_t start_address, uint16_t register_count, const std::vector< uint16_t > &values)
Create modbus read command Function code 02-04.
void queue_command(ModbusCommandItem command)
Queues a one-shot modbus command (writes, custom commands); taken by value, so std::move to avoid a c...
void on_write_register_response(EntityType register_type, uint16_t start_address, std::span< const uint8_t > data)
Handles a write command acknowledgement (used by write command on_data_func handlers).
ModbusController * parent_
void write_state(float value) override
Write a value to the device.
optional< write_transform_func_t > write_transform_func_
void dump_config() override
modbus::EntityType register_type
SensorValueType sensor_value_type
uint8_t offset
Position of this sensor's data within its range's response - a byte offset for registers,...
void float_to_payload(Container &data, float value, SensorValueType value_type)
Append a float converted to register words to any push_back container (heap-free with StaticVector).
const std::vector< uint8_t > & data
char * format_hex_pretty_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length, char separator)
Format byte array as uppercase hex to buffer (base implementation).
constexpr size_t format_hex_pretty_size(size_t byte_count)
Calculate buffer size needed for format_hex_pretty_to with separator: "XX:XX:...:XX\0".