8 static const char *
const TAG =
"daly_bms";
10 static const uint8_t DALY_FRAME_SIZE = 13;
11 static const uint8_t DALY_TEMPERATURE_OFFSET = 40;
12 static const uint16_t DALY_CURRENT_OFFSET = 30000;
14 static const uint8_t DALY_REQUEST_BATTERY_LEVEL = 0x90;
15 static const uint8_t DALY_REQUEST_MIN_MAX_VOLTAGE = 0x91;
16 static const uint8_t DALY_REQUEST_MIN_MAX_TEMPERATURE = 0x92;
17 static const uint8_t DALY_REQUEST_MOS = 0x93;
18 static const uint8_t DALY_REQUEST_STATUS = 0x94;
19 static const uint8_t DALY_REQUEST_CELL_VOLTAGE = 0x95;
20 static const uint8_t DALY_REQUEST_TEMPERATURE = 0x96;
25 ESP_LOGCONFIG(TAG,
"Daly BMS:");
35 const uint32_t now =
millis();
38 ESP_LOGW(TAG,
"Last transmission too long ago. Reset RX index.");
57 this->
data_.push_back(c);
58 if (this->
data_.size() == 4)
108 uint8_t request_message[DALY_FRAME_SIZE];
110 request_message[0] = 0xA5;
111 request_message[1] = this->
addr_;
112 request_message[2] = data_id;
113 request_message[3] = 0x08;
114 request_message[4] = 0x00;
115 request_message[5] = 0x00;
116 request_message[6] = 0x00;
117 request_message[7] = 0x00;
118 request_message[8] = 0x00;
119 request_message[9] = 0x00;
120 request_message[10] = 0x00;
121 request_message[11] = 0x00;
123 request_message[12] = (uint8_t) (request_message[0] + request_message[1] + request_message[2] +
126 ESP_LOGV(TAG,
"Request datapacket Nr %x", data_id);
127 this->
write_array(request_message,
sizeof(request_message));
132 auto it = data.begin();
134 while ((it = std::find(it, data.end(), 0xA5)) != data.end()) {
135 if (data.end() - it >= DALY_FRAME_SIZE && it[1] == 0x01) {
138 for (
int i = 0; i < 12; i++) {
143 if (checksum == it[12]) {
146 case DALY_REQUEST_BATTERY_LEVEL:
147 if (this->voltage_sensor_) {
148 this->voltage_sensor_->publish_state((
float)
encode_uint16(it[4], it[5]) / 10);
150 if (this->current_sensor_) {
151 this->current_sensor_->publish_state(((
float) (
encode_uint16(it[8], it[9]) - DALY_CURRENT_OFFSET) / 10));
153 if (this->battery_level_sensor_) {
154 this->battery_level_sensor_->publish_state((
float)
encode_uint16(it[10], it[11]) / 10);
158 case DALY_REQUEST_MIN_MAX_VOLTAGE:
159 if (this->max_cell_voltage_sensor_) {
160 this->max_cell_voltage_sensor_->publish_state((
float)
encode_uint16(it[4], it[5]) / 1000);
162 if (this->max_cell_voltage_number_sensor_) {
163 this->max_cell_voltage_number_sensor_->publish_state(it[6]);
165 if (this->min_cell_voltage_sensor_) {
166 this->min_cell_voltage_sensor_->publish_state((
float)
encode_uint16(it[7], it[8]) / 1000);
168 if (this->min_cell_voltage_number_sensor_) {
169 this->min_cell_voltage_number_sensor_->publish_state(it[9]);
173 case DALY_REQUEST_MIN_MAX_TEMPERATURE:
174 if (this->max_temperature_sensor_) {
175 this->max_temperature_sensor_->publish_state(it[4] - DALY_TEMPERATURE_OFFSET);
177 if (this->max_temperature_probe_number_sensor_) {
178 this->max_temperature_probe_number_sensor_->publish_state(it[5]);
180 if (this->min_temperature_sensor_) {
181 this->min_temperature_sensor_->publish_state(it[6] - DALY_TEMPERATURE_OFFSET);
183 if (this->min_temperature_probe_number_sensor_) {
184 this->min_temperature_probe_number_sensor_->publish_state(it[7]);
188 case DALY_REQUEST_MOS:
189 #ifdef USE_TEXT_SENSOR 190 if (this->status_text_sensor_ !=
nullptr) {
193 this->status_text_sensor_->publish_state(
"Stationary");
196 this->status_text_sensor_->publish_state(
"Charging");
199 this->status_text_sensor_->publish_state(
"Discharging");
206 #ifdef USE_BINARY_SENSOR 207 if (this->charging_mos_enabled_binary_sensor_) {
208 this->charging_mos_enabled_binary_sensor_->publish_state(it[5]);
210 if (this->discharging_mos_enabled_binary_sensor_) {
211 this->discharging_mos_enabled_binary_sensor_->publish_state(it[6]);
215 if (this->remaining_capacity_sensor_) {
216 this->remaining_capacity_sensor_->publish_state((
float)
encode_uint32(it[8], it[9], it[10], it[11]) /
223 case DALY_REQUEST_STATUS:
224 if (this->cells_number_sensor_) {
225 this->cells_number_sensor_->publish_state(it[4]);
229 case DALY_REQUEST_TEMPERATURE:
231 if (this->temperature_1_sensor_) {
232 this->temperature_1_sensor_->publish_state(it[5] - DALY_TEMPERATURE_OFFSET);
234 if (this->temperature_2_sensor_) {
235 this->temperature_2_sensor_->publish_state(it[6] - DALY_TEMPERATURE_OFFSET);
240 case DALY_REQUEST_CELL_VOLTAGE:
243 if (this->cell_1_voltage_sensor_) {
244 this->cell_1_voltage_sensor_->publish_state((
float)
encode_uint16(it[5], it[6]) / 1000);
246 if (this->cell_2_voltage_sensor_) {
247 this->cell_2_voltage_sensor_->publish_state((
float)
encode_uint16(it[7], it[8]) / 1000);
249 if (this->cell_3_voltage_sensor_) {
250 this->cell_3_voltage_sensor_->publish_state((
float)
encode_uint16(it[9], it[10]) / 1000);
254 if (this->cell_4_voltage_sensor_) {
255 this->cell_4_voltage_sensor_->publish_state((
float)
encode_uint16(it[5], it[6]) / 1000);
257 if (this->cell_5_voltage_sensor_) {
258 this->cell_5_voltage_sensor_->publish_state((
float)
encode_uint16(it[7], it[8]) / 1000);
260 if (this->cell_6_voltage_sensor_) {
261 this->cell_6_voltage_sensor_->publish_state((
float)
encode_uint16(it[9], it[10]) / 1000);
265 if (this->cell_7_voltage_sensor_) {
266 this->cell_7_voltage_sensor_->publish_state((
float)
encode_uint16(it[5], it[6]) / 1000);
268 if (this->cell_8_voltage_sensor_) {
269 this->cell_8_voltage_sensor_->publish_state((
float)
encode_uint16(it[7], it[8]) / 1000);
271 if (this->cell_9_voltage_sensor_) {
272 this->cell_9_voltage_sensor_->publish_state((
float)
encode_uint16(it[9], it[10]) / 1000);
276 if (this->cell_10_voltage_sensor_) {
277 this->cell_10_voltage_sensor_->publish_state((
float)
encode_uint16(it[5], it[6]) / 1000);
279 if (this->cell_11_voltage_sensor_) {
280 this->cell_11_voltage_sensor_->publish_state((
float)
encode_uint16(it[7], it[8]) / 1000);
282 if (this->cell_12_voltage_sensor_) {
283 this->cell_12_voltage_sensor_->publish_state((
float)
encode_uint16(it[9], it[10]) / 1000);
287 if (this->cell_13_voltage_sensor_) {
288 this->cell_13_voltage_sensor_->publish_state((
float)
encode_uint16(it[5], it[6]) / 1000);
290 if (this->cell_14_voltage_sensor_) {
291 this->cell_14_voltage_sensor_->publish_state((
float)
encode_uint16(it[7], it[8]) / 1000);
293 if (this->cell_15_voltage_sensor_) {
294 this->cell_15_voltage_sensor_->publish_state((
float)
encode_uint16(it[9], it[10]) / 1000);
298 if (this->cell_16_voltage_sensor_) {
299 this->cell_16_voltage_sensor_->publish_state((
float)
encode_uint16(it[5], it[6]) / 1000);
309 ESP_LOGW(TAG,
"Checksum-Error on Packet %x", it[4]);
311 std::advance(it, DALY_FRAME_SIZE);
const float DATA
For components that import data from directly connected sensors like DHT.
void write_array(const uint8_t *data, size_t len)
constexpr uint32_t encode_uint32(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4)
Encode a 32-bit value given four bytes in most to least significant byte order.
void dump_config() override
uint32_t IRAM_ATTR HOT millis()
void request_data_(uint8_t data_id)
void check_uart_settings(uint32_t baud_rate, uint8_t stop_bits=1, UARTParityOptions parity=UART_CONFIG_PARITY_NONE, uint8_t data_bits=8)
Check that the configuration of the UART bus matches the provided values and otherwise print a warnin...
virtual void setup()
Where the component's initialization should happen.
void decode_data_(std::vector< uint8_t > data)
bool read_byte(uint8_t *data)
std::vector< uint8_t > data_
constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb)
Encode a 16-bit value given the most and least significant byte.
uint32_t last_transmission_
float get_setup_priority() const override
Implementation of SPI Controller mode.