Pobieranie danych z HA do ESPHome

Od jakiegoś czasu próbuję pobrać wartości z kilku encji z HA do ESPHome gdzie mam podłączoną matrycę LED. Niby prosta sprawa, przynajmniej z opisów i wskazówek w sieci. Niestety wszystkie próby sprowadzają się do tego, że na matrycy mam pusto „nan”. Dlaczego ?

Kod w okrojonej wersji:

esphome:
  name: testy
 
esp32:
  board: esp
 
# Enable logging
logger:
 
# Enable Home Assistant API
api:
  encryption:
    key: "VEd2HRtV8kO7D1KVda5fCVfxKn94="
 
display:
  - platform: max7219digit
    cs_pin: D2
    num_chips: 4
    intensity: 15
    lambda: |-
	  it.print(0, 0, id(digit_font), id(temperatura_1).state);
 
sensor:
  - platform: homeassistant
    id: temperatura_1
    entity_id: sensor.temperatura_zew
    internal: true

Oczywiście “digit_font” zdefiniowany.
Jak umieszczę w kodzie np. :

             it.print(0, 0, id(digit_font), "HELLO!");

Matryca prezentuje napis.
Czy jeszcze coś trzeba dodać ? Może coś do HA w config’u ?

Za pomoc dziękuje.

@janiszewskit ja osobiście w takich sytuacjach podchodzę trochę inaczej - najpierw sprawdzam czy mogę na matrycy wyświetlić lokalną zmienną zadeklarowaną w ESPHome - co mi daje gwarancję, że poprawnie działa wyświetlanie, co gwarantuje mi, że poprawnie mam skonfigurowany wyświetlacz (to już zrobiłeś przez “HELLO!”). Dopiero potem pobieram dane z zewnątrz i wyświetlam.
Może to głupie ale zmień kolejność w kodzie:

sensor:
  - platform: homeassistant

display:
  - platform: max7219digit

Dodatkowo czy encja w HA jest dostępna? Bardzo często stosuje się warunek na wyświetlanie, patrz przykład z dokumentacji ESPHome - Time & Temperature on OLED Display:

// Print outside temperature (from homeassistant sensor)
      if (id(outside_temperature).has_state()) {
        it.printf(127, 60, id(font3), TextAlign::BASELINE_RIGHT , "%.1f°", id(outside_temperature).state);

I już tak na koniec to dodaj jeszcze formatowanie do it.print jak w przykładzie powyżej.

Dziękuje już za pomoc. W godzinach popołudniowych zaraz sprawdzę tę kolejność.
Zaciekawił mnie Twój wpis :

Aż się boję zapytać, jak mam to zrobić ? Jak ew. mam taką encję udostępnić ?
Bo taki warunek jak napisałeś już robiłem i wtedy na wyświetlaczu nie miałem nic. Był pusty :frowning:

Może tutaj jest jakieś rozwiązanie ?

Nic nie musisz robić ale encja sensor.temperatura_zew musi istnieć w HA i mieć stan.

OK. To ma stan, ma wartość. Myślałem, że trzeba coś jeszcze zrobić.
Sprawdzę kolejność wykonania YAML’a i oczywiście dam znać na forum. Może to ta przyczyna.
Wskazane źródło znam : Time & Temperature on OLED Display — ESPHome i z niego też korzystałem. Jednak nie chce to działać.
Jedyne co zauważyłem, to w przykładach w sieci zawsze spotykałem na początku kodu cześć :

# Enable Home Assistant API
api:
  password: !secret api_password

a ja u siebie mam :

# Enable Home Assistant API
api:
  encryption:
    key: "VEd2HRtV8kO7D1KV26anQda5fCVfxKn94="

Czy to ma jakieś znaczenie ?

Jeśli chcesz mieć szyfrowane połączenie api to tak (być może to się pojawi jako wymagane, ale u mnie działa po staremu), jakkolwiek bezwzględnym minimum jest

api:

No to u siebie mam tak:

Komunikacja HA <-> ESPHome jak mam czujniki temperatur, jak mam przekaźniki to działa prawidłowo.
Jak do esp ma podłączony tylko lcd do prezentowania jakiś istniejących encji : dane nie prezentują się.

Nie mam pojęcia musisz podążyć w dokumentacji, kompiluje się bez ostrzeżeń i błędów?

U siebie mam “gołe” api: bez szyfrowania i klucza, a dane się prezentują (ale nigdy nie próbowałem najpierw skonfigurować z kluczem, a potem go usunąć i kompilować ponownie -, jakkolwiek na logikę każda taka zmiana wymaga usunięcia urządzenia w integracji i dodania go ponownie, więc tu bym nie szukał dziury w całym).

PS wkleję zaraz jakieś istotne kawałki kodu z działającej konfiguracji

sensor:
  - platform: homeassistant
    id: balkon_temperatura_do_esp
    name: "Temperatura Balkon podłoga (From HA)"
    entity_id: sensor.ble_temperature_balkon_podloga

zwróć uwagę, że mam kolorowy wyświetlacz graficzny (a twój jak sądzę jest monochromatyczny, więc nie określasz koloru)

display:
  - platform: st7789v
    # ...
    lambda: |-
      it.printf(5, 5, id(helvetica_12), id(my_yellow), TextAlign::TOP_LEFT, "Temp: %.1f°C", id(balkon_temperatura_do_esp).state);

zamiast temperatury po reboocie ESP wyświetla się nan°C póki ESP nie pobierze danych z HA.

edit: chyba widzę gdzie masz błąd

a powinieneś mieć
it.printf
(oczywiście wraz z odpowiednim formatowaniem tekstu w środku)

Jeśli chcesz w ten sposób co masz, to powinieneś zaimportować z HA sensor tekstowy.
I pewnie będzie to trzeba tak ogarnąć, bo dopiero się dopatrzyłem jaki masz wyświetlacz i jest dość specyficzny

OK przejrzałem dokumentację - o ile nie używasz specyficznych funkcji, to zachowuje się jak zwykły monochromatyczny wyświetlacz graficzny, więc masz pełną dowolność co do sposobu wyświetlania (oczywiście na miarę możliwości sprzętu)

@macek
Kolejność bloków w YAMLu jeśli się nie mylę nie ma znaczenia, bo ten pseudokod jest i tak później (przed kompilacją) interpretowany i konwertowany do kodu źródłowego C++

Ja mam tak

api:

dalej

lambda: |-
it.printf(33, 0, id(digit_font), "%.1f°C", id(temp1).state); 


sensor:                                        
  - platform: homeassistant
    name: "Temp Ogrod"
    id: temp1
    entity_id: sensor.netatmo_dom_salon_ogrod_temperature

Sprawdzone i nie chce działać :frowning:
Główne elementy:

sensor:
  - platform: homeassistant
    entity_id: sensor.magazyn_zew
    id: magazyn1
    internal: true
display:
  - platform: max7219digit
    id: ekran
    cs_pin: D2
    num_chips: 4
    intensity: 3
    lambda: |-
       it.printf(0, 0, id(digit_font), "%.1f°C", id(magazyn1).state);

Encja jest, ma wartość. Jej atrybuty :
state_class: measurement
unit_of_measurement: °C
device_class: temperature
friendly_name: halogen-magazyn Magazyn zew.

Na matrycy mam : non°C

Zmieniałem sensor na text_sensor, ale też nie pomogło.

Czy jeszcze można coś z tym zrobić ?

Raczej masz nan°C (a nie non) - tak jest wyświetlane póki HA nie raczy opublikować wartości (ja podglądam sensor który jest aktualizowany przynajmniej 4x na minutę, ale to zależy od integracji, w przypadku Zigbee można czekać i parę godzin).

Po pierwsze obserwować loga - czy w ogóle ESP dostaje wartość tej encji (tu przy okazji też publikuje).

[22:31:56][D][homeassistant.sensor:024]: 'sensor.ble_temperature_balkon_podloga': Got state 19.80
[22:31:56][D][sensor:127]: 'Temperatura Balkon podłoga (From HA)': Sending state 19.80000  with 1 decimals of accuracy
[22:32:41][D][homeassistant.sensor:024]: 'sensor.ble_temperature_balkon_podloga': Got state 19.70
[22:32:41][D][sensor:127]: 'Temperatura Balkon podłoga (From HA)': Sending state 19.70000  with 1 decimals of accuracy

Po drugie możesz opublikować sobie z powrotem do HA stan tego sensora i go podejrzeć.

sensor:
  - platform: homeassistant
# …
    internal: false

PS z jakiej integracji pochodzi sensor o tak dziwnej nazwie encji? (zwyczajowo sensory temperatury mają sufix _temperature)

To że sensor jest i ma wartość w HA jeszcze nie znaczy, że jest on co chwilę publikowany - zobacz np. na standardowym wykresie historii jak często masz punkty z danymi (zmiana wartości zwykle wymusza publikację).

Po trzecie - być może potrzeba cierpliwości, zostaw to włączone na noc wrócisz do tematu jutro.

Tak. Mam tak napisane. Jednak to nie zmienia faktu, że dane w logach i na matrycy nie widać.

Do HA z tego sensor.magazyn_zew przekazywane są dane co 1min, więc nie uważam by trzeba było całą noc czekać na wyświetlenie informacji. Zresztą jaki to sens mieć z takim opóźnieniem.

Nazwa encji pochodzi z innego ESPHome, który mierzy temperaturę.

Hehe miałem na myśli odpoczynek od problemu :stuck_out_tongue:
Jeśli dane dostajesz co minutę to HA powinien je publikować z tą samą częstotliwością (dlatego testowo opublikuj sobie ten sensor w ESPHome i zobacz czy informacje wracają do HA, będzie łatwiej znaleźć gdzie leży błąd).
Masz w logu cokolwiek, co informuje o tym że dane przychodzą z HA?

Czy mam pisać, że “u mnie działa”, to niczego nie zmienia, 2 posty wyżej moim zdaniem masz “na oko” poprawną konfigurację, szukaj problemu w innym miejscu.

Dotknij czujnika albo poczekaj na naturalną zmianę temperatury.

Sensor tekstowy trzeba sobie najpierw wyprodukować w HA, żeby go użyć w ESPHome jako import (i wtedy sformatować go jako string %s), a skoro ten co masz teraz zwraca wartość float, to formatowanie %f jest poprawne.