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).

I jeszcze jedno - poczwórne płytki w wykonaniu takim jak na zdjęciu z 1 posta (a innych nie widziałem) można sobie rozciąć na pojedyncze lub podwójne, linie cięcia zaznaczyłem na czerwono


(tylko trochę szkoda to robić bo łatwiej ogarnąć mechanicznie taką całość niż każdy panelik osobno)

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.

Udalo :slight_smile:
Dziekuje bardzo za wszelkie rady i pomoc po paru wieczorach walki udalo sie zrobic to czego potrzebowalem :slight_smile: jutro podziele sie kodem dla potomych i moze bardziej dosiwadczeni spojrzą czy jest ok poniewaz mam jeden dziwny przypadek ,a mianowicie gdy switch od zmywarki jest na on, lecz fizycznie zmywarka nie jest wlaczona zaczyna sie odliczanie od 00:59 w dol.Po fizycznym wlaczeniu cyklu zegar ustawia sie odpowiednio do cyklu.wiecej mi to nie przeszkadza:) poniewaz gdy jest OFF (fizycznie i systemowo)wyswietla sie aktualna godzina wiec mi to nie przeszkadza , ale z ciekawosci dowiem sie czemu tak sie dzieje. Poniewaz nie mogę do tego dojść.