Идея появилась после того как забыли пару раз закрыть входную дверь. Суета дает о себе знать. Как результат ключи в кармане (еще лучший сценарий), а дверь просто захлопнута.
Посмотрел системы умного дома в готовых наборах, все вроде круто но ведь и стоит денег. К тому же жостко привязано к своей экосистеме и обычно все только облачное. Завтра бахнут санкции и соси лапу с сервером в Китае.
Ключевые требования:
- Минимум проводов. На улице 2025 год, а нам предлагают тянуть кабель по всему дому (с уже сделанным ремонтом). Кабель надежно, но напряжно
- Возможность управлять в локальной сети
- Открытое API для устройтва
- Поддержка Home Assistant
Оборудование будет наращиваться по мере необходимости и наличия бюджета. Пока что имеем следующее:
- Shelly 1 Gen3 — реле управления замком
- Shelly «Blu Button1» — кнопка открытия
- ATIS Exit-PNT — кнопка открытия проводная
- Shelly BLU Motion — датчик движения
- Электромагнитный замок YM-350N
- Блок питания Mean Well LRS-100-12
- Пару браслетов Xiaomi Smart Band
Принцип работы
- При появлении в зоне действия браслета(Xiaomi Smart Band) дверь(Shelly 1 Gen3) открывается на заданное время
- Если браслет постоянно в зоне действия, дверь не открывается. Нужно сначала покинуть зону, и снова вернуться. Минимум 1 мин
- Для выхода с помещения используем датчик движения(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