Message debug function node

Hi All,

I got into a spot of bother with message timing and fatal lock up so I created this function node to pause, skip, play next, play last, dump and run any message with a topic.

Messages are saved to context variable queues and can be inspected at your leisure.

I hope you find it as useful as I have.

P.S. Could anyone please explain or show when 'node.done()' should be used ?
I have read the docs but it is still not clear to me when it should be used. In particular the case where msg loops perform count up/down functions.

[{"id":"a68c78a260d393d4","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"baf0711f8fa94fb9","type":"function","z":"a68c78a260d393d4","name":"in1","func":"const MAX_Q_LEN = 100;\n\nvar q = context.get(node.name) || {status: \"_PAUSE_\", last: {}, que:[]};\ncontext.set(node.name, q);\n\nswitch(msg.topic) {\n    case \"_LAST_\":\n        if (Object.keys(q.last) === 0) return;\n        return q.last;\n\n    case \"_DUMP_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n        }\n        showStatus(\"yellow\");\n        break;\n\n    case \"_NEXT_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        node.send(q.que.shift());\n        showStatus(\"yellow\");\n        break;\n        \n    case \"_SKIP_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        q.que.shift();\n        showStatus(\"yellow\");\n        break;\n\n    case \"_PAUSE_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        showStatus(\"yellow\");\n        break;\n\n    case \"_RUN_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        showStatus(\"green\");\n        break;\n\n    default:\n        // msg\n        if (q.status === \"_DUMP_\") {\n            q.last = msg;\n            showStatus(\"yellow\");\n            break;\n        }\n        if (q.status === \"_PAUSE_\"){\n            q.last = msg;\n            if (q.que.length > MAX_Q_LEN) {\n                showStatus(\"red\");\n                break;\n            }\n            q.que.push(msg);\n            showStatus(\"yellow\");\n            break;\n        }\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        q.last = msg;\n        showStatus(\"green\");\n        context.set(node.name,q);\n        node.done();\n        return msg;\n}\ncontext.set(node.name,q);\nnode.done();\nreturn;\n\nfunction showStatus(colour){\n    node.status({fill:colour,shape:\"ring\",text:topics(colour)});\n}\nfunction topics(colour){\n    let s = q.status+(colour===\"red\" ? \"Overflow\": \"\")+\"(\"+(Object.keys(q.last).length>0 ? q.last.topic : \"\")+\")\";\n    for (let i=0;i<q.que.length;i++) {\n        s = s  + q.que[i].topic + ((i===q.que.length-1) ? \"\":\",\");\n    }\n    return s;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":515,"y":220,"wires":[["db81c15965a84b21"]],"l":false},{"id":"3e018a9f22cef19e","type":"function","z":"a68c78a260d393d4","name":"in1-history","func":"const MAX_Q_LEN = 100;\n\nvar q = context.get(node.name) || {status: \"_PAUSE_\", last: {}, que:[]};\ncontext.set(node.name, q);\n\nswitch(msg.topic) {\n    case \"_LAST_\":\n        if (Object.keys(q.last) === 0) return;\n        return q.last;\n\n    case \"_DUMP_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n        }\n        showStatus(\"yellow\");\n        break;\n\n    case \"_NEXT_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        node.send(q.que.shift());\n        showStatus(\"yellow\");\n        break;\n        \n    case \"_SKIP_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        q.que.shift();\n        showStatus(\"yellow\");\n        break;\n\n    case \"_PAUSE_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        showStatus(\"yellow\");\n        break;\n\n    case \"_RUN_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        showStatus(\"green\");\n        break;\n\n    default:\n        // msg\n        if (q.status === \"_DUMP_\") {\n            q.last = msg;\n            showStatus(\"yellow\");\n            break;\n        }\n        if (q.status === \"_PAUSE_\"){\n            q.last = msg;\n            if (q.que.length > MAX_Q_LEN) {\n                showStatus(\"red\");\n                break;\n            }\n            q.que.push(msg);\n            showStatus(\"yellow\");\n            break;\n        }\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        q.last = msg;\n        showStatus(\"green\");\n        context.set(node.name,q);\n        node.done();\n        return msg;\n}\ncontext.set(node.name,q);\nnode.done();\nreturn;\n\nfunction showStatus(colour){\n    node.status({fill:colour,shape:\"ring\",text:topics(colour)});\n}\nfunction topics(colour){\n    let s = q.status+(colour===\"red\" ? \"Overflow\": \"\")+\"(\"+(Object.keys(q.last).length>0 ? q.last.topic : \"\")+\")\";\n    for (let i=0;i<q.que.length;i++) {\n        s = s  + q.que[i].topic + ((i===q.que.length-1) ? \"\":\",\");\n    }\n    return s;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":515,"y":340,"wires":[[]],"l":false},{"id":"dee682a3b7242146","type":"function","z":"a68c78a260d393d4","name":"out1","func":"const MAX_Q_LEN = 100;\n\nvar q = context.get(node.name) || {status: \"_PAUSE_\", last: {}, que:[]};\ncontext.set(node.name, q);\n\nswitch(msg.topic) {\n    case \"_LAST_\":\n        if (Object.keys(q.last) === 0) return;\n        return q.last;\n\n    case \"_DUMP_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n        }\n        showStatus(\"yellow\");\n        break;\n\n    case \"_NEXT_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        node.send(q.que.shift());\n        showStatus(\"yellow\");\n        break;\n        \n    case \"_SKIP_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        q.que.shift();\n        showStatus(\"yellow\");\n        break;\n\n    case \"_PAUSE_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        showStatus(\"yellow\");\n        break;\n\n    case \"_RUN_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        showStatus(\"green\");\n        break;\n\n    default:\n        // msg\n        if (q.status === \"_DUMP_\") {\n            q.last = msg;\n            showStatus(\"yellow\");\n            break;\n        }\n        if (q.status === \"_PAUSE_\"){\n            q.last = msg;\n            if (q.que.length > MAX_Q_LEN) {\n                showStatus(\"red\");\n                break;\n            }\n            q.que.push(msg);\n            showStatus(\"yellow\");\n            break;\n        }\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        q.last = msg;\n        showStatus(\"green\");\n        context.set(node.name,q);\n        node.done();\n        return msg;\n}\ncontext.set(node.name,q);\nnode.done();\nreturn;\n\nfunction showStatus(colour){\n    node.status({fill:colour,shape:\"ring\",text:topics(colour)});\n}\nfunction topics(colour){\n    let s = q.status+(colour===\"red\" ? \"Overflow\": \"\")+\"(\"+(Object.keys(q.last).length>0 ? q.last.topic : \"\")+\")\";\n    for (let i=0;i<q.que.length;i++) {\n        s = s  + q.que[i].topic + ((i===q.que.length-1) ? \"\":\",\");\n    }\n    return s;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":755,"y":100,"wires":[["4495c23ceef04212","027a6056f4554690"]],"l":false},{"id":"6e94340bbe1a575a","type":"function","z":"a68c78a260d393d4","name":"out1-history","func":"const MAX_Q_LEN = 100;\n\nvar q = context.get(node.name) || {status: \"_PAUSE_\", last: {}, que:[]};\ncontext.set(node.name, q);\n\nswitch(msg.topic) {\n    case \"_LAST_\":\n        if (Object.keys(q.last) === 0) return;\n        return q.last;\n\n    case \"_DUMP_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n        }\n        showStatus(\"yellow\");\n        break;\n\n    case \"_NEXT_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        node.send(q.que.shift());\n        showStatus(\"yellow\");\n        break;\n        \n    case \"_SKIP_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        q.que.shift();\n        showStatus(\"yellow\");\n        break;\n\n    case \"_PAUSE_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        showStatus(\"yellow\");\n        break;\n\n    case \"_RUN_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        showStatus(\"green\");\n        break;\n\n    default:\n        // msg\n        if (q.status === \"_DUMP_\") {\n            q.last = msg;\n            showStatus(\"yellow\");\n            break;\n        }\n        if (q.status === \"_PAUSE_\"){\n            q.last = msg;\n            if (q.que.length > MAX_Q_LEN) {\n                showStatus(\"red\");\n                break;\n            }\n            q.que.push(msg);\n            showStatus(\"yellow\");\n            break;\n        }\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        q.last = msg;\n        showStatus(\"green\");\n        context.set(node.name,q);\n        node.done();\n        return msg;\n}\ncontext.set(node.name,q);\nnode.done();\nreturn;\n\nfunction showStatus(colour){\n    node.status({fill:colour,shape:\"ring\",text:topics(colour)});\n}\nfunction topics(colour){\n    let s = q.status+(colour===\"red\" ? \"Overflow\": \"\")+\"(\"+(Object.keys(q.last).length>0 ? q.last.topic : \"\")+\")\";\n    for (let i=0;i<q.que.length;i++) {\n        s = s  + q.que[i].topic + ((i===q.que.length-1) ? \"\":\",\");\n    }\n    return s;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":755,"y":180,"wires":[[]],"l":false},{"id":"6daa880fe91842fa","type":"inject","z":"a68c78a260d393d4","name":"_RUN_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.1","topic":"_RUN_","x":120,"y":80,"wires":[[]]},{"id":"1ef15ff10b4b74e9","type":"inject","z":"a68c78a260d393d4","name":"_PAUSE_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_PAUSE_","x":120,"y":160,"wires":[[]]},{"id":"b789f8b88c459a95","type":"inject","z":"a68c78a260d393d4","name":"_DUMP_All","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_DUMP_","x":310,"y":120,"wires":[["dee682a3b7242146","6e94340bbe1a575a","baf0711f8fa94fb9","3e018a9f22cef19e","8009337554e6eda5","7df7bf76c194993a"]]},{"id":"f48294dd79048b39","type":"inject","z":"a68c78a260d393d4","name":"_NEXT_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_NEXT_","x":120,"y":200,"wires":[[]]},{"id":"df8fcf9da2fbb7cd","type":"inject","z":"a68c78a260d393d4","name":"_LAST_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_LAST_","x":300,"y":360,"wires":[["baf0711f8fa94fb9"]]},{"id":"c4c31e8711ceeb35","type":"inject","z":"a68c78a260d393d4","name":"_SKIP_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_SKIP_","x":310,"y":320,"wires":[["baf0711f8fa94fb9"]]},{"id":"14fb92879f805fd0","type":"delay","z":"a68c78a260d393d4","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":610,"y":280,"wires":[["baf0711f8fa94fb9","3e018a9f22cef19e"]]},{"id":"db81c15965a84b21","type":"function","z":"a68c78a260d393d4","name":"dec","func":"if (msg.topic>101){\n    msg.payload = -10;\n}\nif (msg.topic<-101){\n    msg.payload = 10;\n}\nmsg.topic = msg.topic + msg.payload;\n\nreturn [msg,msg];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":220,"wires":[["dee682a3b7242146","6e94340bbe1a575a"],["8009337554e6eda5","7df7bf76c194993a"]]},{"id":"2bcab68aa869b011","type":"ui_text","z":"a68c78a260d393d4","group":"6a4d510d.5de65","order":31,"width":0,"height":0,"name":"","label":"text","format":"{{msg.payload}}","layout":"row-spread","className":"","x":910,"y":20,"wires":[]},{"id":"29e9db35ba55f067","type":"inject","z":"a68c78a260d393d4","name":"p5:t101","props":[{"p":"payload"},{"p":"topic","v":"0","vt":"num"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"5","payloadType":"num","x":310,"y":240,"wires":[["baf0711f8fa94fb9"]]},{"id":"f55c68dcd5c5e6fa","type":"inject","z":"a68c78a260d393d4","name":"_PAUSE_All","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"_PAUSE_","x":310,"y":80,"wires":[["baf0711f8fa94fb9","dee682a3b7242146","3e018a9f22cef19e","6e94340bbe1a575a","8009337554e6eda5","7df7bf76c194993a"]]},{"id":"8009337554e6eda5","type":"function","z":"a68c78a260d393d4","name":"out2","func":"const MAX_Q_LEN = 100;\n\nvar q = context.get(node.name) || {status: \"_PAUSE_\", last: {}, que:[]};\ncontext.set(node.name, q);\n\nswitch(msg.topic) {\n    case \"_LAST_\":\n        if (Object.keys(q.last) === 0) return;\n        return q.last;\n\n    case \"_DUMP_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n        }\n        showStatus(\"yellow\");\n        break;\n\n    case \"_NEXT_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        node.send(q.que.shift());\n        showStatus(\"yellow\");\n        break;\n        \n    case \"_SKIP_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        q.que.shift();\n        showStatus(\"yellow\");\n        break;\n\n    case \"_PAUSE_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        showStatus(\"yellow\");\n        break;\n\n    case \"_RUN_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        showStatus(\"green\");\n        break;\n\n    default:\n        // msg\n        if (q.status === \"_DUMP_\") {\n            q.last = msg;\n            showStatus(\"yellow\");\n            break;\n        }\n        if (q.status === \"_PAUSE_\"){\n            q.last = msg;\n            if (q.que.length > MAX_Q_LEN) {\n                showStatus(\"red\");\n                break;\n            }\n            q.que.push(msg);\n            showStatus(\"yellow\");\n            break;\n        }\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        q.last = msg;\n        showStatus(\"green\");\n        context.set(node.name,q);\n        node.done();\n        return msg;\n}\ncontext.set(node.name,q);\nnode.done();\nreturn;\n\nfunction showStatus(colour){\n    node.status({fill:colour,shape:\"ring\",text:topics(colour)});\n}\nfunction topics(colour){\n    let s = q.status+(colour===\"red\" ? \"Overflow\": \"\")+\"(\"+(Object.keys(q.last).length>0 ? q.last.topic : \"\")+\")\";\n    for (let i=0;i<q.que.length;i++) {\n        s = s  + q.que[i].topic + ((i===q.que.length-1) ? \"\":\",\");\n    }\n    return s;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":755,"y":280,"wires":[["14fb92879f805fd0"]],"l":false},{"id":"7df7bf76c194993a","type":"function","z":"a68c78a260d393d4","name":"out2","func":"const MAX_Q_LEN = 100;\n\nvar q = context.get(node.name) || {status: \"_PAUSE_\", last: {}, que:[]};\ncontext.set(node.name, q);\n\nswitch(msg.topic) {\n    case \"_LAST_\":\n        if (Object.keys(q.last) === 0) return;\n        return q.last;\n\n    case \"_DUMP_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n        }\n        showStatus(\"yellow\");\n        break;\n\n    case \"_NEXT_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        node.send(q.que.shift());\n        showStatus(\"yellow\");\n        break;\n        \n    case \"_SKIP_\":\n        if (q.status !== \"_PAUSE_\" || q.que.length === 0) return;\n        q.que.shift();\n        showStatus(\"yellow\");\n        break;\n\n    case \"_PAUSE_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        showStatus(\"yellow\");\n        break;\n\n    case \"_RUN_\":\n        q.status = msg.topic;\n        context.set(node.name, q);\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        showStatus(\"green\");\n        break;\n\n    default:\n        // msg\n        if (q.status === \"_DUMP_\") {\n            q.last = msg;\n            showStatus(\"yellow\");\n            break;\n        }\n        if (q.status === \"_PAUSE_\"){\n            q.last = msg;\n            if (q.que.length > MAX_Q_LEN) {\n                showStatus(\"red\");\n                break;\n            }\n            q.que.push(msg);\n            showStatus(\"yellow\");\n            break;\n        }\n        while (q.que.length>0){\n            q.last = q.que.shift();\n            node.send(q.last);\n            context.set(node.name, q);\n        }\n        q.last = msg;\n        showStatus(\"green\");\n        context.set(node.name,q);\n        node.done();\n        return msg;\n}\ncontext.set(node.name,q);\nnode.done();\nreturn;\n\nfunction showStatus(colour){\n    node.status({fill:colour,shape:\"ring\",text:topics(colour)});\n}\nfunction topics(colour){\n    let s = q.status+(colour===\"red\" ? \"Overflow\": \"\")+\"(\"+(Object.keys(q.last).length>0 ? q.last.topic : \"\")+\")\";\n    for (let i=0;i<q.que.length;i++) {\n        s = s  + q.que[i].topic + ((i===q.que.length-1) ? \"\":\",\");\n    }\n    return s;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":755,"y":400,"wires":[[]],"l":false},{"id":"347a5baf1299a36b","type":"inject","z":"a68c78a260d393d4","name":"_NEXT_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_NEXT_","x":300,"y":280,"wires":[["baf0711f8fa94fb9"]]},{"id":"0e3a5ba85cef35fc","type":"inject","z":"a68c78a260d393d4","name":"_NEXT_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_NEXT_","x":640,"y":20,"wires":[["dee682a3b7242146"]]},{"id":"17d3a11459df7de2","type":"inject","z":"a68c78a260d393d4","name":"_RUN_All","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"0.1","topic":"_RUN_","x":320,"y":160,"wires":[["baf0711f8fa94fb9","dee682a3b7242146","8009337554e6eda5"]]},{"id":"66bb81da9bb2619d","type":"inject","z":"a68c78a260d393d4","name":"_NEXT_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_NEXT_","x":380,"y":440,"wires":[["8009337554e6eda5"]]},{"id":"4495c23ceef04212","type":"debug","z":"a68c78a260d393d4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":60,"wires":[]},{"id":"f476bba3ac5552da","type":"inject","z":"a68c78a260d393d4","name":"_DUMP_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_DUMP_","x":120,"y":120,"wires":[[]]},{"id":"203b4c7ee33e3b29","type":"inject","z":"a68c78a260d393d4","name":"_RUN_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.1","topic":"_RUN_","x":660,"y":60,"wires":[["dee682a3b7242146"]]},{"id":"027a6056f4554690","type":"change","z":"a68c78a260d393d4","name":"t->p","rules":[{"t":"set","p":"payload","pt":"msg","to":"topic","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":810,"y":20,"wires":[["2bcab68aa869b011"]]},{"id":"1b047cf9906b4060","type":"inject","z":"a68c78a260d393d4","name":"_LAST_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_LAST_","x":380,"y":520,"wires":[["8009337554e6eda5"]]},{"id":"583c9493ab1961da","type":"inject","z":"a68c78a260d393d4","name":"_SKIP_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_SKIP_","x":390,"y":480,"wires":[["8009337554e6eda5"]]},{"id":"fe73532aa1dc37db","type":"inject","z":"a68c78a260d393d4","name":"_LAST_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_LAST_","x":120,"y":240,"wires":[[]]},{"id":"3ee84853a5f88b2e","type":"inject","z":"a68c78a260d393d4","name":"_SKIP_","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"_SKIP_","x":130,"y":280,"wires":[[]]},{"id":"afaf1daa746a9a65","type":"comment","z":"a68c78a260d393d4","name":"Controls","info":"","x":100,"y":40,"wires":[]},{"id":"a6cef4626d7e55b4","type":"comment","z":"a68c78a260d393d4","name":"A single step msg debug tool.","info":"","x":340,"y":40,"wires":[]},{"id":"6a4d510d.5de65","type":"ui_group","name":"","tab":"56715436.c2591c","order":2,"disp":false,"width":"9","collapse":false,"className":""},{"id":"56715436.c2591c","type":"ui_tab","name":"MsgDebug - node@14.17.5 red@2.1.3 dashboard@3.1.0","icon":"dashboard","order":3,"disabled":false,"hidden":false}]

Hi @ozpos thanks for sharing. Are you aware of the new node-red debugger? It has many of the features you mention

You are welcome. No I was not aware of the debugger. While I was writing the node I thought it would be possible to do it in a less obtrusive way and for the whole platform.

Thank you for pointing it out.

Hi @Steve-Mcl, I have a strange history message with your tag and the edit icon along side. Sorry I do not fully understand the forum platform. Any idea what it means.

I changed the category of your post from general to share your projects since you were sharing something you had created. Putting posts in correct category can make it clearer as to the content. For example your post title could mean several things but in the share your projects category, it adds context.

Thank you. I did not know where the best place was and had already changed the category once.

Sorry to bother you with such trivia, am I to do anything or does the History entry just stay like that as a record of who did what ?

It's just a record of changes. No need to do anything.