Skip to content

Instantly share code, notes, and snippets.

@AlexxIT
Created August 30, 2020 19:51
Show Gist options
  • Select an option

  • Save AlexxIT/dc42882c44e298d41631720f146e701d to your computer and use it in GitHub Desktop.

Select an option

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 }}"
@Zuz666
Copy link

Zuz666 commented Jan 20, 2025

Переделка взаимодействия с колонками с 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