суббота, 22 февраля 2020 г.

Domoticz. Google Assistant

Пришло время научить Domoticz управлять устройствами голосом. В доме, где много места и много выключателей, не хочется лишний раз бегать, чтобы потушить свет.
В своё время уже делал подобное управление через плагин для Tasker'а Auto Voice. На стареньком планшете Asus Nexus, команды выполнялись с задержкой 5-10 секунд и не было никакой связки с устройствами Domoticz. Зато систему можно было очень гибко настроить под себя в плане общения голосом.
Сейчас Auto Voice опять заработал, но чтобы выполнять команды через "Ок Гугл", надо дополнительно говорить "Попроси AutoVoice". Гугл понимает меня раза с пятого. Частенько путает с "Попроси автобус".
Сегодня на форумах Domoticz есть две популярные ветки про управление голосом DZ.
Первая - это проект на GitHub dzga, второй - платный облачный сервис Controlicz.



Я решил поэкспериментировать с dzga. Всё таки сервера гугла не так часто падают, в отличие от частных. К тому же, регистрации надо фактически предоставить доступ стороннему сервису к своему серверу DZ. Подумайте над этим. Тем более, разработчика dzga всегда можно поймать на канале Discord и задать вопрос, если что-то не работает.

Для корректной работы Domoticz Google Assistant (далее dzga) нам нужен linux-сервер с установленным python версии старше 2.7. Желательно (но не обязательно) иметь выделенный IP-адрес или доменное имя, чтобы сервер Google всегда мог видеть ваш сервер с мира.
Я уже писал, что у ротеров Keenetic есть охренительная фича - доменное имя 4 уровня. Это значит, что мы можем выпустить наш новый сервер dzga в мир по адресу dzga.xxxxx.keenetic.pro без всяких проблем с белым IP.

Ок. Проверяем текущую версию python
python --version
Если меньше 2.7 - устанавливаем
sudo apt install python3
Опять проверяем версию. Если отображается старая, меняем.

