Halo, kolega dalam panduan ini akan memberi tahu Anda cara mengontrol sensor rumah pintar menggunakan Google Assistant dan protokol mqtt, menggunakan papan ESP8266 dan LED sebagai contoh. Kami juga akan membuat aplikasi Asisten kami sendiri dengan skrip blackjack dan php. Saya meminta kucing untuk semua orang.Untuk melakukan ini, kita memerlukan pengontrol ESP8266, atau pengontrol lain dengan koneksi Internet, serta server dengan sertifikat ssl yang valid (alih-alih ssl yang valid, Anda dapat menggunakan proxy terbalik yang sudah memiliki satu) dan server MQTT (broker).Untuk integrasi dengan asisten google, kami akan menggunakan layanan Tindakan Google dan Dialogflow. Jadi, mari kita mulai.
Membuat dan mengatur proyek
Konsol tindakan Google
Pertama, Anda harus masuk ke layanan dan membuat proyek, pilih bahasa dan wilayah.
Setelah itu Anda harus memilih ruang lingkup. Saya memilih Kids & Family. Dari pengalaman orang lain, saya akan mengatakan bahwa kategori Rumah Cerdas yang bertanya secara logis hanya berfungsi dengan benar dengan perangkat dari Google, untuk proyek-proyek dengan sensor sendiri, lebih baik memilih kategori yang berbeda untuk operasi yang benar.
Kami membaca dan menerima perjanjian. Di kategori Pengaturan cepat, buka Tentukan bagaimana Tindakan Anda dipanggil. Kami datang dengan apa bot kami akan dipanggil dan pilih suara dari yang tersedia, simpan.
Buka tab Tindakan, tambahkan tindakan Maksud Khusus
Dialogflow
Setelah mengklik tombol Bangun, kami dialihkan ke sumber daya Dialogflow, kami juga masuk dan melanjutkan ke pembuatan proyek:- Pilih bahasa default dan zona waktu.
- Fulfillment Webhook. ( , ) Dialogflow POST .

- 3. .
intets . . + Intents. .
Halaman itu sendiri dapat dibagi menjadi tiga kategori:Frase pelatihan adalah kata-kata yang ditanggapi oleh asisten dengan tim. Mereka bisa berbeda untuk satu tim. Misalnya, menyinari kata-kata, memotong cahaya, menyalakan lampu, dll.
Aksi - tindakan itu sendiri, atau kata yang akan dipahami sensor, itu satu dan konkret.Respons adalah jawaban asisten setelah perintah dieksekusi. Ini hanya bidang kreativitas.
Penyiapan hosting
Sebagai server, saya membeli tetesan termurah ($ 5) dan menginstal Debian 10.2 di atasnya. Hosting mana yang Anda pilih tidak masalah.Konfigurasikan proxy terbalik dan DNS
Anda dapat melewati bagian ini jika memiliki hosting dengan sertifikat yang valid.Layanan Cloudflare sendiri menawarkan banyak nama level yang lebih rendah, jadi jika Anda mengalami masalah dengan langkah 4, Anda mungkin perlu menentukan ip Anda alih-alih yang default di kolom konten dekat www ***, https // www *** (*** adalah domain Anda) .Untuk berinteraksi dengan Dialogflow, Anda memerlukan sertifikat SSL. Saya tidak menginstalnya di server, sebaliknya saya menggunakan proksi DNS Cloudflare (gratis - dasar). Untuk melakukan ini, ketika mengkonfigurasi Cloudflare, saya menambahkan nama domain saya yang sebelumnya dibeli dan menambahkan alamat IP server saya ke dalamnya (kolom Konten). Juga menambahkan dua catatan A (dalam gambar itu Nilai) di pengaturan penyedia nama. Perlu dicatat bahwa menambahkan catatan bukan masalah detik dan dapat memakan waktu hingga beberapa hari kerja.
Instalasi perangkat lunak
1. Hal pertama setelah memulai server untuk pertama kalinya, jangan lupa untuk memperbarui paket databaseapt update
, dan kemudian perbarui paket yang diinstalapt upgrade
2. Setelah kami menginstal LAMPApacheapt install apache2
Php / mysqlapt-get install php libapache2-mod-php php-mcrypt php-mysql
Tambahkan alamat server di apache2.conf. Ini dapat dilakukan dengan perintah nano /etc/apache2/apache2.conf, yang menunjukkan pada akhir file ServerName *** di akhir file Anda, di mana alih-alih tanda bintang Anda harus mengganti ip server. Periksa sintaks dan mulai ulang layanan Apach. Pelajari lebih lanjut di sini .Setelah berhasil menyelesaikan langkah-langkah yang dijelaskan di atas saat memasukkan nama domain Anda di bilah browser, Anda akan menerima halaman selamat datang Apache2.
Jika ini tidak terjadi, periksa apakah perintah dieksekusi dengan benar, dan apakah halaman berfungsi dengan koneksi http yang tidak aman. Jika berhasil, server mungkin mendengarkan pada port 80, bukan port 443. Atau beberapa layanan sudah berjalan di atasnya. Lebih detail di sini .4. Menginstal Perpustakaan Mosquitto untuk PHPPerangkat IoT dapat menggunakan protokol yang berbeda untuk interoperabilitas. Salah satu MQTT yang berfungsi atas dasar penerbit-pelanggan. Dalam hal ini, pelanggan dapat menerima informasi dari banyak penerbit. Tetapi karena protokol hanya memahami jenis-jenis pesan tertentu, itu memerlukan konverter (pialang). Di sini kita mengaturnya.5. Jika Anda belum menginstal PECL, instalapt install pecl
Setelah kami menjadi brokerpecl install Mosquitto-alpha
Kemudian tambahkan ekstensi = mosquitto.so ke php.ini Anda. Dan jangan lupa klienapt install mosquitto mosquitto-clients
Lebih detail di sini .Menyiapkan skrip php, berlangganan ke topik
Sebenarnya skrip itu sendiri. Tujuannya adalah untuk menerima permintaan posting dari Dialogflow, mengisolasi tindakan dari itu dan mengirimkannya sebagai pesan ke broker dalam subjek, yang namanya ditunjukkan di akhir skrip. Apa yang Anda sebut skrip tidak masalah. Omong-omong, ini adalah skrip yang kami tunjukkan di tab Pemenuhan. Tempatkan skrip di / var / www / htmlTopik dibuat oleh pelanggan. Untuk membuat topik, gunakan perintah:mosquitto_sub -h localhost - t /test/light
Alih-alih localhost, Anda dapat menentukan alamat atau domain lain, tempat Anda ingin membuat publisher (pub).Alih-alih / test / light, Anda dapat menentukan topik apa pun. Dalam kasus kami, hal utama adalah hal itu ditunjukkan dalam naskah.Pesan dibuat oleh penerbit. Untuk membuat pesan, Anda dapat menggunakan perintah.mosquitto_pub -h localhost - t /test/light -m βlightβ
Tetapi kami tidak akan membutuhkannya, karena penerbit kami akan menjadi aplikasi kami. Skemanya adalah ini, ketika aplikasi kita menerima perintah, itu mengirimkan permintaan ke skrip kita. Script untuk broker, dan broker untuk pelanggan (esp8266).Kami akan memeriksa pengiriman pesan melalui tab Test Action Console.

