Na minha opinião, uma das principais desvantagens do homebridge é a falta de capacidade de criar scripts avançados. Toda a automação é atribuída ao centro doméstico, que pode ser um iPad (conectado ao carregamento), Apple TV ou HomePod. Nem todo mundo tem esses dispositivos; além disso, o HomeKit tem uma automação muito ruim. Esta situação pode ser 
corrigida usando 
Node-Red . O artigo é destinado a usuários que já 
possuem o homebridge 
instalado e configurado .

Resumidamente: o Node-RED é uma ferramenta para conectar hardware, APIs e serviços online, criando links entre vários nós (blocos).
Definição no site oficial:O Node-RED é uma ferramenta de programação para conectar dispositivos de hardware, APIs e serviços online de maneiras novas e interessantes.
Ele fornece um editor baseado em navegador que facilita a conexão de fluxos usando a ampla variedade de nós na paleta que podem ser implementados em seu tempo de execução com um único clique.
 No Raspbian, isso está instalado:
sudo apt-get install nodered sudo systemctl enable nodered.service sudo service nodered start 
Por padrão, o Node-Red é executado na porta 1880.
Existe uma enorme 
biblioteca de módulos com conjuntos de blocos de várias funcionalidades. Não poupado e homebridge. Instale o 
node-red-contrib-homebridge-automation :
 cd ~/.node-red npm install node-red-contrib-homebridge-automation sudo service nodered restart 
Vamos tentar ligar a lâmpada. Para fazer isso, arraste o 
hb-control , o bloco de 
funções (este bloco enviará um comando para ativar) e o 
injete (na estrutura deste artigo, é necessário apenas ativar manualmente o script). Pela primeira vez, para 
blocos hb, você precisa especificar um 
PIN e atualizar a lista de dispositivos. Então você pode adicionar os blocos necessários:

Agora, clicando no botão no bloco de 
injeção , a 
luz deve acender. Além do 
hb-contoll, também existem 
blocos hb-event, hb-status e hb-resume . Uma descrição detalhada dos blocos pode ser encontrada no 
repositório oficial.
Código do bloco funcional var ret_msg={}; ret_msg.payload = {}; ret_msg.payload.On = true; return ret_msg; 
 O bloco de 
funções foi projetado para manipular dados usando os recursos JavaScript. O bloco aceita a variável 
msg junto com o parâmetro 
payload , por padrão, a maioria dos blocos no Node-Red funciona com o parâmetro 
payload .
Vale a pena falar sobre o bloco 
Debug , com ele é possível ver a saída dos blocos, para que você entenda qual é o erro se sua ideia não funcionar.
Agora vamos fazer algo interessante, por exemplo, mudar o estado da luz depois de girar o 
MagicCube 90 graus. Em um 
artigo anterior, mostrei como fazer amigos zigbeeem dispositivos com homebridge. O MagicCube, como outros dispositivos zigbee, aparecerá no broker MQTT após o emparelhamento.
O Nó-Vermelho suporta o protocolo MQTT imediatamente. Inclua o bloco MQTT, especifique o endereço do servidor e o cubo de tópico.

Um cubo pode transmitir os seguintes estados:
agitar, ativar, cair, tocar, deslizar, flip180, flip90, rotate_left e rotate_rightAdicione um bloco de 
chave para separar um estado do outro. Defina 
flip90 , 
agite e 
toque nas condições no 
interruptor . Conecte a saída superior ao 
status hb para obter o status atual da lâmpada. O bloco de 
status hb é 
conectado ao bloco 
Inverter ao valor , invertendo o estado, e sua saída é conectada ao 
controlador hb e, quando o cubo é girado, a lâmpada muda para o estado ligado / desligado. Deve ser algo como isto:

Inverter código de valor var ret_msg=msg; ret_msg.payload.On = !msg.payload.On; return ret_msg; 
 O fluxo pode ser importado daqui:
Flow [ { "id": "f0f31eb6.22f16", "type": "tab", "label": "Flow 1", "disabled": false, "info": "" }, { "id": "e0f72465.9e4fb8", "type": "mqtt in", "z": "f0f31eb6.22f16", "name": "", "topic": "zigbee2mqtt/0x00158d00010f0528", "qos": "2", "datatype": "auto", "broker": "8ec472b.e73e29", "x": 160, "y": 80, "wires": [ [ "43f74679.730588" ] ] }, { "id": "8539109.d872ff", "type": "debug", "z": "f0f31eb6.22f16", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "x": 670, "y": 60, "wires": [] }, { "id": "c5db7c5b.399f4", "type": "hb-status", "z": "f0f31eb6.22f16", "name": "Room1", "Homebridge": "HomeBridge", "Manufacturer": "YeeLight", "Service": "Lightbulb", "device": "HomeBridgeA1:23:AD:E3:CD:32YeeLightRoom100000043", "conf": "7948a496.505c2c", "x": 340, "y": 180, "wires": [ [ "9ef696d9.51a378" ] ] }, { "id": "43f74679.730588", "type": "switch", "z": "f0f31eb6.22f16", "name": "CubeActions", "property": "payload", "propertyType": "msg", "rules": [ { "t": "cont", "v": "flip90", "vt": "str" }, { "t": "cont", "v": "tap", "vt": "str" }, { "t": "cont", "v": "shake", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 3, "x": 150, "y": 240, "wires": [ [ "c5db7c5b.399f4" ], [], [] ] }, { "id": "f476dcba.a6511", "type": "hb-control", "z": "f0f31eb6.22f16", "name": "Room1", "Homebridge": "HomeBridge", "Manufacturer": "YeeLight", "Service": "Lightbulb", "device": "HomeBridgeA1:23:AD:E3:CD:32YeeLightRoom100000043", "conf": "7948a496.505c2c", "x": 700, "y": 180, "wires": [] }, { "id": "9ef696d9.51a378", "type": "function", "z": "f0f31eb6.22f16", "name": "Invert On Value", "func": "var ret_msg=msg;\nret_msg.payload.On = !msg.payload.On;\nreturn ret_msg;", "outputs": 1, "noerr": 0, "x": 520, "y": 180, "wires": [ [ "f476dcba.a6511" ] ] }, { "id": "8ec472b.e73e29", "type": "mqtt-broker", "z": "", "name": "mosquitto", "broker": "127.0.0.1", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closeQos": "0", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" }, { "id": "7948a496.505c2c", "type": "hb-conf", "z": "", "username": "111-11-111" } ] 
 Assim, é possível "esculpir" esquemas complexos de automação a partir de blocos. Na 
biblioteca, você encontra módulos com conjuntos de blocos para tarefas completamente diferentes, por exemplo, para gravar câmeras de vigilância por vídeo ou trabalhar com arquivos de câmeras.
PS Pensamentos em voz alta:Estou assombrado com o pensamento de que, não importa como a tecnologia se desenvolva, muitos ainda estão muito longe da automação banal dos processos de trabalho e vida através da programação. Eu realmente espero que, com o advento de ferramentas como 
Node-Red ou 
Blockly , o limite de entrada diminua bastante. Tendo aprendido como construir um sistema a partir de cubos no mesmo Nó-Vermelho, as pessoas provavelmente chegarão ao bloco de 
funções e aprenderão JS com interesse, e então tudo acontecerá por si só.