Моніторинг графіків відключень електроенергії для Києва та Київщини з автоматичним опублікуванням оновлень у Telegram-каналі.
Репозиторій відкритий, щоб будь-хто міг швидко налаштувати подібний моніторинг під себе. Код простий, але поки що сирий — потребує тестування та доопрацювання.
- Збирати актуальні графіки відключень з кількох джерел одночасно.
- Публікувати оновлення в Telegram-каналі у зручному для мене текстовому форматі.
- Автоматично видаляти старі повідомлення, залишаючи лише 3 останні.
Я не планую системно підтримувати чи розвивати цей код. Зміни вноситимуться спонтанно.
Якщо хочете стабільності — краще зробіть форк або напишіть власну версію.
Питання щодо коду можна поставити через ШІ:
Якщо вам просто потрібно слідкувати за графіками, рекомендую:
Боти:
Канали (ті, якими користувався сам):
Також шукайте локальні канали СвітлоБота для своєї черги (раджу подивитися декілька, для різних будинків з однієї черги, бо якість контенту може відрізнятись). Для пошуку таких каналів зручно використовувати мапи з розділу "Корисне".
Не забувайте вчасно перевіряти номер своєї черги: будинки інколи переносять в інші групи без попередження.
Бот запускається щогодини (через GitHub Actions), порівнює актуальні графіки з попередніми та надсилає оновлення в Telegram-канал для вказаних черг.
Джерела даних:
- Публічне сховище outage-data-ua
- API YASNO (за потреби)
List format
============ ◉ 12.1 ◉ ============
📆 02.02 (Понеділок) [outage-data-ua, yasno]:
🟩 00:00 - 04:00 … (4 години)
🟠 04:00 - 11:00 … (7 годин)
🟩 11:00 - 13:00 … (2 години)
🟠 13:00 - 20:30 … (7.5 години)
🟩 20:30 - 22:00 … (1.5 години)
🟠 22:00 - 24:00 … (2 години)
🟩 Світло є: 7.5 години
🟠 Світла нема: 16.5 години
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
📆 03.02 (Вівторок) [outage-data-ua, yasno]:
🟠 00:00 - 05:00 … (5 годин)
🟩 05:00 - 10:00 … (5 годин)
🟠 10:00 - 17:00 … (7 годин)
🟩 17:00 - 19:00 … (2 години)
🟠 19:00 - 24:00 … (5 годин)
🟩 Світло є: 7 годин
🟠 Світла нема: 17 годин
============ ◉ 18.1 ◉ ============
📆 02.02 (Понеділок) [outage-data-ua, yasno]:
🟠 00:00 - 01:30 … (1.5 години)
🟩 01:30 - 07:00 … (5.5 години)
🟠 07:00 - 13:00 … (6 годин)
🟩 13:00 - 16:30 … (3.5 години)
🟠 16:30 - 23:30 … (7 годин)
🟩 23:30 - 24:00 … (0.5 години)
🟩 Світло є: 9.5 години
🟠 Світла нема: 14.5 години
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
📆 03.02 (Вівторок) [outage-data-ua, yasno]:
🟩 00:00 - 05:30 … (5.5 години)
🟠 05:30 - 10:30 … (5 годин)
🟩 10:30 - 14:00 … (3.5 години)
🟠 14:00 - 21:00 … (7 годин)
🟩 21:00 - 24:00 … (3 години)
🟩 Світло є: 12 годин
🟠 Світла нема: 12 годин
🕐 Оновлено: 02.02.2026 ⠅18:51 (Київ)
Table format
========== ◉ 12.1 ◉ ==========
📆 11.02 (Середа) [GitHub-ДТЕК]:
--------------------------------------
✖️ | ☑️ | Час
--------------------------------------
00:00-03:00 | | 3г
| 03:00-07:00 | 4г
07:00-14:00 | | 7г
| 14:00-16:30 | 2.5г
16:30-24:00 | | 7.5г
--------------------------------------
☑️ Світло є: 6.5 години
✖️ Світла нема: 17.5 години
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
📆 12.02 (Четвер) [GitHub-ДТЕК]:
⏳ Очікується інформація про графік
========== ◉ 18.1 ◉ ==========
📆 11.02 (Середа) [GitHub-ДТЕК]:
--------------------------------------
✖️ | ☑️ | Час
--------------------------------------
| 00:00-02:00 | 2г
02:00-09:30 | | 7.5г
| 09:30-11:30 | 2г
11:30-19:30 | | 8г
| 19:30-22:00 | 2.5г
22:00-24:00 | | 2г
--------------------------------------
☑️ Світло є: 6.5 години
✖️ Світла нема: 17.5 години
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
📆 12.02 (Четвер) [GitHub-ДТЕК]:
⏳ Очікується інформація про графік
🕐 Оновлено: 11.02.2026 ⠅00:30 (Київ)
Table format (+ show_intervals_detail)
========== ❖ 12.1 ❖ ==========
📆 11.02 (Середа) [GitHub-ДТЕК, Yasno]:
------------------------------------
✖️ | ☑️ | 🕐
------------------------------------
00:00-03:00 | | 3 год.
|03:00-07:00 | 4 год.
07:00-14:00 | | 7 год.
|14:00-16:30 | 2.5 год.
16:30-24:00 | | 7.5 год.
------------------------------------
☀ Світло буде 6.5 години:
03:00-07:00 | 4 год.
14:00-16:30 | 2.5 год.
🔘 Світла не буде 17.5 години:
00:00-03:00 | 3 год.
07:00-14:00 | 7 год.
16:30-24:00 | 7.5 год.
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
📆 12.02 (Четвер) [GitHub-ДТЕК]:
⏳ Очікується інформація про графік
✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧
📆 12.02 (Четвер) [Yasno]:
⏳ Очікується інформація про графік
========== ❖ 18.1 ❖ ==========
📆 11.02 (Середа) [GitHub-ДТЕК, Yasno]:
------------------------------------
✖️ | ☑️ | 🕐
------------------------------------
|00:00-02:00 | 2 год.
02:00-09:30 | | 7.5 год.
|09:30-11:30 | 2 год.
11:30-19:30 | | 8 год.
|19:30-22:00 | 2.5 год.
22:00-24:00 | | 2 год.
------------------------------------
☀ Світло буде 6.5 години:
00:00-02:00 | 2 год.
09:30-11:30 | 2 год.
19:30-22:00 | 2.5 год.
🔘 Світла не буде 17.5 години:
02:00-09:30 | 7.5 год.
11:30-19:30 | 8 год.
22:00-24:00 | 2 год.
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
📆 12.02 (Четвер) [GitHub-ДТЕК]:
⏳ Очікується інформація про графік
✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧
📆 12.02 (Четвер) [Yasno]:
⏳ Очікується інформація про графік
────────────────────
🕐 Оновлено: 11.02.2026 ⠅15:44 (Київ)
-
Форкніть або клонуйте репозиторій
Створіть власний репозиторій на GitHub (може бути публічним). -
Додайте секрети в репозиторій
Settings → Secrets and variables → Actions → New repository secret:TELEGRAM_BOT_TOKEN— токен бота від @BotFatherTELEGRAM_CHANNEL_ID— ID каналу (наприклад@mychannelабо-100...)
-
Дозвольте Actions запис у репозиторій
Settings → Actions → General → Workflow permissions → оберіть "Read and write permissions". -
Налаштуйте config.json
⚠️ Увага: JSON не підтримує коментарі! Перед використанням видаліть усі рядки з//.
groups— ваші черги (наприкладGPV12.1)region—"kyiv","kyiv-region","dnipro","odesa"(див. актуальні назви в outage-data-ua/data)- YASNO: Я знайшов у yasno інфу лише для міст Київ та Дніпро, через що можуть виникати конфлікти для інших місцевостей. Тому раджу вимикати джерело
yasno("enabled": false) якщоregionне дорівнює"kyiv"або"dnipro", щоб уникнути можливих конфліктів даних.
-
Налаштування інтервалу запуску
Частота запуску визначається у файлі.github/workflows/check_outages.yml:on: schedule: # ┌───────────── хвилини (0 - 59) # │ ┌───────────── години (0 - 23) # │ │ ┌───────────── дні місяця (1 - 31) # │ │ │ ┌───────────── місяці (1 - 12) # │ │ │ │ ┌───────────── дні тижня (0 - 6) # * * * * * - cron: '0 */1 * * *' # кожну годину о 00 хвилині
Приклади інших інтервалів:
'*/30 * * * *'— кожні 30 хвилин'0 */2 * * *'— кожні 2 години'0 8,12,18 * * *'— о 8:00, 12:00, 18:00 щодня
Обмеження безкоштовного акаунту GitHub
- Публічні репозиторії: необмежена кількість хвилин Actions.
- Приватні репозиторії: 2000 хвилин на місяць (для безкоштовного плану).
Надто часті запуски (наприклад, кожні 10–15 хвилин) можуть швидко вичерпати ліміт у приватних репозиторіях або призвести до тимчасових обмежень. Рекомендую не частіше, ніж раз на годину.
-
Запустіть вручну для тесту
Actions → check_outages → Run workflow.
light-monitor-kyiv/
├── .github/workflows/check_outages.yml # GitHub Actions
├── config.json # конфігурація
├── main.py # основний скрипт
├── requirements.txt # залежності
├── last_schedules.json # кеш (створюється автоматично)
├── message_ids.json # ID повідомлень (створюється автоматично)
└── README.md # цей файл
Визначення номера черги:
Мапи відключень:
Інші сервіси:
- «Без світла» — графік відключень електроенергії в Україні
- Графік відключень електроенергії у форматі ICS для календарів (iOS, Google Calendar, Outlook)
- Календар відключень електроенергії у Києві
Дякую спільноті @svitlobot_api за нагадування: якщо хочеш, щоб усе працювало саме так, як тобі потрібно — зроби це сам ¯\(ツ)/¯
{ "settings": { // Регіон для GitHub-ДТЕК (kyiv, kharkiv, odesa, тощо) "region": "kyiv", // Групи відключень (формат: GPV + номер групи) "groups": ["GPV12.1", "GPV18.1"], // Стиль відображення: "table" (таблиця) або "list" (список) "style": "table", // Формат таблиці: "pre" (блок коду) або "code_lines" (рядки без виділення) "table_format": "code_lines", // Максимальна кількість повідомлень у каналі (старі видаляються) "max_messages": 3, // Показувати детальний список інтервалів (true/false) "show_intervals_detail": true }, "sources": { "github": { // Увімкнути джерело GitHub-ДТЕК "enabled": true, // Назва джерела у повідомленні "name": "GitHub-ДТЕК" }, "yasno": { // Увімкнути джерело Yasno API "enabled": true, // Назва джерела у повідомленні "name": "Yasno", // ID регіону для Yasno API (Київ = 25) "region_id": "25", // ID оператора для Yasno API (ДТЕК = 902) "dso_id": "902" } }, "ui": { "icons": { // Іконка для дати "calendar": "📆", // Іконка для часу оновлення "clock": "🕐", // Іконка "є світло" (для заголовку таблиці) "on": "☑️", // Іконка "нема світла" (для заголовку таблиці) "off": "✖️", // Іконка "є світло" (для списку) "on_list": "🟩", // Іконка "нема світла" (для списку) "off_list": "🟠", // Іконка аварійного відключення "emergency": "⚠️", // Іконка очікування графіку "pending": "⏳", // Роздільник між датою та часом "separator": "⠅", // Іконка для блоку "світло буде" "light_on": "☀", // Іконка для блоку "світла не буде" "light_off": "🔘" }, "text": { // Текст підсумку (коротка версія) "on_full": "Світло є", "off_full": "Світла нема", // Текст підсумку (детальна версія) "on_detail": "Світло буде", "off_detail": "Світла не буде", // Текст аварійного відключення "emergency": "Аварійне Відключення!", // Текст очікування графіку "pending": "Очікується інформація про графік", // Текст часу оновлення "updated": "Оновлено", // Скорочення для годин у таблиці "hours_short": "год." }, "format": { // Шаблон заголовку групи ({group} замінюється на номер) "header_template": "========== ❖ {group} ❖ ==========", // Роздільник між джерелами (того ж дня) "separator_source": "✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧ ✧", // Роздільник між днями "separator_day": "■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■", // Роздільник перед часом оновлення "separator_footer": "────────────────────", // Символ для ліній таблиці "table_separator": "-", // Відступ перед інтервалами у детальному списку "detail_indent": " " }, "spacing": { // Кількість порожніх рядків перед роздільником джерел "before_separator_source": 1, // Кількість порожніх рядків перед роздільником днів "before_separator_day": 2, // Кількість порожніх рядків перед підсумком "before_summary": 1, // Кількість порожніх рядків перед футером "before_footer": 2, // Кількість порожніх рядків після роздільника футера "after_footer_separator": 1 } } }