ESP32-S3-4848S040 z FW openHASP + integracja HA openHASP

Witam,
mam problem z poprawnym połączeniem ESP32-S3-4848S040 z zainstalowanym firmware openHASP do mojego HomeAssistanta. ESP32 ma sterować kilkoma urządzeniami i wyświetlać na wyświetlaczu kilka danych.
Zainstalowałem na esp openhasp i skonfigurowałem wifi, mqtt (broker jest uruchomiony na HA) oraz dodałem podstawowy (na razie, potem chciałbym go rozszerzyć o kilka funkcjonalności) pages.jsonl:

{"id":0,"bg_color":"#111111"}

{"page":1,"id":0,"bg_color":"#111111"}

{"page":2,"id":0,"bg_color":"#111111"}

{"page":3,"id":0,"bg_color":"#111111"}


// Strona startowa
{"page":1,"id":8,"obj":"img","src":"L:/bg1d.png","w":480, "h":480}


{"page":1,"id":1,"obj":"label","x":30,"y":120,"w":360,"h":180,"text":"--:--","text_color":"#000000","text_font": 160}
{"page":1,"id":2,"obj":"label","x":40,"y":30,"w":70,"h":70,"text":"\uE596","text_color":"#ffffff","text_font": 64}
{"page":1,"id":3,"obj":"label","x":120,"y":50,"w":70,"h":50,"text":"--°C","text_color":"#ffffff","text_font": 48}
{"page":1,"id":4,"obj":"label","x":40,"y":90,"w":330,"h":32,"text":"--","text_color":"#ffffff","text_font": 32}
{"page":1,"id":5,"obj":"label","x":320,"y":30,"w":40,"h":40,"text":"\uE6A1","text_color":"#ffffff","text_font": 32}
{"page":1,"id":6,"obj":"label","x":380,"y":30,"w":60,"h":40,"text":"--°C","text_color":"#ffffff","text_font": 32}
{"page":1,"id":7,"obj":"label","x":390,"y":60,"w":60,"h":40,"text":"--%","text_color":"#ffffff","text_font": 32}


{"page":1,"id":12,"obj":"label","x":50,"y":340,"w":64,"h":64,"text":"\uE456","text_color":"#ffffff","text_font": 64}
{"page":1,"id":13,"obj":"label","x":40,"y":400,"w":80,"h":40,"text":"Sceny","text_color":"#ffffff","text_font": 32}
{"page":1,"id":11,"obj":"obj","x":20,"y":320,"w":220,"h":144,"radius":15,"click":true,"border_side":0,"bg_color":"#1c1c1c","action":"p2","opacity":0}


{"page":1,"id":22,"obj":"label","x":320,"y":340,"w":64,"h":64,"text":"\uE335","text_color":"#ffffff","text_font": 64}
{"page":1,"id":23,"obj":"label","x":280,"y":400,"w":160,"h":40,"text":"Oświetlenie","text_color":"#ffffff","text_font": 32}
{"page":1,"id":21,"obj":"obj","x":240,"y":320,"w":220,"h":144,"radius":15,"click":true,"border_side":0,"bg_color":"#1c1c1c","action":"p3","opacity":0}



// Strona scen
{"page":2,"id":1,"obj":"img","src":"L:/bg2d.png","w":480, "h":480}

{"page":2,"id":3,"obj":"label","x":0,"y":8,"w":480,"h":40,"text":"Sceny", "text_font": 32,"align":"center"}
{"page":2,"id":4,"obj":"label","x":8,"y":4,"w":32,"h":48,"text":"\uE141", "text_font": 48}
{"page":2,"id":5,"obj":"obj","x":0,"y":0,"w":64,"h":64,"click":true,"action":"back", "opacity":0}

{"page":2,"id":10,"obj":"obj","x":16,"y":90,"w":216,"h":90,"click":true,"opacity":0}
{"page":2,"id":20,"obj":"obj","x":16,"y":217,"w":216,"h":90,"click":true,"opacity":0}
{"page":2,"id":30,"obj":"obj","x":16,"y":344,"w":216,"h":90,"click":true,"opacity":0}
{"page":2,"id":40,"obj":"obj","x":248,"y":90,"w":216,"h":90,"click":true,"opacity":0}
{"page":2,"id":50,"obj":"obj","x":248,"y":217,"w":216,"h":90,"click":true,"opacity":0}
{"page":2,"id":60,"obj":"obj","x":248,"y":344,"w":216,"h":90,"click":true,"opacity":0}



// Stona oświetlenia
{"page":3,"id":1,"obj":"img","src":"L:/bg3d.png","w":480, "h":480}

{"page":3,"id":3,"obj":"label","x":0,"y":8,"w":480,"h":40,"text":"Oświetlenie", "text_font": 32,"align":"center"}
{"page":3,"id":4,"obj":"label","x":8,"y":4,"w":32,"h":48,"text":"\uE141", "text_font": 48}
{"page":3,"id":5,"obj":"obj","x":0,"y":0,"w":64,"h":64,"click":true,"action":"back", "opacity":0}

// light 1
{"page":3,"id":10,"obj":"slider","x":24,"y":80,"w":432,"h":60,"value":50, "min":1, "max":255,"bg_opa00":20, "bg_opa20":0, "bg_color10":"#FAAC1B","bg_color00":"#1c1c1c"}
{"page":3,"id":11,"obj":"obj","x":32,"y":88,"w":44,"h":44,"radius":22,"border_side":0,"bg_color":"#181c18"}
{"page":3,"id":12,"obj":"label","x":32,"y":94,"w":44,"h":44,"text":"\uE335", "text_font": 24,"align":"center","click":0,"text_color":"#747474"}
{"page":3,"id":13,"obj":"label","x":92,"y":94,"w":300,"h":60,"text":"Żyrandol Salon", "text_font": 24,"click":0}

// light 2
{"page":3,"id":20,"obj":"slider","x":24,"y":156,"w":432,"h":60,"value":50, "min":1, "max":255,"bg_opa00":20, "bg_opa20":0,"bg_color10":"#FAAC1B","bg_color00":"#1c1c1c"}
{"page":3,"id":21,"obj":"obj","x":32,"y":164,"w":44,"h":44,"radius":22,"border_side":0,"bg_color":"#181c18"}
{"page":3,"id":22,"obj":"label","x":32,"y":170,"w":44,"h":44,"text":"\uE335", "text_font": 24,"align":"center","click":0,"text_color":"#747474"}
{"page":3,"id":23,"obj":"label","x":92,"y":170,"w":300,"h":60,"text":"Kiniket Salon", "text_font": 24,"click":0}

// light 3
{"page":3,"id":30,"obj":"slider","x":24,"y":232,"w":432,"h":60,"value":50, "min":1, "max":255,"bg_opa00":20, "bg_opa20":0,"bg_color10":"#FAAC1B","bg_color00":"#1c1c1c"}
{"page":3,"id":31,"obj":"obj","x":32,"y":240,"w":44,"h":44,"radius":22,"border_side":0,"bg_color":"#181c18"}
{"page":3,"id":32,"obj":"label","x":32,"y":246,"w":44,"h":44,"text":"\uE335", "text_font": 24,"align":"center","click":0,"text_color":"#747474"}
{"page":3,"id":33,"obj":"label","x":92,"y":246,"w":300,"h":60,"text":"Kinkiet TV", "text_font": 24,"click":0}

// light 4
{"page":3,"id":40,"obj":"slider","x":24,"y":308,"w":432,"h":60,"value":50, "min":1, "max":255,"bg_opa00":20, "bg_opa20":0,"bg_color10":"#FAAC1B","bg_color00":"#1c1c1c"}
{"page":3,"id":41,"obj":"obj","x":32,"y":316,"w":44,"h":44,"radius":22,"border_side":0,"bg_color":"#181c18"}
{"page":3,"id":42,"obj":"label","x":32,"y":322,"w":44,"h":44,"text":"\uE335", "text_font": 24,"align":"center","click":0,"text_color":"#747474"}
{"page":3,"id":43,"obj":"label","x":92,"y":322,"w":300,"h":60,"text":"Kinkiet Kuchnia", "text_font": 24,"click":0}



{"page":1,"id":0,"prev":3}

{"page":3,"id":0,"next":1}


tak to wygląda:


W HomeAssistant zainstalowana integracja openHASP, w configuration.yaml dodana linijka: openhasp: !include openhasp.yaml
oraz dodany plik openhasp.yaml:

  plate:
    objects:
      - obj: "p1b1"  # czas
        properties:
          "text": '{{ now().strftime("%H:%M") }}'
      - obj: "p1b4"  # data
        properties:
          "text": '{{ now().strftime("%A %d %b") }}'
      - obj: "p1b6"  # temperatura w salonie
        properties:
          "text": '{{ int(states("sensor.salon_temperature")) }}°C'
      - obj: "p1b7"  # wilgotność w salonie
        properties:
          "text": '{{ states("sensor.salon_humidity") }}%'
      - obj: "p1b3"  # temperatura zewnętrzna
        properties:
          "text": '{{ int(state_attr("weather.forecast_dom", "sensor.zewnetrzna_temperature")) }}°C'
      - obj: "p1b2"  # ikona forecast
        properties:
          "text": >-
            {% set icons = {"cloudy":"\uE590", "fog":"\uE591", "hail":"\uE592", "lightning":"\uE593", "clear-night":"\uE594", "partlycloudy":"\uE595", "pouring":"\uE596", "rainy":"\uE597", "snowy":"\uE598", "sunny":"\uE599", "windy":"\uE59D", "windy-variant":"\uE59E", "lightning-rainy":"\uE67E", "snowy-rainy":"\uE67F", "exceptional":"\uE957"} %}
            {{ icons[states("weather.forecast_dom")] | default("\uE957") }}
      - obj: "p3b10" # Jasność oświetlenia
        properties:
          "val": "{{state_attr('light.lampastol', 'brightness') if state_attr('light.lampastol', 'brightness') != None else 0 }}"
        event:
          "changed":
            - service: light.turn_on
              data:
                entity_id: light.lampastol
                brightness:  "{{ val }}"
          "up":
            - service: light.turn_on
              data:
                entity_id: light.lampastol
                brightness:  "{{ val }}"
      - obj: "p3b11" # przycisk oświetlenia
        properties:
          "bg_color": "{{ '#181c18' if states('light.lampastol') == 'on' else '#262626' }}"
        event:
          "up":
            - service: light.toggle
              data:
                entity_id: light.lampastol
      - obj: "p3b12" # ikona żarówki
        properties:
          "text_color": "{{ '#FAAC1B' if states('light.lampastol') == 'on' else '#747474' }}"

Niestety nie potrafię sobie poradzić z problemem pobierania danych (czas, temperatury itd) z HA.

Chodzi o openHASP 0.7.0?

masz na myśli
Guition ESP32-S3-4848S040 ?

w sumie przy zadawaniu tak skomplikowanego pytania parę linków by nie zaszkodziło

Sprawdziłeś, że sprzęt się zgadza z dokumentacją?
Sprzęt w ogóle działa?

I zintegrowany z HA?

Proponuję wykorzystać MQTT Explorer do diagnozowania jak przebiega komunikacja przez broker

1.Tak, a dokładnie to ten sprzęt: LINK
2. Tak, Broker MQTT działa prawidłowo, bo na tę chwilę korzystam z połączenia z frigate i z esp8266, który wysyla dane do HA po mqtt. W MQTT Explorer cisza o połączeniu z tym esp32, ale o esp8266 też nic nie ma, a na 100% poprawnie wysyła temperatury z kilku ds18b20 do HA. Komunikację z Frigate za to pokazuje normalnie.

Niemożliwe, wysyłasz je przez MQTT?

A subskrybowałeś WSZYSTKIE tematy?

Przepraszam są:

core-mosquitto.local.hass.io
zigbee2mqtthomeassistant
binary_sensor
1221051039810110150109113116116_0xe0798dfffe9c9fa8button
1221051039810110150109113116116_0xe0798dfffe9c9fa8selectsensor
1221051039810110150109113116116_0xe0798dfffe9c9fa80x70b3d52b600300580xf0d1b8be2408e4aa0xa4c1386efb77e2c90xa4c1387e5b214fb70xa4c138ed21cf0c0f0xf0d1b8be2408e7f40x70b3d52b6002dab10x70b3d52b600a480b0x70b3d52b600a3af1
temperature1 = 21.50
temperature2 = 19.62
temperature3 = 1.56
temperature4 = 7.32

z tym esp32 - zero komunikacji

No i generalnie ślady komunikacji z openhasp też być powinny.
Jesteś w stanie jakkolwiek stwierdzić, że urządzenia działa (jego interfejs web, logi z seriala/USB)?

Zweryfikowałeś w ogóle, że masz wyświetlacz ST7701S + dotyk GT911

MQTT jest cały czas jako rozłączone:

openHASP
Version	0.7.0-rc12 cd34d89
Build DateTime	May 23 2024 22:16:51 UTC
Environment	esp32-s3-4848s040_16MB
Uptime	25s
Idle	off
Active Page	1
Device Memory
Free Heap	105.98 KiB
Free Block	95.98 KiB
Fragmentation	9%
PSRam Free	6.63 MiB
PSRam Size	7.99 MiB
LVGL Memory
Total	64.00 KiB
Free	49.71 KiB
Fragmentation	2%
MQTT
Server	homeassistant
Username	jaro
Client ID	plate_0eceec
Status	Disconnected
Received
Published
Failed	2
Wifi
BSSID	******
SSID	******
Signal Strength	-53dBm (Good)
IP Address	192.168.10.12
Gateway	192.168.10.1
DNS Server	192.168.10.1
MAC Address	******
Module
Model	ESP32-S3 rev0
Frequency	240MHz
Core Version	4.4.6
Reset Reason	CPU0: POWERON_RESET / CPU1: POWERON_RESET
Flash Size	16.00 MiB
Program Size Used	1.56 MiB
Program Size Free	1.93 MiB
Filesystem Size	11.93 MiB
Filesystem Used	344.00 KiB
Filesystem Free	11.60 MiB