Предположим, что у нас уже есть сервер Domoticz с настроенными и корректно работающими устройствами. Чтобы управлять ими при помощи голоса, настроим на этом же сервере (да, с этим всё ещё хорошо справляется Raspberry Pi 3B) dzga-сервер (Domoticz Google Assistant).
На странице проекта dzga есть скрипт автоматической установки
bash <(curl -s https://raw.githubusercontent.com/DewGew/dzga-installer/master/install.sh)

Если автоматом не установился, ставим вручную. У меня были проблемы с некоторыми пакетами для python из списка Domoticz-Google-Assistant/requirements/pip-requirements.txt
Всё решается (обычно) обновлением pip до последней версии.
Ок, dzga установили - запускаем
sudo service dzga start
И переходим через браузер на http://localhost:3030/settings
Настройки можно менять либо через веб-морду dzga
Либо через консоль
nano Domoticz-Google-Assistant/config/config.yaml
Бывает, от неверных настроек в config.yaml сервис не взлетает, и единственным способом всё исправить остается редактирование через консоль. Поэтому рекомендую сразу делать всё через nano. Также сразу советую настроить подробное логирование работы сервиса
loglevel: 'Debug'
logtofile: Overwrite
pathToLogFile: /tmp
Логи будем теперь смотреть в /tmp/dzga.log
Пробегитесь по конфигу, проверьте секцию # Domoticz Settings: 
Отлично. После внесения настроек, перезапустите сервис dzga и проверьте что всё работает.
sudo service dzga restart
Откроем доступ нашему сервису по порту 3030 в мир. Делаем так, если у вас роутер keenetic. Иначе, можно настроить реверсивный прокси. Теперь будем настраивать часть Actions on Google.
1. Переходим на Actions on Google (нужен аккаунт на google)
Создаём новый проект - New Project
Вводим имя проекта и выбираем языковые настройки
Далее выбираем Smart Home
Переходим в раздел Develop в верхнем меню и попадаем в Invocation
Набираем имя приложения (оно будет в списке выбора Google Home) и сохраняем Save.
2. Добавляем запрос на синхронизацию и состояние отчета при помощи служебной учетной записи (необязательно, но рекомендуется)
Переходим в Google Cloud Control вашего нового проекта
(убедитесь, что выбран именно ваш проект - выделил желтым)
Включаем Google Home Graph
Возвращаемся на Google Cloud Control
Жмём Создать Учётные данные > Сервисный аккаунт
Вводим произвольное название аккаунта, жмём Создать
Далее выбираем Роль созданного аккаунта Сервисные аккаунты > Создатель токенов сервисного аккаунта. Жмём Продолжить.
 Жмём Создать Ключ. Тип ключа JSON > Создать. Загружаем файл с расширением .json и сохраняем его в директорию Domoticz-Google-Assistant/config/ под именем smart-home-key.json
3. Осталось чуть-чуть. Переходим опять на Actions on Google
Выбираем в списке наш проект DZGA
Переходим в верхнем меню во вкладку Develop > Actions
В поле Fulfillment URL вводим имя нашего сервера https://dzga.xxxxxx.keenetic.pro/settings
Жмём Save.
В левом меню переходим на Account Linking

Заполняем
Client ID issued by your Actions to Google
sampleClientId
Client secret
sampleClientSecret
Authorization URL
https://dzga.xxxxxx.keenetic.pro/oauth
Token URL
https://dzga.xxxxxx.keenetic.pro/token
Жмём Save. И нажимаем кнопку Test в правом верхнем углу. Уфф, всё.

Берём в руки планшет\телефон и устанавливаем приложение Google Home.
Выбираем Плюс в верхнем левом углу > Set up device > Works with Google > [test] My Devices
Google Home пойдёт по адресу https://dzga.xxxxxx.keenetic.pro/ и попросит ввести логин\пароль для входа в DZGA (по умолчанию это admin\admin)


После того, как увидели все устройства в Google Home, пробуем произнести "ОК ГУГЛ, выключи %имяустройства%. Это конечно, если у вас уже настроен Google Assistant. Дальше начинаете допиливать имена устройств, расположений их в помещениях (можно через config.yaml) и прочие мелочи.

Небольшие советы. 

Если после перезапуска dzga, ничего не происходит - заглядываем в лог файл. По веб-морде вообще не поймёшь что пошло не так. Если после sudo service dzga restart логи не пишутся - значит где-то ошибка в конфиге. Очень часто проблема в синтаксисе yaml-файла. Я это оценил ещё со времён настройки сети в netplan. Лишний пробел и всё поехало по борозде.

На русском языке параметры ask: true и параметр report state: true не работают.
Устройства пропадут из Google Home, если мы помечаем их в Domoticz как неиспользуемые.

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

Если после многочисленных правок имен устройств в Domoticz и в DZGA устройства видятся по-разному, отвяжем и заново привяжем [test] My Devices в Google Home.

Если ты ступил, и не договорил фразу "Выключи свет в ..., эммм" не указав где, чуткий гугл выключит (переключит в статус выкл) ВСЕ ПЕРЕКЛЮЧАТЕЛИ. То ещё представление.

Чтобы гугл меня постоянно слушал, я поставил планшет и пытался настроить его так, чтобы Google Assistant всегда меня слушал и по команде ОК ГУГЛ был готов. Но с некоторых пор, функция Voice Match (разблокировка устройства по твоему голосу) не работает. Ни на Huawei T3, ни на Xiaomi Redmi 3S. Раньше работала, инфа 100%. Единственным решением в этом  случае будет включить функцию "Не блокировать устройство, когда оно заряжается" (кажется так) в меню "Для разработчиков". Всё равно планшет висит на стене и подключен к зарядному устройству.

Очень удобно управлять голосом фасадным освещением (прожектором). К нам на задний двор регулярно прибегает лиса и смотрит на нас через большие окна. А мы не успеваем её разглядеть в ночи, когда начинаем судорожно искать телефоны или бежать к выключателю - она успевает удрать! Также, бегая из комнаты в комнату, или поднимаясь на второй этаж - ОК ГУГЛ, выключи свет на первом этаже. Или Выключи телевизор. К этому быстро привыкаешь.

Ещё не установил Domoticz? Пора начинать

Комментариев нет :

Отправить комментарий