Як я в еру вайбкодингу перевіряю, чи є світло вдома

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!

Вітаю! Мене звати Олександр Корнієнко, я працюю Senior+ React.JS Software Developer у компанії Yalantis. У цій статті хочу поділитися рішенням простої, але болючої проблеми — як зрозуміти, чи є світло вдома, коли тебе там немає.

Проблема

Офіційні графіки відключень електроенергії іноді не відповідають дійсності, а живуть своїм життям. Тому потрібно щось надійніше.

Теорія вирішення проблеми

Нам потрібний девайс, який:

  1. Має доступ до інтернету.
  2. Працює тільки коли є світло і перестає працювати, коли світла немає
    (або напряму може показувати його наявність).
  3. З яким можна налагодити зв’язок через застосунок або сайт.

Логіка максимально проста:

Девайс онлайн → світло є.

Девайс офлайн → світла немає.

Практичне вирішення проблеми

Розумного будинку в мене немає, тому особливо розгулятися ніде. Але є банальна і дуже корисна річ: Wi-Fi роутер, і не один.

Коли є світло, то і Wi-Fi роутер працює. Коли світла немає, то немає нічого 🙂

Мій провайдер надав статичну IPv4-адресу, до якої можна достукатися за межами локальної мережі. Це і був ключовий момент.

Я зробив наступне:

  1. Знайшов локальну IP адресу роутера.
  2. Зробив її статичною.
  3. Прив’язав її до глобального IPv4, який надав мені провайдер за допомогою Port Mapping.

Схематично це виглядало так:

Name: Main Router
Protocol: TCP
External IP Address: 1.2.3.4 (глобальний IPv4)
External PORT: 12345
Internal Server IP: 192.168.0.2
Internal Port: 80

Також у налаштуваннях обмежив, хто саме може звертатися до цього IP:Port. У моєму випадку — це IP-сервера на хмарі.

Перевірка доступності

Тепер, щоб перевірити, чи працює роутер, достатньо виконати команду:

nc -zv <IP> <port> (MacOS)

Безперебійний інтернет (GPON) з підтримкою PoE та резервного живлення (UPS / інвертор)

У 2026 році провайдери та користувачі вже підготувалися до відключень електроенергії, і тепер є можливість підключення безперебійного інтернету. Цією опцією користується все більше людей: світла немає, а інтернет працює. У такому випадку перевіряти наявність світла через роутер немає сенсу. Потрібно дивитися на інші пристрої:

  • Розумні вимикачі чи пилососи.
  • Комп’ютери з живленням 24/7.
  • Телевізори.
  • Додаткові роутери.
  • Інші мережеві девайси.

Особисто у мене також підключений безперебійний інтернет, тому я перевіряю наявність світла за допомогою роутера, який знаходиться зовні будинку. Він відключається разом із електрикою.

Підключення пристрою до глобальної мережі

Нехай я вирішив робити перевірку через телевізор, а не роутер. Алгоритм простий:

  1. Знаходимо локальний IPv4 телевізора. Наприклад, 192.168.0.3.
  2. Присвоюємо йому статичну адресу, щоб після перезавантаження роутера DHCP не змінював локальний IP.
  3. Прив’язуємо локальний IPv4 до глобального IPv4. І відповідно прокидаємо порт для зовнішнього доступу.
Name: Samsung TV
Protocol: TCP
External IP Address: 1.2.3.4 (глобальний IPv4)
External PORT: 12333
Internal Server IP: 192.168.0.3
Internal Port: ?

Залишається зрозуміти, який Internal Port потрібно обрати. З роутером було зрозуміло, для HTTP використовується за замовчуванням 80-ий порт, але мій TV нічого не повертає на 80-му порті. Тому я використав наступну команду для Mac OS, яка перевіряє усі порти від 1 до 65535 та якщо знаходить TCP-зʼєднання, повертає відповідь.

sudo masscan 192.168.0.3 p1-65535 --rate 20000

Discovered open port 8187/tcp on 192.168.0.3       
                        
Discovered open port 7678/tcp on 192.168.0.3  
                             
Discovered open port 8009/tcp on 192.168.0.3      
                         
Discovered open port 7443/tcp on 192.168.0.3           
                    
Discovered open port 8008/tcp on 192.168.0.3    
                           
Discovered open port 8001/tcp on 192.168.0.3 

Маючи порти, перевіряємо, який нам найбільше підходить. Я обрав 8001.

Name: Samsung TV
Protocol: TCP
External IP Address: 1.2.3.4 (глобальний IPv4)
External PORT: 12333
Internal Server IP: 192.168.0.3
Internal Port: 8001
Тепер отримати доступ до 192.168.0.3:8001 можна через 1.2.3.4:12333.

Вебінтерфейс

Я зробив мінімалістичний фронтенд на HTML + CSS + JS. Концепція наступна:

index.html відправляє GET-запит на http://IPv4:Port:

  1. якщо відповідь є — перенаправлення на online.html (світло є ✅);
  2. якщо відповіді немає — перенаправлення на offline.html (світла немає ❌).

Але є нюанс — CORS

Концептуально все працює, але на практиці браузер одразу викидає CORS error.
Причина очевидна: IPv4:Port не налаштований на CORS, і браузер блокує запити з іншого домену. Тому довелося скористатися класичним рішенням — proxy server. Проксі приймає запит з фронтенду, звертається до роутера вже зі свого IP, а потім повертає відповідь назад у браузер без CORS-болю і зайвих танців з бубном.

Трохи концептуального коду для ясності

Щоб ідея була максимально прозорою, покажу спрощений варіант коду, який ілюструє весь потік — від відкриття сторінки до отримання відповіді «є світло / немає світла».

