From 980d914ffdc2d2be8f6418423af0c8a17326960d Mon Sep 17 00:00:00 2001 From: Matt Holmes Date: Thu, 21 Aug 2025 08:58:55 +0100 Subject: [PATCH 1/4] Adding event_level and event_level_color to mqtt information --- Software/src/devboard/mqtt/mqtt.cpp | 30 ++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Software/src/devboard/mqtt/mqtt.cpp b/Software/src/devboard/mqtt/mqtt.cpp index 4a814230..5e94994d 100644 --- a/Software/src/devboard/mqtt/mqtt.cpp +++ b/Software/src/devboard/mqtt/mqtt.cpp @@ -141,7 +141,9 @@ SensorConfig batterySensorConfigTemplate[] = { {"balancing_active_cells", "Balancing Active Cells", "", "", "", always}}; SensorConfig globalSensorConfigTemplate[] = {{"bms_status", "BMS Status", "", "", "", always}, - {"pause_status", "Pause Status", "", "", "", always}}; + {"pause_status", "Pause Status", "", "", "", always}, + {"event_level", "Event Level", "", "", "", always}, + {"event_level_color", "Event Level Color", "", "", "", always}}; static std::list sensorConfigs; @@ -311,6 +313,32 @@ static bool publish_common_info(void) { set_battery_attributes(doc, datalayer.battery2, "_2", battery2->supports_charged_energy()); } } + + EVENTS_LEVEL_TYPE event_level = get_event_level(); + doc["event_level"] = String(event_level); + + // Use Home Assistant Colors https://github.com/home-assistant/core/blob/e2fdc6a98bdd22187688e70701fc3617423a714b/homeassistant/util/color.py#L19 + String event_level_color = ""; + switch (event_level) + { + case EVENT_LEVEL_INFO: + event_level_color = "green"; + break; + case EVENT_LEVEL_WARNING: + event_level_color = "yellow"; + break; + case EVENT_LEVEL_DEBUG: + case EVENT_LEVEL_UPDATE: + event_level_color = "blue"; + break; + case EVENT_LEVEL_ERROR: + event_level_color = "red"; + default: + event_level_color = "green"; + break; + } + doc["event_level_color"] = event_level_color; + serializeJson(doc, mqtt_msg); if (mqtt_publish(state_topic.c_str(), mqtt_msg, false) == false) { #ifdef DEBUG_LOG From d4f0e188fe7d09d4970fc8ff0ffac5b98af44845 Mon Sep 17 00:00:00 2001 From: Matt Holmes Date: Thu, 21 Aug 2025 17:33:15 +0100 Subject: [PATCH 2/4] Refactoring led handler, webserver and mqtt to all use a common BE status enum rather than relying on duplicatitng logic or using led color --- Software/src/devboard/mqtt/mqtt.cpp | 28 ++----------------- Software/src/devboard/utils/events.cpp | 27 ++++++++++++++++++ Software/src/devboard/utils/events.h | 11 ++++++++ Software/src/devboard/utils/led_handler.cpp | 18 ++++++------ Software/src/devboard/webserver/webserver.cpp | 15 ++++------ 5 files changed, 55 insertions(+), 44 deletions(-) diff --git a/Software/src/devboard/mqtt/mqtt.cpp b/Software/src/devboard/mqtt/mqtt.cpp index 5e94994d..0f7ca0b3 100644 --- a/Software/src/devboard/mqtt/mqtt.cpp +++ b/Software/src/devboard/mqtt/mqtt.cpp @@ -143,7 +143,7 @@ SensorConfig batterySensorConfigTemplate[] = { SensorConfig globalSensorConfigTemplate[] = {{"bms_status", "BMS Status", "", "", "", always}, {"pause_status", "Pause Status", "", "", "", always}, {"event_level", "Event Level", "", "", "", always}, - {"event_level_color", "Event Level Color", "", "", "", always}}; + {"emulator_status", "Emulator Status", "", "", "", always}}; static std::list sensorConfigs; @@ -314,30 +314,8 @@ static bool publish_common_info(void) { } } - EVENTS_LEVEL_TYPE event_level = get_event_level(); - doc["event_level"] = String(event_level); - - // Use Home Assistant Colors https://github.com/home-assistant/core/blob/e2fdc6a98bdd22187688e70701fc3617423a714b/homeassistant/util/color.py#L19 - String event_level_color = ""; - switch (event_level) - { - case EVENT_LEVEL_INFO: - event_level_color = "green"; - break; - case EVENT_LEVEL_WARNING: - event_level_color = "yellow"; - break; - case EVENT_LEVEL_DEBUG: - case EVENT_LEVEL_UPDATE: - event_level_color = "blue"; - break; - case EVENT_LEVEL_ERROR: - event_level_color = "red"; - default: - event_level_color = "green"; - break; - } - doc["event_level_color"] = event_level_color; + doc["event_level"] = get_event_level_string(get_event_level()); + doc["emulator_status"] = get_emulator_staus_string(get_emulator_status()); serializeJson(doc, mqtt_msg); if (mqtt_publish(state_topic.c_str(), mqtt_msg, false) == false) { diff --git a/Software/src/devboard/utils/events.cpp b/Software/src/devboard/utils/events.cpp index b5ba4a8f..2838cda0 100644 --- a/Software/src/devboard/utils/events.cpp +++ b/Software/src/devboard/utils/events.cpp @@ -14,6 +14,7 @@ typedef struct { static EVENT_TYPE events; 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* EMULATOR_STATUS_STRING[] = {EMULATOR_STATUS(GENERATE_STRING)}; /* Local function prototypes */ 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; } +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) { return &events.entries[event]; } @@ -401,6 +407,27 @@ EVENTS_LEVEL_TYPE get_event_level(void) { 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_staus_string(EMULATOR_STATUS status) { + // Return the status string but skip "STATUS_" that should always be first + return EMULATOR_STATUS_STRING[status] + 7; +} + /* Local functions */ static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) { diff --git a/Software/src/devboard/utils/events.h b/Software/src/devboard/utils/events.h index 7048ee75..0a9d41d5 100644 --- a/Software/src/devboard/utils/events.h +++ b/Software/src/devboard/utils/events.h @@ -126,6 +126,14 @@ typedef enum { EVENTS_ENUM_TYPE(GENERATE_ENUM) } EVENTS_ENUM_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 { EVENT_STATE_PENDING = 0, EVENT_STATE_INACTIVE, @@ -151,8 +159,11 @@ struct EventData { const char* get_event_enum_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_LEVEL_TYPE event_level); EVENTS_LEVEL_TYPE get_event_level(void); +EMULATOR_STATUS get_emulator_status(); +const char* get_emulator_staus_string(EMULATOR_STATUS status); void init_events(void); void set_event_latched(EVENTS_ENUM_TYPE event, uint8_t data); diff --git a/Software/src/devboard/utils/led_handler.cpp b/Software/src/devboard/utils/led_handler.cpp index 73fefb4d..0440723e 100644 --- a/Software/src/devboard/utils/led_handler.cpp +++ b/Software/src/devboard/utils/led_handler.cpp @@ -53,27 +53,25 @@ void LED::exe(void) { } // Set color - switch (get_event_level()) { - case EVENT_LEVEL_INFO: + switch (get_emulator_status()) { + case EMULATOR_STATUS::STATUS_OK: color = led_color::GREEN; pixels.setPixelColor(COLOR_GREEN(brightness)); // Green pulsing LED break; - case EVENT_LEVEL_WARNING: + case EMULATOR_STATUS::STATUS_WARNING: color = led_color::YELLOW; pixels.setPixelColor(COLOR_YELLOW(brightness)); // Yellow pulsing LED break; - case EVENT_LEVEL_DEBUG: - case EVENT_LEVEL_UPDATE: - color = led_color::BLUE; - pixels.setPixelColor(COLOR_BLUE(brightness)); // Blue pulsing LED - break; - case EVENT_LEVEL_ERROR: + case EMULATOR_STATUS::STATUS_ERROR: color = led_color::RED; pixels.setPixelColor(COLOR_RED(esp32hal->LED_MAX_BRIGHTNESS())); // Red LED full brightness break; - default: + case EMULATOR_STATUS::STATUS_UPDATING: + color = led_color::BLUE; + pixels.setPixelColor(COLOR_BLUE(brightness)); // Blue pulsing LED break; } + pixels.show(); // This sends the updated pixel color to the hardware. } diff --git a/Software/src/devboard/webserver/webserver.cpp b/Software/src/devboard/webserver/webserver.cpp index 4949bd86..95181360 100644 --- a/Software/src/devboard/webserver/webserver.cpp +++ b/Software/src/devboard/webserver/webserver.cpp @@ -943,21 +943,18 @@ String processor(const String& var) { content += "