Вчимо розумний будинок розуміти голосові команди і відповідати вам (Google Now)
Отже, давно хотів написати цю статтю, думаю всім буде цікаво "поговорити з своїм розумним будинком", дати йому голосову команду, і отримати від нього голосова відповідь.
В даному випадку ми будемо це робити через Android планшет або смартфон. Коротко алгоритм дій буде такою:
1. перехоплює все команди "Ок гуггл" або просто після натискання на "мікрофон" гугла.
2. Відправляємо отриману команду до нас на сервер в iobroker
3. Отримуємо назад відповідь, і промовляємо його засобами вашого телефону або Google.
Для початку треба налаштувати сам Google Now на телефоні, що б він реагував на фразу Ok Goole ... Робиться це в додатку Google (якщо воно не встановлено, ставимо його з Play Market).
В Google тиснемо настройки - Голосовий пошук ...
Озвучування результатів: Вимкнути
Voice match: Увімкніть і налаштуйте .. там треба буде записати зразок голосу та інше ...
Тепер коли телефон реагує на Ok Google, нам знадобитися перехопити Google Now команди. Для цього я особисто використовую додаток Automate або Tasker ... У даній статті приведу приклад з php?showtopic=638842> 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 тобто для яндекс обов'язково захищене з'єднання.
Php?Warn ( "Команда =" + cmd); // що ти вмієш?
Cmd == 'що ти вмієш' || cmd == 'що ти вмієш?