Початковий HTML

Потрібен стартовий HTML-файл, який запускає перевірку одразу після відкриття сторінки.

<body>
  <div class="loader-container">
    <div class="spinner"></div>
    <h1>Перевіряємо доступ до роутера</h1>
  </div>
  <script src="check.js"></script>
</body>

Це сторінка з лоадером, яка чекає на результат перевірки з файлу check.js.

Check.js

Check.js відповідає лише за одне: запитати бекенд і вирішити, куди перенаправити користувача.

const CONFIG = {
  HOME_ROUTER_API: "/api/check-router-status",
};
async function checkRouterAccess() {
  try {
    const { isOnline } = await fetch(CONFIG.HOME_ROUTER_API, {
      method: "GET",
      redirect: "manual",
      signal: AbortSignal.timeout(3000),
    }).then((res) => res.json());
    if (isOnline) {
      window.location.href = "online.html";
      return;
    }
    window.location.href = "offline.html";
  } catch (error) {
    window.location.href = "offline.html";
  }
}
checkRouterAccess();
Логіка максимально примітивна:
  • Бекенд відповів 200 OK → світло є.
  • Будь-яка помилка / таймаут → світла немає.

Бекенд: перевірка доступності роутера

Тут живе вся «магія» з CORS і зовнішнім доступом. Бекенд отримує запит від фронтенду і сам звертається до роутера за його глобальним IPv4:port.

@Get("/api/check-router-status")
async checkRouter() {
  try {
      const res = await fetch(process.env.ROUTER_API);
      return { isOnline: res.ok };
    } catch {
      return { isOnline: false };
    }
}
Важливі моменти:
  • Браузер не напряму стукає в роутер → немає помилки CORS.
  • Бекенд робить простий HTTP-запит і повертає результат.
  • Якщо роутер недоступний — запит просто впаде по таймауту.

Деплой

Після налаштування всього коду його потрібно задеплоїти.

У моєму випадку фронтенд (статичні html/css/js) віддається з того ж сервера, що і бекенд. По суті, це один компактний сервер, який виконує три завдання:

  1. Віддає статичні файли.
  2. Обслуговує один API-ендпоінт для перевірки доступності пристрою.
  3. Проксіює запити до роутера чи телевізора, обходячи проблеми з CORS.

Безпека — критично важливий момент

Є дуже важлива складова, про яку не можна забувати. Якщо залишити все як є, завжди існує шанс, що хтось знайде вашу глобальну IPv4-адресу. Далі справа техніки: однією командою можна отримати інформацію про всі відкриті порти, прив’язані до цієї адреси.

Саме так зазвичай працюють боти. Вони автоматично знаходять такі IP-адреси й починають перебір портів та ендпоінтів у пошуках чогось «цікавого». Уявімо, що бот натрапив на Samsung TV, доступний із глобальної мережі. Далі він почне надсилати типові запити на кшталт:

1.2.3.4:12333/index.html

1.2.3.4:12333/wordpress-admin.php

1.2.3.4:12333/robots.txt

1.2.3.4:12333/api

1.2.3.4:12333/api/v2

І рано чи пізно може «вгадати» реальний ендпоінт телевізора:

1.2.3.4:12333/api/v2

Який у відповідь поверне:

{
  "device": {
    "type": "Samsung SmartTV",
    "name": "65&quot; Neo QLED",
    "networkType": "wireless",
    "resolution": "3840x2160"
   ...
  },
 ...
}

На цьому етапі конфіденційність уже порушена.

У кращому випадку зловмисник просто отримає інформацію про пристрій. У гіршому — почне експериментувати: надсилати команди, змінювати налаштування або шукати спосіб отримати ширший доступ до мережі. Саме тому відкривати домашні пристрої напряму в інтернет без додаткового захисту це погана ідея, навіть якщо здається, що там нічого цікавого.

Як забезпечити безпеку

Мінімізувати витік IP-адреси

Навіть якщо у нас немає проблем з CORS і ми хочемо з публічного сайту відправити запит на наш роутер, то будь-хто в браузері може глянути, куди був відправлений запит і таким чином вони знайдуть IPv4 та порт. Щоб уникнути витоку, потрібно чутливу інформацію передавати не через браузер, а через сервер.

Клієнт -> Сервер -> Роутер -> Сервер -> Клієнт

У цьому випадку браузер бачить лише Клієнт -> Сервер -> Клієнт.

Код серверу тримати в приватному репозиторії та IPv4:port винести у .env файл.

Використовувати нестандартний порт

Боти зазвичай сканують стандартні порти: 80, 443, 3000, 5000, 8000 і т.д.

Щоб уникнути випадкових атак, краще обрати нестандартний порт у діапазоні 1–65535, наприклад, 58192.

Firewall

Найефективніший спосіб захисту — це фільтрувати доступ по IP: додати у whitelist IP сервера, який перевіряє наявність світла. Усі інші запити блокувати.

Таким чином, навіть якщо бот дізнається http://IPv4:port, він не зможе отримати доступ.

Обмеження: на рівні телевізора чи роутера firewall часто неможливо налаштувати.
Можна використовувати фізичний firewall, підключений по LAN, але для гігабітного інтернету це дорого.

Remote management

Якщо роутер підтримує Remote Management, можна вказати конкретну адресу, з якої дозволено доступ із глобальної мережі. Всі інші запити будуть отримувати 403 Forbidden.

VPN

Багато сучасних роутерів підтримують VPN-доступ (зазвичай через OpenVPN).
Ідея проста: після налаштування VPN доступ до http://IPv4:port можливий тільки для підключених через VPN пристроїв. При такому підході сервер, який не підключений до VPN, не зможе напряму звертатися до роутера і отримає помилку. Тому, щоб перевіряти статус пристрою через сервер, сам сервер також повинен бути підключений до VPN.