Skrip php<?php
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
throw new Exception('Request method must be POST!');
}
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if(strcasecmp($contentType, 'application/json') != 0){
throw new Exception('Content type must be: application/json');
}
$content = trim(file_get_contents("php://input"));
$decoded = json_decode($content);
var_dump($decoded);
echo $decoded->queryResult->action;
define('BROKER', 'localhost');
define('PORT', 1883);
define('CLIENT_ID', getmypid());
$client = new Mosquitto\Client(CLIENT_ID);
$client->connect(BROKER, PORT, 60);
$message = $decoded->queryResult->action;
$client->publish('/test/light', $message, 0, false);
$client->loop();
?>
Firmware ESP8266
Untuk firmware kita akan menggunakan Arduino IDE. Jika seseorang akan menginstal IDE untuk pertama kalinya, jangan lupa tentang driver ch340. Secara default, tidak ada pembayaran seperti itu di Arduino. Dalam File >> Pengaturan Anda perlu menentukan alamat papan tambahan: arduino.esp8266.com/stable/package_esp8266com_index.json. Di Tools >> board >> board manager Anda perlu menginstal paket esp8266.Dalam sketsa setelah const char * ssid, Anda harus menunjukkan nama jaringan wi-fi Anda. Setelah kata sandi const *, kata sandinya. Setelah const char * mqtt_server tentukan alamat ip server Anda.Sketsa Arduino IDE#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "***";
const char* password = "********";
const char* mqtt_server = "**.**.*.*";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
int led = D5;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
String msg="";
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
msg+=(char)payload[i];
}
Serial.println();
// Switch on the LED if an 1 was received as first character
// if ((char)payload[0] == '1') {
if (msg == "light") {
digitalWrite(led, HIGH); // Turn the LED on
} else {
digitalWrite(led, LOW); // Turn the LED off
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// ... and resubscribe
client.subscribe("/test/light");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(led, OUTPUT); // Initialize the led pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
Hasil
Akibatnya, setelah menyusun sketsa, kami mendapatkan aplikasi yang terintegrasi ke dalam asisten google dan mengelola sensor. Alih-alih smartphone, saya menggunakan aplikasi web, tetapi diuji pada Android - hasilnya sama. Hal utama adalah jika Anda menguji dari smartphone jangan lupa untuk mengatakan: "Bicara dengan aplikasi ***".
