Files
haos-blueprints/Common/Telegram Commands/blueprint.yaml
alexei.dolgolyov 67a31b320d Add allowed chat IDs filter to Telegram Commands
New input `allowed_chat_ids` restricts which Telegram chats can trigger
the automation. Leave empty to allow all chats (no filtering).
Useful for security-sensitive commands.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 02:12:22 +03:00

247 lines
8.8 KiB
YAML

# Telegram Commands Blueprint
# Responds to Telegram bot commands by executing callback actions.
# See README.md for detailed documentation.
blueprint:
name: "Custom: Telegram Commands"
description: >
Responds to Telegram bot commands (like /start, /help) by executing
corresponding callback actions. Supports up to 8 commands with
individual callbacks and optional reply messages.
domain: automation
input:
# -------------------------------------------------------------------------
# Access Control
# -------------------------------------------------------------------------
access_group:
name: "Access Control"
collapsed: true
input:
allowed_chat_ids:
name: Allowed Chat IDs
description: >
List of Telegram chat IDs allowed to trigger this automation.
Leave empty to allow all chat IDs (no filtering).
Can be user IDs (positive) or group IDs (negative).
default: []
selector:
text:
multiple: true
# -------------------------------------------------------------------------
# Command Configuration
# -------------------------------------------------------------------------
commands_group:
name: "Commands"
collapsed: false
input:
commands:
name: Command List
description: >
List of Telegram commands to respond to (include the "/" prefix).
Example: ["/status", "/lights_on", "/arm_alarm"]
default: []
selector:
text:
multiple: true
answers:
name: Reply Messages (optional)
description: >
Reply message for each command (same order as commands list).
Leave empty to not send any reply for that command.
default: []
selector:
text:
multiple: true
# -------------------------------------------------------------------------
# Command Callbacks
# -------------------------------------------------------------------------
callbacks_group:
name: "Callbacks"
collapsed: false
input:
command_1_callback:
name: Command 1 Callback
description: Actions to run when first command is received
default: []
selector:
action: {}
command_2_callback:
name: Command 2 Callback
description: Actions to run when second command is received
default: []
selector:
action: {}
command_3_callback:
name: Command 3 Callback
description: Actions to run when third command is received
default: []
selector:
action: {}
command_4_callback:
name: Command 4 Callback
description: Actions to run when fourth command is received
default: []
selector:
action: {}
command_5_callback:
name: Command 5 Callback
description: Actions to run when fifth command is received
default: []
selector:
action: {}
command_6_callback:
name: Command 6 Callback
description: Actions to run when sixth command is received
default: []
selector:
action: {}
command_7_callback:
name: Command 7 Callback
description: Actions to run when seventh command is received
default: []
selector:
action: {}
command_8_callback:
name: Command 8 Callback
description: Actions to run when eighth command is received
default: []
selector:
action: {}
# Parallel mode allows multiple commands to be processed simultaneously
mode: parallel
# =============================================================================
# Trigger
# =============================================================================
trigger:
# Listen for Telegram command events
- platform: event
event_type: telegram_command
id: "telegram_command"
# =============================================================================
# Variables
# =============================================================================
variables:
# Input references
commands: !input commands
answers: !input answers
allowed_chat_ids: !input allowed_chat_ids
# Callback references (needed for condition checks)
command_1_callback: !input command_1_callback
command_2_callback: !input command_2_callback
command_3_callback: !input command_3_callback
command_4_callback: !input command_4_callback
command_5_callback: !input command_5_callback
command_6_callback: !input command_6_callback
command_7_callback: !input command_7_callback
command_8_callback: !input command_8_callback
# Extract command and chat ID from trigger event
received_command: "{{ trigger.event.data.command | default('') }}"
chat_id: "{{ trigger.event.data.chat_id | default('') }}"
user_id: "{{ trigger.event.data.user_id | default('') }}"
# Check if chat ID is allowed (empty list = allow all)
is_chat_allowed: >
{{ allowed_chat_ids | length == 0 or (chat_id | string) in allowed_chat_ids }}
# Find the index of the received command in our list
# Returns -1 if command not found or callback is empty
command_index: >
{% set ns = namespace(idx=-1) %}
{% for i in range(commands | length) %}
{% if received_command == commands[i] %}
{% set ns.idx = i %}
{% endif %}
{% endfor %}
{{ ns.idx }}
# Debug flag - set to true to enable persistent notifications for troubleshooting
is_debug: false
# =============================================================================
# Condition - Only proceed if we received a valid command from allowed chat
# =============================================================================
condition:
- condition: template
value_template: "{{ received_command != '' and command_index >= 0 and is_chat_allowed }}"
# =============================================================================
# Actions
# =============================================================================
action:
# ---------------------------------------------------------------------------
# Debug Logging (optional)
# ---------------------------------------------------------------------------
- choose:
- conditions:
- condition: template
value_template: "{{ is_debug }}"
sequence:
- service: persistent_notification.create
data:
title: "Telegram Commands Debug"
message: >
Received command: {{ received_command }}
Chat ID: {{ chat_id }}
User ID: {{ user_id }}
Chat allowed: {{ is_chat_allowed }}
Command index: {{ command_index }}
Commands list: {{ commands }}
Answers list: {{ answers }}
Allowed chat IDs: {{ allowed_chat_ids if allowed_chat_ids | length > 0 else '(all)' }}
# ---------------------------------------------------------------------------
# Execute Command Callback
# ---------------------------------------------------------------------------
- choose:
- conditions: "{{ command_index == 0 and command_1_callback | length > 0 }}"
sequence: !input command_1_callback
- conditions: "{{ command_index == 1 and command_2_callback | length > 0 }}"
sequence: !input command_2_callback
- conditions: "{{ command_index == 2 and command_3_callback | length > 0 }}"
sequence: !input command_3_callback
- conditions: "{{ command_index == 3 and command_4_callback | length > 0 }}"
sequence: !input command_4_callback
- conditions: "{{ command_index == 4 and command_5_callback | length > 0 }}"
sequence: !input command_5_callback
- conditions: "{{ command_index == 5 and command_6_callback | length > 0 }}"
sequence: !input command_6_callback
- conditions: "{{ command_index == 6 and command_7_callback | length > 0 }}"
sequence: !input command_7_callback
- conditions: "{{ command_index == 7 and command_8_callback | length > 0 }}"
sequence: !input command_8_callback
# ---------------------------------------------------------------------------
# Send Reply Message (if configured)
# ---------------------------------------------------------------------------
- variables:
reply_message: >
{% if command_index >= 0 and command_index < (answers | length) %}
{{ answers[command_index] }}
{% else %}
{% endif %}
- choose:
- conditions: "{{ reply_message | trim | length > 0 }}"
sequence:
- service: telegram_bot.send_message
data:
target: "{{ chat_id }}"
message: "{{ reply_message }}"