Захистити клієнт

Якщо хтось інший тримає посилання на клієнт, він зможе переглянути, чи є у вас світло, чи немає, а також навантажувати сервер. Щоб уникнути цього, можна скористатись підходом з VPN. Доступ на сайт буде лише після сходу на відповідний VPN. Інший варіант — можна зробити Basic Auth (логін, пароль) і лише після того дозволяти взаємодію.

Оптимізація

Щоб перевірка наявності світла працювала швидко та ефективно, варто звернути увагу на два ключові моменти:

Використовувати TCP замість HTTP

Відправляти HTTP-запит, щоб перевірити доступність пристрою, не дуже оптимально.
Причина проста: HTTP спочатку встановлює TCP-з’єднання, потім робить handshake, обмінюється заголовками. Щоб просто дізнатися, чи пристрій онлайн, достатньо TCP-запиту. Він набагато швидший та менше навантажує мережу та сервер.

  @Get("/api/check-router-status")
  async pingRouter() {
    const host = process.env.ROUTER_HOST;
    const port = Number(process.env.ROUTER_PORT);
    return await new Promise<{ isOnline: boolean }>((resolve) => {
      const socket = new net.Socket();
      socket.setTimeout(1500);
      socket.once("connect", () => {
        socket.destroy();
        resolve({ isOnline: true });
      });
      socket.once("timeout", () => {
        socket.destroy();
        resolve({ isOnline: false });
      });
      socket.once("error", () => {
        resolve({ isOnline: false });
      });
      socket.connect(port, host);
    });
  }

Використовувати кешування результатів

Перевіряти стан світла кожну секунду або робити запит до роутера щоразу, коли кілька людей дивляться сайт одночасно — не оптимальна витрата ресурсів. Щоб уникнути цього, можна застосувати примітивний кеш на сервері.

const lastCheck: { isOnline: boolean; timestamp: number } | null = null;
const LASTCHECK_THRESHOLD = 60*1000; // 1 хвилина
  
@Get("/api/check-router-status")
  async pingRouter() {
    const now = Date.now();
    if (lastCheck && now - lastCheck.timestamp < LASTCHECK_THRESHOLD) {
      return lastCheck;
    }
   ...
    const result =  await new Promise<{ isOnline: boolean }>((resolve) => {
     ....
    });
    lastCheck = { isOnline: result.isOnline, timestamp: now };
    return result;
  }

Покращення

У рамках MVP ми вже маємо працюючий сайт, який відкривається одним кліком і показує реальний стан світла вдома, а не теоретичний графік. Але необхідність постійно заходити на сайт і перевіряти стан може швидко втомлювати. Тому наступний крок — автоматизувати процес за допомогою Telegram-бота, інтегрованого із сайтом.

Ідея така: моніторити стан світла з 8 ранку до 10 вечора, перевіряючи його кожну годину. Додатково передбачені перевірки ранком: якщо о 9:01 світло ще не з’явилося, також перевіряємо повторно о 9:05 та 9:10. Якщо ж світло з’явилося о 9:01, повторні перевірки не потрібні, і наступна планова перевірка буде о 10:01.

Telegram-бот відправляє повідомлення у канал тільки при зміні стану світла, якщо перед цим його не було, а зараз є, або навпаки. Таким чином, навіть якщо з 8 до 11 ранку світла не було, користувач отримає лише два повідомлення: о 8:00 світла немає і о 11:00 світло з’явилося.

Бонус

Сайт можна встановити як PWA на телефон і перевіряти доступність світла. (Share -> Add to Home Screen -> Add).

А як ви перевіряєте, чи є світло вдома? ⚡📱

Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.

👍ПодобаєтьсяСподобалось10
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Вже ж є телеграм боти, що перевіряють, чи увімкнені роутери, наприклад @havelightbot, але усі вони не працюють, якщо роутер не вимикається разом зі світлом.

просто перевіряю чи робот пилосмок в онлайні, поки цього достатньо

Теж раніше так перевіряв, допоки не зʼявився інвертор.

а інвертор не в онлайні?

Да тут вообще смешные проблемы по сравнению с теми, что в Крыму. В Крыму роскомнадзор блокирует решительно всё, что только можно залочить. Поэтому если вы решите завернуть роутер и умный дом под какой-нибудь IPsec, чтоб туда не стучали кто попало, то он у вас всегда будет в оффлайне. А также и все остальные протоколы VPN, которые может распознать через DPI. X-Ray он распознать ни по каким сигнатурам не может, поэтому блокирует через статистический анализ трафика. Даже если он обёрнут чем-то ещё. А у вас только клоунские блокировки, максимум что блокируют — это доступ к полному функционалу Gemini, где можно включить любой прокси/впн, и спросить совет у самого Gemini на счёт того под какой локацией удобнее всего получить полный доступ.

В Крыму роскомнадзор блокирует решительно всё

Есть одно универсальное решение. росия покидает украинский Крым и больше нет проблем с блокировками и прочими неудобствами.

Это безусловно лучшее решение, только оно реализуется когда-то в светлом будущем. Ну а мы живём в настоящем. Да и к тому же, как показывает опыт второй мировой войны, весь вложенный немцами труд в построение концлагерей — не пропал даром, их освоили НКВД для своих целей и задач.

их освоили НКВД для своих целей и задач.

ну дык классика же ж ))

Він скочив на гусеницю, розчинив люк і заліз у жарку напівпітьму. Він уже поклав руки на важелі, коли згадав, що залишилося ще одне запитання. Він висунувся.

— Послухайте, — сказав він, — а чому справжнє призначення башт приховується від рядових підпільників?

