Mengelola sensor rumah pintar dengan Google Assistant

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.

gambar

Membuat dan mengatur proyek


Konsol tindakan Google


Pertama, Anda harus masuk ke layanan dan membuat proyek, pilih bahasa dan wilayah.

gambar

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.

gambar

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.

gambar

Buka tab Tindakan, tambahkan tindakan Maksud Khusus

gambar

Dialogflow


Setelah mengklik tombol Bangun, kami dialihkan ke sumber daya Dialogflow, kami juga masuk dan melanjutkan ke pembuatan proyek:

  1. Pilih bahasa default dan zona waktu.
  2. Fulfillment Webhook. ( , ) Dialogflow POST .

    gambar
  3. 3. .

    intets . . + Intents. .

gambar

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.

gambar

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.

gambar

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.

gambar

Instalasi perangkat lunak


1. Hal pertama setelah memulai server untuk pertama kalinya, jangan lupa untuk memperbarui paket database

apt update
, dan kemudian perbarui paket yang diinstal
apt upgrade

2. Setelah kami menginstal LAMP

Apache

apt install apache2 

Php / mysql

apt-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.

gambar

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 PHP

Perangkat 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, instal

apt install pecl

Setelah kami menjadi broker

pecl install Mosquitto-alpha

Kemudian tambahkan ekstensi = mosquitto.so ke php.ini Anda. Dan jangan lupa klien

apt 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 / html

Topik 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.

gambar

gambar

Skrip php
<?php


//Make sure that it is a POST request.
if(strcasecmp($_SERVER['REQUEST_METHOD'], 'POST') != 0){
    throw new Exception('Request method must be POST!');
}

//Make sure that the content type of the POST request has been set to application/json
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"])                                                                                                              : '';
if(strcasecmp($contentType, 'application/json') != 0){
    throw new Exception('Content type must be: application/json');
}

//Receive the RAW post data.
$content = trim(file_get_contents("php://input"));

//Attempt to decode the incoming RAW post data from JSON.
$decoded = json_decode($content);

//file_put_contents($filename, $data);
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 ***".

gambar

gambar


All Articles