SvitloPulse

Датчик світла вдома

Будь-який пристрій, що живиться від розетки й виходить в інтернет, може раз на хвилину «пінгувати» SvitloPulse. Коли пінги зникають, світла, найімовірніше, немає.

Що це

Це найсильніший незалежний сигнал, який ми враховуємо: пристрій сам повідомляє, що живлення є. Запит такий простий, що його можна зробити з роутера, мікрокомп’ютера, плати за 3 долари чи з Home Assistant.

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

Приватність

  • Окремі датчики ніколи не показуються: ні на карті, ні в API. Публічні лише агрегати від п’яти й більше датчиків однієї черги, із затримкою щонайменше 30 хвилин.
  • Датчик прив’язаний до черги, а не до адреси. Ми не просимо адресу, ім’я, телефон чи геолокацію.
  • Адреса пінгу містить секретний токен: це пароль датчика. Не публікуйте його в репозиторіях і скриншотах. Якщо токен потрапив не туди, видаліть датчик нижче й створіть новий.
  • Показники датчиків видаляються автоматично через 48 годин. Докладніше: приватність.

Створити датчик

Інтервал визначає, як швидко ми помітимо, що пінги зникли.

Підключення пристрою

Оберіть спосіб. Скрізь є адреса пінгу: до створення датчика в ній стоїть YOUR_TOKEN, після створення стане ваш токен.

  1. Підключіться до роутера по SSH і встановіть curl із підтримкою HTTPS (на OpenWrt це пакети curl, ca-bundle).
  2. Додайте завдання в cron і запустіть cron.
OpenWrt · SSH
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 і додайте рядок:

crontab
__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 й раз на інтервал відправляє запит.

Arduino · ESP32 / ESP8266
#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 і новіший):

configuration.yaml
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_ping

Home Assistant на NAS чи міні-ПК із ДБЖ «бачить» світло навіть під час відключення. Це не датчик, а помилковий сигнал «є світло».

Перевірити, що датчик працює, можна однією командою. Сервер відповідає кодом 204 без тіла. Підходить і GET, і POST.

curl
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, провайдер чи сам пристрій. Тому один датчик нічого не вирішує, а збіг кількох сусідських датчиків — вирішує.
  • Резервне живлення (ДБЖ, інвертор, павербанк, генератор) дає хибне «світло є». Підключайте датчик до розетки без резерву.
  • Сигнал лише коригує оцінку за графіком оператора, його вплив обмежений. Дивіться «Як це працює».
  • Не підключайте чужі пристрої й не створюйте кілька датчиків для однієї оселі: це не додає точності, а лише спотворює картину.