Last active
November 28, 2025 15:00
-
-
Save smirnowegor/cbb381a486848eada337a356d2823fa4 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| blueprint: | |
| name: "Стиральная машина: уведомления и напоминания (универсальный Blueprint)" | |
| description: | | |
| Version: 2.1 | |
| **!!Умная Стирка: Уведомления, Энергия и Telegram / Smart Washing Machine: Notifications, Energy & Telegram** | |
| Универсальное решение. Уведомляет о старте/финише, считает стоимость, напоминает о белье. / Universal solution. Notifies about start/finish, calculates cost, reminds about laundry. | |
| --- | |
| <details> | |
| <summary>💡 Главная идея / Main idea (Click to expand) 👈</summary> | |
| <details> | |
| <summary>🇷🇺 Главная идея</summary> | |
| Этот шаблон решает три проблемы: | |
| 1. **Забытое белье:** Напоминания не дадут вещам "задохнуться" в машине. | |
| 2. **Контроль расходов:** Вы точно знаете, сколько стоила конкретная стирка (с учетом дневных/ночных тарифов). | |
| 3. **Гибкость:** Можно настроить, чтобы днем говорила Алиса/Google, а ночью приходило только тихое уведомление в Телеграм. | |
| </details> | |
| <details> | |
| <summary>en Main idea</summary> | |
| This blueprint solves three problems: | |
| 1. **Forgotten laundry:** Reminders ensure clothes don't get musty inside the machine. | |
| 2. **Cost control:** You know exactly how much a specific wash cycle cost (considering day/night tariffs). | |
| 3. **Flexibility:** Configure it to speak via Alexa/Google during the day, but send silent Telegram messages at night. | |
| </details> | |
| </details> | |
| <details> | |
| <summary>⚙️ Как это работает / How it works 👈</summary> | |
| <details> | |
| <summary>🇷🇺 Принцип работы</summary> | |
| 1. **Старт:** Автоматизация следит за умной розеткой. Если мощность выше порога (например, 10Вт) более 3 минут — стирка началась. | |
| 2. **Процесс:** Если настроено, приходит уведомление "Стирка началась". | |
| 3. **Финиш:** Когда мощность падает (ниже 5Вт) и держится так 5 минут — стирка завершена. | |
| 4. **Расчет:** Скрипт считает потребленную энергию и умножает на тариф. | |
| 5. **Напоминания:** В Телеграм приходят кнопки "Напомнить через...". Если вы не отреагировали, система напомнит сама. | |
| </details> | |
| <details> | |
| <summary>en How it works</summary> | |
| 1. **Start:** Automation monitors the smart plug. If power > threshold (e.g., 10W) for > 3 mins — cycle started. | |
| 2. **Process:** If configured, a "Wash started" notification is sent. | |
| 3. **Finish:** When power drops (below 5W) and stays there for 5 mins — cycle finished. | |
| 4. **Calculation:** Script calculates energy used * tariff. | |
| 5. **Reminders:** Telegram sends buttons. If ignored, the system will remind you automatically. | |
| </details> | |
| </details> | |
| <details> | |
| <summary>⚠️ Настройки / Requirements (Helpers) 👈</summary> | |
| <details> | |
| <summary> Необходимые настройки (Helpers)</summary> | |
| Для работы всех функций **нужно создать** (Settings -> Devices -> Helpers): | |
| 1. `input_text.stirka_end_time` — для времени завершения. | |
| 2. `input_number.stirka_start_energy` — для показаний на старте. | |
| 3. `input_number.dnevnoi_tarif` и `input_number.nochnoy_tarif` — тарифы. | |
| 4. **Utility Meter** — сенсор, который переводит Вт в кВт*ч. *Без него расчет стоимости невозможен.* | |
| 5. **Telegram Bot** — должен быть настроен в HA. | |
| </details> | |
| <details> | |
| <summary> Requirements (Helpers)</summary> | |
| For full functionality, you **must create** (Settings -> Devices -> Helpers): | |
| 1. `input_text.stirka_end_time` — stores finish time. | |
| 2. `input_number.stirka_start_energy` — stores energy at start. | |
| 3. `input_number.day_tariff` & `input_number.night_tariff` — tariffs. | |
| 4. **Utility Meter** — converts Watts to kWh. *Cost calculation won't work without it.* | |
| 5. **Telegram Bot** — must be configured in HA. | |
| </details> | |
| </details> | |
| <details> | |
| <summary>💰 Поддержать автора / Support the author 👈</summary> | |
| <details> | |
| <summary> Поддержать автора</summary> | |
| Если шаблон оказался полезен, вы можете поддержать меня, выбрав любой удобный способ: | |
| * **Способ 1 (Дзен):** [Поддержать на Дзен 😀](https://dzen.ru/id/5e32d0969929ba40059b5892?donate=true) | |
| * **Способ 2 (Донат-сервис):** [donate.stream](http://donate.stream/) (Замените на свою ссылку!) | |
| * **Способ 3 (Telegram):** Связаться через [Telegram канал](https://t.me/u2smart4home) | |
| * **Криптокошелек (Только USDT - Tron TRC20):** `TCHekdJZFndXpDrHZGuTmqFNcqhWBTTzPr` | |
| </details> | |
| <details> | |
| <summary> Support the author (EN)</summary> | |
| If you find this blueprint useful, you can support the author through various methods: | |
| * **Method 1 (Dzen):** [Support via Dzen 😀](https://dzen.ru/id/5e32d0969929ba40059b5892?donate=true) | |
| * **Method 2 (Donation Service):** [donate.stream](http://donate.stream/) (Replace with your personal link!) | |
| * **Method 3 (Telegram):** Contact via [Telegram Channel](https://t.me/u2smart4home) | |
| * **Crypto Wallet (USDT - Tron TRC20 Only):** `TCHekdJZFndXpDrHZGuTmqFNcqhWBTTzPr` | |
| </details> | |
| </details> | |
| <details> | |
| <summary>💬 Контакты / Contacts 👈</summary> | |
| * [Telegram канал (RU with auto-translate)](https://t.me/u2smart4home) | |
| * [YouTube: Удобный дом](https://www.youtube.com/@udobni_dom) | |
| * [Dzen Profile](https://dzen.ru/id/5e32d0969929ba40059b5892) | |
| </details> | |
| domain: automation | |
| input: | |
| # === БАЗОВЫЕ НАСТРОЙКИ === | |
| power_sensor: | |
| name: "Сенсор мощности (Обязательно)" | |
| description: "🔌 Сенсор, измеряющий текущую мощность стиральной машины. Это единственное обязательное поле для работы автоматизации. Указывается в ватах (Вт). Рекомендуется использовать сенсор, который показывает реальную мощность стиральной машины во время работы." | |
| selector: | |
| entity: | |
| domain: sensor | |
| start_power: | |
| name: "Порог включения (Вт)" | |
| description: "👆 Мощность, выше которой считается, что стирка началась (рекомендуется 10 Вт). Нужно для точного определения начала стирки." | |
| default: 10 | |
| selector: | |
| number: | |
| min: 1 | |
| max: 5000 | |
| unit_of_measurement: W | |
| end_power: | |
| name: "Порог завершения (Вт)" | |
| description: "👇 Мощность, ниже которой считается, что стирка завершилась (рекомендуется 5 Вт). Нужно для точного определения завершения стирки." | |
| default: 5 | |
| selector: | |
| number: | |
| min: 0 | |
| max: 100 | |
| unit_of_measurement: W | |
| delay_start_time: | |
| name: "Задержка начала стирки (мин)" | |
| description: "⏳ Время, в течение которого мощность должна превышать порог для подтверждения старта (например, 3 минуты)." | |
| default: 3 | |
| selector: | |
| number: | |
| min: 0 | |
| max: 100 | |
| unit_of_measurement: minutes | |
| wait_for_trigger_time: | |
| name: "Задержка завершения стирки (мин)" | |
| description: "⏱️ Время, в течение которого мощность должна быть ниже порога для подтверждения завершения (например, 5 минут)." | |
| default: 5 | |
| selector: | |
| number: | |
| min: 0 | |
| max: 100 | |
| unit_of_measurement: minutes | |
| notify_service: | |
| name: "Push-сервис (опционально)" | |
| description: "📲 Имя push-сервиса (например, notify.mobile_app_egor_super). Оставьте пустым, если не используете push. Используется для голосовых push-уведомлений." | |
| default: "" | |
| tts_media_players: | |
| name: "Медиаплееры для TTS (опционально)" | |
| description: "🔊 Список медиаплееров для озвучивания уведомлений. Выберите устройства media_player, на которых будет воспроизводиться голосовое сообщение." | |
| selector: | |
| entity: | |
| domain: media_player | |
| multiple: true | |
| default: [] | |
| end_time_storage_entity: | |
| name: "Сущность для времени завершения (опционально)" | |
| description: "💾 input_text для хранения времени завершения стирки (для напоминаний). Если не указано, время будет выводиться в момент запроса." | |
| selector: | |
| entity: | |
| domain: input_text | |
| default: null | |
| # === УВЕДОМЛЕНИЯ: РЕЖИМЫ И СЕРВИСЫ === | |
| tts_service: | |
| name: "Сервис TTS (опционально)" | |
| description: "🤖 Выберите целевой TTS-сервис для озвучивания сообщений (например, tts.google_en_com)." | |
| default: {} | |
| selector: | |
| target: | |
| entity: | |
| domain: tts | |
| start_time: | |
| name: "Время начала уведомлений (ЧЧ:ММ:СС)" | |
| description: "⏰ После этого времени будут отправляться голосовые уведомления (в Telegram сообщения будут приходить всегда)." | |
| default: "08:00:00" | |
| selector: | |
| text: | |
| end_time: | |
| name: "Время окончания уведомлений (ЧЧ:ММ:СС)" | |
| description: "🕰️ До этого времени будут отправляться голосовые уведомления (в Telegram сообщения будут приходить всегда)." | |
| default: "23:55:00" | |
| selector: | |
| text: | |
| start_notification_mode: | |
| name: "Режим уведомления при запуске" | |
| description: | | |
| Выберите способ уведомления о запуске стирки. | |
| - Только в телеграм: сообщение придёт только в Telegram. | |
| - Телеграм + Колонки: сообщение придёт в Telegram и будет озвучено на выбранных медиаплеерах. | |
| - Телеграм + Push: сообщение придёт в Telegram и как push-уведомление на телефон. | |
| - Только колонки: только озвучивание на медиаплеерах. | |
| - Только Push: только push-уведомление на телефон. | |
| - Колонки + Push: озвучивание на медиаплеерах и push-уведомление. | |
| - Телеграм + Колонки + Push: все способы одновременно. | |
| - Не сообщать о начале стирки: уведомление не отправляется. | |
| default: telegram_only | |
| selector: | |
| select: | |
| options: | |
| - value: telegram_only | |
| label: Только в телеграм | |
| - value: telegram_speaker | |
| label: Телеграм + Колонки | |
| - value: telegram_push | |
| label: Телеграм + Push | |
| - value: speaker_only | |
| label: Только колонки | |
| - value: push_only | |
| label: Только Push | |
| - value: speaker_push | |
| label: Колонки + Push | |
| - value: telegram_speaker_push | |
| label: Телеграм + Колонки + Push | |
| - value: none | |
| label: Не сообщать о начале стирки | |
| end_notification_mode: | |
| name: "Режим уведомления при завершении" | |
| description: | | |
| Выберите способ уведомления о завершении стирки. | |
| - Только в телеграм: сообщение придёт только в Telegram. | |
| - Телеграм + Колонки: сообщение придёт в Telegram и будет озвучено на выбранных медиаплеерах. | |
| - Телеграм + Push: сообщение придёт в Telegram и как push-уведомление на телефон. | |
| - Только колонки: только озвучивание на медиаплеерах. | |
| - Только Push: только push-уведомление на телефон. | |
| - Колонки + Push: озвучивание на медиаплеерах и push-уведомление. | |
| - Телеграм + Колонки + Push: все способы одновременно. | |
| - Не сообщать о завершении стирки: уведомление не отправляется. | |
| - **Важно: если вы выбрали "Не сообщать о завершении стирки", то напоминания также не будут отправляться. | |
| Если хотите получать напоминания, выберите другой режим уведомления.** | |
| - **Если выбрали режим без отправки в телеграм, то напоминания также не будут отправляться, так как сообщение о напоминаниях отправляется только в телеграм.** | |
| default: telegram_only | |
| selector: | |
| select: | |
| options: | |
| - value: telegram_only | |
| label: Только в телеграм | |
| - value: telegram_speaker | |
| label: Телеграм + Колонки | |
| - value: telegram_push | |
| label: Телеграм + Push | |
| - value: speaker_only | |
| label: Только колонки | |
| - value: push_only | |
| label: Только Push | |
| - value: speaker_push | |
| label: Колонки + Push | |
| - value: telegram_speaker_push | |
| label: Телеграм + Колонки + Push | |
| - value: none | |
| label: Не сообщать о завершении стирки | |
| # === ТЕКСТЫ УВЕДОМЛЕНИЙ === | |
| notification_texts: | |
| name: "Тексты уведомлений 📢" | |
| description: | | |
| Здесь вы настраиваете тексты всех уведомлений, которые будут приходить в push, TTS и Telegram. | |
| Push-уведомления в этом Blueprint — не обычные: они озвучиваются голосом на вашем устройстве. | |
| Как это работает: | |
| - При запуске или завершении стирки, а также при необходимости напоминания, автоматизация отправляет сообщения в выбранные вами каналы. | |
| - Тексты для каждого события (старт, завершение, напоминание) задаются именно здесь. | |
| - Вы можете использовать переменные (например, время) и эмодзи для наглядности. | |
| collapsed: true | |
| input: | |
| tts_start_text: | |
| name: "Текст TTS при запуске" | |
| description: "Что будет произнесено колонкой при запуске стирки. Например: 'Стирка началась!' или 'Вперёд к чистоте!'" | |
| default: "Стирка началась." | |
| selector: | |
| text: | |
| push_start_text: | |
| name: "Текст push при запуске" | |
| description: "Сообщение, которое придёт на телефон при запуске стирки и будет озвучено голосом. Можно добавить шутку или эмодзи!" | |
| default: "Стирка началась." | |
| selector: | |
| text: | |
| telegram_start: | |
| name: "Текст Telegram при запуске" | |
| description: "Сообщение, отправляемое в Telegram при запуске стирки. Можно добавить переменные, эмодзи и даже мемы!" | |
| default: "🧺🚀 Стирка началась!" | |
| selector: | |
| text: | |
| tts_end_text: | |
| name: "Текст TTS при завершении" | |
| description: "Что будет произнесено колонкой при завершении стирки. Например: 'Стирка завершена!' или 'Пора развешивать бельё!'" | |
| default: "Стирка завершена." | |
| selector: | |
| text: | |
| push_end_text: | |
| name: "Текст push при завершении" | |
| description: "Сообщение, которое придёт на телефон при завершении стирки и будет озвучено голосом. Например: 'Стирка завершена!' или 'Бельё готово!'" | |
| default: "Стирка завершена." | |
| selector: | |
| text: | |
| telegram_finish: | |
| name: "Текст Telegram при завершении" | |
| description: "Сообщение, отправляемое в Telegram при завершении стирки. Можно добавить переменные, эмодзи и даже мемы!" | |
| default: "✅🧺 Стирка завершена!" | |
| selector: | |
| text: | |
| telegram_reminder: | |
| name: "Напоминание в Telegram" | |
| description: "Текст напоминания, который придёт в Telegram, если бельё не вынуто. Пусть это будет информативное или мотивирующее сообщение." | |
| default: "⏰🧺 Ваше белье готово!" | |
| selector: | |
| text: | |
| reminder_settings: | |
| name: "Напоминания ⏰ (дополнительно)" | |
| description: "Настройка задержек и текстов напоминаний. В телегрмаме будут доступны кнопки для отправки напоминаний и через установленное время придет напоминание." | |
| collapsed: true | |
| input: | |
| reminder_notification_mode: | |
| name: "Режим напоминаний" | |
| description: | | |
| Выберите способ отправки напоминаний. | |
| - Только в телеграм: напоминания будут приходить только в Telegram. | |
| - Телеграм + Колонки: напоминания будут приходить в Telegram и озвучиваться на выбранных медиаплеерах. | |
| - Телеграм + Push: напоминания будут приходить в Telegram и как push-уведомление на телефон. | |
| - Телеграм + Колонки + Push: напоминания будут приходить в Telegram, озвучиваться на медиаплеерах и отправляться как push-уведомление. | |
| - Не отправлять напоминания: напоминания не будут отправляться. Кнопки в Telegram будут доступны, но не будут отправлять сообщения. | |
| default: telegram_only | |
| selector: | |
| select: | |
| options: | |
| - value: telegram_only | |
| label: Только в телеграм | |
| - value: telegram_speaker | |
| label: Телеграм + Колонки | |
| - value: telegram_push | |
| label: Телеграм + Push | |
| - value: telegram_speaker_push | |
| label: Телеграм + Колонки + Push | |
| - value: none | |
| label: Не отправлять напоминания | |
| speaker_reminder: | |
| name: "Текст напоминания в колонку" | |
| description: "Текст для озвучивания напоминания." | |
| default: "Белье готово." | |
| selector: | |
| text: | |
| push_reminder: | |
| name: "Текст напоминания в push" | |
| description: "Текст push-напоминания." | |
| default: "Белье постирано." | |
| selector: | |
| text: | |
| delay_10_min: | |
| name: "Задержка 1я кнопка" | |
| description: "Время задержки для первого напоминания." | |
| default: 10 | |
| selector: | |
| number: | |
| min: 1 | |
| max: 180 | |
| unit_of_measurement: minutes | |
| delay_30_min: | |
| name: "Задержка 2я кнопка" | |
| description: "Время задержки для второго напоминания." | |
| default: 30 | |
| selector: | |
| number: | |
| min: 1 | |
| max: 180 | |
| unit_of_measurement: minutes | |
| delay_60_min: | |
| name: "Задержка 3я кнопка" | |
| description: "Время задержки для третьего напоминания." | |
| default: 60 | |
| selector: | |
| number: | |
| min: 1 | |
| max: 180 | |
| unit_of_measurement: minutes | |
| # === ОТСЛЕЖИВАНИЕ ЭНЕРГИИ === | |
| energy_tracking_settings: | |
| name: "Энергия и тарифы 💡💰 (опционально)" | |
| description: "Параметры для расчета потребления энергии и стоимости стирки." | |
| collapsed: true | |
| input: | |
| energy_sensor: | |
| name: "Сенсор энергии (кВт·ч)" | |
| description: "⚡ Сенсор, измеряющий накопленное потребление энергии." | |
| selector: | |
| entity: | |
| domain: sensor | |
| default: null | |
| day_tariff: | |
| name: "Дневной тариф (кВт·ч)" | |
| description: "☀️ input_number с дневным тарифом за 1 кВт·ч." | |
| selector: | |
| entity: | |
| domain: input_number | |
| default: null | |
| night_tariff: | |
| name: "Ночной тариф (кВт·ч)" | |
| description: "🌙 input_number с ночным тарифом за 1 кВт·ч." | |
| selector: | |
| entity: | |
| domain: input_number | |
| default: null | |
| tariff_day_start_time: | |
| name: "Время начала дневного тарифа (ЧЧ:ММ)" | |
| description: "☀️ Время начала дневного тарифа." | |
| default: "07:00" | |
| selector: | |
| text: {} | |
| tariff_night_start_time: | |
| name: "Время начала ночного тарифа (ЧЧ:ММ)" | |
| description: "🌙 Время начала ночного тарифа." | |
| default: "23:00" | |
| selector: | |
| text: {} | |
| start_energy_storage_entity: | |
| name: "Сущность для стартового значения энергии (опционально)" | |
| description: "💾 input_number для хранения значения энергии в начале стирки." | |
| selector: | |
| entity: | |
| domain: input_number | |
| default: null | |
| mode: single | |
| variables: | |
| input_power_sensor: !input power_sensor | |
| tts_start_text: !input tts_start_text | |
| push_start_text: !input push_start_text | |
| delay_10_min: !input delay_10_min | |
| delay_30_min: !input delay_30_min | |
| delay_60_min: !input delay_60_min | |
| tts_end_text: !input tts_end_text | |
| push_end_text: !input push_end_text | |
| telegram_reminder: !input telegram_reminder | |
| speaker_reminder: !input speaker_reminder | |
| push_reminder: !input push_reminder | |
| delay_start_time: !input delay_start_time | |
| wait_for_trigger_time: !input wait_for_trigger_time | |
| start_time: !input start_time | |
| end_time: !input end_time | |
| start_notification_mode: !input start_notification_mode | |
| valid_notify_service: !input notify_service | |
| telegram_start: !input telegram_start | |
| telegram_finish: !input telegram_finish | |
| input_end_time_storage_entity: !input end_time_storage_entity | |
| input_start_energy_storage_entity: !input start_energy_storage_entity | |
| day_tariff_entity: !input day_tariff | |
| night_tariff_entity: !input night_tariff | |
| tariff_day_start_time: !input tariff_day_start_time | |
| tariff_night_start_time: !input tariff_night_start_time | |
| energy_sensor: !input energy_sensor | |
| end_notification_mode: !input end_notification_mode | |
| reminder_notification_mode: !input reminder_notification_mode | |
| trigger: | |
| - platform: numeric_state | |
| entity_id: !input power_sensor | |
| above: !input start_power | |
| for: | |
| minutes: !input delay_start_time | |
| - platform: event | |
| event_type: telegram_callback | |
| condition: [] | |
| action: | |
| - choose: | |
| # ================================================================= | |
| # === ВЕТКА 1: ОБРАБОТКА НАЖАТИЙ КНОПОК В TELEGRAM (НАПОМИНАНИЯ) === | |
| # ================================================================= | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ trigger.platform == 'event' }}" | |
| sequence: | |
| - alias: "Обработка выбора кнопки напоминания и установка задержки" | |
| choose: | |
| # --- Обработка кнопки 1 --- | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ trigger.event.data.data == '/reminder_10' }}" | |
| sequence: | |
| - service: telegram_bot.answer_callback_query | |
| data: | |
| callback_query_id: "{{ trigger.event.data.id }}" | |
| message: "Нажал кнопку: Напомнить через {{ delay_10_min }} минут" | |
| show_alert: false | |
| - delay: | |
| minutes: !input delay_10_min | |
| # --- Обработка кнопки 2 --- | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ trigger.event.data.data == '/reminder_30' }}" | |
| sequence: | |
| - service: telegram_bot.answer_callback_query | |
| data: | |
| callback_query_id: "{{ trigger.event.data.id }}" | |
| message: "Нажал кнопку: Напомнить через {{ delay_30_min }} минут" | |
| show_alert: false | |
| - delay: | |
| minutes: !input delay_30_min | |
| # --- Обработка кнопки 3 --- | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ trigger.event.data.data == '/reminder_60' }}" | |
| sequence: | |
| - service: telegram_bot.answer_callback_query | |
| data: | |
| callback_query_id: "{{ trigger.event.data.id }}" | |
| message: "Нажал кнопку: Напомнить через {{ delay_60_min }} минут" | |
| show_alert: false | |
| - delay: | |
| minutes: !input delay_60_min | |
| - alias: "Определение текста напоминания" | |
| variables: | |
| reminder_message_text: > | |
| {% set end_time_str = '' %} | |
| {% if input_end_time_storage_entity is not none and input_end_time_storage_entity != '' %} | |
| {% set stored_time_entity_state = states(input_end_time_storage_entity) %} | |
| {% if stored_time_entity_state is not none and stored_time_entity_state != 'unavailable' and stored_time_entity_state != 'unknown' and stored_time_entity_state | is_number %} | |
| {% set end_time_str = ' (Завершилась в ' + stored_time_entity_state | float | timestamp_custom('%H:%M') + ')' %} | |
| {% endif %} | |
| {% endif %} | |
| {{ telegram_reminder }}{{ end_time_str }} | |
| - alias: "Отправка НАПОМИНАНИЯ в зависимости от режима" | |
| if: | |
| - condition: template | |
| value_template: "{{ reminder_notification_mode != 'none' }}" | |
| then: | |
| # --- 1. Отправка в Telegram --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'telegram' in reminder_notification_mode }}" | |
| then: | |
| - service: telegram_bot.send_message | |
| data: | |
| message: "{{ reminder_message_text }}" | |
| # --- 2. Отправка на Колонки (TTS) --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'speaker' in reminder_notification_mode }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - condition: time | |
| after: !input start_time | |
| before: !input end_time | |
| sequence: | |
| - repeat: | |
| for_each: !input tts_media_players | |
| sequence: | |
| - service: tts.speak | |
| data: | |
| cache: true | |
| media_player_entity_id: "{{ repeat.item }}" | |
| message: !input speaker_reminder | |
| target: !input tts_service | |
| # --- 3. Отправка Push-уведомления --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'push' in reminder_notification_mode }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - condition: time | |
| after: !input start_time | |
| before: !input end_time | |
| - condition: template | |
| value_template: "{{ valid_notify_service is not none and valid_notify_service != '' }}" | |
| sequence: | |
| - service: "{{ valid_notify_service }}" | |
| data: | |
| message: TTS | |
| data: | |
| ttl: 0 | |
| priority: high | |
| channel: alarm_strem_max | |
| tts_text: !input push_reminder | |
| title: "" | |
| # =================================================================== | |
| # === ВЕТКА 2: ОБРАБОТКА ЗАПУСКА И ЗАВЕРШЕНИЯ СТИРКИ (ПО МОЩНОСТИ) === | |
| # =================================================================== | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ trigger.platform != 'event' }}" | |
| sequence: | |
| - variables: | |
| cycle_start_time: "{{ now().timestamp() }}" | |
| # --- БЛОК УВЕДОМЛЕНИЙ О СТАРТЕ --- | |
| - alias: "Отправка уведомлений о СТАРТЕ" | |
| if: | |
| - condition: template | |
| value_template: "{{ start_notification_mode != 'none' }}" | |
| then: | |
| # --- 1. Отправка в Telegram --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'telegram' in start_notification_mode }}" | |
| then: | |
| - service: telegram_bot.send_message | |
| data: | |
| message: > | |
| {{ telegram_start }} (Запуск в {{ cycle_start_time | timestamp_custom('%H:%M') }}) | |
| # --- 2. Отправка на Колонки (TTS) --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'speaker' in start_notification_mode }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - condition: time | |
| after: !input start_time | |
| before: !input end_time | |
| sequence: | |
| - repeat: | |
| for_each: !input tts_media_players | |
| sequence: | |
| - service: tts.speak | |
| data: | |
| cache: true | |
| media_player_entity_id: "{{ repeat.item }}" | |
| message: !input tts_start_text | |
| target: !input tts_service | |
| # --- 3. Отправка Push-уведомления --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'push' in start_notification_mode }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - condition: time | |
| after: !input start_time | |
| before: !input end_time | |
| - condition: template | |
| value_template: "{{ valid_notify_service is not none and valid_notify_service != '' }}" | |
| sequence: | |
| - service: "{{ valid_notify_service }}" | |
| data: | |
| message: TTS | |
| data: | |
| ttl: 0 | |
| priority: high | |
| channel: alarm_strem_max | |
| tts_text: !input push_start_text | |
| title: "" | |
| - delay: | |
| seconds: 2 | |
| # --- СОХРАНЕНИЕ СТАРТОВОЙ ЭНЕРГИИ --- | |
| - alias: "Сохранение стартового значения энергии" | |
| choose: | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ input_start_energy_storage_entity is not none and input_start_energy_storage_entity != '' }}" | |
| sequence: | |
| - service: input_number.set_value | |
| target: | |
| entity_id: "{{ input_start_energy_storage_entity }}" | |
| data: | |
| value: "{{ states(energy_sensor) | float(default=0) if energy_sensor is not none else 0 }}" | |
| # --- ОЖИДАНИЕ ЗАВЕРШЕНИЯ --- | |
| - alias: "Ожидание завершения стирки (падение мощности)" | |
| wait_for_trigger: | |
| - platform: numeric_state | |
| entity_id: !input power_sensor | |
| below: !input end_power | |
| for: | |
| minutes: !input wait_for_trigger_time | |
| # --- РАСЧЕТ ЭНЕРГИИ И СТОИМОСТИ --- | |
| - alias: "Расчет потребленной энергии и стоимости" | |
| variables: | |
| cycle_end_time: "{{ now().timestamp() }}" | |
| end_datetime: "{{ now() }}" | |
| # Рассчитываем потребленную энергию | |
| energy_consumed: > | |
| {% if input_start_energy_storage_entity is not none and states(input_start_energy_storage_entity) is not none %} | |
| {% set start_energy = states(input_start_energy_storage_entity) | float(default=0) %} | |
| {% else %} | |
| {% set start_energy = 0 %} | |
| {% endif %} | |
| {% set end_energy = states(energy_sensor) | float(default=0) if energy_sensor is not none else 0 %} | |
| {{ (end_energy - start_energy) | round(2) }} | |
| # Определяем час и минуту завершения для выбора тарифа, используя числовую временную метку | |
| end_hour: "{{ cycle_end_time | timestamp_custom('%H', true) | int }}" | |
| end_min: "{{ cycle_end_time | timestamp_custom('%M', true) | int }}" | |
| # Получаем значения тарифов из сущностей | |
| day_tariff_value: > | |
| {% if day_tariff_entity is not none and day_tariff_entity != '' %} | |
| {{ states(day_tariff_entity) | float(default=0) }} | |
| {% else %} | |
| 0 | |
| {% endif %} | |
| night_tariff_value: > | |
| {% if night_tariff_entity is not none and night_tariff_entity != '' %} | |
| {{ states(night_tariff_entity) | float(default=0) }} | |
| {% else %} | |
| 0 | |
| {% endif %} | |
| # Выбираем тариф на основе времени завершения | |
| selected_tariff: > | |
| {% set tariff = none %} | |
| {% set day_start_hour = 0 %} | |
| {% set day_start_min = 0 %} | |
| {% if tariff_day_start_time is string and tariff_day_start_time != '' %} | |
| {% set day_start_parts = tariff_day_start_time.split(':') %} | |
| {% if day_start_parts | length >= 2 %} | |
| {% set day_start_hour = day_start_parts[0] | int(default=0) %} | |
| {% set day_start_min = day_start_parts[1] | int(default=0) %} | |
| {% endif %} | |
| {% endif %} | |
| {% set night_start_hour = 0 %} | |
| {% set night_start_min = 0 %} | |
| {% if tariff_night_start_time is string and tariff_night_start_time != '' %} | |
| {% set night_start_parts = tariff_night_start_time.split(':') %} | |
| {% if night_start_parts | length >= 2 %} | |
| {% set night_start_hour = night_start_parts[0] | int(default=0) %} | |
| {% set night_start_min = night_start_parts[1] | int(default=0) %} | |
| {% endif %} | |
| {% endif %} | |
| {# Check for night tariff #} | |
| {% if (end_hour > night_start_hour or (end_hour == night_start_hour and end_min >= night_start_min)) or (end_hour < day_start_hour or (end_hour == day_start_hour and end_min < day_start_min)) %} | |
| {% if night_tariff_value is not none %} | |
| {% set tariff = night_tariff_value %} | |
| {% endif %} | |
| {# Check for day tariff #} | |
| {% elif day_tariff_value is not none %} | |
| {% set tariff = day_tariff_value %} | |
| {% endif %} | |
| {{ tariff }} | |
| # Рассчитываем стоимость цикла | |
| cycle_cost: > | |
| {% set energy = energy_consumed | float(default=0) %} | |
| {% set tariff = selected_tariff | float(default=0) if selected_tariff is not none else none %} | |
| {% if energy > 0 and tariff is not none %} | |
| {{ (energy * tariff) | round(2) }} | |
| {% else %} | |
| {{ none }} | |
| {% endif %} | |
| # Сообщение для Telegram (формируется здесь, чтобы не дублировать код) | |
| telegram_end_message: > | |
| {{ telegram_finish }} (Завершение в {{ cycle_end_time | timestamp_custom('%H:%M') }}) | |
| {{- ' (' + energy_consumed | string + ' кВт·ч)' if energy_consumed is not none and energy_consumed | float > 0 else '' -}} | |
| {{- ' (Стоимость: ' + cycle_cost | string + ' ₽)' if day_tariff_entity is not none and day_tariff_entity != '' and night_tariff_entity is not none and night_tariff_entity != '' and cycle_cost is not none else '' -}} | |
| # --- СОХРАНЕНИЕ ВРЕМЕНИ ЗАВЕРШЕНИЯ --- | |
| - alias: "Сохранение времени завершения в input_text" | |
| choose: | |
| - conditions: | |
| - condition: template | |
| value_template: "{{ input_end_time_storage_entity is not none and input_end_time_storage_entity != '' }}" | |
| sequence: | |
| - service: input_text.set_value | |
| target: | |
| entity_id: "{{ input_end_time_storage_entity }}" | |
| data: | |
| value: "{{ now().timestamp() }}" | |
| # --- БЛОК УВЕДОМЛЕНИЙ О ЗАВЕРШЕНИИ --- | |
| - alias: "Отправка уведомлений о ЗАВЕРШЕНИИ" | |
| if: | |
| - condition: template | |
| value_template: "{{ end_notification_mode != 'none' }}" | |
| then: | |
| # --- 1. Отправка в Telegram (с кнопками) --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'telegram' in end_notification_mode }}" | |
| then: | |
| - service: telegram_bot.send_message | |
| data: | |
| message: "{{ telegram_end_message }}" | |
| inline_keyboard: | |
| - "Напомнить через {{ delay_10_min }} мин.:/reminder_10" | |
| - "Напомнить через {{ delay_30_min }} мин.:/reminder_30" | |
| - "Напомнить через {{ delay_60_min }} мин.:/reminder_60" | |
| # --- 2. Отправка на Колонки (TTS) --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'speaker' in end_notification_mode }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - condition: time | |
| after: !input start_time | |
| before: !input end_time | |
| sequence: | |
| - repeat: | |
| for_each: !input tts_media_players | |
| sequence: | |
| - service: tts.speak | |
| data: | |
| cache: true | |
| media_player_entity_id: "{{ repeat.item }}" | |
| message: !input tts_end_text | |
| target: !input tts_service | |
| # --- 3. Отправка Push-уведомления --- | |
| - if: | |
| - condition: template | |
| value_template: "{{ 'push' in end_notification_mode }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - condition: time | |
| after: !input start_time | |
| before: !input end_time | |
| - condition: template | |
| value_template: "{{ valid_notify_service is not none and valid_notify_service != '' }}" | |
| sequence: | |
| - service: "{{ valid_notify_service }}" | |
| data: | |
| message: TTS | |
| data: | |
| ttl: 0 | |
| priority: high | |
| channel: alarm_strem_max | |
| tts_text: !input push_end_text | |
| title: "" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment