diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a695689..72d46dd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,4 +26,3 @@ repos: rev: v1.3.5 hooks: - id: clang-format - - id: clang-tidy diff --git a/components/jnge_mppt_controller/__init__.py b/components/jnge_mppt_controller/__init__.py index c41930b..4450d6b 100644 --- a/components/jnge_mppt_controller/__init__.py +++ b/components/jnge_mppt_controller/__init__.py @@ -3,7 +3,14 @@ from esphome.components import jnge_modbus from esphome.const import CONF_ID -AUTO_LOAD = ["jnge_modbus", "binary_sensor", "sensor", "switch", "text_sensor"] +AUTO_LOAD = [ + "jnge_modbus", + "binary_sensor", + "number", + "sensor", + "switch", + "text_sensor", +] CODEOWNERS = ["@syssi"] MULTI_CONF = True @@ -11,11 +18,19 @@ CONF_ENABLE_FAKE_TRAFFIC = "enable_fake_traffic" CONF_SUPPRESS_BATTERY_TEMPERATURE_ERRORS = "suppress_battery_temperature_errors" +UNIT_HOURS = "h" + jnge_mppt_controller_ns = cg.esphome_ns.namespace("jnge_mppt_controller") JngeMpptController = jnge_mppt_controller_ns.class_( "JngeMpptController", cg.PollingComponent, jnge_modbus.JngeModbusDevice ) +JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA = cv.Schema( + { + cv.GenerateID(CONF_JNGE_MPPT_CONTROLLER_ID): cv.use_id(JngeMpptController), + } +) + CONFIG_SCHEMA = ( cv.Schema( { diff --git a/components/jnge_mppt_controller/binary_sensor.py b/components/jnge_mppt_controller/binary_sensor.py index ec406c8..ed4fea8 100644 --- a/components/jnge_mppt_controller/binary_sensor.py +++ b/components/jnge_mppt_controller/binary_sensor.py @@ -1,9 +1,17 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import binary_sensor -from esphome.const import CONF_ICON, CONF_ID +from esphome.const import ( + CONF_ICON, + CONF_ID, + CONF_ENTITY_CATEGORY, + ENTITY_CATEGORY_DIAGNOSTIC, +) -from . import CONF_JNGE_MPPT_CONTROLLER_ID, JngeMpptController +from . import ( + CONF_JNGE_MPPT_CONTROLLER_ID, + JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA, +) from .const import CONF_CHARGING, CONF_LOAD DEPENDENCIES = ["jnge_mppt_controller"] @@ -26,31 +34,42 @@ CONF_CHARGING, ] -CONFIG_SCHEMA = cv.Schema( +CONFIG_SCHEMA = JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA.extend( { - cv.GenerateID(CONF_JNGE_MPPT_CONTROLLER_ID): cv.use_id(JngeMpptController), cv.Optional(CONF_LOAD_DETECTED): binary_sensor.BINARY_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor), cv.Optional(CONF_ICON, default=ICON_LOAD_DETECTED): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, } ), cv.Optional(CONF_FAN_RUNNING): binary_sensor.BINARY_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor), cv.Optional(CONF_ICON, default=ICON_FAN_RUNNING): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, } ), cv.Optional(CONF_LOAD): binary_sensor.BINARY_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor), cv.Optional(CONF_ICON, default=ICON_LOAD): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, } ), cv.Optional(CONF_CHARGING): binary_sensor.BINARY_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(binary_sensor.BinarySensor), cv.Optional(CONF_ICON, default=ICON_CHARGING): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, } ), } diff --git a/components/jnge_mppt_controller/jnge_mppt_controller.cpp b/components/jnge_mppt_controller/jnge_mppt_controller.cpp index 543c328..221522b 100644 --- a/components/jnge_mppt_controller/jnge_mppt_controller.cpp +++ b/components/jnge_mppt_controller/jnge_mppt_controller.cpp @@ -335,39 +335,51 @@ void JngeMpptController::on_configuration_data_(const std::vector &data // // 0x1024: Overvoltage 2 bytes 0.1 V this->publish_state_(this->battery_overvoltage_sensor_, (float) jnge_get_16bit(0) * 0.1f); + this->publish_state_(this->battery_overvoltage_number_, (float) jnge_get_16bit(0) * 0.1f); // 0x1025: Charging limit voltage 2 bytes 0.1 V this->publish_state_(this->charging_limit_voltage_sensor_, (float) jnge_get_16bit(2) * 0.1f); + this->publish_state_(this->charging_limit_voltage_number_, (float) jnge_get_16bit(2) * 0.1f); // 0x1026: Overvoltage recovery 2 bytes 0.1 V this->publish_state_(this->battery_overvoltage_recovery_sensor_, (float) jnge_get_16bit(4) * 0.1f); + this->publish_state_(this->battery_overvoltage_recovery_number_, (float) jnge_get_16bit(4) * 0.1f); // 0x1027: Equalizing charging voltage 2 bytes 0.1 V this->publish_state_(this->equalizing_charging_voltage_sensor_, (float) jnge_get_16bit(6) * 0.1f); + this->publish_state_(this->equalizing_charging_voltage_number_, (float) jnge_get_16bit(6) * 0.1f); // 0x1028: Boost charging voltage 2 bytes 0.1 V this->publish_state_(this->boost_charging_voltage_sensor_, (float) jnge_get_16bit(8) * 0.1f); + this->publish_state_(this->boost_charging_voltage_number_, (float) jnge_get_16bit(8) * 0.1f); // 0x1029: Boost charging return voltage 2 bytes 0.1 V this->publish_state_(this->boost_charging_return_voltage_sensor_, (float) jnge_get_16bit(10) * 0.1f); + this->publish_state_(this->boost_charging_return_voltage_number_, (float) jnge_get_16bit(10) * 0.1f); // 0x102A: Floating charge voltage 2 bytes 0.1 V this->publish_state_(this->floating_charge_voltage_sensor_, (float) jnge_get_16bit(12) * 0.1f); + this->publish_state_(this->floating_charge_voltage_number_, (float) jnge_get_16bit(12) * 0.1f); // 0x102B: Over discharge voltage 2 bytes 0.1 V this->publish_state_(this->over_discharge_voltage_sensor_, (float) jnge_get_16bit(14) * 0.1f); + this->publish_state_(this->over_discharge_voltage_number_, (float) jnge_get_16bit(14) * 0.1f); // 0x102C: Over discharge recovery voltage 2 bytes 0.1 V this->publish_state_(this->over_discharge_recovery_voltage_sensor_, (float) jnge_get_16bit(16) * 0.1f); + this->publish_state_(this->over_discharge_recovery_voltage_number_, (float) jnge_get_16bit(16) * 0.1f); // 0x102D: Battery undervoltage 2 bytes 0.1 V this->publish_state_(this->battery_undervoltage_sensor_, (float) jnge_get_16bit(18) * 0.1f); + this->publish_state_(this->battery_undervoltage_number_, (float) jnge_get_16bit(18) * 0.1f); // 0x102E: Equalization charging time 2 bytes 1 H 1~3 H this->publish_state_(this->equalization_charging_time_sensor_, (float) jnge_get_16bit(20)); + this->publish_state_(this->equalization_charging_time_number_, (float) jnge_get_16bit(20)); // 0x102F: Improve charging time 2 bytes 1 H 1~3 H this->publish_state_(this->improve_charging_time_sensor_, (float) jnge_get_16bit(22)); + this->publish_state_(this->improve_charging_time_number_, (float) jnge_get_16bit(22)); // 0x1030: Temperature compensation coefficient 2 bytes 0~6 mV/°C/2V this->publish_state_(this->temperature_compensation_coefficient_sensor_, (float) jnge_get_16bit(24)); @@ -377,21 +389,26 @@ void JngeMpptController::on_configuration_data_(const std::vector &data // 0x1032: Light control on voltage 2 bytes 0.1 V 5~11V this->publish_state_(this->light_control_on_voltage_sensor_, (float) jnge_get_16bit(28) * 0.1f); + this->publish_state_(this->light_control_on_voltage_number_, (float) jnge_get_16bit(28) * 0.1f); // 0x1033: Light control off voltage 2 bytes 0.1 V 5~11V this->publish_state_(this->light_control_off_voltage_sensor_, (float) jnge_get_16bit(30) * 0.1f); + this->publish_state_(this->light_control_off_voltage_number_, (float) jnge_get_16bit(30) * 0.1f); // 0x1034: Light control on period 1 2 bytes 1 H this->publish_state_(this->light_control_on_period_1_sensor_, (float) jnge_get_16bit(32)); + this->publish_state_(this->light_control_on_period_1_number_, (float) jnge_get_16bit(32)); // 0x1035: Light control on period 2 2 bytes 1 H this->publish_state_(this->light_control_on_period_2_sensor_, (float) jnge_get_16bit(34)); + this->publish_state_(this->light_control_on_period_2_number_, (float) jnge_get_16bit(34)); // 0x1036: Household or street light mode 2 bytes 0 (Household), 1 (Street light) this->publish_state_(this->street_light_mode_switch_, (bool) (jnge_get_16bit(36) == 0x01)); // 0x1037: Turn the load off 2 bytes 1 H this->publish_state_(this->load_turn_off_time_sensor_, (float) jnge_get_16bit(38)); + this->publish_state_(this->load_turn_off_time_number_, (float) jnge_get_16bit(38)); // 0x1038: Charging on/off 2 bytes 0 (Charger off), 1 (Charger on) this->publish_state_(this->charging_switch_, (bool) (jnge_get_16bit(40) == 0x01)); @@ -400,7 +417,7 @@ void JngeMpptController::on_configuration_data_(const std::vector &data this->publish_state_(this->buzzer_switch_, (bool) (jnge_get_16bit(42) == 0x01)); // 0x103A: Number of battery strings 2 bytes - // this->publish_state_(this->battery_strings_number_, (float) jnge_get_16bit(44)); + this->publish_state_(this->battery_strings_number_, (float) jnge_get_16bit(44)); // 0x103B: Battery Type 2 bytes 0 (Lead-acid), 1 (gel), 2 (ternary lithium), // 3 (LiFePo4), 4 (Custom) @@ -458,6 +475,13 @@ void JngeMpptController::publish_state_(binary_sensor::BinarySensor *binary_sens binary_sensor->publish_state(state); } +void JngeMpptController::publish_state_(number::Number *number, const float &state) { + if (number == nullptr) + return; + + number->publish_state(state); +} + void JngeMpptController::publish_state_(sensor::Sensor *sensor, float value) { if (sensor == nullptr) return; diff --git a/components/jnge_mppt_controller/jnge_mppt_controller.h b/components/jnge_mppt_controller/jnge_mppt_controller.h index dba9ad1..895d675 100644 --- a/components/jnge_mppt_controller/jnge_mppt_controller.h +++ b/components/jnge_mppt_controller/jnge_mppt_controller.h @@ -2,6 +2,7 @@ #include "esphome/core/component.h" #include "esphome/components/binary_sensor/binary_sensor.h" +#include "esphome/components/number/number.h" #include "esphome/components/sensor/sensor.h" #include "esphome/components/switch/switch.h" #include "esphome/components/text_sensor/text_sensor.h" @@ -148,6 +149,67 @@ class JngeMpptController : public PollingComponent, public jnge_modbus::JngeModb load_turn_off_time_sensor_ = load_turn_off_time_sensor; } + void set_battery_overvoltage_number(number::Number *battery_overvoltage_number) { + battery_overvoltage_number_ = battery_overvoltage_number; + } + void set_charging_limit_voltage_number(number::Number *charging_limit_voltage_number) { + charging_limit_voltage_number_ = charging_limit_voltage_number; + } + void set_battery_overvoltage_recovery_number(number::Number *battery_overvoltage_recovery_number) { + battery_overvoltage_recovery_number_ = battery_overvoltage_recovery_number; + } + void set_equalizing_charging_voltage_number(number::Number *equalizing_charging_voltage_number) { + equalizing_charging_voltage_number_ = equalizing_charging_voltage_number; + } + void set_boost_charging_voltage_number(number::Number *boost_charging_voltage_number) { + boost_charging_voltage_number_ = boost_charging_voltage_number; + } + void set_boost_charging_return_voltage_number(number::Number *boost_charging_return_voltage_number) { + boost_charging_return_voltage_number_ = boost_charging_return_voltage_number; + } + void set_floating_charge_voltage_number(number::Number *floating_charge_voltage_number) { + floating_charge_voltage_number_ = floating_charge_voltage_number; + } + void set_over_discharge_voltage_number(number::Number *over_discharge_voltage_number) { + over_discharge_voltage_number_ = over_discharge_voltage_number; + } + void set_over_discharge_recovery_voltage_number(number::Number *over_discharge_recovery_voltage_number) { + over_discharge_recovery_voltage_number_ = over_discharge_recovery_voltage_number; + } + void set_battery_undervoltage_number(number::Number *battery_undervoltage_number) { + battery_undervoltage_number_ = battery_undervoltage_number; + } + void set_equalization_charging_time_number(number::Number *equalization_charging_time_number) { + equalization_charging_time_number_ = equalization_charging_time_number; + } + void set_improve_charging_time_number(number::Number *improve_charging_time_number) { + improve_charging_time_number_ = improve_charging_time_number; + } + void set_temperature_compensation_coefficient_number(number::Number *temperature_compensation_coefficient_number) { + temperature_compensation_coefficient_number_ = temperature_compensation_coefficient_number; + } + void set_device_address_number(number::Number *device_address_number) { + device_address_number_ = device_address_number; + } + void set_light_control_on_voltage_number(number::Number *light_control_on_voltage_number) { + light_control_on_voltage_number_ = light_control_on_voltage_number; + } + void set_light_control_off_voltage_number(number::Number *light_control_off_voltage_number) { + light_control_off_voltage_number_ = light_control_off_voltage_number; + } + void set_light_control_on_period_1_number(number::Number *light_control_on_period_1_number) { + light_control_on_period_1_number_ = light_control_on_period_1_number; + } + void set_light_control_on_period_2_number(number::Number *light_control_on_period_2_number) { + light_control_on_period_2_number_ = light_control_on_period_2_number; + } + void set_load_turn_off_time_number(number::Number *load_turn_off_time_number) { + load_turn_off_time_number_ = load_turn_off_time_number; + } + void set_battery_strings_number(number::Number *battery_strings_number) { + battery_strings_number_ = battery_strings_number; + } + void set_operation_mode_text_sensor(text_sensor::TextSensor *operation_mode_text_sensor) { operation_mode_text_sensor_ = operation_mode_text_sensor; } @@ -228,6 +290,27 @@ class JngeMpptController : public PollingComponent, public jnge_modbus::JngeModb sensor::Sensor *light_control_on_period_2_sensor_; sensor::Sensor *load_turn_off_time_sensor_; + number::Number *battery_overvoltage_number_; + number::Number *charging_limit_voltage_number_; + number::Number *battery_overvoltage_recovery_number_; + number::Number *equalizing_charging_voltage_number_; + number::Number *boost_charging_voltage_number_; + number::Number *boost_charging_return_voltage_number_; + number::Number *floating_charge_voltage_number_; + number::Number *over_discharge_voltage_number_; + number::Number *over_discharge_recovery_voltage_number_; + number::Number *battery_undervoltage_number_; + number::Number *equalization_charging_time_number_; + number::Number *improve_charging_time_number_; + number::Number *temperature_compensation_coefficient_number_; + number::Number *device_address_number_; + number::Number *light_control_on_voltage_number_; + number::Number *light_control_off_voltage_number_; + number::Number *light_control_on_period_1_number_; + number::Number *light_control_on_period_2_number_; + number::Number *load_turn_off_time_number_; + number::Number *battery_strings_number_; + switch_::Switch *buzzer_switch_; switch_::Switch *street_light_mode_switch_; switch_::Switch *charging_switch_; @@ -247,6 +330,7 @@ class JngeMpptController : public PollingComponent, public jnge_modbus::JngeModb void publish_state_(text_sensor::TextSensor *text_sensor, const std::string &state); void publish_state_(binary_sensor::BinarySensor *binary_sensor, const bool &state); void publish_state_(switch_::Switch *obj, const bool &state); + void publish_state_(number::Number *number, const float &state); std::string error_bits_to_string_(uint16_t bitmask); }; diff --git a/components/jnge_mppt_controller/number/__init__.py b/components/jnge_mppt_controller/number/__init__.py new file mode 100644 index 0000000..40fa5d8 --- /dev/null +++ b/components/jnge_mppt_controller/number/__init__.py @@ -0,0 +1,243 @@ +import esphome.codegen as cg +from esphome.components import number +import esphome.config_validation as cv +from esphome.const import ( + CONF_ENTITY_CATEGORY, + CONF_ICON, + CONF_ID, + CONF_MODE, + CONF_MAX_VALUE, + CONF_MIN_VALUE, + CONF_STEP, + CONF_UNIT_OF_MEASUREMENT, + ICON_EMPTY, + UNIT_VOLT, + UNIT_EMPTY, + ENTITY_CATEGORY_CONFIG, +) + +from .. import ( + CONF_JNGE_MPPT_CONTROLLER_ID, + JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA, + UNIT_HOURS, + jnge_mppt_controller_ns, +) + +DEPENDENCIES = ["jnge_mppt_controller"] + +CODEOWNERS = ["@syssi"] + +DEFAULT_STEP = 1 + +CONF_BATTERY_OVERVOLTAGE = "battery_overvoltage" +CONF_CHARGING_LIMIT_VOLTAGE = "charging_limit_voltage" +CONF_BATTERY_OVERVOLTAGE_RECOVERY = "battery_overvoltage_recovery" +CONF_EQUALIZING_CHARGING_VOLTAGE = "equalizing_charging_voltage" +CONF_BOOST_CHARGING_VOLTAGE = "boost_charging_voltage" +CONF_BOOST_CHARGING_RETURN_VOLTAGE = "boost_charging_return_voltage" +CONF_FLOATING_CHARGE_VOLTAGE = "floating_charge_voltage" +CONF_OVER_DISCHARGE_VOLTAGE = "over_discharge_voltage" +CONF_OVER_DISCHARGE_RECOVERY_VOLTAGE = "over_discharge_recovery_voltage" +CONF_BATTERY_UNDERVOLTAGE = "battery_undervoltage" +CONF_EQUALIZATION_CHARGING_TIME = "equalization_charging_time" +CONF_IMPROVE_CHARGING_TIME = "improve_charging_time" +CONF_LIGHT_CONTROL_ON_VOLTAGE = "light_control_on_voltage" +CONF_LIGHT_CONTROL_OFF_VOLTAGE = "light_control_off_voltage" +CONF_LIGHT_CONTROL_ON_PERIOD_1 = "light_control_on_period_1" +CONF_LIGHT_CONTROL_ON_PERIOD_2 = "light_control_on_period_2" +CONF_LOAD_TURN_OFF_TIME = "load_turn_off_time" +CONF_BATTERY_STRINGS = "battery_strings" + +NUMBERS = { + CONF_BATTERY_OVERVOLTAGE: 0x1024, # 12-18V, 28-36V, 56-62V, 112-144V + CONF_CHARGING_LIMIT_VOLTAGE: 0x1025, # 12.9-16.9V, 25.7-33.7V, 51.6-62V, 103-105V + CONF_BATTERY_OVERVOLTAGE_RECOVERY: 0x1026, # 13-17V, 26-34V, 52-62V, 104-136V + CONF_EQUALIZING_CHARGING_VOLTAGE: 0x1027, # 12.7-16.7V, 25.4-33.4V, 50.8-62V, 102-134V + CONF_BOOST_CHARGING_VOLTAGE: 0x1028, # 12.4-16.4V, 24.8-32.8V, 49.6-62V, 99-131V + CONF_BOOST_CHARGING_RETURN_VOLTAGE: 0x1029, # 11.2-15.2V, 22.4-30.4V, 44.8-62V, 90-122V + CONF_FLOATING_CHARGE_VOLTAGE: 0x102A, # 11.8-15.8V, 23.6-31.6V, 47.2-62V, 94-126V + CONF_OVER_DISCHARGE_VOLTAGE: 0x102B, # 8.8-12.8V, 17.6-25.6V, 35.2-51.2V, 70-102V + CONF_OVER_DISCHARGE_RECOVERY_VOLTAGE: 0x102C, # 11.1-15.1V, 22.2-30.2V, 44.4-60.4V, 89-121V + CONF_BATTERY_UNDERVOLTAGE: 0x102D, + CONF_EQUALIZATION_CHARGING_TIME: 0x102E, # 1/2/3H + CONF_IMPROVE_CHARGING_TIME: 0x102F, # 1/2/3H + CONF_LIGHT_CONTROL_ON_VOLTAGE: 0x1032, # 5-11V + CONF_LIGHT_CONTROL_OFF_VOLTAGE: 0x1033, # 5-11V + CONF_LIGHT_CONTROL_ON_PERIOD_1: 0x1034, # H + CONF_LIGHT_CONTROL_ON_PERIOD_2: 0x1035, # H + CONF_LOAD_TURN_OFF_TIME: 0x1037, # H + CONF_BATTERY_STRINGS: 0x103A, # n +} + +JngeNumber = jnge_mppt_controller_ns.class_("JngeNumber", number.Number, cg.Component) + +JNGENUMBER_SCHEMA = number.NUMBER_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(JngeNumber), + cv.Optional(CONF_ICON, default=ICON_EMPTY): number.icon, + cv.Optional(CONF_STEP, default=0.1): cv.float_, + cv.Optional(CONF_UNIT_OF_MEASUREMENT, default=UNIT_VOLT): cv.string_strict, + cv.Optional(CONF_MODE, default="BOX"): cv.enum(number.NUMBER_MODES, upper=True), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, + } +).extend(cv.COMPONENT_SCHEMA) + +CONFIG_SCHEMA = JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA.extend( + { + cv.Optional(CONF_BATTERY_OVERVOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=56.0): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_CHARGING_LIMIT_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=51.6): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_BATTERY_OVERVOLTAGE_RECOVERY): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=52.0): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_EQUALIZING_CHARGING_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=50.8): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_BOOST_CHARGING_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=49.6): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_BOOST_CHARGING_RETURN_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=44.8): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_FLOATING_CHARGE_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=47.2): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=62.0): cv.float_, + } + ), + cv.Optional(CONF_OVER_DISCHARGE_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=35.2): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=51.2): cv.float_, + } + ), + cv.Optional(CONF_OVER_DISCHARGE_RECOVERY_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=44.4): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=60.4): cv.float_, + } + ), + cv.Optional(CONF_BATTERY_UNDERVOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=32): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=51.2): cv.float_, + } + ), + cv.Optional(CONF_EQUALIZATION_CHARGING_TIME): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=1): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=3): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + cv.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UNIT_HOURS + ): cv.string_strict, + } + ), + cv.Optional(CONF_IMPROVE_CHARGING_TIME): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=1): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=3): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + cv.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UNIT_HOURS + ): cv.string_strict, + } + ), + cv.Optional(CONF_LIGHT_CONTROL_ON_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=5.0): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=11.0): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + } + ), + cv.Optional(CONF_LIGHT_CONTROL_OFF_VOLTAGE): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=5.0): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=11.0): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + } + ), + cv.Optional(CONF_LIGHT_CONTROL_ON_PERIOD_1): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=1): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=24): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + cv.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UNIT_HOURS + ): cv.string_strict, + } + ), + cv.Optional(CONF_LIGHT_CONTROL_ON_PERIOD_2): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=1): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=24): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + cv.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UNIT_HOURS + ): cv.string_strict, + } + ), + cv.Optional(CONF_LOAD_TURN_OFF_TIME): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=1): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=24): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + cv.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UNIT_HOURS + ): cv.string_strict, + } + ), + cv.Optional(CONF_BATTERY_STRINGS): JNGENUMBER_SCHEMA.extend( + { + cv.Optional(CONF_MIN_VALUE, default=1): cv.float_, + cv.Optional(CONF_MAX_VALUE, default=32): cv.float_, + cv.Optional(CONF_STEP, default=1): cv.float_, + cv.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UNIT_EMPTY + ): cv.string_strict, + } + ), + } +) + + +def to_code(config): + hub = yield cg.get_variable(config[CONF_JNGE_MPPT_CONTROLLER_ID]) + for key, address in NUMBERS.items(): + if key in config: + conf = config[key] + var = cg.new_Pvariable(conf[CONF_ID]) + yield cg.register_component(var, conf) + yield number.register_number( + var, + conf, + min_value=conf[CONF_MIN_VALUE], + max_value=conf[CONF_MAX_VALUE], + step=conf[CONF_STEP], + ) + cg.add(getattr(hub, f"set_{key}_number")(var)) + cg.add(var.set_parent(hub)) + cg.add(var.set_holding_register(address)) diff --git a/components/jnge_mppt_controller/number/jnge_number.cpp b/components/jnge_mppt_controller/number/jnge_number.cpp new file mode 100644 index 0000000..98403d9 --- /dev/null +++ b/components/jnge_mppt_controller/number/jnge_number.cpp @@ -0,0 +1,15 @@ +#include "jnge_number.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace jnge_mppt_controller { + +static const char *const TAG = "jnge_mppt_controller.number"; + +void JngeNumber::control(float value) { + this->parent_->write_register(this->holding_register_, (uint16_t)(value * (1 / this->traits.get_step()))); +} +void JngeNumber::dump_config() { LOG_NUMBER(TAG, "JngeMpptController Number", this); } + +} // namespace jnge_mppt_controller +} // namespace esphome diff --git a/components/jnge_mppt_controller/number/jnge_number.h b/components/jnge_mppt_controller/number/jnge_number.h new file mode 100644 index 0000000..6752237 --- /dev/null +++ b/components/jnge_mppt_controller/number/jnge_number.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../jnge_mppt_controller.h" +#include "esphome/core/component.h" +#include "esphome/components/number/number.h" +#include "esphome/core/preferences.h" + +namespace esphome { +namespace jnge_mppt_controller { + +class JngeMpptController; + +class JngeNumber : public number::Number, public Component { + public: + void set_parent(JngeMpptController *parent) { this->parent_ = parent; }; + void set_holding_register(uint16_t holding_register) { this->holding_register_ = holding_register; }; + void dump_config() override; + + protected: + void control(float value) override; + + JngeMpptController *parent_; + uint16_t holding_register_; +}; + +} // namespace jnge_mppt_controller +} // namespace esphome diff --git a/components/jnge_mppt_controller/sensor.py b/components/jnge_mppt_controller/sensor.py index e3623f2..b0cbb1b 100644 --- a/components/jnge_mppt_controller/sensor.py +++ b/components/jnge_mppt_controller/sensor.py @@ -22,9 +22,15 @@ UNIT_PERCENT, UNIT_VOLT, UNIT_WATT, + ENTITY_CATEGORY_DIAGNOSTIC, + ENTITY_CATEGORY_CONFIG, ) -from . import CONF_JNGE_MPPT_CONTROLLER_ID, JngeMpptController +from . import ( + CONF_JNGE_MPPT_CONTROLLER_ID, + JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA, + UNIT_HOURS, +) DEPENDENCIES = ["jnge_mppt_controller"] @@ -127,15 +133,13 @@ ICON_OPERATION_MODE = "mdi:heart-pulse" ICON_DISCHARGE_TIMES = "mdi:counter" -UNIT_HOURS = "h" UNIT_KILO_WATT_HOURS = "kWh" UNIT_MILLIVOLT = "mV" UNIT_MILLIVOLT_PER_CELSIUS = "mV/°C" # pylint: disable=too-many-function-args -CONFIG_SCHEMA = cv.Schema( +CONFIG_SCHEMA = JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA.extend( { - cv.GenerateID(CONF_JNGE_MPPT_CONTROLLER_ID): cv.use_id(JngeMpptController), # status cv.Optional(CONF_FIRMWARE_VERSION): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, @@ -143,6 +147,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_PV_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -150,6 +155,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_BATTERY_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -157,6 +163,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CHANNEL_A_CURRENT): sensor.sensor_schema( unit_of_measurement=UNIT_AMPERE, @@ -164,6 +171,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_CURRENT, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CHANNEL_B_CURRENT): sensor.sensor_schema( unit_of_measurement=UNIT_AMPERE, @@ -171,6 +179,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_CURRENT, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CHARGING_CURRENT): sensor.sensor_schema( unit_of_measurement=UNIT_AMPERE, @@ -178,6 +187,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_CURRENT, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CHARGER_TEMPERATURE): sensor.sensor_schema( unit_of_measurement=UNIT_CELSIUS, @@ -185,6 +195,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_TEMPERATURE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CHARGING_POWER): sensor.sensor_schema( unit_of_measurement=UNIT_WATT, @@ -192,6 +203,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_POWER, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_DISCHARGE_POWER): sensor.sensor_schema( unit_of_measurement=UNIT_WATT, @@ -199,6 +211,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_POWER, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_BATTERY_CAPACITY): sensor.sensor_schema( unit_of_measurement=UNIT_PERCENT, @@ -206,6 +219,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_OPERATION_MODE_ID): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, @@ -213,6 +227,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_DISCHARGE_CURRENT): sensor.sensor_schema( unit_of_measurement=UNIT_AMPERE, @@ -220,6 +235,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_CURRENT, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_DISCHARGE_TIMES): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, @@ -227,6 +243,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_TOTAL_CHARGING_ENERGY): sensor.sensor_schema( unit_of_measurement=UNIT_KILO_WATT_HOURS, @@ -234,6 +251,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_ENERGY, state_class=STATE_CLASS_TOTAL_INCREASING, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_TOTAL_DISCHARGE_ENERGY): sensor.sensor_schema( unit_of_measurement=UNIT_KILO_WATT_HOURS, @@ -241,6 +259,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_ENERGY, state_class=STATE_CLASS_TOTAL_INCREASING, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_BATTERY_TEMPERATURE): sensor.sensor_schema( unit_of_measurement=UNIT_CELSIUS, @@ -248,6 +267,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_TEMPERATURE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_ERROR_BITMASK): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, @@ -255,6 +275,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CONTROLLER_VOLTAGE_LEVEL): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -262,6 +283,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_PV_STANDBY_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -269,6 +291,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional(CONF_CONTROLLER_CURRENT_LEVEL): sensor.sensor_schema( unit_of_measurement=UNIT_AMPERE, @@ -276,6 +299,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_CURRENT, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), cv.Optional( CONF_BATTERY_TEMPERATURE_COMPENSATION_VOLTAGE_POINT @@ -285,6 +309,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, ), # Configuration cv.Optional(CONF_BATTERY_OVERVOLTAGE): sensor.sensor_schema( @@ -293,6 +318,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_CHARGING_LIMIT_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -300,6 +326,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_BATTERY_OVERVOLTAGE_RECOVERY): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -307,6 +334,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_EQUALIZING_CHARGING_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -314,6 +342,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_BOOST_CHARGING_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -321,6 +350,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_BOOST_CHARGING_RETURN_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -328,6 +358,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_FLOATING_CHARGE_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -335,6 +366,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_OVER_DISCHARGE_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -342,6 +374,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_OVER_DISCHARGE_RECOVERY_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -349,6 +382,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_BATTERY_UNDERVOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -356,6 +390,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_EQUALIZATION_CHARGING_TIME): sensor.sensor_schema( unit_of_measurement=UNIT_HOURS, @@ -363,6 +398,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_IMPROVE_CHARGING_TIME): sensor.sensor_schema( unit_of_measurement=UNIT_HOURS, @@ -370,6 +406,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_TEMPERATURE_COMPENSATION_COEFFICIENT): sensor.sensor_schema( unit_of_measurement=UNIT_MILLIVOLT_PER_CELSIUS, # 0~6 mV/°C/2V @@ -377,6 +414,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_DEVICE_ADDRESS): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, @@ -384,6 +422,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_LIGHT_CONTROL_ON_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -391,6 +430,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_LIGHT_CONTROL_OFF_VOLTAGE): sensor.sensor_schema( unit_of_measurement=UNIT_VOLT, @@ -398,6 +438,7 @@ accuracy_decimals=1, device_class=DEVICE_CLASS_VOLTAGE, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_LIGHT_CONTROL_ON_PERIOD_1): sensor.sensor_schema( unit_of_measurement=UNIT_HOURS, @@ -405,6 +446,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_LIGHT_CONTROL_ON_PERIOD_2): sensor.sensor_schema( unit_of_measurement=UNIT_HOURS, @@ -412,6 +454,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_LOAD_TURN_OFF_TIME): sensor.sensor_schema( unit_of_measurement=UNIT_HOURS, @@ -419,6 +462,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), cv.Optional(CONF_BATTERY_STRINGS): sensor.sensor_schema( unit_of_measurement=UNIT_EMPTY, @@ -426,6 +470,7 @@ accuracy_decimals=0, device_class=DEVICE_CLASS_EMPTY, state_class=STATE_CLASS_MEASUREMENT, + entity_category=ENTITY_CATEGORY_CONFIG, ), } ) diff --git a/components/jnge_mppt_controller/switch/__init__.py b/components/jnge_mppt_controller/switch/__init__.py index cdcee4b..d6cb08e 100644 --- a/components/jnge_mppt_controller/switch/__init__.py +++ b/components/jnge_mppt_controller/switch/__init__.py @@ -1,9 +1,18 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import switch -from esphome.const import CONF_ICON, CONF_ID +from esphome.const import ( + CONF_ICON, + CONF_ID, + CONF_ENTITY_CATEGORY, + ENTITY_CATEGORY_CONFIG, +) -from .. import CONF_JNGE_MPPT_CONTROLLER_ID, JngeMpptController, jnge_mppt_controller_ns +from .. import ( + CONF_JNGE_MPPT_CONTROLLER_ID, + JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA, + jnge_mppt_controller_ns, +) from ..const import CONF_CHARGING, CONF_LOAD DEPENDENCIES = ["jnge_mppt_controller"] @@ -27,19 +36,24 @@ JngeSwitch = jnge_mppt_controller_ns.class_("JngeSwitch", switch.Switch, cg.Component) -CONFIG_SCHEMA = cv.Schema( +CONFIG_SCHEMA = JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA.extend( { - cv.GenerateID(CONF_JNGE_MPPT_CONTROLLER_ID): cv.use_id(JngeMpptController), cv.Optional(CONF_BUZZER): switch.SWITCH_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(JngeSwitch), cv.Optional(CONF_ICON, default=ICON_BUZZER): switch.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ).extend(cv.COMPONENT_SCHEMA), cv.Optional(CONF_STREET_LIGHT_MODE): switch.SWITCH_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(JngeSwitch), cv.Optional(CONF_ICON, default=ICON_STREET_LIGHT_MODE): switch.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ).extend(cv.COMPONENT_SCHEMA), cv.Optional(CONF_CHARGING): switch.SWITCH_SCHEMA.extend( diff --git a/components/jnge_mppt_controller/switch/jnge_switch.h b/components/jnge_mppt_controller/switch/jnge_switch.h index 87538df..93c87f9 100644 --- a/components/jnge_mppt_controller/switch/jnge_switch.h +++ b/components/jnge_mppt_controller/switch/jnge_switch.h @@ -8,6 +8,7 @@ namespace esphome { namespace jnge_mppt_controller { class JngeMpptController; + class JngeSwitch : public switch_::Switch, public Component { public: void set_parent(JngeMpptController *parent) { this->parent_ = parent; }; diff --git a/components/jnge_mppt_controller/text_sensor.py b/components/jnge_mppt_controller/text_sensor.py index 0a757d8..9cb15e8 100644 --- a/components/jnge_mppt_controller/text_sensor.py +++ b/components/jnge_mppt_controller/text_sensor.py @@ -1,9 +1,15 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import text_sensor -from esphome.const import CONF_ICON, CONF_ID +from esphome.const import ( + CONF_ICON, + CONF_ID, + ENTITY_CATEGORY_CONFIG, + CONF_ENTITY_CATEGORY, + ENTITY_CATEGORY_DIAGNOSTIC, +) -from . import CONF_JNGE_MPPT_CONTROLLER_ID, JngeMpptController +from . import CONF_JNGE_MPPT_CONTROLLER_ID, JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA DEPENDENCIES = ["jnge_mppt_controller"] @@ -23,25 +29,33 @@ CONF_BATTERY_TYPE, ] -CONFIG_SCHEMA = cv.Schema( +CONFIG_SCHEMA = JNGE_MPPT_CONTROLLER_COMPONENT_SCHEMA.extend( { - cv.GenerateID(CONF_JNGE_MPPT_CONTROLLER_ID): cv.use_id(JngeMpptController), cv.Optional(CONF_OPERATION_MODE): text_sensor.TEXT_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), cv.Optional(CONF_ICON, default=ICON_OPERATION_MODE): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, } ), cv.Optional(CONF_ERRORS): text_sensor.TEXT_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), cv.Optional(CONF_ICON, default=ICON_ERRORS): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_DIAGNOSTIC + ): cv.entity_category, } ), cv.Optional(CONF_BATTERY_TYPE): text_sensor.TEXT_SENSOR_SCHEMA.extend( { cv.GenerateID(): cv.declare_id(text_sensor.TextSensor), cv.Optional(CONF_ICON, default=ICON_BATTERY_TYPE): cv.icon, + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ), } diff --git a/esp32-example-jnge-mppt-controller.yaml b/esp32-example-jnge-mppt-controller.yaml index a859b04..7d88704 100644 --- a/esp32-example-jnge-mppt-controller.yaml +++ b/esp32-example-jnge-mppt-controller.yaml @@ -156,3 +156,42 @@ text_sensor: name: "${status} errors" operation_mode: name: "${status} operation mode" + +number: + - platform: jnge_mppt_controller + battery_overvoltage: + name: "${config} battery overvoltage" + charging_limit_voltage: + name: "${config} charging limit voltage" + battery_overvoltage_recovery: + name: "${config} battery overvoltage recovery" + equalizing_charging_voltage: + name: "${config} equalizing charging voltage" + boost_charging_voltage: + name: "${config} boost charging voltage" + boost_charging_return_voltage: + name: "${config} boost charging return voltage" + floating_charge_voltage: + name: "${config} floating charge voltage" + over_discharge_voltage: + name: "${config} over discharge voltage" + over_discharge_recovery_voltage: + name: "${config} over discharge recovery voltage" + battery_undervoltage: + name: "${config} battery undervoltage" + equalization_charging_time: + name: "${config} equalization charging time" + improve_charging_time: + name: "${config} improve charging time" + light_control_on_voltage: + name: "${config} light control on voltage" + light_control_off_voltage: + name: "${config} light control off voltage" + light_control_on_period_1: + name: "${config} light control on period 1" + light_control_on_period_2: + name: "${config} light control on period 2" + load_turn_off_time: + name: "${config} load turn off time" + battery_strings: + name: "${config} battery strings" diff --git a/esp8266-example-jnge-mppt-controller.yaml b/esp8266-example-jnge-mppt-controller.yaml index e7fda4b..11ac155 100644 --- a/esp8266-example-jnge-mppt-controller.yaml +++ b/esp8266-example-jnge-mppt-controller.yaml @@ -158,3 +158,42 @@ text_sensor: name: "${status} errors" operation_mode: name: "${status} operation mode" + +number: + - platform: jnge_mppt_controller + battery_overvoltage: + name: "${config} battery overvoltage" + charging_limit_voltage: + name: "${config} charging limit voltage" + battery_overvoltage_recovery: + name: "${config} battery overvoltage recovery" + equalizing_charging_voltage: + name: "${config} equalizing charging voltage" + boost_charging_voltage: + name: "${config} boost charging voltage" + boost_charging_return_voltage: + name: "${config} boost charging return voltage" + floating_charge_voltage: + name: "${config} floating charge voltage" + over_discharge_voltage: + name: "${config} over discharge voltage" + over_discharge_recovery_voltage: + name: "${config} over discharge recovery voltage" + battery_undervoltage: + name: "${config} battery undervoltage" + equalization_charging_time: + name: "${config} equalization charging time" + improve_charging_time: + name: "${config} improve charging time" + light_control_on_voltage: + name: "${config} light control on voltage" + light_control_off_voltage: + name: "${config} light control off voltage" + light_control_on_period_1: + name: "${config} light control on period 1" + light_control_on_period_2: + name: "${config} light control on period 2" + load_turn_off_time: + name: "${config} load turn off time" + battery_strings: + name: "${config} battery strings"