Зеф скривився і плюнув, а Вепр сумно відповів:

— Тому що більшість у штабі сподівається коли-небудь захопити владу і використовувати башти так само, але з іншою метою.

— З якою — іншою? — похмуро спитав Максим.

Кілька секунд вони дивилися один одному у вічі. Зеф, відвернувшись, старанно заклеював язиком сигарету. Потім Максим сказав:

— Бажаю вам вижити, — і повернувся до важелів.

Танк загримкотів, забрязкотів, хруснув гусеницями і покотився вперед.

(к)

там вообще подряд цытировать можно

Все це в різних варіація роблю, але без ресурсів клієнта, на тупому bash

використання слова bash не додає ніякого сенсу фразі без оного

Нащо ровер вигадувати? Є ж home assistant, який через cloudflared в інтернеті. Зайшов та дивишся на значення grid voltage ups / інвертора чи що там у вас.

Колись у мене була наступна схема, налаштована засобами роутера рунетік Keenetic:

  • Обираємо будь-який девайс з Wi-Fi, що увімкнений в розетку 24/7 і не має свого АКБ. В моєму випадку це був очищувач повітря
  • Призначаємо йому статичну IP-адресу
  • Там же, в застосунку Keenetic, ставимо сповіщення на зміну стану

Готово. Сповіщення надходять просто в застосунок роутера, але також є інтеграції з месенджерами. Звісно, що роутер має мати резервне живлення.

Бо якщо він його не має, можна просто отримувати сповіщення про стан самого роутера. 🤷

Але це вже наступний рівень після вайбкодингу — no-coding.

так і є, у більшості випадків то знайти чим вже можна скористатися — у мене нп то додати одну строчку в crontab, бо решта вже все було десь-колись зроблено для моніторингу сервісів і тазиків

Embedded developer дивиться на все це як повітряна кулька на презерватив (чи навпаки, тут вже не важливо).

А це задача, хоч і невеличка, виходить за рамки кулько-спеціалізації, — перше це бачення як то має бути в цілому (тобто нп мережевий адмін зразу бачить як краще), потім вже деталі — де як і чим робимо, і можна вирішити по різному дивлячись що вже є в наявності. Як embedded програмер наприклад зробить частину для інформування на мобайл девайс (щоб то зручно було користуватися), чи організує збір статистики по вкл-викл на сервері (що корисно також)?

В мене загалом досить складно все, але це результат еволюції. Промисловий ПК у якості роутера, білий IP, на який я можу зайти браузером ззовні. Заживлений він від дворівневої резервної системи живлення, що повідомляє свій статус по RS232C (це є окрема розробка із власним ПЗ). На цьому роутері крутиться проста web-апка, де я бачу все що треба: статус мережі, статус основної батареї, статус альтернативної батареї, графіки та статистику. Раніше був ще телеграм-бот для автосповіщеня про вимкнення/ввімкнення мережі та розряд батарей, але якось воно заглохло бо виявилось не дуже й потрібним. Із всього цього я навайбкодив лише HTML+JS, бо терпіти їх не можу (і все одно довелось перепилювати за болваном майже 90%).

Кожен робить акцент на чомусь своєму:
— хто має бекграунд у вебпрограмуванні — дивиться на то як що зробити більш з тієї точки зору — надати нп доступ для конектів (прокинувши порти назовні) і запрограмувати перевірку конектами зі зовнішнього вебсервера
— хто бекграунд роботи з купою заліза — статус по специфічному прото чи на розпіновку, пром пк, дворівнева система живлення, статус батарей, зновуж ріал айпі, etc.

У мене простіше нп було — будь-яка залізка без упса що надсилає періодично що-небудь (чи статус з конект чи пінг звичайний, нп через крон), зовнішній сервер і подальше інформування на одному з вже існуючих зовнішніх. Пропало-з’явилося живлення — отримуємо інформування. Тобто ніяких ріал айпі, упсів, і програмування, — було просто додавання одного рядка у кронтаб. З такої точки зору (тобто такого кейса як мій) — перші два підходи виглядають доволі схоже у плані overcomplication для задачі — щоб бути в курсі там on чи off.

як зрозуміти, чи є світло вдома, коли тебе там немає.

Взяти WiFI реле Tuya за 3$ та дивитися чи воно онлайн в мобільному додатку. [Хаби Лейм.jpg]

Ідея робоча, якщо не враховувати те, що Tuya — лагуче китайське лайно.

Не знаю, можливо це особливості роботи саме Zigbee, але у мене регулярно відвалюються рандомні девайси, яких у мене дуже багато.

Zigbee та відвалюються? Лол.

> Знайшов локальну IP адресу роутера.
> Зробив її статичною.

Щось дивне. У раутера і так ця адреса (LAN) статична, нічого окремо робити не треба.

> Прив’язав її до глобального IPv4, який надав мені провайдер за допомогою Port Mapping.

А ось зробити WAN адресу статичною, якщо провайдер не дозволяє, неможливо. Вам пощастило. Але універсальний рецепт має бути придатним для всіх.

> Тепер отримати доступ до 192.168.0.3:8001 можна через 1.2.3.4:12333.

Ви ж сказали, що це телевізор? Ви змогли запустити свій вебсервер на телевізорі?

Далі було про секьюріті, але я б взагалі так не робив статтю, щоб показати як неправильно, а тільки потім переробляти на правильно.

> Використовувати нестандартний порт

Це лише відтягне злам.

Правильно було зробити навпаки: локальний агент посилає результати у хмару. Свій сервер, телеграм-бот, як у вас — це вже деталі.

Щось дивне. У раутера і так ця адреса (LAN) статична, нічого окремо робити не треба.

