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á
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.