Tuya Smart Lock

PHP Vanilla JS Tuya OpenAPI IoT REST API

Самостоятелно PHP + JavaScript уеб приложение за управление на смарт брава (Tuya / Smart Life) през Tuya Cloud OpenAPI, без външни зависимости. Статус и батерия, дистанционно отключване/заключване, история на отключванията, офлайн временни пароли, потребители с постоянен код, именуване на отпечатъци/карти/кодове, одобряване на заявка от вратата и имейл известия при аларма. Поддържа няколко брави.

README: PHP 8.1+ (curl, json), без Composer зависимости; src/TuyaClient.php, SmartLockService.php, Auth.php, AlarmMonitor.php; public/api.php JSON API (devices, status, logs, unlock, lock, passwords, temp-password, reply-request); bin/monitor.php за имейл известия; tests/run.php.

Проблем / контекст
Приложението Smart Life не дава удобен начин да се виждат и именуват кой с какво е отключил, да се раздават временни кодове и да се получават известия по имейл, нито API, което да се вгради в друга система (напр. Laravel).
Моята роля
Цялостно: TuyaClient с HMAC-SHA256 подпис (v2), кеширан токен и retry при изтекъл токен; SmartLockService (статус, unlock/lock с ticket → door-operate и fallback, логове, кодове, временни пароли); JSON API + фронтенд на чист JS; защита с bcrypt парола, CSRF и заключване след 5 грешни опита; audit log; cron монитор за аларми с имейл; тестове с fake transport.
Предизвикателство
Бравата е на батерии и „спи“ — изпълнява команди само когато е будна; постоянните кодове трябва да се криптират с ticket ключа; лимитът на заявки към Tuya API е малък; а през тази връзка минава отключването на входната врата.
Подход / решение
Ticket-базирано отключване с fallback към open-door; офлайн временните пароли се изчисляват в cloud-а и работят без бравата да е онлайн; polling за заявка от вратата само докато табът е видим и до 10 мин; проектът стои извън web root (видима е само public/), задължителен HTTPS и никога изключена проверка на сертификата.
Табло на бравата — статус, батерия, отключване/заключване, временна парола
Табло на бравата — статус, батерия, отключване/заключване, временна парола
Потребители с постоянен код — добавяне (7 цифри) с валидност и изтриване
Потребители с постоянен код — добавяне (7 цифри) с валидност и изтриване
История на отключванията с именуване на кодове, карти и отпечатъци
История на отключванията с именуване на кодове, карти и отпечатъци