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)
- NodeMCU ESP8266-12E ($8.79)
- Echo Dot (2nd Generation) – Black ($49.99)
- 2 X Mini BreadBoard ($1.00)
- 4-Channel Relay Module ($8.49)
- Male-Female Dupont Cables ($1.00)
- Fonte externa de 5V ou bateria
2: Emulação do WeMo – a biblioteca FauxmoESP
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
Para que a fauxmoESP funcione, você também precisará de mais 2 bibliotecas, desenvolvidas por Hristo Gochkov:
2. ESPAsyncTCP
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:
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
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.
- 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:
4: Conclusão
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
Olá, muito bom!
Tenho uma duvida, é possivel alterar o tipo do dispositivo? pois todos os dispositivos aparecem como lampada na Alexa.
CurtirCurtir
Nao consigo adicionar mais de 3 dispositivos
CurtirCurtir
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.
CurtirCurtir
Não consigo gravar no ESP, ele retorna o erro:
error: ‘fauxmo’ was not declared in this scope
CurtirCurtir
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.
CurtirCurtir
A maneira mais fácil que encontrei foi utilizar algumas rotinas do curso https://www.youtube.com/playlist?list=PLMmiQibT0iTZtRuZ0iekmJk0E7LilZg_A, internet e coisas, editando (html+js) e gravando em um arquivo json o SSID e senha, no modo misto AP+station. Tem tudo no tutorial, exceto a manipulação destes dados de conexão.
CurtirCurtir
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?
CurtirCurtir
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.
CurtirCurtir
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
CurtirCurtido por 2 pessoas
Hi Keith. Thanks a lot!
If both devices, Alexa and your Arduino are in the same network it should work. How is your Arduino connected to the network? Are you using a WiFi shield?
CurtirCurtir
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
CurtirCurtido por 1 pessoa
Hi Erik,
I do not know what can be happened with my email. It should work. Could you please try it again?
rovai@mjrobot.org
When you have a “function”, with multiple different commands that it not only ON/OFF devices, as in your case, the best is to write a special function and use Alexa to “turn on” a “Flag”.
I re-wrote a complete code with only one function openGarageCmd() and it is working (Relay goes ON for 1 second and turn OFF).
You can see the code here:
https://github.com/Mjrovai/Home-Automation-with-Alexa-and-NodeMCU/tree/master/Version_FauxmoESP/Alexa_NodeMCU_Garage_Control
here a quick video demonstration:
Please let me know if its help.
Regards
Marcelo
CurtirCurtir
i have send you Another email hope you get it.
CurtirCurtir
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.
CurtirCurtir
Oi Roberto. o meu email é rovai@mjrobot.org
CurtirCurtir
Roberto, eu escrevi outro tutorial a partir deste ultimo, onde os dispositivos (virtuais) apesar de funcionarem com ON/OFF, acionam funções especificas. Eu ainda tenho que passar o tutorial para o português, mas voce pode dar uma olhada aqui em sua visão em ingles (o código está lá no mesmo GitHub):
https://www.instructables.com/id/Computer-Firing-All-Weapons/
Um abraço
Marcelo
CurtirCurtir
Bom dia Marcelo, consegui fazer funcionar 100%, criei 40 devices e tudo 100%, fuçando, achei o jeito de enviar pela serial as strings de forma correta, neste caso tenho que enviar neste formato “\x14\x38\x37\x30\x34\x33\x32\x30\x61\x66\x66\x32\x30\x31\x61”
Ficou sensacional. Tem como, mudar a biblioteca para configurar a wi-fi posteriormente?
Recebeu meu e-mail?.
Abraço
Roberto
CurtirCurtido por 1 pessoa
Legal! Vou dar uma olhada amanhã. Não recebi o e-mail: para confirmar:
rovai@mjrobot.com
CurtirCurtir
Oi Roberto, não recebi seu email.
CurtirCurtir
Muito legal este projeto. Fiquei com uma dúvida na falta de internet com funciona o sistema?
CurtirCurtir
Adauto. Muito boa pergunta. Em princípio, não funcionaria, pois a “Alexa” tem que estar conectada com o host da AWS. Eu também testei o App oficial da Belkin, mas ele não funciona com a “emulação” que fizemos.
A solução seria então, utilizar uma versão local como a que desenvolvi no tutorial:
https://mjrobot.org/2017/03/29/controle-ativado-por-voz-com-android-e-nodemcu/
No caso de se querer utilizar a Alexa, deveríamos integrar os dois códigos, para também deixar o App como back-up.
CurtirCurtir