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.

WItam, próbuje pobrać stan encji z temperaturą i zaczynają się schody:
Oto kod:

esphome:
  name: z3d

  on_boot:
    then:
      - switch.turn_on: z3d_minus
      - delay: 147s
      - switch.turn_off: z3d_minus
      - lambda: |- 
          auto call = id(kotlownia_3d).make_call();
          call.set_position(0);
          call.perform();

time:
  - platform: homeassistant
    id: homeassistant_time 
    on_time:
      - seconds: 5
        
        then:
          - lambda: |- 
              if (id(automat_3d).state) {         
                if (id(kotlownia1_temp_dom_zas).state < id(temp_zas).state-0.5) {
                  if (id(kotlownia_3d).position<1) {
                    auto call = id(kotlownia_3d).make_call();
                    call.set_position(id(kotlownia_3d).position+0.01);
                    call.perform();
                  }
                }
                if (id(kotlownia1_temp_dom_zas).state > id(temp_zas).state+0.5) {
                  if (id(kotlownia_3d).position>0) {
                    auto call = id(kotlownia_3d).make_call();
                    call.set_position(id(kotlownia_3d).position-0.01);
                    call.perform();
                  }                  
                }

              }      

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "+R4Y7adcgQPezgvsCAsSF5zmWCJ0iCtPMXsVyBOIwp8="

ota:
  password: "5c1626cd4fa07288175fbfd196f65b19"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Z3D Fallback Hotspot"
    password: "ybqAesiAybfm"
web_server:
  port: 80


captive_portal:

dallas:
  - pin: 23

sensor: 
- platform: dallas
  address: 0x513c01f0969dc128
  name: "Kotłownia2 Temp Dom Zas"
  id: kotlownia2_temp_dom_zas



switch: 
- platform: gpio
  name: "kotlownia1_3D_Minus"
  id: z3d_minus
  pin:
    
    number: 14
    mode:
      output: true
    inverted: true
  restore_mode: RESTORE_DEFAULT_OFF

- platform: gpio
  name: "kotlownia1_3D_Plus"
  id: z3d_plus    
  pin:
    
    number: 13
    mode:
      output: true
    inverted: true
  restore_mode: RESTORE_DEFAULT_OFF

- platform: template
  name: "3D automat"
  id: automat_3d 
  optimistic: true
  restore_state: True

cover:
  - platform: time_based
    name: "Kotlownia1 3D"
    id: kotlownia_3d

    open_action:
      - switch.turn_on: z3d_plus
    open_duration: 2 min

    close_action:
      - switch.turn_on: z3d_minus
    close_duration: 2 min

    stop_action:
      - switch.turn_off: z3d_minus
      - switch.turn_off: z3d_plus

number:
- platform: template
  name: "Zadana temperatura zasilania"
  id: temp_zas
  optimistic: true
  min_value: 0
  max_value: 100
  step: 0.1
  restore_value: yes    

Po skompilowaniu prawidłowo wyświetla mi

Kotłownia1 Temp Dom Zas

Lecz jest NA ponieważ nie ma Dallasa i nie będzie, chciałem pobrać tu temperaturę z HA i zmieniłem ten fragment kodu:

dallas:
  - pin: 23

sensor: 
- platform: dallas
  address: 0x513c01f0969dc128
  name: "Kotłownia1 Temp Dom Zas"
  id: kotlownia1_temp_dom_zas

na to:

sensor:
  - platform: homeassistant
    id: kotlownia1_temp_dom_zas
    name: "Kotłownia1 Temp Dom Zas"
    entity_id: sensor.temp_zas_pietro

Po skompilowaniu już nie mam

Kotłownia1 Temp Dom Zas


Log pokazuje że pobiera dane z encji

Podpowiecie co jest nie tak ?
EDIT: Zauważyłem że automatyzacja działa prawidłowo ale nie pokazuje tych danych na WEB serwerze pewnie dlatego że dane odczytuje z HA a nie z ESP, jak wyświetlić te dane ?

To przykładowy kawałek mojej konfiguracji, która u mnie działa

sensor:
  - platform: homeassistant
    id: balkon_temperatura_do_esp
    name: "Temperatura Balkon podłoga (From HA)"
    entity_id: sensor.ble_temperature_balkon_podloga
    internal: false
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1

Kluczowy może być: internal: false (bo encje podbierane z HA chyba domyślnie stają się zmiennymi wewnętrznymi w ESPHome).
Być może musisz poczekać na aktualizację encji w HA by webserwer ją pokazał? (jeśli jest w logu to była aktualizowana)

PS Informacja o tym jest w dokumentacji

Dziękuję bardzo :slight_smile:

Też miałem z tym problem ale jak dodałem integrację problem zniknął.

Nie rozumiem Twojej wypowiedzi, możesz trochę rozjaśnić ? :slight_smile:

Trzeba dodać ESP utworzone w ESPHOME w integracjach ESPHOME w HA. Wtedy działa.