Template sensors

Witam,
to mój pierwszy wpis. Witam wszystkich. Proszę o wyrozumiałość :slight_smile: Uparłem się, żeby zrobić swój domek bardziej inteligentnym. Z Home Assistant żyję dopiero od trzech miesięcy, wydaje mi się, że całkiem przyzwoicie ogarniam już tą kuwetę z wszystkim co proste (sonoff i inne po prostu działające integracje), ale również Zigbee2mqtt na cc2652rb, LocalTuya, wraz z dodawaniem “nowych” urządzeń Tuya z customowymi zigbee-herdsman-converters (z sukcesami) i wieloma custom’owymi sensorami na platformie template. ALE i tak nie rozumiem jak to wszystko działa, a z każdym tygodniem niestety jestem coraz głupszy - trochę jak ta małpa prowadzona ścieżką przez dżunglę za rękę przez internetowe porady i dokumentację HA. Utknąłem w jakimś dead end’zie z głupią sprawą. Mam wrażenie, że istnieją dwa formaty YAML do definiowania sensorów template. Pierwszy “rodzaj” wpisu w configuration.yaml wygląda mniej więcej tak:


(mam nadzieję, że później pokaże się tu obrazek.
Jednocześnie w dokumentacji HA forma definiowania sensorów na platformie template wygląda tak jak tutaj (z Template - Home Assistant):

    # Determine when the washing machine has a load running.
template:
  - binary_sensor:
      - name: "Washing Machine"
        delay_off:
          minutes: 5
        state: >
          {{ states('sensor.washing_machine_power')|float > 0 }}

Już mi się zdarzało, że z tej drugiej formy robiłem tą pierwszą, bo…HA nie puszcza mi tej drugiej. Check configuration nawet przechodzi (na Server Controls) ale pojawia się notification o treści mniej więcej:

The following integrations and platforms could not be set up:* template Please check your config and logs.

A w logu też mogę przeczytać:

Invalid config for [template]: [platform] is an invalid option for [template]. Check: template->platform. (See /config/configuration.yaml, line 122).

Jak to więc jest? Podpowiedzcie chociaż, czego mam szukać? Czy to jest kwestia kopania w formatowaniu yaml, czy kompletnie mylę jakieś pojęcia >>> ale jestem w stanie zmienić jeden format na drugi. Tzn, że można korzystać albo z jednego, albo z drugiego?
Jeszcze dla tych, którzy bardzo chcą zrozumieć o co pytam załączam sformatowany kawałek mojego configuration.yaml (nie przechodzi) - na górze pierwsza forma zaczynająca się od “sensor:”, na dole druga zaczynająca się od “template”. Czy jak już zacząłem pisać w pierwszym formacie muszę się już tego trzymać i przerobić #2 na tą #1???

`sensor:
  - platform: time_date
    display_options:
      - 'time'
      - 'date'
      - 'date_time'
      - 'date_time_utc'
      - 'date_time_iso'
      - 'time_date'
      - 'time_utc'
      - 'beat'
  - platform: template
    sensors:
      connected_device:
        friendly_name: "Bluetooth Connected Device do mojego S9"
        value_template: "{{ state_attr('sensor.sm_g960f_polaczenie_bluetooth', 'connected_paired_devices') }}"
      prognoza_deszczu:
        friendly_name: "Czy jutro bedzie padac"
        value_template: "{{ state_attr('weather.dom','forecast')[0]['precipitation'] }}"
      czy_online_zigbeesonoff:
        friendly_name: "Czy gate jest online"
        value_template: "{{ state_attr('switch.sonoff_zigbee_gate1','cloud') }}"
      tuya_lodowka_current_consumption:
        value_template: "{{ state_attr('switch.lodowka_tuylocal','current_consumption') }}"
        unit_of_measurement: 'W'
      czujnik_powietrza_formaldehyd1:
        value_template: "{{ states('sensor.czujnik_powietrza_formaldehyd')|float / 100 }}"
        unit_of_measurement: "ppm"
        friendly_name: "Formaldehyd"
      czujnik_powietrza_voc1:
        value_template: "{{ states('sensor.czujnik_powietrza_voc')|float / 100 }}"
        unit_of_measurement: "ppm"
        friendly_name: "Lotne związki organiczne VOC"
template:
  - binary_sensor:
      - name: "Pompa On"
        state: >
          {% if is_state('sensor.gniazdo2tuyazigbee_current','A')|float > 0 %}
            on
          {% else %}
            off
          {% endif %}`

Tak serio, to chcę zrobić prostą rzecz >>> binary sensor, który będzie ‘on’ jeśli na gniazdku tuya z pomiarem W pobór będzie >0 i off jeśli else (lub =0), po to, żeby później zliczać ile razy mi się załączała pompa wody. I ja sobie spokojnie z tym poradzę w taki czy inny sposób. Ale nurtuje mnie to o co pytam - format tworzenia sensorów w template…niestety lektura dokumentacji HA jest w całości wg formatu #2

Z góry dziękuję wszystkim, którym chciało się czytać moje wypociny. To mój pierwszy post po pomoc z HA - do tej pory radziłem sobie czytając wszystko, co było dostępne, ale tu poległem.

Pozdrawiam

Lepszym rozwiązaniem jak umieszczanie wszystkiego w configuration.yaml jest podzielenie wszystkiego wg kategorii wykorzystując do tego !include

######## INCLUDES ########
group: !include groups.yaml
automation: !include automations.yaml
sensor: !include_dir_merge_list sensors/
#script: !include_dir_named scripts/
script: !include scripts.yaml
#script: !include_dir_named scripts/
input_select: !include input_select.yaml
#input_boolean: !include_dir_named input_boolean/
input_boolean: !include input_boolean.yaml
#input_number: !include_dir_named input_number/
input_number: !include input_number.yaml
#binary_sensor: !include_dir_merge_list binary_sensors/
#decluttering_templates: 

switch: !include switch.yaml
#floorplan: !include floorplan.yaml
#zone: !include zones.yaml
#media_player: !include_dir_merge_list media_player/

#themes
frontend:
  themes: !include_dir_merge_named themes

Jeżeli konfigurujemy plik jako automation: !include automations.yaml   odnosi się on do jednego pliku konfiguracyjnego w w nim poszczególne automatyzacje umieszczone po kolei 

Jeżeli konfigurujemy pliki jako  sensor: !include_dir_merge_list sensors/
każdy plik jest osobnym plikiem dla jednego sensora  plik1 .yaml   plik2.yaml plik3.yaml


Można też skonfigurować sobie poszczególne sekcje lądując je z

packages: !include_dir_named packages/ 
można tutaj  skonfigurować odnośniki do plików konfiguracyjnych np. Czujniki, czujniki binarne itd.

Struktura wygląda tak :

Screenshot - 30.07.2021 , 02_33_35

Tak wygląda struktura formatowanie w configuration.yaml

- platform: template
  sensors:
    artur_next_alarm:
    entity_id:
      - sensor.sm_n960f_next_alarm
      - sensor.time

A tak gdy załadujemy ja przez !include np. “sensor: !include_dir_merge_list sensors/”

platform: template
sensors:
  day_night:
    friendly_name: "Dzień/Noc"
    value_template: >-
      {% if is_state('sun.sun', 'above_horizon') %}
        Day
      {% else %}
        Night
      {% endif %}
    icon_template: >-
      {% if is_state('sun.sun', 'above_horizon') %}
        mdi:weather-sunny
      {% else %}
        mdi:weather-night
      {% endif %}

Myślę ze czas powoli pożegnać się z konfiguracja czujników, template, itd w pliku configuration.yaml
Podzielic sobie wszystko na

binary_sensor.yaml
input_boolean.yaml
switch.yaml
zones.yaml    itd.
1 polubienie

Podziel sobie pliki na poszczególne sekcje, czujniki przełączniki itd.
sensor: !include_dir_merge_list sensors/
W katalogu sensors umieszczasz sobie pliki np data_czas.yaml
i w nim kod . Robisz następny plik np. moj_termometr. yaml i w nim twój kod itd.
Taka Hierarchia pozwoli ci zapanować nad kodem i ograniczy szukanie, awarie… W razie jakiś problemów wystarczy przejrzeć ostatnio edytowany plik lub go po prostu usunąć

Dokładnie tak, to nowy sposób definiowania template, stary sposób jaki pokazuje @artpc jest nadal poprawny ale niedługo (na razie brak informacji kiedy ale trochę to potrwa) zostanie wycofany z HA, już jest o tym wzianka, patrz link Template - Home Assistant :
This format still works but is no longer recommended. Use modern configuration.
Tak więc proponuje powoli zacząć używać nowego formatu template.

To jest bardzo pomocne, poczytaj o tym na forum Package w Home Assistant.

Bardzo dziękuję za podpowiedzi odnośnie zachowania ‘higieny’ w strukturze.

Oooo to dokładnie właśnie pytałem - dziękuję bardzo za podpowiedź. Nie zauważyłem tego bardzo ważnego dopisku nt. formatu, który wskazałeś.
Poszukiwanie rozwiązań zawsze zajmuje dużo czasu i łatwo przeoczyć pojedyncze zdania, a najczęściej każde ma znaczenie.

Jeszcze raz bardzo dziękuję i pozdrawiam!

Hej Macek,

to mam jeszcze jednak problem. Poradziłem sobie z Package - fajne, porządkuje, działa. Ale na “nowy format” przejść nie potrafię. Przykładowa konfiguracja w jednym z plików w folderze packages:

template:
  • sensor:
    • name: “voc1”
      unit_of_measurement: “ppm”
      unique_id: “czujnikpowietrzavoc”
      state: >
      {{ states(‘sensor.czujnik_powietrza_voc’)|float / 100 }}

Na config check zwraca mi komunikat:
“Package czujnikpowietrza_test setup failed. Component template cannot be merged. Expected a dict.”

To co musi się znaleźć w takim pojedynczym pliku .yaml w /packages ?

Dzięki za pomoc!

Proszę kod yaml zawsze umieszczać na forum w następujący sposób:

  • na początku nowa linia z trzema znakami `
  • potem wklejony kod
  • na końcu ponownie nowa linia z trzema znakami `

Popraw to w powyższym swoim poście, wtedy można analizować poprawność kodu yaml w plikach konfiguracyjnych.

OK, przepraszam - próbowałem kilka razy wkleić to jako kod.
Po Twoich instrukcjach:

template:
  - sensor:
      - name: "voc1"
        unit_of_measurement: "ppm"
        unique_id: "czujnikpowietrzavoc"
        state: >
          {{ states('sensor.czujnik_powietrza_voc')|float / 100 }}

Czy to cała zawartość plik “czujnikpowietrza_test”?

tak, to cała zawartość pliku

Sprawdziłem u siebie i również nie działa, sprawdziłem w zgłoszonych błędach w HA i faktycznie nie działa:

ale “it is not a bug, but by design” i “newer templates format can’t be merged from inside of a package”.

OK, rozumiem, że póki co trzeba jednak pozostać przy “Legacy Sensor configuration format”.

Rozumiem, że również używasz ‘starego’ formatu?

Pozdrawiam i dzięki za pomoc.

Tak, używam ‘starego’ formatu template.

Może ktoś podpowie co mam nie tak

template:        
  - sensors:
        name: "dzbanek_status"
        state: >-
            {% if state_attr('sensor.filtr_w_dzbanku_2', 'days')|int(0) > 16  %}
            3
            {% elif state_attr('sensor.filtr_w_dzbanku_2', 'days')|int(0) > 10 %}
            2
            {% else %}
            1
            {% endif %}

Logger: homeassistant.config
Source: config.py:464
First occurred: 10:10:39 (1 occurrences)
Last logged: 10:10:39

Invalid config for [template]: expected dictionary for dictionary value @ data['sensors']['name']. Got 'dzbanek_status' expected dictionary for dictionary value @ data['sensors']['state']. Got "{% if state_attr('sensor.filtr_w_dzbanku_2', 'days')|int(0) > 16 %} 3 {% elif state_attr('sensor.filtr_w_dzbanku_2', 'days')|int(0) > 10 %} 2 {% else %} 1 {% endif %}". (See /config/configuration.yaml, line 127).

Pierwsze co zauważyłem to powinno być:

 - name: "dzbanek_status"
   state: >

@macek to nie to. Błąd dalej ten sam Poza tym mam inny sensor i ten działa

  - sensor:
        name: "zmywarka_on"
        state: >-
            {% if states('sensor.kuchniagniazdozmywarka_energy_power')|int > 1  %}
            on
            {% else %}
            off
            {% endif %}

Moim zdaniem brakuje Ci zdefiniowania co musi być spełnione aby zaistniała jedynka “1”.
Linia 127 to która?

@macek błąd banalny powinno być

  • sensor:

a ja miałem

  • sensors:

Jest ok
if > 16 daj 3
ifel > 10 daj 2
else daj 1