Administrar sensores domésticos inteligentes con el Asistente de Google

Hola, los colegas de esta guía le dirán cómo controlar los sensores domésticos inteligentes utilizando el Asistente de Google y el protocolo mqtt, utilizando la placa ESP8266 y el LED como ejemplo. También crearemos nuestra propia aplicación Asistente con scripts de blackjack y php. Les pido a todos un gato.

Para hacer esto, necesitamos el controlador ESP8266 u otros controladores con conexión a Internet, así como un servidor con un certificado SSL válido (en lugar de un SSL válido, puede usar un proxy inverso que ya tenga uno) y un servidor MQTT (intermediario).

Para la integración con el asistente de Google, utilizaremos el servicio Google Actions y Dialogflow. Vamos a empezar.

imagen

Crear y configurar un proyecto


Consola de acción de Google


Primero debe iniciar sesión en el servicio y crear un proyecto, seleccionar un idioma y una región.

imagen

Después de que necesite elegir el alcance. Elegí Kids & Family. Según la experiencia de otra persona, diré que la categoría que pregunta lógicamente Smart Home solo funciona correctamente con dispositivos de Google, para proyectos con sus propios sensores, es mejor elegir una categoría diferente para un funcionamiento correcto.

imagen

Leemos y aceptamos el acuerdo. En la categoría Configuración rápida, vaya a Decidir cómo se invoca su Acción. Creamos cómo se llamará nuestro bot y seleccionamos una voz de las disponibles, guárdala.

imagen

Vaya a la pestaña Acciones, agregue una acción Intención personalizada

imagen

Dialogflow


Después de hacer clic en el botón Construir, se nos redirige al recurso Dialogflow, también se inicia sesión y se procede a la creación del proyecto:

  1. Elija el idioma y la zona horaria predeterminados.
  2. Fulfillment Webhook. ( , ) Dialogflow POST .

    imagen
  3. 3. .

    intets . . + Intents. .

imagen

La página en sí se puede dividir en tres categorías:

Las frases de entrenamiento son palabras a las que el asistente responde con el equipo. Pueden ser diferentes para un equipo. Por ejemplo, haga brillar las palabras, apague la luz, encienda la lámpara, etc.

imagen

Acción : la acción en sí misma o la palabra que el sensor comprenderá, es una y concreta.

Las respuestas son las respuestas del asistente después de ejecutar el comando. Aquí hay solo un campo para la creatividad.

imagen

Configuración de alojamiento


Como servidor, compré la gotita más barata ($ 5) e instalé Debian 10.2 en ella. El alojamiento que elijas no importa.

Configurar proxy inverso y DNS


Puede omitir esta parte si tiene un hosting con un certificado válido.

El servicio Cloudflare en sí ofrece muchos nombres de nivel inferior, por lo que si tiene problemas con el paso 4, es posible que deba especificar su IP en lugar de la predeterminada en la columna de contenido cerca de www ***, https // www *** (*** es su dominio) .

Para interactuar con Dialogflow, necesita un certificado SSL. No lo instalé en el servidor, sino que usé el proxy DNS Cloudflare (gratuito - básico). Para hacer esto, al configurar Cloudflare, agregué mi nombre de dominio adquirido anteriormente y le agregué la dirección IP de mi servidor (columna Contenido). También se agregaron dos registros A (en la imagen es Valor) en la configuración del proveedor de nombres. Vale la pena señalar que agregar un registro no es cuestión de segundos y puede llevar varios días hábiles.

imagen

Instalación de software


1. Lo primero después de iniciar el servidor por primera vez, no olvide actualizar la base de datos del paquete

apt update
y luego actualice los paquetes instalados
apt upgrade

2. Después de instalar LAMP

Apache

apt install apache2 

Php / mysql

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

Agregue la dirección del servidor en apache2.conf. Esto se puede hacer con el comando nano /etc/apache2/apache2.conf, que indica al final del archivo ServerName *** al final de su archivo, donde en lugar de asteriscos debe sustituir la ip del servidor. Verifique la sintaxis y reinicie el servicio Apach. Obtenga más información aquí .

Después de completar con éxito los pasos descritos anteriormente al ingresar su nombre de dominio en la barra del navegador, recibirá la página de bienvenida de Apache2.

imagen

Si esto no sucede, verifique si los comandos se ejecutaron correctamente y si la página funciona con una conexión http no segura. Si funciona, el servidor probablemente esté escuchando en el puerto 80, no en el puerto 443. O algún servicio ya se está ejecutando en él. Más detalles aquí .

4. Instalación de la Biblioteca Mosquitto para PHP

Los dispositivos IoT pueden usar diferentes protocolos para la interoperabilidad. Uno de esos MQTT que funciona sobre la base de editor-suscriptor. En este caso, los suscriptores pueden recibir información de muchos editores. Pero como el protocolo solo comprende ciertos tipos de mensajes, necesita un convertidor (intermediario). Aquí lo configuramos.

5. Si no tiene instalado PECL, instálelo

apt install pecl

Después de que nos convertimos en un corredor

pecl install Mosquitto-alpha

Luego agregue extension = mosquitto.so a su php.ini. Y no olvides al cliente

apt install mosquitto mosquitto-clients

Más detalles aquí .

Configuración de script PHP, suscripción al tema


En realidad, el guión en sí. Su propósito es aceptar una solicitud de publicación de Dialogflow, aislar la acción y enviarla como un mensaje al agente en el asunto, cuyo nombre se indica al final del script. Lo que llamas guión no importa. Por cierto, este es el script que indicamos en la pestaña Cumplimiento. Coloque el script en / var / www / html Los

temas son creados por suscriptores. Para crear un tema, use el comando:

mosquitto_sub -h localhost - t /test/light

En lugar de localhost, puede especificar cualquier otra dirección o dominio donde desee crear un editor (pub).

En lugar de / test / light, puede especificar cualquier tema. En nuestro caso, lo principal es que se indique en el script.

Los mensajes son creados por los editores. Para crear un mensaje, puede usar el comando.

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

Pero no lo necesitaremos, porque nuestro editor (pub) será nuestra aplicación. El esquema es este, cuando nuestra aplicación recibe un comando, envía una solicitud a nuestro script. El script es para el intermediario, y el intermediario es para el suscriptor (esp8266).

Verificaremos el envío de mensajes a través de la pestaña Test Action Console.

imagen

imagen

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


Firmware ESP8266


Para el firmware usaremos el IDE de Arduino. Si alguien instala el IDE por primera vez, no se olvide del controlador ch340. Por defecto, no existe dicho pago en arduino. En Archivo >> Configuración, debe especificar la dirección de las placas adicionales: arduino.esp8266.com/stable/package_esp8266com_index.json. En Herramientas >> placa >> administrador de placa, debe instalar el paquete esp8266.

En el boceto después de const char * ssid, debe indicar el nombre de su red wi-fi. Después de const char * contraseña, su contraseña. Después de const char * mqtt_server, especifique la dirección IP de su servidor.

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

}

Resultado


Como resultado, después de compilar el boceto, obtenemos una aplicación que está integrada en el asistente de Google y administra los sensores. En lugar de un teléfono inteligente, utilicé una aplicación web, pero probé en Android: el resultado es el mismo. Lo principal es que si está probando desde un teléfono inteligente, no olvide decir: "Hable con la aplicación ***".

imagen

imagen


All Articles