Allow custom register type for modbus number (#3202)

This commit is contained in:
Jesse Hills 2022-03-16 13:43:05 +13:00
parent b7535693fa
commit 756f71c382
No known key found for this signature in database
GPG Key ID: BEAAE804EFD8E83A
2 changed files with 9 additions and 3 deletions

View File

@ -11,6 +11,7 @@ from esphome.const import (
) )
from .. import ( from .. import (
MODBUS_WRITE_REGISTER_TYPE,
add_modbus_base_properties, add_modbus_base_properties,
modbus_controller_ns, modbus_controller_ns,
modbus_calc_properties, modbus_calc_properties,
@ -24,6 +25,7 @@ from ..const import (
CONF_CUSTOM_COMMAND, CONF_CUSTOM_COMMAND,
CONF_FORCE_NEW_RANGE, CONF_FORCE_NEW_RANGE,
CONF_MODBUS_CONTROLLER_ID, CONF_MODBUS_CONTROLLER_ID,
CONF_REGISTER_TYPE,
CONF_SKIP_UPDATES, CONF_SKIP_UPDATES,
CONF_USE_WRITE_MULTIPLE, CONF_USE_WRITE_MULTIPLE,
CONF_VALUE_TYPE, CONF_VALUE_TYPE,
@ -61,6 +63,9 @@ CONFIG_SCHEMA = cv.All(
number.NUMBER_SCHEMA.extend(ModbusItemBaseSchema).extend( number.NUMBER_SCHEMA.extend(ModbusItemBaseSchema).extend(
{ {
cv.GenerateID(): cv.declare_id(ModbusNumber), cv.GenerateID(): cv.declare_id(ModbusNumber),
cv.Optional(CONF_REGISTER_TYPE, default="holding"): cv.enum(
MODBUS_WRITE_REGISTER_TYPE
),
cv.Optional(CONF_VALUE_TYPE, default="U_WORD"): cv.enum(SENSOR_VALUE_TYPE), cv.Optional(CONF_VALUE_TYPE, default="U_WORD"): cv.enum(SENSOR_VALUE_TYPE),
cv.Optional(CONF_WRITE_LAMBDA): cv.returning_lambda, cv.Optional(CONF_WRITE_LAMBDA): cv.returning_lambda,
# 24 bits are the maximum value for fp32 before precison is lost # 24 bits are the maximum value for fp32 before precison is lost
@ -81,6 +86,7 @@ async def to_code(config):
byte_offset, reg_count = modbus_calc_properties(config) byte_offset, reg_count = modbus_calc_properties(config)
var = cg.new_Pvariable( var = cg.new_Pvariable(
config[CONF_ID], config[CONF_ID],
config[CONF_REGISTER_TYPE],
config[CONF_ADDRESS], config[CONF_ADDRESS],
byte_offset, byte_offset,
config[CONF_BITMASK], config[CONF_BITMASK],

View File

@ -11,9 +11,9 @@ using value_to_data_t = std::function<float>(float);
class ModbusNumber : public number::Number, public Component, public SensorItem { class ModbusNumber : public number::Number, public Component, public SensorItem {
public: public:
ModbusNumber(uint16_t start_address, uint8_t offset, uint32_t bitmask, SensorValueType value_type, int register_count, ModbusNumber(ModbusRegisterType register_type, uint16_t start_address, uint8_t offset, uint32_t bitmask,
uint8_t skip_updates, bool force_new_range) { SensorValueType value_type, int register_count, uint8_t skip_updates, bool force_new_range) {
this->register_type = ModbusRegisterType::HOLDING; this->register_type = register_type;
this->start_address = start_address; this->start_address = start_address;
this->offset = offset; this->offset = offset;
this->bitmask = bitmask; this->bitmask = bitmask;