1
0
mirror of https://github.com/esphome/esphome.git synced 2025-11-18 07:45:56 +00:00

[core] Deduplicate entity icon and device class logging

This commit is contained in:
J. Nick Koston
2025-11-05 22:49:13 -06:00
parent 26607713bb
commit 2ddfabe09e
17 changed files with 64 additions and 99 deletions

View File

@@ -9,14 +9,9 @@ static const char *const TAG = "binary_sensor";
// Function implementation of LOG_BINARY_SENSOR macro to reduce code size // Function implementation of LOG_BINARY_SENSOR macro to reduce code size
void log_binary_sensor(const char *tag, const char *prefix, const char *type, BinarySensor *obj) { void log_binary_sensor(const char *tag, const char *prefix, const char *type, BinarySensor *obj) {
if (obj == nullptr) { if (obj != nullptr) {
return;
}
ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str()); ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str());
obj->log_device_class(tag, prefix);
if (!obj->get_device_class_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->get_device_class_ref().c_str());
} }
} }

View File

@@ -8,14 +8,9 @@ static const char *const TAG = "button";
// Function implementation of LOG_BUTTON macro to reduce code size // Function implementation of LOG_BUTTON macro to reduce code size
void log_button(const char *tag, const char *prefix, const char *type, Button *obj) { void log_button(const char *tag, const char *prefix, const char *type, Button *obj) {
if (obj == nullptr) { if (obj != nullptr) {
return;
}
ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str()); ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str());
obj->log_icon(tag, prefix);
if (!obj->get_icon_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon_ref().c_str());
} }
} }

View File

@@ -20,9 +20,7 @@ const extern float COVER_CLOSED;
if (traits_.get_is_assumed_state()) { \ if (traits_.get_is_assumed_state()) { \
ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \ ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \
} \ } \
if (!(obj)->get_device_class_ref().empty()) { \ (obj)->log_device_class(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Device Class: '%s'", prefix, (obj)->get_device_class_ref().c_str()); \
} \
} }
class Cover; class Cover;

View File

@@ -16,9 +16,7 @@ namespace datetime {
#define LOG_DATETIME_DATE(prefix, type, obj) \ #define LOG_DATETIME_DATE(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
} \
} }
class DateCall; class DateCall;

View File

@@ -16,9 +16,7 @@ namespace datetime {
#define LOG_DATETIME_DATETIME(prefix, type, obj) \ #define LOG_DATETIME_DATETIME(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
} \
} }
class DateTimeCall; class DateTimeCall;

View File

@@ -16,9 +16,7 @@ namespace datetime {
#define LOG_DATETIME_TIME(prefix, type, obj) \ #define LOG_DATETIME_TIME(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
} \
} }
class TimeCall; class TimeCall;

View File

@@ -12,12 +12,8 @@ namespace event {
#define LOG_EVENT(prefix, type, obj) \ #define LOG_EVENT(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \ (obj)->log_device_class(TAG, prefix); \
} \
if (!(obj)->get_device_class_ref().empty()) { \
ESP_LOGCONFIG(TAG, "%s Device Class: '%s'", prefix, (obj)->get_device_class_ref().c_str()); \
} \
} }
class Event : public EntityBase, public EntityBase_DeviceClass { class Event : public EntityBase, public EntityBase_DeviceClass {

View File

@@ -15,9 +15,7 @@ class Lock;
#define LOG_LOCK(prefix, type, obj) \ #define LOG_LOCK(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
} \
if ((obj)->traits.get_assumed_state()) { \ if ((obj)->traits.get_assumed_state()) { \
ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \ ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \
} \ } \

View File

@@ -8,22 +8,15 @@ static const char *const TAG = "number";
// Function implementation of LOG_NUMBER macro to reduce code size // Function implementation of LOG_NUMBER macro to reduce code size
void log_number(const char *tag, const char *prefix, const char *type, Number *obj) { void log_number(const char *tag, const char *prefix, const char *type, Number *obj) {
if (obj == nullptr) { if (obj != nullptr) {
return;
}
ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str()); ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str());
obj->log_icon(tag, prefix);
if (!obj->get_icon_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon_ref().c_str());
}
if (!obj->traits.get_unit_of_measurement_ref().empty()) { if (!obj->traits.get_unit_of_measurement_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Unit of Measurement: '%s'", prefix, obj->traits.get_unit_of_measurement_ref().c_str()); ESP_LOGCONFIG(tag, "%s Unit of Measurement: '%s'", prefix, obj->traits.get_unit_of_measurement_ref().c_str());
} }
if (!obj->traits.get_device_class_ref().empty()) { obj->traits.log_device_class(tag, prefix);
ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->traits.get_device_class_ref().c_str());
} }
} }

