Есть устройство - Яндекс.Станция Есть домофон, управляемый с помощью мобильного приложения "Мой умный дом", разработанного компанией Уфанет
Хотелось сделать что-нибудь, чтобы Алиса открывала дверь домофона.
С помощью mitmproxy расковырял авторизацию мобильного приложения перед API ufanet. На Python+Fastapi+Postgres нарисовал сервис с API, который может регистрировать двери в БД Postgres и открывать их по команде Алисы. Сервис запаковывается в Docker-контейнер и может быть доступен через https. Сертификат для домена получаем от LetsEncrypt. Сервис хостится на gandi.net
Файл .env.prod содержит переменные окружения для проекта в виде ENV_VAR=VALUE
- DEBUG - True - включает отладочные логи (По умолчанию - False)
- DB_CONNECTION - строка подключения к БД postgres: postgresql://postgres:postgres@:/postgres
- OPENAPI_JSON_URL - OpenAPI json URL - путь к json файлу OpenAPI (по умолчанию - пустая строка, если надо чтобы OpenAPI было доступно - здесь должен быть URL, например "/openapi.json")
- OPENAPI_DOCS_PATH - путь Swagger ui (по умолчанию - пустая строка, если надо чтобы Swagger UI было доступно - здесь должен быть URL, например "/docs")
- OPENAPI_REDOC_PATH - путь ReDoc ui (по умолчанию - пустая строка, если надо чтобы ReDoc UI было доступно - здесь должен быть URL, например "/redoc")
- RESTRICTED_PATH_Х - (Х = 1, 2, 3, и т.д.) - URL API с ограниченным доступом - например: /domofon/register*
- ALLOWED_HOSTS_FOR_PATH_1 - (Х = 1, 2, 3, и т.д.) - список хостов, которым разрешен доступ к API RESTRICTED_PATH_Х - например: 127.0.0.1,localhost,192.168.0.*
- API_KEY - ключ API gandi.net
- CERTBOT_DOMAIN - домен, для которого получаем/обновляем сертификат LetsEncrypt, например api.example.com
- Делаем git clone с этого репозитория например, в папку, /opt
- Устанавливаем cretbot, например:
sudo apt install certbot
- Запускаем скрипт создания системного кронтаба:
sudo ./certbot-crontab-create.sh
- Создаем контейнер: Делаем
docker-compose -f docker-compose-prod.yml build
- Создаем сервис systemd, который будет запускать контейнер: кладем файл domofon.service в директорию /etc/systemd/system
- запускаем БД:
docker-compose -f docker-compose-prod.yml up -d db
- выполняем скрипты миграции:
alembic upgrade head
- останавливаем сервис :
docker-compose -f docker-compose-prod.yml down
- Запускаем сервис:
sudo systemctl start domofon
- Регистрируем дверь в нашем сервисе: Выполняем POST запрос
https://local_service_host:8000/api/v1/domofon/register
с заголовком
Content-type: application/json
и телом
{
"door":
{
"door_id" : <ID двери (придумайте сами)>,
"ext_door_id" : "",
"ext_user": <login в приложении "Мой умный дом">,
"ext_password" : <пароль в приложении "Мой умный дом">
}
}
- Если наш хост находится за NATом - пробрасываем на роутере порт на хост с нашим сервисом
- Создаем в Алисе навык, прописываем туда ссылку на наш сервис с параметром - ID двери, публикуем навык
https://<remote_service_domain>:8000/api/v1/domofon/aliceopen?door_id=<ID двери>
- Если все получилось, то на кодовую фразу, например, "Алиса, попроси домофон открыть дверь" - дверь домофона открывается.