Мій підхід базується на двох роутерах: один має нехай локальну IPv4 192.168.0.1, а інший 192.168.0.75. Той, що 192.168.0.1 під’єднаний до ДБЖ, а інший 192.168.0.75 (у своїй локальній мережі цей роутер має 192.168.110.1) знаходиться ззовні будинку, і коли пропадає світло, то він не працює. DHCP не змінить локальну адресу 192.168.0.1, так як вона зарезервована роутером, але змінить 192.168.0.75, тому потрібно зробити її локально статичною.

А ось зробити WAN адресу статичною, якщо провайдер не дозволяє, неможливо. Вам пощастило. Але універсальний рецепт має бути придатним для всіх.

Стаття була написана, щоб показати, як саме я вирішив свою проблему, і, можливо, надихнути інших на власну реалізацію. Я не претендую на універсальний або найкращий варіант рішення 🙂 У моєму випадку провайдер надає статичну WAN-адресу, тому це взагалі не було проблемою.

Ви ж сказали, що це телевізор? Ви змогли запустити свій вебсервер на телевізорі?

Приклад із телевізором був наведений лише для демонстрації підходу. Ідея в тому, що можна перевіряти не тільки роутер, а й будь-який пристрій у мережі, який має доступ до інтернету та відкриті TCP-порти. Я навів телевізор як приклад пристрою, до якого можна спробувати встановити TCP-з’єднання. Телевізор нічого не хостить і нічого не запускає. Але у своєму випадку я використовую підхід із двома роутерами. Телевізор був лише ілюстрацією альтернативного варіанту.

Далі було про секьюріті, але я б взагалі так не робив статтю, щоб показати як неправильно, а тільки потім переробляти на правильно.

У статті не було мети показати «як неправильно», а потім переробити на «як правильно». Я показав еволюцію підходу та додав окремий блок про безпеку, щоб звернути увагу на можливі ризики. Розділ про безпеку важливий саме для того, щоб люди розуміли ризики відкритого доступу до пристроїв. Дійсно, якщо залишити доступ без VPN, firewall або обмежень на remote management, рано чи пізно такий хост можуть знайти через сканування і спробувати скомпрометувати. З цим я погоджуюся. Водночас у реальності мій провайдер надає клієнтам статичну IP-адресу, яка одразу веде на сторінку авторизації роутера, і ніхто навіть не задумується про безпеку. Я лише хотів показати свій практичний приклад і водночас наголосити, що навіть якщо рішення працює, не варто забувати про безпеку та базове розуміння ризиків.

Це лише відтягне злам.

Так і є, це мінімізація ризиків, а не повноцінний захист. Я і не подаю це як єдине або неповторне рішення. Якщо вашу IP-адресу знайде бот, то він, швидше за все, запустить автоматичний скрипт і пройдеся по типових портах або навіть по всьому діапазону. Приклад сканування із телевізором

sudo masscan 192.168.0.3 p1-65535 —rate 20000

Але якщо адресу знайде не бот-сканер, а хтось вручну, то не факт, що він буде перевіряти всі порти. Можливо, перевірить 80-й або 443-й і на цьому зупиниться.

Правильно було зробити навпаки

Так, було б ідеально, якби сам роутер міг відправляти «heartbeats» на мій сервер, тоді й питання безпеки вирішувалося б простіше. Але моє архітектурне рішення враховує реальні обмеження, які у мене є. Якщо їх відкинути, звісно, можна використовувати Мікротік, Raspberry Pi, розумну розетку чи будь-який інший варіант. Усі вони мають право на життя. У моєму випадку ж немає сенсу купувати додаткові девайси для перевірки того, що я і так можу контролювати.

Вже з заголовку статті зрозуміло, що той фантастичний кіберпанк, що був у творах фантастів, у нас настав у повний зріст. High tech — low life. «Вайбкодимо», хмари, коли інфраструктура порушена, світла нема і холодно.

Деякі моменти здались оверкілом, але що це як не практика.
Я ж просто на роутері пінгую кожні 15 секунд холодильник по ICMP (він недо розумний)
Все ж ДБЖ на роутері мастхев, як і роутер який вам не провайдер за 1 грн дав 10 років тому, а щось що вміє крок вліво крок вправо. Ще прокинув на ньому ж VPN якщо треба щось складніше, і не викладати у світ всі сервіси підряд, бо зто зна які вразливості.

Є безкоштовний і зручний healthchecks.io, до якого можна прикручувати різні інтеграції для нотифікацій, статусні бейджики на сторінках тощо. Роутер, який залежить від світла, повинен просто слати регулярні heartbeats в обумовлений термін, і не потрібно публічної адреси і зовнішнього доступу до пристрою.

Не усі роутери підтримують можливість відправки запитів або «heartbeats». Мій роутер не має цієї можливості, тому цей варіант я одразу відкинув :)

Якщо не роутер (і варіант поставити якусь відкриту прошивку типу OpenWRT не підходить), то можна вставити в USB-порт Raspberry Pi Zero за $15-20 і на ньому запустити пінгалку. Питання мабуть більше в тому, чи хочемо робоче рішення мінімальними зусиллями, чи хочемо спроектувати і написати таку систему власноруч (теж цілком валідна причина).

Esp32, підключений до 5 Вольт, наприклад usb роутера, і любий блок живлення на піни esp через дільник.
За свої 3-4 бакси топ рішення.

В тій же esp32 можна створити і статистику і телеграм бота.

Коли з пінів зникає напруга, єсп32 шле в тг бот повідомлення — електрика зникла, коли пін став активний — електрика з’аявилась. Точність хоч до мілісекунди можна зробити.