View File

@@ -12,9 +12,7 @@ namespace select {
#define LOG_SELECT(prefix, type, obj) \ #define LOG_SELECT(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
} \
} }
#define SUB_SELECT(name) \ #define SUB_SELECT(name) \

View File

@@ -8,10 +8,7 @@ static const char *const TAG = "sensor";
// Function implementation of LOG_SENSOR macro to reduce code size // Function implementation of LOG_SENSOR macro to reduce code size
void log_sensor(const char *tag, const char *prefix, const char *type, Sensor *obj) { void log_sensor(const char *tag, const char *prefix, const char *type, Sensor *obj) {
if (obj == nullptr) { if (obj != nullptr) {
return;
}
ESP_LOGCONFIG(tag, ESP_LOGCONFIG(tag,
"%s%s '%s'\n" "%s%s '%s'\n"
"%s State Class: '%s'\n" "%s State Class: '%s'\n"
@@ -21,18 +18,14 @@ void log_sensor(const char *tag, const char *prefix, const char *type, Sensor *o
LOG_STR_ARG(state_class_to_string(obj->get_state_class())), prefix, LOG_STR_ARG(state_class_to_string(obj->get_state_class())), prefix,
obj->get_unit_of_measurement_ref().c_str(), prefix, obj->get_accuracy_decimals()); obj->get_unit_of_measurement_ref().c_str(), prefix, obj->get_accuracy_decimals());
if (!obj->get_device_class_ref().empty()) { obj->log_device_class(tag, prefix);
ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->get_device_class_ref().c_str()); obj->log_icon(tag, prefix);
}
if (!obj->get_icon_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon_ref().c_str());
}
if (obj->get_force_update()) { if (obj->get_force_update()) {
ESP_LOGV(tag, "%s Force Update: YES", prefix); ESP_LOGV(tag, "%s Force Update: YES", prefix);
} }
} }
}
const LogString *state_class_to_string(StateClass state_class) { const LogString *state_class_to_string(StateClass state_class) {
switch (state_class) { switch (state_class) {

View File

@@ -91,18 +91,14 @@ void log_switch(const char *tag, const char *prefix, const char *type, Switch *o
LOG_STR_ARG(onoff)); LOG_STR_ARG(onoff));
// Add optional fields separately // Add optional fields separately
if (!obj->get_icon_ref().empty()) { obj->log_icon(tag, prefix);
ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon_ref().c_str());
}
if (obj->assumed_state()) { if (obj->assumed_state()) {
ESP_LOGCONFIG(tag, "%s Assumed State: YES", prefix); ESP_LOGCONFIG(tag, "%s Assumed State: YES", prefix);
} }
if (obj->is_inverted()) { if (obj->is_inverted()) {
ESP_LOGCONFIG(tag, "%s Inverted: YES", prefix); ESP_LOGCONFIG(tag, "%s Inverted: YES", prefix);
} }
if (!obj->get_device_class_ref().empty()) { obj->log_device_class(tag, prefix);
ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->get_device_class_ref().c_str());
}
} }
} }

View File

