From 1a9e5d2cf1f51d9d2592747657e9796670404c1f Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 12:28:02 +0200 Subject: [PATCH 01/15] blueprints --- copy2esphome/EHMTX_extended_state.yaml | 6 +++--- wiki/blueprints.md | 10 ++++++++++ wiki/use-icons-in-blueprints.md | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 wiki/blueprints.md diff --git a/copy2esphome/EHMTX_extended_state.yaml b/copy2esphome/EHMTX_extended_state.yaml index 8a1215f1..a47d7a3c 100644 --- a/copy2esphome/EHMTX_extended_state.yaml +++ b/copy2esphome/EHMTX_extended_state.yaml @@ -50,7 +50,7 @@ blueprint: default: 12 icon_name: name: The icon associated to this state screen? - description: If you use additional icons in your YAML, you have to add them to this blueprint. + description: If you use additional icons in your YAML, you have to add them to this blueprint. Valid only if icon is chosen. selector: select: mode: dropdown @@ -141,7 +141,7 @@ action: {{ def_color[2] }} else: - service: |- - esphome.{{ device_attr(display, "name") }}_rainbow_icon + esphome.{{ device_attr(display, "name") }}_rainbow_icon_screen data: icon_name: !input icon_name screen_time: !input screen_time @@ -170,7 +170,7 @@ action: {{ def_color[2] }} else: - service: |- - esphome.{{ device_attr(display, "name") }}_rainbow_text + esphome.{{ device_attr(display, "name") }}_rainbow_text_screen data: screen_time: !input screen_time lifetime: !input lifetime diff --git a/wiki/blueprints.md b/wiki/blueprints.md new file mode 100644 index 00000000..b765d8f6 --- /dev/null +++ b/wiki/blueprints.md @@ -0,0 +1,10 @@ +# introduction + +**Skill-level:** advanced + +This component provides some blueprints. Because there are so many options and parameters it is sometimes hard to create manuall automations. + +## EHMTX_extended_state.yaml + +With this blueprint you can easily react on state changes of a sensor. + diff --git a/wiki/use-icons-in-blueprints.md b/wiki/use-icons-in-blueprints.md index 5e3dfc2a..a9d0272a 100644 --- a/wiki/use-icons-in-blueprints.md +++ b/wiki/use-icons-in-blueprints.md @@ -1,3 +1,7 @@ +P/1.1 200 OK" +2023-06-04 12:08:17.772 ERROR (MainThread) [homeassistant.components.automation] Failed to generate automation from blueprint: Invalid blueprint: Only one type can be specified. Found select, default for dictionary value @ data['blueprint']['input']['icon_name']['selector']. Got {'select': {'mode': 'dropdown', 'options': ['error', 'github', 'precipitation', 'nina', 'waschmaschine', 'lamp', 'headphone', 'print3d', 'internet', 'speaker', 'alien', 'temp', 'garage', 'door', 'wind', 'rain', 'phone', 'fire', 'tv', 'frost', 'muell', 'cookit', 'nature', 'work', 'bike', 'amazon', 'post', 'power', 'solar', 'yoga', 'startrek', 'energy', 'sun', 'diesel', 'benzine10', 'vacuum', 'rainprecip', 'iss', 'thunder', 'nina_warning', 'mic', 'birthday', 'firework', 'coffee', 'lightning', '... +2023-06-04 12:08:17.772 ERROR (MainThread) [homeassistant.components.automation] Failed to generate automation from blueprint: Failed to load blueprint: Unable to find lubeda/EHMTX_extended_state.yaml + # introduction **Skill-level:** advanced From 8d8b19d3a696c5fe34558551075c6a5b79068502 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 12:41:58 +0200 Subject: [PATCH 02/15] wiki --- wiki/use-icons-in-blueprints.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/wiki/use-icons-in-blueprints.md b/wiki/use-icons-in-blueprints.md index a9d0272a..6516fd6c 100644 --- a/wiki/use-icons-in-blueprints.md +++ b/wiki/use-icons-in-blueprints.md @@ -65,6 +65,38 @@ Take care that the indentation is correct Save the changed file and reload your automations +## step 4 + +After checking if it is working, repeat the procedure for all blueprints using the icon dropdown + +## sample for manual automation + +this automation example display states with icons and a rainbow colored text for state changes of multiple icons. +The icon is selected by the `trigger.id`, the text is dynamicaly build by the triggered state. + +```yaml +alias: EHMTX State display +trigger: + - platform: state + entity_id: sensor.001cac04_wind_speed + id: wind + - platform: state + entity_id: sensor.tankerkoenig_super + id: supere10 +condition: [] +action: + - service: esphome.ulanzi_rainbow_icon_screen + data: + icon_name: "{{trigger.id}}" + screen_time: 12 + lifetime: 2 + text: '{{trigger.to_state.attributes.friendly_name}}: {{trigger.to_state.state}} + {{trigger.to_state.attributes.unit_of_measurement}}|replace ("€","¼")| replace ("°C","¬")|replace ("℃","¬")| replace ("°F","¯")|replace ("℉","¯")|replace ("₴","¾")|replace ("₿","¨")|replace ("₩","½")|replace ("Ξ","¸")' + default_font: true +mode: parallel +max: 2 +``` + ## warnings - If you remove icons from your list, old automations will probably use these icons, resulting in displaying the default icon! From 7397fb5808473c92807c51577a264880c9369455 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 12:46:07 +0200 Subject: [PATCH 03/15] wiki --- wiki/blueprint-extended-dialog.png | Bin 0 -> 85950 bytes wiki/blueprints.md | 1 + 2 files changed, 1 insertion(+) create mode 100644 wiki/blueprint-extended-dialog.png diff --git a/wiki/blueprint-extended-dialog.png b/wiki/blueprint-extended-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..b515610ae6b6b873b352bf606ef3c7d5de853c12 GIT binary patch literal 85950 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 z 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 W%7Mj{$y@r@>metlELkBA3iuxu?bHYW literal 0 HcmV?d00001 diff --git a/wiki/blueprints.md b/wiki/blueprints.md index b765d8f6..7e0cbe50 100644 --- a/wiki/blueprints.md +++ b/wiki/blueprints.md @@ -8,3 +8,4 @@ This component provides some blueprints. Because there are so many options and p With this blueprint you can easily react on state changes of a sensor. +![screenshot](https://github.com/lubeda/EspHoMaTriXv2/blob/develop/wiki/blueprint-extended-dialog.png?raw=true) \ No newline at end of file From f6360ba29d5d154abd9ffe61909d971db2052a82 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 12:47:05 +0200 Subject: [PATCH 04/15] wiki --- wiki/blueprints.md | 2 +- wiki/home.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/wiki/blueprints.md b/wiki/blueprints.md index 7e0cbe50..accdada2 100644 --- a/wiki/blueprints.md +++ b/wiki/blueprints.md @@ -1,6 +1,6 @@ # introduction -**Skill-level:** advanced +**Skill-level:** medium to advanced This component provides some blueprints. Because there are so many options and parameters it is sometimes hard to create manuall automations. diff --git a/wiki/home.md b/wiki/home.md index d7b8e970..2df83b8f 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -9,3 +9,4 @@ - [Ulanzi upside-down](rotate-ULANZI-display-180-degrees) - [Use all icons in your blueprint](use-icons-in-blueprints) +- [Blueprints for easier configuration](blueprints) From 22c0a3c04953423b124bb2db40e85c90e8fed56b Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 12:47:44 +0200 Subject: [PATCH 05/15] wiki --- wiki/blueprints.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wiki/blueprints.md b/wiki/blueprints.md index accdada2..aebcb21e 100644 --- a/wiki/blueprints.md +++ b/wiki/blueprints.md @@ -8,4 +8,6 @@ This component provides some blueprints. Because there are so many options and p With this blueprint you can easily react on state changes of a sensor. -![screenshot](https://github.com/lubeda/EspHoMaTriXv2/blob/develop/wiki/blueprint-extended-dialog.png?raw=true) \ No newline at end of file +![screenshot](https://github.com/lubeda/EspHoMaTriXv2/blob/develop/wiki/blueprint-extended-dialog.png?raw=true) + +## Bonus! They are free From 78a9ec3203ee649e31c2848a622bf52cad28214f Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 19:01:48 +0200 Subject: [PATCH 06/15] default_clock_font --- CHANGELOG.md | 1 + components/ehmtxv2/EHMTX.cpp | 4 ++-- components/ehmtxv2/__init__.py | 9 +++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25d23fd1..13d0d2e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2023.6.2 - set rtl mode at compile time +- changed clock to default font ## 2023.6.1 diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 239668fb..5fd54eed 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -352,8 +352,8 @@ namespace esphome this->bitmap_screen(EHMTX_LOGO, 1, 10); this->bitmap_small(EHMTX_SLOGO, EHMTX_VERSION, 1, 10); #endif - this->clock_screen(14 * 24 * 60, this->clock_time, true, C_RED, C_GREEN, C_BLUE); - this->date_screen(14 * 24 * 60, (int)this->clock_time / 2, true, C_RED, C_GREEN, C_BLUE); + 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; } } diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index c62012b3..eca1bac8 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -77,6 +77,7 @@ def rgb565_svg(x,y,r,g,b): CONF_FRAMEINTERVAL = "frame_interval" CONF_DEFAULT_FONT_ID = "default_font_id" CONF_DEFAULT_FONT = "default_font" +CONF_CLOCKFONT = "default_clock_font" CONF_DEFAULT_FONT_XOFFSET = "default_font_xoffset" CONF_DEFAULT_FONT_YOFFSET = "default_font_yoffset" CONF_SPECIAL_FONT_ID = "special_font_id" @@ -106,6 +107,9 @@ def rgb565_svg(x,y,r,g,b): ): cv.templatable(cv.positive_int), cv.Optional( CONF_HTML, default=False + ): cv.boolean, + cv.Optional( + CONF_CLOCKFONT, default=True ): cv.boolean, cv.Optional( CONF_RTL, default=False @@ -365,6 +369,7 @@ def thumbnails(frames): cg.add(var.set_brightness(config[CONF_BRIGHTNESS])) cg.add(var.set_scroll_interval(config[CONF_SCROLLINTERVAL])) + cg.add_define("EHMTXv2_SCROLL_INTERVALL",config[CONF_SCROLLINTERVAL]) cg.add(var.set_rainbow_interval(config[CONF_SCROLLINTERVAL])) if config[CONF_RTL]: cg.add(var.set_rtl(config[CONF_RTL])) @@ -373,6 +378,10 @@ def thumbnails(frames): cg.add(var.set_frame_interval(config[CONF_FRAMEINTERVAL])) cg.add(var.set_week_start(config[CONF_WEEK_START_MONDAY])) cg.add(var.set_clock_interval(config[CONF_CLOCKINTERVAL])) + if config[CONF_CLOCKFONT]: + cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT","true") + else: + cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT","false") cg.add(var.set_time_format(config[CONF_TIME_FORMAT])) cg.add(var.set_date_format(config[CONF_DATE_FORMAT])) cg.add(var.set_show_day_of_week(config[CONF_SHOWDOW])) From cb36db4a94fad9b81e4c8deefac876cfd897dc12 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 19:26:28 +0200 Subject: [PATCH 07/15] preparing 2023.6.3 --- CHANGELOG.md | 7 ++++++ README.md | 5 ++-- components/ehmtxv2/EHMTX.cpp | 40 ++++++------------------------ components/ehmtxv2/EHMTX.h | 12 +-------- components/ehmtxv2/EHMTX_queue.cpp | 10 ++++---- components/ehmtxv2/__init__.py | 18 ++++++++------ 6 files changed, 33 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13d0d2e8..887643e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 2023.6.3 + +- introduced `default_clock_font: true` +- changed *_interval to be set only on compile time +- change scroll_count to be set only on compile time +- remove unused frame_interval + ## 2023.6.2 - set rtl mode at compile time diff --git a/README.md b/README.md index c1520ffa..2a30099c 100644 --- a/README.md +++ b/README.md @@ -504,7 +504,6 @@ ehmtxv2:   scroll_count: 2 # scroll long text at least two times   scroll_interval: 80 # milliseconds   rainbow_interval: 32 # milliseconds -  frame_interval: 192 # milliseconds   icons:   ..... ``` @@ -543,9 +542,9 @@ ehmtxv2: **week_start_monday** (optional, bool): default Monday is first day of week, false => Sunday -**scroll_interval** (optional, ms): the interval in ms to scroll the text (default=80), should be a multiple of the ```update_interval``` of the [display](https://esphome.io/components/display/addressable_light.html) +**default_clock_font** (optional, boolean): If true, use the default font for clock and date otherwise use the special font. (default = `true`) -**frame_interval** (optional, ms): the interval in ms to display the next animation/icon frame (default = 192), should be a multiple of the [display](https://esphome.io/components/display/addressable_light.html). It can be overwritten per icon/GIF, see [icons](#icons-and-animations) parameter `frame_duration` +**scroll_interval** (optional, ms): the interval in ms to scroll the text (default=80), should be a multiple of the ```update_interval``` of the [display](https://esphome.io/components/display/addressable_light.html) **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) diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index 5fd54eed..d51fdf04 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->clock_interval = 90; this->hold_time = 10; this->icon_count = 0; this->hue_ = 0; @@ -409,14 +408,14 @@ namespace esphome uint8_t EHMTX::find_last_clock() { uint8_t hit = MAXQUEUE; - if (this->clock_interval > 0) + if (EHMTXv2_CLOCK_INTERVALL > 0) { time_t ts = this->clock->now().timestamp; for (size_t i = 0; i < MAXQUEUE; i++) { if ((this->queue[i]->mode == MODE_CLOCK) || (this->queue[i]->mode == MODE_RAINBOW_CLOCK)) { - if (ts > (this->queue[i]->last_time + this->clock_interval)) + if (ts > (this->queue[i]->last_time + EHMTXv2_CLOCK_INTERVALL)) { hit = i; } @@ -501,7 +500,7 @@ namespace esphome { time_t ts = this->clock->now().timestamp; - if (millis() - this->last_scroll_time >= this->scroll_interval) + if (millis() - this->last_scroll_time >= EHMTXv2_SCROLL_INTERVALL) { this->scroll_step++; this->last_scroll_time = millis(); @@ -621,21 +620,6 @@ namespace esphome this->special_font = font; } - void EHMTX::set_frame_interval(uint16_t fi) - { - this->frame_interval = fi; - } - - void EHMTX::set_scroll_interval(uint16_t si) - { - this->scroll_interval = si; - } - - void EHMTX::set_rainbow_interval(uint16_t si) - { - this->rainbow_interval = si; - } - void EHMTX::del_screen(std::string icon_name, int mode) { for (uint8_t i = 0; i < MAXQUEUE; i++) @@ -665,11 +649,6 @@ namespace esphome } } - void EHMTX::set_clock_interval(uint16_t t) - { - this->clock_interval = t; - } - void EHMTX::icon_screen(std::string iconname, std::string text, int lifetime, int screen_time, bool default_font, int r, int g, int b) { uint8_t icon = this->find_icon(iconname.c_str()); @@ -739,13 +718,13 @@ namespace esphome ESP_LOGD(TAG, "rainbow_clock_screen lifetime: %d screen_time: %d", lifetime, screen_time); screen->mode = MODE_RAINBOW_CLOCK; screen->default_font = default_font; - if (this->clock_interval == 0 || (this->clock_interval > screen_time)) + if (EHMTXv2_CLOCK_INTERVALL == 0 || (EHMTXv2_CLOCK_INTERVALL > screen_time)) { screen->screen_time_ = screen_time; } else { - screen->screen_time_ = this->clock_interval - 2; + screen->screen_time_ = EHMTXv2_CLOCK_INTERVALL - 2; } screen->endtime = this->clock->now().timestamp + lifetime * 60; screen->status(); @@ -967,11 +946,6 @@ namespace esphome this->clock_time = t; } - void EHMTX::set_scroll_count(uint8_t c) - { - this->scroll_count = c; - } - void EHMTX::set_display(addressable_light::AddressableLightDisplay *disp) { this->display = disp; @@ -1023,10 +997,10 @@ namespace esphome { ESP_LOGCONFIG(TAG, "EspHoMatriXv2 version: %s", EHMTX_VERSION); ESP_LOGCONFIG(TAG, "Icons: %d of %d", this->icon_count, MAXICONS); - ESP_LOGCONFIG(TAG, "Clock interval: %d s", this->clock_interval); + ESP_LOGCONFIG(TAG, "Clock interval: %d s", EHMTXv2_CLOCK_INTERVALL); ESP_LOGCONFIG(TAG, "Date format: %s", this->date_fmt.c_str()); ESP_LOGCONFIG(TAG, "Time format: %s", this->time_fmt.c_str()); - ESP_LOGCONFIG(TAG, "Interval (ms) scroll: %d frame: %d", this->scroll_interval, this->frame_interval); + ESP_LOGCONFIG(TAG, "Interval (ms) scroll: %d", EHMTXv2_SCROLL_INTERVALL); if (this->show_day_of_week) { ESP_LOGCONFIG(TAG, "show day of week"); diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index 4d0e5c40..4b5d94c0 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -22,7 +22,7 @@ const uint8_t TEXTSCROLLSTART = 8; const uint8_t TEXTSTARTOFFSET = (32 - 8); const uint16_t POLLINGINTERVAL = 250; -static const char *const EHMTX_VERSION = "2023.6.2"; +static const char *const EHMTX_VERSION = "2023.6.3"; 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]"; @@ -108,7 +108,6 @@ namespace esphome uint8_t gauge_value; uint16_t clock_time; uint16_t scroll_step; - uint8_t scroll_count; EHMTX_queue *queue[MAXQUEUE]; addressable_light::AddressableLightDisplay *display; @@ -117,10 +116,6 @@ namespace esphome int8_t default_yoffset, default_xoffset; int8_t special_yoffset, special_xoffset; bool show_seconds; - uint16_t scroll_interval; // ms to between scrollsteps - uint16_t rainbow_interval; // ms to between scrollsteps - uint16_t frame_interval; // ms to next_frame() - uint16_t clock_interval; uint16_t hold_time; // seconds display of screen_time to extend uint8_t icon_count; // max iconnumber -1 @@ -147,7 +142,6 @@ namespace esphome void skip_screen(); void hold_screen(int t = 30); void set_display(addressable_light::AddressableLightDisplay *disp); - void set_clock_interval(uint16_t t = 90); 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); @@ -166,10 +160,6 @@ namespace esphome void set_clock(time::RealTimeClock *clock); void set_default_font(display::Font *font); void set_special_font(display::Font *font); - void set_frame_interval(uint16_t interval); - void set_scroll_interval(uint16_t interval); - void set_rainbow_interval(uint16_t interval); - void set_scroll_count(uint8_t count); void set_time_format(std::string s); void set_date_format(std::string s); void show_rindicator(int r = C_RED, int g = C_GREEN, int b = C_BLUE, int s = 3); diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index 42cedea1..34980f2d 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -120,7 +120,7 @@ namespace esphome void EHMTX_queue::update_screen() { - if (millis() - this->config_->last_rainbow_time >= this->config_->rainbow_interval) + if (millis() - this->config_->last_rainbow_time >= EHMTXv2_RAINBOW_INTERVALL) { this->config_->hue_++; if (this->config_->hue_ == 360) @@ -341,8 +341,8 @@ namespace esphome } else { - max_steps = (this->config_->scroll_count + 1) * (width - startx) + this->config_->scroll_count * this->pixels_; - display_duration = ceil((max_steps * this->config_->scroll_interval) / 1000); + max_steps = (EHMTXv2_SCROLL_COUNT + 1) * (width - startx) + EHMTXv2_SCROLL_COUNT * this->pixels_; + display_duration = ceil((max_steps * EHMTXv2_SCROLL_INTERVALL) / 1000); this->screen_time_ = (display_duration > screen_time) ? display_duration : screen_time; } break; @@ -357,8 +357,8 @@ namespace esphome } else { - max_steps = (this->config_->scroll_count + 1) * (width - startx) + this->config_->scroll_count * this->pixels_; - display_duration = ceil((max_steps * this->config_->scroll_interval) / 1000); + max_steps = (EHMTXv2_SCROLL_COUNT + 1) * (width - startx) + EHMTXv2_SCROLL_COUNT * this->pixels_; + display_duration = ceil((max_steps * EHMTXv2_SCROLL_INTERVALL) / 1000); this->screen_time_ = (display_duration > screen_time) ? display_duration : screen_time; } break; diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index eca1bac8..5229522d 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -368,20 +368,24 @@ def thumbnails(frames): cg.add(var.set_special_font(f)) cg.add(var.set_brightness(config[CONF_BRIGHTNESS])) - cg.add(var.set_scroll_interval(config[CONF_SCROLLINTERVAL])) - cg.add_define("EHMTXv2_SCROLL_INTERVALL",config[CONF_SCROLLINTERVAL]) - cg.add(var.set_rainbow_interval(config[CONF_SCROLLINTERVAL])) + + 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]) + cg.add_define("EHMTXv2_CLOCK_INTERVALL",config[CONF_CLOCKINTERVAL]) + cg.add_define("EHMTXv2_SCROLL_COUNT",config[CONF_SCROLLCOUNT]) + if config[CONF_RTL]: cg.add(var.set_rtl(config[CONF_RTL])) cg.add_define("EHMTXv2_USE_RTL") - cg.add(var.set_scroll_count(config[CONF_SCROLLCOUNT])) - cg.add(var.set_frame_interval(config[CONF_FRAMEINTERVAL])) - cg.add(var.set_week_start(config[CONF_WEEK_START_MONDAY])) - cg.add(var.set_clock_interval(config[CONF_CLOCKINTERVAL])) + if config[CONF_CLOCKFONT]: cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT","true") else: cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT","false") + + + cg.add(var.set_week_start(config[CONF_WEEK_START_MONDAY])) cg.add(var.set_time_format(config[CONF_TIME_FORMAT])) cg.add(var.set_date_format(config[CONF_DATE_FORMAT])) cg.add(var.set_show_day_of_week(config[CONF_SHOWDOW])) From 815f5aa00baa9ff134c9cbfdd42a223103f65ab6 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 4 Jun 2023 19:46:51 +0200 Subject: [PATCH 08/15] changed all "static" parameters to compile time --- CHANGELOG.md | 2 + components/ehmtxv2/EHMTX.cpp | 62 ++++-------------------------- components/ehmtxv2/EHMTX.h | 19 --------- components/ehmtxv2/EHMTX_queue.cpp | 8 ++-- components/ehmtxv2/__init__.py | 23 +++++------ 5 files changed, 23 insertions(+), 91 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 887643e8..a23d9d33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - introduced `default_clock_font: true` - changed *_interval to be set only on compile time - change scroll_count to be set only on compile time +- change font_offsets to be set only on compile time +- change date/time_format to be set only on compile time - remove unused frame_interval ## 2023.6.2 diff --git a/components/ehmtxv2/EHMTX.cpp b/components/ehmtxv2/EHMTX.cpp index d51fdf04..4143b35f 100644 --- a/components/ehmtxv2/EHMTX.cpp +++ b/components/ehmtxv2/EHMTX.cpp @@ -34,16 +34,6 @@ namespace esphome ESP_LOGD(TAG, "Constructor finish"); } - void EHMTX::set_time_format(std::string s) - { - this->time_fmt = s; - } - - void EHMTX::set_date_format(std::string s) - { - this->date_fmt = s; - } - void EHMTX::show_rindicator(int r, int g, int b, int size) { if (size > 0) @@ -581,8 +571,8 @@ namespace esphome this->clock->now().month, this->clock->now().year, this->clock->now().hour, this->clock->now().minute); ESP_LOGI(TAG, "status brightness: %d (0..255)", this->brightness_); - ESP_LOGI(TAG, "status date format: %s", this->date_fmt.c_str()); - ESP_LOGI(TAG, "status time format: %s", this->time_fmt.c_str()); + ESP_LOGI(TAG, "status date format: %s", EHMTXv2_DATE_FORMAT); + ESP_LOGI(TAG, "status time format: %s", EHMTXv2_TIME_FORMAT); ESP_LOGI(TAG, "status alarm_color: RGB(%d,%d,%d)", this->alarm_color.r, this->alarm_color.g, this->alarm_color.b); if (this->show_display) { @@ -875,17 +865,6 @@ namespace esphome } } -#ifdef EHMTXv2_USE_RTL - void EHMTX::set_rtl(bool b) - { - this->rtl = b; - if (b) - { - ESP_LOGI(TAG, "show text right to left"); - } - } -#endif - void EHMTX::set_show_seconds(bool b) { this->show_seconds = b; @@ -912,19 +891,6 @@ namespace esphome } } - void EHMTX::set_week_start(bool b) - { - this->week_starts_monday = b; - if (b) - { - ESP_LOGI(TAG, "weekstart: monday"); - } - else - { - ESP_LOGI(TAG, "weekstart: sunday"); - } - } - void EHMTX::set_brightness(int value) { if (value < 256) @@ -966,8 +932,8 @@ namespace esphome auto dow = this->clock->now().day_of_week - 1; // SUN = 0 for (uint8_t i = 0; i <= 6; i++) { - if (((!this->week_starts_monday) && (dow == i)) || - ((this->week_starts_monday) && ((dow == (i + 1)) || ((dow == 0 && i == 6))))) + if (((!EHMTXv2_WEEK_START) && (dow == i)) || + ((EHMTXv2_WEEK_START) && ((dow == (i + 1)) || ((dow == 0 && i == 6))))) { this->display->line(2 + i * 4, 7, i * 4 + 4, 7, this->today_color); } @@ -979,27 +945,13 @@ namespace esphome } }; - void EHMTX::set_default_font_offset(int8_t y, int8_t x) - { - this->default_xoffset = x; - this->default_yoffset = y; - ESP_LOGD(TAG, "set_default_font_offset x: %d y: %d", x, y); - } - - void EHMTX::set_special_font_offset(int8_t y, int8_t x) - { - this->special_xoffset = x; - this->special_yoffset = y; - ESP_LOGD(TAG, "set_special_font_offset x: %d y: %d", x, y); - } - void EHMTX::dump_config() { ESP_LOGCONFIG(TAG, "EspHoMatriXv2 version: %s", EHMTX_VERSION); ESP_LOGCONFIG(TAG, "Icons: %d of %d", this->icon_count, MAXICONS); ESP_LOGCONFIG(TAG, "Clock interval: %d s", EHMTXv2_CLOCK_INTERVALL); - ESP_LOGCONFIG(TAG, "Date format: %s", this->date_fmt.c_str()); - ESP_LOGCONFIG(TAG, "Time format: %s", this->time_fmt.c_str()); + ESP_LOGCONFIG(TAG, "Date format: %s", EHMTXv2_DATE_FORMAT); + ESP_LOGCONFIG(TAG, "Time format: %s", EHMTXv2_TIME_FORMAT); ESP_LOGCONFIG(TAG, "Interval (ms) scroll: %d", EHMTXv2_SCROLL_INTERVALL); if (this->show_day_of_week) { @@ -1012,7 +964,7 @@ namespace esphome #ifdef EHMTXv2_USE_RTL ESP_LOGCONFIG(TAG, "RTL activated"); #endif - if (this->week_starts_monday) + if (EHMTXv2_WEEK_START) { ESP_LOGCONFIG(TAG, "weekstart: monday"); } diff --git a/components/ehmtxv2/EHMTX.h b/components/ehmtxv2/EHMTX.h index 4b5d94c0..2b30accf 100644 --- a/components/ehmtxv2/EHMTX.h +++ b/components/ehmtxv2/EHMTX.h @@ -62,7 +62,6 @@ namespace esphome uint8_t brightness_; uint32_t boot_anim = 0; uint8_t screen_pointer; - bool week_starts_monday; bool show_day_of_week; std::vector on_next_screen_triggers_; @@ -81,16 +80,12 @@ namespace esphome void dump_config(); #ifdef USE_ESP32 PROGMEM Color text_color, alarm_color, gauge_color, gauge_bgcolor, rindicator_color, lindicator_color,clock_color, today_color, weekday_color, rainbow_color; - PROGMEM std::string time_fmt; - PROGMEM std::string date_fmt; PROGMEM Color bitmap[256]; PROGMEM Color sbitmap[64]; PROGMEM EHMTX_Icon *icons[MAXICONS]; #endif #ifdef USE_ESP8266 - std::string time_fmt; - std::string date_fmt; Color text_color, alarm_color, gauge_color, gauge_bgcolor,rindicator_color,lindicator_color, clock_color, today_color, weekday_color, rainbow_color; EHMTX_Icon *icons[MAXICONS]; #endif @@ -102,9 +97,6 @@ namespace esphome bool display_gauge; bool is_running = false; bool show_date; - #ifdef EHMTXv2_USE_RTL - bool rtl; - #endif uint8_t gauge_value; uint16_t clock_time; uint16_t scroll_step; @@ -113,8 +105,6 @@ namespace esphome addressable_light::AddressableLightDisplay *display; time::RealTimeClock *clock; - int8_t default_yoffset, default_xoffset; - int8_t special_yoffset, special_xoffset; bool show_seconds; uint16_t hold_time; // seconds display of screen_time to extend @@ -147,21 +137,12 @@ namespace esphome void set_show_day_of_week(bool b=true); void set_show_seconds(bool b=false); void set_show_date(bool b=true); - #ifdef EHMTXv2_USE_RTL - void set_rtl(bool b=false); - #endif - void set_font_offset(int8_t x, int8_t y); - void set_week_start(bool b); void set_brightness(int b); - void set_default_font_offset(int8_t x, int8_t y); - void set_special_font_offset(int8_t x, int8_t y); void set_display_on(); void set_display_off(); void set_clock(time::RealTimeClock *clock); void set_default_font(display::Font *font); void set_special_font(display::Font *font); - void set_time_format(std::string s); - void set_date_format(std::string s); 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); diff --git a/components/ehmtxv2/EHMTX_queue.cpp b/components/ehmtxv2/EHMTX_queue.cpp index 34980f2d..c6688b07 100644 --- a/components/ehmtxv2/EHMTX_queue.cpp +++ b/components/ehmtxv2/EHMTX_queue.cpp @@ -143,8 +143,8 @@ namespace esphome void EHMTX_queue::draw() { display::Font *font = this->default_font ? this->config_->default_font : this->config_->special_font; - int8_t yoffset = this->default_font ? this->config_->default_xoffset : this->config_->special_xoffset; - int8_t xoffset = this->default_font ? this->config_->default_yoffset : this->config_->special_yoffset; + 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; int8_t extraoffset = 0; Color color_; if (this->config_->is_running) @@ -201,7 +201,7 @@ namespace esphome { color_ = (this->mode == MODE_RAINBOW_CLOCK) ? this->config_->rainbow_color : this->config_->clock_color; time_t ts = this->config_->clock->now().timestamp; - this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, this->config_->time_fmt.c_str(), + 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) { @@ -223,7 +223,7 @@ namespace esphome { color_ = (this->mode == MODE_RAINBOW_DATE) ? this->config_->rainbow_color : this->config_->clock_color; time_t ts = this->config_->clock->now().timestamp; - this->config_->display->strftime(xoffset + 15, yoffset, font, color_, display::TextAlign::BASELINE_CENTER, this->config_->date_fmt.c_str(), + 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) { diff --git a/components/ehmtxv2/__init__.py b/components/ehmtxv2/__init__.py index 5229522d..6e583e5a 100644 --- a/components/ehmtxv2/__init__.py +++ b/components/ehmtxv2/__init__.py @@ -374,25 +374,22 @@ def thumbnails(frames): cg.add_define("EHMTXv2_FRAME_INTERVALL",config[CONF_FRAMEINTERVAL]) cg.add_define("EHMTXv2_CLOCK_INTERVALL",config[CONF_CLOCKINTERVAL]) cg.add_define("EHMTXv2_SCROLL_COUNT",config[CONF_SCROLLCOUNT]) - + cg.add_define("EHMTXv2_WEEK_START",config[CONF_WEEK_START_MONDAY]) + cg.add_define("EHMTXv2_DEFAULT_FONT_OFFSET_X",config[CONF_DEFAULT_FONT_XOFFSET]) + cg.add_define("EHMTXv2_DEFAULT_FONT_OFFSET_Y",config[CONF_DEFAULT_FONT_YOFFSET]) + cg.add_define("EHMTXv2_SPECIAL_FONT_OFFSET_X",config[CONF_SPECIAL_FONT_XOFFSET]) + cg.add_define("EHMTXv2_SPECIAL_FONT_OFFSET_Y",config[CONF_SPECIAL_FONT_YOFFSET]) + 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[CONF_RTL]: - cg.add(var.set_rtl(config[CONF_RTL])) cg.add_define("EHMTXv2_USE_RTL") - if config[CONF_CLOCKFONT]: - cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT","true") - else: - cg.add_define("EHMTXv2_DEFAULT_CLOCK_FONT","false") - - - cg.add(var.set_week_start(config[CONF_WEEK_START_MONDAY])) - cg.add(var.set_time_format(config[CONF_TIME_FORMAT])) - cg.add(var.set_date_format(config[CONF_DATE_FORMAT])) cg.add(var.set_show_day_of_week(config[CONF_SHOWDOW])) cg.add(var.set_show_date(config[CONF_SHOWDATE])) cg.add(var.set_show_seconds(config[CONF_SHOW_SECONDS])) - cg.add(var.set_default_font_offset(config[CONF_DEFAULT_FONT_XOFFSET], config[CONF_DEFAULT_FONT_YOFFSET] )) - cg.add(var.set_special_font_offset(config[CONF_SPECIAL_FONT_XOFFSET], config[CONF_SPECIAL_FONT_YOFFSET] )) + for conf in config.get(CONF_ON_NEXT_SCREEN, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation(trigger, [(cg.std_string, "icon"), (cg.std_string, "text")], conf) From 3a83bf6cb013340e8f53be204e83e35a4b50f489 Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 6 Jun 2023 03:00:00 +0900 Subject: [PATCH 09/15] Update weather-display.md --- wiki/weather-display.md | 64 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/wiki/weather-display.md b/wiki/weather-display.md index dd381190..90dc0e07 100644 --- a/wiki/weather-display.md +++ b/wiki/weather-display.md @@ -1,4 +1,4 @@ -# introduction +# Introduction **Skill-level:** medium @@ -11,13 +11,19 @@ Show weather state with icons that match the weather conditions. ehmtx: icons: - id: weather_clear_night - lameid: 52163 + lameid: 53383 - id: weather_cloudy frame_duration: 192 lameid: 25991 + - id: weather_exceptional + lameid: 16754 - id: weather_fog lameid: 52167 - - id: weather_lightingrainy + - id: weather_hail + lameid: 53288 + - id: weather_lightning + lameid: 23713 + - id: weather_lightning_rainy lameid: 49299 - id: weather_partlycloudy frame_duration: 210 @@ -32,10 +38,16 @@ ehmtx: lameid: 49301 - id: weather_sunny lameid: 11201 + - id: weather_windy + lameid: 15618 + - id: weather_windy_variant + lameid: 15618 + - id: weather_cloudy_night + lameid: 12195 ``` -## step 2: enter **home assistant automation:** +## Step 2: enter **home assistant automation:** ```yaml alias: EHMTXv2 Weather @@ -55,3 +67,47 @@ action: states("sensor.92bc04_wind_speed")}}km/h/{{ states("sensor.92bc04_humidity") }}% ``` + +## Alternate Step 2: **Home Assistant Automation: Temperature & Icon (with OpenWeatherMap integration)** + +```yaml + - if: + - condition: or + conditions: + - condition: state + entity_id: sensor.openweathermap_condition + state: cloudy + - condition: state + entity_id: sensor.openweathermap_condition + state: partlycloudy + - condition: or + conditions: + - condition: sun + after: sunset + - condition: sun + before: sunrise + then: + - service: esphome.pixelclock_icon_screen + data: + default_font: true + icon_name: cloudy_night + text: "{{ states('sensor.openweathermap_temperature')|round(1) }}°" + lifetime: 5 + screen_time: 3 + r: 192 + g: 192 + b: 192 + else: + - service: esphome.pixelclock_icon_screen + data: + default_font: true + icon_name: >- + weather_{{ states('sensor.openweathermap_condition')|replace("-", + "_") }} + text: "{{ states('sensor.openweathermap_temperature')|round(1) }}°" + lifetime: 5 + screen_time: 3 + r: 192 + g: 192 + b: 192 +``` From 16b82da6e720e7cfc0088093b0079f2e431275e8 Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 6 Jun 2023 04:05:15 +0900 Subject: [PATCH 10/15] Create time-format --- wiki/time-format | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 wiki/time-format diff --git a/wiki/time-format b/wiki/time-format new file mode 100644 index 00000000..3e46d4f6 --- /dev/null +++ b/wiki/time-format @@ -0,0 +1,53 @@ +# introduction + +**Skill-level:** low + +In the ehmtxv2: section of your yaml, you can change the format that the date and time are displayed. + +There are some helpful hints on the [EspHome site](https://esphome.io/components/time/?highlight=strftime#strftime) but there are some undocumented ones, too. EspHome only uses a subset of [strftime](https://strftime.org/) but there are still some good tricks available. + + +## Date formats + +Month.Day (02.28) +``` + date_format: "%m.%d" +``` + +Day.Month (28.02) +``` + date_format: "%d.%m" +``` + +Year.Month.Day (23.02.28) +``` + date_format: "%y.%m.%d" +``` + +Abbreviated Month and Date (Feb 08) +``` + date_format: "%b %d" +``` + +Abbreviated Day and Date (Tue 08) +``` + date_format: "%a %d" +``` + +## Time formats + +24-hour time (23:15) +``` + time_format: "%H:%M" +``` + +12-hour time with padded hour (01:25PM) +``` + time_format: "%I:%M%p" +``` + +12-hour time with unpadded hour (1:25PM) + +``` + time_format: "%l:%M%p" +``` From 67b9c325b22f38dd0475b43a01d3f9e2b1711b3a Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 6 Jun 2023 04:11:36 +0900 Subject: [PATCH 11/15] Rename time-format to time-format.md --- wiki/{time-format => time-format.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename wiki/{time-format => time-format.md} (100%) diff --git a/wiki/time-format b/wiki/time-format.md similarity index 100% rename from wiki/time-format rename to wiki/time-format.md From 7580e221e7502b4fc7f3a4d3392000ba3b2680bd Mon Sep 17 00:00:00 2001 From: darkpoet78 Date: Tue, 6 Jun 2023 04:12:52 +0900 Subject: [PATCH 12/15] Update home.md --- wiki/home.md | 1 + 1 file changed, 1 insertion(+) diff --git a/wiki/home.md b/wiki/home.md index d7b8e970..73506ab0 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -9,3 +9,4 @@ - [Ulanzi upside-down](rotate-ULANZI-display-180-degrees) - [Use all icons in your blueprint](use-icons-in-blueprints) +- [Time & Date Formats](time-format) From 8393dd535a5c97b287a72c60f21f0b4f3559ea0b Mon Sep 17 00:00:00 2001 From: Hans-Christian Otto Date: Wed, 7 Jun 2023 09:17:39 +0200 Subject: [PATCH 13/15] Update link to pixel it original link 404ed (in a nice way!), but I think I found the new URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1520ffa..dd6f21bf 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ There are some “RGB-matrices” status displays/clocks out there, the commerci - [LaMetric](https://lametric.com/en-US/) commercial ~ €199 - [Ulanzi TC001](https://www.aliexpress.com/item/1005005008682055.html) commercial ~ €50 - [AWTRIX](https://awtrixdocs.blueforcer.de/#/) (project has been discontinued after more than 4 years in August 2022) -- [Pixel It](https://docs.bastelbunker.de/pixelit/) (project is under active development) +- [Pixel It](https://pixelit-project.github.io/) (project is under active development) - [AWTRIX-Light](https://github.com/Blueforcer/awtrix-light) From the developer of AWTRIX, optimized for the Ulanzi TC001 hardware The solutions have their pros and cons. I tried some and used AWTRIX for a long time. But the cons are so big (in my opinion) that I started an esphome.io variant. Targeted to an optimized Home Assistant integration, without paid blueprints and the need of MQTT or uploading files to the ESP. From 362f1fc900bd010c6a0ba6e4f13d376093d03f63 Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Wed, 7 Jun 2023 17:26:35 +0200 Subject: [PATCH 14/15] final touchup --- README.md | 2 +- wiki/home.md | 1 - wiki/time-format.md | 24 +++++++++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f79ef546..a1f1d465 100644 --- a/README.md +++ b/README.md @@ -1100,7 +1100,7 @@ THE SOFTWARE IS PROVIDED “AS IS”, use at your own risk! - **[aptonline](https://github.com/aptonline)** for his work on the Ulanzi hardware - **[wsbtak](https://github.com/wsbtak)** for the work on the Ulanzi hardware - **[ofirsnb](https://github.com/ofirsnb)** for his contributions -- **[darkpoet78](https://github.com/darkpoet78/MatrixClockFonts)** for his work on optimized fonts and user support +- **[darkpoet78](https://github.com/darkpoet78/MatrixClockFonts)** for his work on optimized fonts and user support and work on the wiki - **[pplucky](https://user-images.githubusercontent.com/16407309/224850723-634c9b2d-55d9-44f2-9f93-765c0485b090.GIF)** for his 8x32 GIF animation - **[dennisse](https://github.com/dennisse)** Auto brightness for the Ulanzi - **[geekofweek](https://github.com/geekofweek)** fixed sample YAML diff --git a/wiki/home.md b/wiki/home.md index 7e425630..9b45131b 100644 --- a/wiki/home.md +++ b/wiki/home.md @@ -11,4 +11,3 @@ - [Use all icons in your blueprint](use-icons-in-blueprints) - [Time & Date Formats](time-format) - [Blueprints for easier configuration](blueprints) - diff --git a/wiki/time-format.md b/wiki/time-format.md index 3e46d4f6..92d228cd 100644 --- a/wiki/time-format.md +++ b/wiki/time-format.md @@ -6,48 +6,54 @@ In the ehmtxv2: section of your yaml, you can change the format that the date an There are some helpful hints on the [EspHome site](https://esphome.io/components/time/?highlight=strftime#strftime) but there are some undocumented ones, too. EspHome only uses a subset of [strftime](https://strftime.org/) but there are still some good tricks available. - ## Date formats Month.Day (02.28) -``` + +```yaml date_format: "%m.%d" ``` Day.Month (28.02) -``` + +```yaml date_format: "%d.%m" ``` Year.Month.Day (23.02.28) -``` + +```yaml date_format: "%y.%m.%d" ``` Abbreviated Month and Date (Feb 08) -``` + +```yaml date_format: "%b %d" ``` Abbreviated Day and Date (Tue 08) -``` + +```yaml date_format: "%a %d" ``` ## Time formats 24-hour time (23:15) -``` + +```yaml time_format: "%H:%M" ``` 12-hour time with padded hour (01:25PM) -``` + +```yaml time_format: "%I:%M%p" ``` 12-hour time with unpadded hour (1:25PM) -``` +```yaml time_format: "%l:%M%p" ``` From bf1f6bc996cf91cadc394f7e3e77f00ba37fbf8e Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Wed, 7 Jun 2023 17:31:43 +0200 Subject: [PATCH 15/15] docu --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a1f1d465..f310c261 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Based on a 8x32 RGB matrix, it displays a clock, the date and up to 24 other 'sc ### State -After the [old](https://github.com/lubeda/EsphoMaTrix) component became favorite, there were some feature requests, which indicated that my old code was a mess. I reworked the whole code and restructured it, so it is now hopefully more extensible. +After the [old](https://github.com/lubeda/EsphoMaTrix) component became favorite, there were some feature requests, which indicated that my old code was a mess. I reworked the whole code and restructured it, so it is now hopefully more extensible. **This software is still heavily in progress, before updating check the [breaking changes](#breaking-changes)** ### Advice @@ -1065,6 +1065,15 @@ sensor: ## Breaking changes +### 2023.6.3 + +**Due to this change these values are fixed, e.g. you can not change the date or timeformat during runtime anymore!!** + +- changed *_interval to be set only on compile time +- change scroll_count to be set only on compile time +- change font_offsets to be set only on compile time +- change date/time_format to be set only on compile time + ### 2023.5.0 - renamed `indicator` to `rindicator` because there is now also a `lindicator` @@ -1103,6 +1112,7 @@ THE SOFTWARE IS PROVIDED “AS IS”, use at your own risk! - **[darkpoet78](https://github.com/darkpoet78/MatrixClockFonts)** for his work on optimized fonts and user support and work on the wiki - **[pplucky](https://user-images.githubusercontent.com/16407309/224850723-634c9b2d-55d9-44f2-9f93-765c0485b090.GIF)** for his 8x32 GIF animation - **[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 - **Everybody** who found bugs/issues and reported them!