Construindo uma skill na Alexa para se comunicar com o seu Home Assistant

Olá galera, nesse tutorial mostrarei como criar uma skill na Alexa para se comunicar com o seu Home Assistant.

Apresentarei o passo a passo com um print screen de cada etapa para que você consiga chegar até o final e assim realizar a automação no Home Assistant a partir de um comando qualquer na Alexa.

Você precisará ter o NodeRed instalado no seu HA e também ter um pouco de conhecimento sobre ele. Se precisar de ajuda veja aqui: https://forum.homeassistantbrasil.com.br/t/catalogo-de-tutoriais-para-o-novato-em-node-red-comece-por-aqui/2827

Funcionamento:

Criaremos uma skill chamada “Home Assistant” e depois de tudo pronto diremos para a Alexa: “Alexa, Home Assistant” (que será a palavra de ativação da skill) e a mesma vai nos perguntar qual cena desejamos. Responderemos o que quiser, mas neste exemplo diremos: Onde está Wally ?

A ideia da skill é que ela seja compilada uma única vez e as automações e respostas sejam feitas apenas no NODE RED, sem frescuras.

Então, bora para a construção da Skill:

Passo 1

Acesse https://developer.amazon.com/**

Clique em sign in

Se cadastre e depois Forneça os seus dados

Clique em Amazon Alexa

Clique em Create Alexa Skills

Clique em Console

Clique em Create Skill

Informe “Home Assistant” (que será o nome de ativação da skill ou outro qualquer - mas lembre-se disso) sem as aspas no nome da Skill e selecione “Português” logo abaixo

Deixe a opção “Custom” selecionada e logo abaixo mude de Alexa-hosted (Node.js) para Alexa-hosted (Python)

No todo dessa página do lado direito clique em “Create Skill”

Clique no menu da esquerda “Interact Model”. O menu será expandido para baixo e logo abaixo de interact model clique em “Intents” e ainda do lado direito dessa tela localize a linha “Hello World”. Do lado direito dessa linha clique em “Delete”

Depois nessa mesma tela acima tem um botão “+ Add Intent” clique nele

Informe “PerguntaCena” e clique no botão ao lado “Create Custom Intent”

Informe {cena} com os colchetes nessa caixa de texto e do lado direito dela tem um botão “+” clique nele

Logo abaixo aparecerá uma linha “cena” em intent slots e no campo “slot type” deixe com a opção AMAZON.City

Clique em “Save Model”

Clique na aba “Code”

Clique 2x em requirements.txt e adicione isso abaixo do código:
requests==2.23.0

Clique 2x em lambda_function.py

Selecione todo o código de lambda_function.py e apague ele

Depois copie todo o código que coloquei nesse link e cole lá
https://drive.google.com/file/d/11wYixsxluUEPMlKcRv6wwfcXRiGUPrDa/view?usp=sharing

Você precisa editar apenas a 1a. Linha (coloque a URL do seu home assistant) e a linha 48 onde está “alexaroger” para um nome que você desejar - mas lembre-se disso.

HA_URL = ‘https://sua_url.duckdns.org:1880’ # sem barra no final

ALTERAÇÃO: Caso você utilize senha no ajuste do parâmetro http_node do node red, a URL acima deve ser da seguinte maneira:

HA_URL = ‘https://usu:senha@sua_url.duckdns.org:1880’ # sem barra no final
Onde usu = username que foi definido lá no ajuste e senha = password lá definido também!

OBS: A porta 1880 deverá ser aberta no seu roteador e a rota deverá ser encaminhada para a mesma porta do seu HA, ou seja, entra na 1880 no seu router e redireciona para a 1880 no seu HA.

Clique em Save e depois clique em Deploy

Chegou a hora de criar o código no HA e testar:

Abra no seu HA o NodeRed e importe o fluxo abaixo:

