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: Catálogo de tutoriais para o novato em Node-RED! Comece por aqui!

Funcionamento:

Criaremos uma skill chamada “Home Assistant” e depois de tudo pronto diremos para a Alexa: “Alexa, Home Assistant” 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 Home Assistant, 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” 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)

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.

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 ok?
Um abraço.

5 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