Alexa – NodeMCU: Emulando um dispositivo WeMo

22 22UTC agosto 22UTC 2017 — 12 Comentários
Alguns meses atrás, explorei aqui como usar a Alexa, um assistente pessoal inteligente, popularizado pelo Amazon Echo e Echo-Dot, em projetos de automação residencial:

Quando o IoT encontra a Inteligência Artificial: Automação residencial com Alexa e NodeMCU

Alexa é capaz de interação de voz, reprodução de música, fazer listas de tarefas, configurar alarmes, podcasts de transmissão, reproduzir audiobooks e fornecer informações meteorológicas, de tráfego e outras informações em tempo real. A Alexa também pode controlar vários dispositivos inteligentes funcionando como um hub de automação residencial. Usaremos neste projeto, o “Echo-Dot”, que permite aos usuários ativar o dispositivo usando uma palavra de despertar, como “Alexa” ou “Computer”, como em “Star Trek !

No espaço da automação residencial, a Alexa pode interagir com vários dispositivos diferentes como Philips Hue, Belkin Wemo, SmartThings, etc. Em nosso caso, vamos emular o WeMo, usando a biblioteca fauxmoESP.

Esta é a principal diferença entre este tutorial e o anterior. A biblioteca fauxmoESP simplifica extremamente o código necessário para o desenvolvimento de projetos de automação residencial envolvendo a Alexa e o NodeMCU.

WeMo é uma série de produtos da Belkin International, Inc. que permite aos usuários controlar eletrodomésticos desde qualquer lugar. O conjunto de produtos inclui um interruptor, sensor de movimento, interruptor de luz, câmera e aplicativo.

O WeMo Switch (nosso caso aqui) pode ser conectado a qualquer tomada doméstica, a qual pode ser controlada a partir de um smartphone iOS ou Android o qual executará o aplicativo WeMo, via rede doméstica WiFi ou rede celular. Nós emularemos este dispositivo, mas seu controle será obtido por voz via o Echo-Dot.

O diagrama de blocos abaixo mostra o que será desenvolvido em nosso projeto:

O vídeo abaixo mostra como o projeto ficará no final:

 

1: Lista de materiais

(Valores em US$ apenas para referência)

  1. NodeMCU ESP8266-12E ($8.79)
  2. Echo Dot (2nd Generation) – Black ($49.99)
  3. 2 X Mini BreadBoard ($1.00)
  4. 4-Channel Relay Module ($8.49)
  5. Male-Female Dupont Cables ($1.00)
  6. Fonte externa de 5V ou bateria

2: Emulação do WeMo – a biblioteca FauxmoESP

WeMo Emulation

Este tutorial baseia-se na excelente biblioteca e exemplo de código aberto desenvolvido por Xosé Perez (Tinkerman). Veja a sua publicação original aqui: Emulate a WeMo device with ESP8266. Tinkerman por sua vez, baseou-se no código Python desenvolvido por Maker Musings.

fauxmoESP é uma biblioteca para dispositivos baseados em ESP8266 que emula um dispositivo Belkin WeMo, permitindo assim que você os controle usando um protocolo, especialmente desenvolvido para dispositivos, como o Amazon Echo ou o Echo-Dot.

A biblioteca pode ser encontrada no website BitBucket de Xose Perez: fauxmoESP

1. fauxmoESP Library ZIP

Para que a fauxmoESP funcione, você também precisará de mais 2 bibliotecas, desenvolvidas por Hristo Gochkov:

2. ESPAsyncTCP

3. ESPAsyncWebServer

Então, vá até o IDE do Arduino e instale as 3 bibliotecas acima no diretório Arduino/Libraries.

Informações técnicas adicionais (e opcionais):

Se você está interessado em entender mais profundamente o que está acontecendo, leia o artigo: HOW TO MAKE AMAZON ECHO CONTROL FAKE WEMO DEVICES, escrito por Rick Osgut, onde poderá aprender um pouco mais sobre a emulação do WeMo.

Vai aqui um pequeno resumo:

WeMo Emulation - the FauxmoESP Library

Os dispositivos WeMo utilizam UPnP para executar certas funções através da rede. A função de detecção do dispositivo começa com o Echo ou Echo-Dot (em nosso caso aqui) à procura de dispositivos WeMo utilizando UPnP. O dispositivo então responde ao Echo-Dot com seu URL utilizando HTTP sobre UDP. OEcho-Dot então solicita a descrição do dispositivo utilizando esse URL HTTP. A descrição é então retornada como uma resposta HTTP. Neste ponto, o Echo-Dot já “descobriu” o dispositivo.

O Echo-Dot simplesmente se conectará ao WeMo através da interface HTTP e emitirá um comando do tipo “SetBinaryState”. O WeMo então “obedecerá”, retornando uma confirmação via HTTP. O diagrama  acima resume a comunicação entre o Echo-Dote o WeMo Switch. O diagrama acima, resume o protocolo.

3: Criando dispositivos WeMo com a ajuda do NodeMCU

Creating Our WeMo Devices With NodeMCU

Vamos conectar um módulo relé de 4 canais onde controlaremos por exemplo,  2 lâmpadas e 2 tomadas genéricas (“outlets”), conforme mostra o diagrama acima.

Criaremos 4 “dispositivos inteligentes únicos”:

  • Light1 ==> Relay 1 ==> NodeMCU D5
  • Light2 ==> Relay 3 ==> NodeMCU D7
  • Outlet1 ==> Relay 2 ==> NodeMCU D6
  • Outlet2 ==> Relay 4 ==> NodeMCU D8

e 3 grupos de dispositivos integrados:

  • All Devices    ==> Light1, Light2, Outlet1 e Outlet2
  • Living Room ==> Light1 e Outlet1
  • Bed Room      ==> Light2 e Outlet2

Baixe e abra o código: NODEMCU_ALEXA_WeMos_4X_Fauxmo_EXT.ino desde meu GitHub e altere as credenciais “dummy” pelas de sua rede WiFi:

/* Network credentials */
#define WIFI_SSID "YOUR SSID HERE" 
#define WIFI_PASS "YOUR PASSWORD HERE"

defina os pinos do NodeMCU que serão utilizados para acionar os dispositivos individuais

/* Set Relay Pins */
#define RELAY_1 D5 
#define RELAY_2 D6 
#define RELAY_3 D7 
#define RELAY_4 D8

Agora, escolha com que nomes (entre aspas) com que a Alexa identificará os dispositivos:

// Device Names for Simulated Wemo switches
fauxmo.addDevice("Light One"); 
fauxmo.addDevice("Light Two"); 
fauxmo.addDevice("Outlet One"); 
fauxmo.addDevice("Outlet Two"); 
fauxmo.addDevice("Bed Room"); 
fauxmo.addDevice("Living Room"); 
fauxmo.addDevice("All Devices");

Na função setup(), defina qual será a função que responderá aos comandos por voz (aqui a função se chama “callback”):

fauxmo.onMessage(callback);

Na função setup(), também se deverá chamar a função de setup e conexão com a internet:

 //setup and wifi connection
 wifiSetup();

Observe o setup e as condições iniciais para os pinos do NodeMCU:

//Set relay pins to outputs
 pinMode(RELAY_1, OUTPUT);
 pinMode(RELAY_2, OUTPUT);
 pinMode(RELAY_3, OUTPUT);
 pinMode(RELAY_4, OUTPUT);

//Set each relay pin to HIGH 
 digitalWrite(RELAY_1, HIGH); delay(500);
 digitalWrite(RELAY_2, HIGH); delay(500);
 digitalWrite(RELAY_3, HIGH); delay(500);
 digitalWrite(RELAY_4, HIGH); delay(500);

Note que os relés funcionam com “lógica reversa”. HIGH para desligar!

A função loop() será simplesmente:

void loop() 
{ 
  fauxmo.handle(); 
}

A função callback deverá ter o formato como o exemplo abaixo. Aqui só está incluído a porção correspondente ao controle do dispositivo Light1:

/* ----------------------------------------------------------------
   Device Callback 
-------------------------------------------------------------------*/ 
void callback(uint8_t device_id, const char* device_name, bool state) 
{ 
  Serial.print("Device "); 
  Serial.print(device_name); 
  Serial.print(" state: "); 
  if (state) 
  { 
    Serial.println("ON"); 
  } 
  else 
  { 
    Serial.println("OFF"); 
  } 

  //Switching action on detection of device name 
   
  if ( (strcmp(device_name, "Light One") == 0) ) 
  { 
    if (!state) 
    { 
      digitalWrite(RELAY_1, HIGH); 
    } 
    else 
    { 
      digitalWrite(RELAY_1, LOW); 
    } 
  }
  
  ....
}

Observe que usei “! State” dentro da “declaração if”, porque os relés de 4 canais usam “lógica reversa” para ativação (LOW para ativar).

On the Serial monitor you can see the messages exchanged:

[WIFI] Connecting to ROVAI TIMECAP 
............................. ==> CONNECTED! 
[WIFI] STATION Mode, SSID: ROVAI TIMECAP, IP address: 10.0.1.36

Agora, necessitamos que a Alexa encontre seu dispositivo. Existem dois métodos para isso:

  • Utilizando o aplicativo Alexa no smartphone como mostrado nas fotos abaixo. Neste exemplo (não é o nosso aqui), a Alexa encontrará “1 Smart Home device”:  lights WeMo Switch.

Alexa app

  • Ou pedindo diretamente à Alexa através de um comando de voz, como por exemplo: “Alexa, Find connected devices”, ou “Computer, discovery devices“, como é o nosso caso, mostrado no vídeo abaixo:

Uma vez que os dispositivos inteligentes forem descobertos (basta uma única vez), você poderá comandar o Echo-Dot para acioná-los, como mostra o vídeo abaixo:

O screenshot abaixo, mostra para referencia um screenshot to Monitor serial no caso de minha rede e setup:

Serial Monitor.png

4: Conclusão

Como sempre, espero que este projecto possa ajudar outros a encontrarem o seu caminho no emocionante mundo da electrónica, robótica e do IoT!

Verifique meu depositário no GitHub para obter os arquivos atualizados:

Home-Automation-with-Alexa-and-NodeMCU/tree/master/Version_FauxmoESP

E não deixe de visitar e seguir este blog e minha página: MJRoBot.org no Facebook

Saludos desde el sur del mundo!

Até o próximo tutorial!

Obrigado

Marcelo

Anúncios

12 Respostas para Alexa – NodeMCU: Emulando um dispositivo WeMo

  1. 

    Hi Marcelo,

    Love the work you do here.

    tried to email you but it bounced back!

    I got a couple of alexa dot that im playing around with and with the help of your fauxmoesp it works great for my needs.

    But i was wondering if you could help me?

    I want to open my garage and i have confirmed that i can do it with esp8266 and a realy.

    But for it to work i need have the relay just ”open and close”

    I have tried to do it this way.

    digitalWrite(RELAY_1, LOW);

    delay(1000);

    digitalWrite(RELAY_1, HIGH);

    but when i ad this to this code it does not work.

    void callback(uint8_t device_id, const char * device_name, bool state)

    {

    Serial.print(“Device “); Serial.print(device_name);

    Serial.print(” state: “);

    if (state)

    {

    Serial.println(“ON”);

    }

    else

    {

    Serial.println(“OFF”);

    }

    //Switching action on detection of device name

    if ( (strcmp(device_name, “Garage”) == 0) )

    {

    if (!state)

    {

    digitalWrite(RELAY_1, HIGH);

    }

    else

    {

    digitalWrite(RELAY_1, LOW);

    }

    }

    }

    Best regards Erik

    Curtido por 1 pessoa

  2. 

    Marcelo,
    Testei esse código, funcionou muito bem, 7 dispositivo, acrescentei outro e OK.
    Queria fazer uma modificação, e não sei como, quero utiliza-lo via serial, que envia uma string tipo “6B612030312030300D”, já testei e funcionou de primeira(mudei o ON pela string) com um dispositivo aqui em casa, automação UPB.
    Percebi que no código que ele envia na serial “ON” e “OFF” para todos dispositivo, queria mudar para que cada dispositivo enviasse uma string especifica.
    Tem como entrar em contato com você??
    Qualquer coisa, passe contato no meu email.

    Curtir

  3. 

    Muito legal este projeto. Fiquei com uma dúvida na falta de internet com funciona o sistema?

    Curtir

Trackbacks e Pingbacks:

  1. “Computer, Fire All Weapons!” « - agosto 30, 2017

    […] post é na verdade uma continuação de meu último tutorial: Alexa – NodeMCU: Emulando um dispositivo WeMo, onde apresentamos a grande biblioteca fauxmoESP, a qual simplifica muito o código necessário […]

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s