Esp32 z wyświetlaczem LCD st7789v i wmbus

Mam dziwny problem z tą całością. Chcę odczytać licznik wody i wyświetlić pomiar na LCD. Ładnie wszystko odczytuje, ale mam problem z wyświetlaniem odczytanych wartości
Program

esphome:
  name: licznik-wody-z-lcd
  friendly_name: licznik wody z lcd

esp32:
  board: esp-wrover-kit
  #flash_size: 16MB

external_components:
  - source: github://SzczepanLeon/esphome-components@3.2.3
    components: [ wmbus ]
    
# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxx"

ota:
  - platform: esphome
    password: "xxxx"

web_server:
  port: 80
  version: 2
  auth:
    username: "xxx"
    password: "xxx"

wifi:
  ssid: "xxxx"  
  password: "xxxxx"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "xxxxx"
    password: "xxxxx"

mqtt:
   broker: xxxxxx
   username: xxxxx
   password: xxxxx

time:
  platform: sntp  

color:
  - id: my_red
    red: 100%
    green: 0%
    blue: 0%
  - id: my_yellow
    red: 100%
    green: 100%
    blue: 0%
  - id: my_green
    red: 0%
    green: 100%
    blue: 0%
  - id: my_blue
    red: 0%
    green: 0%
    blue: 100%
  - id: my_gray
    red: 50%
    green: 50%
    blue: 50%
font:
  - file: 'Robot.ttf'
    id: font1
    size: 30  
  - file: 'Robot.ttf'
    id: font2
    size: 20     
    
captive_portal:

wmbus:
  mosi_pin: GPIO26
  miso_pin: GPIO25
  clk_pin:  GPIO27
  cs_pin:   GPIO33
  gdo0_pin: GPIO17
  gdo2_pin: GPIO21



sensor:
      
  - platform: wmbus
    meter_id: 0x210exxxx
    type: izar 
    add_prefix: false
    
    lqi:
      name: "My lqi"
      id: lqi
    rssi:
      name: "My RSSI"
    total_water_m3:
      id: licz
      name: "stan licznika m3"  
    last_month_total_water_m3:
      name: "stan licznika w poprzednim miesiącu m3" 


spi:
  clk_pin: GPIO18
  mosi_pin: GPIO19
display:
 - platform: st7789v
   model: TTGO TDisplay 135x240
   cs_pin: GPIO5
   dc_pin: GPIO16
   reset_pin: GPIO23
   rotation: 270  
   lambda: |-
       it.printf(1, 1, id(font1), "Akt %.3f m3   %d", id(licz).state, lqi->state);

Program się kompiluje, bez błędów, wszystko się uruchamia, odczytuje wodomierz, wyświetla napisy Akt i m3 na wyświetlaczu, lecz nie wyświetla odczytanych wartości (licz i lqi) W przypadku licz mam napis “nan” a lqi wyswietla 0 (w logach widzę poprawne wartości) Co ciekawsze identyczny program, ale skompilowany na ESP8266 działa poprawnie

Próbuje na różne sposoby odczytać te zmienne, ale nic mi nie wychodzi
Ma ktoś jakiś pomysł co robię nie tak?

A możesz sobie cofnąć wersję IDE ESPHome do ostatniej z listopada?

Niestety, powrót do wersji 2024.11.3 nic nie zmienił. Starszej już nie mam.
Temat dalej aktualny

Skoro IDENTYCZNY (dostosowany do innego sprzętu) YAML działa prawidłowo na innej platformie sprzętowej to czas na issue, a nie szukanie dziury w całym.

Walczę dalej, ale z marnym skutkiem, chociaż postępy są. Wygląda na to, że komponenty wmbus i display się wzajemnie gryzą. Jeżeli odczytuję encję bezpośrednio z HA i mam wyłączony wmbus (komentarz) to ładnie wyświetla się na LCD, samo włączenie wmbus (bez sensorów) powoduje, że encja jest już niewidoczna

Czyli tak

#wmbus:
  #mosi_pin: GPIO26
  #miso_pin: GPIO25
  #clk_pin:  GPIO27
  #cs_pin:   GPIO33
  #gdo0_pin: GPIO17
  #gdo2_pin: GPIO21
  
sensor:
  - platform: homeassistant
    entity_id: sensor.licznik_wody_stan_licznika_m3_2
    id: licz
    internal: true
    accuracy_decimals: 1
    unit_of_measurement: "m3"
    device_class: "power"
    state_class: "measurement" 

wyświetla prawidłową wartość id(licz), jak zdejmę komentarz to id(licz) daje “nan”. Walczę dalej

Spróbowałem na wersji 4 wmbus - bez skutku

Tam wyżej kiedyś wyedytowałem posta, aby YAML nie był rozpieprzony przez MarkDown, ale na przyszłość rób to sam (ta wiedza przyda się na każdym forum na bazie Discourse i na githubie).

Tam masz ściągawkę
Jak prawidłowo zamieszczać YAML, inny kod lub logi w postach na forum
proszę popraw posta


A w zasadniczej kwestii interesuje mnie czy faktycznie na ESP8266 lub ESP8285 masz fukcjonalnie identyczny kod z oboma komponentami uruchomionymi naraz czy tak trochę skłamałeś… będąc nieprecyzyjnym.

Jeśli jest funkcjonalnie taki sam, to issue (chociaż w sumie nawet nie wiem gdzie, bo używasz niestandardowego komponentu w nierozwijanej już wersji).

