Here's a subflow I wrote to encapsulate the ideas we were discussing if anyones interested - I switched to using a stored array instead of an accumulator.
This is now generic enough that you can translate any button or button combinations to a predefined button press (or any output!) by simply editing the BTN_TABLE "property" (environment variable) of the subflow.
Thanks to @stephen_nutt for bringing this up! Was a fun exercise and excellent distraction.
Button Press Translator Example
[{"id":"3b59914daaad2161","type":"subflow","name":"Button Press Translator","info":"","category":"","in":[{"x":40,"y":40,"wires":[{"id":"f4a31b548b18b7f0"}]}],"out":[{"x":740,"y":100,"wires":[{"id":"14dc4f13e03c8ecf","port":0}]}],"env":[{"name":"BTN_TABLE","type":"json","value":"[{\"buttonInput\":\"1/3/5/7\",\"buttonOutput\":11},{\"buttonInput\":\"2/4/6/8\",\"buttonOutput\":12}]"},{"name":"DELAYMS","type":"num","value":"250"}],"meta":{},"color":"#FFCC66","icon":"node-red-dashboard/ui_button.png","status":{"x":740,"y":200,"wires":[{"id":"c1a0f431fda7ce6b","port":0}]}},{"id":"f4a31b548b18b7f0","type":"function","z":"3b59914daaad2161","name":"accumulate presses","func":"var presses = flow.get(\"presses\");\n\nif (!presses) {\n presses = [];\n}\n\npresses.push(msg.payload.value);\n\nflow.set(\"presses\",presses)\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is started.\ncontext.set(\"presses\",undefined)","finalize":"","libs":[],"x":240,"y":60,"wires":[["207f439b5db01e9a"]]},{"id":"207f439b5db01e9a","type":"timed-counter","z":"3b59914daaad2161","name":"","timelimit":"${DELAYMS}","timeunit":1,"withhold":true,"fixedtimeout":false,"pertopic":false,"x":220,"y":140,"wires":[["14dc4f13e03c8ecf"]]},{"id":"14dc4f13e03c8ecf","type":"function","z":"3b59914daaad2161","name":"set press","func":"var presses = flow.get(\"presses\");\nvar btnChecker = env.get(\"BTN_TABLE\");\n\nfor (var i=0;i<btnChecker.length;i++){\n btnInput = btnChecker[i].buttonInput.split(\"/\");\n if ( checkArrays(btnInput, presses) ) {\n presses = [];\n presses.push(btnChecker[i].buttonOutput);\n break;\n }\n}\nmsg.payload.value = presses[0];\n\nflow.set(\"presses\",undefined);\n\nreturn msg;\n\nfunction checkArrays(arr1, arr2){\n\n var matchCnt = 0;\n for (var i=0;i<arr1.length;i++){\n for (var j=0;j<arr2.length;j++){\n if (arr1[i] == arr2[j]){\n matchCnt++;\n }\n }\n }\n \n matched = (matchCnt === arr1.length);\n\n return matched;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":140,"wires":[["c1a0f431fda7ce6b"]]},{"id":"c1a0f431fda7ce6b","type":"change","z":"3b59914daaad2161","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"\"pressed:\" & payload.value","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":200,"wires":[[]]},{"id":"5b92a30a881fb575","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":120,"y":2720,"wires":[["91ae50c491d266d4","edfb7332ab5a993c","94b8e1f5ae382133","3db9809a304abea3"]]},{"id":"91ae50c491d266d4","type":"change","z":"b38ec3180db9ae33","name":"Press 2","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2600,"wires":[["597710c16b111e3b"]]},{"id":"edfb7332ab5a993c","type":"change","z":"b38ec3180db9ae33","name":"Press 4","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"4","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2700,"wires":[["80ceba24addb5ded"]]},{"id":"94b8e1f5ae382133","type":"change","z":"b38ec3180db9ae33","name":"Press 6","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"6","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2780,"wires":[["ae21cc7d8292821c"]]},{"id":"3db9809a304abea3","type":"change","z":"b38ec3180db9ae33","name":"Press 8","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"8","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2860,"wires":[["4efa689786a6dc47"]]},{"id":"33b28698d5222fe3","type":"debug","z":"b38ec3180db9ae33","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":900,"y":2600,"wires":[]},{"id":"80ceba24addb5ded","type":"delay","z":"b38ec3180db9ae33","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":650,"y":2720,"wires":[["597710c16b111e3b"]]},{"id":"ae21cc7d8292821c","type":"delay","z":"b38ec3180db9ae33","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":650,"y":2780,"wires":[["80ceba24addb5ded"]]},{"id":"4efa689786a6dc47","type":"delay","z":"b38ec3180db9ae33","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":650,"y":2860,"wires":[["ae21cc7d8292821c"]]},{"id":"597710c16b111e3b","type":"subflow:3b59914daaad2161","z":"b38ec3180db9ae33","name":"","x":680,"y":2600,"wires":[["33b28698d5222fe3"]]},{"id":"1c1a8263cc551205","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2600,"wires":[["91ae50c491d266d4"]]},{"id":"82f98f6f9f239453","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2660,"wires":[["edfb7332ab5a993c"]]},{"id":"b09db359cb08630f","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2780,"wires":[["94b8e1f5ae382133"]]},{"id":"2493e46bc560ee8a","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2860,"wires":[["3db9809a304abea3"]]}]
edit: You DO need the "node-red-contrib-timed-counter" installed...