There are always multiple ways to achieve the same ends.
I don't think this is a better solution than yours, just that it handles a RESET injection.
Considering that your input data is an array of numbers (though you have hinted it might sometimes contain numbers as strings and perhaps "ERROR BOARD NOT FOUND"), I might approach it like this.
Use a split node to break the input into messages each with a single value.
A function to process these messages.
A switch node to route the output to the dashboard widgets based on msg.parts.index.
To achieve the reset function inject an array of 21 empty strings and topic "RESET"
The function node would be something like this
[{"id":"356c4f0ce5e69212","type":"inject","z":"845828586139eeb4","name":"Sample data","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[1,\"2\",\"ERROR\"]","payloadType":"jsonata","x":110,"y":260,"wires":[["6ff80d1b39744e05"]]},{"id":"6ff80d1b39744e05","type":"split","z":"845828586139eeb4","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":370,"y":260,"wires":[["c1456f65f632c1c5"]]},{"id":"c1456f65f632c1c5","type":"function","z":"845828586139eeb4","name":"function 1","func":"if (msg.payload === \"ERROR\") { // Handle ERROR\n msg.payload = \"-1\"\n}\nif (msg.topic === \"RESET\") { // Send \" \" for RESET topic\n msg.payload = \" \"\n}\nelse {\n msg.payload = Number(msg.payload)\n msg.colour = \"green\"\n if (msg.payload > 1200 || msg.payload < 10) {\n msg.colour = \"red\"\n }\n}\nreturn msg","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":260,"wires":[["6dd4c24e0413fd1c"]]},{"id":"6dd4c24e0413fd1c","type":"switch","z":"845828586139eeb4","name":"","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"2","vt":"num"},{"t":"eq","v":"3","vt":"num"},{"t":"eq","v":"4","vt":"num"},{"t":"eq","v":"5","vt":"num"},{"t":"eq","v":"6","vt":"num"},{"t":"eq","v":"7","vt":"num"},{"t":"eq","v":"8","vt":"num"},{"t":"eq","v":"9","vt":"num"},{"t":"eq","v":"10","vt":"num"},{"t":"eq","v":"11","vt":"num"},{"t":"eq","v":"12","vt":"num"},{"t":"eq","v":"13","vt":"num"},{"t":"eq","v":"14","vt":"num"},{"t":"eq","v":"15","vt":"num"},{"t":"eq","v":"16","vt":"num"},{"t":"eq","v":"17","vt":"num"},{"t":"eq","v":"18","vt":"num"},{"t":"eq","v":"19","vt":"num"},{"t":"eq","v":"20","vt":"num"}],"checkall":"true","repair":false,"outputs":21,"x":630,"y":260,"wires":[["1292dfe446098937"],["4ae09484e4d3130a"],["c57cfc0b45de138d"],["fedb633e6e0d2891"],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],["0538a0270a693b3d"]]},{"id":"1292dfe446098937","type":"debug","z":"845828586139eeb4","name":"0","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":100,"wires":[]},{"id":"4ae09484e4d3130a","type":"debug","z":"845828586139eeb4","name":"1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":140,"wires":[]},{"id":"c57cfc0b45de138d","type":"debug","z":"845828586139eeb4","name":"2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":180,"wires":[]},{"id":"fedb633e6e0d2891","type":"debug","z":"845828586139eeb4","name":"3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":220,"wires":[]},{"id":"4ff544b6599472a2","type":"inject","z":"845828586139eeb4","name":"Reset - array of empty strings","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"RESET","payload":"[\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \"]","payloadType":"json","x":160,"y":300,"wires":[["6ff80d1b39744e05"]]},{"id":"0538a0270a693b3d","type":"debug","z":"845828586139eeb4","name":"etc","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":400,"wires":[]}]
I agree it's a bit of a pain to handle an input which might be a string, might be a number and might contain "ERROR".
That is why my function has if(msg.payload === "ERROR)
and not if (msg.payload.includes("ERROR))