Jeśli nie jest to chyba odpowiedziałeś sobie sam - te 2 komponenty być może nie są wzajemnie kompatybilne, próbowałeś może jakiś prostszy wyświetlacz na magistrali I2C zamiast używania 2 magistral SPI?
Może trzeba zajrzeć w dokumentację SPI i tak pokombinować z konfiguracją, aby oba komponenty na 100% używały osobnych magistral lub ewentualnie można podpytać @_Szczepan czy da się wykorzystać jedną magistralę na spółkę z CC1101 na komponencie wmbus v3.x

Przepraszam - mea kulpa- będę pamiętał
ten który działa to

esphome:
  name: licznik-wody
  friendly_name: licznik wody

esp8266:
  board: nodemcuv2 

external_components:
  - source: github://SzczepanLeon/esphome-components@3.2.3
    components: [ wmbus ]
   #@3.2.3
# Enable logging
logger: 
  level: DEBUG

#mqtt:
   #broker: 1xxxxxxxxxxxx
   #username: xxxxx
   #password: xxxxxxxxx   

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxx"

ota:
  - platform: esphome
    password: "4xxxxxxxxxxxxxxe"

# Serwer with a statistic data and OTA board update
web_server:
  port: 80
  version: 2
  auth:
    username: "abc"
    password: "abc"

wifi:
  ssid: "xxxx"  
  password: "xxxxxxxx"
 
  
    # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Licznik-Wody Fallback Hotspot"
    password: "xxxxxxx"

time:
  platform: sntp  

font:
  - file: 'Robot.ttf'
    id: font1
    size: 30  
  - file: 'Robot.ttf'
    id: font2
    size: 20    


captive_portal:
# int ApatorID = 0x210xxxx;

wmbus:
  mosi_pin: GPIO13
  miso_pin: GPIO12
  clk_pin:  GPIO14
  cs_pin:   GPIO2
  gdo0_pin: GPIO16
  gdo2_pin: GPIO15

sensor:
  - platform: wmbus
    meter_id: 0x210xxxxx
    type: izar 
    add_prefix: false
  
    lqi:
      name: "My lqi"
    rssi:
      name: "My RSSI"
    total_water_m3:
      id: licz
      name: "stan licznika m3"   
    last_month_total_water_m3:
      name: "stan licznika w poprzednim miesiącu m3" 

i2c:
  sda: GPIO04
  scl: GPIO05
  scan: True
  id: bus_a
  frequency: 400kHz
 

display:
  - platform: ssd1306_i2c
    model: "SH1106 128x32"
    reset_pin: GPIO10
    address: 0x3C
    lambda: |-
      it.printf(1, 1, id(font1), TextAlign::TOP_LEFT , "%.3f", id(licz).state);  

A nie działający jest w pierwszym poście, ale skontaktowałem się ze Szczepanem - zobaczymy co na to powie

To nie będzie taki sam kod.
Taki sam YAML nie jest tożsamy z takim samym kodem w C++.

Rozwiązanie zagadki leży w tym jaki kod jest generowany na podstawie YAMLa.

Wygeneruj kod na podstawie obu YAMLi i podziel się plikami main.cpp

Niestety w tym tygodniu nie mam dostepu do PC więc nie sprawdzę.

Pomijając sam fakt, że ESP8266 jest całkiem innym sprzętem od ESP32

i używasz w nim wyświetlacz I2C a nie SPI, sprawdź z tym samym wyświetlaczem, to będzie jakiekolwiek odniesienie

Z tego co rozumiem to tu jest problem i tylko na ESP32.
Wygenerowałem sobie main.cpp z wmbus i bez wmbus.
Oba wyglądają tak samo. Obecnie nie mam jak przetestować jak to działa.

Do szopena:
Niestety - podłączenie st7789 do esp8266 jest niemożliwe z dwóch powodów - jest on wbudowany w płytkę z ESP32 i ona ma być docelowa w projekcie, nie mam zaś luźnego tego wyświetlacza. Zapinanie i2c na esp32 nie ma sensu, bo nie jest to docelowe rozwiązanie - było (jest?) wykorzystywane do testów komponentu wmbus.
Sporo teraz się pojawiło na chińskim portalu różnych modułów z esp32 i lcd - są idealne do moich aplikacji i próbuję je do siebie dostosować.

Do Szczepana
Dopiero uczę się yamla i pythona - jak wygenerować kod w C z yamla?
A może jest coś podobnego do esphome gdzie można pisać bezpośrednio w C? Nie ukrywam - wolę C.

Chyba ja się jasno nie wypowiedziałem użyj ten I2C (a tymczasowo olej, że masz coś wbudowane, tj. nie możesz oczywiście używać już zajętych pinów)
i sugerowany test ma za zadanie ominięcie podwójnego wykorzystania SPI

@Darek_M - wystarczy użyć znaku “małpki” i możesz wskazywać użytkownika

Ma sens bo da informacje czy problem jest związany z SPI czy nie. Podłącz I2C do ESP32.

Każde wykonanie

esphome run
esphome compile

generuje źródła w C++ i potem je kompiluje.
Finalnie ESPHome to jest projekt w PlatformIO.

btw
Załącz loga i zdjęcie jak to na LCD dokładnie wygląda.

Cały ESPHome jest w C++. Python jest jedynie dla ułatwienia konfiguracji.
Nic nie szkodzi abyś w C++ pisał. Będzie to trochę upierdliwe :wink:

Jeśli IDE/compiler to Dodatek, to w terminalu z uprawnieniami administratora

docker exec -it `docker ps | grep esphome | awk '{print $1}'` /bin/bash

jest potrzebne do wygrzebania plików powstałych podczas kompilacji
z rok temu było to o wiele prostsze, no ale ulepszono ESPHome

1 Like

Przepraszam, ale na kilkanaście dni musze przerwać prace, będę na wyjeździe, a żeby było ciekawiej dzisiaj panowie z wodociągów podmienili mi licznik na nowy… - muszę opanować numery licznika…