Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save DivanX10/9f7bb76cd08516553b8a92dea278afd6 to your computer and use it in GitHub Desktop.
Save DivanX10/9f7bb76cd08516553b8a92dea278afd6 to your computer and use it in GitHub Desktop.
Список покупок. Home Assistant + Яндекс
Создаем python файлик shopping_list.py
1) Создаем папку python_scripts в config
2) Создаем текстовый файлик с именем shopping_list.txt и переименовываем расширение с txt на py. Должно получиться shopping_list.py
3) Вставляем этот код, который будет считывать данные с файлика .shopping_list.json
#!/usr/local/bin/python
# coding: utf8
import json
with open('/config/.shopping_list.json') as data_file:
shoppingListData = json.load(data_file)
class shoppingList:
content = u""
not_complete = 0
state = u""
myList = shoppingList()
myList.not_complete = 0
myList.state = ""
myList.content = ""
for entry in shoppingListData:
if not entry['complete']:
myList.content += u"- %s\n" % entry['name']
myList.not_complete += 1
if myList.not_complete == 0:
myList.state = u"Список пуст"
else:
myList.state = u"Список полон"
print(json.dumps(myList.__dict__))
#######################################
Создаем сенсор Список покупок - сенсор. sensor_shopping_list.yaml
1) Создаем текстовый файлик с именем sensor_shopping_list.txt и переименовываем расширение с txt на yaml. Должно получиться sensor_shopping_list.yaml
2) Вставляем этот код
sensor:
- platform: command_line
name: "Список покупок - сенсор"
command: python3 /config/python_scripts/shopping_list.py
json_attributes:
- not_complete
- content
value_template: '{{ value_json.state }}'
scan_interval: 1
#######################################
Создаем скрипт "Список покупок: Алиса. Диалог"
Внимание!!! {{ states.input_text.active_station.state }} - это переменная, последняя активная колонка. Читаем здесь https://gist.github.com/AlexxIT/6a3a1a5ba4c4ebe1fabbec639542d446
alias: 'Список покупок: Алиса. Диалог'
sequence:
- service: media_player.play_media
target:
entity_id: '{{ states.input_text.active_station.state }}' # переменная, последняя активная колонка
data:
media_content_id: >-
{{ ['Список покупок обновлен, что будем делать?','Шеф. Отправить список
к вам на телефон?','Хозяин. Отправить список покупок на
телефон?']|random }}
media_content_type: dialog
mode: single
icon: mdi:cart-variant
#######################################
Перед тем как скопируете код для автоматизации, сперва нужно создать вспомогательный элемент преключатель "список покупок" - input_boolean.shopping_list
Внимание в коде указываются эти объекты и эти объекты нужно заменить на свои яндекс станции, сколько яндекс станции, столько и указывайте
media_player.yandex_station_000000000000000000000000,
media_player.yandex_station_111111111111111111111111,
media_player.yandex_station_222222222222222222222222
alias: 'Список покупок: Алиса. Диалог.'
description: >-
Когда просим Алиса обновить список покупок, то срабоатет автоматизацию и
запустится скрипт обновления списка
trigger:
- platform: event
event_type: yandex_intent
event_data: {}
- platform: state
entity_id: >-
media_player.yandex_station_000000000000000000000000,
media_player.yandex_station_111111111111111111111111,
media_player.yandex_station_222222222222222222222222
to: IDLE
id: yandex station idle
attribute: alice_state
from: LISTENING
condition: []
action:
- choose:
- conditions:
- condition: template
value_template: >-
{{ trigger.event.data.text in ["список продуктов", "что там в
списке","что там в корзине"] }}
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.shopping_list
- service: script.update_shopping_list_yandex
- conditions:
- condition: state
entity_id: sensor.spisok_pokupok_sensor
state: Список полон
- condition: state
entity_id: input_boolean.shopping_list
state: 'on'
- condition: template
value_template: '{{ trigger.event.data.text in ["хватит", "отбой"] }}'
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.shopping_list
- delay:
hours: 0
minutes: 0
seconds: 3
milliseconds: 0
- service: script.shopping_list_yandex_dialog
- conditions:
- condition: template
value_template: >-
{{ trigger.event.data.text in ["обнови список", "обнови список
продуктов"] }}
sequence:
- service: script.update_shopping_list_yandex
- conditions:
- condition: trigger
id: yandex station idle
- condition: state
entity_id: input_boolean.shopping_list
state: 'on'
- condition: state
entity_id: sensor.spisok_pokupok_sensor
state: Список пуст
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.shopping_list
- conditions:
- condition: trigger
id: yandex station idle
- condition: state
entity_id: sensor.spisok_pokupok_sensor
state: Список полон
- condition: state
entity_id: input_boolean.shopping_list
state: 'on'
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.shopping_list
- delay:
hours: 0
minutes: 0
seconds: 3
milliseconds: 0
- service: script.shopping_list_yandex_dialog
default: []
mode: single
#######################################
Автоматизация для отправки списка в телеграмм
alias: 'Список покупок: Алиса. Диалог. Отправить список в телеграмм'
description: >-
Когда просим Алиса обновить список покупок, то срабоатет автоматизацию и
запустится скрипт обновления списка
trigger:
- platform: event
event_type: yandex_intent
event_data: {}
condition: []
action:
- choose:
- conditions:
- condition: or
conditions:
- condition: template
value_template: >-
{{ trigger.event.data.text in ["отправь на телефон", "отправь
в телеграм","да"] }}
sequence:
- service: tts.yandex_station_say
data:
entity_id: '{{ states.input_text.active_station.state }}'
message: >-
{{ ['Готово. Отправила к вам на телефон список продуктов ', 'Как
скажешь хозяин. Список продуктов отправлен в телеграм', 'Есть
сэр. Список продуктов отправлен в телеграм', 'Не вопрос.
Отправила к вам на телефон список продуктов']|random }}
- delay:
hours: 0
minutes: 0
seconds: 3
milliseconds: 0
- service: notify.notify
data:
message: '{{ states.sensor.spisok_pokupok_sensor.attributes.content }}'
title: '*Список покупок:*'
mode: single
@DivanX10
Copy link
Author

Почему у меня не получилось создать сенсор в другом месте, а только в файле configuration.yaml.
Так же и ключевые слова в yandex_station_intents.
Папка /packages прописана в основном файле.
Буду пробовать разбираться.

Вероятно у вас не настроен packages. Рекомендую почитать документацию про packages, а еще можете почитать статью от AlexxIT по настройке удобной конфигурации или почитайте эту статью про Home Assistant Пакеты или Packages

У меня в configuration.yaml прописано так

homeassistant:
  packages: !include_dir_named includes/packages # Размещаем любые конфигурации в папке packages
  customize: !include_dir_merge_named includes/customize # Свои настройки

Далее я создал папку includes внутри сетевой папки config и подпапку packages, куда я складываю другие файлы с различными конфигурациями


Есть более важный вопрос, не знаю куда и копать.
Почему при просьбе "Обнови список покупок" Алиса или обновляет его или очищает его, чаще очищает.
Как это можно исправить кроме как не говорить ей это?

  1. Есть навык "Список покупок", а есть интеграция "Список покупок" и оба работают через Алису, но это совершенно разные платформы. Если запускаете навык "Список покупок", то не будет работать "Список покупок" через Home Assistant

  2. Сенсор "Список покупок" обновляется раз в минуту - строка scan_interval: 60. Можете сократить период обновления сенсора до 10 секунд и указать scan_interval: 10, тогда ускорите время работы сенсора или ждите минуту. Сперва должен отработать сам сенсор, чтобы в сенсоре "Список покупок" были товары, только после этого можно делать обновление через Алису и все будет работать исправно

image

  1. Если почитать документацию интеграции Яндекс.Станция для Home Assistant Список покупок, то увидите следующее

После синхронизации вы можете удалять элементы голосом на колонке. Такие элементы будут удалены из ХА при следующей синхронизации, даже если на них не стоит галка.

Или вы можете отмечать элементы как завершенные в интерфейсе ХА. Такие элементы будут удалены из Яндекса при следующей синхронизации. Только не очищайте вручную список завершенных элементов в ХА до синхронизации! Иначе синхронизация нарушится.

Синхронизация происходит по следующим правилам:

Завершенные (отмеченные) элементы списка ХА - удаляются из Яндекса (если они там были)
Новые элементы, созданные именно из ХА - добавляются в Яндекс (если их там не было)
Список ХА полностью заменяется тем, что получилось в Яндексе после 1 и 2
Список завершенных элементов ХА очищается
Нужно учитывать, что некоторые названия Яндекс не может добавить в свой список. Поэтому они могут бесследно пропасть.


Вы не пробовали синхронизировать список покупок в Google Keep?
Я читал про это, там есть некоторые трудности с Google.
Но пока я не пойму почему конфиги не работают с других мест, у меня не получится с google.

Я не пользуюсь списком покупок или пользуюсь очень редко, в основном для проверки, когда меня спрашивают про "Список покупок". Мне эта интеграция стала не нужной. Я заказываю продукты онлайн. Когда надо что-то купить, я добавляю в корзину и как соберу что нужно, оформляю заказ.

Для того, чтобы понять как это должно работать, требуется время, терпение и желание во всем разобраться, только так вы сможете решить свою задачу.

@krash22reg
Copy link

Как я понял, после обновлений, этот метод не рабочий? Будет обновлена информация? Хочется настроить синхронизацию списка покупок.

@DivanX10
Copy link
Author

Как я понял, после обновлений, этот метод не рабочий? Будет обновлена информация? Хочется настроить синхронизацию списка покупок.

Прежде чем вам дать ответ, я проверил как у меня работает список покупок. Работает исправно. Я сообщил Алисе перечень продуктов, далее попросил отправить список продуктов мне на телефон и в телеграм я получил список продуктов

image
image

Возможно вы не обновили сенсор по новому как указано в документации Home Assistant.

Документация https://www.home-assistant.io/integrations/command_line/
Документация https://www.home-assistant.io/integrations/template/

Вот так выглядит новый образец кода shopping_list_sensor.yaml

command_line:
#Список покупок - сенсор
#Объект: sensor.shopping_list_sensor
  - sensor:
      name: 'Список покупок - сенсор'
      unique_id: shopping_list_sensor
      command: 'python3 /config/python_scripts/send_shoppinglist.py'
      json_attributes:
        - not_complete
        - content
      value_template: '{{ value_json.state }}'
      scan_interval: 60


#Список покупок. Кол-во не завершенных
#Объект: sensor.shopping_list_not_complete
template:
  - sensor:
      name: 'Список покупок. Кол-во не завершенных'
      unique_id: shopping_list_not_complete
      state: '{{ state_attr("sensor.shopping_list_sensor","not_complete") }}'
      icon: mdi:cart-variant

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment