diff --git a/esphome/components/atm90e32/atm90e32.cpp b/esphome/components/atm90e32/atm90e32.cpp index 9fb32e2f021..ab027645bc5 100644 --- a/esphome/components/atm90e32/atm90e32.cpp +++ b/esphome/components/atm90e32/atm90e32.cpp @@ -637,6 +637,18 @@ float ATM90E32Component::get_chip_temperature_() { return (float) ctemp; } +void ATM90E32Component::press_calibration_button(EntityBase *entity, void (ATM90E32Component::*action)(), + const LogString *hint, const LogString *hint2) { + ESP_LOGI(TAG, "%s", entity->get_name().c_str()); + if (hint != nullptr) { + ESP_LOGI(TAG, "%s", LOG_STR_ARG(hint)); + } + if (hint2 != nullptr) { + ESP_LOGI(TAG, "%s", LOG_STR_ARG(hint2)); + } + (this->*action)(); +} + void ATM90E32Component::run_gain_calibrations() { const char *cs = this->get_calibration_id_(); if (!this->enable_gain_calibration_) { diff --git a/esphome/components/atm90e32/atm90e32.h b/esphome/components/atm90e32/atm90e32.h index fe7d903962f..388d4e3ac47 100644 --- a/esphome/components/atm90e32/atm90e32.h +++ b/esphome/components/atm90e32/atm90e32.h @@ -139,6 +139,9 @@ class ATM90E32Component final : public PollingComponent, int16_t calibrate_offset(uint8_t phase, bool voltage); int16_t calibrate_power_offset(uint8_t phase, bool reactive); void run_gain_calibrations(); + // Body of the calibration buttons: logs the button name and the hint lines, then runs action. + void press_calibration_button(EntityBase *entity, void (ATM90E32Component::*action)(), + const LogString *hint = nullptr, const LogString *hint2 = nullptr); #ifdef USE_NUMBER void set_reference_voltage(uint8_t phase, number::Number *ref_voltage) { ref_voltages_[phase] = ref_voltage; } void set_reference_current(uint8_t phase, number::Number *ref_current) { ref_currents_[phase] = ref_current; } diff --git a/esphome/components/atm90e32/button/__init__.py b/esphome/components/atm90e32/button/__init__.py index 274cce6adbb..cd252f3bf84 100644 --- a/esphome/components/atm90e32/button/__init__.py +++ b/esphome/components/atm90e32/button/__init__.py @@ -4,7 +4,6 @@ import esphome.config_validation as cv from esphome.const import CONF_ID, ENTITY_CATEGORY_CONFIG, ICON_SCALE from esphome.types import ConfigType -from .. import atm90e32_ns from ..sensor import ATM90E32Component CONF_RUN_GAIN_CALIBRATION = "run_gain_calibration" @@ -14,83 +13,68 @@ CONF_CLEAR_OFFSET_CALIBRATION = "clear_offset_calibration" CONF_RUN_POWER_OFFSET_CALIBRATION = "run_power_offset_calibration" CONF_CLEAR_POWER_OFFSET_CALIBRATION = "clear_power_offset_calibration" -ATM90E32GainCalibrationButton = atm90e32_ns.class_( - "ATM90E32GainCalibrationButton", button.Button -) -ATM90E32ClearGainCalibrationButton = atm90e32_ns.class_( - "ATM90E32ClearGainCalibrationButton", button.Button -) -ATM90E32OffsetCalibrationButton = atm90e32_ns.class_( - "ATM90E32OffsetCalibrationButton", button.Button -) -ATM90E32ClearOffsetCalibrationButton = atm90e32_ns.class_( - "ATM90E32ClearOffsetCalibrationButton", button.Button -) -ATM90E32PowerOffsetCalibrationButton = atm90e32_ns.class_( - "ATM90E32PowerOffsetCalibrationButton", button.Button -) -ATM90E32ClearPowerOffsetCalibrationButton = atm90e32_ns.class_( - "ATM90E32ClearPowerOffsetCalibrationButton", button.Button -) + +def _calibration_button(icon: str) -> cv.Schema: + return button.button_schema( + button.ApplyButton, entity_category=ENTITY_CATEGORY_CONFIG, icon=icon + ) + CONFIG_SCHEMA = { cv.GenerateID(CONF_ID): cv.use_id(ATM90E32Component), - cv.Optional(CONF_RUN_GAIN_CALIBRATION): button.button_schema( - ATM90E32GainCalibrationButton, - entity_category=ENTITY_CATEGORY_CONFIG, - icon="mdi:scale-balance", - ), - cv.Optional(CONF_CLEAR_GAIN_CALIBRATION): button.button_schema( - ATM90E32ClearGainCalibrationButton, - entity_category=ENTITY_CATEGORY_CONFIG, - icon="mdi:delete", - ), - cv.Optional(CONF_RUN_OFFSET_CALIBRATION): button.button_schema( - ATM90E32OffsetCalibrationButton, - entity_category=ENTITY_CATEGORY_CONFIG, - icon=ICON_SCALE, - ), - cv.Optional(CONF_CLEAR_OFFSET_CALIBRATION): button.button_schema( - ATM90E32ClearOffsetCalibrationButton, - entity_category=ENTITY_CATEGORY_CONFIG, - icon="mdi:delete", - ), - cv.Optional(CONF_RUN_POWER_OFFSET_CALIBRATION): button.button_schema( - ATM90E32PowerOffsetCalibrationButton, - entity_category=ENTITY_CATEGORY_CONFIG, - icon=ICON_SCALE, - ), - cv.Optional(CONF_CLEAR_POWER_OFFSET_CALIBRATION): button.button_schema( - ATM90E32ClearPowerOffsetCalibrationButton, - entity_category=ENTITY_CATEGORY_CONFIG, - icon="mdi:delete", - ), + cv.Optional(CONF_RUN_GAIN_CALIBRATION): _calibration_button("mdi:scale-balance"), + cv.Optional(CONF_CLEAR_GAIN_CALIBRATION): _calibration_button("mdi:delete"), + cv.Optional(CONF_RUN_OFFSET_CALIBRATION): _calibration_button(ICON_SCALE), + cv.Optional(CONF_CLEAR_OFFSET_CALIBRATION): _calibration_button("mdi:delete"), + cv.Optional(CONF_RUN_POWER_OFFSET_CALIBRATION): _calibration_button(ICON_SCALE), + cv.Optional(CONF_CLEAR_POWER_OFFSET_CALIBRATION): _calibration_button("mdi:delete"), } +def _press(action: str, hint: str | None = None, hint2: str | None = None) -> str: + """press_calibration_button() logs at most two hint lines.""" + args = "".join( + f", {cg.LogStringLiteral(h)}" for h in (hint, hint2) if h is not None + ) + return f"press_calibration_button(entity, &{ATM90E32Component}::{action}{args})" + + async def to_code(config: ConfigType) -> None: - parent = await cg.get_variable(config[CONF_ID]) - - if run_gain := config.get(CONF_RUN_GAIN_CALIBRATION): - b = await button.new_button(run_gain) - await cg.register_parented(b, parent) - - if clear_gain := config.get(CONF_CLEAR_GAIN_CALIBRATION): - b = await button.new_button(clear_gain) - await cg.register_parented(b, parent) - - if run_offset := config.get(CONF_RUN_OFFSET_CALIBRATION): - b = await button.new_button(run_offset) - await cg.register_parented(b, parent) - - if clear_offset := config.get(CONF_CLEAR_OFFSET_CALIBRATION): - b = await button.new_button(clear_offset) - await cg.register_parented(b, parent) - - if run_power := config.get(CONF_RUN_POWER_OFFSET_CALIBRATION): - b = await button.new_button(run_power) - await cg.register_parented(b, parent) - - if clear_power := config.get(CONF_CLEAR_POWER_OFFSET_CALIBRATION): - b = await button.new_button(clear_power) - await cg.register_parented(b, parent) + buttons = button.sub_buttons(config, parent=config[CONF_ID]) + await buttons( + CONF_RUN_GAIN_CALIBRATION, + None, + apply=_press( + "run_gain_calibrations", + "[CALIBRATION] Use gain_ct: & gain_voltage: under each phase_x: in your config file to save these values", + ), + ) + await buttons( + CONF_CLEAR_GAIN_CALIBRATION, None, apply=_press("clear_gain_calibrations") + ) + await buttons( + CONF_RUN_OFFSET_CALIBRATION, + None, + apply=_press( + "run_offset_calibrations", + "[CALIBRATION] **NOTE: CTs and ACVs must be 0 during this process. USB power only**", + "[CALIBRATION] Use offset_voltage: & offset_current: under each phase_x: in your config file to save these values", + ), + ) + await buttons( + CONF_CLEAR_OFFSET_CALIBRATION, None, apply=_press("clear_offset_calibrations") + ) + await buttons( + CONF_RUN_POWER_OFFSET_CALIBRATION, + None, + apply=_press( + "run_power_offset_calibrations", + "[CALIBRATION] **NOTE: CTs must be 0 during this process. Voltage reference should be present**", + "[CALIBRATION] Use offset_active_power: & offset_reactive_power: under each phase_x: in your config file to save these values", + ), + ) + await buttons( + CONF_CLEAR_POWER_OFFSET_CALIBRATION, + None, + apply=_press("clear_power_offset_calibrations"), + ) diff --git a/esphome/components/atm90e32/button/atm90e32_button.cpp b/esphome/components/atm90e32/button/atm90e32_button.cpp deleted file mode 100644 index 03871495214..00000000000 --- a/esphome/components/atm90e32/button/atm90e32_button.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "atm90e32_button.h" -#include "esphome/core/component.h" -#include "esphome/core/log.h" - -namespace esphome::atm90e32 { - -ESPHOME_LOG_TAG(TAG, "atm90e32.button"); - -void ATM90E32GainCalibrationButton::press_action() { - if (this->parent_ == nullptr) { - ESP_LOGW(TAG, "[CALIBRATION] No meters assigned to Gain Calibration button [%s]", this->get_name().c_str()); - return; - } - - ESP_LOGI(TAG, "%s", this->get_name().c_str()); - ESP_LOGI(TAG, - "[CALIBRATION] Use gain_ct: & gain_voltage: under each phase_x: in your config file to save these values"); - this->parent_->run_gain_calibrations(); -} - -void ATM90E32ClearGainCalibrationButton::press_action() { - if (this->parent_ == nullptr) { - ESP_LOGW(TAG, "[CALIBRATION] No meters assigned to Clear Gain button [%s]", this->get_name().c_str()); - return; - } - - ESP_LOGI(TAG, "%s", this->get_name().c_str()); - this->parent_->clear_gain_calibrations(); -} - -void ATM90E32OffsetCalibrationButton::press_action() { - if (this->parent_ == nullptr) { - ESP_LOGW(TAG, "[CALIBRATION] No meters assigned to Offset Calibration button [%s]", this->get_name().c_str()); - return; - } - - ESP_LOGI(TAG, "%s", this->get_name().c_str()); - ESP_LOGI(TAG, "[CALIBRATION] **NOTE: CTs and ACVs must be 0 during this process. USB power only**"); - ESP_LOGI(TAG, "[CALIBRATION] Use offset_voltage: & offset_current: under each phase_x: in your config file to save " - "these values"); - this->parent_->run_offset_calibrations(); -} - -void ATM90E32ClearOffsetCalibrationButton::press_action() { - if (this->parent_ == nullptr) { - ESP_LOGW(TAG, "[CALIBRATION] No meters assigned to Clear Offset button [%s]", this->get_name().c_str()); - return; - } - - ESP_LOGI(TAG, "%s", this->get_name().c_str()); - this->parent_->clear_offset_calibrations(); -} - -void ATM90E32PowerOffsetCalibrationButton::press_action() { - if (this->parent_ == nullptr) { - ESP_LOGW(TAG, "[CALIBRATION] No meters assigned to Power Calibration button [%s]", this->get_name().c_str()); - return; - } - - ESP_LOGI(TAG, "%s", this->get_name().c_str()); - ESP_LOGI(TAG, "[CALIBRATION] **NOTE: CTs must be 0 during this process. Voltage reference should be present**"); - ESP_LOGI(TAG, "[CALIBRATION] Use offset_active_power: & offset_reactive_power: under each phase_x: in your config " - "file to save these values"); - this->parent_->run_power_offset_calibrations(); -} - -void ATM90E32ClearPowerOffsetCalibrationButton::press_action() { - if (this->parent_ == nullptr) { - ESP_LOGW(TAG, "[CALIBRATION] No meters assigned to Clear Power button [%s]", this->get_name().c_str()); - return; - } - - ESP_LOGI(TAG, "%s", this->get_name().c_str()); - this->parent_->clear_power_offset_calibrations(); -} - -} // namespace esphome::atm90e32 diff --git a/esphome/components/atm90e32/button/atm90e32_button.h b/esphome/components/atm90e32/button/atm90e32_button.h deleted file mode 100644 index 988c6d5c167..00000000000 --- a/esphome/components/atm90e32/button/atm90e32_button.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once - -#include "esphome/core/component.h" -#include "esphome/components/atm90e32/atm90e32.h" -#include "esphome/components/button/button.h" - -namespace esphome::atm90e32 { - -class ATM90E32GainCalibrationButton final : public button::Button, public Parented { - public: - ATM90E32GainCalibrationButton() = default; - - protected: - void press_action() override; -}; - -class ATM90E32ClearGainCalibrationButton final : public button::Button, public Parented { - public: - ATM90E32ClearGainCalibrationButton() = default; - - protected: - void press_action() override; -}; - -class ATM90E32OffsetCalibrationButton final : public button::Button, public Parented { - public: - ATM90E32OffsetCalibrationButton() = default; - - protected: - void press_action() override; -}; - -class ATM90E32ClearOffsetCalibrationButton final : public button::Button, public Parented { - public: - ATM90E32ClearOffsetCalibrationButton() = default; - - protected: - void press_action() override; -}; - -class ATM90E32PowerOffsetCalibrationButton final : public button::Button, public Parented { - public: - ATM90E32PowerOffsetCalibrationButton() = default; - - protected: - void press_action() override; -}; - -class ATM90E32ClearPowerOffsetCalibrationButton final : public button::Button, public Parented { - public: - ATM90E32ClearPowerOffsetCalibrationButton() = default; - - protected: - void press_action() override; -}; - -} // namespace esphome::atm90e32