Добрый день. Статья о том, как получать оповещения о списке покупок в телеграм с интеграцией Shopping List. Отправлять уведомление, конечно же, можно в любой удобный для вас мессенджер (telegram, slack и т.д.) или уведомлением в приложение Home assistant на телефон, сути это не меняет.
Установка интеграции
Заходим в настройки Home assistant.
Выбираем пункт интеграции, добавить интеграцию.
В поиске вписываем Shopping List (или Список покупок).
Добавляем интеграцию, настраивать ее не нужно.
Для удобства заполнения списка покупок, предлагаю добавить карточку в lovelace.
Находим карточку, находится она в самом конце списка. Даем название для карточки и сохраняем.
Примечание: Создать несколько разных списков невозможно,
интеграция создает один единый список, который могут редактировать все пользователи HA. Дополнительные карточки только дублируют основной список.
Добавляем в список все, что нужно купить во время следующей вылазки в магазин.
Элементы в списке можно менять местами, а также отмечать. Отмеченные элементы можно удалять из списка.
Сенсор покупок
Тот, кто использует интеграцию, пожалуй замечал, что в системе нет никакого объекта, связанного с этим списком. Это нам придется исправлять. Для этого нам нужно создать сенсор, состояние которого будет соответствовать пунктам нашего списка. Добавляем новый сенсор в configuration.yaml или во внешний файл sensor.yaml (зависит от вашей конфигурации).
- platform: command_line name: shopping_list command: "jq '.[] | select(.complete==false) |.name'.shopping_list.json "
Сохраняем, проверяем конфигурацию на ошибки и перезагружаем сервер Home assistant.
Заходим в панель разработчика, ищем наш созданный сенсор.
Проверяем состояние объекта, он должен совпадать с ранее заполненным нами списком.
Обновления сенсора происходит раз в минуту.
Автоматизация
Список готов для добавления в автоматизации. Остается определить, в каком случае мы будем его получать. Я выбрал для этого стандартный функционал отслеживания нахождения пользователей в определенной зоне. Для этого заходим в Настройки -> Зоны, добавляем новую зону, соответствующую магазину или супермаркету, который чаще всего используется для закупок.
Выбираем точку на карте, задаем радиус зоны и назначаем название. Для базовой автоматизации этого будет достаточно. Триггером буду использовать именно момент, когда я буду заходить в созданную зону, уведомление буду отправлять с помощью бота в телеграм.
- alias: buy_list_new trigger: - platform: zone zone: zone.supermarket entity_id: person.admin event: enter action: - service: telegram_bot.send_message data: target: 'xxxxxxxxx' parse_mode: html message: > {}
Все отлично, все работает! Как дополнение надо добавить условие, которое будет проверять, есть ли что-то в нашем списке, чтобы не получать пустых сообщений при каждом посещении магазина. Для этого можно использовать определение количества элементов в списке. Чтобы это было возможно, добавляем еще один сенсор:
- platform: command_line name: shopping_list_number command: "jq length.shopping_list.json"
Проверяем, есть ли в списке как минимум 1 пункт:
condition: - condition: template value_template: "{}"
Автоматизация полностью:
- alias: buy_list_new trigger: - platform: zone zone: zone.supermarket entity_id: person.admin event: enter condition: - condition: template value_template: "{}" action: - service: telegram_bot.send_message data: target: 'xxxxxxxxx' parse_mode: html message: > {}
Так же, как условие, можем использовать длину символов в нашем списке:
condition: - condition: template value_template: "{{ states('sensor.shopping_list') | length >= 3 }}"
Дальнейшее улучшение автоматизации уже зависит от потребностей и фантазии.
jr -r
чтобы не было " вокруг элементов списка
- platform: command_line
name: shopping_list
command: "jq -r '.[] | select(.complete==false) | .name' .shopping_list.json"
Можно еще добавить уведомление, о том что список покупок поменялся
automation:
- id: '1618760804002'
alias: 'Update shopping_list sensor and notify'
mode: single
trigger:
platform: event
event_type: shopping_list_updated
action:
- service: homeassistant.update_entity
entity_id: sensor.shopping_list
- delay: 00:00:01
- service: telegram_bot.send_message
data:
target: 'xxxxxxxxx'
parse_mode: html
message: >
Список покупок обновлён, осталось купить:{{"\n"-}}{{states('sensor.shopping_list')}}
А можно чтобы открыл список покупок в приложении Home assistant
alias: Open shopping list
description: '' "
trigger:
- platform: zone
entity_id: person.admin
zone: zone.supermarket
event: enter
condition:
- condition: template
value_template: '{{ states(''sensor.shopping_list'') | length >= 3 }}'
action:
- service: notify.notify
data:
message: Нажмите чтобы открыть список покупок
data:
clickAction: /shopping-list
url: /shopping-list
mode: single
я правильно понимаю, что сценарий использования такой?
- кто-то добавил вручную в список покупок продукты
- я проходил мимо магазина, сработала автоматизация, мне пришло сообщение со списком
то есть если я пошел другой дорогой или зона магазина находится в стороне от обычного маршрута, то морепродуктов на ужин не будет? обложить все подходы к дому триггерами? тогда каждый из них сработает, пока я дойду до магазина. сделать одну большую зону вокруг дома - не будет оповещений, пока не выйду из нее.
ну и главный вопрос:
уведомление приходит в любом случае на телефон. список покупок вносится вручную так же через телефон. почему нельзя на этих нескольких телефонах просто использовать то самое приложение со списком покупок?
Сценарий использования подбирает каждый по его нуждам. Просто поделился идеей как это можно реализовать.
У меня статическая жизнь, всегда одни и те же маршруты и магазины :-( Опять же можете предложить свой вариант триггера.
Верно уведомление приходят на телефон,
список вносится вручную но не только через телефон, приложение одно и тоже Home Assistant
можно завести несколько списков на разные геолокации:
- продукты (я обычно заезжаю в один и тот же супермаркет)
- хоз рынок
- ветеринарка
и тд и тп
Вопрос от человека далекого от программирования. Вот эти строки -
{{"\n"-}}{{states('sensor.shopping_list')}}
это какой язык? какой синтаксис и команды? как научится?
jinja2 https://ru.wikipedia.org/wiki/Jinja">https://ru.wikipedia.org/wiki/...
поэкспериментировать можно у вас в homeassistant по пути /developer-tools/template
Спасибо
А есть ли возможность через телеграмм ввести новую покупку?
Да
- alias: shop_list_add
trigger:
platform: event
event_type: telegram_text
action
service: shopping_list.add_item
data:
name: '{{ trigger.event.data.text }}'
Попробовал в
data:
title: "Список покупок:"
добавить, перестает работать проверка condition: