HomeKit button (subflow)
Subflow to be used with Homebridge-mqtt plugin
This subflow adds a new button (StatelessProgrammableSwitch) to HomeKit and sends single, double or long presses based on button pressed/released timing (e.g. GPIO binary switch) or direct commands (e.g. flic or zigbee remotes or automated triggers).
If you are using an IHC controller, you should create the multipress logic in the original controller software instead and then send direct commands (not pressed/released commands) into this subflow.
Subflow
Example flow 1
Example flow 2
Copy the subflow below to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option
[{"id":"e07daeea.12da3","type":"subflow","name":"HomeKit button","info":"","category":"","in":[{"x":40,"y":280,"wires":[{"id":"dd2cb1bc.ef7bc"}]}],"out":[{"x":860,"y":360,"wires":[{"id":"118b3ae0.ae56b5","port":0},{"id":"b6436a91.029aa8","port":0},{"id":"36f9611d.de274e","port":0},{"id":"767ee3fa.67821c","port":0},{"id":"9e63d4b8.7ba9d8","port":0}]}],"env":[{"name":"ButtonName","type":"str","value":"Unique Button Name","ui":{"type":"input","opts":{"types":["str"]},"label":{}}},{"name":"AddRemove","type":"str","value":"Add button","ui":{"label":{"en-US":"Add/Remove?"},"type":"select","opts":{"opts":[{"l":{"en-US":"Add button"},"v":"Add button"},{"l":{"en-US":"Remove button"},"v":"Remove button"}]}}},{"name":"ButtonPressed","type":"str","value":"0"},{"name":"ButtonReleased","type":"str","value":"1"},{"name":"Single press","type":"str","value":"Single press"},{"name":"Double press","type":"str","value":"Double press"},{"name":"Long press","type":"str","value":"Long press"}],"color":"#E6E0F8","inputLabels":["from trigger"],"outputLabels":["to empty mqtt node"],"icon":"node-red/serial.svg","status":{"x":860,"y":420,"wires":[{"id":"df1867dd.39a078","port":0},{"id":"6d681a27.8a4e64","port":0},{"id":"6f99b443.858bac","port":0}]}},{"id":"dbfe84ef.95f6f8","type":"trigger","z":"e07daeea.12da3","op1":"","op2":"some press","op1type":"nul","op2type":"str","duration":"400","extend":false,"units":"ms","reset":"","bytopic":"all","name":"Wait for 400 ms","x":440,"y":380,"wires":[["62f65a14.88e934"]]},{"id":"dd2cb1bc.ef7bc","type":"switch","z":"e07daeea.12da3","name":"Sort inputs","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"ButtonReleased","vt":"env"},{"t":"eq","v":"Single press","vt":"env"},{"t":"eq","v":"Double press","vt":"env"},{"t":"eq","v":"Long press","vt":"env"},{"t":"eq","v":"ButtonPressed","vt":"env"}],"checkall":"true","repair":false,"outputs":5,"x":170,"y":280,"wires":[["dbfe84ef.95f6f8","e5596904.d2ad88"],["767ee3fa.67821c"],["9e63d4b8.7ba9d8"],["36f9611d.de274e"],["21fd5fd4.d190c","8e45bd88.ae8ca"]]},{"id":"21fd5fd4.d190c","type":"trigger","z":"e07daeea.12da3","op1":"","op2":"1","op1type":"nul","op2type":"str","duration":"1.5","extend":false,"units":"s","reset":"","bytopic":"all","name":"Wait for 1.5 s","x":430,"y":280,"wires":[["36f9611d.de274e"]]},{"id":"62f65a14.88e934","type":"switch","z":"e07daeea.12da3","name":"Single press or null","property":"presses","propertyType":"flow","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"null"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":470,"y":440,"wires":[["767ee3fa.67821c"],["767ee3fa.67821c"],["640262f1.1861cc"]]},{"id":"e5596904.d2ad88","type":"change","z":"e07daeea.12da3","name":"reset trigger","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":240,"wires":[["21fd5fd4.d190c"]]},{"id":"8e45bd88.ae8ca","type":"change","z":"e07daeea.12da3","name":"press timers","rules":[{"t":"move","p":"NewTime","pt":"flow","to":"OldTime","tot":"flow"},{"t":"set","p":"NewTime","pt":"flow","to":"","tot":"date"}],"action":"","property":"","from":"","to":"","reg":false,"x":170,"y":340,"wires":[["7bec4f2d.c72f9"]]},{"id":"7bec4f2d.c72f9","type":"function","z":"e07daeea.12da3","name":"Double press?","func":"if (flow.get(\"NewTime\") - flow.get(\"OldTime\") <= 400)\n{\n msg.reset = true;\n return msg;\n}","outputs":1,"noerr":0,"x":180,"y":380,"wires":[["dbfe84ef.95f6f8","9e63d4b8.7ba9d8"]]},{"id":"5c509234.70171c","type":"inject","z":"e07daeea.12da3","name":"inject once on deploy","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":200,"y":60,"wires":[["ef944076.f74d2"]]},{"id":"118b3ae0.ae56b5","type":"change","z":"e07daeea.12da3","name":"Remove button","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"name\":$env('ButtonName'), \"service\":\"StatelessProgrammableSwitch\"}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homebridge/to/remove","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":140,"wires":[["df1867dd.39a078"]]},{"id":"ef944076.f74d2","type":"switch","z":"e07daeea.12da3","name":"Add/Remove","property":"AddRemove","propertyType":"env","rules":[{"t":"eq","v":"Add button","vt":"str"},{"t":"eq","v":"Remove button","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":270,"y":100,"wires":[["b6436a91.029aa8"],["118b3ae0.ae56b5"]]},{"id":"b6436a91.029aa8","type":"change","z":"e07daeea.12da3","name":"Add button","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"name\":$env('ButtonName'), \"service\":\"StatelessProgrammableSwitch\"}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homebridge/to/add","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":60,"wires":[["6d681a27.8a4e64"]]},{"id":"df1867dd.39a078","type":"change","z":"e07daeea.12da3","name":"status text","rules":[{"t":"set","p":"payload","pt":"msg","to":"$env('ButtonName') & \" removed from Homebridge\"","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":180,"wires":[[]]},{"id":"6d681a27.8a4e64","type":"change","z":"e07daeea.12da3","name":"status text","rules":[{"t":"set","p":"payload","pt":"msg","to":"$env('ButtonName') & \" added to Homebridge\"","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":100,"wires":[[]]},{"id":"6f99b443.858bac","type":"change","z":"e07daeea.12da3","name":"Status text","rules":[{"t":"set","p":"payload","pt":"msg","to":"presses","tot":"flow"},{"t":"change","p":"payload","pt":"msg","from":"0","fromt":"num","to":"Single press","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"1","fromt":"num","to":"Double press","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"2","fromt":"num","to":"Long press","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":420,"wires":[[]]},{"id":"36f9611d.de274e","type":"change","z":"e07daeea.12da3","name":"Send long press","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t \"name\":$env('ButtonName'),\t \"characteristic\":\"ProgrammableSwitchEvent\",\t \"value\":2\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homebridge/to/set","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"2","tot":"num"},{"t":"set","p":"presses","pt":"flow","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":320,"wires":[["6f99b443.858bac"]]},{"id":"767ee3fa.67821c","type":"change","z":"e07daeea.12da3","name":"Send single press","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t \"name\":$env('ButtonName'),\t \"characteristic\":\"ProgrammableSwitchEvent\",\t \"value\":0\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homebridge/to/set","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"2","tot":"num"},{"t":"set","p":"presses","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":540,"wires":[["6f99b443.858bac"]]},{"id":"9e63d4b8.7ba9d8","type":"change","z":"e07daeea.12da3","name":"Send double press","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t \"name\":$env('ButtonName'),\t \"characteristic\":\"ProgrammableSwitchEvent\",\t \"value\":1\t}","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"homebridge/to/set","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"2","tot":"num"},{"t":"set","p":"presses","pt":"flow","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":580,"wires":[["6f99b443.858bac"]]},{"id":"640262f1.1861cc","type":"change","z":"e07daeea.12da3","name":"Set flow.presses","rules":[{"t":"set","p":"presses","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":500,"wires":[[]]},{"id":"170c488d.765a27","type":"comment","z":"e07daeea.12da3","name":"Link to latest version of this subflow","info":"https://flows.nodered.org/flow/98aa074f7fe60fab198dcbf758599c0b","x":200,"y":180,"wires":[]}]