lufton / ha-blueprints

1 stars 0 forks source link

AWTRIX Ukraine Alarm #1

Open DmitriyKompaniets opened 6 months ago

DmitriyKompaniets commented 6 months ago

You can check? If the alarm lasts more than 2:48, the clock counter stops....

DmitriyKompaniets commented 6 months ago

Регистратор: homeassistant.helpers.script Источник: helpers/script.py:926 Первое сообщение: 9 мая 2024 г. в 23:53:54 (2 сообщений) Последнее сообщение: 04:02:43

While condition [{'alias': 'At least one of alert sensors is active', 'condition': 'template', 'value_template': Template<template=({% set ns = namespace(alert=false) %} {% for alert_sensor in alert_sensors %} {% set ns.alert = ns.alert or is_state(alert_sensor, 'on') %} {% endfor %} {{ ns.alert }}) renders=30354>}] in script AWTRIX Ukraine Alarm looped 5000 times While condition [{'alias': 'At least one of alert sensors is active', 'condition': 'template', 'value_template': Template<template=({% set ns = namespace(alert=false) %} {% for alert_sensor in alert_sensors %} {% set ns.alert = ns.alert or is_state(alert_sensor, 'on') %} {% endfor %} {{ ns.alert }}) renders=47204>}] in script AWTRIX Ukraine Alarm looped 5000 times

DmitriyKompaniets commented 6 months ago

Регистратор: homeassistant.helpers.script Источник: helpers/script.py:934 Первое сообщение: 05:26:59 (1 сообщений) Последнее сообщение: 05:26:59

While condition [{'alias': 'At least one of alert sensors is active', 'condition': 'template', 'value_template': Template<template=({% set ns = namespace(alert=false) %} {% for alert_sensor in alert_sensors %} {% set ns.alert = ns.alert or is_state(alert_sensor, 'on') %} {% endfor %} {{ ns.alert }}) renders=57204>}] in script AWTRIX Ukraine Alarm terminated because it looped 10000 times

lufton commented 6 months ago

I think I understand why. HA recently implemented breaking change witch limits number of loops up to 10000. So that is basically 2(hours) 60(minutes) 60(seconds) + 46(minutes) * 60(seconds) + 40(seconds) = 2:46:40 = 10000.

DmitriyKompaniets commented 6 months ago

Can we expect a solution to this problem?

lufton commented 6 months ago

Honestly, I wasn't able to find easy-fix solution. It's complicated as with blueprint you are limited with only 1 automation, so everything should be isolated and incapsulated in one place witch makes it difficult to read and debug it. I'll see if I'll find some workaround.

stast1 commented 1 month ago

Пропоную після години роботи робити затримку не 1 секунду, а 60. Щось типу такого:

- alias: Repeat updating app untill alert is gone
    repeat:
      sequence:
        - variables:
            latest_change: >-
              {% set ns = namespace(latest_change=timedelta(days=365)) %} {% for
              alert_sensor in alert_sensors | select('is_state', 'on') | list
              -%}
                {% set current_change = now() - states[alert_sensor].last_changed %}
                {% if current_change < ns.latest_change %}
                  {% set ns.latest_change = current_change %}
                {% endif %}
              {% endfor -%} {{ ns.latest_change.seconds }}
        - data:
            retain: false
            topic: "{{ app_topic }}"
            payload: |-
              {
                "icon": "{{ alert_icon }}",
                "text":
                  {% if latest_change < 3600 %}
                    "{{ latest_change | timestamp_custom('%M:%S', False) }}"
                  {% else %}
                    "{{ latest_change | timestamp_custom('%H:%M', False) }}"
                  {% endif %},
                "color": "{{ alert_color }}",
                "wakeup": true
              }
          alias: Update alarm app (alert)
          action: mqtt.publish
        - alias: Delay before updating alarm app (alert)
          delay:
            seconds: |-
              {% if latest_change < 3600 %}
                {{ 1 }}
              {% else %}
                {{ 60 }}
              {% endif %}
lufton commented 1 month ago

Треба перевірити чи буде працювати.

DarkAssassinUA commented 1 month ago

Треба перевірити чи буде працювати.

Есть идеи как сэмулировать сенсор для проверки?

DarkAssassinUA commented 1 month ago