Можна через дільник і ацп ще й напругу вимірювати, або прошити туєвську 3х баксову розетку під відкриту прошивку, і з неї напряму знімати напругу.

Далі (як я зробив) ще й універсальність — після прошивки esp32 піднімає wifi точку доступу, підключаємося зі смартфона, вибираємо віфі мережу і пароль, вводимо пароль та логін адміна, налаштування телеграм бота і інші налаштування по смаку, наприклад дозволити бачити повідомлення всім, чи тільки адміну в телеграм.

Отримуємо інформацію, статистику, графіки через локальну мережу (веб сервер єсп32), або через команди телеграм бота.

Не усі роутери підтримують можливість відправки запитів або «heartbeats»

У вас цілий сервер у локальній(домашній) мережі для вебфункціоналу?
Надсилати умовно «пінг» на зовнішній сервер можна і з нього. Тобто вам нетреба доступ ззовні у такому випадку, та плюс купа інших плюшек (включно з тим що вам непотрібно буде мати глобальну адресу від провайдера). Це те що і зауважив VN вище в коментах.
Хоча є і додаткова вимога — необхідність сервера ззовні (чи власного, чи одного з доступних — нп як то наведено YG). Але це не порівняти з усіма недоліками які отримуються з — надати доступ ззовні у свою домашню мережу для вирішення невеличкої пінг задачі.

Тобто вибір для рішення в загальному випадку — «пінг» зовнішнього сервера зі своєї мережі — доволі очевидний.

У вас цілий сервер у локальній мережі для вебфункціоналу?

Ні, сервер не хоститься у локальній мережі. Я захостив бекенд з вебфункціоналом на хмарі.

Тобто замапили деякі внутрішні tcp порти з адресами домашніх девайсів на зовнішні, і користуючись тим що маєте реальну адресу від прова — перевіряєте ззовні по tcp конекту чи ті домашні девайси працюють (умовно tcp ping). Так, тоді це опція без зазначеного сервера у домашній мережі. Теж варіант, але суттєві недоліки (у порівнянні з перевіркою нп коннектами/пінгами у зворотньому напрямку) — з таким рішенням залишаються.

Це вже не вайб кодинг, з точки зору мого сприйняття вайб кодингу. Бо якщо розглядати вайб кодинг з точки зору "ні чорта не шарю в програмуванні але за допомогою ШІ склепав аппку то ШІ такого не побудує, якщо йому конкретно це не попросити. А я особисто перевіряю наявність світла через додаток до зарядної станції, модна було би вивести якийсь пристрій до контактів АВР, і перевіряти його статус, але ліньки, і не бачу особливого профіту

Я перевіряю в мобільному додатку для роутера TP-Link. Він постійно підключений до ДБЖ. Якшо роутер показує підключений до мережі телевізор — значить світло є. Якщо ТВ офлайн — значить світло вимкнули)

Мільйон ботів в телеграм просто існує

Був кодив колись таке на скриптах Мікротика — github.com/eSvitlo/eSvitlo-MikroTik
Працює вже три роки

у мене домофон з wifi, маю доступ до камери домофону з телефону. Якщо світло є, то домофон працює і я маю доступ до камери. Так і перевіряю...

Коли є світло, то і Wi-Fi роутер працює. Коли світла немає, то немає нічого

Дивно вайбкодити апку яка пінгує роутер, але не ставити ДБЖ на роутер.

Перевіряти можна різні девайси/пристрої. Я наводив приклад одного роутера, потім телевізора. Але у моєму випадку ідея така: один роутер завжди працює, а інший вимикається, коли немає світла. Тому я перевіряю стан зовнішнього роутера.

Але є банальна і дуже корисна річ: Wi-Fi роутер, і не один.
Особисто у мене також підключений безперебійний інтернет, тому я перевіряю наявність світла за допомогою роутера, який знаходиться зовні будинку. Він відключається разом із електрикою.

Може ж бути так, що провайдер ліг (навіть pon, колбасить всіх). І тоді буде некорректний резльтат.

Як варіант поставити ajax із sim картою.
Так, не три копійки, але ще матимеш охорону систему та запасний канал звʼязку.

Написані за три години скриптики потім можна вічність дебажитм 😀

Можна було по-різному вирішити питання наявності світла: є кращі/гірші, дорожчі/дешевші варіанти. Я вирішив використати інструменти, які були під рукою.

Може ж бути так, що провайдер ліг (навіть pon, колбасить всіх). І тоді буде некорректний резльтат.

Добре підмічено, якщо не працює інтернет, результат буде некоректним. В моєму випадку провайдер за весь час користування інтернетом падав лише декілька разів. Тому 99% часу результат коректний

Написані за три години скриптики потім можна вічність дебажити 😀

Так, якщо брати середню температуру по термометру. Код написаний за чотири години і не покритий тестами, має схильність до багів :) Але в моєму випадку код досить простий, його можна безболісно підтримувати.

заведи якийсь клаудфлер воркер та й всі діла

коментувати підхід по всьому нема сенсу, можна цю рибу готувати по різному на власний смак

Але раз вже це містер сінйор+ в паблік відкриває якісь ендпойнти свого телевізора на магічних секретних портах, про які ніхто не здогадається

> Боти зазвичай сканують стандартні порти: 80, 443, 3000, 5000, 8000 і т.д.

Сканується все. Так шо це не про «існує імовірність», а про гарантовано.

От не треба відкривати порти у власний телевізор/хату.

> Обмеження: на рівні телевізора чи роутера firewall часто неможливо налаштувати.
Можна використовувати фізичний firewall, підключений по LAN, але для гігабітного інтернету це дорого.

Наскільки я бачу по олх, ціни на бу мікротік починаються від 350 грн :)

Я перевіряю по доступності відеокамер в будинку. Деякі увімкнуті до резервної системи і завжди доступні.
Інші без резервної системи і не працюють коли нема світла.

Але якщо світла довго немає то доступ до інтернету може впасти (в провайдера розрядилися акумулятори). Тоді всі камери не доступні.

Якщо я вдома, то я і так знаю, що світла нема.

Якщо я не вдома, то мені байдуже, чи є там світло чи ні.

показує реальний стан світла вдома, а не теоретичний графік

Щоб що?

Щоб що?

теж не зрозумів кейс, коли потрібно знати чи є світло чи ні, коли ти не в дома)

Тобто, якщо ви на вулиці з дитиною, а світла нема, то ви йдете до друзів? Вони постійно зі світлом та постійно вдома? Чи у вас і на цей випадок є трекер? :)

Щоб що?

Коли псові нема чим зайнятись він лиже собі яйця.

Покажу тоді трохи свого вайбкоду по темі зі світлом:

1. Copilot + Sonnet 4.5. Збирання статистики по відключеннях з ТГ-каналу будинку, і формування різного роду графіків щоб дивитись як змінюється ситуація. Було в планах накладати на це графік відключень щоб порівнювати, але не знайшов де його можна витягнути за минулі дати в зручному форматі. Якщо хтось знає напишіть.
Посилання: rusovoi.electricity-stats.dns-cloud.net

2. Тут вже більше практичної користі, можливо навіть зроблю окремий пост про нього. Copilot + Opus 4.6 (так зроблено за 2 дні). Задача покращити прогноз використання інвертора встановленого в будинку для насосів води, тепла, ліфтів. Для нашого будинку автоматично підтягує дані по нашій батареї і розклад від ДТЕК, для інших є manual mode.
Дозволяє вбити потрібні дані і змоделювати різні ситуації по використанню приладів, щоб обрати на що саме вистачить сьогодні, скільки годин запускати ліфти щоб і не залишитись без заряду передчасно і опинитись без тепла і води, але й не тримати їх вимкненими хоча їх би цілком вистачило на нормальне викорстання. Короче як на мене вийшло добре, вже 2 дні користуємось у будинку з головою кооперативу, і поки прогнозує воно добре. Сьогодні навіть ліфти працювали 7 годин замість 4 бо не боялись опинитись порожніми.
Посилання: rusovoi.electricity-stats.dns-cloud.net/battery-calculator

Ну і бонусом окрема сторінка для жителів будинку з необхідною для них інформацією: rusovoi.electricity-stats.dns-cloud.net/...​ttery-calculator/#/status

Якщо є ідеї покращення цього функціоналу, досвід налаштування подібного то буду вдячний за корисні поради

А в телеграмі хіба є дані у зручному форматі?

Мені не подобається ідея зі статичною адресою. Якщо б статична адреса була, то я б напевно просто використав світлобот.
Для себе я зробив трохи по-іншому:
Створив бота в телеграм з http вебхуком. Задеплоїв його на безкоштовному інстансі на Render. Під цей інстанс вже є статична адреса куди можна надсилати пінги.
На роутері mikrotik засетапив скріпт(команду) який час від часу супер-друпер секурно кидає хартбіт боту по http.
Коли бот довго не бачить хартбіта від роутера, бот бачить що світла немає.
В принципі, працює ок. Але пізніше підживив роутер дбж і воно вже не працює, тому скрипт в ідеалі треба крутити на девайсі без резервного живлення.

Є healthcheck.io з мільйоном інтеграцій, можна й telegram, і webhook

Так ще краще, шоб свої велосипеди не вигадувати

Мені не подобається ідея зі статичною адресою.

А що саме не подобається ?

Щодо відправки запитів з роутера на сервер, то ідея цікава. Не потрібно мати статичну IP-адресу. Достатньо просто запустити скрипт, який з певним інтервалом дає про себе знати. Концептуально нічого поганого не бачу.

А якщо роутер MikroTik повністю вимкнеться, а потім увімкнеться, нехай, за годину, то він буде відправляти запити на сервер?

Але цей підхід не буде працювати для мене, оскільки в мене звичайний роутер, на якому неможливо запускати будь-які скрипти.

Щодо інтеграцій з healthcheck.io чи Світлоботом, то я ніколи про них не чув. Не бачу для себе необхідності інтегруватися із зовнішніми сервісами з таких причин: я віддаю свою IP-адресу незрозуміло кому, і незрозуміло, як саме будуть використані мої дані. Можливо, вони збирають інформацію по всій Україні: у кого є світло, а в кого немає. Хто його знає, таку інформацію потрібно перевіряти.

Також на розробку всього застосунку з Telegram-ботом я витратив до чотирьох годин. Якби розробка цього застосунку була невиправдано довгою, тоді загалом можна було б розглядати якісь інтеграції, але в моєму випадку це не потрібно.

А що саме не подобається ?

Не подобається що її треба мати -> треба платити за то провайдеру.
Враховуючи що то було зроблено на колінці за декілька годин, чисто від нудьги і без якоїсь суттєвої потреби, то це мене ще більше харило і я відмовився від такого підходу. Претензій до вашої імплементації не маю.

А якщо роутер MikroTik повністю вимкнеться, а потім увімкнеться, нехай, за годину, то він буде відправляти запити на сервер?

Так, звісно. Він відправляє пінг кожні N секунд/хвилин як тільки потрапляє у мережу. Там крон прям з адмінки можна засетапити, або з консолі. Є навіть історія відпрацьованих тасок.

Щодо мого випадку, то статична адреса йшла мені у подарунок з гігабітним інтернетом.
Та і є потреба перевіряти наявність світла.

