mirror of
https://github.com/esphome/esphome.git
synced 2024-11-10 09:17:46 +01:00
modbus_controller: bugfix: enable overriding calculated register size (#2845)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
1b88b7a166
commit
9ca4e8f32a
4 changed files with 12 additions and 6 deletions
|
@ -13,6 +13,7 @@ from .const import (
|
||||||
CONF_MODBUS_CONTROLLER_ID,
|
CONF_MODBUS_CONTROLLER_ID,
|
||||||
CONF_REGISTER_COUNT,
|
CONF_REGISTER_COUNT,
|
||||||
CONF_REGISTER_TYPE,
|
CONF_REGISTER_TYPE,
|
||||||
|
CONF_RESPONSE_SIZE,
|
||||||
CONF_SKIP_UPDATES,
|
CONF_SKIP_UPDATES,
|
||||||
CONF_VALUE_TYPE,
|
CONF_VALUE_TYPE,
|
||||||
)
|
)
|
||||||
|
@ -125,6 +126,7 @@ ModbusItemBaseSchema = cv.Schema(
|
||||||
cv.Optional(CONF_SKIP_UPDATES, default=0): cv.positive_int,
|
cv.Optional(CONF_SKIP_UPDATES, default=0): cv.positive_int,
|
||||||
cv.Optional(CONF_FORCE_NEW_RANGE, default=False): cv.boolean,
|
cv.Optional(CONF_FORCE_NEW_RANGE, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_LAMBDA): cv.returning_lambda,
|
cv.Optional(CONF_LAMBDA): cv.returning_lambda,
|
||||||
|
cv.Optional(CONF_RESPONSE_SIZE, default=0): cv.positive_int,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -180,6 +182,9 @@ async def add_modbus_base_properties(
|
||||||
if CONF_CUSTOM_COMMAND in config:
|
if CONF_CUSTOM_COMMAND in config:
|
||||||
cg.add(var.set_custom_data(config[CONF_CUSTOM_COMMAND]))
|
cg.add(var.set_custom_data(config[CONF_CUSTOM_COMMAND]))
|
||||||
|
|
||||||
|
if config[CONF_RESPONSE_SIZE] > 0:
|
||||||
|
cg.add(var.set_register_size(config[CONF_RESPONSE_SIZE]))
|
||||||
|
|
||||||
if CONF_LAMBDA in config:
|
if CONF_LAMBDA in config:
|
||||||
template_ = await cg.process_lambda(
|
template_ = await cg.process_lambda(
|
||||||
config[CONF_LAMBDA],
|
config[CONF_LAMBDA],
|
||||||
|
|
|
@ -254,16 +254,18 @@ class SensorItem {
|
||||||
size_t virtual get_register_size() const {
|
size_t virtual get_register_size() const {
|
||||||
if (register_type == ModbusRegisterType::COIL || register_type == ModbusRegisterType::DISCRETE_INPUT)
|
if (register_type == ModbusRegisterType::COIL || register_type == ModbusRegisterType::DISCRETE_INPUT)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else // if CONF_RESPONSE_BYTES is used override the default
|
||||||
return register_count * 2;
|
return response_bytes > 0 ? response_bytes : register_count * 2;
|
||||||
}
|
}
|
||||||
|
// Override register size for modbus devices not using 1 register for one dword
|
||||||
|
void set_register_size(uint8_t register_size) { response_bytes = register_size; }
|
||||||
ModbusRegisterType register_type;
|
ModbusRegisterType register_type;
|
||||||
SensorValueType sensor_value_type;
|
SensorValueType sensor_value_type;
|
||||||
uint16_t start_address;
|
uint16_t start_address;
|
||||||
uint32_t bitmask;
|
uint32_t bitmask;
|
||||||
uint8_t offset;
|
uint8_t offset;
|
||||||
uint8_t register_count;
|
uint8_t register_count;
|
||||||
|
uint8_t response_bytes{0};
|
||||||
uint8_t skip_updates;
|
uint8_t skip_updates;
|
||||||
std::vector<uint8_t> custom_data{};
|
std::vector<uint8_t> custom_data{};
|
||||||
bool force_new_range{false};
|
bool force_new_range{false};
|
||||||
|
|
|
@ -13,7 +13,7 @@ void ModbusTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Modbus Controller Te
|
||||||
|
|
||||||
void ModbusTextSensor::parse_and_publish(const std::vector<uint8_t> &data) {
|
void ModbusTextSensor::parse_and_publish(const std::vector<uint8_t> &data) {
|
||||||
std::ostringstream output;
|
std::ostringstream output;
|
||||||
uint8_t max_items = this->response_bytes_;
|
uint8_t max_items = this->response_bytes;
|
||||||
char buffer[4];
|
char buffer[4];
|
||||||
bool add_comma = false;
|
bool add_comma = false;
|
||||||
for (auto b : data) {
|
for (auto b : data) {
|
||||||
|
|
|
@ -17,7 +17,7 @@ class ModbusTextSensor : public Component, public text_sensor::TextSensor, publi
|
||||||
this->register_type = register_type;
|
this->register_type = register_type;
|
||||||
this->start_address = start_address;
|
this->start_address = start_address;
|
||||||
this->offset = offset;
|
this->offset = offset;
|
||||||
this->response_bytes_ = response_bytes;
|
this->response_bytes = response_bytes;
|
||||||
this->register_count = register_count;
|
this->register_count = register_count;
|
||||||
this->encode_ = encode;
|
this->encode_ = encode;
|
||||||
this->skip_updates = skip_updates;
|
this->skip_updates = skip_updates;
|
||||||
|
@ -38,7 +38,6 @@ class ModbusTextSensor : public Component, public text_sensor::TextSensor, publi
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
RawEncoding encode_;
|
RawEncoding encode_;
|
||||||
uint16_t response_bytes_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace modbus_controller
|
} // namespace modbus_controller
|
||||||
|
|
Loading…
Reference in a new issue