Wizjer w drzwiach LILYGO® TTGO T-Camera Plus

Cześć,

Mam takie pytanko do was.
Zakupiłem taką płytkę LILYGO® TTGO T-Camera Plus. I chciałbym zrobić z niej wizjer w drzwiach. Udało mi się to skonfigurować na ESPhome i spiąć z HA. Jednak chciałbym jeszcze wyświetlić obraz z kamerki na wyświetlaczu który jest na płycie.

Czy ktoś z was może ma takie rozwiązanie i mógłby się podzielić swoją wiedzą?

Więcej o sprzęcie

Chyba nie powinieneś robić sobie dużych nadziei, repo producenta jest… forkiem projektu, który podlinkowałeś

a nie sorry podlinkowałeś fabryczne, a źródłowe to to

tu masz jakiś wątek na temat tego sprzętu, ale jak widać chyba niezbyt żywy

Jeśli chodzi o ESPHome i standardowe komponenty, to moim zdaniem to jak na razie niewykonalne, może są jakieś komponenty niestandardowe, ale jeszcze niedawno jarałem się, że w ogóle (w ESPHome) jest możliwość wyświetlania statycznej kolorowej grafiki.

Dzięki na wyjaśnienie. Czyli wynika że musze skompilować to na arduino i może zadziała.

  1. Nie musisz nic kompilować, w tym projekcie są gotowe biny (swoją drogą jak sądzę były wgrane fabrycznie, nie mam tego sprzętu, ale miewałem inne wypusty od tego producenta i przeważnie jakieś przykładowe firmware z ich repo było zwykle, jeśli nie zawsze? fabrycznie wgrane)
  2. To na moje oko nie jest projekt pod Arduino, tylko pod ESP-IDF z rozszerzeniem ESP-WHO
    GitHub - espressif/esp-who: Face detection and recognition framework

I tu masz racje. Było wszystko wgrane tylko się pośpieszyłem i wgrałem ESPhome i teraz nie bardzo mi idzie znalezienie jak wgrać tą oryginalną wersje.

Hmm, nie pogrzebałeś po repo?

tu instrukcja, wgrywasz oficjalnym flasherem

wszystkie 3 pliki *.bin z tego katalogu naraz (nie widać dokładnie, ale ostatni plik to prawdopodobnie partitions.bin przyznaję nie pamiętam, bo używam tego narzędzia raz na ruski rok), prawdopodobnie będziesz musiał najpierw wykonać Erase (jeśli wcześniej było firmware ESPHome)

Niestety nie udało mi się wgrać tego softu ponownie. Poradziłem sobie jednak z esphome. I nawet spoko wygląda. Jednak na ekranie nie udało mi się wrzucić obrazu mam w tel i tablecie.
Na ekran wrzuciłem za to date godzinę temp na zewnątrz i wewnątrz oraz prognozę na 4 najbliższe godziny.
Tak się jeszcze zastanawiam czy jest opcja aby przycisk RESET zmienić w przycisk do zmiany na wyświetlaczu ekranu na drugi. Może wie ktoś jak to zrobić ?

Nie ma takiej opcji. Ten przycisk (o ile mówimy o tym samym, a raczej tak) to sprzętowy reset procesora.

Chyba, że wykombinujesz zapisanie znacznika we flashu (jest to wykonalne z tego co pamiętam, ale nie chce mi się kopać po dokumentacji) po każdym reboocie z przycisku i na tej podstawie coś sobie wykombinujesz (wydaje mi się to jednak mało rozsądne - wprawdzie inicjalizacja wyświetlacza zajmuje góra kilka sekund, to jednak pobranie świeżych danych z zewnątrz może zająć ich kilkanaście czy nawet kilkadziesiąt).

PS jeśli chodzi o fabryczny wsad, to musi się dać wgrać, na screenshocie z dokumentacji masz dokładne ustawienia flashera, ważne są adresy (wpisywane z palca), w okienku detected info musi się pojawić informacja o MCU i flashu, tylko wtedy to zadziała - jak zwykle GPIO0 do masy (chyba że jest przycisk) podczas twardego resetu, jak w przypadku każdego flashowania “na twardo”.

Dzięki wielkie za informacje.
Pozwolę się jeszcze dopytać bo widzę że znasz się na sprzęcie.
Czy można tu dolutować jakiś przełącznik pod jakiś piny żeby zrobić wyłączanie wyświetlacza ?
W swojej płytce mam jeszcze MPU6050 może jakoś to można wykorzystać do włączania/wyłączania czy ten chip tylko reaguje na swoje położenie a nie obiektu obok ?
Czy możesz podpowiedzieć może jakieś inne rozwiązanie do wizjera w drzwiach z lepszą kamerką ? Bo ta ma troszkę słabą jakość nimby 2M, ale żeby rozpoznać osoby to ciężko. Chyba że można podkręcić jakoś konfiguracje żeby uzyskać lepszą jakość.

Nie mam tego w ręce = nie wiem, ale pod GPIO2 w/g schematu jest podpięty układ sterujący podświetleniem, więc można sterować to programowo, o ile nie ma takich funkcji w demo (nie mam = nie wiem), to musisz je sobie dopisać

można też zmodyfikować układ fizycznie - konstruktor to przewidział - poszukaj na schemacie sygnału “LED-” oraz rezystora R527 i pól lutowniczych R23

Masz tam ESPHome?
to skonfiguruj niski framerate, a w zamian za to podnieś rozdzielczość
OV2640 ma 2Mpix i można z tego przetwornika osiągnąć 1600x1200pix (tylko w ESPHome raczej poeksperymentuj z mniejszymi)

Nie wiem czego się spodziewasz po wyświetlaczu 240pix x 240pix (ale chyba z niego nie korzystasz?)

Nie używam = nie znam, ale z pewnością istnieją dedykowane rozwiązania.

Dzięki za informacje. Z tym przerabianiem liczyłem na coś prostszego, więc sobie daruję.

