OGRZEWANIE - problem z automatyzacją w ESP32

Dzień Dobry | Dobry Wieczór

Mam dwie sekcje grzewcze grzejniki i podłogówka, i dwie pompy CO, po jednej na sekcję.
Opiszę problem na przykładzie podłogówki, jak to mi zadziała, to przez analogię zadziała na grzejnikach.
W układzie mam:
siłowniki (SALUS siłownik termoelektryczny T30NC 230V M30x1.5 2W)
krańcówki (włącznik krańcowy V-156-1C25)

encje siłowników
switch.ogrzewanie_podlogowka_gabinet
switch.ogrzewanie_podlogowka_salon_prawy
switch.ogrzewanie_podlogowka_salon_lewy

encje krańcówek
binary_sensor.ogrzewanie_podlogowka_gabinet
binary_sensor.ogrzewanie_podlogowka_salon_prawy
binary_sensor.ogrzewanie_podlogowka_salon_lewy

Podnoszący się “grzybek” siłownika zwiera krańcówkę, która dalej podaje status “0” (jestem zwarty) do ESP32. I teraz powinna załączyć się Pompa CO sekcji grzewczej podłogówki.

I tu zaczyna się mój problem…

Założenie:
Jeśli którykolwiek z sensorów binarnych (binary_sensor.ogrzewanie_podlogowka_gabinet, binary_sensor.ogrzewanie_podlogowka_salon_prawy, binary_sensor.ogrzewanie_podlogowka_salon_lewy) jest w statusie “0” (zwarty), Pompa CO sekcji grzewczej podłogówki MUSI pracować. Pompa CO może się wyłączyć wyłącznie w sytuacji, kiedy wszystkie 3 krańcówki będą w statusie “1” (rozwarty).

Skrypt:

on_press:
  if:
    - switch.turn_on: switch.ogrzewanie_podlogowka_gabinet
    or
    - switch.turn_on: switch.ogrzewanie_podlogowka_gabinet
    or
    - switch.turn_on: switch.ogrzewanie_podlogowka_gabinet
  then:
    - switch.turn_on: switch.ogrzewanie_pompa_co_podlogowka
  else:
    - switch.turn_off: switch.ogrzewanie_pompa_co_podlogowka

daje następujący wynik walidacji

INFO ESPHome 2023.11.2
INFO Reading configuration /config/esphome/ogrzewanie.yaml…
ERROR Error while reading config: Invalid YAML syntax:

while scanning a simple key
in “/config/esphome/ogrzewanie.yaml”, line 526, column 5:
or
^
could not find expected ‘:’
in “/config/esphome/ogrzewanie.yaml”, line 527, column 5:
- switch.turn_on: switch.ogrzewa …
^

Przejrzałem już chyba całą dokumentację na Automations and Templates — ESPHome i zwątpiłem, a coś tam w C++ napisac potrafię.

Poproszę o wsparcie, sugestię, rozwiązanie problemu.

Pozdrawiam
Jarek

Nie mam zbyt dużego doświadczenia, ale patrząc na przykład

on_...:
  then:
    - if:
        condition:
          # Same syntax for `and` as well as `xor` conditions
          or:
            - binary_sensor.is_on: some_binary_sensor
            - binary_sensor.is_on: other_binary_sensor
        # ...

    - if:
        condition:
          not:
            binary_sensor.is_off: some_binary_sensor

brakuje dwukropka po “or” i porównujesz jedną i tą samą encję - podlogowka_gabinet. Wcięcia też chyba do korekty.

Po pierwsze - czeski błąd - nie poprawiłem encji w poście. Konsekwencje pracowania w nocy.
Po drugie - niestety, ale @isom1266 to rozwiązanie nie działa.

Poprawiłem swój skrypt:

on_press:
if:
- switch.turn_on: switch.ogrzewanie_podlogowka_gabinet
or:
- switch.turn_on: switch.ogrzewanie_podlogowka_salon_prawy
or:
- switch.turn_on: switch.ogrzewanie_podlogowka_salon_lewy
then:
- switch.turn_on: switch.ogrzewanie_pompa_co_podlogowka
else:
- switch.turn_off: switch.ogrzewanie_pompa_co_podlogowka

Wynik walidacji:

INFO ESPHome 2023.11.3
INFO Reading configuration /config/esphome/ogrzewanie.yaml…
ERROR Error while reading config: Invalid YAML syntax:

