├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── question.md └── workflows │ └── wiki.yaml ├── .gitignore ├── 8x32 iMAGE.xcf ├── LICENSE ├── README.md ├── images ├── booting.png ├── clock_screen.png ├── elements.png ├── events.png ├── fullscreen.png ├── icon_screen.png ├── icons_preview.png ├── sample.png ├── text_screen.png └── timingv2.png ├── tests ├── 1pixel.gif ├── ehtmxv2-template.yaml ├── mateine.ttf ├── scale.gif ├── secrets.yaml └── ulanzi-easy.yaml ├── wiki-samples ├── type1.jnx ├── type1.yaml └── ulanzi.jnx └── wiki ├── blueprint-extended-dialog.png ├── blueprints.md ├── broken-ulanzi.md ├── compile-icons.png ├── display-timer.md ├── ehmtxfont.png ├── fonts.md ├── gurumediationerror.md ├── home.md ├── mateinefont.png ├── mateinethinfont.png ├── night-mode.md ├── rotate-ULANZI-display-180-degrees.md ├── rotating-text.md ├── special-clock-and-date-display-duration.md ├── startup-settings.md ├── sucess-stories.md ├── time-date-display.md ├── time-format.md ├── use-icons-in-blueprints.md └── weather-display.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | custom: ["https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU"] 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve EspHoMaTriXv2 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | 10 | 11 | # Bug report 12 | 13 | ## Describe the bug 14 | 15 | Add a description of the bug. Detail the expected behavior in contrast with the behavior you're observing. 16 | 17 | ## Additional information 18 | 19 | - used Hardware: 20 | - ESP32 or ESP8266 21 | - EspHoMaTriXv2 version: [e.g. 2023.5.0] 22 | 23 | 24 | ## To Reproduce 25 | 26 | Steps to reproduce the behavior: 27 | 28 | ## Expected behavior 29 | 30 | A clear and concise description of what you expected to happen. 31 | 32 | ## Configuration 33 | 34 | ```text 35 | (optional) The YAML you used in epshome without any password 36 | ``` 37 | 38 | ## Screenshots 39 | 40 | If applicable, add screenshots to help explain your problem. 41 | 42 | ## Logs 43 | 44 | ```text 45 | (optional) Add relevant logs which could help tackle the problem. 46 | ``` 47 | 48 | ## Services calls 49 | 50 | ```text 51 | (optional) The YAML of your service calls 52 | ``` 53 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this EspHoMaTriXv2 4 | title: "[FEATURE REQUEST]" 5 | labels: feature request 6 | assignees: '' 7 | --- 8 | 9 | 10 | 11 | # Feature Request 12 | 13 | ### Is your feature request related to a problem? 14 | 15 | If so, then add a clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 16 | 17 | ### Describe the solution / feature you'd like 18 | 19 | A clear and concise description of what you want to happen. Add scribbles to explain your wish. 20 | 21 | ### Describe alternatives you've considered 22 | 23 | A clear and concise description of any alternative solutions or features you've considered. 24 | 25 | ### Additional context 26 | 27 | Add any other context or screenshots about the feature request here. 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | 4 | about: Open an issue to ask something about EspHoMaTriXv2 5 | title: "[QUESTION]" 6 | labels: help wanted, question 7 | assignees: '' 8 | --- 9 | 10 | 11 | 12 | # Question 13 | 14 | Add here your question. 15 | 16 | ## Additional information 17 | 18 | - used Hardware: 19 | - ESP32 or ESP8266 20 | 21 | - EspHoMaTriXv2 version: [e.g. 2023.5.0] 22 | 23 | ## Logs 24 | 25 | ```text 26 | (optional) Add relevant logs which could help tackle the problem. 27 | ``` 28 | 29 | ## Additional context 30 | 31 | Add any other context about the problem here. 32 | -------------------------------------------------------------------------------- /.github/workflows/wiki.yaml: -------------------------------------------------------------------------------- 1 | name: Publish wiki 2 | on: 3 | push: 4 | branches: 5 | - 2023.8.0 6 | - main 7 | paths: 8 | - wiki/** 9 | - .github/workflows/wiki.yaml 10 | concurrency: 11 | group: publish-wiki 12 | cancel-in-progress: true 13 | permissions: 14 | contents: write 15 | jobs: 16 | publish-wiki: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v3 20 | - uses: Andrew-Chen-Wang/github-wiki-action@v4 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | components/ehmtx/__init__ copy._py 2 | components/ehmtx/__pycache__/__init__.cpython-39.pyc 3 | venv 4 | .esphome/ 5 | _icons/ 6 | _fonts/ 7 | esphome.ps1 8 | dev_*.yaml 9 | ehmtx8266.yaml 10 | info.de.md 11 | components/ehmtx/select/__pycache__/__init__.cpython-39.pyc 12 | ehmtx8266-rgb565.yaml 13 | icons.html 14 | components/ehmtx/__init__ copy.py 15 | ehmtx8266-rgb565.yaml.html 16 | ehmtx8266-rgb565-font.yaml 17 | components/ehmtx/EHMTX_icons._cpp 18 | .vscode/settings.json 19 | ehmtx8266-select.yaml 20 | svganimtest.html 21 | servicetest 22 | .DS_Store 23 | components/ehmtxv2/animation.py 24 | downloadawtrixicons.ps1 25 | ltr1.png 26 | ltr2.png 27 | ltr3.png 28 | 8x32 iMAGE.xcf 29 | 30 | .vscode/c_cpp_properties.json 31 | .vs/ 32 | -------------------------------------------------------------------------------- /8x32 iMAGE.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/8x32 iMAGE.xcf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022,2023 LuBeDa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINlindicatorENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EspHoMaTriX version 2 (EHMTXv2) 2 | 3 | [donation-badge]:https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white 4 | [donation-url]: https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU 5 | 6 | ![Home Assistant](https://img.shields.io/badge/home%20assistant-%2341BDF5.svg?style=for-the-badge&logo=home-assistant&logoColor=white) 7 | ![GitHub](https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white) 8 | [![Donate][donation-badge]][donation-url] 9 | [![Publish wiki](https://github.com/lubeda/EspHoMaTriXv2/actions/workflows/wiki.yaml/badge.svg)](https://github.com/lubeda/EspHoMaTriXv2/actions/workflows/wiki.yaml) 10 | [![Build](https://github.com/lubeda/EspHoMaTriXv2/actions/workflows/build.yaml/badge.svg)](https://github.com/lubeda/EspHoMaTriXv2/actions/workflows/build.yaml) 11 | 12 | 13 | # Important 14 | 15 | Each esphome release is packed with new features and suprises (breaking changes), so it is hard to stay up to date for me. Each user can decide which version of esphome he uses. So there is not one combination of esphome, ehmtx and yaml that fits all. 16 | 17 | ## So ehmtx is prone to breaking on every esphome update. 18 | 19 | **My suggestion is:** 20 | 21 | **Keep esphome up to date with the latest official version!** 22 | 23 | **Which are:** 24 | - [Branch 2025.5.2](https://github.com/lubeda/EspHoMaTriXv2/tree/2025.5.2) for esphome 2025.4.0- (some fixes "empty queue") 25 | - [Branch 2025.5.1](https://github.com/lubeda/EspHoMaTriXv2/tree/2025.5.1) for esphome 2025.4.0- 26 | - [Branch 2025.2.1](https://github.com/lubeda/EspHoMaTriXv2/tree/2025.2.1) for esphome 2025.2.0- (optimized handling of transparent icons) 27 | - [Branch 2025.2.0](https://github.com/lubeda/EspHoMaTriXv2/tree/2025.2.0) for esphome 2025.2.0- 28 | - [Branch 2024.12.1](https://github.com/lubeda/EspHoMaTriXv2/tree/2024.12.1) for esphome 2024.12.0-... 29 | 30 | For ehmtx use the newest version tag by manually editing the ref tag in the external_componets section in your yaml. 31 | Only change your selected ehmtx version if there are compile errors. But expect manual changes to your yaml or even your automations. 32 | 33 | The details to each EspHoMaTriX version are on the branch pages 34 | 35 | ```yaml 36 | external_components: 37 | - source: 38 | #type: local 39 | #path: EsphoMaTrix/components # e.g. /config/esphome/components 40 | type: git 41 | url: https://github.com/lubeda/EspHoMaTriXv2 42 | ref: 2025.5.2 43 | refresh: 60s 44 | components: [ ehmtxv2 ] 45 | ``` 46 | 47 | ### Features 48 | 49 | Based on a 8x32 RGB matrix, it displays a clock, the date and up to 24 other 'screens' provided by Home Assistant. Each screen (value/text) can be associated with a 8x8 bit RGB icon or GIF animation (see [installation](#installation-of-esphomatrixv2-custom-component)). The values/text can be updated or deleted from the display queue. Each screen has a lifetime, if not refreshed in its lifetime, it will disappear. Even 8x32 GIF animations are possible. You can control nearly everything of the component. 50 | 51 | ### Advice 52 | 53 | It is highly recommended to use an **ESP32 device**. There are conditions where the RAM size is too limited in a **ESP8266 device** so some of the features had to be removed for these boards (Example: bitmap_screen). 54 | 55 | ## EspHoMaTriX in the media 56 | 57 | See this German tutorial video with information on setting up your display [RGB-LED Status Display für Home Assistant mit ESPHome | ESPHoMaTrix](https://www.youtube.com/watch?v=DTd9vAhet9A). 58 | 59 | Another german tutorial video focused on the Ulanzi [Smarte Pixel Clock über Home Assistant steuern - Entitäten / Icons und mehr in der Ulanzi](https://www.youtube.com/watch?v=LgaT0mNbl34) 60 | 61 | See this [nice article](https://blakadder.com/esphome-pixel-clock/) about EsphoMaTrix on a Ulanzi TC001 from [blakadder](https://github.com/blakadder). 62 | 63 | Short video on Instagram [@blak_adder](https://www.insbuiltagram.com/reel/CpYVByRIaSI) 64 | 65 | See these english discussions: 66 | [Share your projects](https://community.home-assistant.io/t/esphomatrix-a-simple-clock-status-display/425325) 67 | [ESPHOME](https://community.home-assistant.io/t/a-simple-diy-status-display-with-an-8x32-rgb-led/379051) 68 | 69 | It was also mentioned in the blog [Building the Open Home](https://building.open-home.io/local-control-is-the-only-way/) and in the home assistant [livestream](https://youtu.be/IGnCGDaXR0M?t=6267) 70 | 71 | Or in German: 72 | [Showroom](https://community.simon42.com/t/8x32-pixel-uhr-mit-homeassistant-anbindung/1076) 73 | 74 | ## Disclaimer 75 | 76 | THE SOFTWARE IS PROVIDED “AS IS”, use at your own risk! 77 | 78 | ## Thanks 79 | 80 | See all the **coding heroes** in the newest branch! 81 | 82 | - **[blakadder](https://github.com/blakadder)** for his contribution (cleanup README.md, fixed sample) 83 | - **[dbuezas](https://github.com/dbuezas)** for his fonts [infos](https://github.com/lubeda/EspHoMaTriXv2/issues/63) 84 | - **[jfurtner](https://github.com/jfurtner)** for his the on_start_running trigger and a new parameter 85 | - **[andrew-codechimp](https://github.com/andrew-codechimp)** for his contribution (display on/off & del_screen "*" & show_clock with 0) and improved blueprint slelection 86 | - **[jd1](https://github.com/jd1)** for his contributions 87 | - **[aptonline](https://github.com/aptonline)** for his work on the Ulanzi hardware 88 | - **[wsbtak](https://github.com/wsbtak)** for the work on the Ulanzi hardware 89 | - **[ofirsnb](https://github.com/ofirsnb)** for his contributions 90 | - **[trip5](https://github.com/trip5)** for his work on optimized fonts and user support and work on the wiki 91 | - **[pplucky](https://user-images.githubusercontent.com/16407309/224850723-634c9b2d-55d9-44f2-9f93-765c0485b090.GIF)** for his 8x32 GIF animation 92 | - **[dennisse](https://github.com/dennisse)** Auto brightness for the Ulanzi 93 | - **[hco](https://github.com/hco)** fixing documentation 94 | - **[geekofweek](https://github.com/geekofweek)** fixed sample YAML, cleanup documentation 95 | - **[joncar](https://github.com/joncar)** fixed scroll small text 96 | - **Everybody** who found bugs/issues and reported them! 97 | 98 | ## Special thanks to all the sponsors 99 | -------------------------------------------------------------------------------- /images/booting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/booting.png -------------------------------------------------------------------------------- /images/clock_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/clock_screen.png -------------------------------------------------------------------------------- /images/elements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/elements.png -------------------------------------------------------------------------------- /images/events.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/events.png -------------------------------------------------------------------------------- /images/fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/fullscreen.png -------------------------------------------------------------------------------- /images/icon_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/icon_screen.png -------------------------------------------------------------------------------- /images/icons_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/icons_preview.png -------------------------------------------------------------------------------- /images/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/sample.png -------------------------------------------------------------------------------- /images/text_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/text_screen.png -------------------------------------------------------------------------------- /images/timingv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/images/timingv2.png -------------------------------------------------------------------------------- /tests/1pixel.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/tests/1pixel.gif -------------------------------------------------------------------------------- /tests/ehtmxv2-template.yaml: -------------------------------------------------------------------------------- 1 | substitutions: 2 | devicename: ehmtxv2 3 | friendly_name: LED Matrix 4 | board: esp32dev 5 | matrix_pin: GPIO32 6 | 7 | animation: 8 | - id: animation_black 9 | file: 1pixel.gif 10 | 11 | image: 12 | - id: image_black 13 | file: 1pixel.gif 14 | 15 | external_components: 16 | - source: 17 | type: local 18 | path: ../components 19 | components: [ ehmtxv2 ] 20 | 21 | esphome: 22 | comment: "EHMTXv2 TEXT from LuBeDa" 23 | name: $devicename 24 | on_boot: 25 | lambda: |- 26 | id(rgb8x32)->show_rindicator(255,100,50,2); 27 | id(rgb8x32)->hide_rindicator(); 28 | id(rgb8x32)->show_lindicator(255,200,50,2); 29 | id(rgb8x32)->hide_lindicator(); 30 | id(rgb8x32)->show_alarm(255,0,150,3); 31 | id(rgb8x32)->hide_alarm(); 32 | id(rgb8x32)->icon_screen("error","Hallo Text",false,237,20,100,200,150); 33 | id(rgb8x32)->force_screen("error"); 34 | id(rgb8x32)->del_screen("error"); 35 | id(rgb8x32)->del_screen("error",5); 36 | id(rgb8x32)->rainbow_icon_screen("error","Hallo Text",true,237,20); 37 | id(rgb8x32)->get_status(); 38 | id(rgb8x32)->set_display_on(); 39 | id(rgb8x32)->set_display_off(); 40 | id(rgb8x32)->hold_screen(); 41 | id(rgb8x32)->show_gauge(100,0,200); 42 | id(rgb8x32)->show_gauge(40,0,200,0,100,100,100); 43 | id(rgb8x32)->hide_gauge(); 44 | id(rgb8x32)->set_today_color(200,100,50); 45 | id(rgb8x32)->set_weekday_color(200,100,50); 46 | id(rgb8x32)->full_screen("scale"); 47 | id(rgb8x32)->rainbow_icon_screen("error","Oh ein Text"); 48 | id(rgb8x32)->text_screen("text",30); 49 | id(rgb8x32)->rainbow_text_screen("text",30); 50 | id(rgb8x32)->clock_screen(30,5); 51 | id(rgb8x32)->rainbow_clock_screen(30,5); 52 | id(rgb8x32)->date_screen(30,5); 53 | id(rgb8x32)->rainbow_date_screen(30,5); 54 | id(rgb8x32)->blank_screen(30,5); 55 | id(rgb8x32)->set_brightness(20); 56 | 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); 57 | 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); 58 | id(rgb8x32)->display_version(); 59 | id(rgb8x32)->display_boot_logo(); 60 | esp32: 61 | board: esp32dev 62 | 63 | font: 64 | - file: mateine.ttf 65 | size: 16 66 | id: default_font 67 | glyphs: | 68 | !?"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnÖÄÜöäüopqrstuvwxyz@<>ß§€/ 69 | 70 | binary_sensor: 71 | - platform: status 72 | name: "$devicename Status" 73 | 74 | logger: 75 | level: WARN 76 | 77 | api: 78 | 79 | sensor: 80 | 81 | ota: 82 | password: !secret ota_password 83 | 84 | wifi: 85 | ssid: !secret wifi_ssid 86 | password: !secret wifi_password 87 | 88 | web_server: 89 | 90 | light: 91 | - platform: neopixelbus 92 | id: ehmtx_light 93 | type: GRB 94 | internal: true 95 | variant: WS2812 96 | pin: $matrix_pin 97 | num_leds: 256 98 | color_correct: [30%, 30%, 30%] 99 | gamma_correct: 2.0 100 | name: "$devicename Light" 101 | restore_mode: ALWAYS_OFF 102 | 103 | time: 104 | - platform: homeassistant 105 | id: ehmtx_time 106 | 107 | display: 108 | - platform: addressable_light 109 | id: ehmtx_display 110 | addressable_light_id: ehmtx_light 111 | width: 32 112 | height: 8 113 | pixel_mapper: |- 114 | if (y % 2 == 0) { 115 | return (y * 32) + x; 116 | } 117 | return (y * 32) + (31 - x); 118 | rotation: 0° 119 | update_interval: 16ms 120 | auto_clear_enabled: true 121 | lambda: |- 122 | id(rgb8x32)->tick(); 123 | id(rgb8x32)->draw(); 124 | 125 | ehmtxv2: 126 | id: rgb8x32 127 | icons2html: true 128 | matrix_component: ehmtx_display 129 | time_component: ehmtx_time 130 | time_format: "%H:%M" 131 | date_format: "%d.%m." 132 | show_seconds: false 133 | clock_interval: 90 134 | rtl: true 135 | 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]" 136 | default_font_id: default_font 137 | default_font_yoffset: 8 138 | special_font_id: default_font 139 | special_font_yoffset: 8 140 | icons: 141 | - id: error 142 | lameid: 40530 143 | - id: scale 144 | file: scale.gif 145 | resize: 32x8 146 | - id: sleep8x32 147 | url: https://user-images.githubusercontent.com/16407309/224850723-634c9b2d-55d9-44f2-9f93-765c0485b090.gif 148 | on_next_screen: 149 | - homeassistant.event: 150 | event: esphome.new_screen 151 | data_template: 152 | iconname: !lambda "return icon.c_str();" 153 | text: !lambda "return text.c_str();" 154 | on_add_screen: 155 | - homeassistant.event: 156 | event: esphome.new_screen 157 | data_template: 158 | iconname: !lambda "return icon.c_str();" 159 | mode: !lambda "return mode;" 160 | on_next_clock: 161 | - homeassistant.event: 162 | event: esphome.new_screen 163 | data_template: 164 | iconname: "Hallo" 165 | on_expired_screen: 166 | - homeassistant.event: 167 | event: esphome.new_screen 168 | data_template: 169 | iconname: !lambda "return icon.c_str();" 170 | text: !lambda "return text.c_str();" 171 | on_icon_error: 172 | - homeassistant.event: 173 | event: esphome.new_screen 174 | data_template: 175 | iconname: !lambda "return icon.c_str();" -------------------------------------------------------------------------------- /tests/mateine.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/tests/mateine.ttf -------------------------------------------------------------------------------- /tests/scale.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/tests/scale.gif -------------------------------------------------------------------------------- /tests/secrets.yaml: -------------------------------------------------------------------------------- 1 | # This is just a a sample for CI/CD!! 2 | ota_password: itsecret 3 | wifi_password: itsecret 4 | wifi_ssid: itsecret -------------------------------------------------------------------------------- /tests/ulanzi-easy.yaml: -------------------------------------------------------------------------------- 1 | substitutions: 2 | devicename: ulanzi 3 | friendly_name: LED Matrix 4 | board: esp32dev 5 | # Pin definition from https://github.com/aptonline/PixelIt_Ulanzi 6 | battery_pin: GPIO34 7 | ldr_pin: GPIO35 8 | matrix_pin: GPIO32 9 | left_button_pin: GPIO26 10 | mid_button_pin: GPIO27 11 | right_button_pin: GPIO14 12 | scl_pin: GPIO22 13 | sda_pin: GPIO21 14 | 15 | animation: 16 | - id: animation_black 17 | file: 1pixel.gif 18 | 19 | image: 20 | - id: image_black 21 | file: 1pixel.gif 22 | 23 | switch: 24 | - platform: template 25 | name: "Auto-Adjust Brightness" 26 | id: switch_autobrightness 27 | icon: mdi:brightness-auto 28 | restore_mode: RESTORE_DEFAULT_ON 29 | lambda: |- 30 | if (id(aab_enable)) { 31 | return true; 32 | } else { 33 | return false; 34 | } 35 | turn_on_action: 36 | lambda: |- 37 | id(aab_enable) = true; 38 | turn_off_action: 39 | lambda: |- 40 | id(aab_enable) = false; 41 | 42 | globals: 43 | # aab = auto-adjustable brightness 44 | - id: aab_enable 45 | type: "bool" 46 | restore_value: true 47 | initial_value: "true" 48 | - id: aab_add 49 | type: int 50 | initial_value: '10' 51 | - id: aab_max 52 | type: int 53 | initial_value: '220' 54 | - id: aab_min 55 | type: int 56 | initial_value: '20' 57 | 58 | external_components: 59 | - source: 60 | type: git 61 | url: https://github.com/lubeda/EspHoMaTriXv2 62 | ref: 2025.2.0 63 | refresh: 60s 64 | components: [ ehmtxv2 ] 65 | 66 | esphome: 67 | comment: "EHMTXv2 from LuBeDa" 68 | name: $devicename 69 | on_boot: 70 | then: 71 | - ds1307.read_time: 72 | 73 | esp32: 74 | board: esp32dev 75 | 76 | font: 77 | - file: mateine.ttf 78 | size: 16 79 | id: default_font 80 | glyphs: | 81 | !?"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnÖÄÜöäüopqrstuvwxyz@<>ß§€/ 82 | 83 | binary_sensor: 84 | - platform: status 85 | name: "$devicename Status" 86 | - platform: gpio 87 | pin: 88 | number: $left_button_pin 89 | inverted: true 90 | name: "Left button" 91 | - platform: gpio 92 | pin: 93 | inverted: true 94 | number: $mid_button_pin 95 | mode: INPUT_PULLUP 96 | name: "Middle button" 97 | - platform: gpio 98 | pin: 99 | number: $right_button_pin 100 | inverted: true 101 | name: "Right button" 102 | 103 | logger: 104 | level: WARN 105 | 106 | api: 107 | 108 | sensor: 109 | - platform: sht3xd 110 | temperature: 111 | name: "$devicename Temperature" 112 | humidity: 113 | name: "$devicename Relative Humidity" 114 | update_interval: 60s 115 | - platform: adc 116 | pin: $battery_pin 117 | name: "$devicename Battery" 118 | id: battery_voltage 119 | update_interval: 10s 120 | device_class: battery 121 | accuracy_decimals: 0 122 | attenuation: auto 123 | filters: 124 | - sliding_window_moving_average: 125 | window_size: 15 126 | send_every: 15 127 | send_first_at: 1 128 | - multiply: 1.6 129 | - lambda: |- 130 | auto r = ((x - 3) / 0.69 * 100.00); 131 | if (r >= 100) return 100; 132 | if (r > 0) return r; 133 | if (r <= 0) return 1; 134 | return 0; 135 | unit_of_measurement: '%' 136 | - platform: adc 137 | id: light_sensor 138 | name: "$devicename Illuminance" 139 | pin: $ldr_pin 140 | update_interval: 10s 141 | attenuation: auto 142 | unit_of_measurement: lx 143 | device_class: illuminance 144 | accuracy_decimals: 0 145 | filters: 146 | - lambda: |- 147 | return (x / 10000.0) * 2000000.0 - 15 ; 148 | on_value: 149 | then: 150 | - lambda: |- 151 | if ( id(aab_enable) ) { 152 | int n = x / 4 + id(aab_add); // new_value 153 | if (n > id(aab_max)) n = id(aab_max); 154 | if (n < id(aab_min)) n = id(aab_min); 155 | int c = id(rgb8x32)->get_brightness(); // current value 156 | c = c>0?c:1 ; 157 | int d = (n - c) * 100 / c; // diff in % 158 | if ( abs(d) > 2 ) id(rgb8x32)->set_brightness(n); 159 | } 160 | 161 | ota: 162 | password: !secret ota_password 163 | 164 | wifi: 165 | ssid: !secret wifi_ssid 166 | password: !secret wifi_password 167 | 168 | web_server: 169 | 170 | i2c: 171 | sda: $sda_pin 172 | scl: $scl_pin 173 | scan: true 174 | id: i2cbus 175 | 176 | light: 177 | - platform: neopixelbus 178 | id: ehmtx_light 179 | type: GRB 180 | internal: true 181 | variant: WS2812 182 | pin: $matrix_pin 183 | num_leds: 256 184 | color_correct: [30%, 30%, 30%] 185 | gamma_correct: 2.0 186 | name: "$devicename Light" 187 | restore_mode: ALWAYS_OFF 188 | 189 | time: 190 | - platform: homeassistant 191 | on_time_sync: 192 | then: 193 | ds1307.write_time: 194 | - platform: ds1307 195 | update_interval: never 196 | id: ehmtx_time 197 | 198 | display: 199 | - platform: addressable_light 200 | id: ehmtx_display 201 | addressable_light_id: ehmtx_light 202 | width: 32 203 | height: 8 204 | pixel_mapper: |- 205 | if (y % 2 == 0) { 206 | return (y * 32) + x; 207 | } 208 | return (y * 32) + (31 - x); 209 | rotation: 0° 210 | update_interval: 16ms 211 | auto_clear_enabled: true 212 | lambda: |- 213 | id(rgb8x32)->tick(); 214 | id(rgb8x32)->draw(); 215 | 216 | ehmtxv2: 217 | id: rgb8x32 218 | icons2html: true 219 | matrix_component: ehmtx_display 220 | time_component: ehmtx_time 221 | time_format: "%H:%M" 222 | date_format: "%d.%m." 223 | show_seconds: false 224 | default_font_id: default_font 225 | default_font_yoffset: 8 226 | special_font_id: default_font 227 | special_font_yoffset: 8 228 | icons: 229 | - id: error 230 | lameid: 40530 231 | - id: home_assistant 232 | lameid: 47693 233 | - id: temperature 234 | lameid: 2056 235 | - id: lightbulb 236 | lameid: 1762 237 | - id: music 238 | lameid: 45625 239 | - id: phone 240 | lameid: 1232 241 | - id: car 242 | lameid: 2819 243 | - id: sleep8x32 244 | url: https://user-images.githubusercontent.com/16407309/224850723-634c9b2d-55d9-44f2-9f93-765c0485b090.gif 245 | on_next_screen: 246 | - homeassistant.event: 247 | event: esphome.new_screen 248 | data_template: 249 | iconname: !lambda "return icon.c_str();" 250 | text: !lambda "return text.c_str();" 251 | -------------------------------------------------------------------------------- /wiki-samples/type1.jnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki-samples/type1.jnx -------------------------------------------------------------------------------- /wiki-samples/type1.yaml: -------------------------------------------------------------------------------- 1 | substitutions: 2 | devicename: ehmtx8266 3 | ledpin: GPIO02 4 | 5 | external_components: 6 | - source: 7 | type: local 8 | path: ./EspHoMaTriXv2/components 9 | refresh: 60s 10 | 11 | esphome: 12 | name: $devicename 13 | comment: 8x32 RGB Display in bedroom 14 | 15 | binary_sensor: 16 | - platform: status 17 | name: "$devicename Status" 18 | 19 | esp8266: 20 | board: d1_mini 21 | 22 | font: 23 | - file: mateine.ttf 24 | id: default_font 25 | size: 16 26 | glyphs: | 27 | !"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz€@üöäÜÖÄß 28 | 29 | logger: 30 | level: WARN 31 | 32 | # Enable Home Assistant API 33 | api: 34 | 35 | ota: 36 | password: !secret ota_password 37 | 38 | wifi: 39 | ssid: !secret wifi_ssid 40 | password: !secret wifi_password 41 | 42 | light: 43 | - platform: neopixelbus 44 | id: ehmtx_light 45 | type: GRB 46 | variant: WS2812 47 | pin: $ledpin 48 | num_leds: 256 49 | color_correct: [30%, 30%, 30%] 50 | name: "$devicename Light" 51 | restore_mode: ALWAYS_OFF 52 | effects: 53 | - e131: 54 | universe: 1 55 | channels: RGB 56 | on_turn_on: 57 | lambda: |- 58 | id(ehmtx_display)->set_enabled(false); 59 | on_turn_off: 60 | lambda: |- 61 | id(ehmtx_display)->set_enabled(true); 62 | 63 | e131: 64 | method: multicast # default: register E1.31 to Multicast group 65 | 66 | time: 67 | - platform: homeassistant 68 | id: ehmtx_time 69 | on_time: !include ehmtx_on_time.yaml 70 | 71 | display: 72 | - platform: addressable_light 73 | id: ehmtx_display 74 | addressable_light_id: ehmtx_light 75 | width: 32 76 | height: 8 77 | pixel_mapper: |- 78 | if (x % 2 == 0) { 79 | return (x * 8) + y; 80 | } 81 | return (x * 8) + (7 - y); 82 | rotation: 0° 83 | update_interval: 16ms 84 | auto_clear_enabled: true 85 | lambda: |- 86 | id(rgb8x32)->tick(); 87 | id(rgb8x32)->draw(); 88 | 89 | ehmtxv2: 90 | id: rgb8x32 91 | show_seconds: true 92 | rainbow_interval: 32 93 | matrix_component: ehmtx_display 94 | time_component: ehmtx_time 95 | icons2html: true 96 | default_font_id: default_font 97 | special_font_id: default_font 98 | special_font_yoffset: 8 99 | default_font_yoffset: 8 100 | icons: 101 | - id: xani 102 | lameid: 6075 103 | - id: xsta 104 | lameid: 11236 105 | - url: https://developer.lametric.com/content/apps/icon_thumbs/48720.gif 106 | pingpong: true 107 | id: pipo 108 | frame_duration: 300 109 | - lameid: 5965 110 | frame_duration: 180 111 | id: d180 112 | - lameid: 5965 113 | frame_duration: 80 114 | id: d080 115 | - id: fullscreen 116 | file: sample8x32.gif 117 | - id: samplegif 118 | file: sample8x8.gif 119 | -------------------------------------------------------------------------------- /wiki-samples/ulanzi.jnx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki-samples/ulanzi.jnx -------------------------------------------------------------------------------- /wiki/blueprint-extended-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki/blueprint-extended-dialog.png -------------------------------------------------------------------------------- /wiki/blueprints.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** medium to advanced 4 | 5 | This component provides some blueprints. Because there are so many options and parameters it is sometimes hard to create manuall automations. 6 | 7 | ## EHMTX_extended_state.yaml 8 | 9 | With this blueprint you can easily react on state changes of a sensor. 10 | 11 | ![screenshot](https://github.com/lubeda/EspHoMaTriXv2/blob/main/wiki/blueprint-extended-dialog.png?raw=true) 12 | 13 | ## Bonus! They are free 14 | -------------------------------------------------------------------------------- /wiki/broken-ulanzi.md: -------------------------------------------------------------------------------- 1 | # Broken Ulanzi TC-001? 2 | 3 | There are some known issues regarding the voltage regulator of the 2023 March batch of Ulanzi TC-001 clocks. It appears that the LDO voltage regulator may be defective and if it burns out, may need replacing. 4 | 5 | When the screen is frozen, you will be able to turn off the clock by pressing the left and right buttons simultaneously but you will not be able to boot it up again. 6 | 7 | Your best bet is to contact the seller or Ulanzi directly for a replacement unit. 8 | 9 | But some folks over at the Awtrix [github forum](https://github.com/Blueforcer/awtrix-light/issues/67) and [Discord](https://discord.com/channels/546407049148366859/1096822468737511574/1101222937501126778) say the regulator can be replaced with a STI3408B. 10 | 11 | Here as an [imgur gallery](https://imgur.com/a/2p2miqF) which may help in taking apart your Ulanzi TC-001. 12 | 13 | **Use this hint at your own risk** 14 | 15 | Good luck! -------------------------------------------------------------------------------- /wiki/compile-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki/compile-icons.png -------------------------------------------------------------------------------- /wiki/display-timer.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** medium 4 | 5 | Set up a timer helper named *eier_timer* 6 | 7 | ## step 1: **home assistant automation:** 8 | 9 | triggered by the timer start, the timer display is refreshed every second 10 | 11 | ```yaml 12 | alias: Display Timer on ulanzi 13 | trigger: 14 | - platform: state 15 | entity_id: 16 | - timer.eier_timer 17 | to: active 18 | condition: 19 | - condition: state 20 | entity_id: timer.eier_timer 21 | state: active 22 | action: 23 | - service: esphome.ulanzi_icon_screen 24 | data: 25 | default_font: true 26 | icon_name: timer 27 | screen_time: 10 28 | lifetime: 1 29 | r: 200 30 | b: 200 31 | g: 50 32 | text: >- 33 | {{ (state_attr('timer.eier_timer', 'finishes_at') | as_datetime - 34 | now()).total_seconds() | int(0) }} 35 | - service: esphome.ulanzi_force_screen 36 | data: 37 | icon_name: timer 38 | - delay: 39 | hours: 0 40 | minutes: 0 41 | seconds: 1 42 | milliseconds: 0 43 | - service: automation.trigger 44 | data: 45 | skip_condition: false 46 | target: 47 | entity_id: automation.display_timer_on_ulanzi 48 | mode: restart 49 | ``` 50 | -------------------------------------------------------------------------------- /wiki/ehmtxfont.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki/ehmtxfont.png -------------------------------------------------------------------------------- /wiki/fonts.md: -------------------------------------------------------------------------------- 1 | # fonts 2 | 3 | **Skill-level:** all 4 | 5 | Due to limitations of the display there are only some font useful here are some examples. 6 | 7 | ## EHMTXv2.ttf 8 | 9 | [ttf-file](https://github.com/lubeda/EspHoMaTriXv2/blob/main/copy2esphome/EHMTXv2.ttf) 10 | ![sample](https://github.com/lubeda/EspHoMaTriXv2/blob/main/wiki/ehmtxfont.png?raw=true) 11 | 12 | 13 | ## mateine.ttf 14 | 15 | [8 pixel font]https://github.com/lubeda/EspHoMaTriXv2/blob/main/copy2esphome/mateine.ttf 16 | ![sample](https://github.com/lubeda/EspHoMaTriXv2/blob/main/wiki/mateinefont.png?raw=true) 17 | [8 pixel font thin]https://github.com/lubeda/EspHoMaTriXv2/blob/main/copy2esphome/mateineThin.ttf 18 | ![sample](https://github.com/lubeda/EspHoMaTriXv2/blob/main/wiki/mateinethinfont.png?raw=true) 19 | 20 | ## Trip5's Matrix Fonts 21 | 22 | [REPO](https://github.com/trip5/Matrix-Fonts) -------------------------------------------------------------------------------- /wiki/gurumediationerror.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** medium 4 | 5 | If you have got this error `Guru Meditation Error: Core 1 panic'ed (StoreProhibited). Exception was unhandled.` 6 | 7 | Try to reorder your components in the yaml file, this order works! 8 | 9 | ```yaml 10 | esphome: 11 | .... 12 | light: 13 | ... 14 | display: 15 | ... 16 | ehmtxv2: 17 | ... 18 | ``` -------------------------------------------------------------------------------- /wiki/home.md: -------------------------------------------------------------------------------- 1 | # Welcome to the EspHoMaTriXv2 wiki 2 | 3 | ## Usage examples 4 | 5 | - [Display a timer on your ehmtxv2](display-timer) 6 | - [weather display](weather-display) 7 | - [matrix used as "circle"](rotating-text) 8 | 9 | ## Configuration 10 | 11 | - [Ulanzi upside-down](rotate-ULANZI-display-180-degrees) 12 | - [Use all icons in your blueprint](use-icons-in-blueprints) 13 | - [Time & Date Formats](time-format) 14 | - [Blueprints for easier configuration](blueprints) 15 | - [time and date display](time-date-display) 16 | - [special clock and date display duration](special-clock-and-date-display-duration) 17 | - [set parameter on startup](startup-settings) 18 | - [fonts for the display](fonts) 19 | 20 | ## Problems 21 | 22 | - [Boot loop and Guru mediation error](gurumediationerror) 23 | 24 | ## Defective / Broken Ulanzi TC-001? 25 | 26 | - [Read this](broken-Ulanzi) 27 | -------------------------------------------------------------------------------- /wiki/mateinefont.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki/mateinefont.png -------------------------------------------------------------------------------- /wiki/mateinethinfont.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lubeda/EspHoMaTriXv2/46807489f058eadca5e2fefb2226a33097604546/wiki/mateinethinfont.png -------------------------------------------------------------------------------- /wiki/night-mode.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ```yaml 4 | globals: 5 | - id: night_mode 6 | type: "bool" 7 | restore_value: true 8 | initial_value: "false" 9 | 10 | time: 11 | ..... 12 | on_time: 13 | # Every morning 14 | - seconds: 0 15 | minutes: 30 16 | hours: 7 17 | then: 18 | - lambda: | 19 | id(night_mode) = false; 20 | # Every morning 21 | - seconds: 0 22 | minutes: 30 23 | hours: 21 24 | then: 25 | - lambda: |- 26 | id(night_mode) = true; 27 | 28 | 29 | 30 | ehmtx: 31 | on_empty_queue: 32 | then: 33 | lambda: |- 34 | if (id(night_mode)){ 35 | id(rgb8x32)->clock_screen(10,10,true,140,120,120); 36 | id(rgb8x32)->date_screen(10,5,true,120,200,150); 37 | } else { 38 | id(rgb8x32)->blank_screen(1,15); 39 | } 40 | ``` 41 | 42 | -------------------------------------------------------------------------------- /wiki/rotate-ULANZI-display-180-degrees.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** low 4 | 5 | To turn the display of the Ulanzi or any other device use the display settings: 6 | 7 | ```yaml 8 | display: 9 | - platform: addressable_light 10 | rotation: 180° 11 | ``` 12 | -------------------------------------------------------------------------------- /wiki/rotating-text.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** medium 4 | 5 | Assuming you are using a matrix with connected small sides like [this](https://github-production-user-asset-6210df.s3.amazonaws.com/18141890/243566536-eba5cc3b-3a4b-467f-8775-d291bcb61179.mp4) e.g. using this [case](https://www.printables.com/model/217568-led-matrix-lamp). 6 | 7 | Since 2023.6.4 you can set this option: 8 | 9 | ```yaml 10 | ehmtxv2: 11 | ... 12 | scroll_small_text: true 13 | ... 14 | ``` 15 | 16 | to display text thas is scrolled around the display even if it is short and normally should be centered. 17 | 18 | To display time you can use this automation: 19 | 20 | ```yaml 21 | service: esphome.m5mic_rainbow_text_screen 22 | data: 23 | default_font: false 24 | screen_time: 15 25 | lifetime: 1440 26 | text: |- 27 | {{ states("sensor.time") }} 28 | ``` 29 | 30 | or date 31 | 32 | ```yaml 33 | service: esphome.m5mic_rainbow_text_screen 34 | data: 35 | default_font: false 36 | screen_time: 15 37 | lifetime: 1440 38 | text: |- 39 | {{ now().strftime("%d.%m.%Y") }} 40 | ``` 41 | 42 | to remove the normal date and time display 43 | 44 | ```yaml 45 | service: esphome.m5mic_del_screen 46 | data: 47 | icon_name: "*" 48 | mode: 3 49 | ``` 50 | 51 | ```yaml 52 | service: esphome.m5mic_del_screen 53 | data: 54 | icon_name: "*" 55 | mode: 2 56 | ``` -------------------------------------------------------------------------------- /wiki/special-clock-and-date-display-duration.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | 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. 4 | 5 | What's the correct way? 6 | 7 | ## new Method with lambda: 8 | 9 | add this to your config: 10 | 11 | ```yaml 12 | on_start_running: 13 | then: 14 | lambda: |- 15 | ESP_LOGD(TAG, "removing date screen and setting a new one with new screen time"); 16 | id(rgb8x32)->del_screen("*", 3); 17 | id(rgb8x32)->date_screen(1440, 5, true, 192, 192, 192); 18 | ESP_LOGD(TAG, "removing default clock screen and setting a new one with new screen time"); 19 | id(rgb8x32)->del_screen("*", 2); 20 | id(rgb8x32)->clock_screen(1440, 55, true, 192, 192, 192); 21 | ``` 22 | 23 | ## old Method: 24 | 25 | **Skill-level:** easy 26 | 27 | Set up a timer helper named *eier_timer* 28 | 29 | ### step 1: **home assistant automation:** 30 | 31 | I think the easiest way is by a home assistant script like this: 32 | 33 | ```yaml 34 | alias: ulanzi 55-5 clock-date 35 | sequence: 36 | - service: esphome.ulanzi_del_screen 37 | data: 38 | icon_name: "*" 39 | mode: 2 40 | - service: esphome.ulanzi_clock_screen 41 | data: 42 | default_font: false 43 | lifetime: 1440 44 | screen_time: 55 45 | r: 192 46 | g: 192 47 | b: 192 48 | - service: esphome.ulanzi_del_screen 49 | data: 50 | icon_name: "*" 51 | mode: 3 52 | - service: esphome.ulanzi_date_screen 53 | data: 54 | default_font: false 55 | lifetime: 1440 56 | screen_time: 5 57 | r: 192 58 | g: 192 59 | b: 192 60 | mode: single 61 | icon: mdi:clock-digital 62 | ``` 63 | 64 | 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. 65 | 66 | This is also possible in the esphome YAML, with lambdas. 67 | -------------------------------------------------------------------------------- /wiki/startup-settings.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** medium 4 | 5 | ## Set parameters on device boot 6 | 7 | Since 2023.7.0 you can use a trigger with lambdas 8 | 9 | ```yaml 10 | ehmtxv2: 11 | ... 12 | on_start_running: 13 | then: 14 | lambda: |- 15 | ESP_LOGD(TAG, "remove default clock and set new color"); 16 | id(rgb8x32)->del_screen("*", 2); 17 | id(rgb8x32)->clock_screen(10,10,true,200,10,100); 18 | ``` -------------------------------------------------------------------------------- /wiki/sucess-stories.md: -------------------------------------------------------------------------------- 1 | # People who succesfully use EspHoMaTriX and EspHoMaTriXv2 2 | 3 | ## Videos in german 4 | - [Wetterwarnungen](https://smarthomeyourself.de/wiki/templates/alle-aktuelle-wetterwarnungen-in-home-assistant-ausgeben-mit-templates/) 5 | -------------------------------------------------------------------------------- /wiki/time-date-display.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | todo => adapt to 2023.8.0 4 | 5 | **Skill-level:** low 6 | 7 | EspHoMaTriXv2 is a pixel clock. With out any configuration it displays only the time and date. These are "build in", but can be widely configured [format](time-format). If you don't need the date-display, you can disable it with the parameter `show_date: false` in the YAML. Or if you don't want either time or date add `allow_empty_screen: true` to your yaml. 8 | 9 | During runtime, you can remove them from the queue with: 10 | 11 | ```yaml 12 | service: esphome.m5mic_del_screen 13 | data: 14 | icon_name: "*" 15 | mode: 3 16 | ``` 17 | 18 | ```yaml 19 | service: esphome.m5mic_del_screen 20 | data: 21 | icon_name: "*" 22 | mode: 2 23 | ``` 24 | 25 | and add them with: 26 | 27 | ```yaml 28 | service: esphome.m5mic_clock_screen 29 | data: 30 | default_font: true 31 | lifetime: 1440 32 | screen_time: 10 33 | r: 192 34 | g: 192 35 | b: 192 36 | ``` 37 | 38 | and 39 | ```yaml 40 | service: esphome.m5mic_date_screen 41 | data: 42 | default_font: true 43 | lifetime: 1440 44 | screen_time: 5 45 | r: 192 46 | g: 192 47 | b: 192 48 | ``` -------------------------------------------------------------------------------- /wiki/time-format.md: -------------------------------------------------------------------------------- 1 | # introduction 2 | 3 | **Skill-level:** low 4 | 5 | In the ehmtxv2: section of your yaml, you can change the format that the date and time are displayed. 6 | 7 | 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. 8 | 9 | ## Date formats 10 | 11 | Month.Day (02.28) 12 | 13 | ```yaml 14 | date_format: "%m.%d" 15 | ``` 16 | 17 | Day.Month (28.02) 18 | 19 | ```yaml 20 | date_format: "%d.%m" 21 | ``` 22 | 23 | Year.Month.Day (23.02.28) 24 | 25 | ```yaml 26 | date_format: "%y.%m.%d" 27 | ``` 28 | 29 | Abbreviated Month and Date (Feb 08) 30 | 31 | ```yaml 32 | date_format: "%b %d" 33 | ``` 34 | 35 | Abbreviated Day and Date (Tue 08) 36 | 37 | ```yaml 38 | date_format: "%a %d" 39 | ``` 40 | 41 | ## Time formats 42 | 43 | 24-hour time (23:15) 44 | 45 | ```yaml 46 | time_format: "%H:%M" 47 | ``` 48 | 49 | 12-hour time with padded hour (01:25PM) 50 | 51 | ```yaml 52 | time_format: "%I:%M%p" 53 | ``` 54 | 55 | 12-hour time with unpadded hour (1:25PM) 56 | 57 | ```yaml 58 | time_format: "%l:%M%p" 59 | ``` 60 | -------------------------------------------------------------------------------- /wiki/use-icons-in-blueprints.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** advanced 4 | 5 | When working with EspHoMaTriXv2, you will grow the variety of icons you use. 6 | 7 | If you like to use the comfort of the blueprints, you have to manually synchronize your icons to the blueprints. 8 | 9 | ## Step 1 10 | 11 | compile your YAML and copy a portion of the compilation result: 12 | 13 | ![screenshot](https://github.com/lubeda/EspHoMaTriXv2/blob/main/wiki/compile-icons.png?raw=true) 14 | 15 | ```yaml 16 | ["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","xmastree","sauna","trash_grey","trash_blue","trash_yell","trash_brow","weather_clear_night","weather_cloudy","weather_fog","weather_lightingrainy","weather_partlycloudy","weather_pouring","weather_rainy","weather_snowy","weather_snowy_rainy","weather_sunny","f_mario","f_onair","f_starter","mops","girl","timer","lasticon","lightbulb","home_assistant",] 17 | ``` 18 | 19 | ## Step 2 20 | 21 | copy this part to your blueprints, e.g., `EHMTX_extended_state.yaml` 22 | 23 | find the provided icon-list: 24 | 25 | ```yaml 26 |   icon_name: 27 |       name: The icon associated to this state screen? 28 |       description: If you use additional icons in your YAML, you have to add them to this blueprint. 29 |       selector: 30 |         select: 31 |           mode: dropdown 32 |           options: 33 |             [ 34 |               "error", 35 |               "home_assistant", 36 |               "temperature", 37 |               "lightbulb", 38 |               "music", 39 |               "phone", 40 |               "car", 41 |               "sleep8x32", 42 |             ] 43 | ``` 44 | 45 | and replace it with your copied version 46 | 47 | ```yaml 48 |   icon_name: 49 |       name: The icon associated to this state screen? 50 |       description: If you use additional icons in your YAML, you have to add them to this blueprint. 51 |       selector: 52 |         select: 53 |           mode: dropdown 54 |           options: 55 |             ["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","xmastree","sauna","trash_grey","trash_blue","trash_yell","trash_brow","weather_clear_night","weather_cloudy","weather_fog","weather_lightingrainy","weather_partlycloudy","weather_pouring","weather_rainy","weather_snowy","weather_snowy_rainy","weather_sunny","f_mario","f_onair","f_starter","mops","girl","timer","lasticon","lightbulb","home_assistant",] 56 | ``` 57 | 58 | Take care that the indentation is correct 59 | 60 | ## step 3 61 | 62 | Save the changed file and reload your automations 63 | 64 | ## step 4 65 | 66 | After checking if it is working, repeat the procedure for all blueprints using the icon dropdown 67 | 68 | ## sample for manual automation 69 | 70 | this automation example display states with icons and a rainbow colored text for state changes of multiple icons. 71 | The icon is selected by the `trigger.id`, the text is dynamicaly build by the triggered state. 72 | 73 | ```yaml 74 | alias: EHMTX State display 75 | trigger: 76 | - platform: state 77 | entity_id: sensor.001cac04_wind_speed 78 | id: wind 79 | - platform: state 80 | entity_id: sensor.tankerkoenig_super 81 | id: supere10 82 | condition: [] 83 | action: 84 | - service: esphome.ulanzi_rainbow_icon_screen 85 | data: 86 | icon_name: "{{trigger.id}}" 87 | screen_time: 12 88 | lifetime: 2 89 | text: '{{trigger.to_state.attributes.friendly_name}}: {{trigger.to_state.state}} 90 | {{trigger.to_state.attributes.unit_of_measurement}}|replace ("€","¼")| replace ("°C","¬")|replace ("℃","¬")| replace ("°F","¯")|replace ("℉","¯")|replace ("₴","¾")|replace ("₿","¨")|replace ("₩","½")|replace ("Ξ","¸")' 91 | default_font: true 92 | mode: parallel 93 | max: 2 94 | ``` 95 | 96 | ## warnings 97 | 98 | - If you remove icons from your list, old automations will probably use these icons, resulting in displaying the default icon! 99 | - If you don't use the correct indentation, your automations will fail. **No Backup, no compassion!** 100 | - The default icon must exist in your list. 101 | -------------------------------------------------------------------------------- /wiki/weather-display.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | **Skill-level:** medium 4 | 5 | Show weather state with icons that match the weather conditions. 6 | 7 | ## step 1: add icons to **ulanzi.yaml** 8 | 9 | ```yaml 10 | ...... 11 | ehmtx: 12 | icons: 13 | - id: weather_clear_night 14 | lameid: 53383 15 | - id: weather_cloudy 16 | frame_duration: 192 17 | lameid: 25991 18 | - id: weather_exceptional 19 | lameid: 16754 20 | - id: weather_fog 21 | lameid: 52167 22 | - id: weather_hail 23 | lameid: 53288 24 | - id: weather_lightning 25 | lameid: 23713 26 | - id: weather_lightning_rainy 27 | lameid: 49299 28 | - id: weather_partlycloudy 29 | frame_duration: 210 30 | lameid: 22160 31 | - id: weather_pouring 32 | lameid: 49300 33 | - id: weather_rainy 34 | lameid: 26565 35 | - id: weather_snowy 36 | lameid: 2289 37 | - id: weather_snowy_rainy 38 | lameid: 49301 39 | - id: weather_sunny 40 | lameid: 11201 41 | - id: weather_windy 42 | lameid: 15618 43 | - id: weather_windy_variant 44 | lameid: 15618 45 | - id: weather_cloudy_night 46 | lameid: 12195 47 | 48 | ``` 49 | 50 | ## Step 2: enter **home assistant automation:** 51 | 52 | ```yaml 53 | alias: EHMTXv2 Weather 54 | description: shows the local weatherdata with the icon based on cloud service 55 | trigger: 56 | - platform: state 57 | entity_id: weather.athome 58 | action: 59 | - service: esphome.ulanzi_del_screen 60 | data: 61 | icon_name: weather_* 62 | - service: esphome.ulanzi_add_screen 63 | data: 64 | icon_name: weather_{{ trigger.to_state.state | replace("-","_")}} 65 | text: >- 66 | {{ states("sensor.92bc04_actual_temperature") }}°C/{{ 67 | states("sensor.92bc04_wind_speed")}}km/h/{{ 68 | states("sensor.92bc04_humidity") }}% 69 | ``` 70 | 71 | ## Alternate Step 2: **Home Assistant Automation: Temperature & Icon (with OpenWeatherMap integration)** 72 | 73 | ```yaml 74 | - if: 75 | - condition: or 76 | conditions: 77 | - condition: state 78 | entity_id: sensor.openweathermap_condition 79 | state: cloudy 80 | - condition: state 81 | entity_id: sensor.openweathermap_condition 82 | state: partlycloudy 83 | - condition: or 84 | conditions: 85 | - condition: sun 86 | after: sunset 87 | - condition: sun 88 | before: sunrise 89 | then: 90 | - service: esphome.pixelclock_icon_screen 91 | data: 92 | default_font: true 93 | icon_name: cloudy_night 94 | text: "{{ states('sensor.openweathermap_temperature')|round(1) }}°" 95 | lifetime: 5 96 | screen_time: 3 97 | r: 192 98 | g: 192 99 | b: 192 100 | else: 101 | - service: esphome.pixelclock_icon_screen 102 | data: 103 | default_font: true 104 | icon_name: >- 105 | weather_{{ states('sensor.openweathermap_condition')|replace("-", 106 | "_") }} 107 | text: "{{ states('sensor.openweathermap_temperature')|round(1) }}°" 108 | lifetime: 5 109 | screen_time: 3 110 | r: 192 111 | g: 192 112 | b: 192 113 | ``` 114 | --------------------------------------------------------------------------------