Z pytania wynikało, że liczysz właśnie na to, co jest dostępne - sterowanie programowe w ESPHome to banał - wysterujesz GPIO2 (stan niski = nie świeci podświetlenie - o to chodziło? wyświetlacz można też zagasić z poziomu integracji display → wyświetlić pusty ekran, choć nie wiem na ile to satysfakcjonujące - lepsze jest kombo obu sposobów). Ja za to nie wiem czy używasz softu demo, czy coś sobie uklepałeś w ESPHome.

Fizyczny przełącznik też jest możliwy - obejrzyj schemat.

Nie chce mi się teraz drugi raz kopać po schemacie (ale stawiam na to, że są jakieś wolne GPIO do wykorzystania jako wejście binarne), a generalnie w ESPHome możesz też ogarnąć programowo zaczytywanie stanu z jakiegoś GPIO w trybie wejścia (z wewnętrznym pullupem) i na tej podstawie sterować dowolnym innym GPIO w trybie wyjścia - w ten sposób używając dwu GPIO (dowolne zdatne na wejście oraz GPIO2 które steruje zasilaniem podświetlenia możesz sterować zasilaniem podświetlenia) nie lutując elementów smd.

hmm no nie wiem jak wytłumaczyć działanie akcelerometru wraz z żyroskopem - oczywiście on służy do rozpoznawania własnego położenia (a nie czegoś “obok”), taki sprzęt masz w każdym współczesnym smartfonie, a zapewnia między innymi reakcję na zmianę położenia telefonu np. umożliwia wyciszanie przez odwrócenie ekranem do dołu, czy sterowanie grami, współdziała z układami stabilizacji obrazu we wbudowanym w telefon aparacie, umożliwia detekcję upadku, czy w ogóle kontaktu z ciałem (w powiązaniu z innymi sensorami), ale jakoś nie umiem sobie wyobrazić jak mógłbyś to wykorzystać do gaszenia ekranu.

Na początku podziękuje za pomoc.
No to może podsumuje co zrobiłem i co bym jeszcze chciał.
Korzystam z ESPHome. Na ekranie wyświetlam informacje jak na fotkach poniżej korzystając z danych z HA.
Chciałbym jeszcze zrobić żeby wyświetlacz można było wyłączyć/włączyć z przycisku i z HA np żeby w godzinach nocnych był wyłączony albo jak nie ma nikogo w domu. Generalnie automatyzacje ogarnę i wyłączanie programowe. Jednak słaby zemnie elektronik. Schematów przyznam się nie umiem czytać jak byś wskazał co z czym polutować ba płytce to sobie poradzę, ale tak to za wysokie progi dla mnie.
Co do MPU6050 można wykorzystać jako czujnik drgań? Np. żeby sygnalizował że ktoś szarpie za drzwi ?


Tak, to idealne zastosowanie, nawet jako czujnik otwarcia też się nada, choć trzeba obrobić otrzymane dane.

Już pisałem podświetleniem steruje GPIO2 - nic więcej nie wymyślę musisz sprawdzić czy to działa. Możesz np. użyć integracji Binary Light “by to miało ręce i nogi”

A co do wejścia dla przycisku (lub przełącznika) to robotę by zrobiła fotka tylnej strony płytki, bo z wierzchu nie widzę dostępnych GPIO, a na schemacie widziałem tylko (bezużyteczny w tym zastosowaniu) przycisk Reset.
I jeszcze jedno nie żałuj na rozdzielczości, bo na fotkach, które wrzuciłeś to widać, że konstrukcja różni się od prototypu - nie widzę BME280 (mikrofonu też w pierwszej chwili nie zauważyłem ;P), ale poza tym to niewiele widać…

A i jeszcze jedno - skoro to ESP32, to on w środku ma czujnik Hall’a (nie wiem czy możesz go włączyć, znowu potrzebna analiza schematu - musisz się nauczyć czytać schematy, bo przy tak skąpej dokumentacji jaka jest do tej konstrukcji… musisz umieć samodzielnie sprawdzić czy projektant wykorzystał gdzieś potrzebne GPIO)

moim zdaniem niestety nie możesz go wykorzystać, bo wygląda na to, że te piny MCU są już wykorzystane na obsługę kamery (ale gdybyś wrzucił swojego YAMLa miałbym łatwiejsze życie - przecież w nim widać jakie GPIO już wykorzystałeś, te już poszły na Y4 i Y7 kamery)

PS ciekawa płytka - mikrofon powinien się dać odpalić tak:

i2s_audio:
  i2s_lrclk_pin: GPIO32
  i2s_bclk_pin: GPIO14
microphone:
  - platform: i2s_audio
    id: external_mic
    adc_type: external
    i2s_din_pin: GPIO33

a tak z innej beczki - na schemacie jest pewna niekonsekwencja - GPIO 18 i 23 są podpięte równocześnie jako I2C do (nieistniejącego w rzeczywistości) BME280 jak i do wyjść kontrolek LED sterownika powerbanku IP5306 (a tak sobie chytrze pomyślałem, że skoro nie ma BMx280 to zamiast na I2C można by te GPIO przeznaczyć na przyciski, a tu zdrada, ale w sumie można wylutować zworki i tam się podpiąć zarówno z kontrolkami LED jeśli używasz akumulatora jak i przyciskami - do sprawdzenia w dokumentacji ESP32 czy GPIO 18 i 23 są OK jako wejścia binarne).

Dzięki udało się zrobić włącznie/wyłączanie ekranu przez GPO2. Przydało by się jeszcze znaleść miejsce na przycisk. ;). Baterii nie wykorzystuję bo zasilanie ma podane z UPS. Więc może tu można by było podpiąć przycisk ?
BME280 faktycznie chyba nie ma a w tym miejscu jest MPU6050.
O jakości zdjęć faktycznie nie pomyślałem wrzucam poniżej.


Kod w Yaml poniżej. Oczywiście trochę tam bałagan więc prośba nie …

esphome:
  name: wizjer-korytarz
  friendly_name: Wizjer korytarz

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:


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

