Otomasi Apartemen dengan HomePod, Raspberry Pi dan Node.js



Diterjemahkan untuk Anda sebuah artikel oleh Chris Hawkins , di mana ia berbicara tentang mengubah apartemennya menjadi rumah pintar. HomePod Apple digunakan sebagai basis, tetapi, tentu saja, sistem lain dapat digunakan.

Saya memiliki Apple HomePod yang berjalan di rumah, yang membantu mengontrol sistem tertentu di rumah (misalnya, lampu pintar) dengan permintaan sederhana ke Siri. Sistem ini berfungsi baik dari rumah maupun di luar (asisten pintar ada di telepon).

Skillbox merekomendasikan: kursus praktis dua tahun, "Saya seorang Pengembang Web PRO . "

Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promo "Habr".

Awalnya, saya ragu mengelola rumah menggunakan perintah suara, karena tidak semuanya dikenali oleh asisten (bukan hanya Siri) dengan benar. Tapi kemudian itu menjadi kebiasaan. Karena lampu Hue tidak memiliki sakelar fisik, dan dalam aplikasi Anda perlu melakukan beberapa tindakan untuk mengontrol pencahayaan, saya membuat Siri bekerja.

Kemudian saya ingin mulai menggunakan asisten suara saya untuk mengontrol sistem lain di rumah, misalnya, TV atau konsol. Dalam kasus TV, misalnya, saya menemukan Simple IP Control - metode mengendalikan Sony Bravia saya dengan mengirim perintah melalui TCP.

Kustomisasi Siri


Pada paruh kedua 2018, Apple meluncurkan aplikasi Shortcuts untuk semua pengguna iOS. Ini memungkinkan Anda untuk mengotomatiskan pekerjaan dengan telepon (atau rumah pintar) tanpa perlu menulis kode.

Aplikasi ini memiliki banyak perintah bawaan. Yang tidak dimiliki adalah kemampuan untuk menggunakan perintah TCP, meskipun ada mekanisme untuk bekerja dengan URL.

Plus, Anda dapat menulis modul Anda sendiri di Objective-C atau Swift. Saya memutuskan untuk tidak melakukan ini, karena di masa depan saya dapat mengubah HomePod saya menjadi asisten lain. Sebagai gantinya, saya ingin menulis aplikasi web yang dapat menanggapi perintah Siri.

Kontrol Sony Bravia TV


Berbekal manual dengan perintah untuk TV saya, saya menulis aplikasi di Node.js Express (Github) , yang mengajari saya cara merespons beberapa perintah umum. Saya mulai dengan menyalakan dan volume.

Perintah setPowerStatus melakukan semua yang kita butuhkan.



Header terdiri dari karakter * dan s, yang statis dan digunakan untuk semua perintah. Kemudian byte ketiga digunakan untuk Command. Ada empat makna yang mungkin memegang posisi ini. C untuk Perintah (mengirim perintah di TV), E untuk Kirim (memeriksa nilai saat ini dari parameter tertentu, misalnya, volume), A - Jawab (dikirim sebagai respons terhadap Perintah dan Pertanyaan) dan N untuk Memberitahu (pemberitahuan acara, seperti mematikan volume )

Untuk mencapai tujuan saya, saya harus mempelajari dokumentasi JSON-RPC Sony . Ternyata, sifat JSON-RPC melalui HTTP memungkinkan untuk menyederhanakan tugas dan mengurangi jumlah kode.

Bekerja dengan API JSON-RPC sederhana. Ambil, misalnya, layanan (sistem), perintah (getPowerStatus) plus parameter (benar atau salah) dan bentuk permintaan HTTP, yang kemudian kami kirim ke TV.

let body = JSON.stringify({ method: command, id: ++this.id, params: params, version: "1.0", }); return new Promise((resolve, reject) => { fetch('http://' + this.ip + ':' + this.port + '/sony/' + service, { method: 'post', headers: { 'X-Auth-PSK': this.psk }, body: body, }).then(response => { return response.json(); }).then(response => { if (response.error && (!response.result || response.result.length === 0)) { reject({ code: response.error[0] }); } else { resolve(response.result[0]); } }).catch(error => { reject(error); }); }); 

Secara default, otentikasi dilakukan menggunakan pra-kunci yang dikirim di header permintaan HTTP. Tetapi ada cara yang lebih aman dan nyaman untuk melakukan ini dengan accessControl. Dalam hal ini, kami dapat mengirim perintah ke TV dan bertukar kode dengan aman dengan otentikasi HTTP dasar. Setelah otentikasi dilakukan sekali, otentikasi lebih lanjut dilakukan menggunakan cookie.

Tapi TV saya dilindungi oleh firewall yang dikonfigurasi pada router, jadi saya menggunakan kunci yang dibagikan sebelumnya.

Nyalakan Xbox One


Xbox, tentu saja, membutuhkan pengaturan yang berbeda. Microsoft tampaknya telah memutuskan untuk tidak menggunakan REST API, sehingga pekerjaan dilakukan dengan menggunakan paket UDP.

Untungnya, Node.js memiliki modul dgram yang di luar kotak berfungsi dengan semua fitur USP. Itulah yang akhirnya saya dapatkan.

 turnOn() { let socket = dgram.createSocket('udp4'); let powerPayload = new Buffer('\x00' + String.fromCharCode(this.liveId.length) + this.liveId.toUpperCase() + '\x00'); let powerHeader = Buffer.concat([new Buffer('dd0200', 'hex'), new Buffer(String.fromCharCode(powerPayload.length)), new Buffer('\x00\x00')]); let powerPacket = Buffer.concat([powerHeader, powerPayload]); return this._sendPacket(socket, powerPacket); } _sendPacket(socket, buffer) { return new Promise((resolve, reject) => { socket.send(buffer, 0, buffer.length, Constants.xboxPort, this.ip, function(err) { socket.close(); if (err) { return reject(err); } resolve(); }); }); } 

Untuk konfigurasi, saya menggunakan daftar perangkat ID, yang dapat ditemukan di sini . Jika Anda hanya ingin mengambil kode dari repositori saya, maka Anda perlu mengganti ID di file config.json.

Konfigurasikan Pintasan untuk Siri


Agar Siri dapat menjalankan perintah yang baru saja saya buat, dia membutuhkan asisten. Saya membuatnya dari Raspberry Pi, karena "raspberry" cocok dalam segala hal. Untuk ini, saya membeli Pi 3 Model B + yang mendukung Wi-Fi.

Raspbian memiliki GUI untuk dikonfigurasi. Saya terhubung ke Wi-Fi, kemudian mematikan layar dan terus bekerja pada SSH. Untuk memastikan bahwa aplikasi web selalu aktif, saya mengonfigurasi soket aktivasi layanan di systemd, sehingga jika proses Node.js macet, sistem dapat secara otomatis memulai ulang.

Sebenarnya, Pintasan untuk Siri adalah tahap pekerjaan yang paling mudah. Ini adalah aplikasi intuitif dengan dukungan perintah suara asli. Secara default, ia sudah tahu cara bekerja dengan HomePod, tidak perlu mengkonfigurasi apa pun juga.



Menyatukan semuanya


Karena TV saya berjalan di Android, ia mendukung aplikasi seperti Netflix dan YouTube. Dengan pemikiran ini, saya membuat perintah untuk meluncurkan layanan ini. Selain itu, saya menambahkan perintah untuk mengontrol volume, mode TV, jeda dan mainkan konten.

Berikut adalah contoh dari semua yang saya buat. Saya juga mencoba membuat proyek modular, jadi menambahkan model SmartTV lainnya tidak masalah.

Berikut adalah contoh modul yang menyertakan Xbox, TV, dan mengaktifkan port HDMI pertama.

 router.post('/turnOnXboxAndTV', function(req, res, next) { Promise.all([ xbox.turnOn(), tv.turnOn() .then(() => new Promise(resolve => setTimeout(resolve, 2000))) .then(() => tv.setInput(config.scripts.xboxInput)), ]).then(() => { res.sendStatus(200); }).catch((error) => { res.status(500).send(error); }); }); 

Dan inilah cara kerjanya dalam praktik.


Sayangnya, fungsi Siri tidak terlalu baik. Alexa yang sama dari Amazon memiliki banyak fitur dan API yang sangat kuat. Saya pikir, berdasarkan Alexa, Anda dapat membuat proyek yang jauh lebih serius.

Skillbox merekomendasikan:

Source: https://habr.com/ru/post/id438292/


All Articles