12#define SUB_SENSOR_WITH_DEDUP(name, dedup_type) \
14 ld24xx::SensorWithDedup<dedup_type> name##_sensor_{}; \
17 void set_##name##_sensor(sensor::Sensor *sensor) { this->name##_sensor_.set_sensor(sensor); }
20#define LOG_SENSOR_WITH_DEDUP_SAFE(tag, name, sensor) \
21 if ((sensor).has_sensor()) { \
22 LOG_SENSOR(tag, name, (sensor).get_sensor()); \
25#define SAFE_PUBLISH_SENSOR(sensor, value) (sensor).publish_state_if_not_dup(value)
27#define SAFE_PUBLISH_SENSOR_UNKNOWN(sensor) (sensor).publish_state_unknown()
29#define highbyte(val) (uint8_t)((val) >> 8)
30#define lowbyte(val) (uint8_t)((val) &0xff)
36 for (
size_t i = 0; i < N; i++) {
43static const char *
const UNKNOWN_MAC =
"unknown";
44static const char *
const VERSION_FMT =
"%u.%02X.%02X%02X%02X%02X";
49inline const char *
format_mac_str(
const uint8_t *mac_address, std::span<char, 18> buffer) {
60 snprintf(buffer.data(), buffer.size(), VERSION_FMT, version[1], version[0], version[5], version[4], version[3],
75 if (this->
sens_ !=
nullptr && this->
dedup_.next(state)) {
81 if (this->
sens_ !=
nullptr && this->
dedup_.next_unknown()) {
Helper class to deduplicate items in a series of values.
Sensor with deduplication — sensor may be null, null check is internal.
void publish_state_unknown()
sensor::Sensor * get_sensor() const
void publish_state_if_not_dup(T state)
void set_sensor(sensor::Sensor *sens)
Base-class for all sensors.
void publish_state(float state)
Publish a new state to the front-end.
void format_version_str(const uint8_t *version, std::span< char, 20 > buffer)
const char * format_mac_str(const uint8_t *mac_address, std::span< char, 18 > buffer)
optional< size_t > find_index(const uint32_t(&arr)[N], uint32_t value)
bool mac_address_is_valid(const uint8_t *mac)
Check if the MAC address is not all zeros or all ones.
char * format_mac_addr_upper(const uint8_t *mac, char *output)
Format MAC address as XX:XX:XX:XX:XX:XX (uppercase, colon separators)