From 19e2460af26b3664f787fe044dca0e6b168609c2 Mon Sep 17 00:00:00 2001 From: gotnone Date: Fri, 23 May 2025 04:34:10 -0500 Subject: [PATCH] [modbus_controller] Add assumed_state to switch (#8880) Co-authored-by: Stanley Pinchak Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/modbus_controller/switch/__init__.py | 8 ++++++-- .../components/modbus_controller/switch/modbus_switch.cpp | 4 ++++ .../components/modbus_controller/switch/modbus_switch.h | 3 +++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/esphome/components/modbus_controller/switch/__init__.py b/esphome/components/modbus_controller/switch/__init__.py index 258d87fd25..e325e6198e 100644 --- a/esphome/components/modbus_controller/switch/__init__.py +++ b/esphome/components/modbus_controller/switch/__init__.py @@ -1,7 +1,7 @@ import esphome.codegen as cg from esphome.components import switch import esphome.config_validation as cv -from esphome.const import CONF_ADDRESS, CONF_ID +from esphome.const import CONF_ADDRESS, CONF_ASSUMED_STATE, CONF_ID from .. import ( MODBUS_REGISTER_TYPE, @@ -36,6 +36,7 @@ CONFIG_SCHEMA = cv.All( .extend(ModbusItemBaseSchema) .extend( { + cv.Optional(CONF_ASSUMED_STATE, default=False): cv.boolean, cv.Optional(CONF_REGISTER_TYPE): cv.enum(MODBUS_REGISTER_TYPE), cv.Optional(CONF_USE_WRITE_MULTIPLE, default=False): cv.boolean, cv.Optional(CONF_WRITE_LAMBDA): cv.returning_lambda, @@ -62,7 +63,10 @@ async def to_code(config): paren = await cg.get_variable(config[CONF_MODBUS_CONTROLLER_ID]) cg.add(var.set_parent(paren)) cg.add(var.set_use_write_mutiple(config[CONF_USE_WRITE_MULTIPLE])) - cg.add(paren.add_sensor_item(var)) + assumed_state = config[CONF_ASSUMED_STATE] + cg.add(var.set_assumed_state(assumed_state)) + if not assumed_state: + cg.add(paren.add_sensor_item(var)) if CONF_WRITE_LAMBDA in config: template_ = await cg.process_lambda( config[CONF_WRITE_LAMBDA], diff --git a/esphome/components/modbus_controller/switch/modbus_switch.cpp b/esphome/components/modbus_controller/switch/modbus_switch.cpp index b729e2659f..21c4c1718d 100644 --- a/esphome/components/modbus_controller/switch/modbus_switch.cpp +++ b/esphome/components/modbus_controller/switch/modbus_switch.cpp @@ -19,6 +19,10 @@ void ModbusSwitch::setup() { } void ModbusSwitch::dump_config() { LOG_SWITCH(TAG, "Modbus Controller Switch", this); } +void ModbusSwitch::set_assumed_state(bool assumed_state) { this->assumed_state_ = assumed_state; } + +bool ModbusSwitch::assumed_state() { return this->assumed_state_; } + void ModbusSwitch::parse_and_publish(const std::vector &data) { bool value = false; switch (this->register_type) { diff --git a/esphome/components/modbus_controller/switch/modbus_switch.h b/esphome/components/modbus_controller/switch/modbus_switch.h index fe4b7c1ad5..0098076ef4 100644 --- a/esphome/components/modbus_controller/switch/modbus_switch.h +++ b/esphome/components/modbus_controller/switch/modbus_switch.h @@ -29,6 +29,7 @@ class ModbusSwitch : public Component, public switch_::Switch, public SensorItem void setup() override; void write_state(bool state) override; void dump_config() override; + void set_assumed_state(bool assumed_state); void set_state(bool state) { this->state = state; } void parse_and_publish(const std::vector &data) override; void set_parent(ModbusController *parent) { this->parent_ = parent; } @@ -40,10 +41,12 @@ class ModbusSwitch : public Component, public switch_::Switch, public SensorItem void set_use_write_mutiple(bool use_write_multiple) { this->use_write_multiple_ = use_write_multiple; } protected: + bool assumed_state() override; ModbusController *parent_{nullptr}; bool use_write_multiple_{false}; optional publish_transform_func_{nullopt}; optional write_transform_func_{nullopt}; + bool assumed_state_{false}; }; } // namespace modbus_controller