Skip to content

banditByte/light-monitor-kyiv

Repository files navigation

light-monitor-kyiv

Моніторинг графіків відключень електроенергії для Києва та Київщини з автоматичним опублікуванням оновлень у 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 (Київ)

Налаштування під себе

Покрокова інструкція

  1. Форкніть або клонуйте репозиторій
    Створіть власний репозиторій на GitHub (може бути публічним).

  2. Додайте секрети в репозиторій
    Settings → Secrets and variables → Actions → New repository secret:

    • TELEGRAM_BOT_TOKEN — токен бота від @BotFather
    • TELEGRAM_CHANNEL_ID — ID каналу (наприклад @mychannel або -100...)
  3. Дозвольте Actions запис у репозиторій
    Settings → Actions → General → Workflow permissions → оберіть "Read and write permissions".

  4. Налаштуйте config.json

{
  "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
    }
  }
}

⚠️ Увага: JSON не підтримує коментарі! Перед використанням видаліть усі рядки з //.

  • groups — ваші черги (наприклад GPV12.1)
  • region"kyiv", "kyiv-region", "dnipro", "odesa" (див. актуальні назви в outage-data-ua/data)
  • YASNO: Я знайшов у yasno інфу лише для міст Київ та Дніпро, через що можуть виникати конфлікти для інших місцевостей. Тому раджу вимикати джерело yasno ("enabled": false) якщо region не дорівнює "kyiv" або "dnipro", щоб уникнути можливих конфліктів даних.
  1. Налаштування інтервалу запуску
    Частота запуску визначається у файлі .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 хвилин) можуть швидко вичерпати ліміт у приватних репозиторіях або призвести до тимчасових обмежень. Рекомендую не частіше, ніж раз на годину.
  2. Запустіть вручну для тесту
    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                            # цей файл

Корисні посилання

Визначення номера черги:

Мапи відключень:

Інші сервіси:

Дякую спільноті @svitlobot_api за нагадування: якщо хочеш, щоб усе працювало саме так, як тобі потрібно — зроби це сам ¯\(ツ)

About

My own Kyiv power outage data monitor

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors