special

This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Віджет iOS з інформацією, чи є електроенергія вдома

ios-electricity-widget0.png

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

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

Як це працює?

  • Підключення до домашнього пристрою: Віджет налаштовується на перевірку доступності вашого домашнього роутера або іншого пристрою з постійним підключенням до мережі.
  • Перевірка в режимі реального часу: В задані інтервали часу віджет надсилає запити до пристрою.
  • Сповіщення користувача: Якщо пристрій не відповідає, віджет повідомляє вас про можливу відсутність електроенергії.

Переваги використання такого віджета:

  • Своєчасна інформація: Завжди знаєте, чи є світло вдома, що дозволяє планувати свій день більш ефективно.
  • Зручність: Не потрібно дзвонити сусідам або рідним, щоб дізнатися про ситуацію.
  • Спокій душі: Особливо корисно, якщо вдома залишаються діти, літні люди або домашні улюбленці.

Кому це може бути корисно?

  • Працівникам офісів: Якщо ви затримуєтесь на роботі і не впевнені, чи варто повертатися додому прямо зараз.
  • Мандрівникам: Коли ви у відрядженні або на відпочинку і хочете бути в курсі подій вдома.
  • Батькам і опікунам: Для контролю умов проживання близьких людей.

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

Ще до початку війни я відкрив для себе додаток Scriptable — це iOS-додаток, який дозволяє створювати віджети за допомогою JavaScript. Оскільки Тім Кук надав нам можливість додавати віджети на домашній екран, гріх було б цим не скористатися!

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

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

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

widgets11.png

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

Оновлено: Як правильно зазначили в Твіттері [1, 2], віджет фактично перевіряє доступність вашого роутера в інтернеті. Можуть бути випадки, коли електроенергія є, але інтернету немає — тоді віджет все ще буде показувати червоний колір. У мене в таких ситуаціях інтернет з'являвся протягом 5 хвилин, але можливі й інші варіанти.

No-Code?

Спочатку я планував виводити віджет на заблокованому екрані і знайшов додаток Any Text, який підтримує інтеграцію з Shortcuts.

Їх можна запускати за розкладом, але мінімальний інтервал — день.

Якщо я хочу оновлювати віджет кожні 15 хвилин, потрібно створити 96 автоматизацій вручну.

Інших варіантів я не знайшов, тому ідея з no-code швидко відпала.

Що з пінгом роутера?

Найпростіший спосіб перевірити, чи є інтернет вдома — це зробити ping на IP-адресу роутера. Але Scriptable (читай ES6) не підтримує запити по протоколу ICMP. Серед доступних ресурсів я знайшов API, яке робить ping, але там довго чекати на результати — мені достатньо хоча б одного, а не перевіряти відповідь роутера з усіх континентів. Тому виникла потреба створити власний мікросервіс!

Піднімати сервер для одного запиту — не найкраща ідея. Спочатку я подумав про DigitalOcean Functions (аналог AWS Lambda), але виникла проблема з обмеженням кількості запитів у разі необхідності. Раптом недоброзичливці почнуть навантажувати сервіс своїми запитами, як це було з картою тривог.

Тоді я згадав пост (до речі, там теж йшлося про Scriptable), де згадувалось, що в nginx можна писати на Lua. Це виглядало ідеальним рішенням! Тому за кілька хвилин я створив простий ендпоїнт, який робить ping заданої IP-адреси і повертає інформацію про її доступність.

server {
 # ...
 location /ping/ {
 default_type 'application/json';
 content_by_lua '
 local cjson = require "cjson"

 if ngx.var.arg_ip == nil then
 ngx.say(cjson.encode({status="error", error="Передайте IP через ?ip= параметр. Наприклад, ?ip=127.0.0.1"}));
 return
 end

 local ip = ngx.var.arg_ip;
 local chunks = {ip:match("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")}
 if #chunks == 4 then
 for _,v in pairs(chunks) do
 if tonumber(v) > 255 then ngx.say(cjson.encode({status="error", error="Додайте коректний IP в налаштуваннях"})) return end
 end
 else
 ngx.say(cjson.encode({status="error", error="Додайте коректний IP в налаштуваннях"})); return
 end

 local handle = io.popen("ping -c 1 " .. ngx.var.arg_ip .. " -W 0.5", "r")
 local out = handle:read("*all")
 handle:close()
 if string.find(out, "1 received") then
 ngx.say(cjson.encode({status="ok"}))
 else
 ngx.say(cjson.encode({status="error"}))
 end
 ';
 }
}

І все запрацювало!

Ще один варіант реалізації ping

<?php
header('Content-Type: application/json');

// Функция для проверки доступности IP-адреса
function pingAddress($ip)
{
 $output = [];
 // Выполнение команды ping
 exec("ping -c 1 -W 1 " . escapeshellarg($ip), $output, $result);

 // Для отладки: записываем результат выполнения команды и вывод в файл
 file_put_contents(
 '/var/www/USER/data/www/site/ping/ping_debug.txt',
 "IP: $ip\nOutput: " . implode("\n", $output) . "\nResult: $result\n\n",
 FILE_APPEND
 );

 return $result === 0;
}

// Проверяем наличие параметра 'ip' в запросе
if (isset($_GET['ip'])) {
 $ip = $_GET['ip'];

 // Проверка IP-адреса на корректность
 if (filter_var($ip, FILTER_VALIDATE_IP)) {
 if (pingAddress($ip)) {
 echo json_encode(["status" => "ok"]);
 } else {
 echo json_encode([
 "status" => "error",
 "message" => "IP address not reachable"
 ]);
 }
 } else {
 echo json_encode([
 "status" => "error",
 "message" => "Invalid IP address"
 ]);
 }
} else {
 echo json_encode([
 "status" => "error",
 "message" => "IP parameter missing"
 ]);
}
?>

Віджет

Створення віджета виявилося найпростішою частиною.

На основі інших прикладів я швидко зробив віджет, який показує стан та час оновлення.

Код віджета знаходиться у файлі нижче — там всього один запит, відображення його результату та часу генерації, ніяких складнощів!

Що варто знати

Вдома повинен бути статичний IP, адже з динамічним працювати складно.

iOS сама вирішує, коли оновлювати віджет, і робить це, згідно з документацією, в інтервалі від 15 до 60 хвилин. У мене це було кожні 15-20 хвилин. Якщо натиснути на віджет, він оновиться з актуальними даними.

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

Як це зробити?

  1. Статичний IP: Якщо після перезавантаження роутера IP змінюється, потрібно замовити у провайдера послугу статичного IP. Віджет перевіряє одну і ту ж адресу постійно.
  2. Роутер повинен відповідати на ping-запити: Якщо при натисканні на кнопку «Надіслати ping на мій IP» виникає помилка, потрібно знайти в налаштуваннях роутера опцію, яка дозволяє відповідати на пінги з WAN. Зазвичай це можна знайти, загугливши «%назва роутера% Respond to Pings from WAN» і ввімкнути цю функцію.
  3. Встановити Scriptable: Завантажити файл нижче, імпортувати його в Scriptable та замінити IP у першому рядку на свій. Ось відеоінструкція про те, як це зробити.
  4. Створити віджет та додати його на домашній екран.

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

Якщо виникнуть питання або ідеї щодо покращення — пишіть, буду радий допомогти!

Встановлення та використання

 Завантажити віджет архивом із сайту www.shram.kiev.ua

ios-electricity-widget22.png

Via https://vadymklymenko.com/blog/shutdown-ios-widget/


Created/Updated: 01.10.2024

';>