Пропоную після години роботи робити затримку не 1 секунду, а 60. Щось типу такого:

- alias: Repeat updating app untill alert is gone
    repeat:
      sequence:
        - variables:
            latest_change: >-
              {% set ns = namespace(latest_change=timedelta(days=365)) %} {% for
              alert_sensor in alert_sensors | select('is_state', 'on') | list
              -%}
                {% set current_change = now() - states[alert_sensor].last_changed %}
                {% if current_change < ns.latest_change %}
                  {% set ns.latest_change = current_change %}
                {% endif %}
              {% endfor -%} {{ ns.latest_change.seconds }}
        - data:
            retain: false
            topic: "{{ app_topic }}"
            payload: |-
              {
                "icon": "{{ alert_icon }}",
                "text":
                  {% if latest_change < 3600 %}
                    "{{ latest_change | timestamp_custom('%M:%S', False) }}"
                  {% else %}
                    "{{ latest_change | timestamp_custom('%H:%M', False) }}"
                  {% endif %},
                "color": "{{ alert_color }}",
                "wakeup": true
              }
          alias: Update alarm app (alert)
          action: mqtt.publish
        - alias: Delay before updating alarm app (alert)
          delay:
            seconds: |-
              {% if latest_change < 3600 %}
                {{ 1 }}
              {% else %}
                {{ 60 }}
              {% endif %}

Чуток поправил код т.к в первоначальном виде выдавало ошибку.

  - alias: Repeat updating app untill alert is gone
   repeat:
     sequence:
       - service: mqtt.publish
         data:
           retain: false
           topic: "{{ app_topic }}"
           payload: |-
             {
               "icon": "{{ alert_icon }}",
               "text":
                 {% set ns = namespace(latest_change=timedelta(days=365)) %}
                 {% for alert_sensor in alert_sensors | select('is_state', 'on') | list -%}
                   {% set current_change = now() - states[alert_sensor].last_changed %}
                   {% if current_change < ns.latest_change %}
                     {% set ns.latest_change = current_change %}
                   {% endif %}
                 {% endfor -%}
                 {% if ns.latest_change.seconds < 3600 %}"{{ ns.latest_change.seconds | timestamp_custom('%M:%S', False) }}"
                 {% else %}"{{ ns.latest_change.seconds | timestamp_custom('%H:%M', False) }}"
                 {% endif %},
               "color": "{{ alert_color }}",
               "wakeup": true
             }
         alias: Update alarm app (alert)
       - delay:
           seconds: >-
             {% if latest_change < 3600 %}
               {{ 1 }}
             {% else %}
               {{ 60 }}
             {% endif %}
stast1 commented 1 month ago

Треба перевірити чи буде працювати.

Ну в мене працює. Єдине, що після відбою буде чекати хвилину. Но це, я важаю, не критично.

stast1 commented 1 month ago

Есть идеи как сэмулировать сенсор для проверки?

Зробити Input boolean і перемикати вручну

stast1 commented 1 month ago

Чуток поправил код т.к в первоначальном виде выдавало ошибку.

В мене зараз зроблено як автоматизація. Може у блюпрінті не розуміє variables. Хоча я не розумію, звідки у вашому коді взялась змінна latest_change?

DarkAssassinUA commented 1 month ago

Чуток поправил код т.к в первоначальном виде выдавало ошибку.

В мене зараз зроблено як автоматизація. Може у блюпрінті не розуміє variables. Хоча я не розумію, звідки у вашому коді взялась змінна latest_change?

Согласен,херню написал и запостил не проверив.Правил через ChatGPT т.к. ваш первоначальный код отказывался блюпринт принимать,правленый принял но не обновляется счетчик минут.Буду дальше смотреть.

upd Перевел в автоматизацию, ваш код работает.Жду пока тревога превысит 2:47 и отпишусь по результату upd2 Тревога уже 4:47 - зависло на 1:36

upd 29.10.2024 Тревога 4 часа и 8 минут - все ок, отображает нормально, думаю что можно в продакшн.Правда у меня как и у stast1 это автоматизация а не блюпринт.

upd тревога 3:25 - все ок

DarkAssassinUA commented 1 month ago

В общем спустя несколько дней тестирования отписываюсь что все ок.Сейчас тревога 5:39 - все работает.Но у меня не блюпринтом а автоматизацией.