Here's my current work-in-progress. Copy it to the clipboard, import the clipboard into node-red, change the almond IP and password, and you'll have a set of nodes that monitor for messages from the Almond and can pass them along to other node-red functions. I'm currently using it to pass along information from an energy monitor to the emoncms service, and to monitor for my garage's tilt sensor and update a garage device in homebridge.
I've attached an image which shows a big function node with multiple outputs called "split based on device id in topic". In there, I've written a function that splits the incoming message from the almond and sends it out the output whose number matches the number by which the Almond has enumerated that particular device/sensor. After that node, one can do some fairly normal node-red stuff.
[{"id":"d6f09602.7975b8","type":"function","z":"bed89ec1.30a6","name":"split based on device id in topic","func":"device_number = parseInt(\n msg.topic.substring(\n msg.topic.lastIndexOf(\"/\") + 1,\n msg.topic.length\n ),\n 10\n );\n\nnode.error(\"device_number is \" + device_number);\n\nmsg_array = new Array(13).fill(null); //set up an array of outputs\n\nmsg_array[device_number] = msg; //incoming msg is routed only to the device's output\n\nnode.error(msg_array);\n\nreturn msg_array;","outputs":"13","noerr":0,"x":1030,"y":1000,"wires":[[],[],[],[],[],["3254dafc.6d5336"],[],[],[],[],[],["3bd3cc7f.ddff34"],[]],"outputLabels":["","","","","","","","","","","11","",""]},{"id":"5f661adc.91b6e4","type":"function","z":"bed89ec1.30a6","name":"change topic to almond device","func":"//input looks like\n//payload.Devices[\"11\"].DeviceValues[\"2\"]\n\nvar device_number = Object.keys(msg.payload.Devices)[0];\n//node.error (\"Device is number \" + device_number );\n\n//change topic to include device number\nmsg.topic = \"almond_device_update/\"+device_number;\n\nreturn msg;\n \n","outputs":1,"noerr":0,"x":730,"y":1060,"wires":[["d6f09602.7975b8"]]},{"id":"47f41454.0f395c","type":"debug","z":"bed89ec1.30a6","name":"test split output debug","active":true,"console":"false","complete":"payload","x":700,"y":960,"wires":[]},{"id":"9c11571c.8a98c8","type":"switch","z":"bed89ec1.30a6","name":"switch - case: DynamicIndexUpdated","property":"payload.CommandType","propertyType":"msg","rules":[{"t":"eq","v":"DynamicIndexUpdated","vt":"str"},{"t":"eq","v":"DynamicClientUpdated","vt":"str"}],"checkall":"true","outputs":2,"x":590,"y":1000,"wires":[["47f41454.0f395c","5f661adc.91b6e4"],[]],"outputLabels":["DynamicIndexUpdated","DynamicClientUpdated"]},{"id":"d0180633.8b5cf8","type":"json","z":"bed89ec1.30a6","name":"","pretty":true,"x":370,"y":1000,"wires":[["9c11571c.8a98c8"]]},{"id":"d2cb86ee.568958","type":"debug","z":"bed89ec1.30a6","name":"from receive from almond+","active":false,"console":"false","complete":"payload","x":300,"y":920,"wires":[]},{"id":"17de8a42.23a716","type":"file","z":"bed89ec1.30a6","name":"write almond log","filename":"almond_log.txt","appendNewline":true,"overwriteFile":"false","x":250,"y":1060,"wires":[]},{"id":"b8640268.63c85","type":"websocket in","z":"bed89ec1.30a6","name":"listen to almond+ messages","server":"","client":"6a76d828.cff8f8","x":140,"y":980,"wires":[["17de8a42.23a716","d2cb86ee.568958","d0180633.8b5cf8"]]},{"id":"3254dafc.6d5336","type":"function","z":"bed89ec1.30a6","name":"simple name:value pair","func":"//payload.Devices[\"11\"].DeviceValues[\"2\"]\n\nvar device_number = Object.keys(msg.payload.Devices)[0];\n//node.error (\"Device is number \" + device_number );\n\nvar device_values_object_number = Object.keys(msg.payload.Devices[device_number].DeviceValues)[0];\n//node.error (\"Device values_object_number is \" + device_values_object_number );\n\n//node.error (msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Name + \" : \" + msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Value);\n\n\n\nmsg.payload = msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Name + \": \" + msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Value;\n\nnode.error (\"last bit of topic: \" + msg.topic.substring(msg.topic.lastIndexOf(\"/\") + 1, msg.topic.length));\n\nreturn msg;\n \n","outputs":1,"noerr":0,"x":1310,"y":1020,"wires":[["51a56b3e.c9c334","418da39b.9c130c"]]},{"id":"3bd3cc7f.ddff34","type":"function","z":"bed89ec1.30a6","name":"simple name:value pair","func":"//payload.Devices[\"11\"].DeviceValues[\"2\"]\n\nvar device_number = Object.keys(msg.payload.Devices)[0];\n//node.error (\"Device is number \" + device_number );\n\nvar device_values_object_number = Object.keys(msg.payload.Devices[device_number].DeviceValues)[0];\n//node.error (\"Device values_object_number is \" + device_values_object_number );\n\n//node.error (msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Name + \" : \" + msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Value);\n\n\n\nmsg.payload = msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Name + \": \" + msg.payload.Devices[device_number].DeviceValues[device_values_object_number].Value;\n\nnode.error (\"last bit of topic: \" + msg.topic.substring(msg.topic.lastIndexOf(\"/\") + 1, msg.topic.length));\n\nreturn msg;\n \n","outputs":1,"noerr":0,"x":1310,"y":1060,"wires":[["24e80a2.87025f6","51a56b3e.c9c334"]]},{"id":"51a56b3e.c9c334","type":"debug","z":"bed89ec1.30a6","name":"after split function","active":true,"console":"false","complete":"payload","x":1590,"y":1020,"wires":[]},{"id":"6a76d828.cff8f8","type":"websocket-client","path":"ws://root:myAlmondPassword@MyLocalAlmondIPAddress:7681/twirp","wholemsg":"false"}]