Poziom wody w zbiorniku na deszczówkę z HA

Witam, proszę o podpowiedź, co źle robię. Mam zbiornik na deszczówkę i czujnik ultradźwiękowy połączony z aplikacją SmartLive (Tuya). Oczywiście integracja z HA była bezproblemowa. Chciałem jednak, aby HA wysyłał mi powiadomienia na komórkę o stanie wody w zbiorniku. Poniżej fragment panelu integracyjnego.

Zrobiłem prostą automatyzację, która działa nie do końca tak jak chcę. To znaczy zrobiłem kilkanaście podobnych automatyzacji i każda kiedyś tam się uruchamia, ale w efekcie dostaję kilka powiadomień np: kiedy deszczówka podniesie się do 31% dostaję deszczówka powyżej 30%, powyżej 20%, powyżej 10%, powyżej 2%, a przecież nie o to chodzi. Poniżej jedna z automatyzacji (trochę działająca).

alias: Zbiornik na deszczówkę ponad 30%
description: ""
triggers:
  - type: value
    device_id: 3c066695846056b0597bc2b3f8f2c8c4
    entity_id: 27cf77195617022e49f28ab1d0fd50cb
    domain: sensor
    trigger: device
    above: 30
    for:
      hours: 0
      minutes: 20
      seconds: 0
conditions:
  - condition: template
    value_template: |
      {{ trigger.from_state.state | float(0) <= 30 }}
actions:
  - device_id: 78755e714f2073a963df0b6feab4d090
    domain: mobile_app
    type: notify
    message: Deszczówka ponad 30%
    title: Deszczówka
mode: single

Ale chciałbym jedną automatyzację, która dla progów 2%, 10% i dalej co 10 do 100% wysyłała tylko jedno powiadomienie na komórkę w stylu np.: deszczówka powyżej 40% (jeśli poziom wody wzrósł) lub deszczówka poniżej 20% (jeśli poziom wody spadł). Zacząłem coś pisać, ale mi nie wychodzi. Próbowałem na razie z samy wzrostem. Jak ręcznie uruchomię to przychodzi komunikat, ale sam skrypt nie chce zadziałać. Oto te moje wypociny.

alias: XZbiornik na deszczówkę – progi co 10%
description: ""
triggers:
  - trigger: state
    entity_id: sensor.tank_a_level_liquid_level
conditions:
  - condition: template
    value_template: >
      {% set progi = [5,10,20,30,40,50,60,70,80,90,100] %} {% set now =
      states('sensor.tank_a_level_liquid_level') | float(0) %} {% set before =
      trigger.from_state.state | float(0) if trigger and trigger.from_state else
      0 %} {{ progi | select('le', now) | list | max(default=0) >
         progi | select('le', before) | list | max(default=0) }}
actions:
  - device_id: 78755e714f2073a963df0b6feab4d090
    domain: mobile_app
    type: notify
    title: Deszczówka
    message: >
      XPoziom deszczówki przekroczył {{
      states('sensor.tank_a_level_liquid_level') }}%
mode: single

Kod wstawiamy jako kod, a nie jako komentarz…

alias: Zbiornik na deszczówkę – progi co 10%
description: ""
triggers:
  - trigger: state
    entity_id: sensor.tank_a_level_liquid_level
conditions:
  - condition: template
    value_template: >
      {% set progi = [2, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100] %}
      {% set now = states('sensor.tank_a_level_liquid_level') | float(-1.0) %}
      {% set before = trigger.from_state.state | float(-1.0) if (trigger is defined and trigger.from_state is not none) else -1.0 %}
      
      {% if now != -1.0 and before != -1.0 and now != before %}
        {% set mniejsza = [before, now] | min %}
        {% set wieksza = [before, now] | max %}
        {% set przekroczone = namespace(prog=false) %}
        {% for p in progi %}
          {% if mniejsza < p and p <= wieksza %}
            {% set przekroczone.prog = true %}
          {% endif %}
        {% endfor %}
        {{ przekroczone.prog }}
      {% else %}
        false
      {% endif %}
actions:
  - action: notify.send_message
    metadata: {}
    target:
      device_id: 78755e714f2073a963df0b6feab4d090
    data:
      title: Deszczówka
      message: >
        {% set now = states('sensor.tank_a_level_liquid_level') | float(-1.0) %}
        {% set before = trigger.from_state.state | float(-1.0) if (trigger is defined and trigger.from_state is not none) else -1.0 %}
        {% set kierunek = "wzrósł" if now > before else "spadł" %}
        Poziom deszczówki {{ kierunek }} i wynosi obecnie {{ now | round(1) }}% (poprzednio: {{ before | round(1) }}%)
mode: single
1 Like

OK, coś próbowałem zrobić, ale to chyba nie to. Jak załączyć jako kod?

Dzięki za próbę pomocy i skrypt z AI. Mam złe doświadczenia z AI, żaden skrypt generowany przez AI nie działał, nawet skorygowane przez niego działające automatyzacje zwykle przestawały mi działać. Będę próbował. Ten skrypt nawet nie wysyła komunikatu na komórkę przy ręcznym uruchomieniu.

Dzięki za szczegółowe wyjaśnienia. Poprawiłem. Wprawdzie nie mam jeszcze działającej automatyzację i jeszcze do tego daleko, ale przynajmniej czegoś się innego nauczyłem i zrozumiałem sens wpisywania automatyzacji jako kodu. Pozdrawiam.

Zupełnie nie potrzebnie obawiasz się tworzenia automatyzacji przez AI. To jest świetne narzędzie do diagnozowania przebiegu automatyzacji w HA. Jak już nawet coś sam stworzyłeś, to możesz skorzystać z LLM i on wytłumaczy Ci gdzie popełniasz logiczne błędy. Najważniejsze to dawać dobry kontekst. Poniżej Twój wpis przekopiowałem wraz z kodem twojej automatyzacji do Claude i daje takie wskazówki:


Świetna informacja, która wyjaśnia całą zagadkę: ręczne uruchomienie automatyzacji przez przycisk „Uruchom” w HA domyślnie pomija warunki (automation.trigger ma parametr skip_condition: true ustawiony domyślnie). Dlatego akcja się wykonuje przy ręcznym teście, a przy prawdziwym triggerze (zmiana stanu czujnika) warunek nigdy nie przechodzi i automatyzacja milczy. To nie przypadek – to standardowe zachowanie HA.

Poza tym w Twoim kodzie są dwa dodatkowe problemy:

  1. Lista progów to [5,10,20...] zamiast [2,10,20...] – nie zgadza się z tym czego chcesz (2%, potem co 10).
  2. Warunek liczy now na podstawie aktualnego stanu czujnika w momencie sprawdzania warunku (states(...)), a nie na podstawie trigger.to_state – zwykle to samo, ale bezpieczniej i pewniej odwoływać się bezpośrednio do stanu z triggera.

Napisałem wersję, która obsługuje oba kierunki (wzrost i spadek) w jednej automatyzacji:

alias: Zbiornik na deszczówkę – progi co 10%
description: >
  Powiadomienie przy przekroczeniu progu poziomu wody: 2%, 10%, 20%, ... 100%,
  osobno dla wzrostu i spadku.
triggers:
  - trigger: state
    entity_id: sensor.tank_a_level_liquid_level
conditions:
  - condition: template
    value_template: >
      {% set progi = [2,10,20,30,40,50,60,70,80,90,100] %}
      {% set before = trigger.from_state.state | float(-1) if trigger.from_state else -1 %}
      {% set now = trigger.to_state.state | float(-1) if trigger.to_state else -1 %}
      {% if before == -1 or now == -1 %}
        false
      {% else %}
        {% set bucket_before = progi | select('le', before) | list | max(default=0) %}
        {% set bucket_now = progi | select('le', now) | list | max(default=0) %}
        {{ bucket_now != bucket_before }}
      {% endif %}
actions:
  - variables:
      progi: [2,10,20,30,40,50,60,70,80,90,100]
      before: "{{ trigger.from_state.state | float(0) }}"
      now: "{{ trigger.to_state.state | float(0) }}"
      bucket_before: "{{ progi | select('le', before) | list | max(default=0) }}"
      bucket_now: "{{ progi | select('le', now) | list | max(default=0) }}"
  - choose:
      - conditions:
          - "{{ bucket_now > bucket_before }}"
        sequence:
          - device_id: 78755e714f2073a963df0b6feab4d090
            domain: mobile_app
            type: notify
            title: Deszczówka
            message: "Deszczówka powyżej {{ bucket_now }}%"
      - conditions:
          - "{{ bucket_now < bucket_before }}"
        sequence:
          - device_id: 78755e714f2073a963df0b6feab4d090
            domain: mobile_app
            type: notify
            title: Deszczówka
            message: "Deszczówka poniżej {{ bucket_before }}%"
mode: single

W sumie podobne do tego co umieścił @Marcin4.

Tu podejrzewam, że nie wysyła z powodu niedopasowania np w device_id. Skorzystaj ze świetnej funkcji w automatyzacjach jaką jest zakładka ślady - pozwala na debugowanie przebiegu wykonania “skryptu”. Wyzwalacze możesz samodzielnie uruchamiać przez ustawienie stanu w narzędziach deweloperskich. W nich też możesz wywoływać akcje typu powiadomienie, czyli sprawdzić działanie danego fragmentu kodu, zanim wyląduje w danej automatyzacji. Bez zrozumienia jak to działa będzie ciężko tworzyć samodzielnie automatyzacje w YAML. Nie znam lepszej obecnie metody na naukę w tym zakresie jak właśnie AI.
Dla twojego przypadku, gdzie mierzy się poziomy danych wartości, powstał w HA pomocnik typu sensor progowy. Warto się nim zainteresować jeśli chcesz sam tworzyć prostsze automatyzacje korzystając chociażby z graficznego interfejsu.

Zrobiłem sobie pomocnika typu number, podstawiłem tą encję zamiast encji czujnika sensor.tank_a_level_liquid_level i jak sobie zmieniam wartość (symulujemy zmianę wskazania czujnika) to automatyzacja wysyła powiadomienia w każdym przypadku przekroczenia progu z właściwym kierunkiem (wzrósł / spadł)…

Właśnie miałem sugerować takie posunięcie, bo w tych automatyzacjach jest za dużo warunków wymagających testowania, a mając taki sterowany manekin encji można symulować zachowanie w realnych warunkach i pracę automatyzacji.

Bardzo dziękuję, Koledzy, za pomoc. Nie obawiam się AI, pytam go o różne rzeczy wielokrotnie każdego dnia. To daje mnóstwo oszczędności czasu. Oczywiście czasem wygaduje bzdury, a czasem się zwyczajnie myli, ale to wszystko w granicach statystycznego błędu. Miałem tylko złe doświadczenia w automatyzacjach HA z jego pomocą, ale dzięki Wam pewnie wkrótce to się zmieni. Muszę przetrawić wszystko, co napisaliście i popróbować bez pośpiechu. Dam znać jak wszystko będzie śmigać. Pozdrawiam.