ESPHome 2026.10.0-dev
Loading...
Searching...
No Matches
modbus_output.h
Go to the documentation of this file.
1#pragma once
2
6
7#include <vector>
8
10
11class ModbusFloatOutput final : public output::FloatOutput, public Component, public SensorItem, public WriterEntity {
12 public:
13 ModbusFloatOutput(uint16_t start_address, uint8_t offset, SensorValueType value_type) {
15 // A byte offset folds into the address as whole registers; odd offsets are rejected at validation.
16 this->set_address(start_address + offset / 2);
18 this->bitmask = 0xFFFFFFFF;
19 this->sensor_value_type = value_type;
20 }
21 void dump_config() override;
22
23 void set_parent(ModbusController *parent) { this->set_controller_(parent); }
24 void set_write_multiply(float factor) { this->multiply_by_ = factor; }
25 // Do nothing
26 void parse_and_publish(std::span<const uint8_t> data) override{};
27
28 using write_transform_func_t = optional<float> (*)(ModbusFloatOutput *, float, modbus::RegisterValues &);
30 void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
31
32 protected:
33 void write_state(float value) override;
34 optional<write_transform_func_t> write_transform_func_{nullopt};
35
36 float multiply_by_{1.0};
38};
39
40class ModbusBinaryOutput final : public output::BinaryOutput, public Component, public SensorItem, public WriterEntity {
41 public:
44 // A coil offset is a coil count; fold it into the address.
45 this->set_address(start_address + offset);
46 this->bitmask = 0xFFFFFFFF;
49 }
50 void dump_config() override;
51
52 void set_parent(ModbusController *parent) { this->set_controller_(parent); }
53 // Do nothing
54 void parse_and_publish(std::span<const uint8_t> data) override{};
55
58 void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; }
59
60 protected:
61 void write_state(bool state) override;
62 optional<write_transform_func_t> write_transform_func_{nullopt};
63
65};
66
67} // namespace esphome::modbus_controller
Minimal static vector - saves memory by avoiding std::vector overhead.
Definition helpers.h:227
void set_use_write_mutiple(bool use_write_multiple)
void parse_and_publish(std::span< const uint8_t > data) override
optional< bool >(*)(ModbusBinaryOutput *, bool, modbus::helpers::PduBuffer &) write_transform_func_t
void set_parent(ModbusController *parent)
optional< write_transform_func_t > write_transform_func_
void set_write_template(write_transform_func_t f)
ModbusBinaryOutput(uint16_t start_address, uint8_t offset)
ModbusFloatOutput(uint16_t start_address, uint8_t offset, SensorValueType value_type)
void write_state(float value) override
Write a value to the device.
optional< write_transform_func_t > write_transform_func_
void set_write_template(write_transform_func_t f)
void parse_and_publish(std::span< const uint8_t > data) override
void set_use_write_mutiple(bool use_write_multiple)
void set_parent(ModbusController *parent)
optional< float >(*)(ModbusFloatOutput *, float, modbus::RegisterValues &) write_transform_func_t
void set_address(uint16_t address)
Sets the configured address, and points the range base at it.
void set_offset_from_start_address(uint8_t offset)
Records the offset as configured, and seeds the resolved position with it.
uint8_t offset
Position of this sensor's data within its range's response - a byte offset for registers,...
Gives a writer entity the write API of the WriterDevice it owns.
void set_controller_(ModbusController *controller)
Base class for all output components that can output a variable level, like PWM.
bool state
Definition fan.h:2
const std::vector< uint8_t > & data