Created
August 30, 2020 19:51
-
-
Save AlexxIT/dc42882c44e298d41631720f146e701d to your computer and use it in GitHub Desktop.
Команды через Telegram на разные станции
This file contains 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 }}" |
@ProASV, @AlexxIT небольшое развитие идеи в виде пакета.
Наименование комнат, где находятся Яндекс.Станции строится динамически через поиск комнат, в которых находятся Яндекс.Станции. Это позволяет избежать ручного редактирования при добавлении новых устройств.
По тексту пакета есть отдельные описания всех команд, полюс по тексту есть несколько значений по умолчанию их нужно задать на свои.
Список команд для меню бота:
get_station_rooms - Вывести список комнат, в т,ч. комнату по умолчанию.
set_station - Выбрать комнату по умолчанию, в которой находится Яндекс.Станция, отвечающая на запрос.
say_2_station - Передаёт запрос на конкретную Яндекс.Станцию через Telegram-бота (аргументы: Комната Текст_команды).
alice_telegram_bot:
# Параметры по умолчанию.
input_text:
yandex_station_telegram_bot_default_room:
name: "Комната по муолчанию с Яндекс.Станцией для Telegram-бота"
initial: Кабинет
yandex_station_telegram_bot_default_media_player:
name: "Плеер Яндекс.Станции по умолчанию для Telegram-бота"
initial: media_player.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_yandex_station_response
alias: 'Яндекс.Станция: получен ответ'
description: Отправляет команду от Яндекс.Станции в Telegram
trigger:
- platform: event
event_type: yandex_station_response
event_data: {}
condition: []
action:
- service: telegram_bot.send_message
data_template:
target: "{{ trigger.event.data.request_id }}"
message: "{{ trigger.event.data.text }}"
mode: single
- id: alice_telegram_bot_event_telegram_text
alias: 'Яндекс.Станция: получен текст'
description: Отправляет команду из Telegram на Яндекс.Станцию
trigger:
- platform: event
event_data: {}
event_type: telegram_text
condition: []
action:
- service: media_player.play_media
data:
entity_id: >
{% set ns = namespace(player_entity_id = states('input_text.yandex_station_telegram_bot_default_media_player')) %}
{% set target_player_room = states('input_select.yandex_station_telegram_bot_room_selector') | lower %}
{% 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)) | lower %}
{% if area == target_player_room %}
{% set ns.player_entity_id = entity.entity_id %}
{% break %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.player_entity_id }}
media_content_id: "{{ trigger.event.data.text }}"
media_content_type: "question:{{ trigger.event.data.chat_id }}"
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 room = (args[0] if args else default_room) | lower %}
{% set options_list = state_attr('input_select.yandex_station_telegram_bot_room_selector', 'options') %}
{% set ns = namespace (selected_option = default_room) %}
{% for opt in options_list %}
{% if room == opt | lower %}
{% set ns.selected_option = opt %}
{% break %}
{% endif %}
{% endfor %}
{{ ns.selected_option }}
- 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_say_2_station
alias: "Яндекс.Станция: Передаёт запрос на конкретную Яндекс.Станцию через Telegram-бота"
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/say_2_station'
action:
- service: media_player.play_media
data:
entity_id: >-
{% set ns = namespace(player_entity_id = states('input_text.yandex_station_telegram_bot_default_media_player')) %}
{% set default_room = states('input_text.yandex_station_telegram_bot_default_room') | lower %}
{% set args = trigger.event.data.args %}
{% set room = args[0] | lower if args else default_room %}
{% set target_player_room = room if room in state_attr('input_select.yandex_station_telegram_bot_room_selector', 'options') | map('lower') | list else default_room %}
{% 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)) | lower %}
{% if area == target_player_room %}
{% set ns.player_entity_id = entity.entity_id %}
{% break %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.player_entity_id }}
media_content_id: "{{ trigger.event.data.args[1:]|join(' ') }}"
media_content_type: "question:{{ trigger.event.data.chat_id }}"
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
Также нужно установить сохранение состояния для yandex_station_telegram_room_selector в configuration.yaml:
recorder:
include:
entities:
- input_select.yandex_station_telegram_bot_room_selector
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Сделал у себя немного по другому, активная колонка предварительно выбирается с помощью команды.
В данном примере /ge /ki /be /mo
Для команд можно в боте создать меню.
Может быть кому-то пригодится.
И да, метод можно комбинировать с предложенным @ProstoMaksks
`
input_select:
yandex_telegram_target:
name: Активная колонка
options:
- Гостинная
- Спальня
- Кухня
- Модуль
initial: Спальня
icon: mdi:send
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_text
action:
sequence:
entity_id: media_player.yandex_station_bedroom # Спальня
data_template:
media_content_id: "{{ trigger.event.data.text }}"
media_content_type: "question:{{ trigger.event.data.chat_id }}"
sequence:
entity_id: media_player.yandex_station_kitchen # Кухня
data_template:
media_content_id: "{{ trigger.event.data.text }}"
media_content_type: "question:{{ trigger.event.data.chat_id }}"
sequence:
entity_id: media_player.yandex_station_guestroom # Гостинная
data_template:
media_content_id: "{{ trigger.event.data.text }}"
media_content_type: "question:{{ trigger.event.data.chat_id }}"
default:
entity_id: media_player.yandex_station_guestroom # Гостинная
data_template:
media_content_id: "{{ trigger.event.data.text }}"
media_content_type: "question:{{ trigger.event.data.chat_id }}"
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/be'
action:
entity_id: input_select.yandex_telegram_target
data:
option: Спальня
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/ki'
action:
entity_id: input_select.yandex_telegram_target
data:
option: Кухня
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/ge'
action:
entity_id: input_select.yandex_telegram_target
data:
option: Гостинная
trigger:
platform: event
event_type: telegram_command
event_data:
command: '/mo'
action:
entity_id: input_select.yandex_telegram_target
data:
option: Модуль
`