while parsing a block collection
in “/config/esphome/ogrzewanie.yaml”, line 542, column 5:
- switch.turn_on: switch.ogrzewa …
^
expected , but found ‘?’
in “/config/esphome/ogrzewanie.yaml”, line 543, column 5:
or:
^

Kolego wcięcia !. Nie możesz sobie dowolnie wpisać jednego pod drugim

on_press:
  then:
    - switch.toggle: costam

W porządku. Aby zobrazować prawidłowość wcięć, dołączam grafikę:
wciecia

Nie znam się na ESP na tyle aby sypać poradami z głowy ale na pierwszy rzut oka Twój kod nie pasuje do żadnego wzorca z poradników.
Chodzi o sekwencję zamieszczoną przez @isom1266

on_press:
  then:
on_...:
  then:
    - if:
        condition:
          lambda: 'return id(some_sensor).state < 30;'
        then:
          - logger.log: "The sensor value is below 30!"
          - light.turn_on: my_light
          - delay: 5s
        else:
          - logger.log: "The sensor value is above 30!"
    - light.turn_off: my_light

@RobinI30 przećwiczyłem przez dwa dni te wszystkie wzorce, zanim zdecydowałem się na napisanie posta na forum. Niestety, żadne rozwiązanie nie dało porządanego efektu.
Pozmieniałem trochę. Oto wersja po zmianie z switch. na binary_sensor., proszę:


daje wynik walidacji

INFO ESPHome 2023.11.3
INFO Reading configuration /config/esphome/ogrzewanie.yaml...
ERROR Error while reading config: Invalid YAML syntax:
 
while scanning for the next token
found character '\t' that cannot start any token
  in "/config/esphome/ogrzewanie.yaml", line 537, column 1:
    if:
    ^

I nadal nie wiem, gdzie robię błąd…

Opublikowałem ten fragment kodu w pliku txt pod adresem https://mars.waw.pl/ogrzewanie/ogrzewanie_skrypt.txt i do łatwego pobrania w ZIP https://mars.waw.pl/ogrzewanie/ogrzewanie_skrypt.zip jeśli ktoś z Was chciałby poedytować.

Takie podpowiedzi, których nie chcę przepisywać więc zacytuję klasyka forum:

To jest typowy błąd składni.
Było to już powiedziane - składnię określają właściwe wcięcia w tekście.
Twój kod wrzuciłem do edytora Notepad++ ze składnią yaml.
yaml1

oraz kod z przykładu poprawnie sformatowany.
yaml2
Widzisz różnicę?

Jeszcze inny, nie związany z ESP

