ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
kmeteriso.cpp
Go to the documentation of this file.
1#include "kmeteriso.h"
2#include "esphome/core/hal.h"
4#include "esphome/core/log.h"
5
7
8static const char *const TAG = "kmeteriso.sensor";
9
10static const uint8_t KMETER_ERROR_STATUS_REG = 0x20;
11static const uint8_t KMETER_TEMP_VAL_REG = 0x00;
12static const uint8_t KMETER_INTERNAL_TEMP_VAL_REG = 0x10;
13static const uint8_t KMETER_FIRMWARE_VERSION_REG = 0xFE;
14
16 this->error_code_ = NONE;
17
18 // Mark as not failed before initializing. Some devices will turn off sensors to save on batteries
19 // and when they come back on, the COMPONENT_STATE_FAILED bit must be unset on the component.
20 if (this->is_failed()) {
22 }
23
24 auto err = this->bus_->write_readv(this->address_, nullptr, 0, nullptr, 0);
25 if (err == esphome::i2c::ERROR_OK) {
26 ESP_LOGCONFIG(TAG, "Could write to the address %d.", this->address_);
27 } else {
28 ESP_LOGCONFIG(TAG, "Could not write to the address %d.", this->address_);
29 this->error_code_ = COMMUNICATION_FAILED;
30 this->mark_failed();
31 return;
32 }
33
34 uint8_t read_buf[4] = {1};
35 if (!this->read_bytes(KMETER_ERROR_STATUS_REG, read_buf, 1)) {
36 ESP_LOGCONFIG(TAG, "Could not read from the device.");
37 this->error_code_ = COMMUNICATION_FAILED;
38 this->mark_failed();
39 return;
40 }
41 if (read_buf[0] != 0) {
42 ESP_LOGCONFIG(TAG, "The device is not ready.");
43 this->error_code_ = STATUS_FAILED;
44 this->mark_failed();
45 return;
46 }
47}
48
50 uint8_t read_buf[4];
51
52 if (this->temperature_sensor_ != nullptr) {
53 if (!this->read_bytes(KMETER_TEMP_VAL_REG, read_buf, 4)) {
54 ESP_LOGW(TAG, "Error reading temperature.");
55 } else {
56 int32_t temp = encode_uint32(read_buf[3], read_buf[2], read_buf[1], read_buf[0]);
57 float temp_f = temp / 100.0;
58 ESP_LOGV(TAG, "Got temperature=%.2f °C", temp_f);
60 }
61 }
62
63 if (this->internal_temperature_sensor_ != nullptr) {
64 if (!this->read_bytes(KMETER_INTERNAL_TEMP_VAL_REG, read_buf, 4)) {
65 ESP_LOGW(TAG, "Error reading internal temperature.");
66 return;
67 } else {
68 int32_t internal_temp = encode_uint32(read_buf[3], read_buf[2], read_buf[1], read_buf[0]);
69 float internal_temp_f = internal_temp / 100.0;
70 ESP_LOGV(TAG, "Got internal temperature=%.2f °C", internal_temp_f);
71 this->internal_temperature_sensor_->publish_state(internal_temp_f);
72 }
73 }
74}
75
76} // namespace esphome::kmeteriso
void mark_failed()
Mark this component as failed.
bool is_failed() const
Definition component.h:284
void reset_to_construction_state()
Reset this component back to the construction state to allow setup to run again.
virtual ErrorCode write_readv(uint8_t address, const uint8_t *write_buffer, size_t write_count, uint8_t *read_buffer, size_t read_count)=0
This virtual method writes bytes to an I2CBus from an array, then reads bytes into an array of ReadBu...
I2CBus * bus_
pointer to I2CBus instance
Definition i2c.h:271
uint8_t address_
store the address of the device on the bus
Definition i2c.h:270
bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len)
Compat APIs All methods below have been added for compatibility reasons.
Definition i2c.h:217
enum esphome::kmeteriso::KMeterISOComponent::ErrorCode NONE
sensor::Sensor * internal_temperature_sensor_
Definition kmeteriso.h:23
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:68
@ ERROR_OK
No error found during execution of method.
Definition i2c_bus.h:14
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.
Definition helpers.h:867