Just for fun - inspired by Dave ©

[{"id":"51e8f7756ce214e0","type":"function","z":"3eb62d10d1081306","name":"progress","func":"function generateProgressBar(percentage) {\n // Ensure percentage is within valid range [0..100]\n percentage = +percentage\n if (isNaN(percentage)) {\n node.status({ fill: \"red\", shape: \"dot\", text: \"NaN\" });\n return\n }\n if (percentage < 0) percentage = 0;\n if (percentage > 100) percentage = 100;\n\n const INNER_BAR_LENGTH = 20; // Length of the progress bar body (excluding brackets)\n const FILLED_CHAR = '█';\n const EMPTY_CHAR = '░';\n // const OPEN_BRACKET = '‖';\n // const CLOSE_BRACKET = '‖';\n\n // const FILLED_CHAR = '■';\n // const EMPTY_CHAR = ' ' // ' ';\n // const OPEN_BRACKET = '[';\n // const CLOSE_BRACKET = ']';\n\n // const FILLED_CHAR = '⬛';\n // const EMPTY_CHAR = '⬜';\n\n // const FILLED_CHAR = '━';\n // const EMPTY_CHAR = '┄';\n const OPEN_BRACKET = '┣';\n const OPEN_BRACKET0 = '┠';\n const CLOSE_BRACKET = '┨';\n const CLOSE_BRACKET100 = '┫'; \n\n // Calculate the number of filled and empty characters\n const filledChars = Math.round((percentage / 100) * INNER_BAR_LENGTH);\n const emptyChars = INNER_BAR_LENGTH - filledChars;\n\n // Construct the bar part\n const ob = filledChars === 0 ? OPEN_BRACKET0 : OPEN_BRACKET\n const cb = filledChars === INNER_BAR_LENGTH ? CLOSE_BRACKET100 : CLOSE_BRACKET\n const bar = ob + FILLED_CHAR.repeat(filledChars) + EMPTY_CHAR.repeat(emptyChars) + cb;\n\n // Format the percentage string (e.g., \" 5%\", \" 50%\", \"100%\")\n const percentageString = (percentage.toString() + '%').padStart(5, ' ');\n\n let progressBar = bar + percentageString;\n\n return progressBar;\n}\nconst status = generateProgressBar(msg.payload)\nnode.status(status);\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":300,"wires":[[]]},{"id":"d1016f5ee8390c11","type":"inject","z":"3eb62d10d1081306","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"blah blah","payloadType":"str","x":320,"y":200,"wires":[["51e8f7756ce214e0"]]},{"id":"df2f875d584becf0","type":"inject","z":"3eb62d10d1081306","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"32.8","payloadType":"num","x":310,"y":260,"wires":[["51e8f7756ce214e0"]]},{"id":"cf5c5cfe01c5a8d5","type":"inject","z":"3eb62d10d1081306","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"94.1","payloadType":"num","x":310,"y":300,"wires":[["51e8f7756ce214e0"]]},{"id":"35e6a55752b00bc9","type":"inject","z":"3eb62d10d1081306","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"-1000","payloadType":"num","x":310,"y":360,"wires":[["51e8f7756ce214e0"]]},{"id":"d27769cacf7185ce","type":"inject","z":"3eb62d10d1081306","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"999999","payloadType":"num","x":310,"y":400,"wires":[["51e8f7756ce214e0"]]},{"id":"b67764bafd6b13b0","type":"inject","z":"3eb62d10d1081306","name":"microsoft progress bar","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[0,20,40,50,60,70,75,80,85,90,91,92,93,94,95,96,96,97,97,97,98,98,98,98,98.5,98.5,98.5,98.5,99,99,99,99,99,99.1,99.1,99.2,99.2,99.3,99.3,99.4,99.4,99.5,99.5,99.6,99.6,99.6,99.7,99.7,99.7,99.7,99.8,99.8,99.8,99.8,99.8,99.8,99.9,99.9,99.9,99.9,99.9,99.9,99.9,99.9,99.9,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,99.95,100]","payloadType":"json","x":360,"y":460,"wires":[["92f60624bbf072fc"]]},{"id":"92f60624bbf072fc","type":"split","z":"3eb62d10d1081306","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":350,"y":520,"wires":[["5490db128dc5347c"]]},{"id":"5490db128dc5347c","type":"delay","z":"3eb62d10d1081306","name":"0.3s","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"0.3","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":470,"y":520,"wires":[["51e8f7756ce214e0"]]}]