Учим умный дом понимать голосовые команды и отвечать вам (Google Now)
Итак, давно хотел написать эту статью, думаю всем будет интересно "поговорить с своим умным домом", дать ему голосовую команду, и получить от него голосовой ответ.
В данном случае мы будем это делать через Android планшет или смартфон. Коротко алгоритм действий будет такой:
1. Перехватываем все команды "Ок гуггл" или просто по нажатию на "микрофон" гугла.
2. Отправляем полученную команду к нам на сервер в iobroker
3. Получаем обратно ответ, и проговариваем его средствами вашего телефона или Google.
Для начала надо настроить сам Google Now на телефоне, что бы он реагировал на фразу Ok Goole … Делается это в приложении Google (если оно не установлено, ставим его из Play Market).
В Google жмем настройки - Голосовой поиск ...
Озвучивание результатов: Выключить
Voice match: Включите и настройте.. там надо будет записать образец голоса и прочее...
Теперь когда телефон реагирует на Ok Google, нам понадобиться перехватить Google Now команды. Для этого я лично использую приложение Automate или Tasker...В данной статье приведу пример с https://4pda.ru/forum/index.php?showtopic=638842.
Ставим приложение на телефон, и пишем алгоритм, который будет ловить команды Google Now, и отправлять их в наш умный дом.
-
Запускаем Automate и создаем новую программу нажав кнопку +
-
Нажимаем в верхнем левом углу меню, и добавляем блоки: Google Now voice command, Failure catch, HTTP Request, Speak (2 блока).
-
Расставляем блоки согласно схеме которую вы видите ниже.
!
Грубо говоря мы создали алгоритм, при котором…
-
Программа начинает работать
-
Ожидает команды Google Now (голосовой команды в гугл)
-
Передает данные на сервер
-
Если ошибка, мы сделаем что бы проговаривалось что то типа "Нет связи с сервером".
-
Если запрос был выполнен, то проговариваем ответ полученный от умного дома iobroker
Теперь приступим к настройке блоков...
Для начала настроим блок Google Now:
Голосовая команда, которую мы поймаем, должна попадать в какую то переменную, поэтому нажимаем на блок, и в поле Output variables пишем command (такое будет у нас название переменной)… Жмем сохранить блок настроен.
Основной блок который будет передавать данные это HTTP Request:
REQUEST URL: Ссылка куда будет передаваться запрос... А передаваться он будет на ВАШ веб сервер созданный на iobroker (об этом подробно ниже...) у меня это мой домашний IP адрес и порт, на котором я запустил веб сервер ... мой ип адрес:8090 порт вы можете указать другой, т.к. он у вас может быть занят! Веб сервер тоже нужно будет запускать на другом порту… если в iobroker будут ошибки типа "
REQUEST METHOD: тут указываем POST (будем передавать данные POST запросом)
REQUEST CONTENT TYPE: указываем JSON (json данные мы будем передавать)
REQUEST CONTENT: данные которые мы будем передавать а именно переменную command которую мы настроили в блоке Google Now. Но, мы же будем передавать json данные, так что пишем такое: {"cmd": command}
Некоторые настройки пропускаем, либо настраиваем как вам удобно (это для спецов…)
Обязательно включите функцию: Save to variable as text (На скриншотах я забыл её включить!)
В самом низу, нам понадобятся… Output variables, нам же надо сохранить ответ от "умного дома" в какую то переменную...
В поле Response content or filename - вводим название переменной, пусть она будет называться homeanswer, после жмем Done, настройка блока закончена.
Теперь настраиваем блок Speak который будет вызван в случае ошибки (тот что справа).
В поле MESSAGE вводим нашу ошибку "Ошибка связи с сервером"
LANGUAGE: Русский
ENGINE: Синтезатор речи Google
AUDIO STREAM: Music
Теперь настраиваем блок Speak который будет вызван, когда получен ответ от сервера (от умного дома)
Настраиваем его так же как блок выше, только в поле MESSAGE нажимаем иконку fx справа и выбираем переменную homeanswer
Этот блок будет проговаривать полученный от сервера умного дома ответ…
!
Для того что бы ваша программа работала в automate вам надо предоставить ей необходимые права… см. скриншот. Права предоставляются дополнительными модулями automate которые ставятся на смартфон, не пугайтесь.
!
–---------------------------------------
Половина работы закончена, смартфон настроен, теперь будем писать сервер на iobroker и учить его отвечать нашему смартфону!
Нам понадобится дополнительный модуль Javascript: querysting, его мы можем добавить в ручную, в настройках драйвера, см. скриншот.
!
Код сервера… с комментариями. Надеюсь я написал понятно.
// Принимаем команды от Google Now
var http = require('http'); // Подключаем модуль http
var querystring = require('querystring'); // Подключаем модуль querysting в настройках драйвера javascript
var port = 8090;
var s = http.createServer();
s.listen(port);
// Если поступил запрос
s.on('request', function(request, response) {
if(request.method == 'POST') {
processPostData(request, response, function() {
// Расшифровываем JSON запрос, и если ошибка, то выводим её в лог iobroker
var data;
try {
data = JSON.parse(Object.keys(request.post)[0]);
}catch(e) {
console.log('Не удалось разобрать JSON');
console.error(e.name);
console.error(e.message);
console.error(e.stack);
return;
}
// Команда расшифрована, передаем её в функцию обработки...
do_voice_command(data, function(answer){
console.warn(answer); // Выводим в консоль ответ...
response.writeHead(200, "OK", {'Content-Type': 'text/plain;charset=utf-8'});
response.end(answer);
});
});
} else {
//console.log(JSON.stringify(request))
response.writeHead(200, "OK", {'Content-Type': 'text/plain;charset=utf-8'});
response.end("Принимаем только POST запросы", "UTF-8");
}
});
// Основная функция обработки голосовых команд
function do_voice_command(data, callback){
// Для начала ответ равен ничему...
var answer = '';
var cmd = data.cmd.toLowerCase();
console.warn("Команда = " + cmd);
// что ты умеешь?
if(cmd == 'что ты умеешь' || cmd == 'что ты умеешь?' || cmd == 'помощь' || cmd == 'команды' || cmd == 'список команд'){
answer = 'Привет. Я помощник умный дом.' + "\n\n" + 'Я умею, контроллировать температуру, открывать закрывать шторы, управлять пылесосом начиная и завершая уборку, и многое другое. Просто назови команду, и я, исполню её.';
callback(answer);
}
if(!answer.length){
callback('Я не понимаю эту команду.');
}
}
// Функция получения POST запроса
function processPostData(request, response, callback) {
var queryData = "";
if(typeof callback !== 'function') return null;
if(request.method == 'POST') {
request.on('data', function(data) {
queryData += data;
if(queryData.length > 1e6) {
queryData = "";
response.writeHead(413, {'Content-Type': 'text/plain'}).end();
request.connection.destroy();
}
});
request.on('end', function() {
request.post = querystring.parse(queryData);
callback();
});
} else {
callback();
response.writeHead(405, {'Content-Type': 'text/plain'});
response.end();
}
}
В логе iobroker вы увидите, команды которые поступают на сервер, и ответ вашего сервера… Допиливайте функцию do_voice_command по вашему желанию.
Проверьте работает ли ваш сервер, просто перейдя по ссылке: http://адрес вашего сервера:8090
Должна появиться надпись "Принимаем только POST запросы".
Если у вас возникли вопросы, пишите, я постараюсь ответить. Так же я иногда обитаю в телеграмм канале: https://t.me/iobroker
С Алисой от Yandex ситуация примерно та же, только вам необходимо будет создать навык, для алисы, протестировать его, опубликовать... И сервер будет уже немного сложнее, с HTTPS т.е. для яндекс обязательно защищенное соединение.