Please note: These suggestions are for Dashboard 1 (will probably need modifying for DB-2).
I made a train arrivals board a few years ago using the 'ring buffer' node.
Here's part of the NR flow...
[{"id":"4dc1bb2f.93f96c","type":"group","z":"f233685a.5de4f","name":"","style":{"stroke":"#000000","fill":"#d1d1d1","fill-opacity":"0.51","label":true},"nodes":["f55aa089.ee3a1","10c76796.2a23a8","721e03ac.771e2c","70a4fcad.b5751c","962557b.b9a27a8","e254e87b.dc563","15aba88d.bdb8df","67a87dfc.d11bd4","ea595c5.e38f9a"],"x":1314,"y":779,"w":1032,"h":222},{"id":"f55aa089.ee3a1","type":"ui_template","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","group":"e6d438e4.34caf8","name":"PR arrivals board","order":1,"width":"8","height":"5","format":"<div ng-bind-html=\"msg.payload\" style=\"overflow:auto\"></div>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"local","className":"","x":2230,"y":960,"wires":[[]]},{"id":"10c76796.2a23a8","type":"function","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"Move message up the board","func":"let msgArray = msg.payload;\nlet arrLen = msgArray.length;\nlet outLine = \"\";\nfor (let i=0; i < arrLen; i++) {\n outLine = outLine + msgArray[i];\n}\n\nmsg.payload = outLine;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1980,"y":960,"wires":[["f55aa089.ee3a1"]]},{"id":"721e03ac.771e2c","type":"ring-buffer","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"","capacity":"10","order":"old-to-new","sendOnlyIfFull":false,"pushAfterClear":false,"extra":false,"perTopic":false,"x":1750,"y":960,"wires":[["10c76796.2a23a8"]]},{"id":"70a4fcad.b5751c","type":"link in","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"","links":["f739b4fd.7fc93"],"x":1355,"y":960,"wires":[["e254e87b.dc563"]]},{"id":"962557b.b9a27a8","type":"inject","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"Clear message board","props":[{"p":"type","v":"clear","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":1460,"y":880,"wires":[["e254e87b.dc563"]]},{"id":"e254e87b.dc563","type":"function","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"Colour-code stations","func":"if (msg.type == \"clear\") {\n // Clear the ring buffer and pre-load it with newlines <br>\n // This will ensure the user message scrolls from the bottom edge\n \n node.send({'payload.clear':true});\n \n for (let i=0; i<10; i++) {\n node.send ({payload:`${i}<br>`}); \n }\n}\nelse if (msg.station ==\"pr\") {\n var train = msg.train;\n var signal = msg.signal;\n var train_time = msg.train_time;\n var station= msg.station;\n var color = \"green\";\n \n switch (station) {\n\n case \"hw\":\n color = \"#097479\"\n break;\n \n case \"pr\" : \n color = \"#ffdf80\";\n break;\n }\n msg.payload = `<p><font color=\"white\">${train_time} >> </font><font color=${color}>Train-Id: ${train} arrived at Signal-Id: ${signal}</font></p>`;\n return msg;\n}\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1540,"y":960,"wires":[["721e03ac.771e2c"]]},{"id":"15aba88d.bdb8df","type":"ui_button","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"","group":"e6d438e4.34caf8","order":2,"width":0,"height":0,"passthru":false,"label":"Click to clear - Arrivals board","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":1460,"y":820,"wires":[["67a87dfc.d11bd4"]]},{"id":"67a87dfc.d11bd4","type":"change","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"Clear message board","rules":[{"t":"set","p":"type","pt":"msg","to":"clear","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1720,"y":820,"wires":[["e254e87b.dc563"]]},{"id":"ea595c5.e38f9a","type":"comment","z":"f233685a.5de4f","g":"4dc1bb2f.93f96c","name":"Colour-code the stations on the Arrivals board at PR","info":"","x":2090,"y":820,"wires":[]},{"id":"e6d438e4.34caf8","type":"ui_group","name":"Activity at Princes Risborough","tab":"2333e020.8e09e","order":4,"disp":true,"width":"8","collapse":false},{"id":"2333e020.8e09e","type":"ui_tab","name":"Trainspotting","icon":"dashboard","order":56,"disabled":false,"hidden":false}]
Just recently I made a Node Reporting Queue using some JavaScript to create a 'stack manager' where items are pushed onto the bottom of the stack and popped off of the top.
Here's part of the NR flow...
[{"id":"3163af1e1fc49405","type":"function","z":"0f43c63d6bea2b09","name":"Stack manager","func":"let stack = flow.get('stack') || [];\nlet queue_length = flow.get(\"queue_length\") || 0;\n\nif (msg.topic == \"push\") {\n //let stack = flow.get('stack') || [];\n\n let my_node = { \"nodeID\": msg.payload.nodeID, \"location\": msg.payload.location }\n stack.push(my_node);\n flow.set('stack', stack);\n queue_length = queue_length + 1;\n flow.set(\"queue_length\", queue_length);\n return msg;\n}\nelse if (msg.topic == \"pop\") {\n //let stack = flow.get('stack') || [];\n stack.shift();\n // stack.pop();\n flow.set('stack', stack);\n if (queue_length > 0) {\n queue_length = queue_length - 1;\n flow.set(\"queue_length\", queue_length);\n }\n else {\n flow.set(\"queue_length\", 0);\n }\n return msg;\n}\nelse if (msg.topic == \"reset_stack\") {\n flow.set('stack', []);\n queue_length = 0;\n flow.set(\"queue_length\", queue_length);\n //Send payload to clear the UI display\n msg.payload = [];\n return msg;\n}\nelse {\n return null;\n}","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":480,"wires":[["c6e3cfdfc9b87adf","30627e1f6e7c8560"]]},{"id":"24ebbf98111b8823","type":"change","z":"0f43c63d6bea2b09","name":"Push node onto stack","rules":[{"t":"set","p":"topic","pt":"msg","to":"push","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":480,"wires":[["3163af1e1fc49405"]]},{"id":"adcad4254556d85f","type":"change","z":"0f43c63d6bea2b09","name":"Empty the stack","rules":[{"t":"set","p":"topic","pt":"msg","to":"reset_stack","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":980,"y":520,"wires":[["3163af1e1fc49405"]]},{"id":"61b35001b103e551","type":"change","z":"0f43c63d6bea2b09","name":"Remove node from stack","rules":[{"t":"set","p":"topic","pt":"msg","to":"pop","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1010,"y":440,"wires":[["3163af1e1fc49405"]]},{"id":"9c7a40c5da74e610","type":"ui_table","z":"0f43c63d6bea2b09","group":"b917a40b6565668d","name":"","order":1,"width":6,"height":10,"columns":[{"field":"nodeID","title":"NodeID","width":"30%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"location","title":"Location","width":"70%","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1490,"y":520,"wires":[]},{"id":"9f0d5c43cfe4f9a7","type":"debug","z":"0f43c63d6bea2b09","name":"debug 3450","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1230,"y":560,"wires":[]},{"id":"c6e3cfdfc9b87adf","type":"function","z":"0f43c63d6bea2b09","name":"Clear table then send array","func":"msg.payload = [];\nnode.send(msg);\n\nlet stack = flow.get('stack') || [];\nmsg.payload = stack;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1280,"y":520,"wires":[["9c7a40c5da74e610","9f0d5c43cfe4f9a7"]]},{"id":"34be0cc278da508e","type":"ui_text","z":"0f43c63d6bea2b09","group":"b917a40b6565668d","order":8,"width":3,"height":1,"name":"Queue length","label":"","format":"Queue length {{msg.payload}}","layout":"row-left","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":980,"y":640,"wires":[]},{"id":"30627e1f6e7c8560","type":"change","z":"0f43c63d6bea2b09","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"queue_length","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":980,"y":600,"wires":[["34be0cc278da508e"]]},{"id":"b917a40b6565668d","type":"ui_group","name":"Node Reporting Queue","tab":"b73bebe42aae7406","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"b73bebe42aae7406","type":"ui_tab","name":"Global Node Monitor (GNM) v11","icon":"dashboard","order":4,"disabled":false,"hidden":false}]