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.