From c4b814d489b3bae7f3963b15a273b15f3c133b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olaf=20L=C3=BCke?= Date: Sat, 14 Sep 2024 21:21:16 +0200 Subject: [PATCH] front_panel: Imprive icon handling --- ...warp_front_panel_firmware_2_0_0_beta1.zbin | Bin 23548 -> 0 bytes ...warp_front_panel_firmware_2_0_0_beta2.zbin | Bin 0 -> 23510 bytes .../src/modules/front_panel/front_panel.cpp | 76 +++++++++++++++--- .../src/modules/front_panel/front_panel.h | 1 + .../src/modules/front_panel/sprite_defines.h | 5 +- software/src/modules/heating/heating.cpp | 4 + software/src/modules/heating/heating.h | 1 + 7 files changed, 73 insertions(+), 14 deletions(-) delete mode 100644 software/src/modules/front_panel/bricklet_warp_front_panel_firmware_2_0_0_beta1.zbin create mode 100644 software/src/modules/front_panel/bricklet_warp_front_panel_firmware_2_0_0_beta2.zbin diff --git a/software/src/modules/front_panel/bricklet_warp_front_panel_firmware_2_0_0_beta1.zbin b/software/src/modules/front_panel/bricklet_warp_front_panel_firmware_2_0_0_beta1.zbin deleted file mode 100644 index c4343a3ffbfac99a2e88a0ed6110946f894e3739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23548 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 W9s=S&-U$Bhl!AqU$<+GC=|2DoeDE6p diff --git a/software/src/modules/front_panel/bricklet_warp_front_panel_firmware_2_0_0_beta2.zbin b/software/src/modules/front_panel/bricklet_warp_front_panel_firmware_2_0_0_beta2.zbin new file mode 100644 index 0000000000000000000000000000000000000000..4b123fed90e2f2796b5fe2d55890ddd0cd3bd806 GIT binary patch literal 23510 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 literal 0 HcmV?d00001 diff --git a/software/src/modules/front_panel/front_panel.cpp b/software/src/modules/front_panel/front_panel.cpp index 57abecd35..d87037a95 100644 --- a/software/src/modules/front_panel/front_panel.cpp +++ b/software/src/modules/front_panel/front_panel.cpp @@ -348,16 +348,22 @@ int FrontPanel::update_front_page_meter(const uint8_t index, const TileType type { String str1 = "Bezug"; String str2 = "-- kW"; + uint32_t icon_index = SPRITE_ICON_ENERGY; #if MODULE_METERS_AVAILABLE() float watt = 0; MeterValueAvailability meter_availability = meters.get_power_real(param, &watt); - if (watt < 0) { - watt = -watt; - str1 = "Einsp."; - } - if (meter_availability == MeterValueAvailability::Fresh) { + if (watt > 0) { + icon_index = SPRITE_ICON_ENERGY_IMPORT; + } else if (watt == 0) { + // Different str1 here if no energy is flowing? + } else if (watt < 0) { + icon_index = SPRITE_ICON_ENERGY_EXPORT; + watt = -watt; + str1 = "Einsp."; + } + str2 = watt_value_to_display_string(watt); } #endif @@ -365,7 +371,7 @@ int FrontPanel::update_front_page_meter(const uint8_t index, const TileType type return set_display_front_page_icon_with_check( index, true, - watt < 0 ? SPRITE_ICON_ENERGY_EXPORT : SPRITE_ICON_ENERGY_IMPORT, + icon_index, str1.c_str(), FONT_24PX_FREEMONO_WHITE_ON_BLACK, str2.c_str(), @@ -403,7 +409,7 @@ int FrontPanel::update_front_page_day_ahead_prices(const uint8_t index, const Ti return set_display_front_page_icon_with_check( index, true, - SPRITE_ICON_MONEY, + SPRITE_ICON_WALLET_EURO, str1.c_str(), FONT_24PX_FREEMONO_WHITE_ON_BLACK, str2.c_str(), @@ -415,6 +421,7 @@ int FrontPanel::update_front_page_solar_forecast(const uint8_t index, const Tile { String str1 = "------"; String str2 = "-- kWh"; + uint32_t icon_index = SPRITE_ICON_SUN; #if MODULE_SOLAR_FORECAST_AVAILABLE() DataReturn kwh{}; @@ -431,13 +438,18 @@ int FrontPanel::update_front_page_solar_forecast(const uint8_t index, const Tile if (kwh.data_available) { str2 = watt_hour_value_to_display_string(kwh.data); + // If 5 kWh is a high or a low value of course depends on the size of the pv system. + // On average, 5 kWh in a day sounds low enough to show some clouds. + if (kwh.data <= 5) { + icon_index = SPRITE_ICON_CLOUD_SUN; + } } #endif return set_display_front_page_icon_with_check( index, true, - SPRITE_ICON_SUN, + icon_index, str1.c_str(), FONT_24PX_FREEMONO_WHITE_ON_BLACK, str2.c_str(), @@ -457,7 +469,7 @@ int FrontPanel::update_front_page_energy_manager_status(const uint8_t index, con &device, index, true, - SPRITE_ICON_COG, // TODO: WEM icon? + SPRITE_ICON_WRENCH, str1.c_str(), FONT_24PX_FREEMONO_WHITE_ON_BLACK, str2.c_str(), @@ -470,18 +482,29 @@ int FrontPanel::update_front_page_heating_status(const uint8_t index, const Tile const SemanticVersion version; String str1 = "SG Rdy"; String str2 = "--"; + uint32_t icon_index = SPRITE_ICON_HEATING; + #if MODULE_HEATING_AVAILABLE() if (heating.is_active()) { - str2 = heating.is_sg_ready_output1_closed() ? "Ein" : "Aus"; + // First check for SG Ready output 0 (§14EnWG blocked or not) + // §14EnWG has priority if active. Afterwards check for heating overdrive + if (heating.is_sg_ready_output0_closed()) { + str1 = "14EnWG"; + str2 = "Block."; + icon_index = SPRITE_ICON_HEATING_OFF; + } else { + const bool closed1 = heating.is_sg_ready_output1_closed(); + str2 = closed1 ? "Ein" : "Aus"; + icon_index = closed1 ? SPRITE_ICON_HEATING_HOT : SPRITE_ICON_HEATING; + } } #endif - return tf_warp_front_panel_set_display_front_page_icon( &device, index, true, - SPRITE_ICON_HEATING, + icon_index, str1.c_str(), FONT_24PX_FREEMONO_WHITE_ON_BLACK, str2.c_str(), @@ -534,11 +557,40 @@ void FrontPanel::update_front_page() } } +void FrontPanel::update_led() +{ + // Go trough possible states by decreasing priority and return after LED is set + + // Check if Wifi is enabled but not connected + if (wifi.get_connection_state() == WifiState::NotConnected) { + set_led(LEDPattern::Blinking, LEDColor::Red); + return; + } + + // TODO: Add more error checks here + + // Check if something is charging +#if MODULE_CHARGE_MANAGER_AVAILABLE() + size_t charger_count = charge_manager.charger_count; + if (charger_count > 0) { + const float current = charge_manager.get_allocated_currents()->pv; // mA + if (current > 100) { + set_led(LEDPattern::Breathing, LEDColor::Green); + return; + } + } +#endif + + // Default is green + set_led(LEDPattern::On, LEDColor::Green); +} + void FrontPanel::update() { update_wifi(); update_status_bar(); update_front_page(); + update_led(); } String FrontPanel::watt_value_to_display_string(const float watt) diff --git a/software/src/modules/front_panel/front_panel.h b/software/src/modules/front_panel/front_panel.h index 294ee782f..7de6ee724 100644 --- a/software/src/modules/front_panel/front_panel.h +++ b/software/src/modules/front_panel/front_panel.h @@ -84,6 +84,7 @@ class FrontPanel : public DeviceModule