Мост из Яндекс УД в MQTT на Node.js.
Приложение позволяет подключать любой умный дом, работающий с шиной MQTT к Яндекс Умный Дом и колонке Алиса.
- Форк проекта lasthead0/yandex2mqtt.
- ... который сам по себе форк проекта munrexio/yandex2mqtt.
- Статья на Хабре к оригиналу.
- Обратите внимание что формат конфигурации изменен (в проекте
lasthead0/yandex2mqtt
, см оригинальный Readme). - Файлы базы данных перемещены в под-папку
./data
, в Docker папка монтируется как Volume. - Файлы настройки устройств и глобальные настройки (такие как ключи, логины и т.п.) - разделены, для того что бы можно было харнить вашу конфигурацию в git, не публикуя секретов.
- Возможность использовать свою функцию в маппинге значений, это позволяет эмулировать
on_off
и другие умения, исходя из статуса устройства (отопление "включено", если термостат больше 15°, шторы "открыты", если открытие > 50% и т.п.). Так же позволяет делать любую конвертацию, например K <-> MIRED. - Возможность использовать один и тот же топик MQTT несколько раз (например, можно сделать для термостата отдельный
property
, который уже используется вcapabilities
, что бы отображать красиво текущую настройку термостата как датчик). - Поддержка относительных значений, например команда
Алиса, сделай теплее
- присылает команду+1
, а не1
, как в оригинале. - Исправление поддержки управления цветовой температурой (в оригнале сломан из-за неправильного формата ответа).
- Сделана поддержка параметров командной строки и поддержка встроенной помощи по
node app.js --help
. - Поддержка Docker и настройки приложения для нормальной работы в git и сохранение базы данных между перезапусками.
- Разделение конфига на общий (который содержит чувствительные данные, такие как логины-пароли и ключи) и устройств, который можно публиковать в git.
- Добавлена вменяемая отладка приложения при помощи логов и модуля debug.
- Исправление множества багов.
- "Белый" IP адрес и домен. Если нет своего домена и белого IP адреса можно воспользоваться Dynamic DNS сервисами (например, noip.com).
- SSL сертификат (самоподписанный сертификат не подойдёт). Для получения сертификата можно воспользоваться https://letsencrypt.org.
Модули самого приложения, как и подключаемые используют модуль debug, вывод отладочных сообщений может быть включен установкой переменной окружения DEBUG=*
.
docker run -e DEBUG='*' -v /tmp/y2m-data:/opt/yandex2mqtt/data ... yandex2mqtt
export DEBUG='*'
node app.js --log debug --cfg ./test/config --devices ./test/devices
Добавлено две "стратегии" логирования: сообщений об ошибках в файл log/error.log
(аргумент запуска --log-error
) и всех сообщений в консоль (--log-info
).
Для запуска y2m с логирование необходимо добавить аргумент запуска в команду запуска в файле настройки служба (раздел ниже) или запустить из консоли.
Заходим в Яндекс Диалоги => Создать диалог => Умный дом
- Название Любое
- Backend Endpoint URL и указываем https://your.domain.ru:port/provider
- Тип доступа Приватный
- Подзаголовок Любой текст
- Имя разработчика Ваше имя
- Официальный навык Нет
- Описание Любой текст
- Иконка Своя иконка
- Авторизация Кнопка "Создать"
- Идентификатор приложения Файл конфигурации clients.clientId
- Секрет приложения Файл конфигурации clients.clientSecret
- URL авторизации https://your.domain.ru:port/dialog/authorize
- URL для получения токена https://your.domain.ru:port/oauth/token
- URL для обновления токена https://your.domain.ru:port/oauth/token
Сохраняем навык. Далее можно работать с черновиком (тестировать навык) или опубликовать его (кнопка "Опубликовать").
На вкладке Тестирование (далее кнопка +(плюс)) необходимо Привязать к Яндексу наш мост, используя имя пользователя и пароль из файла конфигурации (блок users). После этого можно получить список устройств.
Если случается такое, что Алиса получает голосовую команду и не сообщает об ошибке, но при этом топик не меняет своего значения или, при изменении стейта (объекта iob) MQTT топик не публикуется (Алиса не получает нового значения, а сообщает старое) необходимо перезапустить адаптер mqtt.
Аналогичная ситуация может возникнуть, если в качестве топика использовать объект iob созданный вручную. В данном случает адаптер mqtt не будет "знать", что данный объект является топиком mqtt. Для исправления этой ошибки необходимо отредактировать объект iob: зайти в редактирование объекта и на вкладке RAW (EXPERTS ONLY) в json в поле native добавить topic. Пример:
"native": {
"topic": "/yandex/controls/light_BdR_002/state"
}