From e932a086a7e6550d92911bd66fd32f6e338935fe Mon Sep 17 00:00:00 2001 From: LuBeDa Date: Sun, 16 Apr 2023 12:06:57 +0200 Subject: [PATCH] initial push --- .github/FUNDING.yml | 14 + .gitignore | 23 + 8x32 iMAGE.xcf | Bin 0 -> 7272 bytes CHANGELOG.md | 47 + EHMTXv2.ttf | Bin 0 -> 12504 bytes LICENSE | 2 +- README copy.md | 1122 ++++++++++++++++++++++++ README.md | 902 +++++++++++++++++++ TODO.md | 45 + Ulanzi-simple.yaml | 207 +++++ components/ehmtx/BP colored state.yaml | 239 +++++ components/ehmtx/BP del_screen.yaml | 212 +++++ components/ehmtx/EHMTX.cpp | 826 +++++++++++++++++ components/ehmtx/EHMTX.h | 227 +++++ components/ehmtx/EHMTX_icons.cpp | 37 + components/ehmtx/EHMTX_queue.cpp | 250 ++++++ components/ehmtx/__init__.py | 412 +++++++++ fullfeature.yaml | 164 ++++ images/booting.png | Bin 0 -> 591 bytes images/clock_screen.png | Bin 0 -> 637 bytes images/fullscreen.png | Bin 0 -> 709 bytes images/icon_screen.png | Bin 0 -> 695 bytes images/icon_screen_show.png | Bin 0 -> 708 bytes images/icons_preview.png | Bin 0 -> 40440 bytes images/sample.png | Bin 0 -> 70118 bytes images/text_screen.png | Bin 0 -> 619 bytes images/timingv2.png | Bin 0 -> 183518 bytes 27 files changed, 4728 insertions(+), 1 deletion(-) create mode 100644 .github/FUNDING.yml create mode 100644 .gitignore create mode 100644 8x32 iMAGE.xcf create mode 100644 CHANGELOG.md create mode 100644 EHMTXv2.ttf create mode 100644 README copy.md create mode 100644 README.md create mode 100644 TODO.md create mode 100644 Ulanzi-simple.yaml create mode 100644 components/ehmtx/BP colored state.yaml create mode 100644 components/ehmtx/BP del_screen.yaml create mode 100644 components/ehmtx/EHMTX.cpp create mode 100644 components/ehmtx/EHMTX.h create mode 100644 components/ehmtx/EHMTX_icons.cpp create mode 100644 components/ehmtx/EHMTX_queue.cpp create mode 100644 components/ehmtx/__init__.py create mode 100644 fullfeature.yaml create mode 100644 images/booting.png create mode 100644 images/clock_screen.png create mode 100644 images/fullscreen.png create mode 100644 images/icon_screen.png create mode 100644 images/icon_screen_show.png create mode 100644 images/icons_preview.png create mode 100644 images/sample.png create mode 100644 images/text_screen.png create mode 100644 images/timingv2.png diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..310f829 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,14 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +custom: ["https://www.paypal.com/donate/?hosted_button_id=FZDKSLQ46HJTU"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..669230d --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +components/ehmtx/__init__ copy._py +components/ehmtx/__pycache__/__init__.cpython-39.pyc +venv +.esphome/ +_icons/ +_fonts/ +secrets.yaml +esphome.ps1 +dev_*.yaml +ehmtx8266.yaml +info.de.md +components/ehmtx/select/__pycache__/__init__.cpython-39.pyc +ehmtx8266-rgb565.yaml +icons.html +components/ehmtx/__init__ copy.py +ehmtx8266-rgb565.yaml.html +ehmtx8266-rgb565-font.yaml +components/ehmtx/EHMTX_icons._cpp +.vscode/settings.json +ehmtx8266-select.yaml +svganimtest.html +servicetest +.DS_Store diff --git a/8x32 iMAGE.xcf b/8x32 iMAGE.xcf new file mode 100644 index 0000000000000000000000000000000000000000..2b8861657a2fb03212f111d9f9f17b19f0c8ed55 GIT binary patch literal 7272 zcmeHMO>7%Q6rNq%sd4k$BvsU;bed9{B01P`+B6XQLu+V7D^QDtKvmJk-nEz7-pD^q z!X+G#;Dm&bkaFWvq$F^QR1}E=2PCc>L4Ybwkt!ijp+BVd^1ay|XOlW<6jYQ}O#J4( zdGF2an>RCWev&qGV|*fM@GFsMlp%3IkO-tt0c`+9LDmiko&<{ksRQ5#oCoZ5Y0~Qi z+ypeG(R4Uz<#Kwygfb)Hj*|slE9ogdZk96qw6a!#_X!j(q(?O#5r5Hx5RcXoN4fYT@kDVZF%IJjZAgF`zU-2AhHTR(8{j)H?b zE;xASX$S9$I9TT0!j*1`1JhWMueQHb&Ss0rg0AOLVhsQq9UHKh=wt68chreb=?Q?O zdp&fIhYopY?xDAP=td9SpP>#dr@+-^nsLycc^>$tjts0oZT?TO>#WmOFZeKC zE`8NQfA7%0G8IEvA5{7Tt-)phg_wqDuM;zkl2zHD-FPiV_FI?=64aWv9_PRX7D(LBgRnDg% z*=L9Zq43?vvsCS94Y`f=Vy`i*e2Mqwth_afE$Ez{GRry157T$}5m!r;oXuyji!DLtIhshv@+2+}O*$&zX1dA3vlbM#084jwJ_@tK2`yXV*8&$B=i_+BLb=5(hi^kYX*agUC$T{GF#8&?fZePb zzt+Q)xP7e~qx?3rXCM*)(WM!PF4;2>U0NlwNn{I=?P*wifIdRJ9;_Wy#S#;vR2!)? zN$at@#?m8+C$+urDNx4=+>vVgtd0z2B>Bylju{60 zI&DlFHkih=j}(P4VBpRQB~m0<63QyOMapcIGQNTDG%)%ONcn-a>mWb|)&yZcM_wE1 zQOhb3S6nxM8vx`6niI4^uYS3pjrvh}xi}A7J*izpAD6*_Jwx99iAPb&z-q^{fs^*I zP_%>D(I8-L9KsC^nv2j_gyuRpv?w$WK=S}J*TJC!LeqvOc3FEJ9I^+=SUH_(tXgO- z^HJU8X|0^rN&KK8CY}Fkh~>1~>=}~!;z^xvc?!}E?yBy*Qbz_>XYKy;NU!Ss=n6gU z(Vz$D)&RVvhC1{wUkYeS%IgA68@evgbM0E!g`o{y7syjv`?4S&*VlRwxc_PpJKP@` zjt#B88VqgnYS8rsTr88EWA2LT`c4Xfr3_@(b;+M%zu=Yav zyA{B4oh4C+xDU%t_>}`FvQcV0jW-{?kS^f4i^>m*?2ppsEq4a$7gD#_*&Mp&1D{jw z7XQXtC8IhSmq$<7H2{wT$cIfQ%EfUllg(+x%R0*P09bS66nJ}ye~hHdCk8aPp)Ha_ z&s{9y9hYdTOV remove these from your yaml +- breaking: added indicator_on/off as default service => remove these from your yaml +- breaking: added alarm_color,text_color,clock_color as default service => remove these from your yaml +- breaking: gauge is also schown while the clock is displayed but without moving the screen to the right +- breaking: show_icons as default service => remove from yaml + +## 2023.3.4 + +- added: option to not display clock/date #53 +- added: dynamic set_show_clock +- added: on_next_clock trigger + +## 2023.3.3 + +- fixed: force_screen skips imediatly to the selected screen +- added: hold_time configurable + +## 2023.3.2 + +- added: hold_screen for 20 additional seconds + +## 2023.3.1 + +- added: del_screen with wildcards +- changed: maximum icons to 80 +- fixed: skip_next +- fixed: show_all_icons on boot + +## 2023.3.0 + +see README.md for features +e.g. Service **display_on** / **display_off** diff --git a/EHMTXv2.ttf b/EHMTXv2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0709311300c50765061316d86f6e77660916bc87 GIT binary patch literal 12504 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 S|AjYr^RvUFSMbX3`Trl2*cZzH literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE index 9bf165e..89109e5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 LuBeDa +Copyright (c) 2022,2023 LuBeDa Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README copy.md b/README copy.md new file mode 100644 index 0000000..b9e83e0 --- /dev/null +++ b/README copy.md @@ -0,0 +1,1122 @@ +# Warning + +This version is a "work in progress". So every may change and every thing will break. + +# EspHoMaTriX (ehmtx) + +A simple DIY status display, build with a flexible 8x32 RGB LED panel implemented with [esphome.io](https://esphome.io) + +![sample image](./images/sample.png) + +## Introduction + +There are some "RGB-matrix" status displays/clocks out there, the commercial one from Lametric and some very good DIY-alternatives. + +- [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 now in August 2022) +- [PixelIt](https://docs.bastelbunker.de/pixelit/) (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 other DIY 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. The main reason, for me is the Home Assistant integration! + +There is a little hype around the Ulanzi TC001 pixel clock. This hardware can be used with **EspHoMaTriX** (with some limitations). You can connect the device and flash it via USB-C. As a starting point you can use the [``UlanziTC001.yaml``](https://github.com/lubeda/EsphoMaTrix/blob/main/UlanziTC001.yaml). Yet the LDR and battery sensor are not perfectly supported. For another use of the hardware see [PixelIT_Ulanzi](https://github.com/aptonline/PixelIt_Ulanzi) or [AWTRIX-LIGHT](https://github.com/Blueforcer/awtrix-light) firmwares. + +### ehmtx in the media + +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). + +Another german tutorial video focused at the Ulanzi [Smarte Pixel Clock über Home Assistant steuern - Entitäten / Icons und mehr in der Ulanzi](https://www.youtube.com/watch?v=LgaT0mNbl34) + +See this [nice article](https://blakadder.com/esphome-pixel-clock/) about EsphoMaTrix on a Ulanzi TC001 from [blakadder](https://github.com/blakadder). + +Short video on Instagram [@blak_adder](https://www.instagram.com/reel/CpYVByRIaSI) +https://www.instagram.com/reel/CpYVByRIaSI + +See this english discussions: +[Share your projects](https://community.home-assistant.io/t/esphomatrix-a-simple-clock-status-display/425325) +[ESPHOME](https://community.home-assistant.io/t/a-simple-diy-status-display-with-an-8x32-rgb-led/379051) + +Or in german: +[Showroom](https://community.simon42.com/t/8x32-pixel-uhr-mit-homeassistant-anbindung/1076) + +### State + +It is a working solution with core functionality coded. Advanced features, like automatic brightness control can be done with esphome actions and automations. The possibilities are endless. + +### Features + +Based a on a 8x32 RGB flexible 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)). 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. When a screen is active it is displayed so that the text can scroll two times (`scroll_count`) or even longer for `screen_time` seconds. + +You can use the [fullfeature.yaml](https://github.com/lubeda/EsphoMaTrix/blob/main/fullfeature.yaml) as sample for an ESP8266. As mentioned you have to edit to your needs. So check font, icons, board and the GPIO pins for your display. + +The file [ulanziTC001.yaml](https://github.com/lubeda/EsphoMaTrix/blob/main/ulanziTC001.yaml) uses the functions ehmtx provides, optimized for the Ulanzi Hardware. + +See it in action on [YouTube](https://www.youtube.com/watch?v=ZyaFj7ArIdY) (no sound but subtitles). + +## Installation + +### **EsphoMaTrix** custom component + +**EsphoMaTrix** is a custom component, you have to include it in your yaml configuration. To always use the newest features you should use the repo, to use a stable version you copy a working version to your esphome installation. + +#### local use + +If you download the components-folder from the repo and install it in your esphome you have a stable installation. But if there are new features, you won't see them. If needed customize the yaml to your folder structure. + +```yaml +external_components: + - source: + type: local + path: components # e.g. /config/esphome/components +``` + +#### use from repo + +Use the github repo as component. Esphome refreshes the external components "only" once a day, perhaps you have to refresh it manually. In this mode there may be breaking changes, so read the changelog and check to logs while installing the firmware. + +```yaml +external_components: + - source: + type: git + url: https://github.com/lubeda/EsphoMaTrix + ref: main # optional select a special branch or tag +``` + +### Addressable_light component + +The **EsphoMaTrix** component requires a 8x32 pixel addressable_light, it is referenced by the id `matrix_component`. + +See the default [options](https://esphome.io/components/display/index.html) + +There are some different matrices-types on the market, to adapt them to **EspHoMaTriX** you have to find the proper pixelmapper. If there is garbage on your display try the other `pixel_mapper`. Here are the most common types for flexible 8x32 matrices: + +#### Type 1 + +under the display tag specify this pixelmapper: + +```yaml +display: + - platform: addressable_light + ..... + pixel_mapper: |- + if (x % 2 == 0) { + return (x * 8) + y; + } + return (x * 8) + (7 - y); + ..... +``` + +#### Type 2 (e.g. Ulanzi TC001) + +Under the display tag specify this pixelmapper: + +```yaml +display: + - platform: addressable_light + ..... + pixel_mapper: |- + if (y % 2 == 0) { + return (y * 32) + x; + } + return (y * 32) + (31 - x); + ..... +``` + +You have to configure this `lambda` under the `display:` section to use the **EsphoMaTrix** component + +```yaml +display: + - platform: addressable_light + id: ehmtx_display + ..... + auto_clear_enabled: true + lambda: |- + id(rgb8x32)->tick(); + id(rgb8x32)->draw(); +``` + +### Light component + +The light component is used by the addressable_light component and referenced by id under `addressable_light_id:`. + +To use the light component directly from home assistant add the sample lambdas```on_turn_on``` and ```on_turn_off``` to the light component. + +***Sample*** + +```yaml +light: + - platform: neopixelbus + id: ehmtx_light + .... + on_turn_on: + lambda: |- + id(rgb8x32)->set_enabled(false); + on_turn_off: + lambda: |- + id(rgb8x32)->set_enabled(true); +``` + +To hide the light component from home assistant use: `internal: true` + +```yaml +light: + - platform: neopixelbus + id: ehmtx_light + internal: true + ... +``` + +### Time component + +Since it is a clock you need a time component e.g. [homeassistant](https://esphome.io/components/time/homeassistant.html). It is referenced by its id under `time_component:` The display shows `!t!` until the time source is synchronized and valid. + +### Font +Download a small "pixel" TTF-font, i use ["monobit.ttf"](https://www.google.com/search?q=monobit.ttf). You can modify this font with [FontForge](https://fontforge.org/) and added **€** on base of a **E** and so on. Due to copyright I can't provide my modified version :-(. Not all fonts are suitable for this minimalistic display. There are public domain fonts wich work well on the display e.g. [DMDSmall](https://www.pentacom.jp/pentacom/bitfontmaker2/gallery/?id=5993), details on alternative fonts are [here](https://blakadder.com/esphome-pixel-clock/#fonts). + +DarkPoet78 is providing special fonts for 8x32 matrices in his [repo](https://github.com/darkpoet78/MatrixClockFonts) + +```yaml +font: + - file: monobit.ttf + id: EHMTX_font + size: 16 + glyphs: | + !"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz€@ +``` + +### Icons and Animations + +Download and install all needed icons (.jpg/.png) and animations (.gif) under the `ehmtx:` key. All icons have to be 8x8 or 8x32 pixels in size. If necessary scale them with gimp, check "as animation" for gifs. + +You can also specify an URL to directly download the image file. The URLs will only be downloaded once at compile time, so there is no additional traffic on the hosting website. + +There are maximum 90 icons possible. + +***Sample*** + +```yaml +emhtx: + icons: + - id: boot + file: icons/rocket.gif + duration: 75 + - id: temp + file: temperature.png + - id: yoga + file: icons/yoga-bridge.gif + pingpong: true + - id: garage + file: garage.gif + duration: 100 + - id: homeassistant + url: https://github.com/home-assistant/assets/raw/master/logo/logo-small.png +``` + +The id of the icons is used later to configure the screens to display. So you should name them wisely. If you like to group icons you should prefix them e.g. with "weather_" (see Service **del_screen**) + +The first defined icon will be used as a fallback icon, in case of an error, e.g. if you use a non-existing icon id. + +GIFs are limited to 110 frames to limit the used amount of flash space. + +All other solutions provide ready made icons, especially Lametric has a big database of [icons](https://developer.lametric.com/icons). Please check the copyright of the icons you use. The maximum amount of icons is limited to 90 in the code and also by the flash space and the RAM of your board. + +See also [icon parameter](#icons) + +## Configuration + +### ehmtx component + +This component is highly customizable. + +***Example*** + +``` +ehmtx: + id: rgb8x32 + time_component: ehmtx_time + matrix_component: ehmtx_display + clock_time: 5 # seconds + screen_time: 8 # seconds + font_id: ehmtx_font + show_dow: true # day of week + show_date: true # also show the date + icons2html: false # generate html with con overview + brightness: 80 # percent + time_format: "%H:%M" + date_format: "%d.%m." + week_start_monday: true # false equals sunday + xoffset: 1 + yoffset: 2 + scroll_count: 2 # scroll long text at least two times + scroll_interval: 80 # milliseconds + frame_interval: 192 # milliseconds +``` +***Parameters*** + +**id** (required, ID): Manually specify the ID used for code generation and in service definitions. + +**clock_time** (optional, seconds): duration to display the clock after this time the date is display until next "show_screen". If `show_date` is false and `clock_time` > 0 the clock will be display as long as a normal screen! Setting `clock_time` to 0 will not show the clock or date. If there are no screens ind the queue the display will be blank until the next screen is sent. + +![timing](./images/timing.png) + +**screen_time** (optional, seconds): default duration to display a screen or a clock/date sequence, a long text will be scrolled at least `scroll_count` times (default: 10 seconds). This may be overwritten by the add_screen service. + +**hold_time** (optional, seconds): extends the display time of the current screen in seconds (default=20). Used in services or automations, see `hold_screen` + +**date_format** (optional, string): formats the date display with [strftime syntax](https://esphome.io/components/time.html?highlight=strftime), defaults `"%d.%m."` (use `"%m.%d."` for the US) + +**show_seconds** (optional, boolean): toggle an indicator for seconds while the clock is displayed (default: false)) + +**time_format** (optional, string): formats the date display with [strftime syntax](https://esphome.io/components/time.html?highlight=strftime), defaults `"%H:%M"` (use `"%I:%M%p"` for the US) + +**yoffset** (optional, pixel): yoffset the text is aligned BASELINE_LEFT, the baseline defaults to `6` + +**xoffset** (optional, pixel): xoffset the text is aligned BASELINE_LEFT, the left defaults to `1` + +**matrix_component** (required, ID): ID of the addressable display + +**show_dow** (optional, bool): draw the day of week indicator on the bottom of the clock screen. Disable e.g. if you want larger fonts, defaults to true. + +**show_date** (optional, bool): if true, show the date for `screen_time - clock_time` seconds otherwise only shows the clock for `screen_time` seconds, defaults to true. + +**time_component** (required, ID): ID of the time component. The display shows `!t!` until the time source is valid. + +**font** (required, ID): ID of the font component + +**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``` from the [display](https://esphome.io/components/display/addressable_light.html) + +**frame_interval** (optional, ms): the interval in ms to display the next animation/icon frame (default = 192), should be a multiple of the ```update_interval``` from the [display](https://esphome.io/components/display/addressable_light.html). Can be overwritten per icon/gif see [icons](#icons-and-animations) parameter `frame_duration` + +**icons2html** (optional, boolean): If true, generate the html (_filename_.html) file to show all included icons. (default = `false`) + +***Example output:*** +![icon preview](./images/icons_preview.png) + +### icons + +***Parameters*** +See [icon details](#icons-and-animations) + +- **frame_duration** (optional, ms): in case of a gif file the component tries to read the default interval for each frame. The default/fallback interval is 192 ms. In case you need to override the default value set the duration per icon. +- **pingpong** (optional, boolean): in case of a gif file you can reverse the frames instead of starting from the first frame. + +- **file** (Exlusive, filename): a local filename +- **url** (Exclusive, url): an URL to download the icon +- **lameid** (Exclusive, number): the ID from the lametric icon database + +## Control your display + +A lot of features are accessible with actions, you can use in your yaml + +### Local actions/lambdas + +#### Show all icons on your matrix + +This code shows all icons once on boot up, depending on the amount of your icons it can take a while to see them all. + +```yaml +esphome: + .... + on_boot: + priority: -100 + # ... + then: + - lambda: !lambda |- + id(rgb8x32)->show_all_icons(); +``` + +--- + +#### Add screen to your display queue + +You can add screens locally and display data directly from any local sensor. See this sample: + +##### Lambda + +Take care that the ```char text[30];``` has enough space to store the formated text. + +```yaml +sensor: + - platform: bh1750 + id: sensorlx + ... + on_value: + then: + lambda: |- + char text[30]; + sprintf(text,"Light: %2.1f lx", id(sensorlx).state); + // 5 Minutes,each time at least 11 seconds,no alarm + id(rgb8x32)->add_screen("sun", text, 5,11, false); +``` + +##### Action + +```yaml +sensor: + - platform: bh1750 + id: sensorlx + ... + on_value: + then: + - ehtmx.add.screen + id: rgb8x32 + icon_name: "sun" + text: "new data from lux sensor" + lifetime: 5 # minutes optional + screen_time: 35 # seconds optional + alarm: true # optional +``` + +***Parameters*** + +- **id** (required, ID): ID of the ehmtx component +- **text** (required, string): the text to display +- **icon_name** (required, string): the name of the icon to display +- **lifetime** (optional, int): the lifetime of the screen in minutes (default=5) +- **screen_time** (optional, int): the display time of a screen per loop in seconds (default=10) +- **alarm** (optional, bool): if alarm set true (default = false) + +--- + +#### Set (alarm/clock/gauge/text/today/weekday) color action + +Sets the color of the selected element + +##### Lambda set text color + +```yaml + lamda: + id(rgb8x32)->set_text_color(200,45,12); +``` + +##### Action for set text color + +You have to use use id of your ehmtx component, e.g. `rgb8x32` + +```yaml + - ehmtx.***.color: + id: rgb8x32 + red: !lambda return r; + green: !lambda return g; + blue: !lambda return b; +``` + +valid elements: + +- `ehmtx.alarm.color:` +- `ehmtx.clock.color:` +- `ehmtx.gauge.color:` +- `ehmtx.text.color:` +- `ehmtx.today.color:` +- `ehmtx.weekday.color:` +- ```red, green, blue```: the color components (`0..255`) *(default = `80`)* + +--- + +#### Set screen color action + +Sets the color of the **active** screen in the queue, so it's best to use it directly after add_screen. + +##### Lambda for set_screen + +```yaml + lamda: + id(rgb8x32)->set_screen_color("sun",200,45,12); +``` + +##### Action for set_screen + +You have to use use id of your ehmtx component, e.g. `rgb8x32` + +```yaml + - ehmtx.screen.color: + id: rgb8x32 + icon_name: sun + red: !lambda return r; + green: !lambda return g; + blue: !lambda return b; +``` + +- ```icon_name```: name of the actual icon/screen +- ```red, green, blue```: the color components (`0..255`) _(default = `80`)_ + +--- + +##### Show date + +You can dynamically enable or disable the display of the date see parameter `show_date`. + +```yaml + - ehmtx.show.date: + id: rgb8x32 + flag: !lambda return true; +``` + +##### Show day of week + +You can dynamically enable or disable the display of the day of week, see parameter `day_of_week`. + +```yaml + - ehmtx.show.dayofweek: + id: rgb8x32 + flag: !lambda return true; +``` + +##### Force screen + +Force the selected screen ```icon_name``` to be displayed next. Afterwards the loop is continuing from this screen. e.g. helpfull for alarms. Or after an update of the value/text. + +```yaml + - ehmtx.force.screen: + id: rgb8x32 + icon_name: !lambda return icon_name; +``` + +##### Change configuration during runtime + +_Configuration variables/functions:_ + +Experienced programmers can use this public methods: + +```c + void draw_day_of_week(); + void show_all_icons(); + void get_status(); + void skip_screen(); + void hold_screen(); + void set_screen_time(uint16_t t); + void set_clock_time(uint16_t t); + void set_hold_time(uint16_t t); + void set_show_day_of_week(bool b); + void set_show_seconds(bool b); + void set_show_date(bool b); + void set_brightness(int b); // int because of register_service! + uint8_t get_brightness(); + void add_screen(std::string icon_name, std::string text, int lifetime, int screen_time); + void set_screen_color(std::string icon_name,int r, int g, int b); + void del_screen(std::string icon_name); + void set_frame_interval(uint16_t interval); + void set_scroll_interval(uint16_t interval); + void set_scroll_count(uint8_t count); + void set_indicator_off(); + void set_indicator_on(int r, int g, int b); + void set_gauge_off(); + void set_gauge_value(int v); // valid: 0 - 100 int because of register_service + void set_gauge_color(int r, int g, int b); + void set_text_color(int r, int g, int b); + void set_clock_color(int r, int g, int b); + void set_today_color(int r, int g, int b); + void set_weekday_color(int r, int g, int b); + void set_alarm_color(int r, int g, int b); + void draw_gauge(); + void set_display_on(); + void set_display_off(); +``` + +***Sample*** + +You can set values during runtime e.g. for a night mode + +```yaml +# sample for ulanzi tc001 +binary_sensor: + - platform: gpio + pin: + number: $left_button_pin + inverted: true + on_press: + - logger.log: "Clock on" + - lambda: + id(rgb8x32)->set_clock_time(6); + name: "clock on" + - platform: gpio + pin: + number: $right_button_pin + inverted: true + name: "Clock off" + on_press: + - logger.log: "clock off" + - lambda: + id(rgb8x32)->set_clock_time(0); +``` + +### Local trigger + +To use the display without homeassistant automations, you may use the [advanced functionality](#change-configuration-during-runtime) with triggers. The triggers can be fired by sensors, time or by the ehmtx component. + +#### on_next_screen +There is a trigger available to do some local magic. The trigger ```on_next_screen``` is triggered every time a new screen is displayed (it doesn't trigger on the clock/date display!!). In lambda's you can use two local string variables: + +**x** (Name of the icon, std::string): value to use in lambda + +**y** (displayed text, std::string): value to use in lambda + +See the examples: + +##### Write information to esphome log + +```yaml +ehmtx: + .... + on_next_screen: + lambda: |- + ESP_LOGD("TriggerTest","Iconname: %s",x.c_str()); + ESP_LOGI("TriggerTest","Text: %s",y.c_str()); +``` + +##### Change the text color like crazy + +```yaml +ehmtx: + .... + on_next_screen: + lambda: |- + id(rgb8x32)->set_text_color(rand() % 255, rand() % 255, rand() % 255); +``` + +##### Send an event to Home Assistant + +To send data back to home assistant you can use events. + +```yaml +ehmtx: + .... + on_next_screen: + - homeassistant.event: + event: esphome.next_screen + data_template: + iconname: !lambda "return x.c_str();" + text: !lambda "return y.c_str();" +``` + +***Result*** + +![events](./images/events.png) + +#### on_next_clock +The trigger ```on_next_clock``` is triggered every time a new clock display circle starts. +See the examples: + +##### Change Clock colors like crazy for each clock circle + +```yaml +ehmtx: + .... + on_next_clock: + lambda: |- + id(rgb8x32)->set_clock_color(rand() % 255, rand() % 255, rand() % 255); + id(rgb8x32)->set_weekday_color(rand() % 255, rand() % 255, rand() % 255); + id(rgb8x32)->set_today_color(rand() % 255, rand() % 255, rand() % 255); +``` + +***Example*** + +```yaml +api: + services: + - service: alarm + variables: + icon_name: string + text: string + then: + lambda: |- + id(rgb8x32)->add_screen(icon_name, text, 7,20, true); // 7 minutes lifetime/screen time 20 sec/alarm=true +``` + +**(D)** Service **brightness** + +Sets the overall brightness of the display (`0..255`) + +_parameters:_ + +- ```brightness```: from dark to bright (`0..255`) (default = `80`) as set in the light component by ```color_correct: [30%, 30%, 30%]``` + +There's an easier way by using a number component: + +```yaml +number: + - platform: template + name: "LED brightness" + min_value: 0 + max_value: 255 + step: 1 + lambda: |- + return id(rgb8x32)->get_brightness(); + set_action: + lambda: |- + id(rgb8x32)->set_brightness(x); +``` + +Service **screen** (defined in yaml) + +Queues a screen with an icon/animation and a text. There can only be one text per icon id. If you need to show e.g. an indoor and an outdoor temperature you have to use different icon id's! + +You can update the text on the fly. If the screen is displayed and you change the text for the icon, it will start a new lifetime (see ```lifetime```) with the new text. + +_parameters:_ + +- ```icon_name```: The number of the predefined icons (see installation) +- ```text```: The text to be displayed + +_definition:_ +```yaml +api: + services: + - service: screen + variables: + icon_name: string + text: string + then: + - lambda: |- + id(rgb8x32)->add_screen(icon_name,text,5,10,false); +``` + +Service **alarm** (defined in yaml) + +Alarm is like a regular screen but it is displayed two minutes longer and has a red text color and a red marker in the upper right corner. + +_parameters:_ + +- ```icon_name```: The name of the predefined icon id (see installation) +- ```text```: The text to be displayed + +_definition:_ +```yaml +api: + services: + - service: alarm + variables: + icon_name: string + text: string + then: + - lambda: |- + id(rgb8x32)->add_screen(icon_name,text,10,30,true); + id(rgb8x32)->force_screen(icon_name); +``` + +**(D)** Service **del_screen** + +Removes a screen from the display by icon name. If this screen is actually display while sending this command the screen will be displayed until its "show_screen"-time has ended. + +optionally you can suffix a * to the icon name to perform a wildcard delete which will delete all screens beginning with the icon_name specified. + +For example if you have multiple icons named weather_sunny, weather_rain & weather_cloudy, you can issue a del_screen weather_* to remove whichever screen is currently in a slot and replace it with a new weather screen. + +_parameters:_ + +- ```icon_name```: Icon `id` defined in the yaml (see installation) + +**(D)** Service **indicator_on** / **indicator_off** + +Turns indicator on/off + +Display a colored corner on all screens and the clock. You can define the color by parameter. + +_parameters:_ + +- ```r``` red in 0..255 +- ```g``` green in 0..255 +- ```b``` blue in 0..255 + +**(D)** Service **alarm_color** / **clock_color** / **gauge_color** / **text_color** / **today_color** / **weekday_color** + +Set the color of the named text-type + +_parameters:_ + +- ```r``` red in 0..255 +- ```g``` green in 0..255 +- ```b``` blue in 0..255 + +**(D)** Service **display_on** / **display_off** + +Turns the display on or off + +There's an easier way in using a switch component: + +***Sample*** + +```yaml +switch: + - platform: template + name: "$devicename Display" + icon: "mdi:power" + restore_mode: ALWAYS_ON + lambda: |- + return id(rgb8x32)->show_display; + turn_on_action: + lambda: |- + id(rgb8x32)->set_display_on(); + turn_off_action: + lambda: |- + id(rgb8x32)->set_display_off(); +``` + +Service **skip_screen** + +If there is more than one screen in the queue, skip to the next screen. + +e.g. on the Ulanzi TC001 + +```yaml +binary_sensor: + - platform: gpio + pin: + number: $left_button_pin + inverted: true + on_press: + lambda: + id(rgb8x32)->skip_screen(); +``` + +Service **hold_screen** + +Displays the current screen for configured ammount (see **hold_time**) (default=20) seconds longer. + +e.g. on the Ulanzi TC001 + +``` +binary_sensor: + - platform: gpio + pin: + number: $right_button_pin + inverted: true + on_press: + lambda: + id(rgb8x32)->hold_screen(); +``` + +**(D)** Service **status** + +This service displays the running queue and a list of icons in the logs + +```log +[13:10:10][I][EHMTX:175]: status status: 1 as: 1 +[13:10:10][I][EHMTX:176]: status screen count: 3 +[13:10:10][I][EHMTX:181]: status slot: 0 icon: 36 text: 47.9°C end: 400 +[13:10:10][I][EHMTX:181]: status slot: 1 icon: 23 text: Supa langer Text end: 310 +[13:10:10][I][EHMTX:181]: status slot: 2 icon: 1 text: 10.3°C end: 363 +[13:10:10][I][EHMTX:186]: status icon: 0 name: boot +[13:10:10][I][EHMTX:186]: status icon: 1 name: temp +[13:10:10][I][EHMTX:186]: status icon: 2 name: garage +[13:10:10][I][EHMTX:186]: status icon: 3 name: wind +[13:10:10][I][EHMTX:186]: status icon: 4 name: rain +``` + +**(D)** Service **show_all_icons** + +Display all of your icons sequentially by ID. + +Service **gauge_value** / **gauge_off** + +**(D)** Turns gauge on/off +Displays a colored gauge at the left side of the display. You can define the color by parameter. + +_parameters:_ + +- ```percent``` gauge percentage + +## Integration in Home Assistant + +To control your display it has to be integrated in Home Assistant. Then it provides a number of services, all prefixed with the configured `devicename` e.g. "ehmtx". See the default services marked as **(D)** [above](#services), but you can add your own (see alarm and screen). + +### Services + +All communication with Home Assistant use the homeasistant-api. The services can be provided by default or also defined additionally in the yaml. To define the additional services you need the id of the ehmtx-component e.g. ```id(rgb8x32)```. + +#### Overview of default services + +These services are the same as the local services, so you can adapt the documentation there + + |name|parameter| + |----|----| + |`get_status`|*none*| + |`set_display_on`|*none*| + |`set_display_off`|*none*| + |`show_all_icons`|*none*| + |`hold_screen`|*none*| + |`set_indicator_on`| {"r", "g", "b"}| + |`set_indicator_off`|*none*| + |`set_gauge_value`| {"percent"}| + |`set_gauge_off`|*none*| + |`set_alarm_color`| {"r", "g", "b"}| + |`set_text_color` | {"r", "g", "b"}| + |`set_clock_color`| {"r", "g", "b"}| + |`set_today_color`| {"r", "g", "b"}| + |`set_gauge_color`| {"r", "g", "b"}| + |`set_weekday_color` |{"r", "g", "b"}| + |`set_screen_color` |{"icon_name","r", "g", "b"}| + |`add_screen` |{"icon_name", "text", "lifetime","screen_time", "alarm"}| + |`force_screen`| {"icon_name"}| + |`del_screen`| {"icon_name"}| + |`set_brightness`| {"value"}| + +### Use in Home Assistant automations + +The easiest way to use ehmtx as a status display is to use the icon names as trigger id. In my example i have an icon named "wind" when the sensor.wind_speed has a new state this automation sends the new data to the screen with the icon named "wind" and so on. + +```yaml +alias: EHMTX 8266 Test +description: '' +trigger: + - platform: numeric_state + entity_id: sensor.wind_speed + id: wind + - platform: state + entity_id: sensor.actual_temperature + id: temp + - platform: state + entity_id: sensor.wg_cover_device + id: cover +condition: [] +action: + - service: esphome.ehmtx8266_screen + data: + icon_name: '{{trigger.id}}' + text: >- + {{trigger.to_state.state}}{{trigger.to_state.attributes.unit_of_measurement}} +mode: queued +max: 10 +``` + +## How to update + +Since version **2023.4.0** was a massive cleanup, you may have to check your yaml and your automations for all breaking changes. + +### repairs + +![sample repair](./images/repair.png "Sample repair dialog. because of changed service definitions") + +mostly you have to check your automations if the [service](#overview-of-default-services) definitions have changed + +### compile errors +![compile_error](./images/compile_error.png "Sample compile error. the naming has changed") + +|old name|new name| +|----|----| +|display8x32|matrix_component| +|show_clock|clock_time| +|show_screen|screen_time| +|time|time_component| +|html|icons2html| + +--- + +![icon_error](./images/icon_error.png "changed icon parameter") + +|old name|new name| +|----|----| +|duration|frame_duration| + +--- + +Old functions in yaml +![old_add_screen](./images/old_add_screen.png "old functions in yaml file") + +**old function style** + +```yaml +api: + services: + - service: alarm + variables: + icon_name: string + text: string + then: + - lambda: |- + id(rgb8x32)->add_screen(icon_name,text,7,true); + - ehmtx.force.screen: + icon_name: !lambda return icon_name; +``` +the old `add_screen` function had 4 parameter, the new one has got 5. + +**correct code** + +```yaml +# Enable Home Assistant API +api: #!include ehmtx_service.yaml + services: + ..... + then: + - lambda: |- + id(rgb8x32)->add_screen(icon_name,text,7,30,true); + ..... +``` +### old options +![duration and select](./images/duration_select.png "Duration and ehmtxselect were removed in this version") + +Remove these entries. + + +#### Display precision after home assistant 2023.3.0 + +See [templating](https://www.home-assistant.io/docs/configuration/templating/#states) for possibilities to optimize the output +e.g. +```{{ states(sensor.solarpower, rounded=True) }} kWh``` + +### Specific icons per condition + +Add an icon per weather condition to the ehmtx component + +```yaml + - id: weather_clear_night + lameid: 52163 + - id: weather_cloudy + lameid: 25991 + - id: weather_fog + lameid: 52167 + ...... +``` + +Sample automation to show the weather with local temperature + +```yaml +alias: EHMTX weather +description: weather with icon per condition +trigger: + - platform: state + entity_id: weather.metno +action: + - service: esphome.ulanzi_del_screen + data: + icon_name: weather_* + - service: esphome.ulanzi_screen + data: + icon_name: weather_{{ trigger.to_state.state }} + text: >- + {{ states("sensor.external_actual_temperature") }}°C +``` + +or another sample automation for the trashcan type + +```yaml +alias: "EHMTX Müllanzeige" +description: Anzeige welche Tonne raus muss. iconnamen gekürzt +trigger: + - platform: time + at: + - "06:30" + - "08:30" + - "10:30" + - "15:00" + - "17:00" + - "19:00" +condition: + - condition: numeric_state + entity_id: sensor.mulltrigger + below: "3" +action: + - service: esphome.ulanzi_del_screen + data: + icon_name: trash_* + - data: + icon_name: >- + trash_{{ states("sensor.mulldetails") | replace("Biotonne", "brow")| + replace("Papiertonne","blue")| replace("Restmüll", "grey")| + replace("gelbe Tonne","yell|") | truncate(4,true,"") }} + text: >- + {{ states("sensor.mulldetails")|replace(" in","")|replace(" days"," + Tagen") | replace ("0 Tagen","heute") | replace ("1 Tagen","morgen")}} + duration: 120 + service: esphome.ulanzi_screen +mode: single +``` + +Prerequisites: This works since 2023.3.1 thanx to @andrew-codechimp for the new del_screen + +### Integrate in Home Assistant UI + +Add entities to Home Assistant UI for interactive control of your display + +#### Brightness + +```yaml +number: + - platform: template + name: "$devicename brightness" + min_value: 0 + max_value: 255 + step: 1 + lambda: |- + return id(rgb8x32)->get_brightness(); + set_action: + lambda: |- + id(rgb8x32)->set_brightness(x); +``` + +#### Display switch + +```yaml +switch: + - platform: template + name: "$devicename Display" + icon: "mdi:power" + restore_mode: ALWAYS_ON + lambda: |- + return id(rgb8x32)->show_display; + turn_on_action: + lambda: |- + id(rgb8x32)->set_display_on(); + turn_off_action: + lambda: |- + id(rgb8x32)->set_display_off(); +``` + +## Buzzer, sound, buttons and automatic brightness + +Awtrix and PixelIt have hardcoded functionality. EHMTX is also capable to build something like that by lambdas. But this is all your freedom. + +Example: automatic brightness control with an bh1570 sensor + +```yaml +sensor: + - platform: bh1570 + # ... + on_value: + then: + lambda: |- + if (x > 200) + { + id(rgb8x32)->set_brightness(50); + } else { + id(rgb8x32)->set_brightness(250); + } +``` + +## Notifier Custom Component +There is an optional [notifier custom component](https://github.com/lubeda/EHMTX_custom_component) you can install with [HACS](https://hacs.xyz/). It is comparable to the **_screen** service but more streamlined. + +## Breaking changes + +- 2022.6.1 removed image types only `rgb565` is valid! +- 2023.2.0 removed awtrix icon `awtrixid` support +- 2023.3.5 removed automatic scaling of images and animations +- 2023.3.5 added status,display_on,display_off as default service => remove these from your yaml +- 2023.3.5 added indicator_on/off as default services => remove these from your yaml +- 2023.3.5 added *_color as default services => remove these from your yaml +- 2023.3.5 added show_all_icons,gauge_percent/gauge_off as default services => remove these from your yaml +- 2023.4.0 **cleaner naming** please check all automations and yaml for change naming!!! +- 2023.4.0 removed the select component + +## Usage +The integration works with the Home Assistant api so, after boot of the device, it takes a few seconds until the service calls start working. + +## Disclaimer + +THE SOFTWARE IS PROVIDED "AS IS", use at your own risk! + +## Thanks + +- **[blakadder](https://github.com/blakadder)** for his contribution (cleanup README.md,fixed sample) +- **[andrew-codechimp](https://github.com/andrew-codechimp)** for his contribution (display on/off & del_screen "*" & show_clock with 0) +- **[jd1](https://github.com/jd1)** for his contributions +- **[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 +- ** everbody that found bugs/issues and reported them! + +## Special thanks to all sponsors diff --git a/README.md b/README.md new file mode 100644 index 0000000..9272f32 --- /dev/null +++ b/README.md @@ -0,0 +1,902 @@ +# EspHoMaTriX version 2 (EHMTXv2) + +A simple but very flexible DIY status display, build with a flexible 8x32 RGB LED panel implemented with [esphome.io](https://esphome.io) + +![sample image](./images/sample.png) + +## Important information + +If you like my work please donate me a star on github and consider sponsoring me!! + +## Introduction + +There are some "RGB-matrix" status displays/clocks out there, the commercial one from Lametric and some very good DIY-alternatives. + +- [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 now in August 2022) +- [PixelIt](https://docs.bastelbunker.de/pixelit/) (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. But it had to be extensible, e.g. for the use as poolthermometer or as mediaplayer. All done by the magical power of esphome. + +### ehmtx in the media + +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). + +Another german tutorial video focused at the Ulanzi [Smarte Pixel Clock über Home Assistant steuern - Entitäten / Icons und mehr in der Ulanzi](https://www.youtube.com/watch?v=LgaT0mNbl34) + +See this [nice article](https://blakadder.com/esphome-pixel-clock/) about EsphoMaTrix on a Ulanzi TC001 from [blakadder](https://github.com/blakadder). + +Short video on Instagram [@blak_adder](https://www.instagram.com/reel/CpYVByRIaSI) +https://www.instagram.com/reel/CpYVByRIaSI + +See this english discussions: +[Share your projects](https://community.home-assistant.io/t/esphomatrix-a-simple-clock-status-display/425325) +[ESPHOME](https://community.home-assistant.io/t/a-simple-diy-status-display-with-an-8x32-rgb-led/379051) + +It was also mentiond 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) + +Or in german: +[Showroom](https://community.simon42.com/t/8x32-pixel-uhr-mit-homeassistant-anbindung/1076) + +### Features + +Based a on a 8x32 RGB flexible 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)). 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. + +### State + +After the [old](https://github.com/lubeda/EsphoMaTrix) component became favorite there where some feature request which showed that my old code was a mess. I reworked the whole code and restructered it, so it is hopefully + more extensible. + +## How to use + +### The easy way + +There is a little hype around the Ulanzi TC001 pixel clock. This hardware can be used with **EspHoMaTriX v2** (with some limitations). You can connect the device and flash it via USB-C. As a starting point you can use the [``UlanziTC001-simple.yaml``](https://github.com/lubeda/EspHoMaTriXv2/blob/main/UlanziTC001-simple.yaml). To control it from Home Assistant you can use the provided [blueprint](https://github.com/lubeda/EspHoMaTriXv2/blob/main/BP colored state.yaml) + +### Steps (easy) + +#### Step 1 + +Copy these files: + +- UlanziTC001-simple.yaml +- ehmtxfont.ttf + +to your esphome directory (usually /config/esphome). + +#### Step 2 + +connect your ulanzi device to your host with USB-C and flash the firmware + +#### Step 3 + +Copy EHMTXv2-colored-states.yaml to your blueprint path (usually /config/blueprints) in an subfolder ehmtxv2. + +Reload your automations and have fun after configuring some states with this blueprint. + +### result + +The device should boot + +![boot](images/booting.png) + +and after a while (~30 seconds) it should display the correct time + +![clock screen](images/clock_screen.png). + +If not check the esphome logs for further investigations. + +### The funny but more elaborate way + +This is for the more advanced users. If you unterstand the concept of esphome you can't do nearly everything with this component. + +#### Concept + +You can add screens to a queue and all this screens are displayed one after another. +![timing](./images/timingv2.png) +Each screen can display different informations or is of a different kind. They all have a lifetime, if a screen isn't refreshed during its lifetime it will be removed from the queue. If there is nothing left in the queue the date and time screens are displayed. Some screens can show additional features like an alarm or indicator see [elements](#elements). +You can add screens from home assistant with services or from esphome via yaml. + +#### Screen types + +##### Date/Time screen + +![clock screen](./images/clock_screen.png) + +###### service + +clock_screen => {"lifetime", "screen_time", "default_font", "r", "g", "b"} +date_screen => {"lifetime", "screen_time", "default_font", "r", "g", "b"} + +###### api + +all parameters have a default value. + +```c +void clock_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true,int r=C_RED, int g=C_GREEN, int b=C_BLUE); +void date_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true, int r=C_RED, int g=C_GREEN, int b=C_BLUE); +``` + +##### icon screen + +![icon screen](./images/icon_screen.png) + +###### service + +{"icon_name", "text", "lifetime", "screen_time", "default_font", "r", "g", "b"} + +###### api + +```c +void icon_screen(std::string icon, std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true,int r=C_RED, int g=C_GREEN, int b=C_BLUE); +``` + +##### fullscreen + +For 8x32 icons or animations + +Fullscreen + +###### service + +{"icon_name", "lifetime", "screen_time"} + +###### api + +```c +void EHMTX::fullscreen(std::string iconname, int lifetime, int screen_time) +``` + + +#### Installation + +##### **EspHoMaTriXv2** custom component + +**EspHoMaTriXv2** is a custom component, you have to include it in your yaml configuration. To always use the newest features you should use the repo, to use a stable version you copy a working version to your esphome installation. + +###### local use + +If you download the components-folder from the repo and install it in your esphome you have a stable installation. But if there are new features, you won't see them. If needed customize the yaml to your folder structure. + +```yaml +external_components: + - source: + type: local + path: components # e.g. /config/esphome/components +``` + +##### use from repo + +Use the github repo as component. Esphome refreshes the external components "only" once a day, perhaps you have to refresh it manually. In this mode there may be breaking changes, so read the changelog and check to logs while installing the firmware. + +```yaml +external_components: + - source: + type: git + url: https://github.com/lubeda/EspHoMaTriXv2 + ref: release # optional select a special branch or tag +``` + +##### Addressable_light component + +The **EspHoMaTriXv2** component requires a 8x32 pixel addressable_light, it is referenced by the id `matrix_component`. + +See the default [options](https://esphome.io/components/display/index.html) + +There are some different matrices-types on the market, to adapt them to **EspHoMaTriXv2** you have to find the proper pixelmapper. If there is garbage on your display try the other `pixel_mapper`. Here are the most common types for flexible 8x32 matrices: + +#### Type 1 + +Common for 8x32 RGB flexible matrices. + +under the display tag specify this pixelmapper: + +```yaml +display: + - platform: addressable_light + ..... + pixel_mapper: |- + if (x % 2 == 0) { + return (x * 8) + y; + } + return (x * 8) + (7 - y); + ..... +``` + +#### Type 2 (e.g. Ulanzi TC001) + +Under the display tag specify this pixelmapper: + +```yaml +display: + - platform: addressable_light + ..... + pixel_mapper: |- + if (y % 2 == 0) { + return (y * 32) + x; + } + return (y * 32) + (31 - x); + ..... +``` + +#### Type 3 (daisychained 8x8 panels) + +```yaml +display: + - platform: addressable_light + ..... + pixel_mapper: |- + return ((int) (x/8 * 64)) + x % 8 + y * 8; + ..... +``` + +#### How to configure the pixel_mapper + +You have to configure this `lambda` under the `display:` section to use the **EspHoMaTriXv2** component + +```yaml +display: + - platform: addressable_light + id: ehmtx_display + ..... + auto_clear_enabled: true + lambda: |- + id(rgb8x32)->tick(); + id(rgb8x32)->draw(); +``` + +#### Light component + +The light component is used by the addressable_light component and referenced by id under `addressable_light_id:`. + +To use the light component directly from home assistant add the sample lambdas```on_turn_on``` and ```on_turn_off``` to the light component. + +***Sample*** + +```yaml +light: + - platform: neopixelbus + id: ehmtx_light + .... + on_turn_on: + lambda: |- + id(rgb8x32)->set_enabled(false); + on_turn_off: + lambda: |- + id(rgb8x32)->set_enabled(true); +``` + +To hide the light component in home assistant use: `internal: true` + +```yaml +light: + - platform: neopixelbus + id: ehmtx_light + internal: true + ... +``` + +#### Time component + +Since it is a clock you need a time component e.g. [homeassistant](https://esphome.io/components/time/homeassistant.html). It is referenced by its id under `time_component:` The display shows `!t!` until the time source is synchronized and valid. + +#### Font + +Download a small "pixel" TTF-font, i use ["monobit.ttf"](https://www.google.com/search?q=monobit.ttf). You can modify this font with [FontForge](https://fontforge.org/) and added **€** on base of a **E** and so on. Due to copyright I can't provide my modified version :-(. Not all fonts are suitable for this minimalistic display. There are public domain fonts wich work well on the display e.g. [DMDSmall](https://www.pentacom.jp/pentacom/bitfontmaker2/gallery/?id=5993), details on alternative fonts are [here](https://blakadder.com/esphome-pixel-clock/#fonts). + +DarkPoet78 is providing special fonts for 8x32 matrices in his [repo](https://github.com/darkpoet78/MatrixClockFonts) + +```yaml +font: + - file: monobit.ttf + id: EHMTX_font + size: 16 + glyphs: | + !"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz€@ +``` + +#### Icons and Animations + +Download and install all needed icons (.jpg/.png) and animations (.gif) under the `ehmtx:` key. All icons have to be 8x8 or 8x32 pixels in size. If necessary scale them with gimp, check "as animation" for gifs. + +You can also specify an URL to directly download the image file. The URLs will only be downloaded once at compile time, so there is no additional traffic on the hosting website. + +There are maximum 90 icons possible. + +***Sample*** + +```yaml +emhtx: + icons: + - id: boot + file: icons/rocket.gif + duration: 75 + - id: temp + file: temperature.png + - id: yoga + file: icons/yoga-bridge.gif + pingpong: true + - id: garage + file: garage.gif + duration: 100 + - id: homeassistant + url: https://github.com/home-assistant/assets/raw/master/logo/logo-special.png +``` + +The id of the icons is used later to configure the screens to display. So you should name them wisely. If you like to group icons you should prefix them e.g. with "weather_" (see Service **del_screen**) + +The first defined icon will be used as a fallback icon, in case of an error, e.g. if you use a non-existing icon id. + +GIFs are limited to 110 frames to limit the used amount of flash space. + +All other solutions provide ready made icons, especially Lametric has a big database of [icons](https://developer.lametric.com/icons). Please check the copyright of the icons you use. The maximum amount of icons is limited to 90 in the code and also by the flash space and the RAM of your board. + +See also [icon parameter](#icons) + +#### Configuration + +##### ehmtx component + +This component is highly customizable. + +***Example*** + +```yaml +ehmtx: + id: rgb8x32 + clock_time: 7 + screen_time: 9 + show_seconds: true + matrix_component: ehmtx_display + time_component: ehmtx_time + icons2html: true + default_font_id: default_font + special_font_id: special_font + special_font_yoffset: 7 + default_font_yoffset: 6 + brightness: 80 # percent + time_format: "%H:%M" + date_format: "%d.%m." + week_start_monday: true # false equals sunday + scroll_count: 2 # scroll long text at least two times + scroll_interval: 80 # milliseconds + frame_interval: 192 # milliseconds + icons: + ..... +``` + +***Parameters*** + +**id** (required, ID): Manually specify the ID used for code generation and in service definitions. + +**clock_time** (optional, seconds): duration to display the clock after this time the date is display until next "show_screen". If `show_date` is false and `clock_time` > 0 the clock will be display as long as a normal screen! Setting `clock_time` to 0 will not show the clock or date. If there are no screens ind the queue the display will be blank until the next screen is sent. + +**screen_time** (optional, seconds): default duration to display a screen or a clock/date sequence, a long text will be scrolled at least `scroll_count` times (default: 10 seconds). This may be overwritten by the add_screen service. + +**hold_time** (optional, seconds): extends the display time of the current screen in seconds (default=20). Used in services or automations, see `hold_screen` + +**date_format** (optional, string): formats the date display with [strftime syntax](https://esphome.io/components/time.html?highlight=strftime), defaults `"%d.%m."` (use `"%m.%d."` for the US) + +**show_seconds** (optional, boolean): toggle an indicator for seconds while the clock is displayed (default: false)) + +**time_format** (optional, string): formats the date display with [strftime syntax](https://esphome.io/components/time.html?highlight=strftime), defaults `"%H:%M"` (use `"%I:%M%p"` for the US) + +**default_font_yoffset** (optional, pixel): yoffset the text is aligned BASELINE_LEFT, the baseline defaults to `6` + +**default_font_xoffset** (optional, pixel): xoffset the text is aligned BASELINE_LEFT, the left defaults to `1` + +**special_font_yoffset** (optional, pixel): yoffset the text is aligned BASELINE_LEFT, the baseline defaults to `6` + +**special_font_xoffset** (optional, pixel): xoffset the text is aligned BASELINE_LEFT, the left defaults to `1` + +**matrix_component** (required, ID): ID of the addressable display + +**show_dow** (optional, bool): draw the day of week indicator on the bottom of the clock screen. Disable e.g. if you want larger fonts, defaults to true. + +**time_component** (required, ID): ID of the time component. The display shows `!t!` until the time source is valid. + +**default_font** (required, ID): ID of the default font + +**special_font** (required, ID): ID of the special font, you can reuse your default font, but sometimes its nice to have a specialer font to minimise scrolling + +**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``` from the [display](https://esphome.io/components/display/addressable_light.html) + +**frame_interval** (optional, ms): the interval in ms to display the next animation/icon frame (default = 192), should be a multiple of the ```update_interval``` from the [display](https://esphome.io/components/display/addressable_light.html). Can be overwritten per icon/gif see [icons](#icons-and-animations) parameter `frame_duration` + +**icons2html** (optional, boolean): If true, generate the html (_filename_.html) file to show all included icons. (default = `false`) + +***Example output:*** +![icon preview](./images/icons_preview.png) + +### icons + +***Parameters*** +See [icon details](#icons-and-animations) + +- **frame_duration** (optional, ms): in case of a gif file the component tries to read the default interval for each frame. The default/fallback interval is 192 ms. In case you need to override the default value set the duration per icon. +- **pingpong** (optional, boolean): in case of a gif file you can reverse the frames instead of starting from the first frame. + +- **file** (Exlusive, filename): a local filename +- **url** (Exclusive, url): an URL to download the icon +- **lameid** (Exclusive, number): the ID from the lametric icon database + +## Control your display + +A lot of features are accessible with actions, you can use in your yaml + +### Local actions/lambdas + +#### Add screen to your display queue + +You can add screens locally and display data directly from any local sensor. See this sample: + +##### Lambda + +Take care that the ```char text[30];``` has enough space to store the formated text. + +```yaml +sensor: + - platform: bh1750 + id: sensorlx + ... + on_value: + then: + lambda: |- + char text[30]; + sprintf(text,"Light: %2.1f lx", id(sensorlx).state); + // 5 Minutes,each time at least 11 seconds,no alarm + id(rgb8x32)->icon_screen("sun", text); // uses default values for color etc. +``` + + +#### Set (alarm/clock/gauge/text/today/weekday) color action + +Sets the default color of the selected element + +##### Lambda set text color + +```yaml + lamda: + id(rgb8x32)->set_text_color(200,45,12); +``` + +##### Force screen + +Force the selected [icon_screen](#icon-screen) ```icon_name``` to be displayed next. Afterwards the loop is continuing from this screen. e.g. helpfull for alarms. Or after an update of the value/text. + +```yaml + id(rgb8x32)->force_screen("homeassistant"); +``` + +##### Change configuration during runtime + +_Configuration variables/functions:_ + +Experienced programmers can use this public methods: + +```c +``` + +### Local trigger + +To use the display without homeassistant automations, you may use the [advanced functionality](#change-configuration-during-runtime) with triggers. The triggers can be fired by sensors, time or by the ehmtx component. + +#### on_next_screen + +There is a trigger available to do some local magic. The trigger ```on_next_screen``` is triggered every time a new screen is displayed (it doesn't trigger on the clock/date display!!). In lambda's you can use two local string variables: + +**x** (Name of the icon, std::string): value to use in lambda + +**y** (displayed text, std::string): value to use in lambda + +See the examples: + +##### Write information to esphome log + +```yaml +ehmtx: + .... + on_next_screen: + lambda: |- + ESP_LOGD("TriggerTest","Iconname: %s",x.c_str()); + ESP_LOGI("TriggerTest","Text: %s",y.c_str()); +``` + +##### Send an event to Home Assistant + +To send data back to home assistant you can use events. + +```yaml +ehmtx: + .... + on_next_screen: + - homeassistant.event: + event: esphome.next_screen + data_template: + iconname: !lambda "return x.c_str();" + text: !lambda "return y.c_str();" +``` + +***Result*** + +![events](./images/events.png) + +#### on_next_clock + +The trigger ```on_next_clock``` is triggered every time a new clock display circle starts. +See the examples: + +##### Change something for each clock circle + +```yaml +ehmtx: + .... + on_next_clock: + lambda: |- + id(rgb8x32)->....... +``` + +**(D)** Service **brightness** + +Sets the overall brightness of the display (`0..255`) + +_parameters:_ + +- ```brightness```: from dark to bright (`0..255`) (default = `80`) as set in the light component by ```color_correct: [30%, 30%, 30%]``` + +There's an easier way by using a number component: + +```yaml +number: + - platform: template + name: "LED brightness" + min_value: 0 + max_value: 255 + step: 1 + lambda: |- + return id(rgb8x32)->get_brightness(); + set_action: + lambda: |- + id(rgb8x32)->set_brightness(x); +``` + + +**(D)** Service **del_screen** + +Removes a screen from the display by icon name. If this screen is actually display while sending this command the screen will be displayed until its "show_screen"-time has ended. + +optionally you can suffix a * to the icon name to perform a wildcard delete which will delete all screens beginning with the icon_name specified. + +For example if you have multiple icons named weather_sunny, weather_rain & weather_cloudy, you can issue a del_screen weather_* to remove whichever screen is currently in a slot and replace it with a new weather screen. + +_parameters:_ + +- ```icon_name```: Icon `id` defined in the yaml (see installation) +- ```mode```: The mode is for internal purposes use 5 for icon_screen + +**(D)** Service **indicator_on** / **indicator_off** + +Turns indicator on/off + +Display a colored corner on all screens and the clock. You can define the color by parameter. + +_parameters:_ + +- ```r``` red in 0..255 +- ```g``` green in 0..255 +- ```b``` blue in 0..255 + +**(D)** Service **display_on** / **display_off** + +Turns the display on or off + +There's an easier way in using a switch component: + +***Sample*** + +```yaml +switch: + - platform: template + name: "$devicename Display" + icon: "mdi:power" + restore_mode: ALWAYS_ON + lambda: |- + return id(rgb8x32)->show_display; + turn_on_action: + lambda: |- + id(rgb8x32)->set_display_on(); + turn_off_action: + lambda: |- + id(rgb8x32)->set_display_off(); +``` + +Service **skip_screen** + +If there is more than one screen in the queue, skip to the next screen. + +e.g. on the Ulanzi TC001 + +```yaml +binary_sensor: + - platform: gpio + pin: + number: $left_button_pin + inverted: true + on_press: + lambda: + id(rgb8x32)->skip_screen(); +``` + +Service **hold_screen** + +Displays the current screen for configured ammount (see **hold_time**) (default=20) seconds longer. + +e.g. on the Ulanzi TC001 + +``` +binary_sensor: + - platform: gpio + pin: + number: $right_button_pin + inverted: true + on_press: + lambda: + id(rgb8x32)->hold_screen(); +``` + +**(D)** Service **status** + +This service displays the running queue and a list of icons in the logs + +```log +[13:10:10][I][EHMTX:175]: status status: 1 as: 1 +[13:10:10][I][EHMTX:176]: status screen count: 3 +[13:10:10][I][EHMTX:181]: status slot: 0 icon: 36 text: 47.9°C end: 400 +[13:10:10][I][EHMTX:181]: status slot: 1 icon: 23 text: Supa langer Text end: 310 +[13:10:10][I][EHMTX:181]: status slot: 2 icon: 1 text: 10.3°C end: 363 +[13:10:10][I][EHMTX:186]: status icon: 0 name: boot +[13:10:10][I][EHMTX:186]: status icon: 1 name: temp +[13:10:10][I][EHMTX:186]: status icon: 2 name: garage +[13:10:10][I][EHMTX:186]: status icon: 3 name: wind +[13:10:10][I][EHMTX:186]: status icon: 4 name: rain +``` + +Service **show_gauge** / **del_gauge_off** + +**(D)** Turns gauge on/off +Displays a colored gauge at the left side of the display. You can define the color by parameter. + +_parameters:_ + +- ```percent``` gauge percentage + +## Integration in Home Assistant + +To control your display it has to be integrated in Home Assistant. Then it provides a number of services, all prefixed with the configured `devicename` e.g. "ehmtx". See the default services marked as **(D)** [above](#services), but you can add your own (see alarm and screen). + +### Services + +All communication with Home Assistant use the homeasistant-api. The services can be provided by default or also defined additionally in the yaml. To define the additional services you need the id of the ehmtx-component e.g. ```id(rgb8x32)```. + +#### Overview of default services + +These services are the same as the local services, so you can adapt the documentation there + + |name|parameter| + |----|----| + |`get_status`|*none*| + |`set_display_on`|*none*| + |`set_display_off`|*none*| + |`show_all_icons`|*none*| + |`hold_screen`|*none*| + |`set_indicator_on`| {"r", "g", "b"}| + |`set_indicator_off`|*none*| + |`set_gauge_value`| {"percent"}| + |`set_gauge_off`|*none*| + |`set_alarm_color`| {"r", "g", "b"}| + |`set_text_color` | {"r", "g", "b"}| + |`set_clock_color`| {"r", "g", "b"}| + |`set_today_color`| {"r", "g", "b"}| + |`set_gauge_color`| {"r", "g", "b"}| + |`set_weekday_color` |{"r", "g", "b"}| + |`set_screen_color` |{"icon_name","r", "g", "b"}| + |`add_screen` |{"icon_name", "text", "lifetime","screen_time", "alarm"}| + |`force_screen`| {"icon_name"}| + |`del_screen`| {"icon_name"}| + |`set_brightness`| {"value"}| + +### Use in Home Assistant automations + +The easiest way to use ehmtx as a status display is to use the icon names as trigger id. In my example i have an icon named "wind" when the sensor.wind_speed has a new state this automation sends the new data to the screen with the icon named "wind" and so on. + +```yaml +alias: EHMTX 8266 Test +description: '' +trigger: + - platform: numeric_state + entity_id: sensor.wind_speed + id: wind + - platform: state + entity_id: sensor.actual_temperature + id: temp + - platform: state + entity_id: sensor.wg_cover_device + id: cover +condition: [] +action: + - service: esphome.ehmtx8266_screen + data: + icon_name: '{{trigger.id}}' + text: >- + {{trigger.to_state.state}}{{trigger.to_state.attributes.unit_of_measurement}} +mode: queued +max: 10 +``` + +## Tipps + +### Display precision after home assistant 2023.3.0 + +See [templating](https://www.home-assistant.io/docs/configuration/templating/#states) for possibilities to optimize the output +e.g. +```{{ states(sensor.solarpower, rounded=True) }} kWh``` + +### Specific icons per condition + +Add an icon per weather condition to the ehmtx component + +```yaml + - id: weather_clear_night + lameid: 52163 + - id: weather_cloudy + lameid: 25991 + - id: weather_fog + lameid: 52167 + ...... +``` + +Sample automation to show the weather with local temperature + +```yaml +alias: EHMTX weather +description: weather with icon per condition +trigger: + - platform: state + entity_id: weather.metno +action: + - service: esphome.ulanzi_del_screen + data: + icon_name: weather_* + mode: 5 + - service: esphome.ulanzi_icon_screen + data: + icon_name: weather_{{ trigger.to_state.state }} + text: >- + {{ states("sensor.external_actual_temperature") }}°C + .... +``` + +or another sample automation for the trashcan type + +```yaml +alias: "EHMTX Müllanzeige" +description: Anzeige welche Tonne raus muss. iconnamen gekürzt +trigger: + - platform: time + at: + - "06:30" + - "08:30" + - "10:30" + - "15:00" + - "17:00" + - "19:00" +condition: + - condition: numeric_state + entity_id: sensor.mulltrigger + below: "3" +action: + - service: esphome.ulanzi_del_screen + data: + icon_name: trash_* + mode: 5 + - service: esphome.ulanzi_icon_screen + data: + icon_name: >- + trash_{{ states("sensor.mulldetails") | replace("Biotonne", "brow")| + replace("Papiertonne","blue")| replace("Restmüll", "grey")| + replace("gelbe Tonne","yell|") | truncate(4,true,"") }} + text: >- + {{ states("sensor.mulldetails")|replace(" in","")|replace(" days"," + Tagen") | replace ("0 Tagen","heute") | replace ("1 Tagen","morgen")}} + lifetime: 120 + ... +``` + +### Integrate in Home Assistant UI + +Add entities to Home Assistant UI for interactive control of your display + +#### Brightness + +```yaml +number: + - platform: template + name: "$devicename brightness" + min_value: 0 + max_value: 255 + step: 1 + lambda: |- + return id(rgb8x32)->get_brightness(); + set_action: + lambda: |- + id(rgb8x32)->set_brightness(x); +``` + +#### Display switch + +```yaml +switch: + - platform: template + name: "$devicename Display" + icon: "mdi:power" + restore_mode: ALWAYS_ON + lambda: |- + return id(rgb8x32)->show_display; + turn_on_action: + lambda: |- + id(rgb8x32)->set_display_on(); + turn_off_action: + lambda: |- + id(rgb8x32)->set_display_off(); +``` + +### automatic brightness + +Awtrix and PixelIt have hardcoded functionality. EHMTX is also capable to build something like that by lambdas. But this is all your freedom. See the Ulanzi simple yaml as guide. + +Example: automatic brightness control with an bh1570 sensor + +```yaml +sensor: + - platform: bh1570 + # ... + on_value: + then: + lambda: |- + if (x > 200) + { + id(rgb8x32)->set_brightness(50); + } else { + id(rgb8x32)->set_brightness(250); + } +``` + +## Breaking changes + + +## Usage + +The integration works with the Home Assistant api so, after boot of the device, it takes a few seconds until the service calls start working. If you see a growing green rectangle after boot you have to wait a bit until the api is connected etc. + +![timing](./images/booting.png) + +## Disclaimer + +THE SOFTWARE IS PROVIDED "AS IS", use at your own risk! + +## Thanks + +- **[blakadder](https://github.com/blakadder)** for his contribution (cleanup README.md,fixed sample) +- **[andrew-codechimp](https://github.com/andrew-codechimp)** for his contribution (display on/off & del_screen "*" & show_clock with 0) +- **[jd1](https://github.com/jd1)** for his contributions +- **[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 +- ** everbody that found bugs/issues and reported them! + +## Special thanks to all sponsors diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..60eedf2 --- /dev/null +++ b/TODO.md @@ -0,0 +1,45 @@ +# To Do's + +## function + +- [ ] alarm on all screen but fullscreen +- [ ] indicator on all screen but fullscreen and clock +- [ ] refreshing an icon screen should extend the display time +- [ ] scroll left to right +- [x] center text +- [x] alarm unabhängig von screen +- [x] del_screen with * and filter by type do delete all clocks etc. +- [x] force_screen with * and filter by type do delete all clocks etc. +- [x] gauge mit farbe und del_gaugeall clocks etc. +- [ ] second point moveable +- [ ] second point to clock screen + +## ux + +- [ ] blueprints +- [ ] Color in blueprints +- [ ] all modes in one blueprint +- [x] default values for all functions +- [ ] provide sample font from [url](https://www.pentacom.jp/pentacom/bitfontmaker2/) +- [x] start animation + +## style + +- [ ] in screen rename text_color to color +- [x] default_font before alarm paramater +- [x] screen_time instead of showtime +- [x] lifetime instead of durations +- [x] remove actions in favor of functions + +## documentation + +- [ ] simple mode sample +- [ ] enhanced mode sample +- [ ] remake documentation +- [ ] more explanation for fonts +- [ ] reference to https://www.pentacom.jp/pentacom/bitfontmaker2/gallery/?id=13768 + +## noch prüfen + +- [ ] Timer display with formation H:M:S +- [ ] find a way for automastically add smalfont \ No newline at end of file diff --git a/Ulanzi-simple.yaml b/Ulanzi-simple.yaml new file mode 100644 index 0000000..b7866d7 --- /dev/null +++ b/Ulanzi-simple.yaml @@ -0,0 +1,207 @@ +substitutions: + devicename: ulanzi + ledpin: GPIO32 + buzzerpin: GPIO15 + friendly_name: LED Matrix + board: esp32dev + # Pin definition from https://github.com/aptonline/PixelIt_Ulanzi + battery_pin: GPIO34 + ldr_pin: GPIO35 + matrix_pin: GPIO32 + left_button_pin: GPIO26 + mid_button_pin: GPIO27 + right_button_pin: GPIO14 + buzzer_pin: GPIO15 + scl_pin: GPIO22 + sda_pin: GPIO21 + +external_components: + - source: + type: git + url: https://github.com/lubeda/EsphoMaTrix + refresh: 60s + components: [ ehmtx ] + +esphome: + comment: "ehmtx from LuBeDa" + name: $devicename + on_boot: + then: + - ds1307.read_time: + +esp32: + board: esp32dev + +font: + - file: MatrixClock-Chunky8.bdf + id: default_font + glyphs: | + !?"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnÖÄÜöäüopqrstuvwxyz@<>ß§/ + - file: MatrixClock-Chunky6.bdf + id: special_font + +binary_sensor: + - platform: status + name: "$devicename Status" + - platform: gpio + pin: + number: $left_button_pin + inverted: true + name: "Left button" + - platform: gpio + pin: + inverted: true + number: $mid_button_pin + mode: INPUT_PULLUP + name: "Middle button" + - platform: gpio + pin: + number: $right_button_pin + inverted: true + name: "Right button" + +logger: + level: WARNING + +# Enable Home Assistant API +api: + services: + - service: alarm + variables: + icon_name: string + text: string + then: + lambda: |- + id(rgb8x32)->add_icon_screen(icon_name,text, 5, 30, true, true, 200, 50, 50); + id(rgb8x32)->force_icon_screen(icon_name); + - service: screen + variables: + icon_name: string + text: string + then: + id(rgb8x32)->add_icon_screen(icon_name,text, 5, 20, false, true, 240, 240, 240); + - service: tune + variables: + tune: string + then: + - rtttl.play: + rtttl: !lambda 'return tune;' + +sensor: + - platform: sht3xd + temperature: + name: "$devicename Temperature" + humidity: + name: "$devicename Relative Humidity" + update_interval: 60s + - platform: adc + pin: $battery_pin + name: "$devicename Battery" + id: battery_voltage + update_interval: 10s + device_class: battery + accuracy_decimals: 0 + attenuation: auto + filters: + - sliding_window_moving_average: + window_size: 15 + send_every: 15 + send_first_at: 1 + - multiply: 1.6 + - lambda: |- + auto r = ((x - 3) / 0.69 * 100.00); + if (r >= 100) return 100; + if (r > 0) return r; + if (r <= 0) return 1; + return 0; + unit_of_measurement: '%' + - platform: adc + id: light_sensor + name: "$devicename Illuminance" + pin: $ldr_pin + update_interval: 10s + attenuation: auto + unit_of_measurement: lx + device_class: illuminance + accuracy_decimals: 0 + filters: + - lambda: |- + return (x / 10000.0) * 2000000.0 - 15 ; + +ota: + password: !secret ota_password + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + +web_server: + +output: + - platform: ledc + pin: $buzzerpin + id: rtttl_out + +rtttl: + output: rtttl_out + +i2c: + sda: $sda_pin + scl: $scl_pin + scan: true + id: i2cbus + +light: + - platform: neopixelbus + id: ehmtx_light + type: GRB + internal: true + variant: WS2812 + pin: $ledpin + num_leds: 256 + color_correct: [30%, 30%, 30%] + gamma_correction: 1.0 + name: "$devicename Light" + restore_mode: ALWAYS_OFF + +time: + - platform: homeassistant + on_time_sync: + then: + ds1307.write_time: + - platform: ds1307 + update_interval: never + id: ehmtx_time + +display: + - platform: addressable_light + id: ehmtx_display + addressable_light_id: ehmtx_light + width: 32 + height: 8 + internal: true + pixel_mapper: |- + if (y % 2 == 0) { + return (y * 32) + x; + } + return (y * 32) + (31 - x); + rotation: 0° + update_interval: 16ms + auto_clear_enabled: true + lambda: |- + id(rgb8x32)->tick(); + id(rgb8x32)->draw(); + +ehmtx: + id: rgb8x32 + clock_time: 8 + screen_time: 10 + hold_time: 27 + icons2html: true + yoffset: 7 + matrix_component: ehmtx_display + time_component: ehmtx_time + time_format: "%H:%M" + show_seconds: false + font_id: special_font + icons: !include ehmtx_icons.yaml diff --git a/components/ehmtx/BP colored state.yaml b/components/ehmtx/BP colored state.yaml new file mode 100644 index 0000000..af98fb7 --- /dev/null +++ b/components/ehmtx/BP colored state.yaml @@ -0,0 +1,239 @@ +blueprint: + name: |- + ehmtxv2: show state with unit on on 8x32 RGB-display + description: This blueprint is triggered by a state change. If the state is between certain values it will be displayed with special colors or no state change will be displayed + domain: automation + input: + ehmtx_device: + name: which device to display at + selector: + device: + integration: esphome + trigger_sensor: + name: which state to show + description: This sensor state will be displayed + selector: + entity: + domain: sensor + default_color: + name: default text color + description: this is the default textcolor for values within the low and the high value + selector: + color_rgb: + default: [240, 240, 240] + lifetime: + name: how many minutes is this screen in the loop + selector: + number: + min: 1 + max: 1440 + step: 1 + default: 2 + screen_time: + name: minimum display time per loop in seconds + selector: + number: + min: 6 + max: 120 + step: 2 + default: 12 + icon_name: + name: the icon + selector: + select: + mode: dropdown + options: + [ + "error", + "lamp", + "sonos", + "print3d", + "internet", + "speaker", + "alien", + "temp", + "garage", + "door", + "wind", + "rain", + "shop", + "phone", + "fire", + "alexa", + "tv", + "frost", + "muell", + "cookit", + "nature", + "work", + "bike", + "school", + "amazon", + "post", + "money", + "power", + "solar", + "yoga", + "startrek", + "energy", + "sun", + "diesel", + "benzine10", + "vacuum", + "rainprecip", + "iss", + "thunder", + "nina_warning", + "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_bat", + "f_matrix", + "f_invaders", + "f_amongus", + "theodor", + "f_sleeping", + "mops", + "girl", + "timer", + "lasticon", + ] + default: homeassistant + use_colors: + name: Use colors based on state values + selector: + boolean: + default: true + low_value: + name: below this vaule is a special color + selector: + number: + mode: box + min: -10000 + max: +10000 + default: 0 + low_color: + name: Low color + description: the color for values below the limit + selector: + color_rgb: + default: [40, 240, 40] + high_value: + name: upper limit + selector: + number: + mode: box + min: -10000 + max: +10000 + default: 0 + high_color: + name: High Color + description: Text color for values above the defined value + selector: + color_rgb: + default: [240, 40, 40] + default_font: + name: true uses the default, false the specialer font + selector: + boolean: + default: true + +variables: + display: !input ehmtx_device + def_color: !input default_color + lo_color: !input low_color + hi_color: !input high_color + +trigger: + - platform: state + entity_id: !input trigger_sensor + +action: + - if: + - condition: template + value_template: "{{ not use_colors }}" + then: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ def_color[0] }} + g: |- + {{ def_color[1] }} + b: |- + {{ def_color[2] }} + else: + - choose: + - conditions: + - condition: numeric_state + entity_id: !input trigger_sensor + below: !input low_value + sequence: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ lo_color[0] }} + g: |- + {{ lo_color[1] }} + b: |- + {{ lo_color[2] }} + - conditions: + - condition: numeric_state + entity_id: !input trigger_sensor + above: !input high_value + sequence: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ hi_color[0] }} + g: |- + {{ hi_color[1] }} + b: |- + {{ hi_color[2] }} + default: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ def_color[0] }} + g: |- + {{ def_color[1] }} + b: |- + {{ def_color[2] }} diff --git a/components/ehmtx/BP del_screen.yaml b/components/ehmtx/BP del_screen.yaml new file mode 100644 index 0000000..a33e600 --- /dev/null +++ b/components/ehmtx/BP del_screen.yaml @@ -0,0 +1,212 @@ +blueprint: + name: |- + ehmtxv2':' delete screen from 8x32 RGB-display + description: This blueprint is triggered by a state change. If the state is between certain values it will be displayed with special colors or no state change will be displayed + domain: automation + input: + ehmtx_device: + name: which device to display at + selector: + device: + integration: esphome + mode: + name: the mode + selector: + select: + custom_value: true + mode: dropdown + options: + - label: MODE_ICONSCREEN + value: 5 + - label: MODE_BLANK + value: 1 + - label: MODE_CLOCK + value: 2 + - label: MODE_DATE + value: 3 + - label: MODE_FULLSCREEN + value: 4 + - label: MODE_TEXT + value: 6 + default: 5 + icon_name: + name: the icon + selector: + select: + mode: dropdown + options: + [ + "*", + "error", + "github", + "precipitation", + "nina", + "waschmaschine", + "car", + "lamp", + "sonos", + "print3d", + "internet", + "speaker", + "alien", + "temp", + "garage", + "door", + "wind", + "rain", + "shop", + "phone", + "fire", + "alexa", + "tv", + "frost", + "muell", + "cookit", + "nature", + "work", + "bike", + "school", + "amazon", + "post", + "money", + "power", + "solar", + "yoga", + "startrek", + "energy", + "sun", + "diesel", + "benzine10", + "vacuum", + "rainprecip", + "iss", + "thunder", + "nina_warning", + "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_bat", + "f_matrix", + "f_invaders", + "f_amongus", + "theodor", + "f_sleeping", + "mops", + "girl", + "timer", + "lasticon", + ] + default: homeassistant + low_value: + name: below this vaule is a special color + selector: + number: + mode: box + min: -10000 + max: +10000 + low_color: + name: Low color + description: the color for values below the limit + selector: + color_rgb: + default: [40, 240, 40] + high_value: + name: upper limit + selector: + number: + mode: box + min: -10000 + max: +10000 + high_color: + name: High Color + description: Text color for values above the defined value + selector: + color_rgb: + default: [240, 40, 40] + default_font: + name: true uses the default, false the specialer font + selector: + boolean: + default: true + +variables: + display: !input ehmtx_device + def_color: !input default_color + lo_color: !input low_color + hi_color: !input high_color + +trigger: + - platform: state + entity_id: !input trigger_sensor + +action: + - choose: + - conditions: + - condition: numeric_state + entity_id: !input trigger_sensor + below: !input low_value + sequence: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ lo_color[0] }} + g: |- + {{ lo_color[1] }} + b: |- + {{ lo_color[2] }} + - conditions: + - condition: numeric_state + entity_id: !input trigger_sensor + above: !input high_value + sequence: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ hi_color[0] }} + g: |- + {{ hi_color[1] }} + b: |- + {{ hi_color[2] }} + default: + - service: esphome.{{ device_attr(display, "name") }}_icon_screen + data: + icon_name: !input icon_name + screen_time: !input screen_time + lifetime: !input lifetime + text: "{{trigger.to_state.state}} {{trigger.to_state.attributes.unit_of_measurement}}" + default_font: !input default_font + r: |- + {{ def_color[0] }} + g: |- + {{ def_color[1] }} + b: |- + {{ def_color[2] }} diff --git a/components/ehmtx/EHMTX.cpp b/components/ehmtx/EHMTX.cpp new file mode 100644 index 0000000..8f28eef --- /dev/null +++ b/components/ehmtx/EHMTX.cpp @@ -0,0 +1,826 @@ +#include "esphome.h" + +namespace esphome +{ + EHMTX::EHMTX() : PollingComponent(TICKINTERVAL) + { + this->show_display = true; + this->display_gauge = false; + this->display_indicator = false; + this->display_alarm = false; + this->icon_count = 0; + this->text_color = Color(C_RED, C_GREEN, C_BLUE); + this->today_color = Color(C_RED, C_GREEN, C_BLUE); + this->weekday_color = Color(CD_RED, CD_GREEN, CD_BLUE); + this->clock_color = Color(C_RED, C_GREEN, C_BLUE); + + this->alarm_color = Color(CA_RED, CA_GREEN, CA_BLUE); + this->gauge_color = Color(CD_RED, CD_GREEN, CD_BLUE); + this->gauge_value = 0; + this->screen_pointer = 0; + + for (uint8_t i = 0; i < MAXQUEUE; i++) + { + this->queue[i] = new EHMTX_queue(this); + } + + this->is_running =false; + } + + 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_indicator(int r, int g, int b) + { + this->indicator_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); + this->display_indicator = true; + ESP_LOGD(TAG, "show_indicator r: %d g: %d b: %d", r, g, b); + } + + void EHMTX::hide_indicator() + { + this->display_indicator = false; + ESP_LOGD(TAG, "hide_indicator"); + } + + void EHMTX::set_display_off() + { + this->show_display = false; + ESP_LOGD(TAG, "display off"); + } + + void EHMTX::set_display_on() + { + this->show_display = true; + ESP_LOGD(TAG, "display on"); + } + + void EHMTX::set_today_color(int r, int g, int b) + { + this->today_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); + ESP_LOGD(TAG, "default today color r: %d g: %d b: %d", r, g, b); + } + + void EHMTX::set_weekday_color(int r, int g, int b) + { + this->weekday_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); + ESP_LOGD(TAG, "default weekday color: %d g: %d b: %d", r, g, b); + } + + void EHMTX::set_clock_color(int r, int g, int b) + { + this->clock_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); + ESP_LOGD(TAG, "default clock color r: %d g: %d b: %d", r, g, b); + } + + void EHMTX::set_text_color(int r, int g, int b) + { + this->text_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); + ESP_LOGD(TAG, "default text color r: %d g: %d b: %d", r, g, b); + } + + bool EHMTX::string_has_ending(std::string const &fullString, std::string const &ending) + { + if (fullString.length() >= ending.length()) + { + return (0 == fullString.compare(fullString.length() - ending.length(), ending.length(), ending)); + } + else + { + return false; + } + } + + uint8_t EHMTX::find_icon(std::string name) + { + for (uint8_t i = 0; i < this->icon_count; i++) + { + if (strcmp(this->icons[i]->name.c_str(), name.c_str()) == 0) + { + ESP_LOGD(TAG, "icon: %s found id: %d", name.c_str(), i); + return i; + } + } + ESP_LOGW(TAG, "icon: %s not found", name.c_str()); + return MAXICONS; + } + + uint8_t EHMTX::find_icon_in_queue(std::string name) + { + for (uint8_t i = 0; i < MAXQUEUE; i++) + { + if (strcmp(this->queue[i]->icon_name.c_str(), name.c_str()) == 0) + { + ESP_LOGD(TAG, "find_icon_in_queue: icon: %s at position %d", name.c_str(), i); + return i; + } + } + ESP_LOGW(TAG, "find_icon_in_queue: icon: %s not found", name.c_str()); + return MAXICONS; + } + + void EHMTX::hide_gauge() + { + this->display_gauge = false; + ESP_LOGD(TAG, "hide gauge"); + } + + void EHMTX::show_gauge(int percent, int r, int g, int) + { + this->display_gauge = false; + if (percent <= 100) + { + this->display_gauge = true; + this->gauge_value = percent; // (uint8_t)(100 - percent) * 7 / 100; + ESP_LOGD(TAG, "set gauge value: %d", percent); + } + } + + void EHMTX::draw_gauge() + { + if (this->display_gauge) + { + this->display->line(0, 7, 0, 0, esphome::display::COLOR_OFF); + this->display->line(1, 7, 1, 0, esphome::display::COLOR_OFF); + if (this->gauge_value > 11) + { + uint8_t height = 7 - (int)(this->gauge_value / 12.5); + this->display->line(0, 7, 0, height, this->gauge_color); + } + } + } + + void EHMTX::setup() + { + ESP_LOGD(TAG, "Setting up services"); + register_service(&EHMTX::get_status, "status"); + register_service(&EHMTX::set_display_on, "display_on"); + register_service(&EHMTX::set_display_off, "display_off"); + register_service(&EHMTX::hold_screen, "hold_screen"); + register_service(&EHMTX::hide_indicator, "hide_indicator"); + register_service(&EHMTX::hide_gauge, "hide_gauge"); + register_service(&EHMTX::hide_alarm, "hide_alarm"); + register_service(&EHMTX::show_gauge, "show_gauge", {"percent", "r", "g", "b"}); + register_service(&EHMTX::show_alarm, "show_alarm", {"r", "g", "b"}); + register_service(&EHMTX::show_indicator, "show_indicator", {"r", "g", "b"}); + + register_service(&EHMTX::set_text_color, "text_color", {"r", "g", "b"}); + register_service(&EHMTX::set_clock_color, "clock_color", {"r", "g", "b"}); + register_service(&EHMTX::set_today_color, "today_color", {"r", "g", "b"}); + register_service(&EHMTX::set_weekday_color, "weekday_color", {"r", "g", "b"}); + + register_service(&EHMTX::del_screen, "del_screen", {"icon_name","mode"}); + register_service(&EHMTX::force_screen, "force_screen", {"icon_name","mode"}); + + register_service(&EHMTX::fullscreen, "fullscreen", {"icon_name", "lifetime", "screen_time"}); + register_service(&EHMTX::icon_screen, "icon_screen", {"icon_name", "text", "lifetime", "screen_time", "default_font", "r", "g", "b"}); + register_service(&EHMTX::text_screen, "text_screen", {"text", "lifetime", "screen_time", "default_font", "r", "g", "b"}); + register_service(&EHMTX::clock_screen, "clock_screen", {"lifetime", "screen_time", "default_font", "r", "g", "b"}); + register_service(&EHMTX::blank_screen, "blank_screen", {"lifetime", "screen_time"}); + register_service(&EHMTX::date_screen, "date_screen", {"lifetime", "screen_time", "default_font", "r", "g", "b"}); + + register_service(&EHMTX::set_brightness, "brightness", {"value"}); + + this->is_running=true; + } + + void EHMTX::show_alarm(int r, int g, int b) + { + this->alarm_color = Color((uint8_t)r & 248, (uint8_t)g & 252, (uint8_t)b & 248); + this->display_alarm = true; + ESP_LOGD(TAG, "show alarm color r: %d g: %d b: %d", r, g, b); + } + + void EHMTX::hide_alarm() + { + this->display_alarm = false; + ESP_LOGD(TAG, "hide_alarm"); + } + + void EHMTX::blank_screen(int lifetime, int showtime) + { + auto scr = this->find_free_queue_element(); + scr->screen_time = showtime; + scr->mode = MODE_BLANK; + scr->endtime = this->clock->now().timestamp + lifetime * 60; + } + + void EHMTX::update() // called from polling component + { + } + + void EHMTX::force_screen(std::string icon_name, int mode) + { + // if (this->string_has_ending(icon_name, "*")) + // { + // // remove the * + // icon_name = icon_name.substr(0, icon_name.length() - 1); + // } + + for (uint8_t i = 0; i < MAXQUEUE; i++) + { + if (this->queue[i]->mode == mode) + { + bool force = true; + if ((mode == MODE_ICONSCREEN)||(mode == MODE_FULLSCREEN)) + { + if (strcmp(this->queue[i]->icon_name.c_str(), icon_name.c_str()) != 0) + { + force = false; + } + if (force) + { + ESP_LOGD(TAG, "force_screen: found position: %d", i); + this->queue[i]->last_time = 0; + this->queue[i]->endtime += this->queue[i]->screen_time; + this->next_action_time = this->clock->now().timestamp; + ESP_LOGW(TAG, "force_screen: icon %s in mode %d", icon_name.c_str(), mode); + } + } + } + } + } + uint8_t EHMTX::find_oldest_queue_element() + { + uint8_t hit = MAXQUEUE; + time_t last_time = this->clock->now().timestamp; + for (size_t i = 0; i < MAXQUEUE; i++) + { + if ((this->queue[i]->endtime > 0) && (this->queue[i]->last_time < last_time)) + { + hit = i; + last_time = this->queue[i]->last_time; + } + } + if (hit != MAXQUEUE) + { + // ESP_LOGD(TAG, "find_oldest_queue_element: oldest screen is: %d", hit); + this->queue[hit]->status(); + } + return hit; + } + + void EHMTX::remove_expired_queue_element() + { + time_t ts = this->clock->now().timestamp; + std::string infotext; + for (size_t i = 0; i < MAXQUEUE; i++) + { + if ((this->queue[i]->endtime > 0) && (this->queue[i]->endtime < ts)) + { + this->queue[i]->endtime = 0; + if ((this->queue[i]->mode == MODE_ICONSCREEN) || (this->queue[i]->mode == MODE_FULLSCREEN)) + { + ESP_LOGD(TAG, "remove_expired_queue_element: removed slot %d: icon_name: %s text: %s", i, this->queue[i]->icon_name.c_str(), this->queue[i]->text.c_str()); + for (auto *t : on_expired_screen_triggers_) + { + infotext = ""; + switch (this->queue[i]->mode) + { + case MODE_EMPTY: + break; + case MODE_BLANK: + break; + case MODE_CLOCK: + infotext = "clock"; + break; + case MODE_DATE: + infotext = "clock"; + break; + case MODE_FULLSCREEN: + infotext = "fullscreen " + this->queue[i]->icon_name; + break; + case MODE_ICONSCREEN: + infotext = this->queue[i]->icon_name.c_str(); + break; + case MODE_TEXT: + infotext = "TEXT"; + break; + default: + break; + } + t->process(this->queue[i]->icon_name, infotext); + } + } + this->queue[i]->mode = MODE_EMPTY; + } + } + } + void EHMTX::tick() + { + if (this->is_running) + { + time_t ts = this->clock->now().timestamp; + if (ts > this->next_action_time) + { + this->remove_expired_queue_element(); + this->screen_pointer = find_oldest_queue_element(); + if (this->screen_pointer != MAXQUEUE) + { + this->queue[this->screen_pointer]->reset_shiftx(); + this->queue[this->screen_pointer]->last_time = ts + this->queue[this->screen_pointer]->screen_time; + if (this->queue[this->screen_pointer]->icon < this->icon_count) { + this->icons[this->queue[this->screen_pointer]->icon]->set_frame(0); + } + this->next_action_time = this->queue[this->screen_pointer]->last_time; + // Todo switch for Triggers + if (this->queue[this->screen_pointer]->mode == MODE_CLOCK) + { + for (auto *t : on_next_clock_triggers_) + { + t->process(); + } + } + else + { + for (auto *t : on_next_screen_triggers_) + { + t->process(this->queue[this->screen_pointer]->icon_name, this->queue[this->screen_pointer]->text); + } + } + } + else + { + ESP_LOGW(TAG, "tick: nothing to do. Restarting clock display!"); + this->clock_screen(24 * 60, this->clock_time, false, C_RED, C_GREEN, C_BLUE); + this->date_screen(24 * 60, (int)this->clock_time / 2, false, C_RED, C_GREEN, C_BLUE); + this->next_action_time = ts + this->clock_time; + } + } + } + else { + uint8_t w = ((uint8_t) (32/14) * (this->boot_anim / 14)) % 32; + this->display->rectangle(0,1,w,6,Color(120,190,40)); + this->boot_anim++; + } + } + + void EHMTX::set_screen_time(uint16_t t) + { + ESP_LOGD(TAG, "default screen time: %d", t); + this->screen_time = t; + } + + void EHMTX::skip_screen() + { + this->next_action_time = this->clock->now().timestamp - 1; + } + + void EHMTX::hold_screen() + { + this->next_action_time += this->hold_time; + } + + void EHMTX::get_status() + { + time_t ts = this->clock->now().timestamp; + ESP_LOGI(TAG, "status time: %d.%d.%d %02d:%02d", this->clock->now().day_of_month, + 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 text_color: RGB(%d,%d,%d)", this->text_color.r, this->text_color.g, this->text_color.b); + ESP_LOGI(TAG, "status alarm_color: RGB(%d,%d,%d)", this->alarm_color.r, this->alarm_color.g, this->alarm_color.b); + if (this->display_indicator) + { + ESP_LOGI(TAG, "status indicator on"); + } + else + { + ESP_LOGI(TAG, "status indicator off"); + } + if (this->show_display) + { + ESP_LOGI(TAG, "status display on"); + } + else + { + ESP_LOGI(TAG, "status display off"); + } + + this->queue_status(); + } + + void EHMTX::queue_status() + { + uint8_t empty = 0; + for (uint8_t i = 0; i < MAXQUEUE; i++) + { + if (this->queue[i]->mode != MODE_EMPTY) + this->queue[i]->status(); + else + empty++; + } + if (empty > 0) + ESP_LOGI(TAG, "queue: %d empty slots", empty); + } + + void EHMTX::set_default_font(display::Font * font) + { + this->default_font = font; + } + + void EHMTX::set_special_font(display::Font * font) + { + 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::del_screen(std::string icon_name,int mode) + { + for (uint8_t i = 0; i < MAXQUEUE; i++) + { + if (this->queue[i]->mode == mode) + { + bool force = true; + if ((mode == MODE_ICONSCREEN)||(mode == MODE_FULLSCREEN)) + { + if (strcmp(this->queue[i]->icon_name.c_str(), icon_name.c_str()) != 0) + { + force = false; + } + } + if (force) + { + this->queue[i]->mode = MODE_EMPTY; + this->queue[i]->endtime = 0; + ESP_LOGW(TAG, "del_screen: icon %s in position: %d mode %d", icon_name.c_str(),i, mode); + if (i == this->screen_pointer){ + this->next_action_time= this->clock->now().timestamp; + } + } + } + } + } + + 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()); + + if (icon >= this->icon_count) + { + ESP_LOGW(TAG, "icon %d not found => default: 0", icon); + icon = 0; + } + EHMTX_queue *screen = this->find_icon_queue_element(icon); + + int x, y, w, h; + if (default_font) + { + this->display->get_text_bounds(0, 0, text.c_str(), this->default_font, display::TextAlign::LEFT, &x, &y, &w, &h); + } + else + { + this->display->get_text_bounds(0, 0, text.c_str(), this->special_font, display::TextAlign::LEFT, &x, &y, &w, &h); + } + screen->set_text(text, icon, w, lifetime, screen_time); + screen->text_color = Color(r, g, b); + screen->default_font = default_font; + screen->mode = MODE_ICONSCREEN; + screen->icon_name = iconname; + ESP_LOGD(TAG, "icon_screen icon: %d iconname: %s text: %s lifetime: %d screen_time: %d", icon, iconname.c_str(), text.c_str(), lifetime, screen_time); + screen->status(); + } + + void EHMTX::timer_screen(std::string icon_name, int seconds, int lifetime, int screen_time, bool default_font, int r, int g, int b) + { + uint8_t icon = this->find_icon(icon_name.c_str()); + + if (icon >= this->icon_count) + { + ESP_LOGW(TAG, "icon %d not found => default: 0", icon); + icon = 0; + } + EHMTX_queue *screen = this->find_icon_queue_element(icon); + + screen->text = "00:00"; + screen->icon = icon; + screen->text_color = Color(r, g, b); + screen->default_font = default_font; + screen->mode = MODE_TIMER; + screen->icon_name = icon_name; + screen->screen_time = screen_time; + screen->endtime = this->clock->now().timestamp + lifetime * 60; + ESP_LOGD(TAG, "TIMER_screen icon: %d icon_ name: %s seconds: %d lifetime: %d screen_time: %d", icon, icon_name.c_str(), seconds, lifetime, screen_time); + screen->status(); + } + + void EHMTX::text_screen(std::string text, int lifetime, int screen_time, bool default_font, int r, int g, int b) + { + EHMTX_queue *screen = this->find_free_queue_element(); + + int x, y, w, h; + if (default_font) + { + this->display->get_text_bounds(0, 0, text.c_str(), this->default_font, display::TextAlign::LEFT, &x, &y, &w, &h); + } + else + { + this->display->get_text_bounds(0, 0, text.c_str(), this->special_font, display::TextAlign::LEFT, &x, &y, &w, &h); + } + + screen->text = text; + screen->pixels_ = w; + if (screen->pixels_ < 32) + { + screen->centerx_ = ceil((32 - screen->pixels_) / 2); + } + + screen->shiftx_ = 0; + float display_duration = ceil((this->scroll_count * w * this->scroll_interval) / 1000); + screen->screen_time = (display_duration > screen_time) ? display_duration : screen_time; + ESP_LOGD(TAG, "text_screen text: text: %s pixels %d screen_time: %d lifetime: %d", text.c_str(), w, screen->screen_time, lifetime); + screen->endtime = this->clock->now().timestamp + lifetime * 60; + + screen->text_color = Color(r, g, b); + screen->default_font = default_font; + screen->mode = MODE_TEXT; + + screen->status(); + } + + void EHMTX::fullscreen(std::string iconname, int lifetime, int screen_time) + { + uint8_t icon = this->find_icon(iconname.c_str()); + + if (icon >= this->icon_count) + { + ESP_LOGW(TAG, "fullscreen: icon %d not found => default: 0", icon); + icon = 0; + } + EHMTX_queue *screen = this->find_icon_queue_element(icon); + + screen->mode = MODE_FULLSCREEN; + screen->icon = icon; + screen->icon_name = iconname; + screen->screen_time = screen_time; + screen->endtime = this->clock->now().timestamp + lifetime * 60; + ESP_LOGD(TAG, "fullscreen: icon: %d iconname: %s lifetime: %d screen_time:%d ", icon, iconname.c_str(), lifetime, screen_time); + screen->status(); + } + + void EHMTX::clock_screen(int lifetime, int screen_time, bool default_font, int r, int g, int b) + { + EHMTX_queue *screen = this->find_free_queue_element(); + + screen->text_color = Color(r, g, b); + ESP_LOGD(TAG, "clock_screen_color lifetime: %d screen_time: %d red: %d green: %d blue: %d", lifetime, screen_time, r, g, b); + screen->mode = MODE_CLOCK; + screen->default_font = default_font; + screen->screen_time = screen_time; + screen->endtime = this->clock->now().timestamp + lifetime * 60; + screen->status(); + } + + void EHMTX::date_screen(int lifetime, int screen_time, bool default_font, int r, int g, int b) + { + EHMTX_queue *screen = this->find_free_queue_element(); + + screen->text_color = Color(r, g, b); + ESP_LOGD(TAG, "date_screen lifetime: %d screen_time: %d red: %d green: %d blue: %d", lifetime, screen_time, r, g, b); + screen->mode = MODE_DATE; + screen->screen_time = screen_time; + screen->default_font = default_font; + screen->endtime = this->clock->now().timestamp + lifetime * 60; + screen->status(); + } + + EHMTX_queue *EHMTX::find_icon_queue_element(uint8_t icon) + { + for (size_t i = 0; i < MAXQUEUE; i++) + { + if ((this->queue[i]->mode == MODE_ICONSCREEN) && (this->queue[i]->icon == icon)) + { + ESP_LOGD(TAG, "free_screen: found by icon"); + return this->queue[i]; + } + } + return this->find_free_queue_element(); + } + + EHMTX_queue *EHMTX::find_free_queue_element() + { + time_t ts = this->clock->now().timestamp; + for (size_t i = 0; i < MAXQUEUE; i++) + { + if (this->queue[i]->endtime < ts) + { + ESP_LOGD(TAG, "free_screen: found by endtime %d", i); + return this->queue[i]; + } + } + return this->queue[0]; + } + + void EHMTX::set_show_date(bool b) + { + this->show_date = b; + if (b) + { + ESP_LOGI(TAG, "show date"); + } + else + { + ESP_LOGI(TAG, "don't show date"); + } + } + + void EHMTX::set_show_seconds(bool b) + { + this->show_seconds = b; + if (b) + { + ESP_LOGI(TAG, "show seconds"); + } + else + { + ESP_LOGI(TAG, "don't show seconds"); + } + } + + void EHMTX::set_show_day_of_week(bool b) + { + this->show_day_of_week = b; + if (b) + { + ESP_LOGI(TAG, "show day of week"); + } + else + { + ESP_LOGI(TAG, "don't show day of week"); + } + } + + 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) + { + this->brightness_ = value; + float br = (float)value / (float)255; + ESP_LOGI(TAG, "set_brightness %d => %.2f %%", value, 100 * br); + this->display->get_light()->set_correction(br, br, br); + } + } + + uint8_t EHMTX::get_brightness() + { + return this->brightness_; + } + + void EHMTX::set_clock_time(uint16_t t) + { + this->clock_time = t; + } + + void EHMTX::set_hold_time(uint16_t t) + { + this->hold_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; + this->show_display = true; + } + + void EHMTX::set_clock(time::RealTimeClock * clock) + { + this->clock = clock; + } + + void EHMTX::draw_day_of_week() + { + if (this->show_day_of_week) + { + 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))))) + { + this->display->line(2 + i * 4, 7, i * 4 + 4, 7, this->today_color); + } + else + { + this->display->line(2 + i * 4, 7, i * 4 + 4, 7, this->weekday_color); + } + } + } + }; + + 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, "EspHoMatriX %s", EHMTX_VERSION); + ESP_LOGCONFIG(TAG, "Boot anim: %d", this->boot_anim); + ESP_LOGCONFIG(TAG, "Icons: %d of %d", this->icon_count, MAXICONS); + ESP_LOGCONFIG(TAG, "Max screens: %d", MAXQUEUE); + 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, "Displaytime (s) clock: %d screen: %d", this->clock_time, this->screen_time); + if (this->show_day_of_week) + { + ESP_LOGCONFIG(TAG, "show day of week"); + } + if (this->show_date) + { + ESP_LOGCONFIG(TAG, "show date"); + } + if (this->week_starts_monday) + { + ESP_LOGCONFIG(TAG, "weekstart: monday"); + } + else + { + ESP_LOGCONFIG(TAG, "weekstart: sunday"); + } + } + + void EHMTX::add_icon(EHMTX_Icon * icon) + { + this->icons[this->icon_count] = icon; + ESP_LOGD(TAG, "add_icon no.: %d name: %s frame_duration: %d ms", this->icon_count, icon->name.c_str(), icon->frame_duration); + this->icon_count++; + } + + void EHMTX::draw() + { + if ((this->is_running) && (this->show_display) && (this->screen_pointer != MAXQUEUE)) + { + this->queue[this->screen_pointer]->draw(); + this->draw_gauge(); + + if (this->display_indicator) + { + this->display->line(31, 5, 29, 7, this->indicator_color); + this->display->draw_pixel_at(30, 7, this->indicator_color); + this->display->draw_pixel_at(31, 6, this->indicator_color); + this->display->draw_pixel_at(31, 7, this->indicator_color); + } + } + } + + void EHMTXNextScreenTrigger::process(std::string iconname, std::string text) + { + this->trigger(iconname, text); + } + + void EHMTXExpiredScreenTrigger::process(std::string iconname, std::string text) + { + this->trigger(iconname, text); + } + + void EHMTXNextClockTrigger::process() + { + this->trigger(); + } + } diff --git a/components/ehmtx/EHMTX.h b/components/ehmtx/EHMTX.h new file mode 100644 index 0000000..156740f --- /dev/null +++ b/components/ehmtx/EHMTX.h @@ -0,0 +1,227 @@ +#ifndef EHMTX_H +#define EHMTX_H +#include "esphome.h" + +const uint8_t MAXQUEUE = 24; +const uint8_t C_RED = 240; //default +const uint8_t C_BLUE = 240; +const uint8_t C_GREEN = 240; +const uint8_t CD_RED = 100; // dim +const uint8_t CD_BLUE = 100; +const uint8_t CD_GREEN = 100; +const uint8_t CA_RED = 200; // alarm +const uint8_t CA_BLUE = 50; +const uint8_t CA_GREEN = 50; + +const uint8_t D_LIFETIME = 5; +const uint8_t D_SCREEN_TIME = 10; + +const uint8_t MAXICONS = 90; +const uint8_t TEXTSCROLLSTART = 8; +const uint8_t TEXTSTARTOFFSET = (32 - 8); + +const uint16_t TICKINTERVAL = 1000; // each 1000ms +static const char *const EHMTX_VERSION = "Version: 2023.5.0"; +static const char *const TAG = "EHMTX"; +enum show_mode : uint8_t { MODE_EMPTY = 0,MODE_BLANK = 1, MODE_CLOCK = 2, MODE_DATE = 3, MODE_FULLSCREEN = 4, MODE_ICONSCREEN = 5, MODE_TEXT = 6 , MODE_TIMER = 7 }; + +namespace esphome +{ + class EHMTX_queue; + class EHMTX_Icon; + class EHMTXNextScreenTrigger; + class EHMTXExpiredScreenTrigger; + class EHMTXNextClockTrigger; + + class EHMTX : public PollingComponent, public api::CustomAPIDevice { + protected: + float get_setup_priority() const override { return esphome::setup_priority::WIFI; } + 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_; + std::vector on_expired_screen_triggers_; + std::vector on_next_clock_triggers_; + EHMTX_queue *find_icon_queue_element(uint8_t icon); + EHMTX_queue *find_free_queue_element(); + + public: + void setup() override; + EHMTX(); + Color text_color, alarm_color, gauge_color,indicator_color,clock_color; + Color today_color,weekday_color; + void dump_config(); + std::string time_fmt; + std::string date_fmt; + + bool display_indicator; + bool display_alarm; + bool display_gauge; + bool is_running=false; + bool show_date; + uint8_t gauge_value; + uint16_t clock_time; + uint8_t scroll_count; + void remove_expired_queue_element(); + uint8_t find_oldest_queue_element(); + uint8_t find_icon_in_queue(std::string); + void force_screen(std::string name,int mode=MODE_ICONSCREEN); + EHMTX_Icon *icons[MAXICONS]; + EHMTX_queue *queue[MAXQUEUE]; + void add_icon(EHMTX_Icon *icon); + bool show_display=false; + addressable_light::AddressableLightDisplay *display; + time::RealTimeClock *clock; + display::Font *default_font; + display::Font *special_font; + int8_t default_yoffset, default_xoffset; + int8_t special_yoffset, special_xoffset; + uint8_t find_icon(std::string name); + bool string_has_ending(std::string const &fullString, std::string const &ending); + bool show_seconds; + uint16_t scroll_interval; // ms to between scrollsteps + uint16_t frame_interval; // ms to next_frame() + uint16_t hold_time; // seconds display of screen_time to extend + uint16_t screen_time; // seconds display of screen + uint8_t icon_count; // max iconnumber -1 + unsigned long last_scroll_time; + unsigned long last_anim_time; + time_t next_action_time = 0; // when is the next screen change + void draw_day_of_week(); + void show_all_icons(); + void tick(); + void Ntick(); + void draw(); + void get_status(); + void queue_status(); + void skip_screen(); + void hold_screen(); + void set_display(addressable_light::AddressableLightDisplay *disp); + void set_screen_time(uint16_t t); + void set_hold_time(uint16_t t); + void set_clock_time(uint16_t t); + void set_show_day_of_week(bool b); + void set_show_seconds(bool b); + void set_show_date(bool b); + 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_frame_interval(uint16_t interval); + void set_scroll_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_indicator(int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void set_text_color(int r, int g, int b); + void set_clock_color(int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void set_today_color(int r, int g, int b); + void set_weekday_color(int r, int g, int b); + void show_alarm(int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void show_gauge(int v,int r=C_RED, int g=C_GREEN, int b=C_BLUE); // int because of register_service + void hide_gauge(); + void hide_indicator(); + void hide_alarm(); + + void fullscreen(std::string icon, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME); + void icon_screen(std::string icon, std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true,int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void timer_screen(std::string icon, int seconds, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true, int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void text_screen(std::string text, int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME, bool default_font=true, int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void clock_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true,int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void date_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME,bool default_font=true, int r=C_RED, int g=C_GREEN, int b=C_BLUE); + void blank_screen(int lifetime=D_LIFETIME, int screen_time=D_SCREEN_TIME); + + void del_screen(std::string icon, int mode=MODE_ICONSCREEN); + + void draw_gauge(); + + void add_on_next_screen_trigger(EHMTXNextScreenTrigger *t) { this->on_next_screen_triggers_.push_back(t); } + void add_on_expired_screen_trigger(EHMTXExpiredScreenTrigger *t) { this->on_expired_screen_triggers_.push_back(t); } + void add_on_next_clock_trigger(EHMTXNextClockTrigger *t) { this->on_next_clock_triggers_.push_back(t); } + + void update(); + uint8_t get_brightness(); +}; + + class EHMTX_queue + { + protected: + + EHMTX *config_; + + public: + uint8_t centerx_; + uint16_t shiftx_; + uint16_t pixels_; + uint16_t screen_time; + bool default_font; + time_t endtime; + time_t last_time; + uint8_t icon; + Color text_color; + show_mode mode; + + std::string text; + std::string icon_name; + + EHMTX_queue(EHMTX *config); + + void status(); + void draw(); + void draw_(); + bool isfree(); + void reset_shiftx(); + bool update_slot(uint8_t _icon); + void update_screen(); + bool del_slot(uint8_t _icon); + void hold_slot(uint8_t _sec); + void set_text(std::string text, uint8_t icon, uint16_t pixel, uint16_t et, uint16_t st); + void set_text_color(uint8_t icon_id,Color text_color); + }; + + class EHMTXNextScreenTrigger : public Trigger + { + public: + explicit EHMTXNextScreenTrigger(EHMTX *parent) { parent->add_on_next_screen_trigger(this); } + void process(std::string, std::string); + }; + + class EHMTXExpiredScreenTrigger : public Trigger + { + public: + explicit EHMTXExpiredScreenTrigger(EHMTX *parent) { parent->add_on_expired_screen_trigger(this); } + void process(std::string, std::string); + }; + + class EHMTXNextClockTrigger : public Trigger<> + { + public: + explicit EHMTXNextClockTrigger(EHMTX *parent) { parent->add_on_next_clock_trigger(this); } + void process(); + }; + + + class EHMTX_Icon : public display::Animation + { + protected: + bool counting_up; + + public: + EHMTX_Icon(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, display::ImageType type, std::string icon_name, bool revers, uint16_t frame_duration); + std::string name; + uint16_t frame_duration; + void next_frame(); + bool reverse; + }; +} + +#endif diff --git a/components/ehmtx/EHMTX_icons.cpp b/components/ehmtx/EHMTX_icons.cpp new file mode 100644 index 0000000..d667cb1 --- /dev/null +++ b/components/ehmtx/EHMTX_icons.cpp @@ -0,0 +1,37 @@ +#include "esphome.h" + +namespace esphome +{ + + EHMTX_Icon::EHMTX_Icon(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, display::ImageType type, std::string icon_name, bool revers, uint16_t frame_duration) + : Animation(data_start, width, height, animation_frame_count, type) + { + this->name = icon_name; + this->reverse = revers; + this->frame_duration = frame_duration; + this->counting_up = true; + } + + void EHMTX_Icon::next_frame() + { + if (this->get_animation_frame_count() > 1) + { + if (this->counting_up) + { + if (this->reverse && (this->get_current_frame() == this->get_animation_frame_count() - 2)) + { + this->counting_up = false; + } + Animation::next_frame(); + } + else + { + if (this->get_current_frame() == 1) // this->get_animation_frame_count()) + { + this->counting_up = true; + } + Animation::prev_frame(); + } + } + } +} diff --git a/components/ehmtx/EHMTX_queue.cpp b/components/ehmtx/EHMTX_queue.cpp new file mode 100644 index 0000000..ab358fc --- /dev/null +++ b/components/ehmtx/EHMTX_queue.cpp @@ -0,0 +1,250 @@ +#include "esphome.h" + +namespace esphome +{ + + EHMTX_queue::EHMTX_queue(EHMTX *config) + { + this->config_ = config; + this->endtime = 0; + this->last_time = 0; + this->centerx_ = 0; + this->shiftx_ = 0; + this->screen_time = 0; + this->mode = MODE_EMPTY; + this->icon_name = ""; + this->text = ""; + this->default_font = true; + } + + void EHMTX_queue::status() + { + switch (this->mode) + { + case MODE_EMPTY: + ESP_LOGD(TAG, "queue: empty slot"); + break; + case MODE_BLANK: + ESP_LOGD(TAG, "queue: show empty screen"); + break; + case MODE_CLOCK: + ESP_LOGD(TAG, "queue: show clock for %d sec", this->screen_time); + break; + case MODE_DATE: + ESP_LOGD(TAG, "queue: show date for %d sec", this->screen_time); + break; + case MODE_FULLSCREEN: + ESP_LOGD(TAG, "queue: show fullscreen: %s for %d sec", this->icon_name.c_str(), this->screen_time); + break; + case MODE_ICONSCREEN: + ESP_LOGD(TAG, "queue: show icon screen: %s text: %s for %d sec", this->icon_name.c_str(), this->text.c_str(), this->screen_time); + break; + case MODE_TEXT: + ESP_LOGD(TAG, "queue: show text text: %s for %d sec", this->text.c_str(), this->screen_time); + break; + case MODE_TIMER: + ESP_LOGD(TAG, "queue: show timer text: %s for %d sec", this->text.c_str(), this->screen_time); + break; + default: + ESP_LOGD(TAG, "queue: UPPS"); + break; + } + } + + bool EHMTX_queue::del_slot(uint8_t _icon) + { + if (this->icon == _icon) + { + this->endtime = 0; + ESP_LOGW(TAG, "delete screen icon: %d", _icon); + return true; + } + return false; + } + + void EHMTX_queue::reset_shiftx() + { + this->shiftx_ = 0; + } + + void EHMTX_queue::update_screen() + { + if (this->mode == MODE_ICONSCREEN) + { + if (millis() - this->config_->last_scroll_time >= this->config_->scroll_interval && this->pixels_ > TEXTSTARTOFFSET) + { + this->shiftx_++; + if (this->shiftx_ > this->pixels_ + TEXTSTARTOFFSET) + { + this->shiftx_ = 0; + } + this->config_->last_scroll_time = millis(); + } + } + if (this->mode == MODE_TEXT) + { + if (millis() - this->config_->last_scroll_time >= this->config_->scroll_interval && this->pixels_ >= 32) + { + this->shiftx_++; + if (this->shiftx_ > this->pixels_ + 32) + { + this->shiftx_ = 0; + } + this->config_->last_scroll_time = millis(); + } + } + + + if (millis() - this->config_->last_anim_time >= this->config_->icons[this->icon]->frame_duration) + { + this->config_->icons[this->icon]->next_frame(); + this->config_->last_anim_time = millis(); + } + } + + void EHMTX_queue::draw_() + { + } + + 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 extraoffset = 0; + + switch (this->mode) + { + case MODE_EMPTY: + break; + case MODE_BLANK: + break; + case MODE_CLOCK: + if (this->config_->clock->now().timestamp > 6000) // valid time + { + time_t ts = this->config_->clock->now().timestamp; + this->config_->display->strftime(xoffset + 15, yoffset, font, this->text_color, display::TextAlign::BASELINE_CENTER, this->config_->time_fmt.c_str(), + this->config_->clock->now()); + if ((this->config_->clock->now().second % 2 == 0) && this->config_->show_seconds) + { + this->config_->display->draw_pixel_at(0, 0, this->config_->clock_color); + } + this->config_->draw_day_of_week(); + } + else + { + this->config_->display->print(15+xoffset, yoffset, font, this->config_->alarm_color, display::TextAlign::BASELINE_CENTER, "!t!"); + } + break; + case MODE_DATE: + if (this->config_->clock->now().timestamp > 6000) // valid time + { + time_t ts = this->config_->clock->now().timestamp; + this->config_->display->strftime(xoffset + 15, yoffset, font, this->text_color, display::TextAlign::BASELINE_CENTER, this->config_->date_fmt.c_str(), + this->config_->clock->now()); + if ((this->config_->clock->now().second % 2 == 0) && this->config_->show_seconds) + { + this->config_->display->draw_pixel_at(0, 0, this->config_->clock_color); + } + this->config_->draw_day_of_week(); + } + else + { + this->config_->display->print(xoffset + 15, yoffset, font, this->config_->alarm_color, display::TextAlign::BASELINE_CENTER, "!d!"); + } + break; + case MODE_FULLSCREEN: + this->config_->display->image(0, 0, this->config_->icons[this->icon]); + break; + case MODE_ICONSCREEN: + { + if (this->pixels_ > TEXTSTARTOFFSET) + { + extraoffset = TEXTSTARTOFFSET; + } + if (this->config_->display_gauge) + { + extraoffset += 2; + } + + this->config_->display->print(this->centerx_ + TEXTSCROLLSTART - this->shiftx_ + extraoffset + xoffset, yoffset, font, this->text_color, esphome::display::TextAlign::BASELINE_LEFT, + this->text.c_str()); + + if (this->config_->display_alarm) + { + this->config_->display->draw_pixel_at(30, 0, this->config_->alarm_color); + this->config_->display->draw_pixel_at(31, 1, this->config_->alarm_color); + this->config_->display->draw_pixel_at(31, 0, this->config_->alarm_color); + } + + if (this->config_->display_gauge) + { + this->config_->draw_gauge(); + this->config_->display->image(2, 0, this->config_->icons[this->icon]); + this->config_->display->line(10, 0, 10, 7, esphome::display::COLOR_OFF); + } + else + { + this->config_->display->line(8, 0, 8, 7, esphome::display::COLOR_OFF); + this->config_->display->image(0, 0, this->config_->icons[this->icon]); + } + } + break; + case MODE_TEXT: + + if (this->pixels_ > 32) + { + extraoffset = 32; + } + if (this->config_->display_gauge) + { + extraoffset += 2; + } + + this->config_->display->print(this->centerx_ - this->shiftx_ + xoffset + extraoffset, yoffset, font, this->text_color, esphome::display::TextAlign::BASELINE_LEFT, + this->text.c_str()); + break; + case MODE_TIMER: + this->config_->display->image(0, 0, this->config_->icons[this->icon]); + this->config_->display->print(9+xoffset, yoffset, font, this->text_color, esphome::display::TextAlign::BASELINE_LEFT, + this->text.c_str()); + break; + default: + break; + } + this->update_screen(); + } + + void EHMTX_queue::hold_slot(uint8_t _sec) + { + this->endtime += _sec; + ESP_LOGD(TAG, "hold for %d secs", _sec); + } + + // TODO void EHMTX_queue::set_mode_icon() + void EHMTX_queue::set_text(std::string text, uint8_t icon, uint16_t pixel, uint16_t et, uint16_t screen_time) + { + this->text = text; + this->pixels_ = pixel; + + if (pixel < 23) + { + this->centerx_ = ceil((22 - pixel) / 2); + } + + this->shiftx_ = 0; + float display_duration = ceil((this->config_->scroll_count * (TEXTSTARTOFFSET + pixel) * this->config_->scroll_interval) / 1000); + this->screen_time = (display_duration > screen_time) ? display_duration : screen_time; + ESP_LOGD(TAG, "display text: %s pixels %d calculated: %d screen_time: %d default: %d", text.c_str(), pixel, this->screen_time, screen_time, this->config_->screen_time); + this->endtime = this->config_->clock->now().timestamp + et * 60; + this->icon = icon; + } + + void EHMTX_queue::set_text_color(uint8_t icon_id, Color text_color) + { + if (this->icon == icon_id) + { + this->text_color = text_color; + } + } +} diff --git a/components/ehmtx/__init__.py b/components/ehmtx/__init__.py new file mode 100644 index 0000000..c16ca2c --- /dev/null +++ b/components/ehmtx/__init__.py @@ -0,0 +1,412 @@ +from argparse import Namespace +import logging +import io +import requests + +from esphome import core, automation +from esphome.components import display, font, time +import esphome.components.image as espImage +import esphome.config_validation as cv +import esphome.codegen as cg +from esphome.const import CONF_BLUE, CONF_GREEN, CONF_RED, CONF_FILE, CONF_ID, CONF_BRIGHTNESS, CONF_RAW_DATA_ID, CONF_TIME, CONF_TRIGGER_ID +from esphome.core import CORE, HexInt +from esphome.cpp_generator import RawExpression + +_LOGGER = logging.getLogger(__name__) + +DEPENDENCIES = ["display", "light", "api"] +AUTO_LOAD = ["ehmtx"] +IMAGE_TYPE_RGB565 = 4 +MAXFRAMES = 110 +MAXICONS = 90 +ICONWIDTH = 8 +ICONHEIGHT = 8 +ICONBUFFERSIZE = ICONWIDTH * ICONHEIGHT * 4 +SVG_ICONSTART = '' +SVG_FULLSCREENSTART = '' +SVG_END = "" + +logging.warning(f"") +logging.warning(f"If you are upgrading EsphoMaTrix from a version before 2023.5.0,") +logging.warning(f"you should read the section https://github.com/lubeda/EsphoMaTrix/#how-to-update for tipps.") +logging.warning(f"") + +def rgb565_svg(x,y,r,g,b): + return f"> 2)},{(g << 2) | (g >> 4)},{(b << 3) | (b >> 2)});\" x=\"{x*10}\" y=\"{y*10}\" width=\"10\" height=\"10\"/>" + +ehmtx_ns = cg.esphome_ns.namespace("esphome") +EHMTX_ = ehmtx_ns.class_("EHMTX", cg.Component) +Icons_ = ehmtx_ns.class_("EHMTX_Icon") + +NextScreenTrigger = ehmtx_ns.class_( + "EHMTXNextScreenTrigger", automation.Trigger.template(cg.std_string) +) + +ExpiredScreenTrigger = ehmtx_ns.class_( + "EHMTXExpiredScreenTrigger", automation.Trigger.template(cg.std_string) +) + +NextClockTrigger = ehmtx_ns.class_( + "EHMTXNextClockTrigger", automation.Trigger.template(cg.std_string) +) + +CONF_CLOCKTIME = "clock_time" +CONF_SCREENTIME = "screen_time" +CONF_EHMTX = "ehmtx" +CONF_URL = "url" +CONF_FLAG = "flag" +CONF_TIMECOMPONENT = "time_component" +CONF_LAMEID = "lameid" +CONF_LIFETIME = "lifetime" +CONF_ICONS = "icons" +CONF_SHOWDOW = "show_dow" +CONF_SHOWDATE = "show_date" +CONF_FRAMEDURATION = "frame_duration" +CONF_HOLD_TIME = "hold_time" +CONF_SCROLLCOUNT = "scroll_count" +CONF_MATRIXCOMPONENT = "matrix_component" +CONF_HTML = "icons2html" +CONF_SCROLLINTERVAL = "scroll_interval" +CONF_FRAMEINTERVAL = "frame_interval" +CONF_DEFAULT_FONT_ID = "default_font_id" +CONF_DEFAULT_FONT = "default_font" +CONF_DEFAULT_FONT_XOFFSET = "default_font_xoffset" +CONF_DEFAULT_FONT_YOFFSET = "default_font_yoffset" +CONF_special_FONT_ID = "special_font_id" +CONF_special_FONT_XOFFSET = "special_font_xoffset" +CONF_special_FONT_YOFFSET = "special_font_yoffset" +CONF_PINGPONG = "pingpong" +CONF_TIME_FORMAT = "time_format" +CONF_DATE_FORMAT = "date_format" +CONF_ON_NEXT_SCREEN = "on_next_screen" +CONF_ON_NEXT_CLOCK = "on_next_clock" +CONF_ON_EXPIRED_SCREEN= "on_expired_screen" +CONF_SHOW_SECONDS = "show_seconds" +CONF_WEEK_START_MONDAY = "week_start_monday" +CONF_ICON = "icon_name" +CONF_TEXT = "text" +CONF_ALARM = "alarm" + +EHMTX_SCHEMA = cv.Schema({ + cv.Required(CONF_ID): cv.declare_id(EHMTX_), + cv.Required(CONF_TIMECOMPONENT): cv.use_id(time), + cv.Required(CONF_MATRIXCOMPONENT): cv.use_id(display), + cv.Required(CONF_DEFAULT_FONT_ID): cv.use_id(font), + cv.Required(CONF_special_FONT_ID): cv.use_id(font), + cv.Optional( + CONF_CLOCKTIME, default="5" + ): cv.templatable(cv.positive_int), + cv.Optional( + CONF_HTML, default=False + ): cv.boolean, + cv.Optional( + CONF_SHOW_SECONDS, default=False + ): cv.boolean, + cv.Optional( + CONF_SHOWDATE, default=True + ): cv.boolean, + cv.Optional( + CONF_WEEK_START_MONDAY, default=True + ): cv.boolean, + cv.Optional( + CONF_SHOWDOW, default=True + ): cv.boolean, + cv.Optional( + CONF_SHOWDATE, default=True + ): cv.boolean, + cv.Optional( + CONF_TIME_FORMAT, default="%H:%M" + ): cv.string, + cv.Optional( + CONF_DATE_FORMAT, default="%d.%m." + ): cv.string, + cv.Optional( + CONF_DEFAULT_FONT_XOFFSET, default="1" + ): cv.templatable(cv.int_range(min=-32, max=32)), + cv.Optional( + CONF_DEFAULT_FONT_YOFFSET, default="6" + ): cv.templatable(cv.int_range(min=-32, max=32)), + cv.Optional( + CONF_special_FONT_XOFFSET, default="1" + ): cv.templatable(cv.int_range(min=-32, max=32)), + cv.Optional( + CONF_special_FONT_YOFFSET, default="6" + ): cv.templatable(cv.int_range(min=-32, max=32)), + cv.Optional( + CONF_HOLD_TIME, default="20" + ): cv.templatable(cv.int_range(min=0, max=3600)), + cv.Optional(CONF_SCROLLINTERVAL, default="80" + ): cv.templatable(cv.positive_int), + cv.Optional(CONF_SCROLLCOUNT, default="2" + ): cv.templatable(cv.positive_int), + cv.Optional( + CONF_FRAMEINTERVAL, default="192" + ): cv.templatable(cv.positive_int), + cv.Optional( + CONF_SCREENTIME, default="8" + ): cv.templatable(cv.positive_int), + cv.Optional(CONF_BRIGHTNESS, default=80): cv.templatable(cv.int_range(min=0, max=255)), + cv.Optional(CONF_ON_NEXT_SCREEN): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(NextScreenTrigger), + } + ), + cv.Optional(CONF_ON_EXPIRED_SCREEN): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(NextScreenTrigger), + } + ), + cv.Optional(CONF_ON_NEXT_CLOCK): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(NextClockTrigger), + } + ), + cv.Optional(CONF_ON_EXPIRED_SCREEN): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ExpiredScreenTrigger), + } + ), + cv.Required(CONF_ICONS): cv.All( + cv.ensure_list( + { + cv.Required(CONF_ID): cv.declare_id(Icons_), + + cv.Exclusive(CONF_FILE,"uri"): cv.file_, + cv.Exclusive(CONF_URL,"uri"): cv.url, + cv.Exclusive(CONF_LAMEID,"uri"): cv.string, + cv.Optional( + CONF_FRAMEDURATION, default="0" + ): cv.templatable(cv.positive_int), + cv.Optional( + CONF_PINGPONG, default=False + ): cv.boolean, + cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8), + } + ), + cv.Length(max=MAXICONS), + )}) + +CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, EHMTX_SCHEMA) + +SET_COLOR_ACTION_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.use_id(EHMTX_), + cv.Optional(CONF_RED,default="80"): cv.templatable(cv.uint8_t), + cv.Optional(CONF_BLUE,default="80"): cv.templatable(cv.uint8_t), + cv.Optional(CONF_GREEN,default="80"): cv.templatable(cv.uint8_t), + } +) + +SetTodayColorAction = ehmtx_ns.class_("SetTodayColor", automation.Action) + +@automation.register_action( + "ehmtx.today.color", SetTodayColorAction, SET_COLOR_ACTION_SCHEMA +) +async def ehmtx_set_today_color_action_to_code(config, action_id, template_arg, args): + paren = await cg.get_variable(config[CONF_ID]) + + var = cg.new_Pvariable(action_id, template_arg, paren) + template_ = await cg.templatable(config[CONF_RED], args, cg.int_) + cg.add(var.set_red(template_)) + template_ = await cg.templatable(config[CONF_GREEN], args, cg.int_) + cg.add(var.set_green(template_)) + template_ = await cg.templatable(config[CONF_BLUE], args, cg.int_) + cg.add(var.set_blue(template_)) + return var + +SetWeekdayColorAction = ehmtx_ns.class_("SetWeekdayColor", automation.Action) + +@automation.register_action( + "ehmtx.weekday.color", SetWeekdayColorAction, SET_COLOR_ACTION_SCHEMA +) + +async def ehmtx_set_week_color_action_to_code(config, action_id, template_arg, args): + paren = await cg.get_variable(config[CONF_ID]) + + var = cg.new_Pvariable(action_id, template_arg, paren) + template_ = await cg.templatable(config[CONF_RED], args, cg.int_) + cg.add(var.set_red(template_)) + template_ = await cg.templatable(config[CONF_GREEN], args, cg.int_) + cg.add(var.set_green(template_)) + template_ = await cg.templatable(config[CONF_BLUE], args, cg.int_) + cg.add(var.set_blue(template_)) + + return var + + + +CODEOWNERS = ["@lubeda"] + +async def to_code(config): + + from PIL import Image, ImageSequence + + def openImageFile(path): + try: + return Image.open(path) + except Exception as e: + raise core.EsphomeError(f" ICONS: Could not load image file {path}: {e}") + + def thumbnails(frames): + for frame in frames: + thumbnail = frame.copy() + thumbnail.thumbnail((32,8), Image.ANTIALIAS) + yield thumbnail + + var = cg.new_Pvariable(config[CONF_ID]) + + logging.info(f"Preparing icons, this may take some seconds.") + + html_string = F"{CORE.config_path}" + html_string += '''\ + \ +''' + + yaml_string= "" + + for conf in config[CONF_ICONS]: + + if CONF_FILE in conf: + path = CORE.relative_config_path(conf[CONF_FILE]) + try: + image = openImageFile(path) + except Exception as e: + raise core.EsphomeError(f" ICONS: Could not load image file {path}: {e}") + elif CONF_LAMEID in conf: + r = requests.get("https://developer.lametric.com/content/apps/icon_thumbs/" + conf[CONF_LAMEID], timeout=4.0) + if r.status_code != requests.codes.ok: + raise core.EsphomeError(f" ICONS: Could not download image file {conf[CONF_LAMEID]}: {conf[CONF_ID]}") + image = Image.open(io.BytesIO(r.content)) + elif CONF_URL in conf: + r = requests.get(conf[CONF_URL], timeout=4.0) + if r.status_code != requests.codes.ok: + raise core.EsphomeError(f" ICONS: Could not download image file {conf[CONF_URL]}: {conf[CONF_ID]}") + image = Image.open(io.BytesIO(r.content)) + + width, height = image.size + + if hasattr(image, 'n_frames'): + frames = min(image.n_frames, MAXFRAMES) + else: + frames = 1 + + if ((width != 4*ICONWIDTH) or (width != ICONWIDTH)) and (height != ICONHEIGHT): + logging.warning(f" icon wrong size valid 8x8 or 8x32: {conf[CONF_ID]} skipped!") + else: + if (conf[CONF_FRAMEDURATION] == 0): + try: + duration = image.info['duration'] + except: + duration = config[CONF_FRAMEINTERVAL] + else: + duration = conf[CONF_FRAMEDURATION] + + html_string += F"
{conf[CONF_ID]} - ({duration} ms):
" + yaml_string += F"\"{conf[CONF_ID]}\"," + pos = 0 + frameIndex = 0 + html_string += f"
" + data = [0 for _ in range(ICONBUFFERSIZE * 2 * frames)] + for frameIndex in range(frames): + + image.seek(frameIndex) + frame = image.convert("RGB") + pixels = list(frame.getdata()) + width, height = image.size + if width == 8: + html_string += SVG_ICONSTART + else: + html_string += SVG_FULLSCREENSTART + i = 0 + for pix in pixels: + R = pix[0] >> 3 + G = pix[1] >> 2 + B = pix[2] >> 3 + x = (i % width) + y = i//width + i +=1 + rgb = (R << 11) | (G << 5) | B + html_string += rgb565_svg(x,y,R,G,B) + data[pos] = rgb >> 8 + pos += 1 + data[pos] = rgb & 255 + pos += 1 + html_string += SVG_END + html_string += f"
" + + rhs = [HexInt(x) for x in data] + + prog_arr = cg.progmem_array(conf[CONF_RAW_DATA_ID], rhs) + + cg.new_Pvariable( + conf[CONF_ID], + prog_arr, + width, + height, + frames, + espImage.IMAGE_TYPE["RGB565"], + str(conf[CONF_ID]), + conf[CONF_PINGPONG], + duration, + ) + + cg.add(var.add_icon(RawExpression(str(conf[CONF_ID])))) + + html_string += "" + + if config[CONF_HTML]: + try: + htmlfn = CORE.config_path.replace(".yaml","") + ".html" + with open(htmlfn, 'w') as f: + f.truncate() + f.write(html_string) + f.close() + logging.info(f"EsphoMaTrix: wrote html-file with icon preview: {htmlfn}") + + except: + logging.warning(f"EsphoMaTrix: Error writing HTML file: {htmlfn}") + + logging.info("List of icons for e.g. blueprint:\n\n\r["+yaml_string+"]\n") + + disp = await cg.get_variable(config[CONF_MATRIXCOMPONENT]) + cg.add(var.set_display(disp)) + + f = await cg.get_variable(config[CONF_DEFAULT_FONT_ID]) + cg.add(var.set_default_font(f)) + + f = await cg.get_variable(config[CONF_special_FONT_ID]) + cg.add(var.set_special_font(f)) + + ehmtxtime = await cg.get_variable(config[CONF_TIMECOMPONENT]) + cg.add(var.set_clock(ehmtxtime)) + + cg.add(var.set_clock_time(config[CONF_CLOCKTIME])) + cg.add(var.set_brightness(config[CONF_BRIGHTNESS])) + cg.add(var.set_screen_time(config[CONF_SCREENTIME])) + cg.add(var.set_scroll_interval(config[CONF_SCROLLINTERVAL])) + 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_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_hold_time(config[CONF_HOLD_TIME])) + 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, "x"), (cg.std_string, "y")], conf) + + for conf in config.get(CONF_ON_NEXT_CLOCK, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [], conf) + + for conf in config.get(CONF_ON_EXPIRED_SCREEN, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [(cg.std_string, "x"), (cg.std_string, "y")] , conf) + + await cg.register_component(var, config) diff --git a/fullfeature.yaml b/fullfeature.yaml new file mode 100644 index 0000000..cbdd9fa --- /dev/null +++ b/fullfeature.yaml @@ -0,0 +1,164 @@ +# esphome config file with all features +substitutions: + devicename: ehmtx8266 + ledpin: GPIO02 + board: d1_mini + loglevel: DEBUG + +external_components: + - source: + type: git + url: https://github.com/lubeda/EsphoMaTrix + +esphome: + name: $devicename + on_boot: + priority: -100 + then: + - ehmtx.text.color: + id: rgb8x32 + red: !lambda return 200; + green: !lambda return 100; + blue: !lambda return 50; + - ehmtx.clock.color: + id: rgb8x32 + red: !lambda return 150; + green: !lambda return 0; + blue: !lambda return 100; + - ehmtx.today.color: + id: rgb8x32 + red: !lambda return 0; + green: !lambda return 100; + blue: !lambda return 0; + - ehmtx.weekday.color: + id: rgb8x32 + red: !lambda return 0; + green: !lambda return 0; + blue: !lambda return 100; + - ehmtx.alarm.color: + id: rgb8x32 + red: !lambda return 200; + green: !lambda return 150; + blue: !lambda return 30; + +web_server: + port: 80 + +esp8266: + board: $board + +font: + - file: monobit.ttf + id: ehmtx_font + size: 16 + glyphs: | + !?"%()+*=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz€@<>/ + +logger: + level: $loglevel + +api: + services: + +ota: + password: !secret ota_password + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + +light: + - platform: neopixelbus + id: ehmtx_light + type: GRB + variant: WS2812 + pin: $ledpin + num_leds: 256 + color_correct: [30%, 30%, 30%] + name: "$devicename Light" + restore_mode: ALWAYS_OFF + on_turn_on: + lambda: |- + id(ehmtx_display)->set_enabled(false); + on_turn_off: + lambda: |- + id(ehmtx_display)->set_enabled(true); + +time: + - platform: homeassistant + id: ehmtx_time + +display: + - platform: addressable_light + id: ehmtx_display + addressable_light_id: ehmtx_light + width: 32 + height: 8 + pixel_mapper: |- + if (x % 2 == 0) { + return (x * 8) + y; + } + return (x * 8) + (7 - y); + rotation: 0° + update_interval: 16ms + auto_clear_enabled: true + lambda: |- + id(rgb8x32)->tick(); + id(rgb8x32)->draw(); + +sensor: + - platform: uptime + name: Uptime Sensor + +ehmtx: + id: rgb8x32 + time_component: ehmtx_time + matrix_component: ehmtx_display + clock_time: 5 # seconds + screen_time: 8 # seconds + font_id: ehmtx_font + show_dow: true # day of week + icons2html: true # generate html with con overview + brightness: 80 # percent + time_format: "%H:%M" + date_format: "%d.%m." + week_start_monday: true + xoffset: 1 + yoffset: 2 + scroll_count: 2 + scroll_interval: 80 + frame_interval: 192 + + on_next_screen: # trigger on screen change + lambda: |- + ESP_LOGD("TriggerTest","Iconname: %s",x.c_str()); + ESP_LOGI("TriggerTest","Text: %s",y.c_str()); + + on_next_clock: # trigger on clock display + then: + - ehmtx.clock.color: + id: rgb8x32 + red: !lambda return 150; + green: !lambda return rand() % 255; + blue: !lambda return 100; + + icons: + - id: xani + lameid: 6075 + - id: xsta + lameid: 11236 + - url: https://developer.lametric.com/content/apps/icon_thumbs/48720.gif + pingpong: true + id: pipo + frame_duration: 300 + - lameid: 5965 + frame_duration: 180 + id: d180 + - lameid: 5965 + frame_duration: 80 + id: d080 + - id: fullscreen + file: sample8x32.gif + - id: samplegif + file: sample8x8.gif + diff --git a/images/booting.png b/images/booting.png new file mode 100644 index 0000000000000000000000000000000000000000..302ec4666df52617c6437ad98f4e856b0f9deec4 GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yo16Y`WxRBPPFwn>>$y0f7#To5UU%GM--h)Hz{a6(pVY6!o76ug;mWbm)2icqUc#zC=$cX z_fIEGHfBy~X@MxqL3x32adlU5&5yg6Tu=)6VBJ?;@&4ZQ-R~I|MyAdZoxx&q*X%N< z=b5MBM;~Z2aa{i3IAvz4ig9=3mo@9Ft=vn+A4mR(=Uv6x&1g5VVxHtO-#v~tyECQd zeD73VqqF+R^CQA)u@inweBE_Ce~z~vw~cX9+U3GW92+BEB`xiaym_S~y<_pJWx@L< ze2#d!=V;{WYmvX_{b^m;v~SWwtFwVB8(LI?1Qssn<65;raB-;mQKwnomdgDTygpxP zy3;x?2}`knX11GOoBtnte=q9jOHF-E6~!{L)I=A~%*xT|N8%@{ezpb5P z#}N7I>L=cU0*;>P8r6G`@BY2}_qXSg+v_LPF<6=uP1tfRZU-=4*aCb)T!FOV3-!&( zzn%kGoCO|{#S9F3N+8U*>e1avK*2aq7srr{dvDKe(7)3~~;R$2Y#>V}6>_I(Hxk<(a1%?u1X$Je` Vxr-bkB!MxRBPW07q36wcn&opRtc-{)~RIvv|`XP4cEH*a@ryKcUm`OzZu_;Xp)ti8Oeb^e*p64qYFX*%me$IQ~AL#Gcpzuvj# zk?q3?Gp`9BNFDBrJ<4d=R@uJIX_*R^mAl%=})!wo-gjHHJXPK;bMZga2#G8}k zXJ{8WeQZn8o^0;@Jw!hzYGZo(6ur&OoN6=Gy4oD)g&IBKIGxq~NNDn357GMF@B6z> z3tZP)W^pXyu+#UyE9`&VT{~Omg}$1p>wJHfbX07MZCa`O_oY!Y8&ibt`8}QeY~fcnDe>;TQ@>g6 zY~N90TFU#I{ler)ZI6~NX7G4_31Fv)nd1DpKlLr$b>+Dwy?g#YxXj+fWVxp((0h!v7+(4Tx04UFukxeK>Q5?m82AM<_W+5qWft4vCS!#$BHH}fe7T$YfX4JfAdT%Bh zOJ%Dpd~6IBHr8w{Y?V?zO13su#727l_s!HyYLr{I`|I3$PWPS*fkMW#+`2xn?3@#u zh-h>33tGbqb+izqldx{O+3A__I912z9W`pb4XZ5vH<}YGt_d}o@Q9gpa>C2PL+iP$ z;yvMznbs4+XTrUXTu}Hy=|+)X6{ma-sLYTPkBth4gtb%!8x?G(9ZPsnxGQ1Vk{_5W zazgQjVk?t3OZQYSY+A8rXOu3pg9#>?CW?kZo>emB2+L}V;u4enNELs(?~jVh5Z5ZE zIL27RLihcsKlt6Pn;hsbCN)K%{@L^1yP;tRzPCN^>&WxIkD>MnF72{^tpLLxqHmYA zu0v?qg!8MiX6(Yn7PLKPbw~H5TA6`l65dYbo93bQ1{xQOy_NPkxrexPHFXX92hfv} z?4>I24p#Q|=NZ30B0rMoa=3c}xDkP3H1KTCy;GGWV{Td$-KJdlt_D1PBly!2bm< zCTDZX)#PkWxtjn21PBn|Fkp$kcSj~R_m=2)cV=R9Z;9Ls5FkK+0LKC=2b5QUl>^Ev zKzRWI1PBn|M4%)_qR0RjXFa2T*v*4qMGWxXx1RRRPE5Fo&@z;=qr0oy4e r2W%%mfB*pk1PBlyK!5;W42-w{Lqup$cfqB?00000NkvXXu0mjfRhu#7 literal 0 HcmV?d00001 diff --git a/images/icon_screen.png b/images/icon_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..eac5ced1c29d894b160051133f876e95e1895300 GIT binary patch literal 695 zcmV;o0!aOdP)4Tx04UFukxeK>Q5?m82AM<_W+5qWft4vCS!#$BHH}fe7T$YfX4JfAdT%Bh zOJ%Dpd~6IBHr8w{Y?V?zO13su#727l_s!HyYLr{I`|I3$PWPS*fkMW#+`2xn?3@#u zh-h>33tGbqb+izqldx{O+3A__I912z9W`pb4XZ5vH<}YGt_d}o@Q9gpa>C2PL+iP$ z;yvMznbs4+XTrUXTu}Hy=|+)X6{ma-sLYTPkBth4gtb%!8x?G(9ZPsnxGQ1Vk{_5W zazgQjVk?t3OZQYSY+A8rXOu3pg9#>?CW?kZo>emB2+L}V;u4enNELs(?~jVh5Z5ZE zIL27RLihcsKlt6Pn;hsbCN)K%{@L^1yP;tRzPCN^>&WxIkD>MnF72{^tpLLxqHmYA zu0v?qg!8MiX6(Yn7PLKPbw~H5TA6`l65dYbo93bQ1{xQOy_NPkxrexPHFXX92hfv} z?4>I24p#Q|=NZ30B0rMoa?sB#SR^w1|UFy00HI(hD`x`>q5tf4In^(00E`} z-lc!3+3Mfa0MI!??-U;(K!5-N<^fh)Q#Ma24WQcgKxcE=`T(i{R0F66 dP;FbF*#q9YbE$PY*aZLp002ovPDHLkV1kGhF(&{3 literal 0 HcmV?d00001 diff --git a/images/icon_screen_show.png b/images/icon_screen_show.png new file mode 100644 index 0000000000000000000000000000000000000000..648f9a72554fd1703441ec08de5f7cfddc60fcde GIT binary patch literal 708 zcmV;#0z3VQP)4Tx04UFukxeK>Q5?m82AM<_W+5qWft4vCS!#$BHH}fe7T$YfX4JfAdT%Bh zOJ%Dpd~6IBHr8w{Y?V?zO13su#727l_s!HyYLr{I`|I3$PWPS*fkMW#+`2xn?3@#u zh-h>33tGbqb+izqldx{O+3A__I912z9W`pb4XZ5vH<}YGt_d}o@Q9gpa>C2PL+iP$ z;yvMznbs4+XTrUXTu}Hy=|+)X6{ma-sLYTPkBth4gtb%!8x?G(9ZPsnxGQ1Vk{_5W zazgQjVk?t3OZQYSY+A8rXOu3pg9#>?CW?kZo>emB2+L}V;u4enNELs(?~jVh5Z5ZE zIL27RLihcsKlt6Pn;hsbCN)K%{@L^1yP;tRzPCN^>&WxIkD>MnF72{^tpLLxqHmYA zu0v?qg!8MiX6(Yn7PLKPbw~H5TA6`l65dYbo93bQ1{xQOy_NPkxrexPHFXX92hfv} z?4>I24p#Q|=NZ30B0rMoaHMYpM`nVFe0 zGc!eA|Fk>j1poj532;bRa{vG?A^-p`A_1!6-I4$R0KrK_K~!ko?byK$gdh+=QChHt zZNV07VO!W1Y=N>39GvWg88IZpG5?O z?Y|L+zW_jh009Dw2&|Jn&|JDDSKs-=o&W*_2oT`YfZvh~JFdF>8!NPV8h`)+0tEOL zpjn5gwVmm>umJ=J5Fo&)z+Y)EiB0_r^Bt!57C)B&0t5&UU@%~{iBfF!Da|UM0R#vT qAi!WiWmC~(|0000cmR%jdfN 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 A;Q#;t literal 0 HcmV?d00001 diff --git a/images/text_screen.png b/images/text_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcea0d40d0a9826c6a717fd57eae210be1834ae GIT binary patch literal 619 zcmV-x0+juUP)4Tx04UFukxeK>Q5?m82AM<_W+5qWft4vCS!#$BHH}fe7T$YfX4JfAdT%Bh zOJ%Dpd~6IBHr8w{Y?V?zO13su#727l_s!HyYLr{I`|I3$PWPS*fkMW#+`2xn?3@#u zh-h>33tGbqb+izqldx{O+3A__I912z9W`pb4XZ5vH<}YGt_d}o@Q9gpa>C2PL+iP$ z;yvMznbs4+XTrUXTu}Hy=|+)X6{ma-sLYTPkBth4gtb%!8x?G(9ZPsnxGQ1Vk{_5W zazgQjVk?t3OZQYSY+A8rXOu3pg9#>?CW?kZo>emB2+L}V;u4enNELs(?~jVh5Z5ZE zIL27RLihcsKlt6Pn;hsbCN)K%{@L^1yP;tRzPCN^>&WxIkD>MnF72{^tpLLxqHmYA zu0v?qg!8MiX6(Yn7PLKPbw~H5TA6`l65dYbo93bQ1{xQOy_NPkxrexPHFXX92hfv} z?4>I24p#Q|=NZ30B0rMoafBz%8MsX#XA51002ovPDHLk FV1hK`4+8)I literal 0 HcmV?d00001 diff --git a/images/timingv2.png b/images/timingv2.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf9e992a1f659ef8297160692de349d46b87afb GIT binary patch literal 183518 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%0Ad#3Q%hu0CUtXb-`?4?KW> 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 z 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