Verwalten von Smart-Home-Sensoren mit dem Google-Assistenten

Hallo, die Kollegen in diesem Handbuch erklären Ihnen, wie Sie Smart-Home-Sensoren mithilfe des Google-Assistenten und des mqtt-Protokolls am Beispiel der ESP8266-Karte und der LED steuern. Wir werden auch unsere eigene Assistant-App mit Blackjack- und PHP-Skripten erstellen. Ich bitte alle um Katze.

Dazu benötigen wir den ESP8266-Controller oder andere Controller mit einer Internetverbindung sowie einen Server mit einem gültigen SSL-Zertifikat (anstelle eines gültigen SSL-Zertifikats können Sie einen Reverse-Proxy verwenden, der bereits über einen verfügt) und einen MQTT-Server (Broker).

Für die Integration mit Google Assistant verwenden wir den Google Actions-Dienst und Dialogflow. Also fangen wir an.

Bild

Projekt erstellen und einrichten


Google Aktionskonsole


Zuerst müssen Sie sich beim Dienst anmelden und ein Projekt erstellen, eine Sprache und eine Region auswählen.

Bild

Nachdem Sie den Bereich auswählen müssen. Ich habe mich für Kids & Family entschieden. Aus der Erfahrung eines anderen kann ich sagen, dass die logisch fragende Kategorie Smart Home nur mit Geräten von Google ordnungsgemäß funktioniert. Für Projekte mit eigenen Sensoren ist es besser, eine andere Kategorie für den korrekten Betrieb auszuwählen.

Bild

Wir lesen und akzeptieren die Vereinbarung. Gehen Sie in der Kategorie Schnelleinrichtung zu Entscheiden, wie Ihre Aktion aufgerufen wird. Wir überlegen, wie unser Bot heißen wird, wählen eine der verfügbaren Stimmen aus und speichern sie.

Bild

Wechseln Sie zur Registerkarte Aktionen, und fügen Sie eine Aktion für benutzerdefinierte Absichten hinzu

Bild

Dialogfluss


Nachdem Sie auf die Schaltfläche Erstellen geklickt haben, werden wir zur Dialogflow-Ressource weitergeleitet. Außerdem melden wir uns an und fahren mit der Erstellung des Projekts fort:

  1. Wählen Sie die Standardsprache und Zeitzone.
  2. Fulfillment Webhook. ( , ) Dialogflow POST .

    Bild
  3. 3. .

    intets . . + Intents. .

Bild

Die Seite selbst kann in drei Kategorien unterteilt werden:

Trainingsphrasen sind Wörter, auf die der Assistent mit dem Team antwortet. Sie können für ein Team unterschiedlich sein. Zum Beispiel die Wörter leuchten lassen, das Licht ausschalten, die Lampe einschalten usw.

Bild

Aktion - die Aktion selbst oder das Wort, das der Sensor verstehen wird, ist eins und konkret.

Antworten sind die Antworten des Assistenten, nachdem der Befehl ausgeführt wurde. Hier ist nur ein Feld für Kreativität.

Bild

Hosting-Setup


Als Server habe ich das billigste (5 US-Dollar) Droplet gekauft und Debian 10.2 darauf installiert. Welches Hosting Sie wählen, spielt keine Rolle.

Konfigurieren Sie Reverse Proxy und DNS


Sie können diesen Teil überspringen, wenn Sie ein Hosting mit einem gültigen Zertifikat haben.

Der Cloudflare-Dienst selbst bietet viele Namen niedrigerer Ebenen. Wenn Sie also Probleme mit Schritt 4 haben, müssen Sie möglicherweise Ihre IP-Adresse anstelle der Standard-IP-Adresse in der Inhaltsspalte in der Nähe von www ***, https // www *** (*** ist Ihre Domain) angeben. .

Für die Interaktion mit Dialogflow benötigen Sie ein SSL-Zertifikat. Ich habe es nicht auf dem Server installiert, sondern den DNS-Proxy Cloudflare (kostenlos - grundlegend) verwendet. Zu diesem Zweck habe ich bei der Konfiguration von Cloudflare meinen zuvor gekauften Domänennamen hinzugefügt und die IP-Adresse meines Servers hinzugefügt (Spalte Inhalt). Außerdem wurden in den Einstellungen des Namensanbieters zwei A-Datensätze hinzugefügt (im Bild ist es Wert). Es ist erwähnenswert, dass das Hinzufügen eines Datensatzes keine Frage von Sekunden ist und bis zu mehreren Werktagen dauern kann.

Bild

Software Installation


1. Vergessen Sie nicht, nach dem ersten Starten des Servers die Paketdatenbank zu aktualisieren

apt update
und aktualisieren Sie dann die installierten Pakete
apt upgrade

2. Nachdem wir LAMP

Apache installiert haben

apt install apache2 

Php / mysql