captive_portal:

# Example configuration entry
esp32_camera:
  name: wizjer-drzwi
  external_clock:
    pin: GPIO4
    frequency: 20MHz
  i2c_pins:
    sda: GPIO18
    scl: GPIO23
    
  data_pins: [GPIO34, GPIO13, GPIO26, GPIO35, GPIO39, GPIO38, GPIO37, GPIO36]
  vsync_pin: GPIO5
  href_pin: GPIO27
  pixel_clock_pin: GPIO25

  #horizontal_mirror: false

   # Image settings
  resolution: 800x600
  jpeg_quality: 30
  vertical_flip: true
  horizontal_mirror: true
  #idle_framerate: 0.2fps
  #max_framerate: 24fps

esp32_camera_web_server:
  - port: 7029
    mode: stream

font:
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_48
    size: 48
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_38
    size: 38
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_32
    size: 32
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_28
    size: 28
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_24
    size: 24
    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', 'ż', 'ź', '/'] 
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_18
    size: 18
  - file: "./fonts/PontanoSans.ttf"
    id: helvetica_12
    size: 12
  - file: "./fonts/materialdesignicons-webfont.ttf"
    id: icons_weather
    size: 48
    glyphs:
      - "\U000F0594" # clear-night
      - "\U000F0590" # cloudy
      - "\U000F0595" # partlycloudy
      - "\U000F0591" # fog      
      - "\U000F0592" # hail
      - "\U000F0593" # lightning
      - "\U000F067E" # lightning-rainy
      - "\U000F0596" # pouring
      - "\U000F0597" # rainy
      - "\U000F0F36" # snowy
      - "\U000F067F" # snowy-rainy
      - "\U000F0599" # sunny
      - "\U000F059D" # windy
      - "\U000F059E" # windy-variant
      - "\U000F0F38" # exceptional

  - file: './fonts/materialdesignicons-webfont.ttf'
    id: display_icons_32
    size: 32
    glyphs:
      - "\U000F0F55" # Home in
      - "\U000F0F54" # Home out
      - "\U000F181D" # Kitchen
      - "\U000F18D7" # Outside Sensor

  - file: './fonts/materialdesignicons-webfont.ttf'
    id: display_icons_100
    size: 100
    glyphs:
      - "\U000F10AF" # Door off
      - "\U000F081C" # Door on



  # Example minimal configuration entry
spi:
  clk_pin: GPIO21
  mosi_pin: GPIO19

color:
  - id: my_red
    red: 100%
    green: 0%
    blue: 0%
  - id: my_green
    red: 0%
    green: 100%
    blue: 0%
  - id: my_blue
    red: 0%
    green: 0%
    blue: 100%
  - id: my_yellow
    red: 100%
    green: 100%
    blue: 0%

time:
  - platform: homeassistant
    id: esptime



