From 1a00b71ee1c984bed9a5df2fdd40b33b2dbacafd Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Mon, 9 Oct 2023 02:21:58 +0900 Subject: [PATCH 1/7] replace_time_date_from & to in yaml --- components/ehmtxv2/EHMTX.cpp | 39 +++++++++++++++++++++++++++++- components/ehmtxv2/EHMTX.h | 7 ++++++ components/ehmtxv2/EHMTX_queue.cpp | 28 ++++++++++++++++++--- components/ehmtxv2/__init__.py | 14 +++++++++++ 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 01e9fc5b..20890caf 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -1,5 +1,7 @@ #include "esphome.h" #include +#include +//#include namespace esphome { @@ -772,6 +774,42 @@ namespace esphome this->special_font = font; } +std::string EHMTX::replace_time_date(std::string time_date, std::string replace_from_string, std::string replace_to_string) // Replace Time Date Strings / Trip5 + { + std::string replace_from_arr[30]; // AM + PM + 7 Days + 12 Months = 21 but 30 to be safe + std::string replace_to_arr[30]; + std::string replace_from; + std::string replace_to; + uint16_t replace_arr_n; + if (replace_from_string != "" && replace_to_string != "") + { + std::istringstream iss_from(replace_from_string); + std::vector replace_from_arr; + for(std::string s_from;iss_from>>s_from;) + replace_from_arr.push_back(s_from); + replace_arr_n = replace_from_arr.size(); + std::istringstream iss_to(replace_to_string); + std::vector replace_to_arr; + for(std::string s_to;iss_to>>s_to;) + replace_to_arr.push_back(s_to); + if (replace_to_arr.size() > replace_arr_n) { replace_arr_n = replace_to_arr.size(); } + uint16_t k = 0; + do + { + size_t pos = 0; + replace_from = replace_from_arr[k]; + replace_to = replace_to_arr[k]; + while (((pos = time_date.find(replace_from, pos)) != std::string::npos) && (pos !=0)) + { + time_date.replace(pos, replace_from.length(), replace_to); + pos += replace_to.length(); + } + k++; + } while (k < replace_arr_n); + } + return time_date; + } + void EHMTX::del_screen(std::string icon_name, int mode) { for (uint8_t i = 0; i < MAXQUEUE; i++) @@ -1380,7 +1418,6 @@ namespace esphome this->icon_count++; } - void EHMTX::draw_alarm() { if (this->display_alarm > 2) diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index c8de1657..13c97a56 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -159,6 +159,12 @@ namespace esphome void set_clock_time(uint16_t t = 10); void set_show_day_of_week(bool b=true); void set_show_seconds(bool b=false); + + //std::string replace_time_date_from; + //std::string replace_time_date_to; + std::string replace_time_date(std::string time_old, std::string replace_time_date_from, std::string replace_time_date_to); + //void set_replace_time_date (std::string replace_time_date_from, std::string replace_time_date_to); + void set_brightness(int b); void set_display_on(); void set_display_off(); @@ -168,6 +174,7 @@ namespace esphome #endif void set_default_font(display::BaseFont *font); void set_special_font(display::BaseFont *font); + void show_rindicator(int r = C_RED, int g = C_GREEN, int b = C_BLUE, int s = 3); void show_lindicator(int r = C_RED, int g = C_GREEN, int b = C_BLUE, int s = 3); void set_text_color(int r = C_RED, int g = C_GREEN, int b = C_BLUE); diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index 74811909..03bebee5 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -315,8 +315,17 @@ namespace esphome { color_ = (this->mode == MODE_RAINBOW_CLOCK) ? this->config_->rainbow_color : this->text_color; time_t ts = this->config_->clock->now().timestamp; - this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_TIME_FORMAT, - this->config_->clock->now()); + if (EHMTXv2_REPLACE_TIME_DATE_FROM != "" && EHMTXv2_REPLACE_TIME_DATE_TO != "") // check for replace active + { + std::string time_old = this->config_->clock->now().strftime(EHMTXv2_TIME_FORMAT).c_str(); + time_old = this->config_->replace_time_date(time_old, EHMTXv2_REPLACE_TIME_DATE_FROM, EHMTXv2_REPLACE_TIME_DATE_TO); + const char* time_new = &time_old[0]; + this->config_->display->print(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, time_new); + } else { + this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_TIME_FORMAT, + this->config_->clock->now()); + } + if ((this->config_->clock->now().second % 2 == 0) && this->config_->show_seconds) { this->config_->display->draw_pixel_at(0, 0, color_); @@ -338,8 +347,16 @@ namespace esphome { color_ = (this->mode == MODE_RAINBOW_DATE) ? this->config_->rainbow_color : this->text_color; time_t ts = this->config_->clock->now().timestamp; - this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_DATE_FORMAT, - this->config_->clock->now()); + if (EHMTXv2_REPLACE_TIME_DATE_FROM != "" && EHMTXv2_REPLACE_TIME_DATE_TO != "") // check for replace active + { + std::string time_old = this->config_->clock->now().strftime(EHMTXv2_DATE_FORMAT).c_str(); + time_old = this->config_->replace_time_date(time_old, EHMTXv2_REPLACE_TIME_DATE_FROM, EHMTXv2_REPLACE_TIME_DATE_TO); + const char* time_new = &time_old[0]; + this->config_->display->print(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, time_new); + } else { + this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_DATE_FORMAT, + this->config_->clock->now()); + } if ((this->config_->clock->now().second % 2 == 0) && this->config_->show_seconds) { this->config_->display->draw_pixel_at(0, 0, color_); @@ -611,4 +628,7 @@ namespace esphome ESP_LOGD(TAG, "calc_scroll_time: mode: %d text: \"%s\" pixels %d calculated: %d defined: %d max_steps: %d", this->mode, text.c_str(), this->pixels_, this->screen_time_, screen_time, this->scroll_reset); } + } + + diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index 5806d51e..9e12d36e 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -109,6 +109,8 @@ def rgb565_888(v565): CONF_ON_ICON_ERROR = "on_icon_error" CONF_ON_ADD_SCREEN = "on_add_screen" CONF_WEEKDAYTEXT = "weekdays" +CONF_REPLACE_TIME_DATE_FROM = "replace_time_date_from" +CONF_REPLACE_TIME_DATE_TO = "replace_time_date_to" CONF_ON_EXPIRED_SCREEN= "on_expired_screen" CONF_SHOW_SECONDS = "show_seconds" CONF_SCROLL_SMALL_TEXT = "scroll_small_text" @@ -151,6 +153,12 @@ def rgb565_888(v565): cv.Optional( CONF_WEEKDAYTEXT, default="SOMODIMIDOFRSA" ): cv.string, + cv.Optional( + CONF_REPLACE_TIME_DATE_FROM, default="" + ): cv.string, + cv.Optional( + CONF_REPLACE_TIME_DATE_TO, default="" + ): cv.string, cv.Optional( CONF_ALWAYS_SHOW_RLINDICATORS, default=False ): cv.boolean, @@ -430,6 +438,12 @@ def thumbnails(frames): if config[CONF_WEEKDAYTEXT]: cg.add_define("EHMTXv2_WEEKDAYTEXT",config[CONF_WEEKDAYTEXT]) + if config[CONF_REPLACE_TIME_DATE_FROM]: + cg.add_define("EHMTXv2_REPLACE_TIME_DATE_FROM",config[CONF_REPLACE_TIME_DATE_FROM]) + + if config[CONF_REPLACE_TIME_DATE_TO]: + cg.add_define("EHMTXv2_REPLACE_TIME_DATE_TO",config[CONF_REPLACE_TIME_DATE_TO]) + cg.add_define("EHMTXv2_SCROLL_INTERVALL",config[CONF_SCROLLINTERVAL]) cg.add_define("EHMTXv2_RAINBOW_INTERVALL",config[CONF_RAINBOWINTERVAL]) cg.add_define("EHMTXv2_FRAME_INTERVALL",config[CONF_FRAMEINTERVAL]) From 6f173f6f95701c8f6f7b6da7f9e555567500b8dc Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 10 Oct 2023 05:00:05 +0900 Subject: [PATCH 2/7] Time Date Replace --- components/ehmtxv2/EHMTX.cpp | 37 ++++++++++++++++++------- components/ehmtxv2/EHMTX.h | 9 ++---- components/ehmtxv2/EHMTX_queue.cpp | 43 ++++++++++++++++++----------- components/ehmtxv2/__init__.py | 19 ++++++++++--- components/ehmtxv2/ehmtxv2.rar | Bin 0 -> 21024 bytes 5 files changed, 72 insertions(+), 36 deletions(-) create mode 100644 components/ehmtxv2/ehmtxv2.rar diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index dbb09106..d1d2a8d2 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -1,7 +1,7 @@ #include "esphome.h" #include #include -//#include +#include namespace esphome { @@ -774,8 +774,23 @@ namespace esphome this->special_font = font; } -std::string EHMTX::replace_time_date(std::string time_date, std::string replace_from_string, std::string replace_to_string) // Replace Time Date Strings / Trip5 + void EHMTX::set_replace_time_date_active(bool b) { + this->replace_time_date_active = b; + if (b) + { + ESP_LOGI(TAG, "replace_time_date on"); + } + else + { + ESP_LOGI(TAG, "replace_time_date off"); + } + } + + std::string EHMTX::replace_time_date(std::string time_date) // Replace Time Date Strings / Trip5 + { + std::string replace_from_string = EHMTXv2_REPLACE_TIME_DATE_FROM; + std::string replace_to_string = EHMTXv2_REPLACE_TIME_DATE_TO; std::string replace_from_arr[30]; // AM + PM + 7 Days + 12 Months = 21 but 30 to be safe std::string replace_to_arr[30]; std::string replace_from; @@ -792,19 +807,21 @@ std::string EHMTX::replace_time_date(std::string time_date, std::string replace_ std::vector replace_to_arr; for(std::string s_to;iss_to>>s_to;) replace_to_arr.push_back(s_to); - if (replace_to_arr.size() > replace_arr_n) { replace_arr_n = replace_to_arr.size(); } + if (replace_to_arr.size() < replace_arr_n) { replace_arr_n = replace_to_arr.size(); } uint16_t k = 0; do { - size_t pos = 0; - replace_from = replace_from_arr[k]; - replace_to = replace_to_arr[k]; - while (((pos = time_date.find(replace_from, pos)) != std::string::npos) && (pos !=0)) + std::vector data(time_date.begin(), time_date.end()); + std::vector pattern(replace_from_arr[k].begin(), replace_from_arr[k].end()); + std::vector replaceData(replace_to_arr[k].begin(), replace_to_arr[k].end()); + std::vector::iterator itr; + while((itr = std::search(data.begin(), data.end(), pattern.begin(), pattern.end())) != data.end()) { - time_date.replace(pos, replace_from.length(), replace_to); - pos += replace_to.length(); + data.erase(itr, itr + pattern.size()); + data.insert(itr, replaceData.begin(), replaceData.end()); } - k++; + time_date = std::string(data.begin(), data.end()); + k++; } while (k < replace_arr_n); } return time_date; diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index 58b01c64..3f670c02 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -159,12 +159,6 @@ namespace esphome void set_clock_time(uint16_t t = 10); void set_show_day_of_week(bool b=true); void set_show_seconds(bool b=false); - - //std::string replace_time_date_from; - //std::string replace_time_date_to; - std::string replace_time_date(std::string time_old, std::string replace_time_date_from, std::string replace_time_date_to); - //void set_replace_time_date (std::string replace_time_date_from, std::string replace_time_date_to); - void set_brightness(int b); void set_display_on(); void set_display_off(); @@ -215,6 +209,9 @@ namespace esphome void draw_rindicator(); void draw_lindicator(); + void set_replace_time_date_active(bool b=false); + bool replace_time_date_active; + std::string replace_time_date(std::string time_date); int GetWeekdayCharCount(); std::string GetWeekdayChar(int position); diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index 35f00bee..71508e4e 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -315,17 +315,15 @@ namespace esphome { color_ = (this->mode == MODE_RAINBOW_CLOCK) ? this->config_->rainbow_color : this->text_color; time_t ts = this->config_->clock->now().timestamp; - if (EHMTXv2_REPLACE_TIME_DATE_FROM != "" && EHMTXv2_REPLACE_TIME_DATE_TO != "") // check for replace active + if (this->config_->replace_time_date_active) // check for replace active { - std::string time_old = this->config_->clock->now().strftime(EHMTXv2_TIME_FORMAT).c_str(); - time_old = this->config_->replace_time_date(time_old, EHMTXv2_REPLACE_TIME_DATE_FROM, EHMTXv2_REPLACE_TIME_DATE_TO); - const char* time_new = &time_old[0]; - this->config_->display->print(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, time_new); + std::string time_new = this->config_->clock->now().strftime(EHMTXv2_TIME_FORMAT).c_str(); + time_new = this->config_->replace_time_date(time_new); + this->config_->display->printf(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, "%s", time_new.c_str()); } else { this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_TIME_FORMAT, this->config_->clock->now()); } - if ((this->config_->clock->now().second % 2 == 0) && this->config_->show_seconds) { this->config_->display->draw_pixel_at(0, 0, color_); @@ -347,15 +345,14 @@ namespace esphome { color_ = (this->mode == MODE_RAINBOW_DATE) ? this->config_->rainbow_color : this->text_color; time_t ts = this->config_->clock->now().timestamp; - if (EHMTXv2_REPLACE_TIME_DATE_FROM != "" && EHMTXv2_REPLACE_TIME_DATE_TO != "") // check for replace active + if (this->config_->replace_time_date_active) // check for replace active { - std::string time_old = this->config_->clock->now().strftime(EHMTXv2_DATE_FORMAT).c_str(); - time_old = this->config_->replace_time_date(time_old, EHMTXv2_REPLACE_TIME_DATE_FROM, EHMTXv2_REPLACE_TIME_DATE_TO); - const char* time_new = &time_old[0]; - this->config_->display->print(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, time_new); + std::string time_new = this->config_->clock->now().strftime(EHMTXv2_DATE_FORMAT).c_str(); + time_new = this->config_->replace_time_date(time_new); + this->config_->display->printf(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, "%s", time_new.c_str()); } else { this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_DATE_FORMAT, - this->config_->clock->now()); + this->config_->clock->now()); } if ((this->config_->clock->now().second % 2 == 0) && this->config_->show_seconds) { @@ -384,13 +381,27 @@ namespace esphome time_t ts = this->config_->clock->now().timestamp; if (this->mode == MODE_ICON_CLOCK) { - this->config_->display->strftime(xoffset + 19, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_TIME_FORMAT, - this->config_->clock->now()); + if (this->config_->replace_time_date_active) // check for replace active + { + std::string time_new = this->config_->clock->now().strftime(EHMTXv2_TIME_FORMAT).c_str(); + time_new = this->config_->replace_time_date(time_new); + this->config_->display->printf(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, "%s", time_new.c_str()); + } else { + this->config_->display->strftime(xoffset + 19, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_TIME_FORMAT, + this->config_->clock->now()); + } } else { - this->config_->display->strftime(xoffset + 19, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_DATE_FORMAT, - this->config_->clock->now()); + if (this->config_->replace_time_date_active) // check for replace active + { + std::string time_new = this->config_->clock->now().strftime(EHMTXv2_DATE_FORMAT).c_str(); + time_new = this->config_->replace_time_date(time_new); + this->config_->display->printf(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, "%s", time_new.c_str()); + } else { + this->config_->display->strftime(xoffset + 19, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, EHMTXv2_DATE_FORMAT, + this->config_->clock->now()); + } } this->config_->display->image(0, 0, this->config_->icons[this->icon]); this->config_->draw_day_of_week(true); diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index 9e12d36e..15049803 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -438,11 +438,22 @@ def thumbnails(frames): if config[CONF_WEEKDAYTEXT]: cg.add_define("EHMTXv2_WEEKDAYTEXT",config[CONF_WEEKDAYTEXT]) - if config[CONF_REPLACE_TIME_DATE_FROM]: - cg.add_define("EHMTXv2_REPLACE_TIME_DATE_FROM",config[CONF_REPLACE_TIME_DATE_FROM]) + cg.add_define("EHMTXv2_REPLACE_TIME_DATE_TO",config[CONF_REPLACE_TIME_DATE_TO]) + cg.add_define("EHMTXv2_REPLACE_TIME_DATE_FROM",config[CONF_REPLACE_TIME_DATE_FROM]) - if config[CONF_REPLACE_TIME_DATE_TO]: - cg.add_define("EHMTXv2_REPLACE_TIME_DATE_TO",config[CONF_REPLACE_TIME_DATE_TO]) + if config[CONF_REPLACE_TIME_DATE_FROM] and config[CONF_REPLACE_TIME_DATE_TO]: + if (len(config[CONF_REPLACE_TIME_DATE_FROM].split())) != (len(config[CONF_REPLACE_TIME_DATE_TO].split())): + logging.warning(f"replace_time_date_from: and replace_time_date_to: do not have matching pairs! (not using replacements)\n\r") + cg.add(var.set_replace_time_date_active(False)) + else: + logging.info(f"replace_time_date_from: and replace_time_date_to: defined (using replacements)\n\r") + cg.add(var.set_replace_time_date_active(True)) + else: + cg.add(var.set_replace_time_date_active(False)) + if config[CONF_REPLACE_TIME_DATE_TO]: + logging.warning(f"replace_time_date_to: defined but no replace_time_date_from:! (not using replacements)\n\r") + if config[CONF_REPLACE_TIME_DATE_FROM]: + logging.warning(f"replace_time_date_from: defined but no replace_time_date_to:! (not using replacements)\n\r") cg.add_define("EHMTXv2_SCROLL_INTERVALL",config[CONF_SCROLLINTERVAL]) cg.add_define("EHMTXv2_RAINBOW_INTERVALL",config[CONF_RAINBOWINTERVAL]) diff --git a/components/ehmtxv2/ehmtxv2.rar b/components/ehmtxv2/ehmtxv2.rar new file mode 100644 index 0000000000000000000000000000000000000000..8c4642f8fbeb2c902b8873d1bc706f27d1f4da92 GIT binary patch literal 21024 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 Dsa34S literal 0 HcmV?d00001 From ba1e35399c48254c93f5e445795877315da58241 Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 10 Oct 2023 05:07:50 +0900 Subject: [PATCH 3/7] Time Date Replacement (up to 50) --- components/ehmtxv2/EHMTX.cpp | 4 ++-- components/ehmtxv2/__init__.py | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index d1d2a8d2..08b0627c 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -791,8 +791,8 @@ namespace esphome { std::string replace_from_string = EHMTXv2_REPLACE_TIME_DATE_FROM; std::string replace_to_string = EHMTXv2_REPLACE_TIME_DATE_TO; - std::string replace_from_arr[30]; // AM + PM + 7 Days + 12 Months = 21 but 30 to be safe - std::string replace_to_arr[30]; + std::string replace_from_arr[50]; // AM + PM + 7 Days + 12 Months = 21 but 50 to be super-safe + std::string replace_to_arr[50]; std::string replace_from; std::string replace_to; uint16_t replace_arr_n; diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index 15049803..c1a05351 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -446,8 +446,12 @@ def thumbnails(frames): logging.warning(f"replace_time_date_from: and replace_time_date_to: do not have matching pairs! (not using replacements)\n\r") cg.add(var.set_replace_time_date_active(False)) else: - logging.info(f"replace_time_date_from: and replace_time_date_to: defined (using replacements)\n\r") - cg.add(var.set_replace_time_date_active(True)) + if (len(config[CONF_REPLACE_TIME_DATE_FROM].split())) > 50: + logging.warning(f"replace_time_date_from: and replace_time_date_to: exceeds 30! (not using replacements)\n\r") + cg.add(var.set_replace_time_date_active(False)) + else: + logging.info(f"replace_time_date_from: and replace_time_date_to: defined (using replacements)\n\r") + cg.add(var.set_replace_time_date_active(True)) else: cg.add(var.set_replace_time_date_active(False)) if config[CONF_REPLACE_TIME_DATE_TO]: From 3a899e155139db228009f23b96ce96fec0fc487c Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 10 Oct 2023 05:31:02 +0900 Subject: [PATCH 4/7] Whoops --- components/ehmtxv2/ehmtxv2.rar | Bin 21024 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 components/ehmtxv2/ehmtxv2.rar diff --git a/components/ehmtxv2/ehmtxv2.rar b/components/ehmtxv2/ehmtxv2.rar deleted file mode 100644 index 8c4642f8fbeb2c902b8873d1bc706f27d1f4da92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21024 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 Dsa34S From 51909d8c794e659ef9682936bf5850d490609221 Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Wed, 11 Oct 2023 03:07:40 +0900 Subject: [PATCH 5/7] Time-date-replace wiki update --- wiki/fonts.md | 2 +- wiki/home.md | 24 +++++----- wiki/rotating-text.md | 2 +- ...special-clock-and-date-display-duration.md | 2 +- wiki/time-date-display.md | 2 +- wiki/{time-format.md => time-date-format.md} | 7 ++- wiki/time-date-replace.md | 45 +++++++++++++++++++ 7 files changed, 69 insertions(+), 15 deletions(-) rename wiki/{time-format.md => time-date-format.md} (77%) create mode 100644 wiki/time-date-replace.md diff --git a/wiki/fonts.md b/wiki/fonts.md index ad3b372e..d87a262a 100644 --- a/wiki/fonts.md +++ b/wiki/fonts.md @@ -1,4 +1,4 @@ -# fonts +# Fonts **Skill-level:** all diff --git a/wiki/home.md b/wiki/home.md index c8a02d0c..1d3abb2f 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -4,20 +4,24 @@ - [Display a timer on your ehmtxv2](display-timer) - [weather display](weather-display) -- [matrix used as "circle"](rotating-text) -## Configuration +## Basic Configuration +- [Fonts for the display](fonts) +- [Time and date display](time-date-display) +- [Time & Date Formats](time-date-format) +- [Set parameter on startup](startup-settings) +- [Special clock and date display duration](special-clock-and-date-display-duration) - [Ulanzi upside-down](rotate-ULANZI-display-180-degrees) -- [Use all icons in your blueprint](use-icons-in-blueprints) -- [Time & Date Formats](time-format) + +## Intermediate & Advanced Configuration + - [Blueprints for easier configuration](blueprints) -- [time and date display](time-date-display) -- [special clock and date display duration](special-clock-and-date-display-duration) -- [set parameter on startup](startup-settings) -- [fonts for the display](fonts) -- [small clock with icon](icon-clock) -- [showing graphs on the display](using-graphs) +- [Use all icons in your blueprint](use-icons-in-blueprints) +- [Matrix used as "circle" (rotating text)](rotating-text) +- [Small clock with icon](icon-clock) +- [Showing graphs on the display](using-graphs) +- [Replacing text in date and time](time-date-replace) ## Problems diff --git a/wiki/rotating-text.md b/wiki/rotating-text.md index b13e2bf5..24f5f363 100644 --- a/wiki/rotating-text.md +++ b/wiki/rotating-text.md @@ -1,4 +1,4 @@ -# Introduction +# Rotating Text **Skill-level:** medium diff --git a/wiki/special-clock-and-date-display-duration.md b/wiki/special-clock-and-date-display-duration.md index 311a90f5..ec5e8a6b 100644 --- a/wiki/special-clock-and-date-display-duration.md +++ b/wiki/special-clock-and-date-display-duration.md @@ -8,7 +8,7 @@ Set up a timer helper named *eier_timer* I'm using EspHoMaTriXv2 on a Ulanzi TC001. I want to display the time for 55 seconds and the date for 5 seconds in a loop. I don't understand, how I can configure the display times. I tried clock_interval: 55 but it doesn't seem to help. -What's the corerct way? +What's the correct way? I think the easiest way is by a home assistant script like this: diff --git a/wiki/time-date-display.md b/wiki/time-date-display.md index 2e2d80fc..6fa3b789 100644 --- a/wiki/time-date-display.md +++ b/wiki/time-date-display.md @@ -4,7 +4,7 @@ todo => adapt to 2023.8.0 **Skill-level:** low -EspHoMaTriXv2 is a pixel clock. With out any configuration it displays only the time and date. These are "build in", but can be widely configured [format](time-format). If you don't need the date-display, you can disable it with the parameter `show_date: false` in the YAML. Or if you don't want either time or date add `allow_empty_screen: true` to your yaml. +EspHoMaTriXv2 is a pixel clock. Without any configuration it displays only the time and date. These are "build in", but can be widely configured [format](time-date-format). If you don't need the date-display, you can disable it with the parameter `show_date: false` in the YAML. Or if you don't want either time or date add `allow_empty_screen: true` to your yaml. During runtime, you can remove them from the queue with: diff --git a/wiki/time-format.md b/wiki/time-date-format.md similarity index 77% rename from wiki/time-format.md rename to wiki/time-date-format.md index 92d228cd..19a33593 100644 --- a/wiki/time-format.md +++ b/wiki/time-date-format.md @@ -1,4 +1,4 @@ -# introduction +# Introduction **Skill-level:** low @@ -57,3 +57,8 @@ Abbreviated Day and Date (Tue 08) ```yaml time_format: "%l:%M%p" ``` +## Localized Time and Date + +Unfortunately, ESPHome does not seem capable of passing on localized time and date formats so that you can get time formats in your own language easily. + +But you can still do it with a special function: [time-date-replace](time-date-replace). \ No newline at end of file diff --git a/wiki/time-date-replace.md b/wiki/time-date-replace.md new file mode 100644 index 00000000..59871044 --- /dev/null +++ b/wiki/time-date-replace.md @@ -0,0 +1,45 @@ +# Introduction + +**Skill-level:** intermediate + +In the ehmtxv2: section of your yaml, you can change the [time date format](time-date-format). + +Unfortunately, ESPHome does not seem capable of passing on localized time and date formats through compilation. + +Using the replace function you can replace various elements of date and time formats completely which can help localize or customize your display. + +## Date formats + +Normal time and date function to get: `4:30PM` and `Oct 11`: + +```yaml + time_format: "%l:%M%p" + date_format: "%b d%" +``` + +An example to get Korean date and time like `4:30오후` and `10월11일`: + +```yaml + time_format: "%l:%M%p" + date_format: "%b%d일" + replace_time_date_from: "AM PM Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" + replace_time_date_to: "오전 오후 일 월 화 수 목 금 토 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월" +``` + +Here is an example to get Ukrainian `Жовт 11`: + +```yaml + date_format: "%b %d" + replace_time_date_from: "Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" + replace_time_date_to: "ПН ВТ СР ЧТ ПТ СБ ВС Сiч Лют Бер Квiт Трав Черв Лип Серп Вер Жовт Лист Груд" +``` + +These are just a few examples. You can replace almost any element you want, except spaces (this includes special Unicode spaces like thin spaces). +Yes, that means you can even replace numbers and the colon with other characters. Use emojis, if you like! + +Keep an eye on the ESPHome output when using this. You should see a message if the replace is deactivated due to some error. +Note there is also a 50 pair limit. Using too many pairs may cause slowdowns. Although tested well with the Korean pair above, using more is considered experimental. + +Please note also that input for `time_format` and `date_format` may be limited. Experiment! + +### Don't forget to include matching glyphs in your font section! \ No newline at end of file From 6c89a6a639cd9fadec0451ad56c9e90ee5cd6d32 Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Wed, 11 Oct 2023 03:20:33 +0900 Subject: [PATCH 6/7] Whoops --- wiki/rotating-text.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiki/rotating-text.md b/wiki/rotating-text.md index 24f5f363..b13e2bf5 100644 --- a/wiki/rotating-text.md +++ b/wiki/rotating-text.md @@ -1,4 +1,4 @@ -# Rotating Text +# Introduction **Skill-level:** medium From 2eb4cba477246bdb7255a2144d561dd5f274746a Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Wed, 11 Oct 2023 04:31:55 +0900 Subject: [PATCH 7/7] Readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3acdc107..6a58ff68 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ - `set_infotext_color(200,100,100,100,100,200,false,2);` - `set_infotext_color("left_r", "left_g", "left_b", "right_r", "right_g", "right_b", "default_font", "y_offset");` - `weekdays` - the order of the days of the week, from Sunday to Saturday. - - Added a screen with the ability to display a progress bar, progress value `(-100..100)` - `icon_screen_progress(iconname, text, progress, lifetime, screen_time, default_font, r, g, b)` +- Added `replace_time_date_to:` and `replace_time_date_from:` which allow replacing the system date & time text (anything!) ### EspHoMaTriX 2023.9.0 - Added the ability to display graph as defined in the YAML file @@ -35,7 +35,7 @@ ### EspHoMaTriX 2023.8.0 -A lot of users asked for special behavior, e.g. display date but no time or vice versa. Display nothing at all e.g. during night. I like to implement a lot of the requestes but ist hard to keep the known default behaviour. In this version i will provide a YAML with the default behaviour but there will be less hardcoded by me, instead you have your freedom to do all in your YAML. +A lot of users asked for special behavior, e.g. display date but no time or vice versa. Display nothing at all e.g. during night. I like to implement a lot of the requests but it's hard to keep the known default behaviour. In this version i will provide a YAML with the default behaviour but there will be less hardcoded by me, instead you have your freedom to do all in your YAML. For the old default behavior use this trigger in your YAML: