Zegarek podświetlany z niemymi powiadomieniami DIY

Do wyświetlenia czasu potrzebna w lambdzie jest tylko jedna linijka

it.strftime(36, 0, id(digit_font), "%H:%M", id(homeassistant_time).now()); 

oczywiście jeśli zmieniłeś platformę czasu na taką jak sugerowałem to

it.strftime(36, 0, id(digit_font), "%H:%M", id(sntp_time).now()); 

beż żadnych warunków i uzależniania się od wielu czynników
“nie od razu Kraków zbudowano”
i szczerze mówiąc uważam, że jako początkujący powinieneś budować sobie tego YAMLa po kawałeczku bazując na dokumentacji, a nie od razu z grubej rury (bo nie zrozumiesz całego kodu jeśli nie przyswoisz jego elementów składowych).

Chociaż szczerze mówiąc nie mam pojęcia czemu rysowanie czasu ma się zacząć w pikselu 36 kolumny (a nie np. w zerowej kolumnie, no ale jeśli wyświetlasz coś innego w innym miejscu to może ma to sens, ale normalnie 36 kolumna to jest już poza wyświetlaczem zbudowanym z 4 paneli 8x8pix), więc na dobry start może jakoś tak

it.strftime(0, 0, id(digit_font), "%H:%M", id(homeassistant_time).now());

a potem przyjdzie czas na zabawę w rozplanowanie co ma gdzie być, czy wykorzystanie scrolla

może tajemnica tkwiła tu (autor kodu ma 2x szerszy wyświetlacz niż 4 moduły, czyli szeroki na 64 piksele; ewentualnie wykorzystywał jakieś triki z wyświetlaniem na modułach których nie ma, nie wiem czy sterownik dla max7219 to umożliwia, ale czasem jest możliwe rysowanie poza fizycznym obszarem wyświetlacza)

usiądź do dokumentacji tego typu wyświetlacza i pobaw się sam

Możesz zobaczyć mój kod.
Jeśli chcesz tylko godzinę i tekst zostawiasz case 1, case 2 oraz case 6.
Za przełączanie pomiędzy ekranami odpowiada Node-RED
Z utworzonych czujników masz możliwość podglądu zegarka w Home Assistant.

substitutions:
  name: zegar-matrix  # Unikalna nazwa projektu
  friendly_name: Zegar-Matrix  # Przyjazna nazwa dla interfejsu użytkownika

esphome:
  name: ${name}
  friendly_name: ${friendly_name}

esp32:
  board: esp32dev  # Model płytki ESP32

# Włączenie logowania
logger:
  level: DEBUG  # Ustawienie poziomu logowania na DEBUG

# Włączenie API Home Assistant
api:

ota:
  platform: esphome  # Obsługa aktualizacji over-the-air

improv_serial:  # Umożliwienie konfiguracji za pomocą Improv

wifi:
  ssid: !secret wifi_ssid  # SSID sieci WiFi (ukryte w secrets.yaml)
  password: !secret wifi_password  # Hasło WiFi (ukryte w secrets.yaml)
  fast_connect: true  # Szybsze łączenie z WiFi
  reboot_timeout: 5min  # Czas oczekiwania przed ponownym uruchomieniem w przypadku problemów z WiFi

  # Konfiguracja hotspotu awaryjnego
  ap:
    ssid: "zegar-matrix Fallback Hotspot"  # Nazwa hotspotu
    password: !secret fallback_ap_password  # Hasło hotspotu

captive_portal:  # Portal przechwytujący dla trybu AP

web_server:
  port: 80  # Uruchomienie serwera WWW na porcie 80

esp32_ble_tracker:  # Włączenie śledzenia BLE

bluetooth_proxy:
  active: true  # Aktywowanie proxy Bluetooth

time:
  - platform: homeassistant  # Synchronizacja czasu z Home Assistant
    id: homeassistant_time

globals:
  - id: hapage  # Zmienna globalna do przechowywania aktualnej strony
    type: int
    restore_value: no
    initial_value: '1'

spi:
  clk_pin: GPIO18  # Pin zegarowy SPI
  mosi_pin: GPIO23  # Pin danych SPI

display:
  - platform: max7219digit
    id: display_max
    cs_pin: GPIO5  # Pin CS dla wyświetlacza
    num_chips: 4  # Liczba układów MAX7219
    num_chip_lines: 1  # Liczba linii na chip
    intensity: 1  # Początkowa intensywność wyświetlacza
    scroll_speed: 250ms  # Prędkość przewijania tekstu
    update_interval: 100ms  # Częstotliwość odświeżania wyświetlacza
    lambda: |-
      // Wyświetlanie danych w zależności od aktualnej strony
      switch (id(hapage)) {
        case 1:
          it.strftime(5, 0, id(digit_font), "%H:%M", id(homeassistant_time).now());  // Wyświetlanie godziny
          break;
        case 2:
          it.strftime(5, 0, id(digit_font), "%H:%M", id(homeassistant_time).now());  // Wyświetlanie godziny
          break;
        case 3:
          it.printf(0, 0, id(digit_font), "%.1f°C", id(temp1).state);  // Wyświetlanie temperatury na zewnątrz
          it.scroll(true, max7219digit::STOP);
          break;
        case 4:
          it.printf(7, 0, id(digit_font), "%s%%", id(humi1).state.c_str());  // Wyświetlanie wilgotności
          break;
        case 5:
          it.printf(0, 0, id(digit_font), "%.1f°C", id(temp2).state);  // Wyświetlanie temperatury w salonie
          break;
        case 6:
          it.printf(0, 0, id(digit_font), "%s", id(hatxt).state.c_str());  // Wyświetlanie dowolnego tekstu
          it.scroll(true, max7219digit::STOP, 30, 1000, 1500);
          break;
        default:
          break;
      }
      it.invert_on_off(false);  // Wyłączanie odwrócenia kolorów

switch:
  - platform: template
    name: "Display Power Switch"  # Włącznik zasilania wyświetlacza
    icon: mdi:dots-grid
    optimistic: true
    restore_mode: RESTORE_DEFAULT_OFF  # Domyślnie wyłączony po restarcie
    turn_on_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: ON
    turn_off_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: OFF

font:
  - file: "font/pixelmix.ttf"  # Ścieżka do pliku czcionki
    id: digit_font
    size: 8  # Rozmiar czcionki
    glyphs:
    - ' '
    - '@'
    - '*'
    - '!'
    - '?'
    - '"'
    - '%'
    - (
    - )
    - +
    - ','
    - '-'
    - '/'
    - .
    - '0'
    - '1'
    - '2'
    - '3'
    - '4'
    - '5'
    - '6'
    - '7'
    - '8'
    - '9'
    - ':'
    - A
    - B
    - C
    - D
    - E
    - F
    - G
    - H
    - I
    - J
    - K
    - L
    - M
    - N
    - O
    - P
    - Q
    - R
    - S
    - T
    - U
    - V
    - W
    - X
    - Y
    - Z
    - _
    - a
    - b
    - c
    - d
    - e
    - f
    - g
    - h
    - i
    - j
    - k
    - l
    - m
    - n
    - o
    - p
    - q
    - r
    - s
    - t
    - u
    - v
    - w
    - x
    - y
    - z
    - °

text_sensor:
  - platform: wifi_info  # Informacje o WiFi
    ip_address:
      name: "${name} Display IP Address"
    ssid:
      name: "${name} Display Connected SSID"
    bssid:
      name: "${name} Display Connected BSSID"
    mac_address:
      name: "${name} Display Mac Wifi Address"
    scan_results:
      name: "${name} Display Latest Scan Results"

  - platform: homeassistant
    name: "HA Txt"  # Tekst z Home Assistant
    id: hatxt
    entity_id: input_text.matrix_text

  - platform: homeassistant
    name: "HA Brightness"  # Jasność z Home Assistant
    id: habri
    entity_id: input_number.matrix_bri

  - platform: homeassistant
    name: "Wilg Ogrod"  # Wilgotność zewnętrzna
    id: humi1
    entity_id: sensor.netatmo_ogrod_humidity

sensor:
  - platform: homeassistant
    name: "Temp Ogrod"  # Temperatura zewnętrzna
    id: temp1
    entity_id: sensor.netatmo_ogrod_temperature

  - platform: homeassistant
    name: "Temp Salon"  # Temperatura wewnętrzna
    id: temp2
    entity_id: sensor.netatmo_wewnatrz_temperature

  - platform: homeassistant
    id: hapage1  # Aktualna strona wyświetlacza
    entity_id: input_number.matrix_page
    on_value:
      then:
        if:
          condition:
            lambda: 'return id(hapage) != int(x);'  # Sprawdzanie zmiany strony
          then:
            - globals.set:
                id: hapage
                value: !lambda 'return int(x);'  # Ustawienie nowej strony

binary_sensor:
  - platform: template
    name: "${name} Power State"  # Stan zasilania wyświetlacza
    id: power_on_off
    internal: true

button:
  - platform: restart
    name: "Reset ${friendly_name}"  # Przycisk restartu urządzenia
    icon: "mdi:restart"

1 polubienie

Chyba jednak poleglem z tym :frowning: udaje mi sie wyswietlic godzinę , ale nigdzie nie moge dodac encji by moc wpisac swoj tekst tak jak masz to u siebie np.,żadna opcja taka jak pokazales u siebie sie nie wyswietla , Czy to sie jakos robi w Node red czy ja cos zle robie

Nie wiem na jakim etapie i jak skonfigurowane powiadomienia masz w Home Assistant ale zegarek musisz “doczepić” do tych powiadomień które już używasz. Kod ten to FLOW z 1 posta.
Czyli przykład
image
Czerwony node to podproces który w sobie ma cały kod powiadomień.
I w nim doklejasz tekst który na oprócz powiadomienia na tel, tv czy głośnik leci na zegarek.


i tu znów node Zegarek to podproces w którym jest kod z 1 postu pod opisem FLOW a w nim obsługa powiadomienia i zmiana ekranów

Nie napisałeś jakich i czy w ogóle używasz już powiadomień w node-red więc ciężko dokładnie napisać jak to masz zaimplementować.

OFF TOPIC
Bardzo fajnie, że komentujesz sobie YAMLa, ale mam takie drobne uwagi

bluetooth_proxy:
  active: true  # to jest  Bluetooth proxy w trybie aktywnym, 
                # jeśli false to też włączony tylko w trybie pasywnym
…
    num_chip_lines: 1  # Liczba linii użytych modułów, 
                       # jak chcemy zbudować wyświetlacz wyższy niż 8 pikseli
                       # to można dokładać kolejne linie modułów

no chyba nie umiem fajnie sformułować o co w tym ostatnim chodzi, ale niżej PR który kwestię wyjaśnia

edit swoją drogą to jest w dokumentacji, generalnie to jest powiązane z jeszcze jedną opcją chip_lines_style
co określa jak mamy połączone kolejne moduły 8x8pix
domyślny snake to połączenie

1 → 2 → 3 → 4 → 5 ⬎
⬐10 ← 9 ← 8 ← 7 ← 6
11 → 12 → 13 → 14 → 15 itd.

a zigzag (jeśli mamy do dyspozycji nie pojedyncze moduły, a gotowe płytki po 4 moduły, to takie połączenie jest jedyne możliwe, trochę mnie poniosło i rozrysowałem jakbyśmy mieli płytki po 5 modułów, ale na 8 w linii udających 2 płytki po 4 to mi już weny zabrakło, od biedy tak można łączyć też pojedyncze)

1 → 2 → 3 → 4 → 5⬎
⬐----------------←
6 → 7 → 8 → 9 → 10⬎
⬐-----------------←
11 → 12 → 13 → 14 → 15 itd.

to tak na wypadek gdyby ktoś miał ochotę zrobić “wyświetlacz gigant” (swoją drogą ciekawe jakie są maksymalne możliwe wymiary by to znośnie działało).

1 polubienie

witajcie
Wczorajsza noc była owocna:)
zgodnie z waszą sugestią budowałem po kawałku aż sie udało :slight_smile:
Udało mi sie troszkę ogarnąć, jednak napotkałem problem :slight_smile:
-nie wyświetla się powiadomienie z ‘text_dishwasher’,chociaż w encji normalnie sie wyświetla.

gdzie popełniłem błąd ???

poniżej kod:

globals:
  - id: last_display_time
    type: unsigned long
    restore_value: no
    initial_value: '0'
  - id: hapage
    type: int
    restore_value: no
    initial_value: '0'
    
spi:
  clk_pin: D5
  mosi_pin: D7


display:
  - platform: max7219digit
    id: display_max
    cs_pin: D8
    num_chips: 8
    intensity: 3
    scroll_speed: 50ms
    update_interval: 10s
    scroll_mode: continuous
    lambda: !lambda |-
      // Sprawdzamy, czy 'hatxt' zawiera tekst
      if (id(hatxt).state != "" && millis() - id(last_display_time) > 10000) {
        // Jeśli 'hatxt' nie jest pusty i minęły 10 sekund, wyświetlamy ten tekst
        it.printf(32, 0, id(digit_font), TextAlign::TOP_LEFT, "%s", id(hatxt).state.c_str());
        id(last_display_time) = millis();  // Zapisz czas wyświetlania
      }
      // Sprawdzamy, czy 'text_dishwasher' zawiera tekst
      else if (id(text_dishwasher).state != "") {
        // Jeśli 'text_dishwasher' zawiera tekst, wyświetlamy go
        it.printf(32, 0, id(digit_font), TextAlign::TOP_LEFT, "%s", id(text_dishwasher).state.c_str());
      }
      // Jeśli 'hatxt' jest pusty, wyświetlamy czas zegara
      else {
        it.strftime(32, 0, id(digit_font), "%H:%M", id(zegarek_time).now());  // Formatowanie czasu
      }

      // Zmieniamy jasność na podstawie godziny
      int hour = id(zegarek_time).now().hour;
      if (hour >= 22 || hour < 6) {
        // W godzinach 22:00-06:00 ustawiamy jasność na 50% (intensity = 8)
        it.set_intensity(8); // 50% jasności (0-15)
      } else {
        // W pozostałych godzinach ustawiamy jasność na 100% (intensity = 15)
        it.set_intensity(15); // 100% jasności
      }



text_sensor:
  - platform: homeassistant
    name: "HA Txt"
    id: hatxt
    entity_id: input_text.matrix_text  # Pobieranie tekstu z Home Assistant
    internal: true

  - platform: homeassistant
    name: "Dishwasher Completion Time"
    id: text_dishwasher
    entity_id: sensor.dishwasher_2021_completion_time  # Pobieranie tekstu z Home Assistant (np. czas zakończenia cyklu)
    internal: true


time:
  - platform: homeassistant
    id: zegarek_time
    update_interval: 60s
    
switch:
  - platform: template
    name: "Display Power Switch"
    icon: mdi:dots-grid
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    turn_on_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: ON
    turn_off_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: OFF

font:
  - file: "fonts/pixelmix.ttf"
    id: digit_font
    size: 8


     
    
sensor:                                    

  - platform: homeassistant
    id: hapage1
    entity_id: input_number.matrix_page
    on_value:
      then:
        if:
          condition:
            lambda: 'return id(hapage) != int(x);'
          then:
            - globals.set:
                id: hapage
                value: !lambda 'return int(x);'
                
binary_sensor:          
    
  - platform: template
    name: "Power State"
    id: power_on_off
    internal: true   ```

Wyedytuj post dodając 3x ` przed i za kodem. ( to nad Tab na klawiaturze)
Ile masz kostek wyświetlacza? bo w kodzie masz 8. Jeśli 4 wtedy zamiast it.printf(32, 0, daj 0,0 czyli od początku. scroll_speed: 100ms daj 250ms.
I napisz jak postępy.

jeżeli własnie jak daje 4 wtedy sie nie wyświetla
ogarnąłem już przewijanie został tylko jeden błąd.
encje w HA wygładają tak

no jeśli nie jesteś “wyjadaczem”, to pownieneś skonfigurować to poprawnie, tj. jeśli masz wyświetlacz z 4 modułów 8x8 pikseli MAX72119 to ma być

    num_chips: 4 

Tak naprawdę dla akurat równiutko 4 układów ustawionych w 1 linii można w ogóle ominąć tą linijkę, bo tyle jest domyślnie.
wtedy będzie Ci też łatwiej liczyć rzędy i kolumny pikseli wyświetlacza bo się będą zaczynały we współrzędnych x-y “0,0”, a nie w jakichś krzakach

ok poprawione:) dzięki

dodam tylko że w “homeassistant/automations.yaml”
mam dodany taki kod

  - alias: "Zaktualizuj czas zakończenia cyklu zmywarki"
    trigger:
      platform: state
      entity_id: sensor.dishwasher_2021_completion_time  # Zmienna z czasem zakończenia cyklu
    action:
      service: input_text.set_value
      target:
        entity_id: input_text.dishwasher_completion_time
      data:
        value: "{{ states('sensor.dishwasher_2021_completion_time') }}"  # Pobieranie wartości z sensora```

Ten zegarek będzie wyświetlał tylko ten czas zakończenia zmywarki poza zegarkiem? Bo chyba zawsze jakaś wartość będzie, nawet 0 minut więc zawsze będzie tekst więc nadpiszesz tym zegarek. Jak zmieniłeś na 4 kostki to wszędzie zaczynaj od 0,0
it.printf(0, 0, id(digit_font), "%s", id(text_dishwasher).state.c_str());

nie rozumiem.
Chce by wyświetlał sie czas do zakonczenia cyklu tak jak widać na encji w HA,a jeżeli zmywarka nie bedzie włączona to ma wyświetlać godzinę lub ewentualnie tekst z HA_text.

póki co wyświetla mi tylko godzinę i tekst z HA_jetx jeżlei jest wpisany

To zajrzyj w narzędzia deweloperskie dla tej encji oraz ustal co wyświetla o zakończeniu (nawet jeśli 0 to też coś tj. jakiś warunek można wymyślić)

to pokazuje

To będziesz musiał przejść na wersję jak w pierwszym poście czyli ekrany i je przełączać automatyzacją, bo tam pusto nigdy nie będzie.

substitutions:
  name: zegar-matrix
  friendly_name: Zegar-Matrix

esphome:
  name: ${name}
  friendly_name: ${friendly_name}

esp32:
  board: esp32dev

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  platform: esphome

improv_serial:



wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "zegar-matrix Fallback Hotspot"
    password: !secret fallback_ap_password

captive_portal:

web_server:
  port: 80


esp32_ble_tracker:
#  scan_parameters:
#    interval: 1100ms
#    window: 1100ms
#    active: true

bluetooth_proxy:
    active: true


time:
  - platform: homeassistant
    id: homeassistant_time

globals:
  - id: hapage
    type: int
    restore_value: no
    initial_value: '1'
    
spi:
  clk_pin: GPIO18
  mosi_pin: GPIO23

display:
  - platform: max7219digit
    id: display_max
    cs_pin: GPIO5
    num_chips: 4
    num_chip_lines: 1
    intensity: 1
    scroll_speed: 250ms
    update_interval: 100ms
    lambda: |-
           if(id(power_on_off).state) {  
           it.intensity(atoi(id(habri).state.c_str()));
           if (id(hapage) == 1) {
             it.strftime(5, 0, id(digit_font), "%H:%M", id(homeassistant_time).now());
             it.invert_on_off(false);
             it.scroll(false);
             }  else {
               if (id(hapage) == 2) {
               it.strftime(5, 0, id(digit_font), "%H:%M", id(homeassistant_time).now()); 
               it.invert_on_off(false);
               it.scroll(false);
                 
               } else {
                 if (id(hapage) == 3) {
                 it.printf(0, 0, id(digit_font), "%.1f°C", id(temp1).state); 
                 it.invert_on_off(false);
                 it.scroll(true, max7219digit::STOP);
                 
                 } else {
                    if (id(hapage) == 4) {
                    it.printf(7, 0, id(digit_font), "%s%%", id(humi1).state.c_str());
                    it.invert_on_off(false);
                    it.scroll(false);
                    
                    } else {
                      if (id(hapage) == 5) {
                      it.printf(0, 0, id(digit_font), "%.1f°C", id(temp2).state); 
                      it.invert_on_off(false);
                      it.scroll(false);
                    
                      } else {
                        if (id(hapage) == 6) { 
                        it.printf(0, 0, id(digit_font), "%s", id(hatxt).state.c_str());
                        it.invert_on_off(false);
                        it.scroll(true, max7219digit::STOP, 30, 1000, 1500);
                        }
                   
                   } } } } } };
switch:
  - platform: template
    name: "Display Power Switch"
    icon: mdi:dots-grid
    optimistic: true
#    restore_mode: RESTORE_DEFAULT_OFF
    turn_on_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: ON
    turn_off_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: OFF

font:
  - file: "font/pixelmix.ttf"
    id: digit_font
    size: 8
    glyphs:
    - ' '
    - '@'
    - '*'
    - '!'
    - '?'
    - '"'
    - '%'
    - (
    - )
    - +
    - ','
    - '-'
    - '/'
    - .
    - '0'
    - '1'
    - '2'
    - '3'
    - '4'
    - '5'
    - '6'
    - '7'
    - '8'
    - '9'
    - ':'
    - A
    - B
    - C
    - D
    - E
    - F
    - G
    - H
    - I
    - J
    - K
    - L
    - M
    - N
    - O
    - P
    - Q
    - R
    - S
    - T
    - U
    - V
    - W
    - X
    - Y
    - Z
    - _
    - a
    - b
    - c
    - d
    - e
    - f
    - g
    - h
    - i
    - j
    - k
    - l
    - m
    - n
    - o
    - p
    - q
    - r
    - s
    - t
    - u
    - v
    - w
    - x
    - y
    - z
    - °
text_sensor:
  - platform: wifi_info
    ip_address:
      name: "${name} Display IP Address"
    ssid:
      name: "${name} Display Connected SSID"
    bssid:
      name: "${name} Display Connected BSSID"
    mac_address:
      name: "${name} Display Mac Wifi Address"
    scan_results:
      name: "${name} Display Latest Scan Results"
      
  - platform: homeassistant
    name: "HA Txt"
    id: hatxt
    entity_id: input_text.matrix_text

  - platform: homeassistant
    name: "HA Brightness"
    id: habri
    entity_id: input_number.matrix_bri
    

  - platform: homeassistant
    name: "Wilg Ogrod"
    id: humi1
    entity_id: sensor.netatmo_ogrod_humidity
    
sensor:                                        
  - platform: homeassistant
    name: "Temp Ogrod"
    id: temp1
    entity_id: sensor.netatmo_ogrod_temperature
      
  - platform: homeassistant
    name: "Temp Salon"
    id: temp2
    entity_id: sensor.netatmo_wewnatrz_temperature

  - platform: homeassistant
    id: hapage1
    entity_id: input_number.matrix_page
    on_value:
      then:
        if:
          condition:
            lambda: 'return id(hapage) != int(x);'
          then:
            - globals.set:
                id: hapage
                value: !lambda 'return int(x);'
                
binary_sensor:          
  - platform: template
    name: "${name} Power State"
    id: power_on_off
    internal: true

button:
  - platform: restart
    name: "Reset ${friendly_name}"
    icon: "mdi:restart"
    

czy jest szansa byś mi pomógł ? nie wiem jak sie do tego zabrać

to mój kod

  - id: last_display_time
    type: unsigned long
    restore_value: no
    initial_value: '0'
  - id: hapage
    type: int
    restore_value: no
    initial_value: '0'
    
spi:
  clk_pin: D5
  mosi_pin: D7

display:
  - platform: max7219digit
    id: display_max
    cs_pin: D8
    num_chips: 4
    intensity: 3
    scroll_speed: 50ms
    update_interval: 10s
    scroll_mode: continuous
    lambda: !lambda |-
      // Sprawdzamy, czy 'hatxt' zawiera tekst
      if (id(hatxt).state != "" && millis() - id(last_display_time) > 10000) {
        // Jeśli 'hatxt' nie jest pusty i minęły 10 sekund, wyświetlamy ten tekst
        it.printf(0, 0, id(digit_font), TextAlign::TOP_LEFT, "%s", id(hatxt).state.c_str());
        id(last_display_time) = millis();  // Zapisz czas wyświetlania
      }
      // Sprawdzamy, czy 'text_dishwasher' zawiera tekst
      else if (id(text_dishwasher).state != "") {
        // Jeśli 'text_dishwasher' zawiera tekst, wyświetlamy go
        it.printf(0, 0, id(digit_font), TextAlign::TOP_LEFT, "%s", id(text_dishwasher).state.c_str());
      }
      // Jeśli 'hatxt' jest pusty, wyświetlamy czas zegara
      else {
        it.strftime(0, 0, id(digit_font), "%H:%M", id(zegarek_time).now());  // Formatowanie czasu
      }

      // Zmieniamy jasność na podstawie godziny
      int hour = id(zegarek_time).now().hour;
      if (hour >= 22 || hour < 6) {
        // W godzinach 22:00-06:00 ustawiamy jasność na 50% (intensity = 8)
        it.set_intensity(8); // 50% jasności (0-15)
      } else {
        // W pozostałych godzinach ustawiamy jasność na 100% (intensity = 15)
        it.set_intensity(15); // 100% jasności
      }
      if (id(text_dishwasher).state != "") {
      // Jeśli 'text_dishwasher' zawiera tekst, wyciągamy godzinę i minutę
      std::string time_str = id(text_dishwasher).state.substr(11, 5);  // Wybieramy godzinę i minutę z daty
      it.printf(32, 0, id(digit_font), TextAlign::TOP_LEFT, "%s", time_str.c_str());
      } else {
     
       }


text_sensor:
  - platform: homeassistant
    name: "HA Txt"
    id: hatxt
    entity_id: input_text.matrix_text  # Pobieranie tekstu z Home Assistant
    internal: true

  - platform: homeassistant
    name: "Dishwasher Completion Time"
    id: text_dishwasher
    entity_id: sensor.dishwasher_2021_completion_time  # Pobieranie tekstu z Home Assistant (np. czas zakończenia cyklu)
    internal: true


time:
  - platform: homeassistant
    id: zegarek_time
    update_interval: 60s
    
switch:
  - platform: template
    name: "Display Power Switch"
    icon: mdi:dots-grid
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    turn_on_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: ON
    turn_off_action:
      - binary_sensor.template.publish:
          id: power_on_off
          state: OFF

font:
  - file: "fonts/pixelmix.ttf"
    id: digit_font
    size: 8


     
    
sensor:                                    

  - platform: homeassistant
    id: hapage1
    entity_id: input_number.matrix_page
    on_value:
      then:
        if:
          condition:
            lambda: 'return id(hapage) != int(x);'
          then:
            - globals.set:
                id: hapage
                value: !lambda 'return int(x);'
                
binary_sensor:          
    
  - platform: template
    name: "Power State"
    id: power_on_off
    internal: true
    ```

Podmień w lambda ten kod. Czyli 3 ekrany.1 startowy, 2 godzina i 3 powiadomienia

lambda: |-
  if(id(power_on_off).state) {  
    it.intensity(atoi(id(habri).state.c_str()));
    if (id(hapage) == 1) {
      it.strftime(5, 0, id(digit_font), "%H:%M", id(homeassistant_time).now());
      it.invert_on_off(false);
      it.scroll(false);
    } else {
      if (id(hapage) == 2) {
        it.strftime(5, 0, id(digit_font), "%H:%M", id(homeassistant_time).now()); 
        it.invert_on_off(false);
        it.scroll(false);
      } else {
        if (id(hapage) == 3) { 
          it.printf(0, 0, id(digit_font), "%s", id(hatxt).state.c_str());
          it.invert_on_off(false);
          it.scroll(true, max7219digit::STOP, 30, 1000, 1500);
        }
      }
    }
  };

Dodaj te sensory do dashboardu Home Assistant abyś miał łatwy podgląd i sterowanie.

type: entities
entities:
  - entity: switch.display_power_switch
  - entity: input_number.matrix_bri
  - entity: button.zegar_matrix_reset_zegar_matrix
  - entity: input_number.matrix_page
  - entity: input_text.matrix_text

Oczywiście te sensory utwórz w esphome jak w moim kodzie.
Sprawdź czy dział zegarek, zmiana ekranu z pulpitu HA, wyświetlanie tekstu wkóry wpiszesz e matrix_text i wyświetlisz ekran 3.