display:
  - platform: st7789v
    id: disp
    model: Adafruit Funhouse 240x240
    backlight_pin: GPIO2
    cs_pin: GPIO12
    dc_pin: GPIO15
    reset_pin: GPIO23 #22 dummy entry
    rotation: 0
    update_interval: 60s
    pages:
      - id: page1
        lambda: |-
          // it.strftime(0,   0, id(helvetica_24),            " %H:%M:%S ", id(esptime).now());
          it.printf(120, 2, id(helvetica_24), TextAlign::TOP_CENTER, "%s", id(fullDATE).state.c_str());
          // it.strftime(120, 2, id(helvetica_24), id(my_red), TextAlign::TOP_CENTER, "%B %d %A", id(esptime).now());
          it.strftime(120, 35, id(helvetica_38), TextAlign::TOP_CENTER,  "%H:%M", id(esptime).now());

          // Print inside temperature (from homeassistant sensor)
          it.printf(162, 93, id(display_icons_32), id(my_green), TextAlign::TOP_RIGHT, "\U000F0F55");
          if (id(inside_temperature).has_state()) {
            it.printf(239, 90, id(helvetica_32), id(my_green), TextAlign::TOP_RIGHT , "%.1f°", id(inside_temperature).state);
          }

          // Print outside temperature (from homeassistant sensor)
          it.printf(5, 93, id(display_icons_32), TextAlign::TOP_LEFT, "\U000F0F54");
          if (id(outside_temperature).has_state()) {
            it.printf(42, 90, id(helvetica_32), TextAlign::TOP_LEFT, "%.1f°", id(outside_temperature).state);
          }
          // if (id(H1Time).has_state()) {
          //  it.printf(5, 150, id(helvetica_32), TextAlign::TOP_LEFT , "%.1f°", id(H1Time).state);
          // }
          // Godzina nad pogoda
          it.printf(5, 145, id(helvetica_18), TextAlign::TOP_LEFT, "%s", id(H1Time).state.c_str());
          it.printf(63, 145, id(helvetica_18), TextAlign::TOP_LEFT, "%s", id(H2Time).state.c_str());
          it.printf(126, 145, id(helvetica_18), TextAlign::TOP_LEFT, "%s", id(H3Time).state.c_str());
          it.printf(189, 145, id(helvetica_18), TextAlign::TOP_LEFT, "%s", id(H4Time).state.c_str());

          // temperatura pod pogoda
          if (id(h1TEMP).has_state()) {
          it.printf(28, 230, id(helvetica_18), TextAlign::BOTTOM_CENTER , "%2.0f", id(h1TEMP).state);}
          if (id(h2TEMP).has_state()) {
          it.printf(95, 230, id(helvetica_18), TextAlign::BOTTOM_CENTER , "%2.0f", id(h2TEMP).state);}
          if (id(h3TEMP).has_state()) {
          it.printf(152, 230, id(helvetica_18), TextAlign::BOTTOM_CENTER, "%2.0f", id(h3TEMP).state);}
          if (id(h4TEMP).has_state()) {
          it.printf(209, 230, id(helvetica_18), TextAlign::BOTTOM_CENTER, "%2.0f", id(h4TEMP).state);}

          // main weather hourly 1 icon
      
          if (id(H1Condition).state == "clear-night") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0594");}
          if (id(H1Condition).state == "cloudy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0590");}
          if (id(H1Condition).state == "partlycloudy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0595");}
          if (id(H1Condition).state == "fog") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0591");}
          if (id(H1Condition).state == "hail") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0592");}
          if (id(H1Condition).state == "lightning") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0593");}
          if (id(H1Condition).state == "lightning-rainy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067E");}
          if (id(H1Condition).state == "pouring") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0596");}
          if (id(H1Condition).state == "rainy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0597");}
          if (id(H1Condition).state == "snowy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F36");}
          if (id(H1Condition).state == "snowy-rainy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067F");}
          if (id(H1Condition).state == "sunny") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0599");}
          if (id(H1Condition).state == "windy") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F059D");}
          if (id(H1Condition).state == "windy-variant") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F059E");}
          if (id(H1Condition).state == "exceptional") {
          it.printf(28, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F38");}

          // main weather hourly 2 icon
      
          if (id(H2Condition).state == "clear-night") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0594");}
          if (id(H2Condition).state == "cloudy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0590");}
          if (id(H2Condition).state == "partlycloudy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0595");}
          if (id(H2Condition).state == "fog") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F04291");}
          if (id(H2Condition).state == "hail") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0592");}
          if (id(H2Condition).state == "lightning") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0593");}
          if (id(H2Condition).state == "lightning-rainy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067E");}
          if (id(H2Condition).state == "pouring") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0596");}
          if (id(H2Condition).state == "rainy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0597");}
          if (id(H2Condition).state == "snowy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F36");}
          if (id(H2Condition).state == "snowy-rainy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067F");}
          if (id(H2Condition).state == "sunny") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0599");}
          if (id(H2Condition).state == "windy") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0429D");}
          if (id(H2Condition).state == "windy-variant") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F059E");}
          if (id(H2Condition).state == "exceptional") {
          it.printf(95, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F38");}

          // main weather hourly 3 icon
      
          if (id(H3Condition).state == "clear-night") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0594");}
          if (id(H3Condition).state == "cloudy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0590");}
          if (id(H3Condition).state == "partlycloudy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0595");}
          if (id(H3Condition).state == "fog") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F04291");}
          if (id(H3Condition).state == "hail") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0592");}
          if (id(H3Condition).state == "lightning") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0593");}
          if (id(H3Condition).state == "lightning-rainy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067E");}
          if (id(H3Condition).state == "pouring") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0596");}
          if (id(H3Condition).state == "rainy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0597");}
          if (id(H3Condition).state == "snowy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F36");}
          if (id(H3Condition).state == "snowy-rainy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067F");}
          if (id(H3Condition).state == "sunny") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0599");}
          if (id(H3Condition).state == "windy") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0429D");}
          if (id(H3Condition).state == "windy-variant") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F059E");}
          if (id(H3Condition).state == "exceptional") {
          it.printf(152, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F38");}

          // main weather hourly 4 icon
      
          if (id(H4Condition).state == "clear-night") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0594");}
          if (id(H4Condition).state == "cloudy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0590");}
          if (id(H4Condition).state == "partlycloudy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0595");}
          if (id(H4Condition).state == "fog") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F04291");}
          if (id(H4Condition).state == "hail") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0592");}
          if (id(H4Condition).state == "lightning") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0593");}
          if (id(H4Condition).state == "lightning-rainy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067E");}
          if (id(H4Condition).state == "pouring") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0596");}
          if (id(H4Condition).state == "rainy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0597");}
          if (id(H4Condition).state == "snowy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F36");}
          if (id(H4Condition).state == "snowy-rainy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F067F");}
          if (id(H4Condition).state == "sunny") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0599");}
          if (id(H4Condition).state == "windy") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0429D");}
          if (id(H4Condition).state == "windy-variant") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F059E");}
          if (id(H4Condition).state == "exceptional") {
          it.printf(209, 210, id(icons_weather), TextAlign::BOTTOM_CENTER, "\U000F0F38");}

      - id: page2
        lambda: |-
          // it.strftime(0,   0, id(helvetica_24),            " %H:%M:%S ", id(esptime).now());
          it.printf(120, 2, id(helvetica_24), TextAlign::TOP_CENTER, "%s", id(fullDATE).state.c_str());
          // it.strftime(120, 2, id(helvetica_24), id(my_red), TextAlign::TOP_CENTER, "%B %d %A", id(esptime).now());
          it.strftime(120, 35, id(helvetica_38), TextAlign::TOP_CENTER,  "%H:%M", id(esptime).now());

          if (id(door).state == "off") {
          it.printf(120, 120, id(display_icons_100), id(my_green), TextAlign::TOP_CENTER, "\U000F10AF");}
          else {
          it.printf(120, 120, id(display_icons_100), id(my_red), TextAlign::TOP_CENTER, "\U000F081C");}
#on_...:
#  - display.page.show_next: disp
#  - display.page.show_previous: disp

# For example cycle through pages on a timer
interval:
  - interval: 5s
    then:
      - display.page.show_next: disp
      - component.update: disp
i2c:
  sda: GPIO18
  scl: GPIO23
  scan: true
  id: bus_a

light:
  - platform: binary
    name: "Ekran"
    output: ekran_output

output:
  - id: ekran_output
    platform: gpio
    pin: GPIO02

