Датчик світла вдома
Будь-який пристрій, що живиться від розетки й виходить в інтернет, може раз на хвилину «пінгувати» SvitloPulse. Коли пінги зникають, світла, найімовірніше, немає.
Що це
Це найсильніший незалежний сигнал, який ми враховуємо: пристрій сам повідомляє, що живлення є. Запит такий простий, що його можна зробити з роутера, мікрокомп’ютера, плати за 3 долари чи з Home Assistant.
Допомагає точності лише тоді, коли так роблять багато сусідів. Один датчик нічого не змінює публічно: сигнали з’являються, коли їх надсилають щонайменше п’ять незалежних джерел однієї черги, і з затримкою.
Приватність
- Окремі датчики ніколи не показуються: ні на карті, ні в API. Публічні лише агрегати від п’яти й більше датчиків однієї черги, із затримкою щонайменше 30 хвилин.
- Датчик прив’язаний до черги, а не до адреси. Ми не просимо адресу, ім’я, телефон чи геолокацію.
- Адреса пінгу містить секретний токен: це пароль датчика. Не публікуйте його в репозиторіях і скриншотах. Якщо токен потрапив не туди, видаліть датчик нижче й створіть новий.
- Показники датчиків видаляються автоматично через 48 годин. Докладніше: приватність.
Створити датчик
Збережіть токен зараз
Ми покажемо його лише один раз. Закриєте сторінку: відновити його неможливо, лише видалити датчик і створити новий.
Команди нижче вже містять ваш токен. Після приховування вони знову покажуть шаблон.
Підключення пристрою
Оберіть спосіб. Скрізь є адреса пінгу: до створення датчика в ній стоїть YOUR_TOKEN, після створення стане ваш токен.
- Підключіться до роутера по SSH і встановіть curl із підтримкою HTTPS (на OpenWrt це пакети
curl,ca-bundle). - Додайте завдання в cron і запустіть cron.
opkg update && opkg install curl ca-bundle
echo '__CRON__ curl -fsS -m 10 "https://svitlopulse.andrewboyko.name/api/v1/sensor/YOUR_TOKEN/ping" >/dev/null 2>&1' >> /etc/crontabs/root
/etc/init.d/cron enable
/etc/init.d/cron restartРоутер має бути без резервного живлення, інакше він «побачить» світло, якого вже немає. Якщо curl не вміщається в пам’ять, замість нього працює uclient-fetch (пакет libustream-mbedtls).
Підходить для Raspberry Pi, мініПК, NAS і будь-якого Linux. Виконайте crontab -e і додайте рядок:
__CRON__ curl -fsS -m 10 "https://svitlopulse.andrewboyko.name/api/v1/sensor/YOUR_TOKEN/ping" >/dev/null 2>&1Якщо пристрій на ДБЖ чи блоці живлення з акумулятором, він далі «пінгуватиме» під час відключення. Для датчика підходить розетка без резерву.
Скетч для Arduino IDE чи PlatformIO. Працює на ESP32 і ESP8266, тримає з’єднання з Wi-Fi й раз на інтервал відправляє запит.
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#else
#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#endif
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASSWORD";
const char* PING_URL = "https://svitlopulse.andrewboyko.name/api/v1/sensor/YOUR_TOKEN/ping";
const unsigned long EVERY_MS = __MS__UL;
void setup() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
#if defined(ESP8266)
BearSSL::WiFiClientSecure client;
#else
WiFiClientSecure client;
#endif
client.setInsecure(); // simplest; for production pin the root CA with setCACert()
HTTPClient http;
if (http.begin(client, PING_URL)) {
http.setTimeout(8000);
http.GET(); // 204 = accepted
http.end();
}
}
delay(EVERY_MS);
}Живіть плату від звичайного USB-адаптера в розетці, без павербанка. setInsecure() не перевіряє сертифікат сервера; для надійності закріпіть кореневий сертифікат.
Додайте команду і автоматизацію (синтаксис Home Assistant 2024.10 і новіший):
rest_command:
svitlopulse_ping:
url: "https://svitlopulse.andrewboyko.name/api/v1/sensor/YOUR_TOKEN/ping"
method: get
timeout: 10
automation:
- alias: "SvitloPulse: датчик світла"
triggers:
- trigger: time_pattern
minutes: "__HAMIN__"
actions:
- action: rest_command.svitlopulse_pingHome Assistant на NAS чи міні-ПК із ДБЖ «бачить» світло навіть під час відключення. Це не датчик, а помилковий сигнал «є світло».
Перевірити, що датчик працює, можна однією командою. Сервер відповідає кодом 204 без тіла. Підходить і GET, і POST.
curl -fsS -m 10 -o /dev/null -w "%{http_code}\n" "https://svitlopulse.andrewboyko.name/api/v1/sensor/YOUR_TOKEN/ping"
# 204 = accepted
# the same with POST
curl -fsS -m 10 -X POST -o /dev/null -w "%{http_code}\n" "https://svitlopulse.andrewboyko.name/api/v1/sensor/YOUR_TOKEN/ping"Видалити датчик
Чесно про точність
- Зникнення пінгів не завжди означає відсутність світла: могла впасти мережа чи Wi-Fi, провайдер чи сам пристрій. Тому один датчик нічого не вирішує, а збіг кількох сусідських датчиків — вирішує.
- Резервне живлення (ДБЖ, інвертор, павербанк, генератор) дає хибне «світло є». Підключайте датчик до розетки без резерву.
- Сигнал лише коригує оцінку за графіком оператора, його вплив обмежений. Дивіться «Як це працює».
- Не підключайте чужі пристрої й не створюйте кілька датчиків для однієї оселі: це не додає точності, а лише спотворює картину.