-
-
Save DivanX10/9f7bb76cd08516553b8a92dea278afd6 to your computer and use it in GitHub Desktop.
Создаем 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 |
Добрый день! Не пойму, почему на этапе создания сенсора "Список покупок - сенсор. sensor_shopping_list.yaml" ошибка 'value_json' is undefined
Создали файл shopping_list.py? Положили файл shopping_list.py в папку python_scripts? Об этом пишется в самом начале
Да конечно.
Не смог побороть эту ошибку пока рискнул удалить стоку value_template: '{{ value_json.state }}'
Сенсор не создался или его не видно.
На этапе создания служебного плеера тоже остановился.
Всё делаю по инструкции, но через колонку не могу достучатся до HA.
Если в ручную запускать скрипт обновления списка, то он обновляется
И ещё вопрос, для чего "вспомогательный элемент переключатель "список покупок""?
Может быть в последних версия HA, что то изменилось...
Да конечно. Не смог побороть эту ошибку пока рискнул удалить стоку value_template: '{{ value_json.state }}' Сенсор не создался или его не видно.
На этапе создания служебного плеера тоже остановился. Всё делаю по инструкции, но через колонку не могу достучатся до HA. Если в ручную запускать скрипт обновления списка, то он обновляется
И ещё вопрос, для чего "вспомогательный элемент переключатель "список покупок""? Может быть в последних версия HA, что то изменилось...
Я уже не вспомню зачем я использовал вспомогательный элемент. Сейчас у меня все по другому. Вам стоит самому разобраться и понять как это работает. Постараюсь объяснить вкратце и будет лучше, если сделаете по своему. Список покупок у меня работает исправно. Вам нужно разобраться сперва как достучаться через Алису до ХА. Я не знаю что и как у вас настроено, часто пользователи не следуют документации и допускают ошибки, а может проблема в другом. Ошибки могут быть разного характера. Почитайте еще раз документацию интеграции YandexStation, также изучите интеграцию Получение команд от Яндекс.Станции в Home Assistant, Обе интеграции у меня используются для работы списка покупок
Файл .shopping_list.json
создает интеграция Список покупок. Этот файл скрытый и чтобы его увидеть, нужно в Windows включить отобразить скрытые файлы. Если файл .shopping_list.json
не появляется, значит плохо, значит интеграция не работает должным образом. Попробуйте сами создать этот файл .shopping_list.json
и сделать его скрытым
Когда добавляете в список что-то, то в файле .shopping_list.json
будут записи. Для примера я добавил в список три товара: молоко, сметана и сахар (см. скриншот). Добавьте что-то в список покупок, откройте файл .shopping_list.json
,и вы должны увидеть свой список.
Python файл send_shoppinglist.py
нужен для извлечения данных из скрытого файла .shopping_list.json. Без него мы не сможем увидеть в сенсоре список. Файл send_shoppinglist.py
нужно разместить по пути /config/python_scripts/send_shoppinglist.py
. Почитайте про Python Scripts здесь
Для запуска send_shoppinglist.py мы используем встроенную интеграцию в Home Assistant Command Line которая запускает файл send_shoppinglist.py и тот в свою очередь обращается к файлу .shopping_list.json и вытягивает их через value_template: '{{ value_json.state }}'
, тем самым в сенсоре мы видим список. Удалите {{ value_json.state }}
- не увидите список. Про Command Line почитайте здесь
Сенсоры
Сенсоры для списка покупок. Сенсор полностью рабочий и не нужно ничего удалять или править
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
Сенсоры яндекс станции
#Для работы последней активной колонки необходимо создать группу и в нее добавить свои колонки
#В сенсорах используется группа group.yandex_stations, куда входят все колонки
groups:
yandex_stations:
name: "Яндекс станции"
all: false
entities:
- media_player.yandex_station_1 # Яндекс станция мини в гостиной
- media_player.yandex_station_2 # Яндекс станция мини на кухне
- media_player.yandex_station_3 # Яндекс станция мини в спальне
sensor:
#Сенсор. Яндекс станция слушает или находится в ожидании
- platform: template
sensors:
yandex_station_waiting:
friendly_name: "Яндекс станция в ожидании"
value_template: >-
{% if expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='entity_id') | list %}
LISTENING
{% else %}
IDLE
{% endif %}
icon_template: >-
{% if is_state('sensor.yandex_station_waiting', 'IDLE') %}
mdi:account-tie-voice-off
{% else %}
mdi:account-tie-voice
{% endif %}
#Сенсор последней активной яндекс колонки. Отображает имя колонки
- platform: template
sensors:
yandex_station_last_activity_name:
friendly_name: "Последняя активная яндекс станция. Имя"
value_template: >-
{% if expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='name') | list | join(",") %}
{{ expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='name') | list | join(",") }}
{% else %}
off
{% endif %}
icon_template: >-
{% if is_state('sensor.yandex_station_last_activity_entity_id', 'off') %}
mdi:account-tie-voice-off
{% else %}
mdi:account-tie-voice
{% endif %}
#Сенсор отображает последнюю активную колонку по голосу
- platform: template
sensors:
yandex_station_last_activity_entity_id:
friendly_name: "Последняя активная яндекс станция. Слушает"
value_template: >-
{% if expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='entity_id') | list | join(",") %}
{{ expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'LISTENING') | map(attribute='entity_id') | list | join(",") }}
{% else %}
off
{% endif %}
icon_template: >-
{% if is_state('sensor.yandex_station_last_activity_entity_id', 'off') %}
mdi:account-tie-voice-off
{% else %}
mdi:account-tie-voice
{% endif %}
#Сенсор отображает какая колонка говорит
- platform: template
sensors:
yandex_station_speaking_entity_id:
friendly_name: "Последняя активная яндекс станция. Говорит"
value_template: >-
{% if expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'SPEAKING') | map(attribute='entity_id') | list | join(",") %}
{{ expand('group.yandex_stations') | selectattr('attributes.alice_state', 'eq', 'SPEAKING') | map(attribute='entity_id') | list | join(",") }}
{% else %}
off
{% endif %}
icon_template: >-
{% if is_state('sensor.yandex_station_last_activity_entity_id', 'off') %}
mdi:account-tie-voice-off
{% else %}
mdi:account-tie-voice
{% endif %}
Автоматизация
alias: "Список покупок: Диалог. Яндекс станция. Отправить список в телеграм"
description: По просьбе Алисы список покупок будет отправлен в телеграм
trigger:
- platform: event
event_type: yandex_intent
event_data:
text: отправь список продуктов на телефон
alias: "Событие: Яндекс"
- platform: state
entity_id:
- sensor.shopping_list_sensor
from: Список пуст
to: Список полон
id: Список покупок - сенсор
alias: Список покупок - сенсор
- platform: state
entity_id:
- sensor.shopping_list_not_complete
alias: Список покупок. Кол-во не завершенных
id: Список покупок. Кол-во не завершенных
condition: []
action:
- choose:
- conditions:
- condition: template
value_template: >-
{{ trigger.event.data.text in ["отправь список продуктов на
телефон"] }}
alias: Если сработал триггер на отправь список продуктов на телефон
sequence:
- service: script.shopping_list_update
data: {}
- conditions:
- condition: trigger
id: Список покупок. Кол-во не завершенных
alias: Список покупок. Кол-во не завершенных
sequence:
- service: script.shopping_list_telegram
data: {}
default: []
mode: single
Скрипт
Скрипт: script.shopping_list_update
alias: Список покупок. Обновить
sequence:
- service: media_player.play_media
data:
media_content_id: update
media_content_type: shopping_list
target:
entity_id: "{{ states('input_text.yandex_station_last_activity') }}"
mode: single
icon: mdi:cart-arrow-down
Скрипт: script.shopping_list_telegram
alias: Список покупок. Телеграм
sequence:
- service: telegram_bot.send_message
data:
message: "{{ states.sensor.spisok_pokupok_sensor.attributes.content }}"
target: "{{ trigger.event.data.chat_id }}"
title: "*Список покупок:*"
mode: single
icon: mdi:cart-arrow-down
Спасибо.
У меня получилось запустить.
Есть некоторые вопросы:
Почему у меня не получилось создать сенсор в другом месте, а только в файле configuration.yaml.
Так же и ключевые слова в yandex_station_intents.
Папка /packages прописана в основном файле.
Буду пробовать разбираться.
Есть более важный вопрос, не знаю куда и копать.
Почему при просьбе "Обнови список покупок" Алиса или обновляет его или очищает его, чаще очищает.
Как это можно исправить кроме как не говорить ей это?
С последней активной колонкой тоже не получилось на сейчас.
Пытался создать группу, но ругается при проверки конфигурации на группу.
Вы не пробовали синхронизировать список покупок в Google Keep?
Я читал про это, там есть некоторые трудности с Google.
Но пока я не пойму почему конфиги не работают с других мест, у меня не получится с google.
Почему у меня не получилось создать сенсор в другом месте, а только в файле 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, куда я складываю другие файлы с различными конфигурациями
Есть более важный вопрос, не знаю куда и копать.
Почему при просьбе "Обнови список покупок" Алиса или обновляет его или очищает его, чаще очищает.
Как это можно исправить кроме как не говорить ей это?
-
Есть навык "Список покупок", а есть интеграция "Список покупок" и оба работают через Алису, но это совершенно разные платформы. Если запускаете навык "Список покупок", то не будет работать "Список покупок" через Home Assistant
-
Сенсор "Список покупок" обновляется раз в минуту - строка
scan_interval: 60
. Можете сократить период обновления сенсора до 10 секунд и указатьscan_interval: 10
, тогда ускорите время работы сенсора или ждите минуту. Сперва должен отработать сам сенсор, чтобы в сенсоре "Список покупок" были товары, только после этого можно делать обновление через Алису и все будет работать исправно
- Если почитать документацию интеграции Яндекс.Станция для Home Assistant Список покупок, то увидите следующее
После синхронизации вы можете удалять элементы голосом на колонке. Такие элементы будут удалены из ХА при следующей синхронизации, даже если на них не стоит галка.
Или вы можете отмечать элементы как завершенные в интерфейсе ХА. Такие элементы будут удалены из Яндекса при следующей синхронизации. Только не очищайте вручную список завершенных элементов в ХА до синхронизации! Иначе синхронизация нарушится.
Синхронизация происходит по следующим правилам:
Завершенные (отмеченные) элементы списка ХА - удаляются из Яндекса (если они там были)
Новые элементы, созданные именно из ХА - добавляются в Яндекс (если их там не было)
Список ХА полностью заменяется тем, что получилось в Яндексе после 1 и 2
Список завершенных элементов ХА очищается
Нужно учитывать, что некоторые названия Яндекс не может добавить в свой список. Поэтому они могут бесследно пропасть.
Вы не пробовали синхронизировать список покупок в Google Keep?
Я читал про это, там есть некоторые трудности с Google.
Но пока я не пойму почему конфиги не работают с других мест, у меня не получится с google.
Я не пользуюсь списком покупок или пользуюсь очень редко, в основном для проверки, когда меня спрашивают про "Список покупок". Мне эта интеграция стала не нужной. Я заказываю продукты онлайн. Когда надо что-то купить, я добавляю в корзину и как соберу что нужно, оформляю заказ.
Для того, чтобы понять как это должно работать, требуется время, терпение и желание во всем разобраться, только так вы сможете решить свою задачу.
Как я понял, после обновлений, этот метод не рабочий? Будет обновлена информация? Хочется настроить синхронизацию списка покупок.
Как я понял, после обновлений, этот метод не рабочий? Будет обновлена информация? Хочется настроить синхронизацию списка покупок.
Прежде чем вам дать ответ, я проверил как у меня работает список покупок. Работает исправно. Я сообщил Алисе перечень продуктов, далее попросил отправить список продуктов мне на телефон и в телеграм я получил список продуктов
Возможно вы не обновили сенсор по новому как указано в документации 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
Добрый день!
Не пойму, почему на этапе создания сенсора "Список покупок - сенсор. sensor_shopping_list.yaml" ошибка
'value_json' is undefined