Статья

Home Assistant список покупок, уведомление с Shopping List в телеграм

Добрый день. Статья о том, как получать оповещения о списке покупок в телеграм с интеграцией 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:

Отличная статья. Подскажите, а реально сделать из списка покупок - список лекарств в аптечке с уведомлениями в телеграм о том что заканчивается срок годности. Нашел вариант через Node-RED и всё настроил и работает отлично, НО дату в список нужно вносить в формате mm.dd.yy что не очень привычно. Поменять на dd.mm.yy у меня не получилось. Может кто подскажет как реализовать? Мне кажется полезная фунция

Вернуться назад
Вернуться назад