Merge pull request #1450 from dalathegreat/feature/mqtt_status_info

Adding event_level and event_level_color to mqtt information
This commit is contained in:
Daniel Öster 2025-08-21 23:37:39 +03:00 committed by GitHub
commit 0737c7b6b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 58 additions and 31 deletions

View file

@ -141,7 +141,9 @@ SensorConfig batterySensorConfigTemplate[] = {
{"balancing_active_cells", "Balancing Active Cells", "", "", "", always}}; {"balancing_active_cells", "Balancing Active Cells", "", "", "", always}};
SensorConfig globalSensorConfigTemplate[] = {{"bms_status", "BMS Status", "", "", "", always}, SensorConfig globalSensorConfigTemplate[] = {{"bms_status", "BMS Status", "", "", "", always},
{"pause_status", "Pause Status", "", "", "", always}}; {"pause_status", "Pause Status", "", "", "", always},
{"event_level", "Event Level", "", "", "", always},
{"emulator_status", "Emulator Status", "", "", "", always}};
static std::list<SensorConfig> sensorConfigs; static std::list<SensorConfig> sensorConfigs;
@ -311,6 +313,10 @@ static bool publish_common_info(void) {
set_battery_attributes(doc, datalayer.battery2, "_2", battery2->supports_charged_energy()); set_battery_attributes(doc, datalayer.battery2, "_2", battery2->supports_charged_energy());
} }
} }
doc["event_level"] = get_event_level_string(get_event_level());
doc["emulator_status"] = get_emulator_status_string(get_emulator_status());
serializeJson(doc, mqtt_msg); serializeJson(doc, mqtt_msg);
if (mqtt_publish(state_topic.c_str(), mqtt_msg, false) == false) { if (mqtt_publish(state_topic.c_str(), mqtt_msg, false) == false) {
#ifdef DEBUG_LOG #ifdef DEBUG_LOG

View file

@ -14,6 +14,7 @@ typedef struct {
static EVENT_TYPE events; static EVENT_TYPE events;
static const char* EVENTS_ENUM_TYPE_STRING[] = {EVENTS_ENUM_TYPE(GENERATE_STRING)}; static const char* EVENTS_ENUM_TYPE_STRING[] = {EVENTS_ENUM_TYPE(GENERATE_STRING)};
static const char* EVENTS_LEVEL_TYPE_STRING[] = {EVENTS_LEVEL_TYPE(GENERATE_STRING)}; static const char* EVENTS_LEVEL_TYPE_STRING[] = {EVENTS_LEVEL_TYPE(GENERATE_STRING)};
static const char* EMULATOR_STATUS_STRING[] = {EMULATOR_STATUS(GENERATE_STRING)};
/* Local function prototypes */ /* Local function prototypes */
static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched); static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched);
@ -393,6 +394,11 @@ const char* get_event_level_string(EVENTS_ENUM_TYPE event) {
return EVENTS_LEVEL_TYPE_STRING[events.entries[event].level] + 12; return EVENTS_LEVEL_TYPE_STRING[events.entries[event].level] + 12;
} }
const char* get_event_level_string(EVENTS_LEVEL_TYPE event_level) {
// Return the event level but skip "EVENT_LEVEL_TYPE_" that should always be first
return EVENTS_LEVEL_TYPE_STRING[event_level] + 17;
}
const EVENTS_STRUCT_TYPE* get_event_pointer(EVENTS_ENUM_TYPE event) { const EVENTS_STRUCT_TYPE* get_event_pointer(EVENTS_ENUM_TYPE event) {
return &events.entries[event]; return &events.entries[event];
} }
@ -401,6 +407,27 @@ EVENTS_LEVEL_TYPE get_event_level(void) {
return events.level; return events.level;
} }
EMULATOR_STATUS get_emulator_status() {
switch (events.level) {
case EVENT_LEVEL_DEBUG:
case EVENT_LEVEL_INFO:
return EMULATOR_STATUS::STATUS_OK;
case EVENT_LEVEL_WARNING:
return EMULATOR_STATUS::STATUS_WARNING;
case EVENT_LEVEL_UPDATE:
return EMULATOR_STATUS::STATUS_UPDATING;
case EVENT_LEVEL_ERROR:
return EMULATOR_STATUS::STATUS_ERROR;
default:
return EMULATOR_STATUS::STATUS_OK;
}
}
const char* get_emulator_status_string(EMULATOR_STATUS status) {
// Return the status string but skip "STATUS_" that should always be first
return EMULATOR_STATUS_STRING[status] + 7;
}
/* Local functions */ /* Local functions */
static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) { static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) {

View file

@ -126,6 +126,14 @@ typedef enum { EVENTS_ENUM_TYPE(GENERATE_ENUM) } EVENTS_ENUM_TYPE;
typedef enum { EVENTS_LEVEL_TYPE(GENERATE_ENUM) } EVENTS_LEVEL_TYPE; typedef enum { EVENTS_LEVEL_TYPE(GENERATE_ENUM) } EVENTS_LEVEL_TYPE;
#define EMULATOR_STATUS(XX) \
XX(STATUS_OK) \
XX(STATUS_WARNING) \
XX(STATUS_ERROR) \
XX(STATUS_UPDATING)
typedef enum { EMULATOR_STATUS(GENERATE_ENUM) } EMULATOR_STATUS;
typedef enum { typedef enum {
EVENT_STATE_PENDING = 0, EVENT_STATE_PENDING = 0,
EVENT_STATE_INACTIVE, EVENT_STATE_INACTIVE,
@ -151,8 +159,11 @@ struct EventData {
const char* get_event_enum_string(EVENTS_ENUM_TYPE event); const char* get_event_enum_string(EVENTS_ENUM_TYPE event);
String get_event_message_string(EVENTS_ENUM_TYPE event); String get_event_message_string(EVENTS_ENUM_TYPE event);
const char* get_event_level_string(EVENTS_ENUM_TYPE event); const char* get_event_level_string(EVENTS_ENUM_TYPE event);
const char* get_event_level_string(EVENTS_LEVEL_TYPE event_level);
EVENTS_LEVEL_TYPE get_event_level(void); EVENTS_LEVEL_TYPE get_event_level(void);
EMULATOR_STATUS get_emulator_status();
const char* get_emulator_status_string(EMULATOR_STATUS status);
void init_events(void); void init_events(void);
void set_event_latched(EVENTS_ENUM_TYPE event, uint8_t data); void set_event_latched(EVENTS_ENUM_TYPE event, uint8_t data);

View file

@ -32,10 +32,6 @@ void led_exe(void) {
led->exe(); led->exe();
} }
led_color led_get_color() {
return led->color;
}
void LED::exe(void) { void LED::exe(void) {
// Update brightness // Update brightness
@ -53,27 +49,21 @@ void LED::exe(void) {
} }
// Set color // Set color
switch (get_event_level()) { switch (get_emulator_status()) {
case EVENT_LEVEL_INFO: case EMULATOR_STATUS::STATUS_OK:
color = led_color::GREEN;
pixels.setPixelColor(COLOR_GREEN(brightness)); // Green pulsing LED pixels.setPixelColor(COLOR_GREEN(brightness)); // Green pulsing LED
break; break;
case EVENT_LEVEL_WARNING: case EMULATOR_STATUS::STATUS_WARNING:
color = led_color::YELLOW;
pixels.setPixelColor(COLOR_YELLOW(brightness)); // Yellow pulsing LED pixels.setPixelColor(COLOR_YELLOW(brightness)); // Yellow pulsing LED
break; break;
case EVENT_LEVEL_DEBUG: case EMULATOR_STATUS::STATUS_ERROR:
case EVENT_LEVEL_UPDATE:
color = led_color::BLUE;
pixels.setPixelColor(COLOR_BLUE(brightness)); // Blue pulsing LED
break;
case EVENT_LEVEL_ERROR:
color = led_color::RED;
pixels.setPixelColor(COLOR_RED(esp32hal->LED_MAX_BRIGHTNESS())); // Red LED full brightness pixels.setPixelColor(COLOR_RED(esp32hal->LED_MAX_BRIGHTNESS())); // Red LED full brightness
break; break;
default: case EMULATOR_STATUS::STATUS_UPDATING:
pixels.setPixelColor(COLOR_BLUE(brightness)); // Blue pulsing LED
break; break;
} }
pixels.show(); // This sends the updated pixel color to the hardware. pixels.show(); // This sends the updated pixel color to the hardware.
} }

View file

@ -6,8 +6,6 @@
class LED { class LED {
public: public:
led_color color = led_color::GREEN;
LED(gpio_num_t pin, uint8_t maxBrightness) LED(gpio_num_t pin, uint8_t maxBrightness)
: pixels(pin), max_brightness(maxBrightness), brightness(maxBrightness), mode(led_mode_enum::CLASSIC) {} : pixels(pin), max_brightness(maxBrightness), brightness(maxBrightness), mode(led_mode_enum::CLASSIC) {}
@ -31,6 +29,5 @@ class LED {
bool led_init(void); bool led_init(void);
void led_exe(void); void led_exe(void);
led_color led_get_color(void);
#endif // LED_H_ #endif // LED_H_

View file

@ -21,7 +21,6 @@ enum class comm_interface {
Highest Highest
}; };
enum led_color { GREEN, YELLOW, RED, BLUE };
enum led_mode_enum { CLASSIC, FLOW, HEARTBEAT }; enum led_mode_enum { CLASSIC, FLOW, HEARTBEAT };
enum PrechargeState { enum PrechargeState {
AUTO_PRECHARGE_IDLE, AUTO_PRECHARGE_IDLE,

View file

@ -943,21 +943,18 @@ String processor(const String& var) {
content += "<div style='background-color: "; content += "<div style='background-color: ";
} }
switch (led_get_color()) { switch (get_emulator_status()) {
case led_color::GREEN: case EMULATOR_STATUS::STATUS_OK:
content += "#2D3F2F;"; content += "#2D3F2F;";
break; break;
case led_color::YELLOW: case EMULATOR_STATUS::STATUS_WARNING:
content += "#F5CC00;"; content += "#F5CC00;";
break; break;
case led_color::BLUE: case EMULATOR_STATUS::STATUS_ERROR:
content += "#2B35AF;"; // Blue in test mode
break;
case led_color::RED:
content += "#A70107;"; content += "#A70107;";
break; break;
default: // Some new color, make background green case EMULATOR_STATUS::STATUS_UPDATING:
content += "#2D3F2F;"; content += "#2B35AF;"; // Blue in test mode
break; break;
} }