Alexa – NodeMCU: Emulando um dispositivo WeMo

22 22-03:00 agosto 22-03:00 2017 — 23 Comentários
Este tutorial foi um dos vencedores do “Automation Contest 2017” do Instructables.com
winner at Automation Contest
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

23 Respostas para Alexa – NodeMCU: Emulando um dispositivo WeMo

  1. 

    Olá, muito bom!
    Tenho uma duvida, é possivel alterar o tipo do dispositivo? pois todos os dispositivos aparecem como lampada na Alexa.

    Curtir

  2. 

    Nao consigo adicionar mais de 3 dispositivos

    Curtir

  3. 

    Segui o tutorial mas a Alexa não consegue descobrir o ESP. Fiz com o ESP01, será q é por isso? Se não for o que será q pode ter acontecido? Preciso de alguma skill ativada? Consigo pingar o ESP, mas a Alexa não encontra.

    Curtir

  4. 

    Não consigo gravar no ESP, ele retorna o erro:

    error: ‘fauxmo’ was not declared in this scope

    Curtir

  5. 

    Ola, algem sabe como faço pra incrementar o wifimanager pra facilitar na hora de habilitar uma rede wifi e escolher a que estiver com mais potência. Sem falar tambem na faciliade de trocar o nome da rede e a senha sempre q for necessario e sem ter que carregar todo o sketh novamente.

    Curtir

  6. 

    Ola, consegui conffigura mais de 5 placas na mesma rede e cada placa gerenciando ate 6 dispositivos. tudo ffuncionando normal. O unico problema que estou tendo é em relaçao a ultima atualiaçao do app da alexa pois quando eu entro na opçao de localiar disposios ou gerenciar grupos ou senas ele aciona todos os dispositivos ao mesmo tempo e ai tenho q sair deligando todos novamente. Outro problema também que tta ocorrendo é quando eu mando acionar algum dispositivos pelo Eco spot alexa aquele que tem uma tela, ao soliccitar o comando de ligar um dispositivo ele exibe na tela o simbolo do dispositivo ligado e fica por alguns segundo que caso eu queira desligar é so toca na tela q ele desliga, mais o pproblema é que ao ficar com a tela aberta mostrando esse dispositivo acaba por ocorrer que aciona outro dispositivos q n foi solicitado. Alguém a teve esse mesmo problema? exite alguma forma de corrigir?

    Curtir

  7. 

    OLa, muito bom seu tutorial, fiz e deu tudo certo, o unico problema que estou tendo é quando configuro mais de uma placa NodeMCU na mesma rede com varios dispositivos, ao tentar acionar pela alexa ela so consegue enchegar os dispositivos de apenas uma placa. Entao deleto todos os dispositivos e instalo novamente ai ela so encherga os ultimos instalados e n consegue mais resposta dos anteriores. Ha alguma dica pra eu poder aplicar e resolver esse problema. So pra tito de informaçao estou usando 8 portas digitais em cada placa.

    Curtir

  8. 

    Hi Marcelo, Thanks for the great article. I have running on my arduino and if connects to my WiFi but Alexa doesnt find it. I changed the IP addtess to one in my router IP range 192.168.234.XXX and then it doesnt connect – am I missing something obviouse ?

    Best regards

    Keith …keith@g4eqz.com

    Curtido por 2 pessoas

  9. 

    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

  10. 

    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

  11. 

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

    Curtir

Trackbacks e Pingbacks:

  1. MJRoBot se sagra vencedor em competição internacional! « - novembro 4, 2017

    […] Alexa – NodeMCU: Emulando um dispositivo WeMo […]

    Curtir

  2. “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