Node-RED + Secrets: Usando informações do arquivo secrets.yaml no Node-RED!

image

Este post traz uma forma de usar informações armazenadas no arquivo secrets.yaml no Node-Red.

Não conhece o Secrets? Da uma lida aqui!

Usar o Secrets pode ser interessante para evitar colocar informações sensíveis (usuários, senhas, tokens, etc) diretamente no Node-Red (quando incluídas nos nodes do NodeRed a informação pode ser compatilhada indevidamente ao exportar um fluxo por exemplo).

Código no Node-Red para ler o arquivo secrets.yaml

A lógica desse fluxo é ao iniciar o HA o arquivo secrets.yaml será lido e carregado cada entrada como variável global do NodeRed.

[{"id":"28a3b392b4c78bf9","type":"tab","label":"Secrets","disabled":false,"info":""},{"id":"87a4e9ebb3ad0ccc","type":"group","z":"28a3b392b4c78bf9","name":"Set secrets.yaml Global Vars","style":{"stroke":"#92d04f","fill":"#e3f3d3","label":true},"nodes":["85f85b090b131976","2ad28be173d00562","b09d480c01504d1e","2c1695f5289633b5","f7bfe1ae3831533f","039f17153a1d53e1","0502c84c285e7ed9","b5583a838de46ca1"],"x":34,"y":39,"w":992,"h":222},{"id":"85f85b090b131976","type":"comment","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"Run on HA start","info":"","x":140,"y":80,"wires":[]},{"id":"2ad28be173d00562","type":"comment","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"Set global config vars with secrets.yaml entries","info":"https://bonani.tech/make-a-node-red-flow-run-on-home-assistant-start/","x":820,"y":120,"wires":[]},{"id":"b09d480c01504d1e","type":"server-events","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"HA Startup","server":"a6abbabc.4e9208","version":1,"event_type":"home_assistant_client","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"},{"property":"event_type","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":140,"y":160,"wires":[["2c1695f5289633b5"]]},{"id":"2c1695f5289633b5","type":"switch","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"running","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":290,"y":160,"wires":[["f7bfe1ae3831533f"]]},{"id":"f7bfe1ae3831533f","type":"file in","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"Read secrets.yaml","filename":"/config/secrets.yaml","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":490,"y":160,"wires":[["0502c84c285e7ed9"]]},{"id":"039f17153a1d53e1","type":"inject","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":220,"wires":[["f7bfe1ae3831533f"]]},{"id":"0502c84c285e7ed9","type":"yaml","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","property":"payload","name":"Parse yaml","x":690,"y":160,"wires":[["b5583a838de46ca1"]]},{"id":"b5583a838de46ca1","type":"function","z":"28a3b392b4c78bf9","g":"87a4e9ebb3ad0ccc","name":"Set global config vars","func":"for (let [key, value] of Object.entries(msg.payload)) {\n  global.set(key,value);\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":900,"y":160,"wires":[[]]},{"id":"a6abbabc.4e9208","type":"server","name":"Home Assistant","version":1,"legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

Acessando as variáveis global do Node-Red

Para ler a variável global que foi carregada do arquivo secrets.yaml basta usar um node function com o seguinte código:

msg.token = global.get("TokenAPIXXX");
return msg;

No exemplo acima, será carregado o valor da entrada TokenAPIXXX do arquivo secrets.yaml como msg.token. Para usar ela na continuação do fluxo basta usar {{token}}. Essas variáveis devem ser adaptadas de acordo com a sua aplicação.

Nem todos os nodes podem ser compatíveis com a configuração por variável, você deve consultar a documentação do node que você está usando.

3 Likes

Outra forma de utilizar é usando o JSONata como por exemplo:

$globalContext('TokenAPIXXX')

Usei por exemplo para ligar o alarme sem usar uma function, então fiz:

{"code": $globalContext('alarm_password')}

Lembre-se sempre de mudar para o JSONata caso for usar.

image

3 Likes