Skip to content

Commit

Permalink
Add calculated sensors (Closes: #2)
Browse files Browse the repository at this point in the history
  • Loading branch information
syssi committed Jul 15, 2023
1 parent 68e4ac7 commit 6d741ff
Show file tree
Hide file tree
Showing 2 changed files with 181 additions and 3 deletions.
89 changes: 89 additions & 0 deletions esp32-example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,95 @@ sensor:
filters:
- multiply: 0.001

# Delta cell voltage
- platform: modbus_controller
modbus_controller_id: bms0
name: "${name} delta cell voltage"
address: 15
register_type: holding
value_type: U_WORD
register_count: 16
response_size: 32
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 2
lambda: |-
uint8_t cells = 16;
if (data.size() < cells * 2) {
return NAN;
}
float min_cell_voltage = 100.0f;
float max_cell_voltage = -100.0f;
float average_cell_voltage = 0.0f;
uint8_t min_voltage_cell = 0;
uint8_t max_voltage_cell = 0;
for (uint8_t i = 0; i < cells; i++) {
float cell_voltage = (uint16_t)(data[i * 2] << 8 | data[(i * 2) + 1] << 0) * 0.001f;
average_cell_voltage = average_cell_voltage + cell_voltage;
if (cell_voltage < min_cell_voltage) {
min_cell_voltage = cell_voltage;
min_voltage_cell = i + 1;
}
if (cell_voltage > max_cell_voltage) {
max_cell_voltage = cell_voltage;
max_voltage_cell = i + 1;
}
}
average_cell_voltage = average_cell_voltage / cells;
id(bms0_average_cell_voltage).publish_state(average_cell_voltage);
id(bms0_min_cell_voltage).publish_state(min_cell_voltage);
id(bms0_max_cell_voltage).publish_state(max_cell_voltage);
id(bms0_min_voltage_cell).publish_state(min_voltage_cell);
id(bms0_max_voltage_cell).publish_state(max_voltage_cell);
return max_cell_voltage - min_cell_voltage;
- platform: template
id: bms0_average_cell_voltage
name: "${name} average cell voltage"
update_interval: never
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 3

- platform: template
id: bms0_min_cell_voltage
name: "${name} min cell voltage"
update_interval: never
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 3

- platform: template
id: bms0_max_cell_voltage
name: "${name} max cell voltage"
update_interval: never
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 3

- platform: template
id: bms0_min_voltage_cell
name: "${name} min voltage cell"
update_interval: never
unit_of_measurement: ""
state_class: measurement
accuracy_decimals: 0

- platform: template
id: bms0_max_voltage_cell
name: "${name} max voltage cell"
update_interval: never
unit_of_measurement: ""
state_class: measurement
accuracy_decimals: 0

# 31 Battery temperature 1 2 byte R int16 0.1 ℃
- platform: modbus_controller
modbus_controller_id: bms0
Expand Down
95 changes: 92 additions & 3 deletions esp8266-example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ modbus_controller:
update_interval: 10s

binary_sensor:
# 11 Status/Fault flag 2 byte R uint16 Hex See ^3
# -> Bit 8: Status: Charging enabled/disabled
# -> Bit 9: Status: Discharging enabled/disabled
# 11 Status/Fault flag 2 byte R uint16 Hex See ^3
# -> Bit 8: Status: Charging enabled/disabled
# -> Bit 9: Status: Discharging enabled/disabled

sensor:
# 0 Current 2 byte R int16 10mA (Positive: chargingm Negative: discharging)
Expand Down Expand Up @@ -434,6 +434,95 @@ sensor:
filters:
- multiply: 0.001

# Delta cell voltage
- platform: modbus_controller
modbus_controller_id: bms0
name: "${name} delta cell voltage"
address: 15
register_type: holding
value_type: U_WORD
register_count: 16
response_size: 32
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
accuracy_decimals: 2
lambda: |-
uint8_t cells = 16;
if (data.size() < cells * 2) {
return NAN;
}
float min_cell_voltage = 100.0f;
float max_cell_voltage = -100.0f;
float average_cell_voltage = 0.0f;
uint8_t min_voltage_cell = 0;
uint8_t max_voltage_cell = 0;
for (uint8_t i = 0; i < cells; i++) {
float cell_voltage = (uint16_t)(data[i * 2] << 8 | data[(i * 2) + 1] << 0) * 0.001f;
average_cell_voltage = average_cell_voltage + cell_voltage;
if (cell_voltage < min_cell_voltage) {
min_cell_voltage = cell_voltage;
min_voltage_cell = i + 1;
}
if (cell_voltage > max_cell_voltage) {
max_cell_voltage = cell_voltage;
max_voltage_cell = i + 1;
}
}
average_cell_voltage = average_cell_voltage / cells;
id(bms0_average_cell_voltage).publish_state(average_cell_voltage);
id(bms0_min_cell_voltage).publish_state(min_cell_voltage);
id(bms0_max_cell_voltage).publish_state(max_cell_voltage);
id(bms0_min_voltage_cell).publish_state(min_voltage_cell);
id(bms0_max_voltage_cell).publish_state(max_voltage_cell);
return max_cell_voltage - min_cell_voltage;
- platform: template
id: bms0_average_cell_voltage
name: "${name} average cell voltage"
update_interval: never
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 3

- platform: template
id: bms0_min_cell_voltage
name: "${name} min cell voltage"
update_interval: never
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 3

- platform: template
id: bms0_max_cell_voltage
name: "${name} max cell voltage"
update_interval: never
unit_of_measurement: V
device_class: voltage
state_class: measurement
accuracy_decimals: 3

- platform: template
id: bms0_min_voltage_cell
name: "${name} min voltage cell"
update_interval: never
unit_of_measurement: ""
state_class: measurement
accuracy_decimals: 0

- platform: template
id: bms0_max_voltage_cell
name: "${name} max voltage cell"
update_interval: never
unit_of_measurement: ""
state_class: measurement
accuracy_decimals: 0

# 31 Battery temperature 1 2 byte R int16 0.1 ℃
- platform: modbus_controller
modbus_controller_id: bms0
Expand Down

0 comments on commit 6d741ff

Please sign in to comment.