@@ -12,9 +12,7 @@ namespace text {
#define LOG_TEXT(prefix, type, obj) \ #define LOG_TEXT(prefix, type, obj) \
if ((obj) != nullptr) { \ if ((obj) != nullptr) { \
ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \ ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
if (!(obj)->get_icon_ref().empty()) { \ (obj)->log_icon(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Icon: '%s'", prefix, (obj)->get_icon_ref().c_str()); \
} \
} }
/** Base-class for all text inputs. /** Base-class for all text inputs.

View File

@@ -7,18 +7,10 @@ namespace text_sensor {
static const char *const TAG = "text_sensor"; static const char *const TAG = "text_sensor";
void log_text_sensor(const char *tag, const char *prefix, const char *type, TextSensor *obj) { void log_text_sensor(const char *tag, const char *prefix, const char *type, TextSensor *obj) {
if (obj == nullptr) { if (obj != nullptr) {
return;
}
ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str()); ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str());
obj->log_device_class(tag, prefix);
if (!obj->get_device_class_ref().empty()) { obj->log_icon(tag, prefix);
ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->get_device_class_ref().c_str());
}
if (!obj->get_icon_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon_ref().c_str());
} }
} }

View File

@@ -19,9 +19,7 @@ const extern float VALVE_CLOSED;
if (traits_.get_is_assumed_state()) { \ if (traits_.get_is_assumed_state()) { \
ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \ ESP_LOGCONFIG(TAG, "%s Assumed State: YES", prefix); \
} \ } \
if (!(obj)->get_device_class_ref().empty()) { \ (obj)->log_device_class(TAG, prefix); \
ESP_LOGCONFIG(TAG, "%s Device Class: '%s'", prefix, (obj)->get_device_class_ref().c_str()); \
} \
} }
class Valve; class Valve;

View File

@@ -45,6 +45,14 @@ void EntityBase::set_icon(const char *icon) {
#endif #endif
} }
void EntityBase::log_icon(const char *tag, const char *prefix) const {
#ifdef USE_ENTITY_ICON
if (!this->get_icon_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, this->get_icon_ref().c_str());
}
#endif
}
// Check if the object_id is dynamic (changes with MAC suffix) // Check if the object_id is dynamic (changes with MAC suffix)
bool EntityBase::is_object_id_dynamic_() const { bool EntityBase::is_object_id_dynamic_() const {
return !this->flags_.has_own_name && App.is_name_add_mac_suffix_enabled(); return !this->flags_.has_own_name && App.is_name_add_mac_suffix_enabled();
@@ -91,6 +99,12 @@ std::string EntityBase_DeviceClass::get_device_class() {
void EntityBase_DeviceClass::set_device_class(const char *device_class) { this->device_class_ = device_class; } void EntityBase_DeviceClass::set_device_class(const char *device_class) { this->device_class_ = device_class; }
void EntityBase_DeviceClass::log_device_class(const char *tag, const char *prefix) const {
if (!this->get_device_class_ref().empty()) {
ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, this->get_device_class_ref().c_str());
}
}
std::string EntityBase_UnitOfMeasurement::get_unit_of_measurement() { std::string EntityBase_UnitOfMeasurement::get_unit_of_measurement() {
if (this->unit_of_measurement_ == nullptr) if (this->unit_of_measurement_ == nullptr)
return ""; return "";

View File

@@ -74,6 +74,9 @@ class EntityBase {
#endif #endif
} }
/// Log entity icon if present (guarded by USE_ENTITY_ICON)
void log_icon(const char *tag, const char *prefix) const;
#ifdef USE_DEVICES #ifdef USE_DEVICES
// Get/set this entity's device id // Get/set this entity's device id
uint32_t get_device_id() const { uint32_t get_device_id() const {
@@ -171,6 +174,9 @@ class EntityBase_DeviceClass { // NOLINT(readability-identifier-naming)
return this->device_class_ == nullptr ? EMPTY_STRING : StringRef(this->device_class_); return this->device_class_ == nullptr ? EMPTY_STRING : StringRef(this->device_class_);
} }
/// Log entity device class if present
void log_device_class(const char *tag, const char *prefix) const;
protected: protected:
const char *device_class_{nullptr}; ///< Device class override const char *device_class_{nullptr}; ///< Device class override
}; };
@@ -247,4 +253,5 @@ template<typename T> class StatefulEntityBase : public EntityBase {
CallbackManager<void(optional<T> previous, optional<T> current)> *full_state_callbacks_{}; CallbackManager<void(optional<T> previous, optional<T> current)> *full_state_callbacks_{};
CallbackManager<void(T)> *state_callbacks_{}; CallbackManager<void(T)> *state_callbacks_{};
}; };
} // namespace esphome } // namespace esphome