[{"id":"f5d3aad68b803fde","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"23414c3b8f211b64","type":"http in","z":"f5d3aad68b803fde","name":"Broker","url":"alexaroger/:scene_name","method":"post","upload":false,"swaggerDoc":"","x":70,"y":260,"wires":[["c5e6e5f46a029299","8df5a23f8793e356"]]},{"id":"0ce94b92e341f343","type":"http response","z":"f5d3aad68b803fde","name":"","statusCode":"200","headers":{},"x":460,"y":360,"wires":[]},{"id":"38a6115dfc5f4414","type":"function","z":"f5d3aad68b803fde","name":"","func":"msg.payload = \"A temperatura da piscina é \" + msg.payload + ' graus célsius';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":620,"y":100,"wires":[["df7386465bedf168"]]},{"id":"c5e6e5f46a029299","type":"switch","z":"f5d3aad68b803fde","name":"","property":"req.params.scene_name","propertyType":"msg","rules":[{"t":"cont","v":"temperatura da piscina","vt":"str"},{"t":"cont","v":"wally","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":210,"y":160,"wires":[["ee35f4e2d0df06fc","0ce94b92e341f343"],["0ce94b92e341f343","944e92423b9a12ca"],["0d5b13d6707b3617","f59e4e9bd8ea59d5"]]},{"id":"ee35f4e2d0df06fc","type":"api-current-state","z":"f5d3aad68b803fde","name":"Temp. Piscina","server":"5e34cdb.2f12b34","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.temperatura_piscina","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":440,"y":100,"wires":[["38a6115dfc5f4414"]]},{"id":"8df5a23f8793e356","type":"debug","z":"f5d3aad68b803fde","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":210,"y":300,"wires":[]},{"id":"f59e4e9bd8ea59d5","type":"http response","z":"f5d3aad68b803fde","name":"","statusCode":"501","headers":{},"x":460,"y":460,"wires":[]},{"id":"a5c0a8820388d0be","type":"comment","z":"f5d3aad68b803fde","name":"Pega dados/Exec. tarefa","info":"","x":410,"y":60,"wires":[]},{"id":"e2d441d74a45afbb","type":"comment","z":"f5d3aad68b803fde","name":"Monta resposta","info":"","x":620,"y":60,"wires":[]},{"id":"da627df564737129","type":"comment","z":"f5d3aad68b803fde","name":"https","info":"","x":70,"y":220,"wires":[]},{"id":"369458725b6e1681","type":"comment","z":"f5d3aad68b803fde","name":"Cenas/Palavras","info":"","x":200,"y":100,"wires":[]},{"id":"f2dadc1c916e2cd2","type":"comment","z":"f5d3aad68b803fde","name":"Ret. Ok","info":"","x":450,"y":320,"wires":[]},{"id":"44b5200cb9bd92f4","type":"comment","z":"f5d3aad68b803fde","name":"Ret. Erro","info":"","x":460,"y":420,"wires":[]},{"id":"0d5b13d6707b3617","type":"function","z":"f5d3aad68b803fde","name":"","func":"msg.payload = \"Não encontrei a cena \" + msg.req.params.scene_name;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":560,"y":280,"wires":[["df7386465bedf168"]]},{"id":"df7386465bedf168","type":"switch","z":"f5d3aad68b803fde","name":"Alexa ou Whats","property":"req.query.origin","propertyType":"msg","rules":[{"t":"eq","v":"alexa","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":780,"y":180,"wires":[["16132805dee81fb8"],["16132805dee81fb8"]]},{"id":"01bc4bb862c0b1dc","type":"comment","z":"f5d3aad68b803fde","name":"Responde não achou","info":"","x":560,"y":240,"wires":[]},{"id":"16132805dee81fb8","type":"debug","z":"f5d3aad68b803fde","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":810,"y":260,"wires":[]},{"id":"944e92423b9a12ca","type":"function","z":"f5d3aad68b803fde","name":"Wally está aqui","func":"msg.payload = \"Wally está aqui\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":160,"wires":[["df7386465bedf168"]]},{"id":"5e34cdb.2f12b34","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30"}]

Esse fluxo é um exemplo que você vai utilizar para aumentar os itens no “Switch” com as palavras que serão ditas na Alexa e serão direcionadas para o fluxo a ser construído a partir do switch “Contains”. Resumindo, você diz uma frase para a Alexa e no “contains” do switch você filtra por onde deseja passar o fluxo.
Lembra-se do arquivo que forneci do Drive na linha 48 onde estava “alexaroger” ? Então se você alterou para um outro nome qualquer, você deverá editar o nó da imagem acima que eu chamei de “Broker” e colocar o mesmo nome lá.

Você deve estar se perguntando: Nossa, que complicação, não entendi nada!

Não esquente a cabeça, importe o fluxo e clique em “deploy” e volte para o console do desenvolvedor da Alexa que iremos testar agora mesmo!

De volta no console do desenvolvedor da Alexa, clique na aba “Test” e selecione na opção “Development”. Digite “Alexa, Home Assistant”

Se tudo estiver feito conforme o tutorial e a porta 1880 aberta, a Alexa vai te perguntar Qual cena vc deseja ?

Escreva “Onde está Xpto” (informaremos errado só para ver a resposta ao fluxo)

Volte no NodeRed e na aba do fluxo importado veja clique na janela do “debug” que vai aparecer o msg.payload lá com a resposta da automação que você fez.

Pronto, agora o que você precisa fazer é inserir um nó de call service junto com o nó debug para que notifique a sua Alexa com a msg.payload que foi gerada pela sua automação.

Agora você pode dar o comando de voz na sua alexa dizendo: Alexa, Home Assistant. Ela vai te perguntar qual cena e você informará “Onde está Wally” e ela vai te responder o que foi programado na função dentro do NodeRed.

Espero que tenha gostado desse tutorial.
Deixe abaixo suas dúvidas e comentários e me dá um like ok?
Um abraço.

9 Likes

Parabéns pela iniciativa!!!

2 Likes

Parabéns por compartilhar!!! :clap: :clap: :clap:

1 Like

Excelente tutorial !!!

2 Likes

quando Digito: Alexa Home Assisstant

Ela responde:
Certo, aqui está Home Assistant

Para usá-la, é necessário acessar o aplicativo Alexa para vincular sua conta e concluir a configuração.

Ai criei a Skill com nome de: Home James

Ela responde:

“Audio only response”

Será que to fazendo alguma coisa errada?

Fez o teste ali na aba Test que tem no tutorial ?

Outra coisa que pode olhar é o histórico de atividades pelo app e ver como alexa entendeu a sua frase

Muito bom!

Tenho uma skill com esse mesmo nome pra tratar de intents de forma mais genérica.

Tô esperando sair a versão 2022.07 do HA que tem umas evoluções minhas.
Dando certo, publico pra turma.

Uso Cloudflare, consigo criar essa skill sem ter que liberar a porta já que minha net é CGNAT. e todas as minhas portas do roteador são bloqueadas pelo meu provedor???

Tem uma coisa que pode te ajudar: Vá na aba “Code” e clique no link “CloudWatch Logs” que fica logo abaixo do menu Code onde abrirá uma tela direto no log que pode ser identificado com a data e hora da sua interação. Expanda esse log e procure pelo erro.

Muito bom! Sei que muita gente trabalha regularmente com Home Assistant. Mas se pudermos compartihar um com os outros as nossas experiências, isso engrandece a comunidade.

Certo! Depois se fizer algo, conta pra gente como foi! Abs

Teria que ver qual porta sua é permitida e lá no addOn do NodeRed nos ajustes, vc pode tentar alterar a porta para essa que é aberta e no código do tutorial informar a mesma porta. Pode ser que funcione sim! Você pode usar algum site check-port para ver se a porta está aberta ou não,.

Nenhuma porta é liberada aqui por conta do meu provedor, posso liberar no modem e roteador mas não libera, aqui é CGNAT e sem acesso as portas do modem.

Apareceu isso:

O grupo de logs não existe

O grupo de logs específico: /aws/lambda/5296c7e3-exxxxxxxxxxxxxx5e9 não existe nesta conta ou região.

Você tem que ver o nome de invocação que ficou. Dá uma olhada na aba Build e do lado direito tem 1 - Invocation Name. Veja lá e o nome que estiver lá é o que vc terá que chamar na Alexa, ex: Alexa, nome que vc deu. O log deve estar em outro file. É gerado alguns logs em pastas diferentes.

Opa… agora deu certo… estava com letra maiúscula…

Achar um nome bacana pra chamar agora… hehehe

1 Like


Alguem consegue me ajudar o porque esta dando esse erro na importação.

1 Like

Eita, agora lembrei que fiquei devendo um tutorial pra galera.
Na época, estava esperando subir uma versão do HA que tinha uma evolução que eu tinha feito.
Já subiram faz tempo e eu esqueci de fazer.

Cara, eu uso intents.
É muito bom pq praticamente toda a configuração passa a ser feita no próprio HA.
E caso precise criar um intent novo, só usar alexa developer console que é todo web.

O código python é genérico e roda no aws.

identação somente… basta identar novamente

parabéns pelo projeto!!

me tira uma dúvida, existe alguma forma de capturar por MQTT?