Skip to content

Instantly share code, notes, and snippets.

@smirnowegor
Last active October 17, 2025 14:04
Show Gist options
  • Select an option

  • Save smirnowegor/1587a94b59094986f2f3985b62357748 to your computer and use it in GitHub Desktop.

Select an option

Save smirnowegor/1587a94b59094986f2f3985b62357748 to your computer and use it in GitHub Desktop.
blueprint:
name: "Проверка тарифа на газ (Telegram — надёжный MarkdownV2 / HTML)"
description: |
**Проверка тарифа на газ — автоматизированный Blueprint**
ВАЖНО!!! Работает с интеграцией https://github.com/alryaz/hass-mosoblgaz в которой есть атрибуты last_cost.
Этот Blueprint позволяет:
- Проверять актуальную цену газа (атрибут `last_cost` выбранного сенсора)
- Сохранять последнюю цену в `input_number` для сравнения
- Отправлять уведомления в Telegram (через `telegram_bot.send_message`) с подробностями:
— текущая цена, предыдущая цена, изменение, дата, показания счётчика
- Работать в режиме **HTML** или **MarkdownV2**:
— HTML: используется форматирование с `<b>`, `<code>`
— MarkdownV2: сообщение помещается внутри code-блока (```) — исключает ошибки парсинга
- Запускаться автоматически по расписанию, при изменении тарифа или вручную через кнопку
⏱ **Триггеры**:
- В заданное время (daily_time)
- При изменении атрибута `last_cost` сенсора
- При нажатии кнопки `input_button`
📊 **Параметры**:
- `gas_sensor`: сенсор газа
- `price_input`: `input_number` для хранения предыдущей цены
- `manual_button`: кнопка запуска
- `send_telegram`: включение/отключение отправки уведомлений
- `telegram_parse_mode`: выбор формата — HTML или MarkdownV2
- `min_change`: минимальное изменение для уведомления
- `daily_time`: время ежедневной проверки
🛠 **Как работает**:
1. При срабатывании триггера вычисляются `old_price`, `new_price`, `price_change`
2. Если ручной запуск — записывается новая цена и отправляется уведомление (если включён)
3. Если автоматический запуск — проверяется, превысила ли разница `min_change`
— если да — записывается новая цена и отправляется уведомление
4. Формат уведомления зависит от `telegram_parse_mode`:
— HTML → красивое форматирование
— MarkdownV2 → отправка как блок кода
📌 **Автор и поддержка**:
https://t.me/u2smart4home
https://www.youtube.com/@udobni_dom
https://dzen.ru/id/5e32d0969929ba40059b5892
domain: automation
input:
gas_sensor:
name: "Сенсор газа"
description: "Сенсор с атрибутами last_cost, last_value, last_charged, collected_at"
selector:
entity:
domain: sensor
price_input:
name: "Input number для хранения цены"
selector:
entity:
domain: input_number
manual_button:
name: "Кнопка для ручной проверки"
selector:
entity:
domain: input_button
send_telegram:
name: "Отправлять в Telegram"
description: "Включить/отключить отправку уведомлений в Telegram"
default: true
selector:
boolean: {}
telegram_parse_mode:
name: "Формат парсинга сообщения Telegram"
description: "Выберите между HTML и MarkdownV2 (код-блок)"
default: "html"
selector:
select:
options:
- value: "html"
label: "HTML"
- value: "markdown_v2"
label: "MarkdownV2 (код-блок)"
min_change:
name: "Минимальное изменение для оповещения (₽)"
default: 0.0001
selector:
number:
min: 0
max: 10000
daily_time:
name: "Время ежедневной проверки"
default: "10:00:00"
selector:
time: {}
trigger:
- platform: time
at: !input daily_time
- platform: state
entity_id: !input gas_sensor
attribute: last_cost
- platform: state
entity_id: !input manual_button
mode: single
action:
- variables:
gas: !input gas_sensor
stored: !input price_input
button: !input manual_button
min_ch: !input min_change
send_telegram_flag: !input send_telegram
parse_mode_input: !input telegram_parse_mode
old_price: "{{ states(stored) | float(0) }}"
new_price: "{{ state_attr(gas, 'last_cost') | float(0) }}"
name: "{{ state_attr(gas, 'friendly_name') }}"
last_value: "{{ state_attr(gas, 'last_value') }}"
collected_at: >
{{ (state_attr(gas, 'collected_at') | default(0))
| as_timestamp | timestamp_custom('%d %B %Y', true) }}
last_charged: "{{ state_attr(gas, 'last_charged') | float(0) }}"
price_change: "{{ new_price - old_price }}"
- choose:
- conditions:
- condition: template
value_template: >
{{ trigger.platform == 'state' and trigger.entity_id == (button) }}
sequence:
- service: homeassistant.update_entity
target:
entity_id: !input gas_sensor
- wait_template: "{{ state_attr(gas, 'last_cost') | float(0) > 0 }}"
timeout: "00:00:20"
continue_on_timeout: true
- if:
- condition: template
value_template: "{{ new_price > 0 }}"
then:
- service: input_number.set_value
target:
entity_id: !input price_input
data:
value: "{{ new_price | round(4) }}"
- condition: template
value_template: "{{ send_telegram_flag }}"
- service: telegram_bot.send_message
data:
parse_mode: "{{ 'HTML' if parse_mode_input == 'html' else 'MarkdownV2' }}"
message: |
{% if parse_mode_input == 'html' %}
⛽️ <b>Проверка тарифа на газ</b> #газтариф
💰 <b>Цена:</b>
┣ Текущая: <code>{{ new_price | round(4) }} ₽</code>
┗ Предыдущая: <code>{{ old_price | round(4) }} ₽</code>
{% set price_change = new_price - old_price %}
📈 <b>Изменение:</b>
{% if price_change | abs > 0.0001 %}
{% if price_change > 0 %}
┗ ⬆️ Рост: <code>+{{ price_change | round(4) }} ₽</code>
{% else %}
┗ ⬇️ Снижение: <code>{{ price_change | round(4) }} ₽</code>
{% endif %}
{% else %}
┗ ↔️ Без изменений
{% endif %}
🔢 <b>Счетчик:</b>
┣ Последнее показание: <code>{{ last_value }} m³</code>
┣ Начислено: <code>{{ last_charged | round(2) }} ₽</code>
┗ Дата показаний: <code>{{ collected_at }}</code>
{% else %}
```
⛽️ Проверка тарифа на газ #газtариф
💰 Цена:
┣ Текущая: {{ new_price | round(4) }} ₽
┗ Предыдущая: {{ old_price | round(4) }} ₽
{% set price_change = new_price - old_price %}
📈 Изменение:
{% if price_change | abs > 0.0001 %}
{% if price_change > 0 %}
┗ ⬆️ Рост: +{{ price_change | round(4) }} ₽
{% else %}
┗ ⬇️ Снижение: {{ price_change | round(4) }} ₽
{% endif %}
{% else %}
┗ ↔️ Без изменений
{% endif %}
🔢 Счетчик:
┣ Последнее показание: {{ last_value }} m³
┣ Начислено: {{ last_charged | round(2) }} ₽
┗ Дата показаний: {{ collected_at }}
```
{% endif %}
- conditions:
- condition: template
value_template: >
{{ new_price > 0 and (new_price - old_price) | abs > (min_ch | float) }}
sequence:
- service: input_number.set_value
target:
entity_id: !input price_input
data:
value: "{{ new_price | round(4) }}"
- condition: template
value_template: "{{ send_telegram_flag }}"
- service: telegram_bot.send_message
data:
parse_mode: "{{ 'HTML' if parse_mode_input == 'html' else 'MarkdownV2' }}"
message: |
{% if parse_mode_input == 'html' %}
🔔 <b>Тариф на газ изменился!</b> #газtариф
💰 <b>Цена:</b>
┣ Новая: <code>{{ new_price | round(4) }} ₽</code>
┗ Старая: <code>{{ old_price | round(4) }} ₽</code>
{% set price_change = new_price - old_price %}
📈 <b>Изменение:</b>
{% if price_change > 0 %}
┗ ⬆️ Рост: <code>+{{ price_change | round(4) }} ₽</code>
{% else %}
┗ ⬇️ Снижение: <code>{{ price_change | round(4) }} ₽</code>
{% endif %}
🔢 <b>Счетчик:</b>
┣ Последнее показание: <code>{{ last_value }} m³</code>
┣ Начислено: <code>{{ last_charged | round(2) }} ₽</code>
┗ Дата показаний: <code>{{ collected_at }}</code>
{% else %}
```
🔔 Тариф на газ изменился! #газtариф
💰 Цена:
┣ Новая: {{ new_price | round(4) }} ₽
┗ Старая: {{ old_price | round(4) }} ₽
{% set price_change = new_price - old_price %}
📈 Изменение:
{% if price_change > 0 %}
┗ ⬆️ Рост: +{{ price_change | round(4) }} ₽
{% else %}
┗ ⬇️ Снижение: {{ price_change | round(4) }} ₽
{% endif %}
🔢 Счетчик:
┣ Последнее показание: {{ last_value }} m³
┣ Начислено: {{ last_charged | round(2) }} ₽
┗ Дата показаний: {{ collected_at }}
```
{% endif %}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment