Created
August 30, 2020 19:51
-
-
Save AlexxIT/dc42882c44e298d41631720f146e701d to your computer and use it in GitHub Desktop.
Команды через Telegram на разные станции
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| automation: | |
| - trigger: | |
| platform: event | |
| event_type: yandex_station_response | |
| action: | |
| service: telegram_bot.send_message | |
| data_template: | |
| target: "{{ trigger.event.data.request_id }}" | |
| message: "{{ trigger.event.data.text }}" | |
| - trigger: | |
| platform: event | |
| event_type: telegram_command | |
| event_data: | |
| command: '/Мини' | |
| action: | |
| service: media_player.play_media | |
| entity_id: media_player.yandex_station_mini | |
| data_template: | |
| media_content_id: "{{ trigger.event.data['args']|join(' ') }}" | |
| media_content_type: "question:{{ trigger.event.data.chat_id }}" | |
| - trigger: | |
| platform: event | |
| event_type: telegram_command | |
| event_data: | |
| command: '/Станция' | |
| action: | |
| service: media_player.play_media | |
| entity_id: media_player.yandex_station | |
| data_template: | |
| media_content_id: "{{ trigger.event.data['args']|join(' ') }}" | |
| media_content_type: "question:{{ trigger.event.data.chat_id }}" |
Переделка взаимодействия с колонками с media_player.play_media на conversation.process: в Телеграмм вы получите ответ на ваш конкретный запрос, а не просто сообщение в чат.
Перед использованием нужно соответствующие объекты assist Яндекс.Станций активировать и переименовать в yandex_station_.* как называются объекты media_player.*, всё остальное без изменений.
alice_telegram_bot:
# Параметры по умолчанию.
input_text:
yandex_station_telegram_bot_default_room:
name: "Комната по умолчанию с Яндекс.Станцией для Telegram-бота"
initial: Кабинет
yandex_station_telegram_bot_default_assist:
name: "Объект ассистента Яндекс.Станции по умолчанию для Telegram-бота"
initial: conversation.yandex_station_u00rav000kh7wk
input_select:
# Переключатель комнат Telegram-бота для интеграции с Яндекс.Станцией (наполняется автоматически).
yandex_station_telegram_bot_room_selector:
name: "Комната с Яндекс.Станцией для Telegram-бота"
options:
- Кабинет
initial: Кабинет
icon: mdi:send
# Telegram-бот для интеграции с Яндекс.Станцией.
telegram_bot:
- platform: polling
api_key: !secret telegram_bot_api_key1
allowed_chat_ids:
- !secret telegram_bot_user1_id
# Генерация событий, полученных от Telegram-бота для интеграции с Яндекс.Станцией.
notify:
- name: telegam_chat1
platform: telegram
chat_id: !secret telegram_bot_chat1_id
automation:
- id: alice_telegram_bot_rooms_update
alias: "Яндекс.Станция: Обновление списка комнат для команд Telegram-бота"
trigger:
- platform: homeassistant
event: start
- platform: event
event_type: area_registry_updated
- platform: event
event_type: device_registry_updated
- platform: event
event_type: call_service
event_data:
domain: input_select
service: reload
action:
- delay: "00:00:05" # Даем системе время на перезагрузку конфигурации.
- service: input_select.set_options
target:
entity_id: input_select.yandex_station_telegram_bot_room_selector
data_template:
options: >-
{% set ns = namespace(area_names = []) %}
{% for entity in states.media_player | selectattr('entity_id', 'match', '.*yandex_station_.*') %}
{% set parent_device_id = device_id(entity.entity_id) %}
{% if parent_device_id %}
{% set area = area_name(area_id(parent_device_id)) %}
{% if area %}
{% set ns.area_names = ns.area_names + [area] %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.area_names | unique | list }}
mode: single
- id: alice_telegram_bot_event_telegram_text_conversation
alias: 'Яндекс.Станция: обмен сообщениями через Telegram-бота'
description: Отправляет команду из Telegram на Яндекс.Станцию и ответ в Telegram
trigger:
- platform: event
event_data: {}
event_type: telegram_text
condition: []
action:
- service: conversation.process
data:
agent_id: >
{% set ns = namespace(assist_entity_id = states('input_text.yandex_station_telegram_bot_default_assist')) %}
{% set target_assist_room = states('input_select.yandex_station_telegram_bot_room_selector') | lower %}
{% for entity in states.conversation | selectattr('entity_id', 'match', '.*yandex_station_.*') %}
{% set parent_device_id = device_id(entity.entity_id) %}
{% if parent_device_id %}
{% set area = area_name(area_id(parent_device_id)) | lower %}
{% if area == target_assist_room %}
{% set ns.assist_entity_id = entity.entity_id %}
{% break %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.assist_entity_id }}
text: "{{ trigger.event.data.text }}"
conversation_id: "{{ trigger.event.data.chat_id }}"
response_variable: response
- service: telegram_bot.send_message
data_template:
target: "{{ trigger.event.data.chat_id }}"
reply_to_message_id: "{{ trigger.event.data.id }}"
message: "{{ response.response.speech.plain.speech }}"
mode: single
- id: alice_telegram_bot_event_telegram_command_say_2_station
alias: "Яндекс.Станция: Передаёт запрос на конкретную Яндекс.Станцию через Telegram-бота"
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/say_2_station'
action:
- variables:
args: "{{ trigger.event.data.args }}"
default_room: "{{ states('input_select.yandex_station_telegram_bot_room_selector') | lower }}"
room_list: "{{ state_attr('input_select.yandex_station_telegram_bot_room_selector', 'options') | map('lower') | list }}"
room: "{{ args[0] | lower if args and args[0] | lower in room_list else default_room }}"
- service: conversation.process
data:
agent_id: >
{% set ns = namespace(assist_entity_id = states('input_text.yandex_station_telegram_bot_default_assist')) %}
{% set target_assist_room = room %}
{% for entity in states.conversation | selectattr('entity_id', 'match', '.*yandex_station_.*') %}
{% set parent_device_id = device_id(entity.entity_id) %}
{% if parent_device_id %}
{% set area = area_name(area_id(parent_device_id)) | lower %}
{% if area == target_assist_room %}
{% set ns.assist_entity_id = entity.entity_id %}
{% break %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.assist_entity_id }}
text: "{{ (args[1:] if args and args[0] | lower in room_list else args) | join(' ') }}"
conversation_id: "{{ trigger.event.data.chat_id }}"
response_variable: response
- service: telegram_bot.send_message
data_template:
target: "{{ trigger.event.data.chat_id }}"
reply_to_message_id: "{{ trigger.event.data.id }}"
message: "{{ response.response.speech.plain.speech }}"
mode: single
- id: alice_telegram_bot_event_telegram_command_set_default_station
alias: "Яндекс.Станция: Установка Яндекс.Станции по умолчанию через Telegram-бота"
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/set_station'
action:
- service: input_select.select_option
data:
entity_id: input_select.yandex_station_telegram_bot_room_selector
option: >-
{% set default_room = states('input_text.yandex_station_telegram_bot_default_room') %}
{% set args = trigger.event.data.args %}
{% set target_room = (args[0] if args else default_room) | lower %}
{% set room_list = state_attr('input_select.yandex_station_telegram_bot_room_selector', 'options') %}
{% set ns = namespace (selected_room = default_room) %}
{% for room in room_list %}
{% if target_room == room | lower %}
{% set ns.selected_room = room %}
{% break %}
{% endif %}
{% endfor %}
{{ ns.selected_room }}
- service: telegram_bot.send_message
data_template:
target: "{{ trigger.event.data.chat_id }}"
reply_to_message_id: "{{ trigger.event.data.id }}"
message: >-
{% set default_room = states('input_select.yandex_station_telegram_bot_room_selector') %}
Установлена комната по умолчанию: {{ default_room }}
mode: single
- id: alice_telegram_bot_event_telegram_command_get_station_rooms
alias: 'Яндекс.Станция: Выводит список комнат с Яндекс.Станциями через Telegram-бота'
trigger:
platform: event
event_type: telegram_command
event_data:
command: /get_station_rooms
condition: []
action:
- service: telegram_bot.send_message
data_template:
target: "{{ trigger.event.data.chat_id }}"
reply_to_message_id: "{{ trigger.event.data.id }}"
message: >-
{% set default_room = states('input_select.yandex_station_telegram_bot_room_selector') %}
{% set rooms_options = state_attr('input_select.yandex_station_telegram_bot_room_selector', 'options') %}
{% set ns = namespace(rooms = '') %}
{% if rooms_options %}
{% for room in rooms_options %}
{% if room == default_room %}
{% set ns.rooms = ns.rooms + '{' ~ room ~ '}' %}
{% else %}
{% set ns.rooms = ns.rooms + room %}
{% endif %}
{% if not loop.last %}
{% set ns.rooms = ns.rooms + ', ' %}
{% else %}
{% set ns.rooms = ns.rooms + '.' %}
{% endif %}
{% endfor %}
{% endif %}
Список комнат (в фигурных скобках комната по умолчанию): {{ ns.rooms }}
mode: single
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@ProASV, @AlexxIT небольшое развитие идеи в виде пакета.
Наименование комнат, где находятся Яндекс.Станции строится динамически через поиск комнат, в которых находятся Яндекс.Станции. Это позволяет избежать ручного редактирования при добавлении новых устройств.
По тексту пакета есть отдельные описания всех команд, полюс по тексту есть несколько значений по умолчанию их нужно задать на свои.
Список команд для меню бота:
Также нужно установить сохранение состояния для yandex_station_telegram_room_selector в configuration.yaml: