Skip to content

Instantly share code, notes, and snippets.

@AlexxIT
Created August 30, 2020 19:51
Show Gist options
  • Save AlexxIT/dc42882c44e298d41631720f146e701d to your computer and use it in GitHub Desktop.
Save AlexxIT/dc42882c44e298d41631720f146e701d to your computer and use it in GitHub Desktop.
Команды через Telegram на разные станции
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
Copy link

ProASV commented Nov 2, 2021

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

    • choose:
      • conditions: '{{ is_state("input_select.yandex_telegram_target", "Спальня") }}'
        sequence:
        • service: media_player.play_media
          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 }}"
      • conditions: '{{ is_state("input_select.yandex_telegram_target", "Кухня") }}'
        sequence:
        • service: media_player.play_media
          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 }}"
      • conditions: '{{ is_state("input_select.yandex_telegram_target", "Гостинная") }}'
        sequence:
        • service: media_player.play_media
          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:
        • service: media_player.play_media
          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:

    • service: input_select.select_option
      entity_id: input_select.yandex_telegram_target
      data:
      option: Спальня
  • trigger:
    platform: event
    event_type: telegram_command
    event_data:
    command: '/ki'
    action:

    • service: input_select.select_option
      entity_id: input_select.yandex_telegram_target
      data:
      option: Кухня
  • trigger:
    platform: event
    event_type: telegram_command
    event_data:
    command: '/ge'
    action:

    • service: input_select.select_option
      entity_id: input_select.yandex_telegram_target
      data:
      option: Гостинная
  • trigger:
    platform: event
    event_type: telegram_command
    event_data:
    command: '/mo'
    action:

    • service: input_select.select_option
      entity_id: input_select.yandex_telegram_target
      data:
      option: Модуль

`

@Zuz666
Copy link

Zuz666 commented May 10, 2024

@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