sensor:
  - platform: mpu6050
    address: 0x30
    accel_x:
      name: "MPU6050 Accel X"
    accel_y:
      name: "MPU6050 Accel Y"
    accel_z:
      name: "MPU6050 Accel z"
    gyro_x:
      name: "MPU6050 Gyro X"
    gyro_y:
      name: "MPU6050 Gyro Y"
    gyro_z:
      name: "MPU6050 Gyro z"
    temperature:
      name: "MPU6050 Temperature"

  - platform: homeassistant
    id: inside_temperature
    entity_id: sensor.termometr_korytarz_temperature
    internal: true

  - platform: homeassistant
    id: outside_temperature
    entity_id: sensor.termometr_zewnetrzny_temperature
    internal: true

  - platform: homeassistant
    name: "Hourly-1 TEMP"
    entity_id: sensor.hourly_1_temp
    unit_of_measurement: "°C"
    accuracy_decimals: 0
    id: h1TEMP
    internal: true
  - platform: homeassistant
    name: "Hourly-2 TEMP"
    entity_id: sensor.hourly_2_temp
    unit_of_measurement: "°C"
    accuracy_decimals: 0
    id: h2TEMP
    internal: true
  - platform: homeassistant
    name: "Hourly-3 TEMP"
    entity_id: sensor.hourly_3_temp
    unit_of_measurement: "°C"
    accuracy_decimals: 0
    id: h3TEMP
    internal: true
  - platform: homeassistant
    name: "Hourly-4 TEMP"
    entity_id: sensor.hourly_4_temp
    unit_of_measurement: "°C"
    accuracy_decimals: 0
    id: h4TEMP
    internal: true

text_sensor:
  - platform: homeassistant
    id: door
    entity_id: binary_sensor.front_door_lock_contact
    internal: true
  - platform: homeassistant
    name: "Poland Full Date"
    entity_id: sensor.fulldate
    id: fullDATE
    internal: true
  - platform: homeassistant
    name: "Hourly-1 FORECAST"
    entity_id: sensor.hourly_1_condition
    id: H1Condition
    internal: true
  - platform: homeassistant
    id: H1Time
    entity_id: sensor.hourly_1_time
    internal: true
  - platform: homeassistant
    name: "Hourly-2 FORECAST"
    entity_id: sensor.hourly_2_condition
    id: H2Condition
    internal: true
  - platform: homeassistant
    id: H2Time
    entity_id: sensor.hourly_2_time
    internal: true
  - platform: homeassistant    
    name: "Hourly-3 FORECAST"
    entity_id: sensor.hourly_3_condition
    id: H3Condition
    internal: true
  - platform: homeassistant
    id: H3Time
    entity_id: sensor.hourly_3_time
    internal: true
  - platform: homeassistant  
    name: "Hourly-4 FORECAST"
    entity_id: sensor.hourly_4_condition
    id: H4Condition
    internal: true
  - platform: homeassistant
    id: H4Time
    entity_id: sensor.hourly_4_time
    internal: true

script:
  - id: all_data_received
    then:
      - component.update: disp

Jeszcze nie mogę ogarnąć i2c wysypuje mi błędy.
Poniżej log.

INFO ESPHome 2023.8.2
INFO Reading configuration /config/esphome/wizjer-korytarz.yaml...
WARNING GPIO4 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Detected timezone 'Europe/Warsaw'
WARNING GPIO2 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
WARNING GPIO12 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
WARNING GPIO15 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
WARNING GPIO2 is a Strapping PIN and should be avoided.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
...
INFO Waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
INFO Starting log output from wizjer-korytarz.local using esphome API
INFO Successfully connected to wizjer-korytarz.local
[14:08:25][I][app:102]: ESPHome version 2023.8.2 compiled on Sep 10 2023, 14:07:45
[14:08:25][C][logger:301]: Logger:
[14:08:25][C][logger:302]:   Level: DEBUG
[14:08:25][C][logger:303]:   Log Baud Rate: 115200
[14:08:25][C][logger:305]:   Hardware UART: UART0
[14:08:25][C][spi:125]: SPI bus:
[14:08:25][C][spi:126]:   CLK Pin: GPIO21
[14:08:25][C][spi:128]:   MOSI Pin: GPIO19
[14:08:25][C][spi:130]:   Using HW SPI: YES
[14:08:25][C][i2c.arduino:053]: I2C Bus:
[14:08:25][C][i2c.arduino:054]:   SDA Pin: GPIO18
[14:08:25][C][i2c.arduino:055]:   SCL Pin: GPIO23
[14:08:25][C][i2c.arduino:056]:   Frequency: 50000 Hz
[14:08:25][C][i2c.arduino:059]:   Recovery: bus successfully recovered
[14:08:25][I][i2c.arduino:069]: Results from i2c bus scan:
[14:08:25][I][i2c.arduino:075]: Found i2c device at address 0x30
[14:08:25][I][i2c.arduino:075]: Found i2c device at address 0x68
[14:08:25][I][i2c.arduino:075]: Found i2c device at address 0x75
[14:08:25][C][gpio.output:010]: GPIO Binary Output:
[14:08:25][C][gpio.output:011]:   Pin: GPIO2
[14:08:25][C][light:103]: Light 'Ekran'
[14:08:25][C][esp32_camera:048]: ESP32 Camera:
[14:08:25][C][esp32_camera:049]:   Name: wizjer-drzwi
[14:08:25][C][esp32_camera:050]:   Internal: NO
[14:08:25][C][esp32_camera:052]:   Data Pins: D0:34 D1:13 D2:26 D3:35 D4:39 D5:38 D6:37 D7:36
[14:08:25][C][esp32_camera:053]:   VSYNC Pin: 5
[14:08:25][C][esp32_camera:054]:   HREF Pin: 27
[14:08:25][C][esp32_camera:055]:   Pixel Clock Pin: 25
[14:08:25][C][esp32_camera:056]:   External Clock: Pin:4 Frequency:20000000
[14:08:25][C][esp32_camera:060]:   I2C Pins: SDA:18 SCL:23
[14:08:25][C][esp32_camera:062]:   Reset Pin: -1
[14:08:25][C][esp32_camera:083]:   Resolution: 800x600 (SVGA)
[14:08:25][C][esp32_camera:129]:   JPEG Quality: 30
[14:08:25][C][esp32_camera:131]:   Contrast: 0
[14:08:25][C][esp32_camera:132]:   Brightness: 0
[14:08:25][C][esp32_camera:133]:   Saturation: 0
[14:08:25][C][esp32_camera:134]:   Vertical Flip: ON
[14:08:25][C][esp32_camera:135]:   Horizontal Mirror: ON
[14:08:25][C][esp32_camera:136]:   Special Effect: 0
[14:08:25][C][esp32_camera:137]:   White Balance Mode: 0
[14:08:25][C][esp32_camera:140]:   Auto Exposure Control: 1
[14:08:25][C][esp32_camera:141]:   Auto Exposure Control 2: 0
[14:08:25][C][esp32_camera:142]:   Auto Exposure Level: 0
[14:08:25][C][esp32_camera:143]:   Auto Exposure Value: 300
[14:08:25][C][esp32_camera:144]:   AGC: 1
[14:08:25][C][esp32_camera:145]:   AGC Gain: 0
[14:08:25][C][esp32_camera:146]:   Gain Ceiling: 0
[14:08:25][C][esp32_camera:152]:   Test Pattern: NO
[14:08:25][C][homeassistant.time:010]: Home Assistant Time:
[14:08:25][C][homeassistant.time:011]:   Timezone: 'CET-1CEST,M3.5.0,M10.5.0/3'
[14:08:25][C][mpu6050:086]: MPU6050:
[14:08:25][C][mpu6050:087]:   Address: 0x30
[14:08:25][E][mpu6050:089]: Communication with MPU6050 failed!
[14:08:25][C][mpu6050:091]:   Update Interval: 60.0s
[14:08:25][C][mpu6050:092]:   Acceleration X 'MPU6050 Accel X'
[14:08:25][C][mpu6050:092]:     State Class: 'measurement'
[14:08:25][C][mpu6050:092]:     Unit of Measurement: 'm/s²'
[14:08:25][C][mpu6050:092]:     Accuracy Decimals: 2
[14:08:25][C][mpu6050:092]:     Icon: 'mdi:briefcase-download'
[14:08:25][C][mpu6050:093]:   Acceleration Y 'MPU6050 Accel Y'
[14:08:25][C][mpu6050:093]:     State Class: 'measurement'
[14:08:25][C][mpu6050:093]:     Unit of Measurement: 'm/s²'
[14:08:25][C][mpu6050:093]:     Accuracy Decimals: 2
[14:08:25][C][mpu6050:093]:     Icon: 'mdi:briefcase-download'
[14:08:25][C][mpu6050:094]:   Acceleration Z 'MPU6050 Accel z'
[14:08:25][C][mpu6050:094]:     State Class: 'measurement'
[14:08:25][C][mpu6050:094]:     Unit of Measurement: 'm/s²'
[14:08:25][C][mpu6050:094]:     Accuracy Decimals: 2
[14:08:25][C][mpu6050:094]:     Icon: 'mdi:briefcase-download'
[14:08:25][C][mpu6050:095]:   Gyro X 'MPU6050 Gyro X'
[14:08:25][C][mpu6050:095]:     State Class: 'measurement'
[14:08:25][C][mpu6050:095]:     Unit of Measurement: '°/s'
[14:08:25][C][mpu6050:095]:     Accuracy Decimals: 2
[14:08:25][C][mpu6050:095]:     Icon: 'mdi:screen-rotation'
[14:08:25][C][mpu6050:096]:   Gyro Y 'MPU6050 Gyro Y'
[14:08:25][C][mpu6050:096]:     State Class: 'measurement'
[14:08:25][C][mpu6050:096]:     Unit of Measurement: '°/s'
[14:08:25][C][mpu6050:096]:     Accuracy Decimals: 2
[14:08:25][C][mpu6050:096]:     Icon: 'mdi:screen-rotation'
[14:08:25][C][mpu6050:097]:   Gyro Z 'MPU6050 Gyro z'
[14:08:25][C][mpu6050:097]:     State Class: 'measurement'
[14:08:25][C][mpu6050:097]:     Unit of Measurement: '°/s'
[14:08:25][C][mpu6050:097]:     Accuracy Decimals: 2
[14:08:25][C][mpu6050:097]:     Icon: 'mdi:screen-rotation'
[14:08:25][C][mpu6050:098]:   Temperature 'MPU6050 Temperature'
[14:08:25][C][mpu6050:098]:     Device Class: 'temperature'
[14:08:25][C][mpu6050:098]:     State Class: 'measurement'
[14:08:25][C][mpu6050:098]:     Unit of Measurement: '°C'
[14:08:25][C][mpu6050:098]:     Accuracy Decimals: 1
[14:08:25][D][esp32_camera:196]: Got Image: len=12811
[14:08:25][C][psram:020]: PSRAM:
[14:08:25][C][psram:021]:   Available: YES
[14:08:25][C][psram:024]:   Size: 4095 KB
[14:08:25][D][esp32_camera_web_server:198]: MJPG: 12811B 150ms (6.7fps)
[14:08:25][C][st7789v:123]: SPI ST7789V
[14:08:25][C][st7789v:123]:   Rotations: 0 °
[14:08:25][C][st7789v:123]:   Dimensions: 240px x 240px
[14:08:25][C][st7789v:124]:   Model: Adafruit Funhouse 240x240
[14:08:25][C][st7789v:129]:   8-bit color mode: NO
[14:08:25][C][st7789v:130]:   CS Pin: GPIO12
[14:08:25][C][st7789v:131]:   DC Pin: GPIO15
[14:08:25][C][st7789v:132]:   Reset Pin: GPIO23
[14:08:25][C][st7789v:133]:   B/L Pin: GPIO2
[14:08:25][C][st7789v:134]:   Update Interval: 60.0s
[14:08:26][C][captive_portal:088]: Captive Portal:
[14:08:26][C][mdns:112]: mDNS:
[14:08:26][C][mdns:113]:   Hostname: wizjer-korytarz
[14:08:26][D][esp32_camera:196]: Got Image: len=12834
[14:08:26][C][ota:093]: Over-The-Air Updates:
[14:08:26][C][ota:094]:   Address: wizjer-korytarz.local:3232
[14:08:26][C][ota:097]:   Using Password.
[14:08:26][C][api:138]: API Server:
[14:08:26][C][api:139]:   Address: wizjer-korytarz.local:6053
[14:08:26][C][api:141]:   Using noise encryption: YES
[14:08:26][C][homeassistant.sensor:030]: Homeassistant Sensor 'inside_temperature'
[14:08:26][C][homeassistant.sensor:030]:   State Class: ''
[14:08:26][C][homeassistant.sensor:030]:   Unit of Measurement: ''
[14:08:26][C][homeassistant.sensor:030]:   Accuracy Decimals: 1
[14:08:26][C][homeassistant.sensor:031]:   Entity ID: 'sensor.termometr_korytarz_temperature'
[14:08:26][C][homeassistant.sensor:030]: Homeassistant Sensor 'outside_temperature'
[14:08:26][C][homeassistant.sensor:030]:   State Class: ''
[14:08:26][C][homeassistant.sensor:030]:   Unit of Measurement: ''
[14:08:26][C][homeassistant.sensor:030]:   Accuracy Decimals: 1
[14:08:26][C][homeassistant.sensor:031]:   Entity ID: 'sensor.termometr_zewnetrzny_temperature'
[14:08:26][C][homeassistant.sensor:030]: Homeassistant Sensor 'Hourly-1 TEMP'
[14:08:26][C][homeassistant.sensor:030]:   State Class: ''
[14:08:26][C][homeassistant.sensor:030]:   Unit of Measurement: '°C'
[14:08:26][C][homeassistant.sensor:030]:   Accuracy Decimals: 0
[14:08:26][C][homeassistant.sensor:031]:   Entity ID: 'sensor.hourly_1_temp'
[14:08:26][D][esp32_camera:196]: Got Image: len=12848
[14:08:26][C][homeassistant.sensor:030]: Homeassistant Sensor 'Hourly-2 TEMP'
[14:08:26][C][homeassistant.sensor:030]:   State Class: ''
[14:08:26][C][homeassistant.sensor:030]:   Unit of Measurement: '°C'
[14:08:26][C][homeassistant.sensor:030]:   Accuracy Decimals: 0
[14:08:26][C][homeassistant.sensor:031]:   Entity ID: 'sensor.hourly_2_temp'
[14:08:26][D][esp32_camera_web_server:198]: MJPG: 12848B 163ms (6.1fps)
[14:08:26][C][homeassistant.sensor:030]: Homeassistant Sensor 'Hourly-3 TEMP'
[14:08:26][C][homeassistant.sensor:030]:   State Class: ''
[14:08:26][C][homeassistant.sensor:030]:   Unit of Measurement: '°C'
[14:08:26][C][homeassistant.sensor:030]:   Accuracy Decimals: 0
[14:08:26][C][homeassistant.sensor:031]:   Entity ID: 'sensor.hourly_3_temp'
[14:08:26][C][homeassistant.sensor:030]: Homeassistant Sensor 'Hourly-4 TEMP'
[14:08:26][C][homeassistant.sensor:030]:   State Class: ''
[14:08:26][C][homeassistant.sensor:030]:   Unit of Measurement: '°C'
[14:08:26][C][homeassistant.sensor:030]:   Accuracy Decimals: 0
[14:08:26][C][homeassistant.sensor:031]:   Entity ID: 'sensor.hourly_4_temp'
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'door'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'binary_sensor.front_door_lock_contact'
[14:08:26][D][esp32_camera:196]: Got Image: len=12882
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'Poland Full Date'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.fulldate'
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'Hourly-1 FORECAST'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_1_condition'
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'H1Time'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_1_time'
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'Hourly-2 FORECAST'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_2_condition'
[14:08:26][D][esp32_camera_web_server:198]: MJPG: 12882B 256ms (3.9fps)
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'H2Time'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_2_time'
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'Hourly-3 FORECAST'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_3_condition'
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'H3Time'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_3_time'
[14:08:26][D][esp32_camera:196]: Got Image: len=12817
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'Hourly-4 FORECAST'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_4_condition'
[14:08:26][D][esp32_camera_web_server:198]: MJPG: 12817B 115ms (8.7fps)
[14:08:26][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'H4Time'
[14:08:26][C][homeassistant.text_sensor:024]:   Entity ID: 'sensor.hourly_4_time'
[14:08:26][C][esp32_camera_web_server:088]: ESP32 Camera Web Server:
[14:08:26][C][esp32_camera_web_server:089]:   Port: 7029
[14:08:26][C][esp32_camera_web_server:091]:   Mode: stream
[14:08:26][D][esp32_camera:196]: Got Image: len=12872
[14:08:26][D][esp32_camera_web_server:198]: MJPG: 12872B 170ms (5.9fps)

Dzięki za wszystkie uwagi i podpowiedzi.

No niestety, ale w takim razie MPU6050 jest podpięty do I2C zamiast BMx280

Masz tak swoją drogą ten bus dwukrotnie skonfigurowany w YAMLu, a na nim podpięte 3 urządzania, moim zdaniem jest tam MPU6050 i kamera (sądząc po YAMLu) ale co jeszcze nie wiem :stuck_out_tongue:

(i to się kompiluje? - nie doczytałem, ale to jest moim zdaniem źródło problemu oprócz tego, że moim zdaniem MPU6050 jest pod adresem 0x68 a NIE pod 0x30)

W kwestii wolnych GPIO - na płytce masz nadruk wykorzystanych (więc automatycznie nie możesz ich użyć jako wejścia przycisku), niestety na złącze masz wyprowadzoną magistralę I2C, a nie żadne “gołe” GPIO więc mogę zasugerować strzelanie do muchy przez podpięcie tam ekspandera GPIO w postaci np. PCF8574 lub PCF8574A (sprawdź czy adresy nie będą w konflikcie, jeśli tak to musisz użyć płytki z konfigurowanym adresem, bo najprostsze chińczyki mają ustalony jeden adres).
Jak widać do wyboru możliwość zasilania 3,3V lub 5V oraz magistrala I2C, więc idealne do rozszerzania funkcjonalności jakimś sprzętem I2C

Co do kamery to poeksperymentuj z rozdzielczością i jakością kompresji - najlepszy obrazek to kompresja 6 (i jest to równocześnie największe wykorzystanie PSRAM, ale przy 4MB powinno dać radę)

Tu testy adresów robiłem żeby Uruchomić MPU6050 niestety żaden adres nie działa poprawnie. Więc zakładam że źle ma zadeklarowane sensory MPU6050. Możesz rzucić na to okiem czy da się inaczej zadeklarować sensory żeby 2x nie konfigurować i2c ?

Ja bym wywalił I2C z konfiguracji kamery a zostawił deklarację szyny “luzem” MPU6050 jest moim zdaniem na 99.9% pod 0x68 nie wiem co jest pod pozostałymi adresami.
Być może ESPHome nie umożliwia używania tej samej szyny I2C dla kamery i innych peryferiów, ale nie mam teraz możliwości eksperymentowania (ale skoro się kompiluje mimo wszystko, to po prostu popraw adres).

Edit: nie można wywalić I2C z konfiguracji kamery, bo się integracja kamery burzy

Sama zmiana adresu nie pomaga bo i tak nie ma danych.
Jak usuwam szynę z konfiguracji kamery wywala błędy.

  
  'i2c_pins' is a required option for [esp32_camera].
  name: wizjer-drzwi
  external_clock: 
    pin: GPIO4
    frequency: 20MHz
  data_pins: 
    - GPIO34
    - GPIO13
    - GPIO26
    - GPIO35
    - GPIO39
    - GPIO38
    - GPIO37
    - GPIO36
  vsync_pin: GPIO5
  href_pin: GPIO27
  pixel_clock_pin: GPIO25
  resolution: 1024x768
  jpeg_quality: 30
  vertical_flip: True
  horizontal_mirror: True
  idle_framerate: 0.05fps
  max_framerate: 15fps

A po zmianie adresu i tak nie wykrywa MPU6050

[15:52:09][C][homeassistant.time:011]:   Timezone: 'CET-1CEST,M3.5.0,M10.5.0/3'
[15:52:09][C][mpu6050:086]: MPU6050:
[15:52:09][C][mpu6050:087]:   Address: 0x68
[15:52:09][E][mpu6050:089]: Communication with MPU6050 failed!
[15:52:09][C][mpu6050:091]:   Update Interval: 60.0s
[15:52:09][C][mpu6050:092]:   Acceleration X 'MPU6050 Accel X'
[15:52:09][C][mpu6050:092]:     State Class: 'measurement'
[15:52:09][C][mpu6050:092]:     Unit of Measurement: 'm/s²'
[15:52:09][C][mpu6050:092]:     Accuracy Decimals: 2
[15:52:09][C][mpu6050:092]:     Icon: 'mdi:briefcase-download'
[15:52:09][C][mpu6050:093]:   Acceleration Y 'MPU6050 Accel Y'
[15:52:09][C][mpu6050:093]:     State Class: 'measurement'
[15:52:09][C][mpu6050:093]:     Unit of Measurement: 'm/s²'
[15:52:09][C][mpu6050:093]:     Accuracy Decimals: 2
[15:52:09][C][mpu6050:093]:     Icon: 'mdi:briefcase-download'
[15:52:09][C][mpu6050:094]:   Acceleration Z 'MPU6050 Accel z'
[15:52:09][C][mpu6050:094]:     State Class: 'measurement'
[15:52:09][C][mpu6050:094]:     Unit of Measurement: 'm/s²'
[15:52:09][C][mpu6050:094]:     Accuracy Decimals: 2
[15:52:09][C][mpu6050:094]:     Icon: 'mdi:briefcase-download'
[15:52:09][C][mpu6050:095]:   Gyro X 'MPU6050 Gyro X'
[15:52:09][C][mpu6050:095]:     State Class: 'measurement'
[15:52:09][C][mpu6050:095]:     Unit of Measurement: '°/s'
[15:52:09][C][mpu6050:095]:     Accuracy Decimals: 2
[15:52:09][C][mpu6050:095]:     Icon: 'mdi:screen-rotation'
[15:52:09][C][mpu6050:096]:   Gyro Y 'MPU6050 Gyro Y'
[15:52:09][C][mpu6050:096]:     State Class: 'measurement'
[15:52:09][C][mpu6050:096]:     Unit of Measurement: '°/s'
[15:52:09][C][mpu6050:096]:     Accuracy Decimals: 2
[15:52:09][C][mpu6050:096]:     Icon: 'mdi:screen-rotation'
[15:52:09][C][mpu6050:097]:   Gyro Z 'MPU6050 Gyro z'
[15:52:09][C][mpu6050:097]:     State Class: 'measurement'
[15:52:09][C][mpu6050:097]:     Unit of Measurement: '°/s'
[15:52:09][C][mpu6050:097]:     Accuracy Decimals: 2
[15:52:09][C][mpu6050:097]:     Icon: 'mdi:screen-rotation'
[15:52:10][C][mpu6050:098]:   Temperature 'MPU6050 Temperature'
[15:52:10][C][mpu6050:098]:     Device Class: 'temperature'
[15:52:10][C][mpu6050:098]:     State Class: 'measurement'
[15:52:10][C][mpu6050:098]:     Unit of Measurement: '°C'
[15:52:10][C][mpu6050:098]:     Accuracy Decimals: 1

Edytowałem, wyżej, ale skoro tak nie można, a się kompiluje 2x wykorzystana ta sama szyna, to zmień tylko adres (bo na 100% MPU nie jest pod 0x30).

Jeśli nie można użyć tej samej szyny dla kamery i innych peryferiów to jest to temat na issue w ESPHome.

Ten fragment loga akurat o niczym nie świadczy, ale możliwe, że jest niedoróbka w ESPHome uniemożliwiająca użycie innych urządzeń I2C na tej samej szynie co kamera.