Skip to content

Commit 1b398e1

Browse files
authored
Add BMS controls (#44)
1 parent b588246 commit 1b398e1

File tree

8 files changed

+41
-24
lines changed

8 files changed

+41
-24
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.idea/
2-
secret.yaml
2+
secrets.yaml
33
.esphome/
44
**/.pioenvs/
55
**/.piolibdeps/

components/jk_bms/jk_bms.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ static const char *const TAG = "jk_bms";
99

1010
static const uint8_t FUNCTION_READ_ALL = 0x06;
1111
static const uint8_t ADDRESS_READ_ALL = 0x00;
12+
static const uint8_t WRITE_REGISTER = 0x02;
1213

1314
static const uint8_t ERRORS_SIZE = 14;
1415
static const char *const ERRORS[ERRORS_SIZE] = {
@@ -346,6 +347,8 @@ void JkBms::on_status_data_(const std::vector<uint8_t> &data) {
346347
// 00 00 00 00 68 00 00 54 D1: End of frame
347348
}
348349

350+
void JkBms::write_register(uint8_t address, uint8_t value) { this->send(WRITE_REGISTER, address, value); }
351+
349352
void JkBms::update() {
350353
this->read_registers(FUNCTION_READ_ALL, ADDRESS_READ_ALL);
351354

components/jk_bms/jk_bms.h

+2
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ class JkBms : public PollingComponent, public jk_modbus::JkModbusDevice {
206206

207207
void update() override;
208208

209+
void write_register(uint8_t address, uint8_t value);
210+
209211
protected:
210212
sensor::Sensor *min_cell_voltage_sensor_;
211213
sensor::Sensor *max_cell_voltage_sensor_;

components/jk_bms/switch/jk_switch.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ namespace jk_bms {
88
static const char *const TAG = "jk_bms.switch";
99

1010
void JkSwitch::dump_config() { LOG_SWITCH("", "JkBms Switch", this); }
11-
void JkSwitch::write_state(bool state) {
12-
// @FIXME
13-
// this->parent_->write_register(this->holding_register_, (uint16_t) state);
14-
}
11+
void JkSwitch::write_state(bool state) { this->parent_->write_register(this->holding_register_, (uint8_t) state); }
1512

1613
} // namespace jk_bms
1714
} // namespace esphome

components/jk_bms/switch/jk_switch.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ class JkBms;
1111
class JkSwitch : public switch_::Switch, public Component {
1212
public:
1313
void set_parent(JkBms *parent) { this->parent_ = parent; };
14-
void set_holding_register(uint16_t holding_register) { this->holding_register_ = holding_register; };
14+
void set_holding_register(uint8_t holding_register) { this->holding_register_ = holding_register; };
1515
void dump_config() override;
1616
void loop() override {}
1717
float get_setup_priority() const override { return setup_priority::DATA; }
1818

1919
protected:
2020
void write_state(bool state) override;
2121
JkBms *parent_;
22-
uint16_t holding_register_;
22+
uint8_t holding_register_;
2323
};
2424

2525
} // namespace jk_bms

components/jk_modbus/jk_modbus.cpp

+27-13
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,33 @@ float JkModbus::get_setup_priority() const {
9191
// After UART bus
9292
return setup_priority::BUS - 1.0f;
9393
}
94-
void JkModbus::send(uint8_t address, uint8_t function, uint16_t start_address, uint16_t register_count) {
95-
uint8_t frame[8];
96-
frame[0] = address;
97-
frame[1] = function;
98-
frame[2] = start_address >> 8;
99-
frame[3] = start_address >> 0;
100-
frame[4] = register_count >> 8;
101-
frame[5] = register_count >> 0;
102-
auto crc = chksum(frame, 6);
103-
frame[6] = crc >> 8;
104-
frame[7] = crc >> 0;
105-
106-
this->write_array(frame, 8);
94+
void JkModbus::send(uint8_t function, uint8_t address, uint8_t value) {
95+
uint8_t frame[22];
96+
frame[0] = 0x4E; // start sequence
97+
frame[1] = 0x57; // start sequence
98+
frame[2] = 0x00; // data length lb
99+
frame[3] = 0x14; // data length hb
100+
frame[4] = 0x00; // bms terminal number
101+
frame[5] = 0x00; // bms terminal number
102+
frame[6] = 0x00; // bms terminal number
103+
frame[7] = 0x00; // bms terminal number
104+
frame[8] = function; // command word: 0x01 (activation), 0x02 (write), 0x03 (read), 0x05 (password), 0x06 (read all)
105+
frame[9] = 0x02; // frame source: 0x00 (bms), 0x01 (bluetooth), 0x02 (gps), 0x03 (computer)
106+
frame[10] = 0x02; // frame type: 0x00 (read data), 0x01 (reply frame), 0x02 (BMS active upload)
107+
frame[11] = address; // register: 0x00 (read all registers), 0x8E...0xBF (holding registers)
108+
frame[12] = value; // data
109+
frame[13] = 0x00; // record number
110+
frame[14] = 0x00; // record number
111+
frame[15] = 0x00; // record number
112+
frame[16] = 0x00; // record number
113+
frame[17] = 0x68; // end sequence
114+
auto crc = chksum(frame, 17);
115+
frame[18] = 0x00; // crc unused
116+
frame[19] = 0x00; // crc unused
117+
frame[20] = crc >> 8;
118+
frame[21] = crc >> 0;
119+
120+
this->write_array(frame, 22);
107121
this->flush();
108122
}
109123

components/jk_modbus/jk_modbus.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class JkModbus : public uart::UARTDevice, public Component {
2020

2121
float get_setup_priority() const override;
2222

23-
void send(uint8_t address, uint8_t function, uint16_t start_address, uint16_t register_count);
23+
void send(uint8_t function, uint8_t address, uint8_t value);
2424
void read_registers(uint8_t function, uint8_t address);
2525

2626
protected:
@@ -37,9 +37,7 @@ class JkModbusDevice {
3737
void set_address(uint8_t address) { address_ = address; }
3838
virtual void on_jk_modbus_data(const uint8_t &function, const std::vector<uint8_t> &data) = 0;
3939

40-
void send(uint8_t function, uint16_t start_address, uint16_t register_count) {
41-
this->parent_->send(this->address_, function, start_address, register_count);
42-
}
40+
void send(int8_t function, uint8_t address, uint8_t value) { this->parent_->send(function, address, value); }
4341
void read_registers(uint8_t function, uint8_t address) { this->parent_->read_registers(function, address); }
4442

4543
protected:

test.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
esphome -s external_components_source components ${1:-run} esp32-example-faker.yaml

0 commit comments

Comments
 (0)