Я для свого ЖК теж робив шось подібне, але в якості джерела даних взяв смарт розетку Tapo, до якої є API і купа готових ліб.
github.com/dixydo/powerbot

Цікаво, я поверхнево переглянув репозиторій. Виглядає, що теж нещодавно почали над цим працювати, але вже багато зроблено. Це рішення вже інтегровано? Чи користуються ним мешканці ЖК?

700+ активних користувачів, «в проді» уже більше місяця.

Якось ну дууууууже складно вийшло.

Поділюсь своїм досвідом реалізації подібної фігні.

1. Статичного айпі провайдер не надає. Та воно нам і не треба.
2. Веб морда нафіг не треба. Єдина причина чому вона потрібна — «я фронтендер тому буде вебморда».

Відкриваємо чат жпт і ставимо задачу: «напиши сервіс на мові С який раз на три секунди пінгує ip1(якась розумна розетка) та ip2(посудомийка чи ще щось). Якщо обидві адреси не пінгуються — надішли через бот в телеграм сповіщення. Порахуй скільки було\не було світло і напиши про це в сповіщенні.».

В результаті маємо 100 рядків коду. Компілюємо і в авторан на роутер закидуємо. ГОТОВО.

Ну і так, після ШІ треба код очима пробігти шоб не було відвертої фігні, бо він може...

Є ж monit, навіщо велосипеди винаходити

та воно ж якби на роутері ресурси не безмежні шоб ставити всякий monit. дешевше навайбкодити мікроап.

У нас на будинку IP камера. Я просто накидав простенький скріпт, який запускається щохвилини, і пінгує камеру. Якщо вона в мережі — пише в файлик одиничку. Якщо нема — пише нулик. Про зміни стану рапортує в телеграм

Просто, безкоштовно, дієво, і зайняло годину часу

Можливо простіше пінгати, наприклад, телевізор по cron та відправляти повідомленя в телеграм?

#!/bin/bash

host="192.168.1.2″
flag="/tmp/$host.msg"
location="street, 1a"

if ping -c 2 “$host” &>/dev/null; then
# ONLINE
if [ -f “$flag” ]; then
/usr/bin/telegram-send-svitlo “💡👍%0AElectricity present%0A${location}”
rm -f “$flag”
fi
else
# OFFLINE
if [ ! -f “$flag” ]; then
/usr/bin/telegram-send-svitlo “💡👎%0ANo electricity%0A${location}”
touch “$flag”
fi
fi

З того, що я бачу, то цей скрипт відправляє ping на локальне IP телевізора (який має мати статичну локальну адресу, щоб при включенні/виключенні телевізора роутер через DHCP не присвоював нову адресу). Якщо статус змінюється, скрипт повідомляє про це в Telegram і виконується з певним інтервалом через cron. Щоб код працював, його потрібно захостити десь у локальній мережі. При цьому девайс, який виконує цей код, повинен мати постійний доступ до інтернету, навіть коли немає світла, і не вимикатися при відключенні електрики. Телевізор, навпаки, має вимикатися, коли пропадає світло. Залишилось зрозуміти лише: де саме хостити цей код?

Так все вірно, в моєму випадку це Raspberry Pi на якому крутится автоматизація Home Assistant та ще безліч всього для HomeLab з постійним живленням на 12в.
Але поки писав, подумав, що таку схему з повідомленням можна і через mikrotik налаштувати, там здається є scheduler.

Якщо є home assistant, то нащо скріпти-пінги, тобто в самому ha є інтеграції для пінгує та ватцапу-телеграму. Є в мікротіку шедулер, пінги, можна смикати rest телеграму для відправлення повідомлення. На багато інших роутерів можна поставити openwrt та мати там cron та інші плюси Linux сервера.

Щоб код працював, його потрібно захостити десь у локальній мережі

Не обов’язково. Zerotier допоможе мати доступ до пристроїв у локальній мережі ззовні. Без білого IP dou.ua/forums/topic/41194

Не можу не погодитися: ідея класна, та ще й практична 🙂

А я дивлюсь або в додаток EcoFlow, або в телеграм-канал будинку на сервісі svitlobot.in.ua

Тут залежить від потреб. Додаток екофлов — це якщо виключно для себе, а не ще й для сусідів, а світлобот зараз не працює. Втім, описане автором рішення поки що теж лише для себе, телеграм-бот вирішує цю проблему

Є декілька аналогів світлоботу, та і він запрацює знову, сподіваюсь

Ну я теж свого зробив, поки світлобот не працює, пише в той же канал. Але так, думаю аналогів вистачає, треба тільки пошукати

Втім, описане автором рішення поки що теж лише для себе

Я користуюся цим рішенням вже близько тижня, і загалом воно мені подобається. Я також додав можливість масштабування, для якого потрібен налаштований девайс або роутер, публічна IP-адреса та відповідний IPv4+Port. Щоб додати ці дані, необхідно зайти у відповідний Telegram-бот, натиснути /start і надіслати IPv4+Port. Після цього я отримую дані і додаю їх у .env файл.
Приклад запису в .env:

TARGETS=’[{"id":"","ipv4":"","port":"","channelIds":[""]}]’

Я не планую додавати базу даних, оскільки це не комерційне рішення і не призначене для широкого кола користувачів. Я додам лише кількох друзів. Після конфігурації вони можуть натиснути у боті /getUrl і отримати посилання у форматі:

site.com?id=uniqueId

Фотографії або повідомлення про наявність/відсутність світла будуть приходити від бота напряму, а не у групу. Якщо друг захоче отримувати повідомлення у групі, достатньо буде додати channelId цієї групи у конфігурацію.

Чергова безтолкова фігня

як пет-проджект — чудово

Підписатись на коментарі