Умный дом. Входная дверь

Идея появилась после того как забыли пару раз закрыть входную дверь. Суета дает о себе знать. Как результат ключи в кармане (еще лучший сценарий), а дверь просто захлопнута.

Посмотрел системы умного дома в готовых наборах, все вроде круто но ведь и стоит денег. К тому же жостко привязано к своей экосистеме и обычно все только облачное. Завтра бахнут санкции и соси лапу с сервером в Китае.

Ключевые требования:
  1. Минимум проводов. На улице 2025 год, а нам предлагают тянуть кабель по всему дому (с уже сделанным ремонтом). Кабель надежно, но напряжно
  2. Возможность управлять в локальной сети
  3. Открытое API для устройтва
  4. Поддержка Home Assistant

Оборудование будет наращиваться по мере необходимости и наличия бюджета. Пока что имеем следующее:

  1. Shelly 1 Gen3 — реле управления замком
  2.  Shelly «Blu Button1» — кнопка открытия
  3. ATIS Exit-PNT — кнопка открытия проводная
  4. Shelly BLU Motion — датчик движения
  5. Электромагнитный замок YM-350N
  6. Блок питания Mean Well LRS-100-12
  7. Пару браслетов Xiaomi Smart Band
Принцип работы
  1. При появлении в зоне действия браслета(Xiaomi Smart Band) дверь(Shelly 1 Gen3) открывается на заданное время
  2. Если браслет постоянно в зоне действия, дверь не открывается. Нужно сначала покинуть зону, и снова вернуться. Минимум 1 мин
  3. Для выхода с помещения используем датчик движения(Shelly BLU Motion) или физическую кнопку(ATIS Exit-PNT).
Схема подключения
Умный дом. Подключение входных дверей
Софтовая настройка

Скрипт с разрешенными Мак адресами устройств (фитнес браслеты)

let allowedMACs = [
  "00:00:00:00:00:00", //Мак адрес
  "00:00:00:00:00:00"
];

let minRSSI = -75;
let cooldown = 1 * 60 * 1000; // 5 минут в мс
let lastSeen = {};
let triggered = false;

BLE.Scanner.subscribe(function (ev, res) {
  if (!res) return;

  let mac = res.addr.toLowerCase();
  let rssi = res.rssi;
  let now = Shelly.getComponentStatus("sys").unixtime * 1000;

  // Проверка: MAC разрешённый
  let found = false;
  for (let i = 0; i < allowedMACs.length; i++) {
    if (mac === allowedMACs[i]) {
      found = true;
      break;
    }
  }
  if (!found || rssi < minRSSI) return;

  let last = lastSeen[mac] || 0;
  let since = now - last;

  // Реагировать только если браслета не было дольше cooldown
  if (since > cooldown && !triggered) {
    print("✅ Устройство вернулось:", mac, "| RSSI:", rssi);
    triggered = true;

    Shelly.call("Switch.Set", {
      id: 0,
      on: true,
      toggle_after: 15
    });

    Timer.set(15000, false, function () {
      triggered = false;
    });
  }
  // Обновить время последнего появления
  lastSeen[mac] = now;
});

Заключение

Систем работает, тестирую. To be continued

Наверх