Gérer les capteurs de maison intelligente avec l'Assistant Google

Bonjour, les collègues de ce guide vous diront comment contrôler les capteurs de maison intelligente à l'aide de Google Assistant et du protocole mqtt, en utilisant la carte ESP8266 et la LED comme exemple. Nous allons également créer notre propre application Assistant avec des scripts blackjack et php. Je demande du chat à tout le monde.

Pour ce faire, nous avons besoin du contrôleur ESP8266, ou d'autres contrôleurs avec une connexion Internet, ainsi que d'un serveur avec un certificat SSL valide (au lieu d'un SSL valide, vous pouvez utiliser un proxy inverse qui en a déjà un) et un serveur MQTT (courtier).

Pour l'intégration avec google assistant, nous utiliserons le service Google Actions et Dialogflow. Commençons donc.

image

Création et configuration d'un projet


Console d'action Google


Vous devez d'abord vous connecter au service et créer un projet, sélectionnez une langue et une région.

image

Après vous devez choisir la portée. J'ai choisi Kids & Family. D'après l'expérience des autres, je dirai que la catégorie logiquement demandée Smart Home ne fonctionne correctement qu'avec les appareils de Google, pour les projets avec ses propres capteurs, il est préférable de choisir une catégorie différente pour un fonctionnement correct.

image

Nous lisons et acceptons l'accord. Dans la catégorie Configuration rapide, accédez à Décider comment votre action est invoquée. Nous trouvons comment notre bot sera appelé et sélectionnerons une voix parmi celles disponibles, sauvegardez-la.

image

Accédez à l'onglet Actions, ajoutez une action d'intention personnalisée

image

Dialogflow


Après avoir cliqué sur le bouton Build, nous sommes redirigés vers la ressource Dialogflow, nous nous connectons également et procédons à la création du projet:

  1. Choisissez la langue et le fuseau horaire par défaut.
  2. Fulfillment Webhook. ( , ) Dialogflow POST .

    image
  3. 3. .

    intets . . + Intents. .

image

La page elle-même peut être divisée en trois catégories:

Les phrases de formation sont des mots auxquels l'assistant répond avec l'équipe. Ils peuvent être différents pour une équipe. Par exemple, faites briller les mots, coupez la lumière, allumez la lampe, etc.

image

Action - l'action elle-même, ou le mot que le capteur comprendra, c'est un et concret.

Les réponses sont les réponses de l'assistant après l'exécution de la commande. Voici juste un champ de créativité.

image

Configuration d'hébergement


En tant que serveur, j'ai acheté la droplet la moins chère (5 $) et y ai installé Debian 10.2. L'hébergement que vous choisissez n'a pas d'importance.

Configurer le proxy inverse et le DNS


Vous pouvez ignorer cette partie si vous avez un hébergement avec un certificat valide.

Le service Cloudflare lui-même propose de nombreux noms de niveau inférieur, donc si vous rencontrez des problèmes avec l'étape 4, vous devrez peut-être indiquer votre adresse IP au lieu de celle par défaut dans la colonne de contenu à côté de www ***, https // www *** (*** est votre domaine) .

Pour interagir avec Dialogflow, vous avez besoin d'un certificat SSL. Je ne l'ai pas installé sur le serveur, j'ai plutôt utilisé le proxy DNS Cloudflare (gratuit - basique). Pour ce faire, lors de la configuration de Cloudflare, j'ai ajouté mon nom de domaine acheté précédemment et y ai ajouté l'adresse IP de mon serveur (colonne Contenu). Également ajouté deux enregistrements A (dans l'image, il s'agit de Value) dans les paramètres du fournisseur de noms. Il convient de noter que l'ajout d'un enregistrement n'est pas une question de secondes et peut prendre jusqu'à plusieurs jours ouvrables.

image

Installation du logiciel


1. Première chose après avoir démarré le serveur pour la première fois, n'oubliez pas de mettre à jour la base de données des packages

apt update
, puis mettez à jour les packages installés
apt upgrade

2. Après avoir installé LAMP

Apache

apt install apache2 

Php / mysql

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

Ajoutez l'adresse du serveur dans apache2.conf. Cela peut être fait avec la commande nano /etc/apache2/apache2.conf en spécifiant à la fin du fichier ServerName *** à la fin de votre fichier, où au lieu d'astérisques vous devez remplacer l'IP du serveur. Vérifiez la syntaxe et redémarrez le service Apach En savoir plus ici .

Après avoir terminé avec succès les étapes décrites ci-dessus lors de la saisie de votre nom de domaine dans la barre du navigateur, vous recevrez la page d'accueil Apache2.

image

Si cela ne se produit pas, vérifiez si les commandes ont été exécutées correctement et si la page fonctionne avec une connexion http non sécurisée. Si cela fonctionne, le serveur écoute probablement sur le port 80, pas sur le port 443. Ou un service est déjà en cours d'exécution dessus. Plus de détails ici .

4. Installation de la bibliothèque Mosquitto pour PHP

Les appareils IoT peuvent utiliser différents protocoles pour l'interopérabilité. Un tel MQTT qui fonctionne sur une base éditeur-abonné. Dans ce cas, les abonnés peuvent recevoir des informations de nombreux éditeurs. Mais comme le protocole ne comprend que certains types de messages, il a besoin d'un convertisseur (courtier). Ici, nous l'avons installé.

5. Si vous n'avez pas installé PECL, installez-le

apt install pecl

Après être devenu courtier

pecl install Mosquitto-alpha

Ajoutez ensuite extension = mosquitto.so à votre php.ini. Et n'oubliez pas le client

apt install mosquitto mosquitto-clients

Plus de détails ici .

Configuration du script php, abonnement au sujet


En fait, le script lui-même. Son but est d'accepter une demande de publication de Dialogflow, d'en isoler l'action et de l'envoyer sous forme de message au courtier dans le sujet, dont le nom est indiqué à la fin du script. Ce que vous appelez un script n'a pas d'importance. Au fait, c'est le script que nous avons indiqué dans l'onglet Exécution. Placez le script dans / var / www / html

Les sujets sont créés par les abonnés. Pour créer un sujet, utilisez la commande:

mosquitto_sub -h localhost - t /test/light

Au lieu de localhost, vous pouvez spécifier toute autre adresse, ou domaine, où vous souhaitez créer un éditeur (pub).

Au lieu de / test / light, vous pouvez spécifier n'importe quel sujet. Dans notre cas, l'essentiel est qu'il soit indiqué dans le script.

Les messages sont créés par les éditeurs. Pour créer un message, vous pouvez utiliser la commande.

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

Mais nous n'en aurons pas besoin, car notre éditeur (pub) sera notre application. Le schéma est le suivant: lorsque notre application reçoit une commande, elle envoie une requête à notre script. Le script est destiné au courtier et le courtier à l'abonné (esp8266).

Nous vérifierons l'envoi des messages via l'onglet Test Action Console.

image

image

Script 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();
?>


Micrologiciel ESP8266


Pour le firmware, nous utiliserons l'IDE Arduino. Si quelqu'un installe l'IDE pour la première fois, n'oubliez pas le pilote ch340. Par défaut, il n'y a pas un tel paiement en arduino. Dans Fichier >> Paramètres, vous devez spécifier l'adresse des cartes supplémentaires: arduino.esp8266.com/stable/package_esp8266com_index.json. Dans Tools >> board >> board manager, vous devez installer le package esp8266.

Dans l'esquisse après const char * ssid, vous devez indiquer le nom de votre réseau wi-fi. Après const char * mot de passe, son mot de passe. Après const char * mqtt_server, spécifiez l'adresse IP de votre serveur.

Croquis 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();

}

Résultat


En conséquence, après avoir compilé l'esquisse, nous obtenons une application qui est intégrée dans l'assistant google et gère les capteurs. Au lieu d'un smartphone, j'ai utilisé une application web, mais testé sur Android - le résultat est le même. L'essentiel est que si vous testez à partir d'un smartphone, n'oubliez pas de dire: "Parlez avec l'application ***".

image

image


All Articles