Skip to content

Commit

Permalink
Control config settings by number entities
Browse files Browse the repository at this point in the history
  • Loading branch information
syssi committed Mar 13, 2022
1 parent 9cf94e1 commit c58ead1
Show file tree
Hide file tree
Showing 14 changed files with 597 additions and 19 deletions.
1 change: 0 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,3 @@ repos:
rev: v1.3.5
hooks:
- id: clang-format
- id: clang-tidy
17 changes: 16 additions & 1 deletion components/jnge_mppt_controller/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,34 @@
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

CONF_JNGE_MPPT_CONTROLLER_ID = "jnge_mppt_controller_id"
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(
{
Expand Down
27 changes: 23 additions & 4 deletions components/jnge_mppt_controller/binary_sensor.py
Original file line number Diff line number Diff line change
@@ -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"]
Expand All @@ -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,
}
),
}
Expand Down
26 changes: 25 additions & 1 deletion components/jnge_mppt_controller/jnge_mppt_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -335,39 +335,51 @@ void JngeMpptController::on_configuration_data_(const std::vector<uint8_t> &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));
Expand All @@ -377,21 +389,26 @@ void JngeMpptController::on_configuration_data_(const std::vector<uint8_t> &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));
Expand All @@ -400,7 +417,7 @@ void JngeMpptController::on_configuration_data_(const std::vector<uint8_t> &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)
Expand Down Expand Up @@ -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;
Expand Down
84 changes: 84 additions & 0 deletions components/jnge_mppt_controller/jnge_mppt_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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_;
Expand All @@ -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);
};

Expand Down
Loading

0 comments on commit c58ead1

Please sign in to comment.