apt-get install php libapache2-mod-php php-mcrypt php-mysql

Fügen Sie die Serveradresse in apache2.conf hinzu. Dies kann mit dem Befehl nano /etc/apache2/apache2.conf erfolgen, der am Ende der Datei Servername *** am Ende Ihrer Datei angibt, wo Sie anstelle von Sternchen die Server-IP ersetzen müssen. Überprüfen Sie die Syntax und starten Sie den Apach-Dienst neu. Weitere Informationen finden Sie hier .

Nachdem Sie die oben beschriebenen Schritte bei der Eingabe Ihres Domainnamens in die Browserleiste erfolgreich ausgeführt haben, erhalten Sie die Apache2-Begrüßungsseite.

Bild

Wenn dies nicht der Fall ist, überprüfen Sie, ob die Befehle korrekt ausgeführt wurden und ob die Seite mit einer ungesicherten http-Verbindung funktioniert. Wenn es funktioniert, überwacht der Server wahrscheinlich Port 80 und nicht Port 443. Oder es läuft bereits ein Dienst darauf. Weitere Details hier .

4. Installieren der Mosquitto Library für PHP

IoT-Geräte können unterschiedliche Protokolle für die Interoperabilität verwenden. Ein solches MQTT , das auf Publisher-Subscriber-Basis arbeitet. In diesem Fall können Abonnenten Informationen von vielen Herausgebern erhalten. Da das Protokoll jedoch nur bestimmte Arten von Nachrichten versteht, benötigt es einen Konverter (Broker). Hier haben wir es eingerichtet.

5. Wenn Sie PECL nicht installiert haben, installieren Sie es

apt install pecl

Nachdem wir Makler geworden sind

pecl install Mosquitto-alpha

Fügen Sie dann die Erweiterung = mosquitto.so zu Ihrer php.ini hinzu. Und vergiss den Kunden nicht

apt install mosquitto mosquitto-clients

Weitere Details hier .

PHP-Skript einrichten, Thema abonnieren


Eigentlich das Skript selbst. Der Zweck besteht darin, eine Post-Anfrage von Dialogflow zu akzeptieren, die Aktion von dieser zu isolieren und sie als Nachricht an den Broker im Betreff zu senden, dessen Name am Ende des Skripts angegeben ist. Wie Sie ein Skript nennen, spielt keine Rolle. Dies ist übrigens das Skript, das wir auf der Registerkarte Erfüllung angegeben haben. Platzieren Sie das Skript unter / var / www / html.

Themen werden von Abonnenten erstellt. Verwenden Sie den Befehl, um ein Thema zu erstellen:

mosquitto_sub -h localhost - t /test/light

Anstelle von localhost können Sie eine andere Adresse oder Domain angeben, unter der Sie einen Publisher (Pub) erstellen möchten.

Anstelle von / test / light können Sie ein beliebiges Thema angeben. In unserem Fall ist die Hauptsache, dass es im Skript angegeben wird.

Nachrichten werden von Herausgebern erstellt. Um eine Nachricht zu erstellen, können Sie den Befehl verwenden.

mosquitto_pub -h localhost - t /test/light -m “light”

Aber wir werden es nicht brauchen, weil unser Verlag (Pub) unsere Anwendung sein wird. Wenn unsere Anwendung einen Befehl empfängt, sendet sie eine Anforderung an unser Skript. Das Skript ist für den Broker und der Broker ist für den Abonnenten (esp8266).

Wir werden das Senden von Nachrichten über die Registerkarte Test Action Console überprüfen.

Bild

Bild

PHP-Skript
<?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


Für die Firmware verwenden wir die Arduino IDE. Wenn jemand die IDE zum ersten Mal installiert, vergessen Sie nicht den ch340-Treiber. Standardmäßig gibt es keine solche Zahlung in Arduino. In Datei >> Einstellungen müssen Sie die Adresse der zusätzlichen Karten angeben: arduino.esp8266.com/stable/package_esp8266com_index.json. In Tools >> board >> board manager müssen Sie das esp8266-Paket installieren.

In der Skizze nach const char * ssid sollten Sie den Namen Ihres Wi-Fi-Netzwerks angeben. Nach const char * Passwort ihr Passwort. Geben Sie nach const char * mqtt_server die IP-Adresse Ihres Servers an.

Skizzieren Sie die 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();

}

Ergebnis


Als Ergebnis erhalten wir nach dem Kompilieren der Skizze eine Anwendung, die in den Google-Assistenten integriert ist und die Sensoren verwaltet. Anstelle eines Smartphones habe ich eine Webanwendung verwendet, aber auf Android getestet - das Ergebnis ist das gleiche. Die Hauptsache ist, wenn Sie von einem Smartphone aus testen, vergessen Sie nicht zu sagen: "Sprechen Sie mit der Anwendung ***".

Bild

Bild


All Articles