Własne pomiary na wyświetlaczu OLED

Cześć.
Znalazłem ciekawą funkcjonalność w esphome:

Wgrałem przykładowy program który zadziałał.
Chciałbym wyświetlać wartości z własnych encji ale jak wpiszę do programu identyfikator encji:
sensor.rejestrator_temperatura
z mojego urządzenia to brak jest wyświetlania tego pomiaru i dodatkowo zegar się nie aktualizuje tak jakby program się zawieszał.
Próbowałem z różnymi encjami i żadna się nie wyświetla na wyświetlaczu, niektóre tylko nie blokują programu.

esphome:
  name: odbiornik-rejestratora
  friendly_name: Odbiornik-rejestratora

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "SxCAmaBNDx/JQxKX2pFTbJCGB2yKFtuCgjjS+x2lAQE="

ota:
  password: "56f861211509822c4142edb740f73e45"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Odbiornik-Rejestratora"
    password: "n9tI7eT8bXjR"

captive_portal:
    

time:
  - platform: homeassistant
    id: esptime

sensor:
  - platform: homeassistant
    id: Temperatura
    entity_id: sensor.rejestrator_temperatura
    internal: true     

font:
  - file: 'slkscr.ttf'
    id: font1
    size: 8

  - file: 'BebasNeue-Regular.ttf'
    id: font2
    size: 48

  - file: 'arial.ttf'
    id: font3
    size: 14   
        

i2c:
  sda: 14
  scl: 12
  scan: false

display:
  - platform: ssd1306_i2c
    model: "SH1106 128x64"
    reset_pin: 16
    address: 0x3C
    lambda: |-
      // Print "Mitt Smarta Hus" in top center.
      it.printf(64, 0, id(font1), TextAlign::TOP_CENTER, "REJESTRATOR");

      // Print time in HH:MM format
      it.strftime(0, 60, id(font2), TextAlign::BASELINE_LEFT, "%H:%M", id(esptime).now());
      
      // Print Temperatura (from homeassistant sensor)
      if (id(Temperatura).has_state()) {
        it.printf(127, 23, id(font3), TextAlign::TOP_RIGHT , "%.1f", id(Temperatura).state);
      }

Jakim cudem, skąd wyczesałeś te pliki czcionek?


Ten problem był już kiedyś opisywany w otagowanym wątku, muszę poprawić tagi
homeassistant

No już się trochę naumiałem :grin:
Ale nadal esphome jak widać mnie nie lubi.
Widziałem tamten wątek ale nie znalazłem w nim odpowiedzi.

No dobra, co to jest za sensor, bo nie zrozumiałem wyjaśnienia

posłużę się przykładem z tamtego wątku, bo wiem że działa u mnie

sensor:

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

to jest jakaś istniejąca encja w Home Assistant a konkretnie w tej instancji HA do której masz zintegrowane rzeczone twoje urządzenie odbiornik-rejestratora

to jest encja (tak naprawdę zmienna), która isnieje w tym urządzeniu ESPHome

nie robi śmietnika w HA dzięki temu - nie odsyłamy jej z powrotem do HA pod nową nazwą

aby ją wysłać na wyświetlacz używam tego

      it.printf(5, 5, id(helvetica_12), id(my_yellow), TextAlign::TOP_LEFT, "Temp: %.1f°C", id(balkon_temperatura_do_esp).state);

oczywiście Ty masz jakiś inny wyświetlacz, więc składnia dla niego będzie nieco inna, ale pokazałem z jakiej zmiennej korzysta komponent wyświetlacza


czyli encja o takim ID musi istnieć w twoim HA

Sensor to moje urządzenie “Rejestrator” oparty na esp8266. Dla przykładu z niego chciałbym wyświetlić na OLED temperaturę którą mierzy DS18b20.
Kopiuję identyfikator encji która jest w HA:
sensor.rejestrator_temperatura
Dokładnie tak jak moim pliku .yaml i nie działa. Program się nie zawiesza bo czas pobiera prawidłowy ale temperatury nie wyświetla.
W logach według mnie nie ma niczego niepokojącego.

encja

A kto powiedział że się zawiesza, to drugie ESP musi najpierw opublikować stan sensora do HA, więc może trochę cierpliwości… bo to się musi stać PO uruchomieniu tego ESP z wyświetlaczem

No to wiem ale ja widzę że urządzenie nadawcze “rejestrator” wysłało wartość temperatury do HA ale na wyświetlaczu jej nie mam.
Wyrzuciłem z .yaml ten fragment z warunkiem:

if (id(Temperatura).has_state()) {

I teraz na wyświetlaczu pojawiła mi się wartość “nan” w miejscu temperatury.

możesz wyłączyć to

a wtedy zobaczysz w HA jakie wartości ma ta zmienna=encja i w jakich okolicznościach
ja bym stosował jakieś ID które są unikalne

Mam to włączone tak jak podawałem w pierwszym poście.

Wyłączyć, to wtedy publikujesz w HA wartość i masz podgląd co się dzieje w dłuższym okresie
wyłączyć = false

O ja głupi.

Jeszcze muszę się douczyć, po dodaniu nowego urządzenia do HA wszystko się wyświetla.

1 polubienie

No nie przypuszczałem, że możesz mieć urządzenie niezintegrowane z HA

U mnie ta konfiguracja działa , więc się nią podzliłem .
Pliki czcionek muszą być w folderze homeassistant/esphome



captive_portal:

i2c:
  sda: D3
  scl: D4
  scan: False

font:
  - file: 'Roboto-Italic.ttf'
    id: font1
    size: 20
  - file: 'Ubuntu-Regular.ttf'
    id: font2
    size: 22
  - file: 'Roboto-Italic.ttf'
    id: font3
    size: 22


time:
  - platform: homeassistant
    id: esptime

sensor:
  - platform: homeassistant
    entity_id: sensor.moc_l1_l2_l3
    id: Mocl13
    internal: true
    accuracy_decimals: 1
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
 
  - platform: homeassistant
    entity_id: sensor.sonoffbasic_ds_multi_out
    id: tempzew
    internal: true
    accuracy_decimals: 1
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"

    
display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    update_interval: 2s   
    address: 0x3C
    reset_pin: D0
    rotation: 180
    lambda: |-
      it.printf(50, 40, id(font2), TextAlign::TOP_LEFT , "%.fW", id(Mocl13).state);
      it.printf(5, 40, id(font1), TextAlign::BASELINE_LEFT , "%.f°C", id(tempzew).state);
      it.strftime(60, 0, id(font3), TextAlign::TOP_LEFT , "%H:%M", id(esptime).now());

Znalazłem problem w udostępnianiu czujników z home homeassistant, wiersz, - platform: homeassistant wskazuje że dane maja być pobierane z Home Assistant (homeasistant.local) i to jest OK, ale jeżeli zmienimy nazwę hosta w ustawieniach sieci na np.: ‘centrala’ po restarcie ładnie się ping-uje centrala.local jednak w przytoczonym kodzie użycie z ESPhome wiersz - platform: centrala; wykazuje błąd i nie można kodu skompilować.

Screenshot 2024-04-24 at 09-39-31 Ustawienia – Home Assistant

Bez tytułu

Więc jeśli ktoś zmienił nazwę Home Assistant na inną lub ma dwa o tej samej nazwie to zaczyna się problem i rozwiązanie może całkowicie nie działać. W pierwszym przypadku gdy zminiamy nazę nie możemy się odwołać do sensorów gdyz host nie istnieje i nie mozna go w ESPhome oprogramować, w drugim przypadku nigdy nie wiemy z którego Home Assistant będą pobierane dane z sensorów.

Tak więc gdy mamy więcej niż jeden Home Assistent w sieci, zawsze główny musi mieć nazwę ‘homeassistant’ a innym trzeba zmienić nazwy i sensory które chcemy wykorzystywać w ESPhome muszą być w głównym Home Assistant.

To jest nazwa platformy, a nie hosta, nie możesz wymyślać sobie nazwy platformy integracji.

Nazwa hosta nie ma żadnego znaczenia - połączenie API umożliwia połączenie i tak tylko z jedną instalacją HA niezależnie od tego jak się host nazywa (u mnie akurat żaden host HA nie nazywa się homeassistant) a ołączenie API działa w każdym przypadku.
Tzn. tak było dawniej, ale niewiele się zmieniło poza faktem, że można teraz wymieniać dane z wieloma HA równocześnie, ale podstawowe mechanizmy pozostały z połączenia point to point, de facto w przypadku większości integracji to nie robi różnicy, bo zwykle dane płyną z ESP do HA, no ale tu akurat jest odwrotnie…

Więc istotnie mając więcej niż jeden HA musisz bardziej dbać o nazwy encji lub łączenie sprzętu ESPHome z HA - najwyraźniej twórcy nie przewidzieli jeszcze sytuacji gdy ktoś ma więcej instalacji HA niż jedna w tej samej lokalizacji (to w sumie jedna z kluczowych idei HA, że jest on systemem nadrzędnym dla innych, więc nie ma realnej potrzeby istnienia równolegle 2 instalacji HA w jednym domu) - brakuje funkcji wyboru instancji HA (jeśli danego urządzenia ESPHome nie zintegrujesz w innym HA niż tym który jest interesujący, to problem nie wystąpi - można ignorować urządzenia w integracji ESPHome, wtedy połączenie API jest tylko jedno i problem nie istnieje).

To jest fajny temat na issue - załóż odpowiednie tam jako prośbę o nowe funkcje (o ile już takie nie istnieje, bo jeśli już jest, to się dopisz)

ewentualnie się upewniając czy w zwykłych zgłoszeniach problemów ktoś już o tym nie pisał (ale skoro funkcje nie istnieją, to nie można mówić, że mają jakieś błędy)


Chociaż w sumie swój problem możesz rozwiązać na wiele innych sposobów, np. ustal, który HA jest twoim głównym i tylko z nim integruj cały sprzęt ESPHome, a drugą instalację HA połącz z głównym HA jako remote-ha

wersja 2.0 z wyświetlaczem OLED 1,3 Arduino I2C SH1106 Biały + Moduł WiFi WEMOS D1 mini ESP8266

wyświetlane encje

esphome:
  name: "wyswietlacz"

esp8266:
  board: nodemcuv2
  framework:
    version: recommended


# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "pihTkDrpuE3BSqFHagILJHX+1ZBQxh97jMuZq3JO6gw="

ota:
  platform: esphome
  password: "6a8a2862e42cda9efc05d828cfd2be97"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.50.24
    gateway: 192.168.50.1
    subnet: 255.255.255.0
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Wywietlacz Fallback Hotspot"
    password: "o3G9trb9L5da"


captive_portal:

i2c:
  sda: D3
  scl: D4
  scan: False

font:
  - file: 'Roboto-Italic.ttf'
    id: font1
    size: 20
  - file: 'Ubuntu-Regular.ttf'
    id: font2
    size: 20
  - file: 'Ubuntu-Regular.ttf'
    id: font3
    size: 15
  - file: 'led.ttf'
    id: font4
    size: 40    


time:
  - platform: homeassistant
    id: esptime

sensor:
  - platform: homeassistant
    entity_id: sensor.moc_l1_l2_l3
    id: Mocl13
    internal: true
    accuracy_decimals: 1
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
 
  - platform: homeassistant
    entity_id: sensor.sonoffbasic_ds_multi_out
    id: tempzew
    internal: true
    accuracy_decimals: 2
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"

  - platform: homeassistant
    entity_id: sensor.temp_dom
    id: poktv
    internal: true
    accuracy_decimals: 2
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"  
text_sensor:    
  - platform: homeassistant
    name: "Energy 0/1"
    entity_id: input_select.energy_0_1
    id: energy
   
display:
  - platform: ssd1306_i2c
    model: "SH1106 128x64"
    update_interval: 2s   
    address: 0x3C
    reset_pin: D0
    rotation: 180
    id: my_display
    pages:
      - id: page1
        lambda: |-
          it.printf(50, 40, id(font2), "%.fW", id(Mocl13).state);
          it.printf(0, 0, id(font3), "%s", to_string(id(energy).state).c_str());
      - id: page2
        lambda: |-
          it.print(0, 0, id(font3), "In: ");
          it.printf(0, 40, id(font3), "%.1f°C", id(poktv).state);
          it.line(54, 0, 54, 80);
          it.print(70, 0, id(font3), "Out: ");
          it.printf(70, 40, id(font1), "%.1f°C", id(tempzew).state);

      - id: page3
        lambda: |-
          it.strftime(5, 0, id(font4), "%H:%M", id(esptime).now());
          it.strftime(5, 40, id(font2), "%d:%b:%Y", id(esptime).now());
        #it.strftime(70, 40, id(font1), "%A", id(esptime).now());
          
interval:
  - interval: 5s
    then:
      - display.page.show_next: my_display
      - component.update: my_display 

https://youtube.com/shorts/jvnQwlb7mSY?si=zP2T4__nsT130C03