No to trzeba zweryfikować ustawienia.

broker to bym skonfigurował po IP, bo szczerze mówiąc wątpię, że nazwa

homeassistant

rozwiązuje się na twoim lokalnym DNSie, no chyba że skonfigurowałeś serwer DNS, który masz tam

192.168.10.1

by rozwiązywał nazwę

homeassistant

na faktyczne IP brokera

W konfiguracji tego esp32 mam wpisany od początku adres ip, nie wiem dlaczego wyświetlana jest nazwa “homeassistant”, może jakoś jest pobierana.

Nie wiem, Ty to wiesz = sprawdź, ale z tego wynika jasno, że openhasp nie udaje się nic publikować na brokerze, może użytkownik i/lub hasło do brokera są złe (albo gdzieś jakaś literówka w konfiguracjach dotyczących MQTT)

w ogóle nie ma połączenia z brokerem

MQTT
…
Status	Disconnected

Możesz też po prostu zajrzeć w logi brokera i tam się dowiedzieć dlaczego (może odrzuca połączenia i się dowiesz dlaczego)

dziwne, ale w config.json było faktycznie “homeassistant”

    "mqtt": {
        "host": "homeassistant",
        "user": "jaro",
        "pass": "********",
        "topic": {
            "node": "hasp/%hostname%/%topic%",
            "group": "hasp/plates/%topic%",
            "broadcast": "hasp/broadcast/%topic%",
            "hass": "homeassistant/status"

Zmiany przez webgui http://ip_esp32/config/mqtt nie zmieniały tego.
Zmiana bezpośrednio w config.json pomogła i wszystko działa.

1 Like

Mam jeszcze jedno pytanie.
Dlaczego zmiana kodu z:

      - obj: "p1b6"  # temperatura w salonie
        properties:
          "text": '{{ states("sensor.sypialnia_temperature") }}°C'

na:

      - obj: "p1b6"  # temperatura w salonie
        properties:
          "text": '{{ states("sensor.sypialnia_temperature", with_unit=True) }}°C'

nic nie zmienia.
Chciałem uzyskać efekt, aby była wyświetlana temperatura z jedną pozycją po przecinku, według tego opisu:
https://www.home-assistant.io/docs/configuration/templating/

Odpowiada za dołączenie jednostki (zapewne °C) jeśli oczywiście encja źródłowa ją zawiera, więc sprawdź w dokumentacji openhasp jak wyświetlić zaokrąglenie (jeśli masz za dużo cyfr po przecinku).

Bez tego °C też jest dołączane. Zresztą zgodnie załączonym wyżej linkiem do doc HA:

Poważnie czytałeś to? bo chyba nie…

sam dołączasz na końcu stringa u siebie

}}°C'

więc mnie to nie dziwi, że jest
bardziej mnie zastanawia kaleka encja źródowa, która nie eksponuje jednostki pomiaru.

Zauważ różne typy danych w tych przykładach, “goła” liczba nie wychodzi jako string tylko float.

Na twoim miejscu chyba bym sięgnął głębiej - do źródła tych encji i już tam ogarnął zaokrąglanie do 1 miejsca po przecinku.

      - obj: "p1b6"  # temperatura w salonie
        properties:
          "text": '{{ states("sensor.sypialnia_temperature") }}°C'

na:

      - obj: "p1b6"  # temperatura w salonie
        properties:
          "text": '{{ states("sensor.sypialnia_temperature", with_unit=True) }}°C'

W obu przypadkach wyświetlanie wygląda dokładnie tak samo.


tu dołączam }}°C , a przy innych sensorach %, hPa itp. To, że to być może dodaje jakąś jednostkę mnie nie interesuje. Interesuje mnie tylko To zdanie, które zaznaczyłem,
czyli:

and user configured presentation rounding set to 1 decimal.

Nie mogę, tam musi być tak jak jest, bo potrzebuje takich danych do bazy mysql i do aplikacji termik4temp, a nie będą robił dla każdego odbiorcy osobno.

OK zatem zaokrąglij i przekształć do stringa w tym szablonie

| round(1) 

zgodnie z tą dokumentacją
https://jinja.palletsprojects.com/en/stable/templates/#jinja-filters.round

          "text": '{{ states("sensor.sypialnia_temperature") | round(1) }}°C'

Niestety, przy takiej konfiguracji

          "text": '{{ states("sensor.sypialnia_temperature" | round(1) ) }}°C'

mqtt nie wysyła temperatur

To stwórz sobie w HA sensor template na bazie oryginalnego sensora i to jego wysyłaj zamiast oryginału, nie mam weny szukać po dokumentacji openhasp co tam przeoczyłeś, ale wykopałem że musiosz wysyłać stringi.