Automação residencial com ESP8266 e Google Home Deixe um comentário

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:

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

Montagem do Circuito 

Esquemático do circuito ESP8266 e Google Home

O primeiro passo para montagem desse projeto é conectar o GND do Wemos ao pino do módulo Relé, o pino 3V3 do Wemos ao pino + do módulo e o pino S do módulo a uma das portas digitais do microcontrolador. Utilizaremos um carregador de celular para alimentar nosso projeto através da porta micro USB do Wemos D1 mini. Você também pode usar uma outra fonte de 5V conectada diretamente aos pinos de 5V e GND.

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 da Lâmpada.

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!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *