From 536fedfce6bdd951e55cd79a987c7a0d8744e365 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sat, 17 Jun 2023 19:39:18 +0200 Subject: [PATCH 01/22] preparing 2023.7.0 --- CHANGELOG.md | 4 ++++ components/ehmtxv2/EHMTX.cpp | 17 ++++++++++------- components/ehmtxv2/__init__.py | 24 +++++++++++++++++++++++- copy2esphome/EHMTX_easy_color_gauge.yaml | 6 ++++-- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aec96ef..bf0fe2db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2023.7.0 + +- icontype rgb565 array as string + ## 2023.6.5 - introduced `blend_steps: 16` diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 77852945..328b9dd2 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -545,7 +545,7 @@ namespace esphome float red, green, blue; esphome::hsv_to_rgb(this->hue_, 0.8, 0.8, red, green, blue); this->rainbow_color = Color(uint8_t(255 * red), uint8_t(255 * green), uint8_t(255 * blue)); - + if (this->is_running && this->clock->now().is_valid()) { time_t ts = this->clock->now().timestamp; @@ -609,16 +609,16 @@ namespace esphome } } // blend handling - + #ifdef EHMTXv2_BLEND_STEPS - if (this->ticks_ <= EHMTXv2_BLEND_STEPS) + if ((this->ticks_ <= EHMTXv2_BLEND_STEPS)) { - uint8_t b = this->brightness_; - float br = lerp((float)this->ticks_ / EHMTXv2_BLEND_STEPS, 0, (float)b / 255); - this->display->get_light()->set_correction(br, br, br); + uint8_t b = this->brightness_; + float br = lerp((float)this->ticks_ / EHMTXv2_BLEND_STEPS, 0, (float)b / 255); + this->display->get_light()->set_correction(br, br, br); } #endif - this->ticks_++; + this->ticks_++; } else { @@ -1047,6 +1047,9 @@ namespace esphome } #ifdef EHMTXv2_USE_RTL ESP_LOGCONFIG(TAG, "RTL activated"); +#endif +#ifdef EHMTXv2_BLEND_STEPS + ESP_LOGCONFIG(TAG, "Fade in activated: %d steps",EHMTXv2_BLEND_STEPS); #endif if (EHMTXv2_WEEK_START) { diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index d31e1fe3..64b71bfd 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -1,6 +1,7 @@ from argparse import Namespace import logging import io +import json import requests from esphome import core, automation @@ -34,6 +35,12 @@ def rgb565_svg(x,y,r,g,b): return f"> 2)},{(g << 2) | (g >> 4)},{(b << 3) | (b >> 2)});\" x=\"{x*10}\" y=\"{y*10}\" width=\"10\" height=\"10\"/>" +def rgb565_888(v565): + b = (((v565)&0x001F) << 3) + g = (((v565)&0x07E0) >> 3) + r = (((v565)&0xF800) >> 8) + return (r,g,b) + ehmtx_ns = cg.esphome_ns.namespace("esphome") EHMTX_ = ehmtx_ns.class_("EHMTX", cg.Component) Icons_ = ehmtx_ns.class_("EHMTX_Icon") @@ -63,6 +70,7 @@ def rgb565_svg(x,y,r,g,b): CONF_CLOCKINTERVAL = "clock_interval" CONF_TIMECOMPONENT = "time_component" CONF_LAMEID = "lameid" +CONF_RGB565ARRAY = "str565" CONF_LIFETIME = "lifetime" CONF_ICONS = "icons" CONF_SHOWDOW = "show_dow" @@ -206,6 +214,7 @@ def rgb565_svg(x,y,r,g,b): cv.Exclusive(CONF_FILE,"uri"): cv.file_, cv.Exclusive(CONF_URL,"uri"): cv.url, cv.Exclusive(CONF_LAMEID,"uri"): cv.string, + cv.Exclusive(CONF_RGB565ARRAY,"uri"): cv.string, cv.Optional(CONF_RESIZE): cv.dimensions, cv.Optional( CONF_FRAMEDURATION, default="0" @@ -270,7 +279,20 @@ def thumbnails(frames): if r.status_code != requests.codes.ok: raise core.EsphomeError(f" ICONS: Could not download image file {conf[CONF_URL]}: {conf[CONF_ID]}") image = Image.open(io.BytesIO(r.content)) - + elif CONF_RGB565ARRAY in conf: + r = list(json.loads(conf[CONF_RGB565ARRAY])) + if len(r) == 64: + image = Image.new("RGB",[8,8]) + for y in range(0,8): + for x in range(0,8): + image.putpixel((x,y),rgb565_888(r[x+y*8])) + elif len(r) == 256: + image = Image.new("RGB",[32,8]) + for y in range(0,8): + for x in range(0,32): + image.putpixel((x,y),rgb565_888(r[x+y*32])) + + width, height = image.size if CONF_RESIZE in conf: diff --git a/copy2esphome/EHMTX_easy_color_gauge.yaml b/copy2esphome/EHMTX_easy_color_gauge.yaml index abee53c3..72859f37 100644 --- a/copy2esphome/EHMTX_easy_color_gauge.yaml +++ b/copy2esphome/EHMTX_easy_color_gauge.yaml @@ -8,10 +8,12 @@ blueprint: input: ehmtx_device: - name: Which EspHoMaTriX-device to display at? + name: Which EspHoMaTriXv2 device to use selector: device: - integration: esphome + filter: + - integration: esphome + model: EHMTXv2 pix0_color: name: Color of pixel 1 selector: From 38511b9dba199b061327993130f8b52f7176d16b Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 23 Jun 2023 16:11:39 +0200 Subject: [PATCH 02/22] wiki and changelog --- CHANGELOG.md | 1 + README.md | 1 + wiki/home.md | 1 + ...special-clock-and-date-display-duration.md | 48 +++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 wiki/special-clock-and-date-display-duration.md diff --git a/CHANGELOG.md b/CHANGELOG.md index bf0fe2db..616f2d04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2023.7.0 - icontype rgb565 array as string +- fixed scroll small text ## 2023.6.5 diff --git a/README.md b/README.md index 3ee5e7d9..55c8b058 100644 --- a/README.md +++ b/README.md @@ -1119,6 +1119,7 @@ THE SOFTWARE IS PROVIDED “AS IS”, use at your own risk! - **[dennisse](https://github.com/dennisse)** Auto brightness for the Ulanzi - **[hco](https://github.com/hco)** fixing documentation - **[geekofweek](https://github.com/geekofweek)** fixed sample YAML, cleanup documentation +- **[joncar](https://github.com/joncar)** fixed scroll small text - **Everybody** who found bugs/issues and reported them! ## Special thanks to all sponsors diff --git a/wiki/home.md b/wiki/home.md index 2312b5fd..4893688d 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -13,6 +13,7 @@ - [Time & Date Formats](time-format) - [Blueprints for easier configuration](blueprints) - [time and date display](time-date-display) +- [special clock and date display duration](special-clock-and-date-display-duration) ## Defective / Broken Ulanzi TC-001? diff --git a/wiki/special-clock-and-date-display-duration.md b/wiki/special-clock-and-date-display-duration.md new file mode 100644 index 00000000..311a90f5 --- /dev/null +++ b/wiki/special-clock-and-date-display-duration.md @@ -0,0 +1,48 @@ +# Introduction + +**Skill-level:** easy + +Set up a timer helper named *eier_timer* + +## step 1: **home assistant automation:** + +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? + +I think the easiest way is by a home assistant script like this: + +```yaml +alias: ulanzi 55-5 clock-date +sequence: + - service: esphome.ulanzi_del_screen + data: + icon_name: "*" + mode: 2 + - service: esphome.ulanzi_clock_screen + data: + default_font: false + lifetime: 1440 + screen_time: 55 + r: 192 + g: 192 + b: 192 + - service: esphome.ulanzi_del_screen + data: + icon_name: "*" + mode: 3 + - service: esphome.ulanzi_date_screen + data: + default_font: false + lifetime: 1440 + screen_time: 5 + r: 192 + g: 192 + b: 192 +mode: single +icon: mdi:clock-digital +``` + +This deletes the default date and clock display and fills the loop with a 55 sec clock and a 5 sec date screen. The lifetime is one day, so the script must run once a day or on boot. + +This is also possible in the esphome YAML, with lambdas. \ No newline at end of file From d6c060184fefbec069eb2b1e889a43fe2482b225 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 9 Jul 2023 10:53:36 +0200 Subject: [PATCH 03/22] removed warning --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index f9bc477f..deb262e4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@ # EspHoMaTriX version 2 (EHMTXv2) -## Very important information!! -Since esphome 2023.6.0 this does not compile anymore on ESP8266 platform!!! - ## Important information If you like this project, please donate a star on GitHub and consider [sponsoring](https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU) me! From ca91bb09e3a356e292f6460cb9e7dbefba2dc356 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Mon, 10 Jul 2023 19:20:39 +0200 Subject: [PATCH 04/22] badge test --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index deb262e4..6596b4bb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # EspHoMaTriX version 2 (EHMTXv2) +[donation-badge]:(https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white) +[donation-url]: https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU + +![Home Assistant](https://img.shields.io/badge/home%20assistant-%2341BDF5.svg?style=for-the-badge&logo=home-assistant&logoColor=white) +[![Donate][donation-badge]][donation-url] + ## Important information If you like this project, please donate a star on GitHub and consider [sponsoring](https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU) me! From adfae5c3aa33803077f00c92791ee5cb9ecfff1a Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Mon, 10 Jul 2023 19:23:32 +0200 Subject: [PATCH 05/22] badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6596b4bb..27c452b6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # EspHoMaTriX version 2 (EHMTXv2) -[donation-badge]:(https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white) +[donation-badge]:https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white [donation-url]: https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU ![Home Assistant](https://img.shields.io/badge/home%20assistant-%2341BDF5.svg?style=for-the-badge&logo=home-assistant&logoColor=white) +![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) [![Donate][donation-badge]][donation-url] ## Important information From 33ecd612a2cbca14cf3c294428efb84393eb21ac Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Thu, 13 Jul 2023 20:41:30 +0200 Subject: [PATCH 06/22] version 2023.7.0 vootlogo optional --- README.md | 12 ++++++++++++ components/ehmtxv2/EHMTX.cpp | 21 +++++++++++++++++++-- components/ehmtxv2/EHMTX.h | 14 +++++++++----- components/ehmtxv2/__init__.py | 6 ++++++ copy2esphome/ulanzi-easy.yaml | 1 + tests/ehtmxv2-template.yaml | 3 +++ 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 27c452b6..f906178a 100644 --- a/README.md +++ b/README.md @@ -560,6 +560,14 @@ ehmtxv2: **clock_interval** (optional, s): the interval in seconds to force the clock display. By default, the clock screen, if any, will be displayed according to the position in the queue. **If you set the clock_interval close to the screen_time of the clock, you will only see the clock!** (default=0) +**boot_logo** (optional, string , only on ESP32): Display a fullscreen logo defined as rgb565 array. + +```yaml + boot_logo: "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,63519,63519,63519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,0,0,0,0,2016,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,63488,0,63488,0,0,0,63519,0,0,0,0,2016,2016,0,0,0,65514,0,65514,0,0,0,31,0,0,0,64512,0,0,64512,0,63488,63488,0,63488,63488,0,0,63519,63519,63519,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,31,31,31,0,0,0,64512,64512,0,0,63488,63488,63488,63488,63488,0,0,63519,0,0,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,31,0,0,0,0,64512,64512,0,0,0,63488,63488,63488,0,0,0,63519,63519,63519,63519,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,0,31,31,0,64512,0,0,64512,0,0,0,63488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]" +``` + +If defined you can use the services `display_boot_logo` and `display_version` to display the defined logo or the version of ehmtx. + **icons2html** (optional, boolean): If true, generate the HTML-file (*filename*.html) to show all included icons.  (default = `false`) ***Example output:*** @@ -1077,6 +1085,10 @@ sensor: ## Breaking changes +### 2023.7.0 + +- removed automatic boot logo display + ### 2023.6.3 **Due to this change these values are fixed, e.g. you can not change the date or timeformat during runtime anymore!!** diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index a67657fe..52c97a8c 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -354,6 +354,10 @@ namespace esphome register_service(&EHMTX::set_brightness, "brightness", {"value"}); #ifndef USE_ESP8266 + #ifdef EHMTXv2_BOOTLOGO + register_service(&EHMTX::display_boot_logo, "display_boot_logo"); + register_service(&EHMTX::display_version, "display_version"); + #endif register_service(&EHMTX::color_gauge, "color_gauge", {"colors"}); register_service(&EHMTX::bitmap_screen, "bitmap_screen", {"icon", "lifetime", "screen_time"}); register_service(&EHMTX::bitmap_small, "bitmap_small", {"icon", "text", "lifetime", "screen_time", "default_font", "r", "g", "b"}); @@ -376,6 +380,18 @@ namespace esphome } } +#ifndef USE_ESP8266 + #ifdef EHMTXv2_BOOTLOGO + void EHMTX::display_boot_logo() { + this->bitmap_screen(EHMTXv2_BOOTLOGO, 1, 10); + } + void EHMTX::display_version() { + this->bitmap_small("[2016,0,0,0,2016,0,0,0,2016,0,0,0,2016,0,0,0,2016,0,0,0,2016,0,0,0,0,2016,0,2016,0,31,31,0,0,0,2016,0,31,0,0,31,0,0,0,0,0,0,31,0,0,0,0,0,0,31,0,0,0,0,0,0,31,31,31,31]", EHMTX_VERSION, 1, 10); + } + + #endif +#endif + void EHMTX::hide_alarm() { this->display_alarm = 0; @@ -398,8 +414,9 @@ namespace esphome { ESP_LOGD(TAG, "time sync => start running"); #ifndef USE_ESP8266 - this->bitmap_screen(EHMTX_LOGO, 1, 10); - this->bitmap_small(EHMTX_SLOGO, EHMTX_VERSION, 1, 10); + #ifdef EHMTXv2_BOOTLOGO + this->bitmap_screen(EHMTXv2_BOOTLOGO, 1, 10); + #endif #endif this->clock_screen(14 * 24 * 60, this->clock_time, EHMTXv2_DEFAULT_CLOCK_FONT, C_RED, C_GREEN, C_BLUE); this->date_screen(14 * 24 * 60, (int)this->clock_time / 2, EHMTXv2_DEFAULT_CLOCK_FONT, C_RED, C_GREEN, C_BLUE); diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index 4553faf9..d3090840 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -23,12 +23,9 @@ const uint8_t TEXTSCROLLSTART = 8; const uint8_t TEXTSTARTOFFSET = (32 - 8); const uint16_t POLLINGINTERVAL = 250; -static const char *const EHMTX_VERSION = "2023.6.5"; +static const char *const EHMTX_VERSION = "2023.7.0"; static const char *const TAG = "EHMTXv2"; -#ifndef USE_ESP8266 -static const char *const EHMTX_LOGO = "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,63519,63519,63519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,0,0,0,0,2016,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,63488,0,63488,0,0,0,63519,0,0,0,0,2016,2016,0,0,0,65514,0,65514,0,0,0,31,0,0,0,64512,0,0,64512,0,63488,63488,0,63488,63488,0,0,63519,63519,63519,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,31,31,31,0,0,0,64512,64512,0,0,63488,63488,63488,63488,63488,0,0,63519,0,0,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,31,0,0,0,0,64512,64512,0,0,0,63488,63488,63488,0,0,0,63519,63519,63519,63519,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,0,31,31,0,64512,0,0,64512,0,0,0,63488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]"; -static const char *const EHMTX_SLOGO = "[2016,0,0,0,2016,0,0,0,2016,0,0,0,2016,0,0,0,2016,0,0,0,2016,0,0,0,0,2016,0,2016,0,31,31,0,0,0,2016,0,31,0,0,31,0,0,0,0,0,0,31,0,0,0,0,0,0,31,0,0,0,0,0,0,31,31,31,31]"; -#endif + enum show_mode : uint8_t { MODE_EMPTY = 0, @@ -187,6 +184,13 @@ namespace esphome void add_on_expired_screen_trigger(EHMTXExpiredScreenTrigger *t) { this->on_expired_screen_triggers_.push_back(t); } void add_on_next_clock_trigger(EHMTXNextClockTrigger *t) { this->on_next_clock_triggers_.push_back(t); } +#ifndef USE_ESP8266 + #ifdef EHMTXv2_BOOTLOGO + void display_boot_logo(); + void display_version(); + #endif +#endif + void update(); uint8_t get_brightness(); }; diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index 817baaa7..187102e8 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -71,6 +71,7 @@ def rgb565_888(v565): CONF_TIMECOMPONENT = "time_component" CONF_LAMEID = "lameid" CONF_RGB565ARRAY = "str565" +CONF_BOOTLOGO = "boot_logo" CONF_LIFETIME = "lifetime" CONF_ICONS = "icons" CONF_SHOWDOW = "show_dow" @@ -201,6 +202,7 @@ def rgb565_888(v565): cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(NextClockTrigger), } ), + cv.Optional(CONF_BOOTLOGO): cv.string, cv.Optional(CONF_ON_EXPIRED_SCREEN): automation.validate_automation( { cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ExpiredScreenTrigger), @@ -415,6 +417,10 @@ def thumbnails(frames): cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT",config[CONF_CLOCKFONT]) cg.add_define("EHMTXv2_DATE_FORMAT",config[CONF_DATE_FORMAT]) cg.add_define("EHMTXv2_TIME_FORMAT",config[CONF_TIME_FORMAT]) + + if config.get(CONF_BOOTLOGO): + cg.add_define("EHMTXv2_BOOTLOGO",config[CONF_BOOTLOGO]) + if config[CONF_SCROLL_SMALL_TEXT]: cg.add_define("EHMTXv2_SCROLL_SMALL_TEXT") if config[CONF_ALLOW_EMPTY_SCREEN]: diff --git a/copy2esphome/ulanzi-easy.yaml b/copy2esphome/ulanzi-easy.yaml index 003d7d76..e3f4efe2 100644 --- a/copy2esphome/ulanzi-easy.yaml +++ b/copy2esphome/ulanzi-easy.yaml @@ -234,6 +234,7 @@ ehmtxv2: show_seconds: false default_font_id: default_font special_font_id: default_font + boot_logo: "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,63519,63519,63519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,0,0,0,0,2016,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,63488,0,63488,0,0,0,63519,0,0,0,0,2016,2016,0,0,0,65514,0,65514,0,0,0,31,0,0,0,64512,0,0,64512,0,63488,63488,0,63488,63488,0,0,63519,63519,63519,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,31,31,31,0,0,0,64512,64512,0,0,63488,63488,63488,63488,63488,0,0,63519,0,0,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,31,0,0,0,0,64512,64512,0,0,0,63488,63488,63488,0,0,0,63519,63519,63519,63519,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,0,31,31,0,64512,0,0,64512,0,0,0,63488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]" icons: - id: error lameid: 40530 diff --git a/tests/ehtmxv2-template.yaml b/tests/ehtmxv2-template.yaml index e81208b2..864fe931 100644 --- a/tests/ehtmxv2-template.yaml +++ b/tests/ehtmxv2-template.yaml @@ -48,6 +48,8 @@ esphome: id(rgb8x32)->set_brightness(20); id(rgb8x32)->bitmap_screen("[31,31,31,63488,63488,63488,31,31,63488,31,31,31,31,31,63488,63488,63488,31,31,63488,63488,63488,63488,31,31,63488,31,31,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,63488,31,63488,63488,31,63488,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,63488,31,63488,31,63488,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,63488,31,63488,31,31,31,63488,31,31,31,31,63488,63488,63488,63488,63488,31,63488,31,31,31,31,63488,63488,63488,63488,63488,31,63488,63488,63488,63488,31,31,63488,31,31,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,63488,31,31,31,63488,31,31,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,31,31,63488,31,31,63488,31,31,31,63488,31,31,31,31,63488,31,31,31,63488,31,63488,63488,63488,63488,31,63488,31,31,31,63488,31,63488,31,31,31,63488,31,63488,31,31,31,63488,31,31]",2,10); id(rgb8x32)->bitmap_small("[0,7267,34784,34784,34784,34784,7267,0,7267,34784,65535,34784,34784,34784,34784,7267,34784,7267,34784,34784,34784,34784,7267,34784,34784,65535,0,34784,34784,65535,0,34784,34784,7267,0,34784,34784,0,7267,34784,0,34784,34784,34784,34784,34784,34784,0,0,0,34784,7267,7267,34784,0,0,0,0,0,34784,34784,0,0,0]","Hallo Test,",2,30,false,200,100,50); + id(rgb8x32)->display_version(); + id(rgb8x32)->display_boot_logo(); esp32: board: esp32dev @@ -123,6 +125,7 @@ ehmtxv2: show_seconds: false clock_interval: 90 rtl: true + boot_logo: "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,63519,63519,63519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,0,0,0,0,2016,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,63488,0,63488,0,0,0,63519,0,0,0,0,2016,2016,0,0,0,65514,0,65514,0,0,0,31,0,0,0,64512,0,0,64512,0,63488,63488,0,63488,63488,0,0,63519,63519,63519,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,31,31,31,0,0,0,64512,64512,0,0,63488,63488,63488,63488,63488,0,0,63519,0,0,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,31,0,0,0,0,64512,64512,0,0,0,63488,63488,63488,0,0,0,63519,63519,63519,63519,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,0,31,31,0,64512,0,0,64512,0,0,0,63488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]" default_font_id: default_font special_font_id: default_font icons: From cce68377fe959dd3e2430b0671868259c37a76ce Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sat, 15 Jul 2023 21:21:34 +0200 Subject: [PATCH 07/22] new dev test --- .github/workflows/main.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f41be773..3767dbcf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,6 +24,10 @@ jobs: - file: tests/ehtmxv2-special.yaml name: EHMTX template 8266 manifest_filename: ehtmxv2-special-template-manifest.json + devfirmware: + - file: tests/ulanzi-easy.yaml + name: Ulanzi-Easy + manifest_filename: ulanzi-easy-manifest.json fail-fast: false steps: - name: Checkout source code @@ -34,3 +38,9 @@ jobs: with: yaml_file: ${{ matrix.firmware.file }} version: latest + - name: Build firmware with dev + uses: esphome/build-action@v1.8.0 + id: esphome-build + with: + yaml_file: ${{ matrix.devfirmware.file }} + version: 2023.7.0-dev From 209496ef7778249ca5b6be8830f8931be2d38402 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 16 Jul 2023 12:28:17 +0200 Subject: [PATCH 08/22] workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3767dbcf..9fddcf9a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -40,7 +40,7 @@ jobs: version: latest - name: Build firmware with dev uses: esphome/build-action@v1.8.0 - id: esphome-build + id: esphome-build-dev with: yaml_file: ${{ matrix.devfirmware.file }} version: 2023.7.0-dev From 2ce433afa13ff1c10fed87422701508ebd596207 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 16 Jul 2023 16:44:25 +0200 Subject: [PATCH 09/22] workflow --- .github/workflows/main.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9fddcf9a..47c1f034 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -37,10 +37,4 @@ jobs: id: esphome-build with: yaml_file: ${{ matrix.firmware.file }} - version: latest - - name: Build firmware with dev - uses: esphome/build-action@v1.8.0 - id: esphome-build-dev - with: - yaml_file: ${{ matrix.devfirmware.file }} - version: 2023.7.0-dev + version: latest \ No newline at end of file From b0ab701dace033358c008eff345d6daf8a519bc4 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 16 Jul 2023 16:46:47 +0200 Subject: [PATCH 10/22] workflow beta --- .github/workflows/main.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 47c1f034..b4cd0a37 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -37,4 +37,10 @@ jobs: id: esphome-build with: yaml_file: ${{ matrix.firmware.file }} - version: latest \ No newline at end of file + version: latest + - name: Build firmware with beta + uses: esphome/build-action@v1.8.0 + id: esphome-build + with: + yaml_file: ${{ matrix.firmware.file }} + version: beta \ No newline at end of file From 168a6186e4b297aba7dc970142bc9467532493c7 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 16 Jul 2023 16:48:56 +0200 Subject: [PATCH 11/22] typo --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b4cd0a37..fb118e40 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -40,7 +40,7 @@ jobs: version: latest - name: Build firmware with beta uses: esphome/build-action@v1.8.0 - id: esphome-build + id: esphome-build-beta with: yaml_file: ${{ matrix.firmware.file }} version: beta \ No newline at end of file From f3f3dec4423845ec8089bd4003678c048d682276 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 16 Jul 2023 16:59:01 +0200 Subject: [PATCH 12/22] removed compile with beta --- .github/workflows/main.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb118e40..f5aad7cf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,9 +38,9 @@ jobs: with: yaml_file: ${{ matrix.firmware.file }} version: latest - - name: Build firmware with beta - uses: esphome/build-action@v1.8.0 - id: esphome-build-beta - with: - yaml_file: ${{ matrix.firmware.file }} - version: beta \ No newline at end of file + # - name: Build firmware with beta + # uses: esphome/build-action@v1.8.0 + # id: esphome-build-beta + # with: + # yaml_file: ${{ matrix.firmware.file }} + # version: beta \ No newline at end of file From d23e72883cb711b85a0874b74c7be19e61ba7d8a Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Wed, 19 Jul 2023 17:57:53 +0200 Subject: [PATCH 13/22] "fixed" breaking changes from esphome 2023.7.0 --- components/ehmtxv2/EHMTX.cpp | 4 ++-- components/ehmtxv2/EHMTX.h | 15 +++++++++------ components/ehmtxv2/EHMTX_icons.cpp | 2 +- components/ehmtxv2/EHMTX_queue.cpp | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 52c97a8c..890231b7 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -691,12 +691,12 @@ namespace esphome ESP_LOGI(TAG, "queue: %d empty slots", empty); } - void EHMTX::set_default_font(display::Font *font) + void EHMTX::set_default_font(display::BaseFont *font) { this->default_font = font; } - void EHMTX::set_special_font(display::Font *font) + void EHMTX::set_special_font(display::BaseFont *font) { this->special_font = font; } diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index d3090840..f623c193 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -1,7 +1,10 @@ #ifndef EHMTX_H #define EHMTX_H #include "esphome.h" + #include "esphome/components/time/real_time_clock.h" +#include "esphome/components/animation/animation.h" +#include "esphome/components/image/image.h" const uint8_t MAXQUEUE = 24; const uint8_t C_RED = 240; // default @@ -89,8 +92,8 @@ namespace esphome EHMTX_Icon *icons[MAXICONS]; uint8_t gauge_value; #endif - display::Font *default_font; - display::Font *special_font; + display::BaseFont *default_font; + display::BaseFont *special_font; int display_rindicator; int display_lindicator; int display_alarm; @@ -144,8 +147,8 @@ namespace esphome void set_display_on(); void set_display_off(); void set_clock(esphome::time::RealTimeClock *clock); - void set_default_font(display::Font *font); - void set_special_font(display::Font *font); + 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_clock_color(int r = C_RED, int g = C_GREEN, int b = C_BLUE); @@ -267,13 +270,13 @@ namespace esphome void process(); }; - class EHMTX_Icon : public display::Animation + class EHMTX_Icon : public animation::Animation { protected: bool counting_up; public: - EHMTX_Icon(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, display::ImageType type, std::string icon_name, bool revers, uint16_t frame_duration); + EHMTX_Icon(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, esphome::image::ImageType type, std::string icon_name, bool revers, uint16_t frame_duration); std::string name; uint16_t frame_duration; void next_frame(); diff --git a/components/ehmtxv2/EHMTX_icons.cpp b/components/ehmtxv2/EHMTX_icons.cpp index d667cb15..a39ae590 100644 --- a/components/ehmtxv2/EHMTX_icons.cpp +++ b/components/ehmtxv2/EHMTX_icons.cpp @@ -3,7 +3,7 @@ namespace esphome { - EHMTX_Icon::EHMTX_Icon(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, display::ImageType type, std::string icon_name, bool revers, uint16_t frame_duration) + EHMTX_Icon::EHMTX_Icon(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, esphome::image::ImageType type, std::string icon_name, bool revers, uint16_t frame_duration) : Animation(data_start, width, height, animation_frame_count, type) { this->name = icon_name; diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index 9dd744a5..d920f252 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -145,7 +145,7 @@ namespace esphome void EHMTX_queue::draw() { - display::Font *font = this->default_font ? this->config_->default_font : this->config_->special_font; + display::BaseFont *font = this->default_font ? this->config_->default_font : this->config_->special_font; int8_t yoffset = this->default_font ? EHMTXv2_DEFAULT_FONT_OFFSET_Y : EHMTXv2_SPECIAL_FONT_OFFSET_Y; int8_t xoffset = this->default_font ? EHMTXv2_DEFAULT_FONT_OFFSET_X : EHMTXv2_SPECIAL_FONT_OFFSET_X; From 64c885d75bd455302bb1232e5a53efa2cbcb5407 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Thu, 20 Jul 2023 20:25:40 +0200 Subject: [PATCH 14/22] fonts from dbuezas --- CHANGELOG.md | 2 ++ README.md | 7 ++++--- components/ehmtxv2/EHMTX.h | 1 - components/ehmtxv2/__init__.py | 5 ++--- copy2esphome/CalciumSuperThinTall.ttf | Bin 0 -> 28068 bytes copy2esphome/CalciumThinTall.ttf | Bin 0 -> 28896 bytes copy2esphome/ulanzi-easy.yaml | 2 +- tests/CalciumThinTall.ttf | Bin 0 -> 28896 bytes tests/EHMTXv2.ttf | Bin 12504 -> 0 bytes tests/ehtmxv2-special.yaml | 3 ++- tests/ehtmxv2-template.yaml | 4 +++- tests/ulanzi-easy.yaml | 4 +++- wiki-samples/type1.yaml | 6 +++--- 13 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 copy2esphome/CalciumSuperThinTall.ttf create mode 100644 copy2esphome/CalciumThinTall.ttf create mode 100644 tests/CalciumThinTall.ttf delete mode 100644 tests/EHMTXv2.ttf diff --git a/CHANGELOG.md b/CHANGELOG.md index 616f2d04..7d0fb82a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - icontype rgb565 array as string - fixed scroll small text +- remove EHMTXv2.ttf +- introduced CalciumThinTall.ttf from @dbuezas [samples](https://github.com/lubeda/EspHoMaTriXv2/issues/63) ## 2023.6.5 diff --git a/README.md b/README.md index f906178a..8c407b97 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ In easy mode you'll have a clock with auto brightness control and after step 3 y Copy these files from the source folder `copy2esphome`: - ulanzi-simple.yaml -- EHMTXv2.ttf +- CalciumThinTall.ttf to your esphome directory (usually /config/esphome). In your esphome dashboard, you will find a new device named `ulanzi-easy`. @@ -429,11 +429,11 @@ You can configure two fonts if you like. Trip5 is also providing special fonts for 8x32 matrices in his [repo](https://github.com/trip5/MatrixClockFonts) -For Europeans starters, you can use the font EHMTXv2.ttf of the copy2esphome folder. +dbuezas has also contributed tow optimized fonts with umlauts for this kind of display CalciumThinTall.ttf and CalciumSuperThinTall.ttf. They are included in the copy2esphome folder ```yaml font: -  - file: EHMTXv2.ttf +  - file: CalciumThinTall.ttf     id: default_font     size: 16     glyphs:  | @@ -1128,6 +1128,7 @@ THE SOFTWARE IS PROVIDED “AS IS”, use at your own risk! ## Thanks - **[blakadder](https://github.com/blakadder)** for his contribution (cleanup README.md, fixed sample) +- **[dbuezas](https://github.com/dbuezas)** for his fonts [infos](https://github.com/lubeda/EspHoMaTriXv2/issues/63) - **[andrew-codechimp](https://github.com/andrew-codechimp)** for his contribution (display on/off & del_screen "*" & show_clock with 0) and improved blueprint slelection - **[jd1](https://github.com/jd1)** for his contributions - **[aptonline](https://github.com/aptonline)** for his work on the Ulanzi hardware diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index f623c193..70ced0cd 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -4,7 +4,6 @@ #include "esphome/components/time/real_time_clock.h" #include "esphome/components/animation/animation.h" -#include "esphome/components/image/image.h" const uint8_t MAXQUEUE = 24; const uint8_t C_RED = 240; // default diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index 187102e8..da7b11bc 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -16,8 +16,7 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ["display", "light", "api"] -AUTO_LOAD = ["ehmtxv2"] -AUTO_LOAD = ["json"] +AUTO_LOAD = ["ehmtxv2","json"] IMAGE_TYPE_RGB565 = 4 MAXFRAMES = 110 MAXICONS = 90 @@ -454,5 +453,5 @@ def thumbnails(frames): for conf in config.get(CONF_ON_ADD_SCREEN, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [(cg.std_string, "icon"), (cg.uint8 , "mode")] , conf) - + await cg.register_component(var, config) diff --git a/copy2esphome/CalciumSuperThinTall.ttf b/copy2esphome/CalciumSuperThinTall.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6a79bb6c77964e46ecfc64438682b80f049e1577 GIT binary patch literal 28068 zcmeHwdzf5Db!XMR-P3wMJZg<3tEKK4Nn=Y`%tJGhERSjHg)wj27-Jmlu{?U%dPN#L zhOprhvVpLUA?6X55MaUPp*a3*1I7UYm&d{`OZXhyIF475W(i?;fw1hZH_3vf-rw(> zs(b79^vGU+`_JyTSGrYotEUNK@#+U^rF|oOE_wK7-`RiA`BQfUCyHLCG zr8{@+wpW-nc)k(O7rgqa7Z3gTJtrSG#_q@SHG2+?AH98k`ch-ME-!vqC z-?>xxytHrp_|aC&0K=hc@jPqa!8h;SS9#f6fN-TTum8;ciSe6zZ@qg0pZyH?=zdg` z-dSD__`qq_>_0Sl$F1Kh{}9h9!0kPFWY74E{&f4Lfd3<7qAiEU?>K62F^BN^zc6Os1EB9-Qo_6X(9X}^u<(-qVOEz=Va(LY zPv7A4R!VHq2|Uj-5o>XwkJMaWGWxkd($BQPGS=Ah%_U~ORIsO&R!y@}o7g$_8B+$N ze;IubHSf{f{?rWH*{C&9EbYw4jro|d&3|W1z0R7U$;rK@Y3i*rv1u7|y-;GzVtxiB zx0_zcUx#uNrG$uaGw0pZob@KvTk28dGuvi;P?WyUk$YGIn{AuH{TzKe!e{@P`pxiJ zMth3BiT3w(Gs2n)#|x~__(uFqp&`lm&N|%EhGi7xv!-bl+OR&n*_O9KyY~8K21DEU zwjs<;ZG4??Zvr^sXJMIb2{(kzx)*wb6B#U)UnrdE{hI%WU^QuFgzt$-1DKuRpNlum z=fNkoA-*KI`CP1PMzA=AHevf>c{-gTtgu|{M;eNK(Y9oiE@b|SQQ*B&1lGj&;fW%; z(v;%&BA*imZ@0fpU{=)pFdEES!IcZLt|6u;k{73Vj z&EK22D|$op=IFPg zJEOa!6Y(eG&&FSfABn#be?9(I{GIq@^>ekgt3Fy^QeR%L)qCsf>I3y{^|AUD^`!pE z`n~nf*8jBr`TC#L|GcrV(cS22tZb}m)Em8xjg67U*2XJ(%e^alSM}C=H}u}vJJA=d zyJ+22>wa_H_czYnxM1V5jT<+8f_y-u_7i@|V_C}X=7~zBQ7vnF-Y5dLj+Zf>kGQ#fqvii!x z2;U|n{B-?3jPQ~AR~id2!lmaN;mtC_%V!>8>u+1%Xnnnvw!YT-O6$w5KWjbG`eN(z ztp{5VwC-=6Xnm&j>DIlids?4teZ2L@t&g-m-1<=K4_hB-{YGnF>$Rfx!+O`Vwf_|(Uy-Zyo_)Y#M|Q`@GtP7O~DOl>@U>h!-q z{nw{|aQcbUkDq?*^mk5w{q$E)-*@VnQ&Xq@=G4hkkDdDHsXzLg*3&{pNd_^~Jda_I#>TswEoS8YwD7qj^P?$s5|;ozX0)X(s;#>X^14?hjd+B1eB zC_}3&h=yjHIcBbzhX`kZS!fm^0y)ogn3%q%x6%=xeeHM7dBhK@84ne-ug zTx-^uesh7j(5yEb%!|xLh=^Wn2F#!tGQ(z*88M?~v)N*{nv2agL{MYqQu7i-JeQg6 zW{25ncA4GgrRH+;GIND_xp{?orFoTkwRw$st+~=%Wv(`_GuN2cn`_M*%ys6C=6dsM z=1t}X*r9O@=bynEy$yEhx6SXE-!+I#as3|dcbk7xy$|V8 zbF-N+2h3CEHuFw%#N2A0LG3N(thD%*`E}SX1ej)0o(=5X8FSFQ8P<>2Z<;;kF!cXk zc{*g?V*c9PBxOw=gH?PIcJT@G1M>%{dcXNsNdGQqal4eCmh`QXzTJKL4wq~8p~BN| zWKR;0gY){Y30}R+e98RCuCtr$mG-dxu)W`Y!#-wD*~GAT zniI`gH>Wx0`Z;&Z`N*7y=R7gz=X00N-8A>=xs!9>JNHX-pPu{dyxw`E^RAosR{Xnr z-Z$p`X#Udqub6-H{Cnmoygcb{4^ zZ^`;4*DZP1k}oZJrn zSvIt6@3K3VeQ?=Vmp!?>w7j|e_T?X4{?+9_Td{P-=!&aXymiHWD^8ui==|O1-*Nr} z=Rdh}-pZksH?REg%5SgyNo_%Gw02!Bshz0(Xw|G$y{j%=b=|7lSAAyHQ>%Wm>g?(z ztJkl7&Fb4%-?jRl)hFxg>sQu~)$gp|Uw^b=8Uu~}jgK}S?Jf0Q+Iv&)-Mwk=&-+&N zy`t|eeGl}VTC-}+b!+Zkldk#6+BIu0U;Cl8-(UOlbt~3gx^C~fJJ)@6-7or=^*8(X z_n+v0;)10Yyy}8GFZk|-(S_?Tyye1AT{yLV-ult?SFit_^$)B+xnT+Z?c6ZA;hqgo zz*h9agbZQD5yJv(e9)Q~U-D3;Wd45W!LIVjOCE|N6wQM%tIMo@sM2Mhz2qUw`r*Zm z#r?yJ`+Du7pMURr(TOwH^hSHR(BaiY7IO_VI5J%AA1e>n%1vI0q%L7w#3m`SGAxhj z9<#$W+b3z#Oq(`q4Tu8QHW5Gd!P=PNG216?`$mRGa7!nbR{N^MReah%(pODGgfo`W zid47b7};P)wpoBD68x)fv(*h2zyThxkyc~m$&7Hr53CU+UBJ`C(lHgD&jpWqU{ww1 zuWkm0wIg7G3}!6SQWZ>Vp|8KvCRl?jaS7n5Hz03fSn>I=+Jw0pmU#m#v1tHq|1c;Y z8OA^=WN?+EVFm9&!MA~EtDDgRl%@cVTmB~~<4Po*AyH@4#K=<2rCBTxn^szDREaeK z*h`tHV)jT;AH|}y7{yLN*%w1Y4_-lEO4L{v1S$rp9eXBC^k6>_0Qpj0n9YzFOdC)O zac&Z8mRxV3J_%rj{C3qTa)1<%%k@K(61!O?qe@B8c8O+Q56}{npruf4`yfs=<%(|y z=YlpVvI;Z+lM;DSRABfyMuLAB5uu# zx+HTkR_d$8oDa&y%$#)~eFptheqaQE*8^A-CjcXtYhA-LY6b{_l;C2&7|}+z$g80+ z2oEyhm+|zs%`^?e*;L6u(Oqei5UF1t?p%Sq9OKkck~gG~LayxU$Ky6mNaCRsa;@bs zU8F^Np{>JXG1P_NhDm9qb8iKOzFcgDG)<$2z_vwD$eN`{cLwKci@d8~jM+Sre=#Y- zFsWToXxPDS&pr>KDW=tP5D5JRPLNUz5*NohS7vprL`5C5WL8v*eCsUt63t$aVqEM? zxu+$nIg1V2gk>O&rY)ZYR5;56h>1dVnLfBQs4Mb7u{8WFW4KiDGN*b(tQ~O)kN|`O zs#z)-Dd*Umv>c!xV&EMh%{k7Ty7vX+_`{ zos*>pc}A_{tgDr$MB?u8v!7|4pJ@S@KqQUu*TGMlfGc_$vc%*)u6Fh%pjbLLhYi9Ny2`e%fK7hhqV}a-&h5)0^oo^ zXdvurE$SPK`d~1eqv#ANuO(%njU-=}d#;L}gQJcO(-b^3kPakOTYX82Vbkt=8p|;J zeKpwr9Qn+p00!)!%m#+)Oc#tzl+4^06ohsZ{$jAuH=dzu!G2P*py}O|D+FP*auJ+r z+%JqKCkhk@CkizV37uDwA8z(5&&#TNQUe$`*HHggh9QW+3$U~kX6?%Pr5*9Ml9oWd z6bR^YO4qS_*l#wtL3yKLg##DbfjRCLCy>x!o#P7acFqgLXKr3WNYc4`IFFbO`utjn z_$7d-%+M=N3VrX>c5}6sW~1`gDlK0!Xe%PKJJVaqbl*S}dwcG95sn zhT0O25!Q^dN|ny^7{XrY)BX_7(_*K)FadB*aDOl@%)|>O=*heNqD907LB$m@5x-i| z8K;-`Djd@ET$3&^n}Ka9W5vK#2*${Hhq)KwVbJ9~bLPXHBwIMb;p)PTeJ7%10R-HBF} zAmPsu=P96oud~IwuU6?+{bWiLH7Fd$2q^-7bV-2}d2kZoJ_yFh$V%c+jm#(u4jS4f zuDxVl$K?Uz%WV!L7dPj+Vi0P^7$GytD?m|*QswFa%JC|JXmU-b!gvl(65uW)MqnSP zJl5%b5*H$aqYTmda@wSHO~VI4rKz>G3O?^}aW1d|Y=S-?mtdU)`K~r_GbXIK9DGJJ zoHo^7wzJI3glRH*65AMf8PEj;5SzrNz=N}1`X(KW5alN^U>1^!W?kc56 zMi7C13Qwh9LY(Pc3$QXfE%-GCcA75~RIzB`qMQb3W>6r4e8)vv)O*5%gAj@o*F7<# zqylFDz&MdTJs%R3x?!Q!W+0B2Nr7OwIr069dBVqlhKg#Wv&+zQ5&<k3QJJd4|3-rq^zisJ$M~L zVPGF^ri{R1<0PvpWiEG|@A()lwFkVSY4_`Sw^E!5N(v|;evEZ+tjxH;?+DhSjs#?U zPQ=@a?PDxJ#fQ{xgV2evwtBy-|t&xx7e>Em(EursVhSruRm_oQGUnlY`v35#KGQGHTz$@XFps zOzNSxjfGK{N}%UsDexO@K*WxOyx^?5Id%RUX3uZZbeanf(2omK%KZy^VrTm}qvDYL z{uorh;E{D83J7V&+a_Rfx1Rx5MH>Yvnsvr0dkzSSBI41Zx9{~SnAAff9PC~+oy}9p z7ORP!b1puzUG0?XhSbRgRl;4MCBlx0$};TveFuYq~7vA}$CMF3z#+X=$_^i{52p_k3YXj^7AvJpG_Fb5(pH zPM^i%#fWD?VL!Ikw?!1W2ALpFB%THkO|s1+Fv49VGSxCNSJLM^1!~X>JFB*_qCT8F zPtZm65N&e)^?TN7T8*wg3+rnxMddXByGv zL5$lPNnL-R>to^U$nV{8H>^KDJK|U}*-;Bo(Tri5N`Xq0ND}}j0vxH6D1Da7AaS*- z1Bu8lv~ev=7^b6Ci>9-ojgJ@M9fN?6*a3oWl7ls@*XWgSJ`*xCzTAh%zjmfr2TP zkw|&#-YHt=SDF`94(PKKPFcFj@z&SuuNW?;`!jU2Wcg-)rR4VrE|VQ z@CO}3dYYg`e6O<`roo*?E-*E~j%!^R>k9p{2lj8u`IxS~&<{bLD3#!J@X;dS%8PL) z&6~DRD2@i@34GLMw1IR`P$a@l95SEd5nW_HQaAszg$I~ROauKR)D^Q)2o+NYMKbme z&tyC370o3`5KaowV%^*tK36t1(ljImO-clfrcw+NS4$e)zC3I~crGm75}`f$019+4 zUc|IF5#l1B+fIoxxkwSaG`MHe7}*e2Wd(1yQCe%*i-(j0@-Poho@0WE#UR1u;&a&# zq6L@ze#{h4#Uy0I)DymVYVxi}7?(9HvYzR=wheR<@*cVk)pjvjm(9Ww@SKB#;8) zfi*(}1Qj&xFK8kicm#Zb7MR$VahGmrun276lcRK@p595!T*ZwzCIYd+#9=ym&u z7$d`0Ad6F#R2j>R!ytT&!OaO^bDdFx&Rs-b!W~{+dAi+ZkuUme=a~|8=lvX4DxW9n zKULPa*Dmh}H89IyghYQhAVOdeRfh{xALvBl07+IzQhmzCLY*L=xLbm`@O)AM1~w?W zVuPOyr(VD$NO@yonHHu$CBJf=;W$LEXBtOGBPC!vaxNu8TsaQD!=kgIJ2qmP#3gCq zuBs#Z655qUDbXTQEg=Qj0o@hPf7e}{8f+2W@`kv;{}fOPS6XlV!(` zyw}|_*lGj@&L{;yLfffKFVH$Wm`(->vb96!sOr=#*ysR{6mxOP?1b~Z zD0hz?fflC%iPygd}-!jv1;vmU}8#;66wj_{&FKP@Rl>=B7{C~nZ)wPm^B=KaotaHGp?nSDEtqu!syx1 z$r*K!Z<0~dxgw|Sb$*4=@#Hb24w}#1W2S(UM?dg&{-?X zTgOrWP8@K~m(%amRUu1ohd8``!yZz@p&+ytQ7r;k=cEwrMpXps7>+aPIk+G|KxIKh z@SLzAlj69zN3Cl+caEXs0lySgZYCYd6d>|}`BDc@lBjCPI#lC^81t|4F18)9gG4^i zQMC0J*%TTQyTd45#vp=D9V+B`AjdK%M{Jsl7cZo5 zgdA5J@Q+pbM@hg78n8t8SHlZ0Bg1Jp*@?h8XOhcY6WH`5TC|3EN)mw8qRm9al^Gl) z*H8{gn#pu06bS~9>kRdgQ9EL4&Ko5QX$;;Aw{-hOFo0(34$^KcibrORBGrQ_?72=eL<%y+>rndY@x;2CE-pf=ST_4dKC(xt?==iz~C^&*=Li3cP53Q zP+iBaL_xI^Cu9XYjG+Or5?+UET;J66?TlDeEQ6R9h@1Ansn6$M-<#G|G2ZBg^&x2N z6(ik-7u|I!kS_sr2Tfyh1)WHSR118{OMKER(}5;+OZKDTS!qMX@0B39zze68d2Qdb zV_vkQ+}EPd?#BoS1i`XXs- zANVHKP+5h@NoQA@dxN%K`k3)072W2p1gIAar(+QL!(50IwqtGw2}+}kUcL+AG`e4+ zP~SWC-O#)sV-4MZS3gnHlPqx(-i|+CAtM67&iBu``s14=^mXEm+UAM!rrQ>l7%BcXIjuG|xk$f&mV59Oi z4_>;4b*@D*VD*S3s`E(DrGr3Z#w7vMyxnZdE-TORVBZMMIXgJGm~f_DDQj|HmZHDL z?$Eb}%)h4H@cP5mijYP2LgB*od>h z9Yh?R@-s`@ffuVFvp(LY^v=$s)CT1P^8zL*-tgp!4g{D89Jl;WP@Z-rsG%Hr9I4>Y z^&Lhe2262?wjol(E|*3WRek%Vuql-)0z&P0C9K7e3UbT0?Q|zq1={miKy77bsdAPQ-0~Cuzb{*y0bmqe=X>|=TpE!y7=zUtmQx!dmE~zsKqBP& zBn9Q3=S^@!zwIXPZ)>R4Q0peCD`Td&S)NQgen5HzC}8<32@7CN#^)5J+2Xq}tE3Qo z04G2;7LRVt-bWhcLGBg{{My z0E>a?DwT%NGn!IBkvDrRm)QU(lPN1>xH&Ac^t+@<2ZHh{fF|p?Z_jz8jbSvUTJNHo zhNBcS0to~v37p7R(2W`y398$C7!a#h$gu?_pv!Q=*JE!ThvygxS498__KtwDL5I#o zlAXapJVQ7!RxkM0Bp}Vyzt~51sxc5O7ii^XKHY7@HH;HC_tuLbOgod^!X%>X#1)a$tWs%nT*us_L33W|9pXFunko^i-Bh61Eqq-Ep6 zfhf425O#jfvP_L>VujNL8b}$$g{wR|K)qN{8d95}&3tWB25Yj&l`XYhWC$mPoKlO7 zMw_r$;6%b!(oD34x|?S2T(K?Ma7T*!U}@eIB@l`83)j}iY6eSx$~HoG&Hdh)P@V?~ z*+7)n1z4Oj?)V69YLVZELmcYp03Z@0@N!Tjk7R+Uro1D?cMuKYMV)Bg_UfT)gNrlxD?;$!+ewN& zMgQ{%Jnn2&Z2XQOJ66i1RlG95^f-(CU%p^2` z>56EDaYh-9F?STGSJ-(jLgoaLRC-3Zkr4cJu*I4Je7vbeP=qg1Kt+Ni&`lE|aS(&% z&UF{TJ=aqh2U2Hw&Vju$Vg+v)$dmcmMT#y}?3*KxNygiApY z`9wiwQ`3|ZDM=9^pOUZ&VxjvzwAs{S_l;lbF=dL-vq zg`EI)x7*{SWy-(9!LPB>1mb&a^pwQtU;|w0?gHd#4~aHp*dx1!%0#H*awkP-~j5%~aK;M_scdW$6(Ne^?yJe1HAZpyR9?sbX$4}phX-NbF zQa~>7u%NryX9-Gy9B__a%y+Gc5iqM{AmkT1AtMxzR|6l#z+;OVO+-&pLM&Wq;i>qL zaMWHlIDhkH)h6$vL#ADXfz_mlA7&5;YnB}7!L55p91kw%AQO3*p14-2Ak;Zjd_6o9 zX~!k9Vq?)-*a3uc3NiD-?Fjr-=eCPd$p{YdlCF#OdvG+i!mWH)+QR~E9WL^x!oAk*zK8)Xv+otd+IA!RH$PtOhv)omYEv8t%$mg;jz!BjK zqOc1y*d3iIHF%Dw!uX`leE{+bGS6?VL!%jT>0X%M7Nz}G!H4&WV8-Qm!Rc5*yMW69 zM=84~9>5h5q0FQ18gjZ2LDK*7i&Ocrc9QjUg@oNj4ifaI6;cb~_RYyfbnmndz@8gt z2oUip?356*;dh;BHocq&{qv%;!%a8WjyBF_H}04=OWxRESW7}u zN0Npu1s?@Gpev8J{Z5WMo{K;Wt&ek|utqr*olAvyNZ;I&-2(10;TH}hG|?DHjxh6$ z#_1zYJcfkyGgoKp_Dz zzIg4Hgvg7udmv2@l`MuNArqOLEnYc1^Ah^NAW=ejK;KSRs+B1~sV}As_2S>UM2QC9G7sIJwNhFd+ z**{_m3*slOvLw)3zF$s{PrZft!;y9kZ`<_a0qa(i^JQW_u_X-o?JNLIall1mj z+aMHTLrlVKG$4RA3Nl54j-+;|Q!d=`5u=YEMz#0AwV%aS^@BYm(_JHG&Zh zaLZYSew7oZS!^FjL9k7uFQR}+(#cB&9+Jctrst_3%+I80zc^-ngFJ{cz)DyNj&e|< za`+jp(7niDM5+Aq*v^5|Q32E(Y_6O7I}3cn8{F2@wQWEk+!Z0gINcYdmFL0nmxGB+ zc$x`PUazGjt015A_>{k3qCOB@#vo;kR4;i;wX9w{7%ai~pd*Kw0r!Pe3(Saby4}ni zn938q1)>^c;kRlONP7x+;k@ze$ZMb5kpe6|`6SyIjNn%f$U;scL`kFtWlkKYjj5kL zDbA22QqS@5dpAw!N&;&Y`aQRQLRkfTxxFXka}SaV?tq^vJWhmwK>rJ(rXx(m81+p* zZ%wBk?j1{N2X9IY*vFLXJNhF{F`Hav)7(H@+v2W*DmuKHiL$C)=rmUOrV>Dkk7v#Z zm^e5(4v6%tJSGZI$HRvNV~M~+wKp*%Udn+xK@$39m#*Ap7TJp+Nw$QuB*3Rsv20Bp zy|o;{n!ntYWBj7`b*@}On|ockjPg^i+-2%^E`Gmz9KV*$-_$;g)Vy+ha^k>Y6n3Eg zAbv0V0Dfuv5PsSFHvIPXggJ&^_}(vV&5rSddk)-o=&IX}P8_>>|AE6M|41K;kS~62 zhz|F~(;>eAVy+QtkAv1D7+D?s;BTC7lzafs=9-CP#}6DiTpt)1+&C~WfSMP8CBjVL zY9-uJnSSAK(9mZ`;Q0T=zuayk^GW<-`#(2-Za!%K6MnhtY z{ZiXwm)YfZg+1S{#IeLG{LPBGZP;GhXV;jI*|qph^?rMSz0j^lRQn?Hhvtv$MRuco zG5+qupdG^Bx7cJy?5N#rx0r|U_c0zeUo@Y`-;j8x`4jVPyVYKdgN{q=nE6M0seK6| zl*{aPyTk6ZyX`)l}%6F1l!?KuAK#2$OIov?fDKD*x@u(#M-?Lm78zX5;5 z9$h*#e1}poxWl#Iq0|iSP-+HuYx|)gtsffF z`k_tQerS`c-=y$|Mz#vvq0K(urO#V-Xuj38zwEN|RR{JR8ZVC@Ji33pbkoG-czNGA z##g?1;^5?XW#Z`Z0~l7!`pNxByAF;Yy6NWe_}Km<<>TxbPmbRfAKiZ--n0LJz#iTy zI0i?y%b1W0jmQNja-n^2=aA4kxNED>HZ(B2o&AyT)O^!rnr{|f4h?J(ctZo1jdUHI zI1XC$(gZVcZ16;LyPAiQ|(84#BkF3~o*w z-LLh-ig9q$j#(3jj!wQAgqOz;?>jhA-hbq_;}gHelr^K9 zlzP*w?x=C3yI-)EZ9TAofjXKgt5y+FZqnjO^9olc#fIjbX!{0Ti_;(Gt&xZx> zFf2Fw@7yvhQ?_%*fZ*S`V?_Gz-o1OLnq@10E5_o1-g6l}0PHf3n(YdtjA>}g`8jWw Ve&_51r}^-2?$~e{bN+3z{{Jnr9l!)*f@!p4ZJ>q#VeFSl zCLtLHCj=bFgE8YJu?gV=A`jT$_<0$d@p$|>;9!PeNx_Wc`Aqnj#Evr_q?+IFoO|C= zRV|6}{F8ihyWe~F-S_U|Weox#Ph2;h$Z)Y0Q|m)y5S6V#h5L71I;kY0R`& z@w~8S{K(;Y-2lVkdvQNy&;HwX5A1$?1rXx>tDoMxYkX(VUmy5uJmdSLdr?qqFD?Xp z;55tj9+Sn+3gJg^eHk{Cel{mpo9JTUk&kS9&TdD*cs> zm9fgjm8kN`%BL%zt^8T#Xyx;jFIHz&yQ zs-Ek5cJ&4;&RcQ$ieFpt?KRWZ%v>{n&6+iD={GNoyfovb_tsCMS2Lz!9t4k%n$HQ3 zU(4|LyyNke43Gclcw7P=`|ZW{T6?|Y@%O>w=WGlfdxA|Zczi5;B77>0!>@*42ak^m zk6o4dmBl$8KPWu@N#$Yi_+;hj>P+xB@3cJb6do^{oX7eP>R+jUxgOWQRDZhuRQ>by zC+kntkJcZnKU#mJ{!slh^*^b9y8fy9C+iQ^KUTlL{?YnJ>VH_jul}p`Tk3o3m(^?a z3+w0Bm(@%4x%D}x{^8V*PksK>-KTCmb?DSJr^ZgLKehT)->KOr=b!94IsN3clN~49 zP8LrV-gy1TfK=M^F6eiT`lo!4vnMxbDP-C&o@(aAL!W;S&QV z&Od(q_)EuMJpTOgzdHWi${#GBzU)hOiRv&~@?Ual3#O7i7%A;Eo2>EijlX7} zX7gGzghMF8y4w*Mb(pDUnwgGhXQr8DW+NJzW4g>-Q!?{Rx0!Din1yB$yh7P5F-u`7 zRYWPhh$NSr6{gRuH0PLe%__6noQLS>eA90R%%B-E!)C;cnzd$~S#LI&jfkek%!TGH zh<-Mi&1Q?)YPOl}=B?%;^EPv_xx~EPyu(~--f7-te#u;BE;m=0cbhBCFPp2(d(745 zz2+M8E9P4BK69NJ2Rr`?Ug?AIPygEdrui*{C>7~)qx^St?e6yIw;f%6a37tAe^XS{689diD4 zIUDmE?y8qR%H92HawoAlB(Hxp$m&k>1@jvG(S`PEJ7FKRN9{BA1^Wu3(ZS%-;5UOO zgJa>8@WSxA@c!`I;fe5#!ivI$g}sG)3STL_T3lSbxOh|X!^NY;AGS?xTiJF|+wE=l zw8d>dYM#A8Fo%QIfS7w{pi)Ytn@0@+- z?9a@8a`rc8ztUOg+}?S(^MTIq%rSFD=j@#GTXX(m&g)&vx~}fJv+L=u*XCB{UN-lR zxsS|!wp1t$m#!~GrAJH0=FOgW@w{l>(RtsU_iFe2?zeY;p!?zOm*>x!-#`EA`FG8K zWd6$wf(2_9T)p7l1y3({ePOV$vhbpX*Dbtz;WrnVMJpFwwCI*a4=#!q9b4SCcy#gJ z#UEY#opMm#P`@~$NlOFptBUh>M)sY{2K9$b3Q(ubEmv-FjUsSH-G zuS`_#tULf;{$kZs=cA9>T|HWTsrp9Gyq^WZrzoICH_E6%;^+@t6IWL5vF8&-XIRlMrh>Y1xItlqu)0sMV? z^{MmLoOdm>DBxJb4q^ln!V9c<%$oBrc)Yz}{%-KGw&F_{JRSzfn#V#G7g_vxdz*dZ zg2ye(hdQgBeM6nSJ$CkM-}+YY(8()%g58A4RKq3Ym}X#PsMI%B94Z%UOp%=3iSHs# ziE$~y`ve5!Ok>Ibi(Uw+O00(%$#<>*Y8chl}`@kAO(w^W5!SgJ5 z*=~5&USq&PsT<61v}L;-xOnf6sw;<3YPC85`7?7!k(|>LaA+?m4f$mBUVCn}MnTL&`5(j~Ye=D}*4kMJ-63b$}SUMp-X4 zW-YV_O$d}ilxxtkT?<%Mlt&pjD(*~yh@eI)z#sab7(7CI*Q%D3s1^FQgW_!hZ-NrM zDHPjYs8(5}p|2~v81RgNmUN*p0#AzaPJG}5f8dBvP?04nlUU@;mNwdYW8qLa7z@yj zioiEl%-f`%gbhW}3$s=gU@U-iXk8F%;Dl5R#TX(~<#9F%_NzP@vGH!SF;#1g&-74*#s?oJdxq@kew?33mONG%sAu^#b_GHqPoWh|g_8Ia5G>~?J zs{>xEgm{ORqS(AlAPbUDYf$+*WCRw`EF$KZ1Y0awo+8NsQ;^{4rWOv31>nR&!2Bz> zhjePto><=Z_1ulSP!Vc1z>zi=`Lx4+dZB-!FB>i85cC0XxG{tVmElk#)=9~eyYv*h zEWI$2lR4$ki@45oLB3&522=|`g|8^vE)jSvz(oiI7V*>|1Quz6Hs0R4+74XA6V zUSiBb^*4rz;`*w%ssJLEWZJC=4_5*d>d1L23u+og0Ut&aSSy5T!#TGmC4`h|y||^E z_>xN$Q7WgRcofmh#C8NM{YnuzbWT)G#U23$5A`4}EBEOsmaO^=Sh}UHLq7?GnyxS6 zCDK71sL8ww{R(?pr(99d6+il8P* z$j50(1fT`LRhwvsh9xZx&kQYMx3iWFjQ?_|9uoC6MLsjh6-@!qK>}Z3!wO(lVeeR* z*cjoqHNc$&oGZ3**3WdHw?|vR(b#g(4T{@01|>iS&9q(^F)ZY4BN&f3qyHLP(C)H+ z0y1{OX>tz{fwXiD>J~Ecm_>gN+F?fJVoH1Q&5+BcLlU0`8mW#UWZ)emU05&_lcv+B zEF5UmKm&~MG_`>~)gks}($3;lq0;czYOf(;AF7j=n1>iUbrhLJzBGGP!KHkn-%7No z9nGsd9yH=x^>5o*_q4-6yysKGY8m?oOrTMj8cG2_^U!>!=?G9Uiblsukem|e+vDZ*}x{LA^Px6c~h zU%;NF3TX%t=&{*nld=*=8%26nq*Jk6&U^wD0P5t`rDGa~uw+ZXmf_5M%LT$~5rZ}( z$m&_q>zVJBpjxn_jD|%3km>iD!MPG@SE^gEA?iMTNYJZZMFW9gQULw|Sk-=$vZUWw zpnY`}O__{D$Unk>0tO_hF+j30pzz3gXWq68L>eJNOTN>BL&|?Y3l;$7Lv%2ZKNY?^(P$pN+ao+v3xu6;>x(g zIb(QADT!>95h2QhbG(xx=Lw|0gerjt^bKL(&%Bw`wU{;6qtAf1X z9FQmj4B0%q7<_W9p4GVi25pqjL5&?Qn6w<%RvtuaC0AhUpi6FUpRqv&KO$P!Lr zG8pY8^%_IPL>FRE)S(ihM3Pax7#&9$Xu$|zc*HHjbW-5;im(=_rqX*0PXI_i4sGQ` z8ZH0yJu7e^c|Q<~?x%A^;A+x{)3;R(`rV;aRAv64I#!TD4M#YP6Cq!92E-Ke)GDcn zllCG^&J;SI4VW6^ow2zb94{l zu@L9OG}vnQG{tD6$w3kYSrfQ27sGWGjZ)e6aEI)VVV*#coeC2LL}h^XDait!^i2Yf zbM?>x(g^!fiF4!%QljMr1cpOxt=IsB|WHxfqGP_*LWff&lB6;uV)Ayik*6> z91&!m3=a;a-q+ONYcNYSAn~Su?yi&Il6fh{G(?ahZK#}zP-$+CSGpiOuJ2HWswi~3 z=mOZbOmHGT0Y+dVoMX_-mP9Ku><&>k@-NAi8n1Ge_=vqtAKMAu7+Ou`E{WB`IWwLp z(RT3!cX>FmK+B$z=T3G4AAPpQos3W5l60OqLwOcLk_RK$Yru%F=5#)td&GP=rGjQu z?MJ4a9t!uA67sqR71N7@rbtgtW(kTKafrS-I&~I-Jvd+y5&)_+ybCRLp+$Yf56Dfa zaa5DIT;dX6f_d5)7AzV?4{g^lPRV|(HCJTMIYhEMG_yvr4J)lol zI2@z67{$ljbh0`sPuJO^6ha1AqOTl>b+JchjKYaeurHnt?wTqfwKEk{Xvl#U8IL-@ zp)-9nI@Qgv+?I$gS1-9?{TfDZIvNa+VYcHa%w%Gw({tLw4=P_wQ)QF5q?J6tQ3Gv_G^q5h78}4Rf!FUc?ev zE$6O>RROv^1Xgw<z#Fchmv_B*I zu50WPGeF}?y5a-}g|6L==G;`(TIrY|hB!kuJ4km=;Jz7L5n35&zyxvO!rsnB4@K$h z;A+BB5=5}Yy_f;)3`ydizyO2vCp!8UtKonEprE>CL_8s~@g%SW27Q{!Vg_2%^(O#9 zT`yqPA1adsP+X&7|5B1kLm}4jJQ)g)*~uQLQrRhW_f0$VIgz^PKE8z>Y7&T)-+;LS`8dK3ws zY)sdyQC$_-#8J3wGS`ZG1UPPp4y5=;ium6cb;*;OlN;4Zd0IfZQD?FoF-C@e!X=Cq zrtmT;8-xuWT$=zkM>%EK99DdEjNp1DX&ClL+Go3-3G{kbMo5#TSRO>$e;Tnn&JD|c zwkqrj9KhiG%wbR(qOm1SpRtL^0g_AZ6zg5Wi*YdlXW7seUQVjOt>-Bn2mp%Qfrdpc zvwsFRG3Axo4EYedo{W!{PD;SGlw1rHOeqfTvC>x286t5_(j~!8V47+=$>gX8#E}5u zNpm=Z>e8vf7oial+2!OP14=H%xjVUuw1_w)hIV~2S0F_8I%5Z4jljS; zr3{d)@6--0M=Mv%RK{Yl-Y3Dmp*a~O&>>0Z2vre(6lZ`pW>a-a{6rEzaGnO^F=~tV z5gZ{A3j{4aS+W;J3@cLTWFTj@D5orZ->&|FF+cZLCE7R{j;!el2KAmf3?k=R;(J`= z6N2(?c(($yL~4StBstD=vSka22d<(U6$YK>CnW5~pl_r&5~;=1DEwzqj(fi7^o%yB z^U|1+|Z89E~1H(hw2A#ts#(8O7!e@QCkpap^higV7kW!cbxeCLvi7 z>Wq*V(^=SnX-}!1)qst?m-LT{Cz;=t-k#+9ut?fFJ}rU>45YS6yXWWt zu{&mjAtkY!&VdXRR#%N+HYwrg$OQV1aS%{O0$q{ zJ7|I>KnMMt0eh<|VAIXnPG|}}Y8MVAmZcgZ08k8AxFo9RTwm6X0Y23~j-_+!iA4f# zIUxbalC+b`#2DP0*-H%|ZQe6usK`MZ!lICLa~ubobea`8P{}3NwPZ_^aTVkdLJqpO zylrE4gPRhR)XHVDzJl?ztj01rCz}#fB#q0BolHX}3CmTIC)RcprksUI?6ZD+E15I@Hjax@2w<&?CWs zvu1dg=6I(mv4I+6Xqop$4^AH{{c8b=3%uxvlIXzKYZ|#dC{RdQS)aQXHU>xo$2A|-e^ zhv+@J&T*$vPR^Wgy)%|D0Jod2$!g~j zp-KydNSq7%J?}TUelF{LXa#{Lp+O%FFloq?3;~Q&+Ly(suVVz*n_t(b7IaAv+b(2L zyf8QnbmC^#1bS+YATFhiV?Oj3z7=6xm=d%b!LWR80%i?>NRgadpJJ*A^c4wxQ4Q20 zu4^1SELRE@Lbi+1l16#S+B&&p9Hl~UYBDV#S|4LjPyBAMN%yu*E~nVj;$yqW=^Z(O z*G{CAYT5slM{0;2lR48IeA)BK&!Z6qpV$$lFR#u@a??4L3D=bpuj>6ZdL52U*gJ4x z0kB~;*jbrfx@m&hSdhg*9c8q|d08C=iHxMfbUw$GCzGZ%?K&rAC(hu5&iXc?_HqxG zi&Cr950MV`=W+CvUExAUVbR=#ghT!#pku^FPntEv3dziBJM>wt|wR>d7Q)q$AuigT726A%+P9qjvQGd)5ukwOQG>LzRk?WAY3$3a)#aaj`T}5h?YaQKI zPs>Jk$*!0cq!O+zQc4%Kl$OAe8hE5Vb>pClf=i4E5Qa6IRGfvL&=dm-M{GLG1~_R< z2oA$5#=Dpk;peNP76he501Y;we@HTB(>Z&!dKcBun~CL1-wq|0z=>@Hx}lT835px~ zFd$Ypnqtf3fG)ua%fcK!cS2Lo%N799@FNgxrb6p1$xh&)hbNp6qZfQk6ObmWpRXe` z;$Q@E1-;zltH=$whA^e(cGn2PxHXBjMjElR9bSmSUkhc4qIRBvQ9hw_$Ia4i5y zDfP;CZ%G|d4Dm-PNttX~$ktEgr)w!PjG+Rl6zSPGa3Bh(XE9s(jCpAqQ{##|&_K(e zE(|i+0cv7KX^3rvcV_52MTjPeT=}NH7Z}2cF_xwk8I3mKu^@?vZ^>(7EwtS@+1tf; z@eWOe^I&oMDsmta>m=@7AFCM*{i)js-Sz6{&V+I|Lck?qL}i_W#Wv%NkKm>iasLMK zBMxxogh@&mU)7sGdOdu3Ime+(^%^7$XR;rWh4f0Cj~2 zfW?Ui&5oaR4FLgD5g_BsE{8Wl5XNgJ?A1G5Y;M z*kMK8_L63caeHvPD`WQr)z*O&uPDdBN~X%v6>U-as76L{&UqjzR5O(nS)g(g+UQdO z8Kc@>iVa>t#0}jkgY{;I3M~2L;MKruq~ng|ge5Too4vr1VA9x41hLHn9MoRwIaf^R zm(Ufuk)O6=+<>)!I-MV4${Di(P5EtqI%2Byo3%yMmo83o!E_O@dbOQUeD zM8-)fEQZ}k7JM_tw1+lvc4s zzGVba3tOV%BBg82jOAqQR@(?&x(p*AMF~8TdHPd4%i^O%BlHH!=N(r&B&( zt}`?eP|H%On;eCKpb5%^464pDWqbsv79Rl3ldAgTN`Z#)u5J#6x zW>7mhXFZgPi?OXbibycv49Gbd=4>~479p3>1Nz$Yxu=^L0kcE_h9z8iC&Lg%IDAI= z1{ABF00(6GR(QDbcebn@7@&!F!+7cTp=DWxx;WxOjjgV)Rl77bvZC zR@y@YZ7mYz)6SEN4e861eFbbChz3rOF(_1ljU)Z8#zfR|DhSBadFBK`oa9<&$VV-~ zNo{oT5@pXG$&Ja;G`{;2II{Gg!Uow>>M`KNXj|%(?sOl*cPegF>!&D+2oXe&NIc2s zfj^Y-jPZ*+mr*u3!uL7AFNpJLCSF@gT~gHiSiOmR0P=D=&u=k+MKk2mxiB^vwVeJN zc@MBzV{GcuV3m_8<{CG*b7Dj|6Hv(9vzUe7c2)2#FHHP_ZUei0u} zjS1S`rdFk~D0|^&-Fny3%;t&*Zob2mxqeySOeC@pno^>s&4#(odAhYyoF( z@C_Ien&>VGnQKia8k;$eJcfw$Bk36}oQ=6MI4HPoheLgq^9a-?ap3Bt1sG4U%S9fx zFUYhN_jo!9vj+kS34o>3lp!I6oTuFb0dN3j0yt6(|&2LXu@%8k}* zI>%ZP1C(Fap)c2YGJ(nO@1PdYW6@W!ql!>V-4b(|l(uH}djNGEQ%B)`Oq{Imh(hRO zgn)NwXv&@o4u)gFqERjK{uTnssh_-+oHBMR-y{Kf({9l>U`e}-;Xog5Fm5$T4Q8U; zUG9c*PklP)x7m{H?J>4NCP;?26%WNXkM3Ee>$1V<6F5xxB(&xT{O z@$8#VvXh)5DJMVtd=Gj(%opYRJvV-)t^$721NwY7GW0VUd8+d0nF7^+K~!^uiJVbh z^X*o1_Mu$sj0&((V<0}B(T>s|=^3rbQ8qOR>e>)@CX{i=_V0#tr@6M>fiGE_ewGUBBkxD_O!U*a6nj~MkVl!6!tvnF%bG5R9Jhs*U# z8@aDl2f5z=h)84BNm3GX@N>ajixQf^3g`j_ZVzTVJq_17e0h`rXwD?qNLmIyzi%Sh zugx9oGs+4SR`M~IFW{Z;xqQ*gwjD0tW@gz9&?H;HS`xkipIXJd#kbxsarpq> zj(@4khxnHJeJ)?X8&9}=(NyqD5n8v+EU^pCCVW%;Asn~i*NqP0+vblLv+3ZWgSQz=@8A{V`%%#JM*653(S|dD zPYBu2gy_u@b|t<}|0XcEPnfOXhXD9f0Bhvh522VVcinVk-=Tw*{{DeA{r&wYd9x@2 zv{HnpfF<&$vHb26z8{CcGH29eLtoamv-QYLO zAK1_qY!Tn~|5bC$wwVXaL*^6sMV9NKL;OX9Z<*cZJNVs#*P%(jgT~k|+IJYgV{j`p z@DB4NemUXS@k;^!Wd4_JH$OMuvr}w`ooc7y*9_jU)9noNl$~j3+1cigZKs`MyX;(B zvh!@Woo^S|g?5o$jLEAd_`uGO?zVgEUc1lUVBc@|+XMEXJ!B8t z8{2O_xUau|Q@>s}54!7+yNYin^zo*3?z+CP?dF>fxf=&#^RV7;b}wxfc?|Y%78-HY_XhfvhJpU= z9pk(A?He5!T({okhDL<$!GVFbQ!d+m)A;)*ZoX;y;hT0H*>Tgp!xM0Gf?;5=zhl>t ziG2sgCwA?GG=m4*U0&?9pKr(ddYZXmmtGJ~-+~A4P;u(T=WlaJFc@ZT)(`&9T32 zK=E%IbkBzb?ht%9>u+5*Bu%z;OTXaXx@AP_Z{NOstN3Uuzp%t!c_xne>@@w e;mlZvex1*GxbrtoJ$jrs&)m9d6R-STzyAX;CUe;U literal 0 HcmV?d00001 diff --git a/copy2esphome/ulanzi-easy.yaml b/copy2esphome/ulanzi-easy.yaml index e3f4efe2..bd19214f 100644 --- a/copy2esphome/ulanzi-easy.yaml +++ b/copy2esphome/ulanzi-easy.yaml @@ -78,7 +78,7 @@ esp32: board: esp32dev font: - - file: EHMTXv2.ttf + - file: CalciumThinTall.ttf size: 16 id: default_font glyphs: | diff --git a/tests/CalciumThinTall.ttf b/tests/CalciumThinTall.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3923b1106623f092f580c9c7eee00f9f0e90258e GIT binary patch literal 28896 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 literal 0 HcmV?d00001 diff --git a/tests/EHMTXv2.ttf b/tests/EHMTXv2.ttf deleted file mode 100644 index 0709311300c50765061316d86f6e77660916bc87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12504 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 S|AjYr^RvUFSMbX3`Trl2*cZzH diff --git a/tests/ehtmxv2-special.yaml b/tests/ehtmxv2-special.yaml index e321eb5e..159eb1c0 100644 --- a/tests/ehtmxv2-special.yaml +++ b/tests/ehtmxv2-special.yaml @@ -53,7 +53,7 @@ esp8266: board: $board font: - - file: EHMTXv2.ttf + - file: CalciumThinTall.ttf size: 16 id: default_font glyphs: | @@ -128,6 +128,7 @@ ehmtxv2: rtl: true default_font_id: default_font special_font_id: default_font + default_font_yoffset: 8 icons: - id: error lameid: 40530 diff --git a/tests/ehtmxv2-template.yaml b/tests/ehtmxv2-template.yaml index 864fe931..ae6daee1 100644 --- a/tests/ehtmxv2-template.yaml +++ b/tests/ehtmxv2-template.yaml @@ -54,7 +54,7 @@ esp32: board: esp32dev font: - - file: EHMTXv2.ttf + - file: CalciumThinTall.ttf size: 16 id: default_font glyphs: | @@ -127,7 +127,9 @@ ehmtxv2: rtl: true boot_logo: "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,63519,63519,63519,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63519,0,0,0,0,2016,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,63488,0,63488,0,0,0,63519,0,0,0,0,2016,2016,0,0,0,65514,0,65514,0,0,0,31,0,0,0,64512,0,0,64512,0,63488,63488,0,63488,63488,0,0,63519,63519,63519,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,31,31,31,0,0,0,64512,64512,0,0,63488,63488,63488,63488,63488,0,0,63519,0,0,0,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,31,0,0,0,0,64512,64512,0,0,0,63488,63488,63488,0,0,0,63519,63519,63519,63519,0,2016,0,2016,0,65514,0,65514,0,65514,0,0,0,31,31,0,64512,0,0,64512,0,0,0,63488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]" default_font_id: default_font + default_font_yoffset: 8 special_font_id: default_font + special_font_yoffset: 8 icons: - id: error lameid: 40530 diff --git a/tests/ulanzi-easy.yaml b/tests/ulanzi-easy.yaml index 87321520..efd2b12b 100644 --- a/tests/ulanzi-easy.yaml +++ b/tests/ulanzi-easy.yaml @@ -75,7 +75,7 @@ esp32: board: esp32dev font: - - file: EHMTXv2.ttf + - file: CalciumThinTall.ttf size: 16 id: default_font glyphs: | @@ -230,7 +230,9 @@ ehmtxv2: date_format: "%d.%m." show_seconds: false default_font_id: default_font + default_font_yoffset: 8 special_font_id: default_font + special_font_yoffset: 8 icons: - id: error lameid: 40530 diff --git a/wiki-samples/type1.yaml b/wiki-samples/type1.yaml index b6e87ab6..925b5625 100644 --- a/wiki-samples/type1.yaml +++ b/wiki-samples/type1.yaml @@ -20,7 +20,7 @@ esp8266: board: d1_mini font: - - file: EHMTXv2.ttf + - file: CalciumThinTall.ttf id: default_font size: 16 glyphs: | @@ -95,8 +95,8 @@ ehmtxv2: icons2html: true default_font_id: default_font special_font_id: default_font - special_font_yoffset: 6 - default_font_yoffset: 6 + special_font_yoffset: 8 + default_font_yoffset: 8 icons: - id: xani lameid: 6075 From 30e51f8a5d955834e5001522e0c2edb0cb59d257 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Thu, 20 Jul 2023 20:37:13 +0200 Subject: [PATCH 15/22] wiki to guru --- wiki/gurumediationerror.md | 18 ++++++++++++++++++ wiki/home.md | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 wiki/gurumediationerror.md diff --git a/wiki/gurumediationerror.md b/wiki/gurumediationerror.md new file mode 100644 index 00000000..f83143ef --- /dev/null +++ b/wiki/gurumediationerror.md @@ -0,0 +1,18 @@ +# Introduction + +**Skill-level:** medium + +If you have got this error `Guru Meditation Error: Core 1 panic'ed (StoreProhibited). Exception was unhandled.` + +Try to reorder your components in the yaml file, this order works! + +```yaml +esphome: +.... +light: +... +display: +... +ehmtxv2: +... +``` \ No newline at end of file diff --git a/wiki/home.md b/wiki/home.md index 4893688d..fecc34e4 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -4,7 +4,7 @@ - [Display a timer on your ehmtxv2](display-timer) - [weather display](weather-display) -- [matrix used as "circle"](rotating-text.md) +- [matrix used as "circle"](rotating-text) ## Configuration @@ -15,6 +15,10 @@ - [time and date display](time-date-display) - [special clock and date display duration](special-clock-and-date-display-duration) +## Problems + +- [Boot loop and Guru mediation error](gurumediationerror) + ## Defective / Broken Ulanzi TC-001? - [Read this](broken-Ulanzi) From dc1f00696a76dac9d049dced86606c1f08dee641 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 21 Jul 2023 16:38:20 +0200 Subject: [PATCH 16/22] https://github.com/lubeda/EspHoMaTriXv2/pull/50 --- CHANGELOG.md | 4 ++++ README.md | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d0fb82a..ced76b30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,14 @@ ## 2023.7.0 +- added always_show_rl_indicators boolean +- added on_start_running trigger to allow for additional configuration when + matrix starts display - icontype rgb565 array as string - fixed scroll small text - remove EHMTXv2.ttf - introduced CalciumThinTall.ttf from @dbuezas [samples](https://github.com/lubeda/EspHoMaTriXv2/issues/63) +- fixed hold_screen [issue](https://github.com/lubeda/EspHoMaTriXv2/issues/58) ## 2023.6.5 diff --git a/README.md b/README.md index 8c407b97..75f2acf7 100644 --- a/README.md +++ b/README.md @@ -570,6 +570,8 @@ If defined you can use the services `display_boot_logo` and `display_version` to **icons2html** (optional, boolean): If true, generate the HTML-file (*filename*.html) to show all included icons.  (default = `false`) +**always_show_rl_indicators** (optional, boolean): If true, always show the r/l indicators on all screens. Default is to not show either on clock, date, full, and bitmap screens, left on icon, or if display gauge displayed. (default = `false`) + ***Example output:*** ![icon preview](./images/icons_preview.png) @@ -711,6 +713,10 @@ ehmtxv2:             - mode ``` +#### on_start_running + +The trigger ```on_start_running``` is triggered when the display starts. It is triggered when time sync is done, and initial clock / date / version screens are loaded. This is to allow you to customize the default screens (for instance set colours for the clock). + #### on_icon_error The trigger ```on_icon_error``` is triggered if you try to add a screen with a non defined icon. In lambda's you can use one local string variable: @@ -833,6 +839,8 @@ For example, if you have multiple icons named weather_sunny, weather_rain & weat |MODE_RAINBOW_TEXT|8| |MODE_RAINBOW_CLOCK| 9| |MODE_RAINBOW_DATE| 10| +|MODE_BITMAP_SCREEN| 11| +|MODE_BITMAP_SMALL| 12| **(D)** Service **display_on** / **display_off** @@ -877,7 +885,7 @@ binary_sensor: Service **hold_screen** -Displays the current screen for a configured amount (see **hold_time**) (default=30) seconds longer. +Displays the current screen for a configured amount (default=30) seconds longer. e.g., on the Ulanzi TC001 From bde2524358cc8b5279cb06faeab729d0dd30a99a Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 21 Jul 2023 16:38:41 +0200 Subject: [PATCH 17/22] https://github.com/lubeda/EspHoMaTriXv2/pull/50 --- components/ehmtxv2/EHMTX.cpp | 23 ++++++++++++++++++----- components/ehmtxv2/EHMTX.h | 13 ++++++++++--- components/ehmtxv2/__init__.py | 21 +++++++++++++++++++++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 890231b7..d1981cbb 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -11,7 +11,6 @@ namespace esphome this->display_lindicator = 0; this->display_alarm = 0; this->clock_time = 10; - this->hold_time = 10; this->icon_count = 0; this->hue_ = 0; this->text_color = Color(C_RED, C_GREEN, C_BLUE); @@ -421,6 +420,10 @@ namespace esphome this->clock_screen(14 * 24 * 60, this->clock_time, EHMTXv2_DEFAULT_CLOCK_FONT, C_RED, C_GREEN, C_BLUE); this->date_screen(14 * 24 * 60, (int)this->clock_time / 2, EHMTXv2_DEFAULT_CLOCK_FONT, C_RED, C_GREEN, C_BLUE); this->is_running = true; + for (auto *t : on_start_running_triggers_) + { + t->process(); + } } } else @@ -651,8 +654,7 @@ namespace esphome void EHMTX::hold_screen(int time) { - this->next_action_time += this->hold_time; - this->hold_time = time; + this->next_action_time = this->clock->now().timestamp + time; } void EHMTX::get_status() @@ -1148,19 +1150,30 @@ namespace esphome { this->draw_gauge(); } - if (this->queue[this->screen_pointer]->mode != MODE_CLOCK && this->queue[this->screen_pointer]->mode != MODE_DATE && this->queue[this->screen_pointer]->mode != MODE_FULL_SCREEN && this->queue[this->screen_pointer]->mode != MODE_BITMAP_SCREEN) - { + #ifndef EHMTXv2_ALWAYS_SHOW_RLINDICATORS + if (this->queue[this->screen_pointer]->mode != MODE_CLOCK && this->queue[this->screen_pointer]->mode != MODE_DATE && this->queue[this->screen_pointer]->mode != MODE_FULL_SCREEN && this->queue[this->screen_pointer]->mode != MODE_BITMAP_SCREEN) + { + #endif this->draw_rindicator(); + #ifndef EHMTXv2_ALWAYS_SHOW_RLINDICATORS if (this->queue[this->screen_pointer]->mode != MODE_ICON_SCREEN && this->queue[this->screen_pointer]->mode != MODE_RAINBOW_ICON && !this->display_gauge) { + #endif this->draw_lindicator(); + #ifndef EHMTXv2_ALWAYS_SHOW_RLINDICATORS } } + #endif this->draw_alarm(); } } + void EHMTXStartRunningTrigger::process() + { + this->trigger(); + } + void EHMTXNextScreenTrigger::process(std::string iconname, std::string text) { this->trigger(iconname, text); diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index 70ced0cd..535770b8 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -54,6 +54,7 @@ namespace esphome class EHMTXIconErrorTrigger; class EHMTXExpiredScreenTrigger; class EHMTXNextClockTrigger; + class EHMTXStartRunningTrigger; class EHMTX : public PollingComponent, public api::CustomAPIDevice { @@ -68,6 +69,7 @@ namespace esphome std::vector on_icon_error_triggers_; std::vector on_expired_screen_triggers_; std::vector on_next_clock_triggers_; + std::vector on_start_running_triggers_; std::vector on_add_screen_triggers_; EHMTX_queue *find_icon_queue_element(uint8_t icon); EHMTX_queue *find_free_queue_element(); @@ -109,7 +111,6 @@ namespace esphome esphome::time::RealTimeClock *clock; bool show_seconds; - uint16_t hold_time; // seconds display of screen_time to extend uint8_t icon_count; // max iconnumber -1 unsigned long last_scroll_time; @@ -137,7 +138,6 @@ namespace esphome void skip_screen(); void hold_screen(int t = 30); void set_display(addressable_light::AddressableLightDisplay *disp); - void set_hold_time(uint16_t t = 30); void set_clock_time(uint16_t t = 10); void set_show_day_of_week(bool b=true); void set_show_seconds(bool b=false); @@ -185,7 +185,7 @@ namespace esphome void add_on_icon_error_trigger(EHMTXIconErrorTrigger *t) { this->on_icon_error_triggers_.push_back(t); } void add_on_expired_screen_trigger(EHMTXExpiredScreenTrigger *t) { this->on_expired_screen_triggers_.push_back(t); } void add_on_next_clock_trigger(EHMTXNextClockTrigger *t) { this->on_next_clock_triggers_.push_back(t); } - + void add_on_start_running_trigger(EHMTXStartRunningTrigger *t) { this->on_start_running_triggers_.push_back(t); } #ifndef USE_ESP8266 #ifdef EHMTXv2_BOOTLOGO void display_boot_logo(); @@ -255,6 +255,13 @@ namespace esphome void process(std::string); }; + class EHMTXStartRunningTrigger : public Trigger<> + { + public: + explicit EHMTXStartRunningTrigger(EHMTX *parent) { parent->add_on_start_running_trigger(this); } + void process(); + }; + class EHMTXExpiredScreenTrigger : public Trigger { public: diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index da7b11bc..97660352 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -44,6 +44,10 @@ def rgb565_888(v565): EHMTX_ = ehmtx_ns.class_("EHMTX", cg.Component) Icons_ = ehmtx_ns.class_("EHMTX_Icon") +StartRunningTrigger = ehmtx_ns.class_( + "EHMTXStartRunningTrigger", automation.Trigger.template(cg.std_string) +) + NextScreenTrigger = ehmtx_ns.class_( "EHMTXNextScreenTrigger", automation.Trigger.template(cg.std_string) ) @@ -67,6 +71,7 @@ def rgb565_888(v565): CONF_URL = "url" CONF_FLAG = "flag" CONF_CLOCKINTERVAL = "clock_interval" +CONF_ALWAYS_SHOW_RLINDICATORS = "always_show_rl_indicators" CONF_TIMECOMPONENT = "time_component" CONF_LAMEID = "lameid" CONF_RGB565ARRAY = "str565" @@ -95,6 +100,7 @@ def rgb565_888(v565): CONF_PINGPONG = "pingpong" CONF_TIME_FORMAT = "time_format" CONF_DATE_FORMAT = "date_format" +CONF_ON_START_RUNNING = "on_start_running" CONF_ON_NEXT_SCREEN = "on_next_screen" CONF_ON_NEXT_CLOCK = "on_next_clock" CONF_ON_ICON_ERROR = "on_icon_error" @@ -149,6 +155,9 @@ def rgb565_888(v565): cv.Optional( CONF_TIME_FORMAT, default="%H:%M" ): cv.string, + cv.Optional( + CONF_ALWAYS_SHOW_RLINDICATORS, default=False + ): cv.boolean, cv.Optional( CONF_DATE_FORMAT, default="%d.%m." ): cv.string, @@ -201,6 +210,11 @@ def rgb565_888(v565): cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(NextClockTrigger), } ), + cv.Optional(CONF_ON_START_RUNNING): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(StartRunningTrigger), + } + ), cv.Optional(CONF_BOOTLOGO): cv.string, cv.Optional(CONF_ON_EXPIRED_SCREEN): automation.validate_automation( { @@ -403,6 +417,9 @@ def thumbnails(frames): cg.add(var.set_brightness(config[CONF_BRIGHTNESS])) + if config[CONF_ALWAYS_SHOW_RLINDICATORS]: + cg.add_define("EHMTXv2_ALWAYS_SHOW_RLINDICATORS") + 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]) @@ -454,4 +471,8 @@ def thumbnails(frames): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [(cg.std_string, "icon"), (cg.uint8 , "mode")] , conf) + for conf in config.get(CONF_ON_START_RUNNING, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [] , conf) + await cg.register_component(var, config) From bef3ecc1fa9a34af1af923d63d1bc7bb04765520 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 21 Jul 2023 16:42:34 +0200 Subject: [PATCH 18/22] changed fontnames to mateine --- CHANGELOG.md | 3 +-- README.md | 4 ++-- copy2esphome/ulanzi-easy.yaml | 2 +- tests/ehtmxv2-special.yaml | 2 +- tests/ehtmxv2-template.yaml | 2 +- tests/ulanzi-easy.yaml | 2 +- wiki-samples/type1.yaml | 2 +- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ced76b30..f00131ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,7 @@ matrix starts display - icontype rgb565 array as string - fixed scroll small text -- remove EHMTXv2.ttf -- introduced CalciumThinTall.ttf from @dbuezas [samples](https://github.com/lubeda/EspHoMaTriXv2/issues/63) +- introduced mateine.ttf and mateineThin.ttf from @dbuezas [samples](https://github.com/lubeda/EspHoMaTriXv2/issues/63) - fixed hold_screen [issue](https://github.com/lubeda/EspHoMaTriXv2/issues/58) ## 2023.6.5 diff --git a/README.md b/README.md index 75f2acf7..58c389c8 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ In easy mode you'll have a clock with auto brightness control and after step 3 y Copy these files from the source folder `copy2esphome`: - ulanzi-simple.yaml -- CalciumThinTall.ttf +- mateine.ttf to your esphome directory (usually /config/esphome). In your esphome dashboard, you will find a new device named `ulanzi-easy`. @@ -433,7 +433,7 @@ dbuezas has also contributed tow optimized fonts with umlauts for this kind of d ```yaml font: -  - file: CalciumThinTall.ttf +  - file: mateine.ttf     id: default_font     size: 16     glyphs:  | diff --git a/copy2esphome/ulanzi-easy.yaml b/copy2esphome/ulanzi-easy.yaml index bd19214f..9a81a669 100644 --- a/copy2esphome/ulanzi-easy.yaml +++ b/copy2esphome/ulanzi-easy.yaml @@ -78,7 +78,7 @@ esp32: board: esp32dev font: - - file: CalciumThinTall.ttf + - file: Cmateine.ttf size: 16 id: default_font glyphs: | diff --git a/tests/ehtmxv2-special.yaml b/tests/ehtmxv2-special.yaml index 159eb1c0..f5a55e8b 100644 --- a/tests/ehtmxv2-special.yaml +++ b/tests/ehtmxv2-special.yaml @@ -53,7 +53,7 @@ esp8266: board: $board font: - - file: CalciumThinTall.ttf + - file: mateine.ttf size: 16 id: default_font glyphs: | diff --git a/tests/ehtmxv2-template.yaml b/tests/ehtmxv2-template.yaml index ae6daee1..ac593393 100644 --- a/tests/ehtmxv2-template.yaml +++ b/tests/ehtmxv2-template.yaml @@ -54,7 +54,7 @@ esp32: board: esp32dev font: - - file: CalciumThinTall.ttf + - file: mateine.ttf size: 16 id: default_font glyphs: | diff --git a/tests/ulanzi-easy.yaml b/tests/ulanzi-easy.yaml index efd2b12b..07facd03 100644 --- a/tests/ulanzi-easy.yaml +++ b/tests/ulanzi-easy.yaml @@ -75,7 +75,7 @@ esp32: board: esp32dev font: - - file: CalciumThinTall.ttf + - file: mateine.ttf size: 16 id: default_font glyphs: | diff --git a/wiki-samples/type1.yaml b/wiki-samples/type1.yaml index 925b5625..dfea23f4 100644 --- a/wiki-samples/type1.yaml +++ b/wiki-samples/type1.yaml @@ -20,7 +20,7 @@ esp8266: board: d1_mini font: - - file: CalciumThinTall.ttf + - file: mateine.ttf id: default_font size: 16 glyphs: | From 74adc0ff410d04803c245a0da6c461184d43b0dd Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 21 Jul 2023 16:42:51 +0200 Subject: [PATCH 19/22] changed font names --- copy2esphome/{CalciumThinTall.ttf => mateine.ttf} | Bin .../{CalciumSuperThinTall.ttf => mateineThin.ttf} | Bin tests/{CalciumThinTall.ttf => mateine.ttf} | Bin 3 files changed, 0 insertions(+), 0 deletions(-) rename copy2esphome/{CalciumThinTall.ttf => mateine.ttf} (100%) rename copy2esphome/{CalciumSuperThinTall.ttf => mateineThin.ttf} (100%) rename tests/{CalciumThinTall.ttf => mateine.ttf} (100%) diff --git a/copy2esphome/CalciumThinTall.ttf b/copy2esphome/mateine.ttf similarity index 100% rename from copy2esphome/CalciumThinTall.ttf rename to copy2esphome/mateine.ttf diff --git a/copy2esphome/CalciumSuperThinTall.ttf b/copy2esphome/mateineThin.ttf similarity index 100% rename from copy2esphome/CalciumSuperThinTall.ttf rename to copy2esphome/mateineThin.ttf diff --git a/tests/CalciumThinTall.ttf b/tests/mateine.ttf similarity index 100% rename from tests/CalciumThinTall.ttf rename to tests/mateine.ttf From a82e7b42be11c84c99ac9e9a8f3376966a53fa9c Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 21 Jul 2023 17:34:49 +0200 Subject: [PATCH 20/22] clean up, wiki, docu --- README.md | 23 ++++++++++++++++++++++- components/ehmtxv2/EHMTX.cpp | 10 +--------- components/ehmtxv2/EHMTX.h | 5 ++--- components/ehmtxv2/EHMTX_queue.cpp | 4 ++-- copy2esphome/1pixel.gif | Bin 0 -> 42 bytes tests/1pixel.gif | Bin 0 -> 42 bytes tests/ehtmxv2-special.yaml | 9 ++++++++- tests/ehtmxv2-template.yaml | 11 +++++++++-- wiki/home.md | 1 + wiki/rotating-text.md | 2 +- wiki/startup-settings.md | 18 ++++++++++++++++++ 11 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 copy2esphome/1pixel.gif create mode 100644 tests/1pixel.gif create mode 100644 wiki/startup-settings.md diff --git a/README.md b/README.md index 58c389c8..718ea650 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,26 @@ ![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) [![Donate][donation-badge]][donation-url] +## Attention + +Some updates of esphome will interfere with EspHoMaTriXv2, like the update of esphome to 2023.7.0. It made a change to all YAML files neccessary. + +You have to add this to your YAML + +```yaml +image: + - file: 1pixel.gif + id: breaking20237 + +animation: + - file: 1pixel.gif + id: breaking20237 +``` + +You have also to copy the file 1pixel.gif from the copy2esphome folder to the directory with your yaml. + +Also there might be [breaking changes](#breaking-changes) due to a redesign of EspHoMaTriXv2. + ## Important information If you like this project, please donate a star on GitHub and consider [sponsoring](https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU) me! @@ -615,7 +635,6 @@ Numerous features are accessible with services from home assistant and lambdas t |`show_gauge"`|"percent", "r", "g", "b"|set the height of the gauge according to the percentage in the given color| |`show_alarm`|"r", "g", "b", "size"|shows the color with the given size in the upper-right corner| |`show_rindicator`|"r", "g", "b", "size"|shows the color with the given size in the lower-right corner| -|`set_clock_color`|"r", "g", "b"|set the default color for the clock/date display| |`set_today_color`|"r", "g", "b"|set the special color for today in the day of week line| |`set_weekday_color`|"r", "g", "b"|set the default color in the day of week line| |`del_screen`|"icon_name", “mode”|deletes the specified icon screen from the queue, the [mode](#modes) is a filter| @@ -1096,6 +1115,7 @@ sensor: ### 2023.7.0 - removed automatic boot logo display +- removed set_clock_color since clock_screen and date_screen will set color anyway ### 2023.6.3 @@ -1137,6 +1157,7 @@ THE SOFTWARE IS PROVIDED “AS IS”, use at your own risk! - **[blakadder](https://github.com/blakadder)** for his contribution (cleanup README.md, fixed sample) - **[dbuezas](https://github.com/dbuezas)** for his fonts [infos](https://github.com/lubeda/EspHoMaTriXv2/issues/63) +- **[jfurtner](https://github.com/jfurtner)** for his the on_start_running trigger and a new parameter - **[andrew-codechimp](https://github.com/andrew-codechimp)** for his contribution (display on/off & del_screen "*" & show_clock with 0) and improved blueprint slelection - **[jd1](https://github.com/jd1)** for his contributions - **[aptonline](https://github.com/aptonline)** for his work on the Ulanzi hardware diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index d1981cbb..8972e28d 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -16,7 +16,6 @@ namespace esphome this->text_color = Color(C_RED, C_GREEN, C_BLUE); this->today_color = Color(C_RED, C_GREEN, C_BLUE); this->weekday_color = Color(CD_RED, CD_GREEN, CD_BLUE); - this->clock_color = Color(C_RED, C_GREEN, C_BLUE); this->rainbow_color = Color(CA_RED, CA_GREEN, CA_BLUE); this->alarm_color = Color(CA_RED, CA_GREEN, CA_BLUE); this->next_action_time = 0; @@ -95,12 +94,6 @@ namespace esphome ESP_LOGD(TAG, "default weekday color: %d g: %d b: %d", r, g, b); } - void EHMTX::set_clock_color(int r, int g, int b) - { - this->clock_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); - ESP_LOGD(TAG, "default clock color r: %d g: %d b: %d", r, g, b); - } - bool EHMTX::string_has_ending(std::string const &fullString, std::string const &ending) { if (fullString.length() >= ending.length()) @@ -328,7 +321,6 @@ namespace esphome register_service(&EHMTX::show_rindicator, "show_rindicator", {"r", "g", "b", "size"}); register_service(&EHMTX::show_lindicator, "show_lindicator", {"r", "g", "b", "size"}); - register_service(&EHMTX::set_clock_color, "set_clock_color", {"r", "g", "b"}); register_service(&EHMTX::set_today_color, "set_today_color", {"r", "g", "b"}); register_service(&EHMTX::set_weekday_color, "set_weekday_color", {"r", "g", "b"}); @@ -422,6 +414,7 @@ namespace esphome this->is_running = true; for (auto *t : on_start_running_triggers_) { + ESP_LOGD(TAG, "on_start_running_triggers"); t->process(); } } @@ -896,7 +889,6 @@ namespace esphome void EHMTX::clock_screen(int lifetime, int screen_time, bool default_font, int r, int g, int b) { EHMTX_queue *screen = this->find_free_queue_element(); - screen->text_color = Color(r, g, b); ESP_LOGD(TAG, "clock_screen_color lifetime: %d screen_time: %d red: %d green: %d blue: %d", lifetime, screen_time, r, g, b); screen->mode = MODE_CLOCK; diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index 535770b8..af4a15f8 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -81,7 +81,7 @@ namespace esphome uint16_t hue_ = 0; void dump_config(); #ifdef USE_ESP32 - PROGMEM Color text_color, alarm_color, rindicator_color, lindicator_color,clock_color, today_color, weekday_color, rainbow_color; + PROGMEM Color text_color, alarm_color, rindicator_color, lindicator_color, today_color, weekday_color, rainbow_color; PROGMEM Color bitmap[256]; PROGMEM Color sbitmap[64]; PROGMEM Color cgauge[8]; @@ -89,7 +89,7 @@ namespace esphome #endif #ifdef USE_ESP8266 - Color text_color, alarm_color, gauge_color, gauge_bgcolor,rindicator_color,lindicator_color, clock_color, today_color, weekday_color, rainbow_color; + Color text_color, alarm_color, gauge_color, gauge_bgcolor,rindicator_color,lindicator_color, today_color, weekday_color, rainbow_color; EHMTX_Icon *icons[MAXICONS]; uint8_t gauge_value; #endif @@ -150,7 +150,6 @@ namespace esphome 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_clock_color(int r = C_RED, int g = C_GREEN, int b = C_BLUE); void set_today_color(int r, int g, int b); void set_weekday_color(int r, int g, int b); void show_alarm(int r = CA_RED, int g = CA_GREEN, int b = CA_BLUE, int s = 2); diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index d920f252..d250f05e 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -206,7 +206,7 @@ namespace esphome case MODE_CLOCK: if (this->config_->clock->now().is_valid()) // valid time { - color_ = (this->mode == MODE_RAINBOW_CLOCK) ? this->config_->rainbow_color : this->config_->clock_color; + 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()); @@ -228,7 +228,7 @@ namespace esphome case MODE_DATE: if (this->config_->clock->now().is_valid()) { - color_ = (this->mode == MODE_RAINBOW_DATE) ? this->config_->rainbow_color : this->config_->clock_color; + 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()); diff --git a/copy2esphome/1pixel.gif b/copy2esphome/1pixel.gif new file mode 100644 index 0000000000000000000000000000000000000000..f191b280ce91e6cb8c387735c10ef9bc5da6c83b GIT binary patch literal 42 ocmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl(S^Yp0J!f4_W%F@ literal 0 HcmV?d00001 diff --git a/tests/1pixel.gif b/tests/1pixel.gif new file mode 100644 index 0000000000000000000000000000000000000000..f191b280ce91e6cb8c387735c10ef9bc5da6c83b GIT binary patch literal 42 ocmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl(S^Yp0J!f4_W%F@ literal 0 HcmV?d00001 diff --git a/tests/ehtmxv2-special.yaml b/tests/ehtmxv2-special.yaml index f5a55e8b..443a4d29 100644 --- a/tests/ehtmxv2-special.yaml +++ b/tests/ehtmxv2-special.yaml @@ -10,6 +10,14 @@ external_components: path: ../components components: [ ehmtxv2 ] +animation: + - id: animation_black + file: 1pixel.gif + +image: + - id: image_black + file: 1pixel.gif + esphome: comment: "EHMTXv2 TEXT from LuBeDa 8266" name: $devicename @@ -33,7 +41,6 @@ esphome: id(rgb8x32)->hold_screen(); id(rgb8x32)->show_gauge(100,0,200); id(rgb8x32)->hide_gauge(); - id(rgb8x32)->set_clock_color(200,100,50); id(rgb8x32)->set_today_color(200,100,50); id(rgb8x32)->set_weekday_color(200,100,50); id(rgb8x32)->full_screen("scale"); diff --git a/tests/ehtmxv2-template.yaml b/tests/ehtmxv2-template.yaml index ac593393..5ad63216 100644 --- a/tests/ehtmxv2-template.yaml +++ b/tests/ehtmxv2-template.yaml @@ -3,7 +3,15 @@ substitutions: friendly_name: LED Matrix board: esp32dev matrix_pin: GPIO32 - + +animation: + - id: animation_black + file: 1pixel.gif + +image: + - id: image_black + file: 1pixel.gif + external_components: - source: type: local @@ -33,7 +41,6 @@ esphome: id(rgb8x32)->show_gauge(100,0,200); id(rgb8x32)->show_gauge(40,0,200,0,100,100,100); id(rgb8x32)->hide_gauge(); - id(rgb8x32)->set_clock_color(200,100,50); id(rgb8x32)->set_today_color(200,100,50); id(rgb8x32)->set_weekday_color(200,100,50); id(rgb8x32)->full_screen("scale"); diff --git a/wiki/home.md b/wiki/home.md index fecc34e4..f2cf4d79 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -14,6 +14,7 @@ - [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) ## Problems diff --git a/wiki/rotating-text.md b/wiki/rotating-text.md index 5434b710..b13e2bf5 100644 --- a/wiki/rotating-text.md +++ b/wiki/rotating-text.md @@ -13,7 +13,7 @@ ehmtxv2: ... ``` -to display text thas is scrolled arounf the display even if it is short and normally should be centered. +to display text thas is scrolled around the display even if it is short and normally should be centered. To display time you can use this automation: diff --git a/wiki/startup-settings.md b/wiki/startup-settings.md new file mode 100644 index 00000000..a6a901cd --- /dev/null +++ b/wiki/startup-settings.md @@ -0,0 +1,18 @@ +# Introduction + +**Skill-level:** medium + +## Set parameters on device boot + +Since 2023.7.0 you can use a trigger with lambdas + +```yaml +ehmtxv2: + ... + on_start_running: + then: + lambda: |- + ESP_LOGD(TAG, "remove default clock and set new color"); + id(rgb8x32)->del_screen("*", 2); + id(rgb8x32)->clock_screen(10,10,true,200,10,100); +``` \ No newline at end of file From 4c475e542fdb972259935421ac9ca6abc965903f Mon Sep 17 00:00:00 2001 From: David Buezas Date: Fri, 21 Jul 2023 17:41:23 +0200 Subject: [PATCH 21/22] Update font name in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 718ea650..d2f3f988 100644 --- a/README.md +++ b/README.md @@ -449,7 +449,7 @@ You can configure two fonts if you like. Trip5 is also providing special fonts for 8x32 matrices in his [repo](https://github.com/trip5/MatrixClockFonts) -dbuezas has also contributed tow optimized fonts with umlauts for this kind of display CalciumThinTall.ttf and CalciumSuperThinTall.ttf. They are included in the copy2esphome folder +dbuezas has also contributed tow optimized fonts with umlauts for this kind of display `mateine.ttf` and `mateineThin.ttf`. They are included in the copy2esphome folder ```yaml font: From 221eb850003a2f42031240af572e0a7cb50f3315 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Fri, 21 Jul 2023 17:43:04 +0200 Subject: [PATCH 22/22] test --- tests/ulanzi-easy.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/ulanzi-easy.yaml b/tests/ulanzi-easy.yaml index 07facd03..7d54dfac 100644 --- a/tests/ulanzi-easy.yaml +++ b/tests/ulanzi-easy.yaml @@ -13,6 +13,14 @@ substitutions: scl_pin: GPIO22 sda_pin: GPIO21 +animation: + - id: animation_black + file: 1pixel.gif + +image: + - id: image_black + file: 1pixel.gif + switch: - platform: template name: "Auto-Adjust Brightness"