Nie używaj cytowania do wstawiania kodu
użyj do tego linijek z trzema odwrotnymi apostrofami ```
(spod “klawisza tyldy”) przez i za blokiem kodu, posta powyżej Ci poprawię to zajrzyj tam jak to robić.

Zdecydowanie NIE wstawiaj screenshotów zamiast tekstu, teraz nie ma czego poprawiać…

Większość nowoczesnych forów używa markdown do formatowania postów (tak jak gitthub), ale jeśli masz stare przyzwyczajenia, to BBCode też tu działa

Z obrazków wynika że masz totalnie zwalone wcięcia, niestety SPACJE (UWAGA: NIE tabulatory) są elementem sterującym YAMLa…

Zrobiłem weryfikację składni w Notepad++ ustawiając składnię YAML zgodnie z sugetią @RobinI30.
Składnia wydaje się być OK, ale zapewne czegoś brakuje.
Oto obraz składni z N++ oraz raport z walidacji z ESPHome:
skrypt_z_BS_2

INFO ESPHome 2023.11.3
INFO Reading configuration /config/esphome/ogrzewanie.yaml...
ERROR Unexpected exception while reading configuration:
Traceback (most recent call last):
  File "/usr/local/bin/esphome", line 33, in <module>
    sys.exit(load_entry_point('esphome', 'console_scripts', 'esphome')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/__main__.py", line 1040, in main
    return run_esphome(sys.argv)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/__main__.py", line 1018, in run_esphome
    config = read_config(dict(args.substitution) if args.substitution else {})
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/config.py", line 1012, in read_config
    res = load_config(command_line_substitutions)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/config.py", line 866, in load_config
    return _load_config(command_line_substitutions)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/config.py", line 854, in _load_config
    result = validate_config(config, command_line_substitutions)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/config.py", line 782, in validate_config
    result.run_validation_steps()
  File "/esphome/esphome/config.py", line 125, in run_validation_steps
    task.step.run(self)
  File "/esphome/esphome/config.py", line 300, in run
    component = get_component(self.domain)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/esphome/esphome/loader.py", line 180, in get_component
    assert "." not in domain
           ^^^^^^^^^^^^^^^^^
AssertionError

I nadal ciemność widzę, widzę ciemność

Nie widzę szans zacznij od czegoś prostego…
Prawdopodobnie spróbowałbym on_state (to tak w kwestii tego on_…) z lógów lintera do niczego nie dojdziesz jeśli będziesz miał więcej niż jeden błąd (no chyba, że wolisz sobie pokopać po źródłach ESPHome) sama składnia zgodna z YAML nie wystarcza, ale masz niepoprawną…

Jeśli w danym momencie ma być lista, to konieczne są myślniki
(to tak w kwestii poprawnego YAMLa z czegoś innego, gdzie nie ma list)

np. po or: ma być właśnie lista warunków do spełnienia

Tak. Masz rację. w kilku miejscach błędnie użyłem TAB zamiast SPACE. W ostatniej wersji, którą opublikowałem są wyłącznie spacje, powycinałem to, co było podczas walidacji raportowane jako niewłaściwe, ale nadal mam problem. A najgorsze, że nie rozumiem istoty błędu…

Wklejaj tekst, a nie obrazki (nikt z nich nie będzie przepisywał treści) - już chyba wiesz jak go otagować by forum nie rozwalało formatowania…

OK. Ja chętnie wkleję tekst zamiast obrazka. Mam tylko nadzieję, że jak wkleję tekst, to mi się składnia nie rozjedzie. Obrazek prezentuje to tak, jak ja widzę. Przetestuję to w następnym poście i wykorzystam tekst

OK tak zrób. Najwyżej poprawię moderacyjnie (co chciałem zrobić wcześniej, ale zedytowałeś posta wstawiając grafikę…).

on_state powiadasz ?
No to mam wynik walidacji… :unamused:

INFO ESPHome 2023.11.3
INFO Reading configuration /config/esphome/ogrzewanie.yaml...
Failed config

on_state: [source /config/esphome/ogrzewanie.yaml:523]
  
  Component not found: on_state.

a wpisałem tak:

on_state:

Już widzę, że łatwo nie będzie…
Niby powinno być proste. Programuję w php i html. Robię css’y. Tam jakoś wszystko działa, a jak nie działa, to w prosty sposób można znaleźć błąd. Tu, w ESPHome, jakoś ciągle mam pod górkę. Ale to zapewne z powodu braków w wiedzy.

ale nie zamiast komponentu tylko w automatyzacji…

W ESPHome pewne rzeczy są nieco postawione na głowie, więc albo chwilowo zapomnij o C++ albo po prostu wstawiaj sobie własny kod jako lambda

1 polubienie

I tu Ci bardzo dziękuję. Wskazałeś mi dobre miejsce. Za bardzo uparłem się zrobić to po swojemu, a jednak trzeba zrobić inaczej. Właśnie testuję to rozwiązanie i zaczyna mi działać.
Oto fragment kodu. Jak skończę i zadziała, dam znać.

# Definicje czujników elektrozaworów
binary_sensor:
# PARTER (pod schodami)
  - platform: gpio
    id: sensor_podlogowka_gabinet
    name: "Podłogówka Gabinet"
    pin:
      pcf8574: "pcf8574_22"
      number: 0
      mode: INPUT
#      inverted: true
# sekcja testowa JerryG start
      inverted: false
    on_state:
      then:
        - switch.turn_on: switch_pompa_co_podlogowka
# sekcja testowa JerryG stop

Oczywiście inverted będzie na true, jedynie na potrzeby testów jest na false

Edit:

Że zacytuję sam siebie:

# Definicje czujników elektrozaworów
binary_sensor:
# PARTER (pod schodami)
  - platform: gpio
    id: sensor_podlogowka_gabinet
    name: "Podłogówka Gabinet"
    pin:
      pcf8574: "pcf8574_22"
      number: 0
      mode: INPUT
      inverted: true
# sekcja JerryG start
    on_state:
      - if:
          condition:
            binary_sensor.is_on: sensor_podlogowka_gabinet
          then:
            - switch.turn_on: switch_pompa_co_podlogowka
      - if:
          condition:
            binary_sensor.is_off: sensor_podlogowka_gabinet
          then:
            - switch.turn_off: switch_pompa_co_podlogowka
# sekcja JerryG stop

INFO Configuration is valid! :blush: