Just to prove @greengolfer point, it is doable by built in nodes (however, I find 1 function more concise than these three nodes) - the choice is yours....
Flow version...
[{"id":"de756e4a.331f7","type":"switch","z":"c3af41e4.dd1e9","name":"pin == twelve or thirteen?","property":"payload.slots.pin","propertyType":"msg","rules":[{"t":"eq","v":"twelve","vt":"str"},{"t":"eq","v":"thirteen","vt":"str"},{"t":"eq","v":"","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":430,"y":360,"wires":[["8aa8e71f.cc4b38"],["8aa8e71f.cc4b38"],[]]},{"id":"8aa8e71f.cc4b38","type":"change","z":"c3af41e4.dd1e9","name":"SET on-->1 off-->0 other-->null","rules":[{"t":"set","p":"payload","pt":"msg","to":"(msg.payload.slots.state = \"on\" ? 1 : (msg.payload.slots.state = \"off\" ? 0 : null))","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":360,"wires":[["878a9bba.20c268"]]},{"id":"878a9bba.20c268","type":"switch","z":"c3af41e4.dd1e9","name":"payload not null?","property":"payload","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":450,"y":420,"wires":[["59bfa586.cf740c"]]},{"id":"76cd6c22.199264","type":"inject","z":"c3af41e4.dd1e9","name":"twelve on","topic":"","payload":"{\"slots\":{\"pin\":\"twelve\",\"state\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":300,"wires":[["de756e4a.331f7"]]},{"id":"59bfa586.cf740c","type":"debug","z":"c3af41e4.dd1e9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":650,"y":420,"wires":[]},{"id":"a56be6ca.07e228","type":"inject","z":"c3af41e4.dd1e9","name":"twelve off","topic":"","payload":"{\"slots\":{\"pin\":\"twelve\",\"state\":\"off\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":340,"wires":[["de756e4a.331f7"]]},{"id":"a2439395.f3c12","type":"inject","z":"c3af41e4.dd1e9","name":"thirteen on","topic":"","payload":"{\"slots\":{\"pin\":\"thirteen\",\"state\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":400,"wires":[["de756e4a.331f7"]]},{"id":"80706485.376ad8","type":"inject","z":"c3af41e4.dd1e9","name":"thirteen off","topic":"","payload":"{\"slots\":{\"pin\":\"thirteen\",\"state\":\"off\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":440,"wires":[["de756e4a.331f7"]]},{"id":"a06943bc.7c3ba","type":"inject","z":"c3af41e4.dd1e9","name":"thirteen _bad_","topic":"","payload":"{\"slots\":{\"pin\":\"thirteen\",\"state\":\"_bad_\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":540,"wires":[["de756e4a.331f7"]]},{"id":"9174e232.43738","type":"inject","z":"c3af41e4.dd1e9","name":"nineteen on","topic":"","payload":"{\"slots\":{\"pin\":\"nineteen\",\"state\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":580,"wires":[["de756e4a.331f7"]]},{"id":"17a10d29.d8d2f3","type":"comment","z":"c3af41e4.dd1e9","name":"OK tests","info":"","x":160,"y":260,"wires":[]},{"id":"2fe60e68.7e03a2","type":"comment","z":"c3af41e4.dd1e9","name":"BAD tests","info":"","x":160,"y":500,"wires":[]}]
Pros
- visually simple
- no function node
Downsides
- JSONata in change node not so easy on the eyes
- hard coded design time solution (couldnt update allowable pins from a dashboard or databaes for example)
The function version...
[{"id":"90f20706.f28aa8","type":"inject","z":"c3af41e4.dd1e9","name":"twelve on","topic":"","payload":"{\"slots\":{\"pin\":\"twelve\",\"state\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":720,"wires":[["b0594b91.92d008"]]},{"id":"e8498189.482ac","type":"inject","z":"c3af41e4.dd1e9","name":"twelve off","topic":"","payload":"{\"slots\":{\"pin\":\"twelve\",\"state\":\"off\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":760,"wires":[["b0594b91.92d008"]]},{"id":"fd1b0ba0.817f88","type":"inject","z":"c3af41e4.dd1e9","name":"thirteen on","topic":"","payload":"{\"slots\":{\"pin\":\"thirteen\",\"state\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":820,"wires":[["b0594b91.92d008"]]},{"id":"ad473970.7e2c58","type":"inject","z":"c3af41e4.dd1e9","name":"thirteen off","topic":"","payload":"{\"slots\":{\"pin\":\"thirteen\",\"state\":\"off\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":860,"wires":[["b0594b91.92d008"]]},{"id":"4d30bc3b.8c1d14","type":"inject","z":"c3af41e4.dd1e9","name":"thirteen _bad_","topic":"","payload":"{\"slots\":{\"pin\":\"thirteen\",\"state\":\"_bad_\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":960,"wires":[["b0594b91.92d008"]]},{"id":"4a35a555.3a6abc","type":"inject","z":"c3af41e4.dd1e9","name":"nineteen on","topic":"","payload":"{\"slots\":{\"pin\":\"nineteen\",\"state\":\"on\"}}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":1000,"wires":[["b0594b91.92d008"]]},{"id":"8a54e71b.19a6d8","type":"comment","z":"c3af41e4.dd1e9","name":"OK tests","info":"","x":160,"y":680,"wires":[]},{"id":"f2ac0465.a7a068","type":"comment","z":"c3af41e4.dd1e9","name":"BAD tests","info":"","x":160,"y":920,"wires":[]},{"id":"b0594b91.92d008","type":"function","z":"c3af41e4.dd1e9","name":"state==on => 1, state==off => 0 (allowed pins only)","func":"\nconst stateLookup = {\"on\":1, \"off\":0};\nconst allowedPins = flow.get(\"allowedPins\") || [];\nif ( allowedPins.includes(msg.payload.slots.pin) ) {\n msg.payload = stateLookup[msg.payload.slots.state];\n if(msg.payload != null) return msg; //only send msg to next node if payload is \"something\" \n} ","outputs":1,"noerr":0,"x":530,"y":780,"wires":[["36651d47.524902"]]},{"id":"36651d47.524902","type":"debug","z":"c3af41e4.dd1e9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":650,"y":840,"wires":[]},{"id":"5d67f7c7.1b5d48","type":"inject","z":"c3af41e4.dd1e9","name":"Initialise","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":400,"y":700,"wires":[["5d58dbe7.885cd4"]]},{"id":"5d58dbe7.885cd4","type":"change","z":"c3af41e4.dd1e9","name":"Setup allowed pins","rules":[{"t":"set","p":"allowedPins","pt":"flow","to":"[\"twelve\",\"thirteen\"]","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":570,"y":700,"wires":[[]]}]
Pros
- easier to maintain (IMO)
- runtime automatable i.e. from a dashboard / database (as the "allowable pins" are stored in context, you could change these at runtime)
Downsides
- function node not to everyones liking