Подсчет оставшегося заряда на батарейках устройств Xiaomi + уведомления. Вариант для анти-продвинутых.

Предлагаю еще один вариант определения оставшегося заряда с устройств, но более продвинуто-мануальный. В этом случае мы получаем :

  • уведомление на рабочем столе в HA
  • уведомление на телефон (telegram)
  • сможем в ручную регулировать требуемый уровень оповещения о заряде
  • понимать для чего это нужно 🙂

И конечно же будет получать только те уведомления, которые будут реальными и нам интересны. 🙂

Выглядеть это будет где-то в вот такой форме (в HA)

Далее уже можно будет приводить все это к любому удобному варианту визуализации. Поехали … 🙂

Задаем значения для шкалы, которое нас будет интересовать. Другими словами это будет минимальное и максимальное значение которые мы будем регулировать уровня заряда для оповещения. Я установил так : мне интересны регулировать значения оставшегося заряда на устройствах от 5% до 30%  с шагом 5% т.е. 5-10-15-20-25-30. Все что выше или ниже этого – мне неинтересно.

input_number.yaml

# input_number battery status:
scale_minimal_battery:
  name: Уровень заряда
  min: 5
  max: 30
  step: 5

далее все это дело нужно привести в удобно-читаемую форму на экране 🙂

groups.yaml

сгруппируем и выведем на экран с названием Шкала заряда для батареек (min,max)

input_number.scale_minimal_battery – можно задавать в других группах где непосредственно у вас идентичная информация по устройствам.

battery_scale:
  name: Шкала заряда для батареек (min,max)
  entities:
  - input_number.scale_minimal_battery

automation.yaml

раз в сутки задаем время, проверки заряда на всех устройствах.

- alias: Alarm battery
  initial_state: true
  trigger:
    - platform: time
      at: '20:30:00'
  condition:
    - condition: template
      value_template: >
          {% macro battery_level() %}
          {%- set threshold = states.input_number.scale_minimal_battery.state | int -%}
          {% set domains = ['light', 'switch', 'sensor', 'binary_sensor', 'zwave', 'lock'] %}
          {% for domain in domains -%}
          {% for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
          {% if (item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) -%}
          {{ item.name }} ({{ item.attributes['battery_level'] }}){%- if not loop.last %}, {% endif -%}{% endif -%}
          {% if "battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown") -%}
          {{ item.name }} ({{ item.state }}){% if not loop.last %}, {%- endif %} {% endif -%}
          {% endfor %}
          {%- endfor %}
          {% endmacro %}
          {{ battery_level() |trim != "" }}
  action:
    - service: persistent_notification.create
      data_template:
        title: "Обнаружена низкая емкость заряда на устройствах:"
        notification_id: low-battery-alert
        message: >
          {{'\u267B\uFE0F'}} {% macro battery_level() %}
          {%- set threshold = states.input_number.scale_minimal_battery.state | int -%}
          {% set domains = ['light', 'switch', 'sensor', 'binary_sensor', 'zwave', 'lock'] %}
          {% for domain in domains -%}
          {% for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
          {% if not "umidit" in item.name | lower and not "press" in item.name | lower -%}
          {% if (item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) -%}
          {{ item.name }} ({{ item.attributes['battery_level'] }}){%- if not loop.last %}, {% endif -%}{% endif -%}
          {% if "battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown") -%}
          {{ item.name }} ({{ item.state }}){% if not loop.last %}, {%- endif %} {% endif -%}
          {% endif -%}
          {% endfor %}
          {%- endfor %}
          {% endmacro %}
          {{ battery_level() }}
    - service: notify.telegram
      data_template:
        title: "Обнаружена низкая емкость заряда на устройствах:"
        message: > 
          {{'\u267B\uFE0F'}} {% macro battery_level() %}
          {%- set threshold = states.input_number.scale_minimal_battery.state | int -%}
          {% set domains = ['light', 'switch', 'sensor', 'binary_sensor', 'zwave', 'lock'] %}
          {% for domain in domains -%}
          {% for item in states[domain] if ((item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) or ("battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown"))) -%}
          {% if not "umidit" in item.name | lower and not "press" in item.name | lower -%}
          {% if (item.attributes.battery_level is defined and item.attributes['battery_level'] | int < threshold) -%}
          {{ item.name }} ({{ item.attributes['battery_level'] }}){%- if not loop.last %}, {% endif -%}{% endif -%}
          {% if "battery" in item.name | lower and ((item.state | int < threshold and item.state|int != 0) or item.state | lower == "low" or item.state | lower == "unknown") -%}
          {{ item.name }} ({{ item.state }}){% if not loop.last %}, {%- endif %} {% endif -%}
          {% endif -%}
          {% endfor %}
          {%- endfor %}
          {% endmacro %}
          {{ battery_level()}}

Оповещения на telegram будут приходить только тогда когда у вас уровень заряда на устройствах будет таким каким вы выставите его ползунком. в нашем случае на скрине она выставлена от 5 до 20.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
1 Комментарий
Популярные
Новые Старые
Межтекстовые Отзывы
Посмотреть все комментарии
VEll
VEll
26.12.2018 16:38

два раза ” – platform: time ” в коде.
Ошибка. Надо один убрать

1
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x