11static const uint8_t BL0942_READ_COMMAND = 0x58;
12static const uint8_t BL0942_FULL_PACKET = 0xAA;
13static const uint8_t BL0942_PACKET_HEADER = 0x55;
15static const uint8_t BL0942_WRITE_COMMAND = 0xA8;
17static const uint8_t BL0942_REG_I_RMSOS = 0x12;
18static const uint8_t BL0942_REG_WA_CREEP = 0x14;
19static const uint8_t BL0942_REG_I_FAST_RMS_TH = 0x15;
20static const uint8_t BL0942_REG_I_FAST_RMS_CYC = 0x16;
21static const uint8_t BL0942_REG_FREQ_CYC = 0x17;
22static const uint8_t BL0942_REG_OT_FUNX = 0x18;
23static const uint8_t BL0942_REG_MODE = 0x19;
24static const uint8_t BL0942_REG_SOFT_RESET = 0x1C;
25static const uint8_t BL0942_REG_USR_WRPROT = 0x1D;
26static const uint8_t BL0942_REG_TPS_CTRL = 0x1B;
28static const uint32_t BL0942_REG_MODE_RESV = 0x03;
29static const uint32_t BL0942_REG_MODE_CF_EN = 0x04;
30static const uint32_t BL0942_REG_MODE_RMS_UPDATE_SEL = 0x08;
31static const uint32_t BL0942_REG_MODE_FAST_RMS_SEL = 0x10;
32static const uint32_t BL0942_REG_MODE_AC_FREQ_SEL = 0x20;
33static const uint32_t BL0942_REG_MODE_CF_CNT_CLR_SEL = 0x40;
34static const uint32_t BL0942_REG_MODE_CF_CNT_ADD_SEL = 0x80;
35static const uint32_t BL0942_REG_MODE_UART_RATE_19200 = 0x200;
36static const uint32_t BL0942_REG_MODE_UART_RATE_38400 = 0x300;
37static const uint32_t BL0942_REG_MODE_DEFAULT =
38 BL0942_REG_MODE_RESV | BL0942_REG_MODE_CF_EN | BL0942_REG_MODE_CF_CNT_ADD_SEL;
40static const uint32_t BL0942_REG_SOFT_RESET_MAGIC = 0x5a5a5a;
41static const uint32_t BL0942_REG_USR_WRPROT_MAGIC = 0x55;
44static const uint32_t PKT_TIMEOUT_MS = 200;
53 if (avail <
sizeof(
buffer)) {
57 ESP_LOGW(TAG,
"Junk on wire. Throwing away partial message (%zu bytes)", avail);
75 sum_bytes(
reinterpret_cast<const uint8_t *
>(data),
sizeof(*data) - 1, BL0942_READ_COMMAND | this->
address_) ^
77 if (checksum != data->checksum) {
78 ESP_LOGW(TAG,
"BL0942 invalid checksum! 0x%02X != 0x%02X",
checksum, data->checksum);
87 pkt[0] = BL0942_WRITE_COMMAND | this->
address_;
89 pkt[2] = (
val & 0xff);
90 pkt[3] = (
val >> 8) & 0xff;
91 pkt[4] = (
val >> 16) & 0xff;
92 pkt[5] = (pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4]) ^ 0xff;
108 (uint8_t) ((BL0942_READ_COMMAND + this->address_ + reg + resp.b[0] + resp.b[1] + resp.b[2]) ^ 0xff)) {
135 this->
write_reg_(BL0942_REG_USR_WRPROT, BL0942_REG_USR_WRPROT_MAGIC);
137 this->
write_reg_(BL0942_REG_SOFT_RESET, BL0942_REG_SOFT_RESET_MAGIC);
140 mode |= BL0942_REG_MODE_RMS_UPDATE_SEL;
142 mode |= BL0942_REG_MODE_AC_FREQ_SEL;
155 if (data->frame_header != BL0942_PACKET_HEADER) {
156 ESP_LOGI(TAG,
"Invalid data. Header mismatch: %d", data->frame_header);
168 float frequency = data->frequency != 0 ? 1000000.0f / data->frequency : NAN;
186 ESP_LOGV(TAG,
"BL0942: U %fV, I %fA, P %fW, Cnt %" PRId32
", ∫P %fkWh, frequency %fHz, status 0x%08X",
v_rms,
i_rms,
195 " Nominal line frequency: %d Hz\n"
196 " Current reference: %f\n"
197 " Energy reference: %f\n"
198 " Power reference: %f\n"
199 " Voltage reference: %f",
BedjetMode mode
BedJet operating mode.
void status_set_warning()
void status_clear_warning()
bool current_reference_set_
bool energy_reference_set_
sensor::Sensor * frequency_sensor_
sensor::Sensor * energy_sensor_
bool power_reference_set_
void write_reg_(uint8_t reg, uint32_t val)
int read_reg_(uint8_t reg)
bool voltage_reference_set_
sensor::Sensor * current_sensor_
optional< uint32_t > rx_start_
void received_package_(DataPacket *data)
sensor::Sensor * voltage_sensor_
sensor::Sensor * power_sensor_
bool validate_checksum_(DataPacket *data)
void dump_config() override
Wrapper class for memory using big endian data layout, transparently converting it to native order.
void publish_state(float state)
Publish a new state to the front-end.
optional< std::array< uint8_t, N > > read_array()
void write_byte(uint8_t data)
void write_array(const uint8_t *data, size_t len)
ESPHOME_LOG_TAG(TAG, "bl0942")
constexpr uint8_t sum_bytes(const uint8_t *data, size_t len, uint8_t sum=0)
Add up the bytes of data with size len, truncated to 8 bits: the checksum many serial and IR protocol...
void HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()
24-bit signed integer type, transparently converting to 32-bit.
24-bit unsigned integer type, transparently converting to 32-bit.