mirror of
https://github.com/esphome/esphome.git
synced 2024-11-27 09:18:00 +01:00
DALY Modbus BMS: linting
This commit is contained in:
parent
eef430e932
commit
a93a48879a
5 changed files with 71 additions and 80 deletions
|
@ -14,16 +14,13 @@ DalyHkmsBmsComponent = daly_hkms_bms.class_(
|
|||
"DalyHkmsBmsComponent", cg.PollingComponent, modbus.ModbusDevice
|
||||
)
|
||||
|
||||
CONFIG_SCHEMA = (
|
||||
cv.Schema(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(DalyHkmsBmsComponent),
|
||||
cv.GenerateID(modbus.CONF_MODBUS_ID): cv.use_id(modbus.Modbus),
|
||||
cv.Optional(CONF_ADDRESS, default=1): cv.positive_int,
|
||||
}
|
||||
)
|
||||
.extend(cv.polling_component_schema("30s"))
|
||||
)
|
||||
CONFIG_SCHEMA = cv.Schema(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(DalyHkmsBmsComponent),
|
||||
cv.GenerateID(modbus.CONF_MODBUS_ID): cv.use_id(modbus.Modbus),
|
||||
cv.Optional(CONF_ADDRESS, default=1): cv.positive_int,
|
||||
}
|
||||
).extend(cv.polling_component_schema("30s"))
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
|
|
|
@ -19,18 +19,10 @@ CONFIG_SCHEMA = cv.All(
|
|||
cv.Schema(
|
||||
{
|
||||
cv.GenerateID(CONF_DALY_HKMS_BMS_ID): cv.use_id(DalyHkmsBmsComponent),
|
||||
cv.Optional(
|
||||
CONF_CHARGING_MOS_ENABLED
|
||||
): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(
|
||||
CONF_DISCHARGING_MOS_ENABLED
|
||||
): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(
|
||||
CONF_PRECHARGING_MOS_ENABLED
|
||||
): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(
|
||||
CONF_BALANCING_ACTIVE
|
||||
): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(CONF_CHARGING_MOS_ENABLED): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(CONF_DISCHARGING_MOS_ENABLED): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(CONF_PRECHARGING_MOS_ENABLED): binary_sensor.binary_sensor_schema(),
|
||||
cv.Optional(CONF_BALANCING_ACTIVE): binary_sensor.binary_sensor_schema(),
|
||||
}
|
||||
).extend(cv.COMPONENT_SCHEMA)
|
||||
)
|
||||
|
|
|
@ -47,23 +47,22 @@ void DalyHkmsBmsComponent::loop() {
|
|||
|
||||
uint8_t start_address;
|
||||
uint8_t register_count;
|
||||
switch (this->read_state_)
|
||||
{
|
||||
case ReadState::READ_CELL_VOLTAGES:
|
||||
start_address = DALY_MODBUS_READ_CELL_VOLTAGES_ADDR;
|
||||
// avoid reading all 48 cell voltages if we only want 16 or so
|
||||
register_count = this->cell_voltage_sensors_max_;
|
||||
break;
|
||||
case ReadState::READ_DATA:
|
||||
start_address = DALY_MODBUS_READ_DATA_ADDR;
|
||||
register_count = DALY_MODBUS_READ_DATA_LENGTH;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
switch (this->read_state_) {
|
||||
case ReadState::READ_CELL_VOLTAGES:
|
||||
start_address = DALY_MODBUS_READ_CELL_VOLTAGES_ADDR;
|
||||
// avoid reading all 48 cell voltages if we only want 16 or so
|
||||
register_count = this->cell_voltage_sensors_max_;
|
||||
break;
|
||||
case ReadState::READ_DATA:
|
||||
start_address = DALY_MODBUS_READ_DATA_ADDR;
|
||||
register_count = DALY_MODBUS_READ_DATA_LENGTH;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
ESP_LOGD(TAG, "Sending modbus read request to %d: start register %d, register count %d",
|
||||
this->daly_address_, start_address, register_count);
|
||||
ESP_LOGD(TAG, "Sending modbus read request to %d: start register %d, register count %d", this->daly_address_,
|
||||
start_address, register_count);
|
||||
|
||||
// send the request using Modbus directly instead of ModbusDevice so we can send the data with the request address
|
||||
uint8_t modbus_device_request_address = this->daly_address_ + DALY_MODBUS_REQUEST_ADDRESS_OFFSET;
|
||||
|
@ -75,7 +74,7 @@ void DalyHkmsBmsComponent::loop() {
|
|||
}
|
||||
|
||||
void DalyHkmsBmsComponent::update() {
|
||||
if(this->read_state_ == ReadState::IDLE){
|
||||
if (this->read_state_ == ReadState::IDLE) {
|
||||
this->advance_read_state();
|
||||
}
|
||||
}
|
||||
|
@ -93,20 +92,19 @@ void DalyHkmsBmsComponent::on_modbus_data(const std::vector<uint8_t> &data) {
|
|||
|
||||
size_t register_count;
|
||||
size_t register_offset;
|
||||
|
||||
switch (this->read_state_)
|
||||
{
|
||||
case ReadState::READ_CELL_VOLTAGES:
|
||||
register_offset = DALY_MODBUS_READ_CELL_VOLTAGES_ADDR;
|
||||
register_count = this->cell_voltage_sensors_max_;
|
||||
break;
|
||||
case ReadState::READ_DATA:
|
||||
register_offset = DALY_MODBUS_READ_DATA_ADDR;
|
||||
register_count = DALY_MODBUS_READ_DATA_LENGTH;
|
||||
break;
|
||||
default:
|
||||
ESP_LOGE(TAG, "Invalid read state");
|
||||
return;
|
||||
|
||||
switch (this->read_state_) {
|
||||
case ReadState::READ_CELL_VOLTAGES:
|
||||
register_offset = DALY_MODBUS_READ_CELL_VOLTAGES_ADDR;
|
||||
register_count = this->cell_voltage_sensors_max_;
|
||||
break;
|
||||
case ReadState::READ_DATA:
|
||||
register_offset = DALY_MODBUS_READ_DATA_ADDR;
|
||||
register_count = DALY_MODBUS_READ_DATA_LENGTH;
|
||||
break;
|
||||
default:
|
||||
ESP_LOGE(TAG, "Invalid read state");
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.size() < register_count * 2) {
|
||||
|
@ -118,8 +116,8 @@ void DalyHkmsBmsComponent::on_modbus_data(const std::vector<uint8_t> &data) {
|
|||
return encode_uint16(data[(i - register_offset) * 2], data[(i - register_offset) * 2 + 1]);
|
||||
};
|
||||
|
||||
auto publish_sensor_state = [&](sensor::Sensor *sensor, size_t i,
|
||||
int16_t offset, float factor, int32_t unavailable_value = -1) -> void {
|
||||
auto publish_sensor_state = [&](sensor::Sensor *sensor, size_t i, int16_t offset, float factor,
|
||||
int32_t unavailable_value = -1) -> void {
|
||||
if (sensor == nullptr)
|
||||
return;
|
||||
uint16_t register_value = get_register(i);
|
||||
|
@ -129,14 +127,13 @@ void DalyHkmsBmsComponent::on_modbus_data(const std::vector<uint8_t> &data) {
|
|||
|
||||
if (this->read_state_ == ReadState::READ_CELL_VOLTAGES) {
|
||||
#ifdef USE_SENSOR
|
||||
for (size_t i = 0; i < this->cell_voltage_sensors_max_; i++)
|
||||
{
|
||||
for (size_t i = 0; i < this->cell_voltage_sensors_max_; i++) {
|
||||
publish_sensor_state(this->cell_voltage_sensors_[i], register_offset, DALY_MODBUS_ADDR_CELL_VOLT_1 + i, 0, 0.001);
|
||||
}
|
||||
#endif
|
||||
} else if (this->read_state_ == ReadState::READ_DATA) {
|
||||
#ifdef USE_SENSOR
|
||||
publish_sensor_state(this->temperature_1_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_1 , -40, 1, 255);
|
||||
publish_sensor_state(this->temperature_1_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_1, -40, 1, 255);
|
||||
publish_sensor_state(this->temperature_2_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_1 + 1, -40, 1, 255);
|
||||
publish_sensor_state(this->temperature_3_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_1 + 2, -40, 1, 255);
|
||||
publish_sensor_state(this->temperature_4_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_1 + 3, -40, 1, 255);
|
||||
|
@ -154,13 +151,13 @@ void DalyHkmsBmsComponent::on_modbus_data(const std::vector<uint8_t> &data) {
|
|||
|
||||
publish_sensor_state(this->max_cell_voltage_sensor_, DALY_MODBUS_ADDR_CELL_VOLT_MAX, 0, 0.001);
|
||||
publish_sensor_state(this->max_cell_voltage_number_sensor_, DALY_MODBUS_ADDR_CELL_VOLT_MAX_NUM, 0, 1);
|
||||
|
||||
|
||||
publish_sensor_state(this->min_cell_voltage_sensor_, DALY_MODBUS_ADDR_CELL_VOLT_MIN, 0, 0.001);
|
||||
publish_sensor_state(this->min_cell_voltage_number_sensor_, DALY_MODBUS_ADDR_CELL_VOLT_MIN_NUM, 0, 1);
|
||||
|
||||
publish_sensor_state(this->max_temperature_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_MAX, -40, 1, 255);
|
||||
publish_sensor_state(this->max_temperature_probe_number_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_MAX_NUM, 0, 1);
|
||||
|
||||
|
||||
publish_sensor_state(this->min_temperature_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_MIN, -40, 1, 255);
|
||||
publish_sensor_state(this->min_temperature_probe_number_sensor_, DALY_MODBUS_ADDR_CELL_TEMP_MIN_NUM, 0, 1);
|
||||
|
||||
|
@ -208,22 +205,21 @@ void DalyHkmsBmsComponent::on_modbus_data(const std::vector<uint8_t> &data) {
|
|||
}
|
||||
|
||||
void DalyHkmsBmsComponent::advance_read_state() {
|
||||
switch (this->read_state_)
|
||||
{
|
||||
case ReadState::IDLE:
|
||||
// skip reading cell voltages if there are no cell voltage sensors
|
||||
if (this->cell_voltage_sensors_max_ == 0) {
|
||||
switch (this->read_state_) {
|
||||
case ReadState::IDLE:
|
||||
// skip reading cell voltages if there are no cell voltage sensors
|
||||
if (this->cell_voltage_sensors_max_ == 0) {
|
||||
this->read_state_ = ReadState::READ_DATA;
|
||||
} else {
|
||||
this->read_state_ = ReadState::READ_CELL_VOLTAGES;
|
||||
}
|
||||
break;
|
||||
case ReadState::READ_CELL_VOLTAGES:
|
||||
this->read_state_ = ReadState::READ_DATA;
|
||||
} else {
|
||||
this->read_state_ = ReadState::READ_CELL_VOLTAGES;
|
||||
}
|
||||
break;
|
||||
case ReadState::READ_CELL_VOLTAGES:
|
||||
this->read_state_ = ReadState::READ_DATA;
|
||||
break;
|
||||
case ReadState::READ_DATA:
|
||||
this->read_state_ = ReadState::IDLE;
|
||||
break;
|
||||
break;
|
||||
case ReadState::READ_DATA:
|
||||
this->read_state_ = ReadState::IDLE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,9 +31,9 @@ class DalyHkmsBmsComponent : public PollingComponent, public modbus::ModbusDevic
|
|||
|
||||
#ifdef USE_SENSOR
|
||||
void set_cell_voltage_sensor(size_t cell, sensor::Sensor *sensor) {
|
||||
if(cell > this->cell_voltage_sensors_max_)
|
||||
if (cell > this->cell_voltage_sensors_max_)
|
||||
this->cell_voltage_sensors_max_ = cell;
|
||||
this->cell_voltage_sensors_[cell-1] = sensor;
|
||||
this->cell_voltage_sensors_[cell - 1] = sensor;
|
||||
};
|
||||
|
||||
SUB_SENSOR(voltage)
|
||||
|
@ -84,7 +84,7 @@ class DalyHkmsBmsComponent : public PollingComponent, public modbus::ModbusDevic
|
|||
|
||||
void advance_read_state();
|
||||
|
||||
enum class ReadState{ READ_CELL_VOLTAGES, READ_DATA, IDLE } read_state_{ReadState::IDLE};
|
||||
enum class ReadState { READ_CELL_VOLTAGES, READ_DATA, IDLE } read_state_{ReadState::IDLE};
|
||||
};
|
||||
|
||||
} // namespace daly_hkms_bms
|
||||
|
|
|
@ -103,15 +103,18 @@ CELL_VOLTAGE_SCHEMA = sensor.sensor_schema(
|
|||
accuracy_decimals=3,
|
||||
)
|
||||
|
||||
|
||||
def get_cell_voltage_key(cell):
|
||||
return f"cell_{cell}_voltage"
|
||||
|
||||
|
||||
def get_cell_voltages_schema():
|
||||
schema_obj = {}
|
||||
for i in range(1, MAX_CELL_NUMBER+1):
|
||||
for i in range(1, MAX_CELL_NUMBER + 1):
|
||||
schema_obj[cv.Optional(get_cell_voltage_key(i))] = CELL_VOLTAGE_SCHEMA
|
||||
return cv.Schema(schema_obj)
|
||||
|
||||
|
||||
CONFIG_SCHEMA = (
|
||||
cv.Schema(
|
||||
{
|
||||
|
@ -121,7 +124,7 @@ CONFIG_SCHEMA = (
|
|||
unit_of_measurement=UNIT_VOLT,
|
||||
accuracy_decimals=1,
|
||||
device_class=DEVICE_CLASS_VOLTAGE,
|
||||
state_class=STATE_CLASS_MEASUREMENT
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
),
|
||||
cv.Optional(CONF_CURRENT): sensor.sensor_schema(
|
||||
unit_of_measurement=UNIT_AMPERE,
|
||||
|
@ -226,20 +229,23 @@ CONFIG_SCHEMA = (
|
|||
.extend(cv.COMPONENT_SCHEMA)
|
||||
)
|
||||
|
||||
|
||||
async def setup_conf(config, key, hub):
|
||||
if sensor_config := config.get(key):
|
||||
sens = await sensor.new_sensor(sensor_config)
|
||||
cg.add(getattr(hub, f"set_{key}_sensor")(sens))
|
||||
|
||||
|
||||
async def setup_cell_voltage_conf(config, cell, hub):
|
||||
key = get_cell_voltage_key(cell)
|
||||
if sensor_config := config.get(key):
|
||||
sens = await sensor.new_sensor(sensor_config)
|
||||
cg.add(hub.set_cell_voltage_sensor(cell, sens))
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
hub = await cg.get_variable(config[CONF_DALY_HKMS_BMS_ID])
|
||||
for key in TYPES:
|
||||
await setup_conf(config, key, hub)
|
||||
for i in range(1, MAX_CELL_NUMBER+1):
|
||||
for i in range(1, MAX_CELL_NUMBER + 1):
|
||||
await setup_cell_voltage_conf(config, i, hub)
|
||||
|
|
Loading…
Reference in a new issue