Automação residencial com ESP8266 e Google Home 9

Nesse post veremos como utilizar o ESP8266 para controlar dispositivos da sua casa utilizando o Google Home. Para isso utilizaremos o serviço de IoT (internet das coisas), Sinric e uma placa de desenvolvimento Wemos D1 mini, baseada no ESP8266. Como exemplo, veremos como fazer uma lâmpada inteligente.

Google Home

Os dispositivos Google Home são auto-falantes inteligentes que possibilitam o uso do Google Assistente – o mesmo assistente virtual presente nos aparelhos Android. Eles são capazes de integrar diversos serviços de automação residencial, podendo ser comandados utilizando linguagem natural.

O Sinric é uma plataforma online que facilita a comunicação com dispositivos de Automação Residencial. Oferecendo um Aplicativo próprio para o controle dos dispositivos e uma API para comunicação com outras plataformas – que usaremos neste projeto para integrar nosso dispositivo com o google Assistente.

Materiais Necessários

Para montagem desse projeto serão necessários os seguintes materiais:

01 – Placa Wemos D1 Mini Pro Wifi ESP8266
01 – Módulo Relé 5V 4 Canais
01 – Jumpers Fêmea-Fêmea x 40 unidades
01 – Fonte DC Chaveada 5V 3A Micro USB
01 – Cabo micro USB 1 metro

Para outras opções de módulo ESP8266 mais apropriadas para suas necessidades acesse o post “Qual módulo ESP8266 comprar?”.

Montagem do Circuito 

Apenas após a conclusão do projeto realize as conexões do relé com a rede elétrica e a lâmpada. O borne C deve ser conectado a Fase da rede e o borne NO conectado ao retorno dos dispositivos.

Configuração Sinric

Utilizaremos o serviço Sinric para integrar nosso microcontrolador a plataforma do Google. O primeiro passo é criar uma conta no serviço através desse link. Então, acesse sua conta para visualizar a página abaixo. Clique primeiro em Generate Keys e depois em Save API Key. Anote a chave da API, ID do Cliente e o Segredo do Cliente. Clique em Add para criar seu primeiro dispositivo.

Escolha um nome para o seu dispositivo e, em Device Type, selecione Switch para criar um interruptor inteligente. Clique em Save para salvar o novo dispositivo.

Tipo de dispositivo ESP8266 e Google Home

De volta à tela inicial, procure o seu novo interruptor e anote a ID do Dispositivo.

sinric para o projeto ESP8266 e Google Home

Configuração Google Home

Munidos dos dados anotados no processo anterior, podemos começar a configurar a integração com o Google Assistant. O primeiro passo é acessar o Google Actions Console e conectar a conta Google que você usa nos dispositivos onde deseja controlar o interruptor inteligente.

Após o login, clique em New Project, dê um nome para o Projeto, selecione o Idioma e País de sua preferência e clique em Create Project.

Configurando ESP8266 e Google Home

Na próxima página, selecione Smart Home e clique em Start Building.

Na página seguinte clique em Name your Smart action.

Digite um nome para sua ação, clique em Save e volte para a página anterior.

Em seguida clique em Setup account linking para configurar a integração com o Sinric.

Então, insira a ID do Cliente e o Segredo do Cliente anotados nos campos indicados e digite os seguintes URLs nos campos Authentication URL e Token URL.

Authentication URL: https://google.sinric.com/oauth

Token URL: https://google.sinric.com/token

No campo Configure User digite “user” e clique em Save, depois em Test e por fim em Overview para seguir para a próxima página.

Em Overview, clique em Add Action(s).

Add action ESP8266 e Google Home

No campo Authentication URL, digite https://sinric.com/api/v1/googlehome/event. Clique em Save e depois em Account Linking.

Clique em Test para que o serviço possa ser encontrado no aplicativo Google Home. Agora a aba pode ser fechada e nenhuma configuração adicional será necessária no Console do Google.

Actions test ESP8266 e Google Home

Agora, no Aplicativo Google Home no Android ou iOS, vá em Configurações → Compatíveis com o Google e procure pelo serviço [test] nome_da_sua_ação. Após clicar no serviço com o nome criado faça login com seu usuário e senha da Sinric. Feito isso o dispositivo criado no painel da Sinric estará disponível no Aplicativo e poderá ser controlado usando o Google Assistant no celular e dispositivos Google Home.

Google apps ESP8266 e Google Home

Configuração da IDE do Arduino para a placa WeMos

As placas baseadas no ESP8266 não estão instaladas nativamente na IDE do Arduino. Acesse o post “Como programar o NodeMCU com IDE Arduino” para instruções em como realizar a instalação. Após seguir os passos do post, na IDE do Arduino, vá em Ferramentas → Placa → LOLIN(WEMOS) D1 mini Lite.

Programa 

Para esse projeto em que utilizaremos o ESP8266 e Google Home, precisamos das seguintes bibliotecas que podem ser instaladas  através do gerenciador de bibliotecas da IDE do Arduino ou dos links abaixo:

No código abaixo, as seguintes informações devem ser inseridas nos locais indicados: 

  • Nome e Senha da sua rede Wifi
  • Chave da API e ID do Dispositivo, anotados na configuração do Sinric
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsClient.h>
#include <ArduinoJson.h> 
#include <StreamString.h>

ESP8266WiFiMulti WiFiMulti;
WebSocketsClient webSocket;
WiFiClient client;


//Configurações-----------------------------------------
#define ssid "insira-aqui-o-nome-da-rede-wifi"
#define password "insira-aqui-a-senha-da-rede-wifi"

#define MyApiKey "insira-aqui-a-chave-da-api"

#define DispositivoID "insira-aqui-a-id-do-dispositivo"

#define RelayPin D2 //Pino onde o Relé está conectado
//------------------------------------------------------


#define HEARTBEAT_INTERVAL 300000 // 5 Minutes 

uint64_t heartbeatTimestamp = 0;
bool isConnected = false;

void turnOn(String deviceId);
void turnOff(String deviceId);
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length);

void setup() 
{
  pinMode( RelayPin, OUTPUT);
  
  Serial.begin(115200);
  
  WiFiMulti.addAP(ssid, password);
  Serial.println();
  Serial.print("Conectando a Rede: ");
  Serial.println(ssid);  

  //Espera pela conexão WiFi
  while(WiFiMulti.run() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }

  if(WiFiMulti.run() == WL_CONNECTED) 
  {
    Serial.println("");
    Serial.println("WiFi Conectado");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }

  //Estabelece conexão com Sinric
  webSocket.begin("iot.sinric.com", 80, "/");
  webSocket.onEvent(webSocketEvent);
  webSocket.setAuthorization("apikey", MyApiKey);
  webSocket.setReconnectInterval(5000);
}

void loop()
{
  webSocket.loop();
  
  if(isConnected) 
  {
      uint64_t now = millis();
      //Mantem a conexão mesmo se houver mudança do IP
      if((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) 
      {
          heartbeatTimestamp = now;
          webSocket.sendTXT("H");          
      }
  }   
}


void turnOn(String deviceId) 
{
  if (deviceId == DispositivoID)
  {  
    Serial.print("Ligar o dispositivo ID: ");
    Serial.println(deviceId);

    digitalWrite( RelayPin, HIGH);
  } 
}

void turnOff(String deviceId) 
{
    if (deviceId == DispositivoID)
    {  
      Serial.print("Desligar o dispositivo ID: ");
      Serial.println(deviceId);
  
      digitalWrite( RelayPin, LOW);
    } 
}

//Lida com os pedidos recebidos pela Sinric
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) 
{
  if(type == WStype_TEXT)
  {
      Serial.printf("Comando Recebido: %s\n", payload);
#if ARDUINOJSON_VERSION_MAJOR == 5
      DynamicJsonBuffer jsonBuffer;
      JsonObject& json = jsonBuffer.parseObject((char*)payload);
#endif
#if ARDUINOJSON_VERSION_MAJOR == 6        
      DynamicJsonDocument json(1024);
      deserializeJson(json, (char*) payload);      
#endif        
      String deviceId = json ["deviceId"];     
      String action = json ["action"];
      
      if(action == "action.devices.commands.OnOff")  //Comando para ligar/desligar 
      {
          String value = json ["value"]["on"];
          Serial.println(value); 
          
          if(value == "true") 
              turnOn(deviceId);
          else 
              turnOff(deviceId);
      }
  }
}

Resultado

Apesar do processo inicial ser um pouco complicado, essa solução é customizável e possui custo acessível. Com a configuração inicial feita, você poderá criar novos dispositivos no Sinric e eles aparecerão automaticamente no aplicativo Google Home. Sendo necessário apenas alterar no código a ID do Dispositivo. É possível também controlar mais de uma lâmpada com um módulo ESP8266 e um módulo de relé de múltiplos canais.

Projeto ESP8266 e Google Home

Gostou de aprender como Automatizar sua Casa com ESP8266 e Google Home? Deixe um comentário aqui embaixo dizendo o que achou!

Faça seu comentário

Acesse sua conta e participe

9 Comentários

  1. boa tarde amigo, eu fiz com 1 pino e deu certo, vc poderia passar por favor o código acionando 2 pinos ou mais?

    1. Olá!

      Já passamos as informações no contato por e-mail.

      Abraço!
      Vinícius – Equipe FilipeFlop

  2. O site Sinric sairá do ar em agosto, pode fazer um novo tutoria com o site novo dele?

  3. Não estou conseguindo colocar dois acionamentos ao mesmo tempo.
    consigo alterar entre dois acionamentos(Device ID) no no código, mas quando tento colocar as duas ao mesmo tempo não da certo.
    pode deixar um código de com ficaria com dois (Device ID) funcionando juntos? que assim eu comparo com este que vc deixou e entendo o que tenho que alterar.
    desde já agradeço.

  4. Poderia fazer um vídeos no youtube, ficaria bacana.

  5. Primeiro, parabéns pelo artigo.

    Minhas dúvidas:

    * Existe a possibilidade de integrar o ESP8266 com Google Home e/ou Alexa sem utilizar a Sinric? Ou seja desenvolvendo a própria solução?
    * Sobre o código, o ESP8266 conhece a Sinric, e não ao contrário? É isto mesmo?
    * Em cada integração do void loop() é feita uma chamada no site da Sinric para verificar se existe algum comando para ser executado pelo ESP8266?

    1. Obrigado, Marlon!
      Sobre as suas perguntas:
      *É possível sim, tanto utilizando outras soluções quanto criando a sua própria.
      *A Sinric sabe que existe um dispositivo acessando o serviço de um determinado IP, e que esse está ligado a sua conta
      *A comunicação é feita através de Websocket, a comunicação entre o ESP e o serviço fica aberta. Mas o ESP verifica em cada iteração do loop se algum novo comando foi recebido.

  6. Muito bom. Essa automação com esse projeto está limitado pelo número de portas do Wemos? Não fazia ideia desse Sinric e Google Home. Parabéns

    1. Obrigado, Wilson! Exatamente, você pode controlar um relé por pino, basta criar vários dispositivos na Sinric e checar qual ID de dispositivo foi recebida. Existem placas de relé que funcionam por comunicação serial, com elas você não fica mais limitado pela quantidade de pinos.