ybizeul / StreamDeckWS

A WebServices proxy to connect an Elgato Stream Deck to a Node-RED server
82 stars 11 forks source link

Stream Deck button only updates if an event was sent from the button. #32

Closed YohannLuigi closed 1 year ago

YohannLuigi commented 1 year ago

First of all, thank you for your work on this amazing plugin. Sadly, i am having a problem with my node red flow.

My flow receives as input the gosumemory websocket (link: https://github.com/l3lackShark/gosumemory), adds the context, action, event device and payload of the last stream deck event sent and then sends a setTitle event, wtih one of the property of the gosumemory payload as title. Although the stream deck out node returns that the title as been properly set, it doesnt update on the streamdeck.

After some experimenting, it turns out the button only updates after it sends an event. I have compared every property cached with every property sent by the event, and there is no difference. I am guessing that the button only listen for a few moments after sending an event and then stops listening.

Is there a way for me to constantly update the button without having it send an event to the node red websocket?

Here is the node-red flow in question:

[
    {
        "id": "0abf7bee6de541c5",
        "type": "websocket in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "f78bd0552f21ace0",
        "client": "",
        "x": 470,
        "y": 800,
        "wires": [
            [
                "7771914bae0c4546",
                "e9c7e420791dd0d9"
            ]
        ]
    },
    {
        "id": "12b11d6da553bd31",
        "type": "websocket in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "7eeccd3f1bd7ade7",
        "client": "",
        "x": 140,
        "y": 560,
        "wires": [
            [
                "5c1a0560d30372b3",
                "287150dec732e0c8"
            ]
        ]
    },
    {
        "id": "8192fc5b7f888688",
        "type": "websocket out",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "f78bd0552f21ace0",
        "client": "",
        "x": 1980,
        "y": 560,
        "wires": []
    },
    {
        "id": "4f9ac307df38509d",
        "type": "sd-input",
        "z": "d73ac6438fe4af23",
        "name": "Stream Deck In",
        "x": 1380,
        "y": 560,
        "wires": [
            [
                "0b17778dd4f0133e"
            ]
        ]
    },
    {
        "id": "0b17778dd4f0133e",
        "type": "function",
        "z": "d73ac6438fe4af23",
        "name": "gosu add",
        "func": "const fs = global.get('fsModule');\nlet str = fs.readFileSync(\"C:/Users/yohan/Documents/websocket/files/sr.txt\", 'utf8');\nmsg.sr = str.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1560,
        "y": 560,
        "wires": [
            [
                "7212809494cb6a5a",
                "4c173e1c4d61b156",
                "fbdc26cfcbbecc4f"
            ]
        ]
    },
    {
        "id": "e978c52c6ee841ea",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "stream deck context",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1360,
        "y": 640,
        "wires": []
    },
    {
        "id": "7212809494cb6a5a",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "full payload",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1690,
        "y": 640,
        "wires": []
    },
    {
        "id": "019f9ced8cde6efa",
        "type": "file in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\srcontext.txt",
        "filenameType": "str",
        "format": "utf8",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 1050,
        "y": 560,
        "wires": [
            [
                "4f9ac307df38509d",
                "e978c52c6ee841ea"
            ]
        ]
    },
    {
        "id": "cb5a69fe368291c3",
        "type": "file",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\sr.txt",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "true",
        "encoding": "none",
        "x": 620,
        "y": 560,
        "wires": [
            [
                "019f9ced8cde6efa",
                "e11f5f93a01be469"
            ]
        ]
    },
    {
        "id": "7771914bae0c4546",
        "type": "file",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\srcontext.txt",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "true",
        "encoding": "utf8",
        "x": 810,
        "y": 800,
        "wires": [
            []
        ]
    },
    {
        "id": "e11f5f93a01be469",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "sr value cached",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 880,
        "y": 640,
        "wires": []
    },
    {
        "id": "37b206aaa662d850",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "gosu extract funtion",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 490,
        "y": 640,
        "wires": []
    },
    {
        "id": "5c1a0560d30372b3",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "gosu websocket",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 280,
        "y": 640,
        "wires": []
    },
    {
        "id": "287150dec732e0c8",
        "type": "json",
        "z": "d73ac6438fe4af23",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 210,
        "y": 480,
        "wires": [
            [
                "5b1287c9643ffc45",
                "8ce0c2261e47e728"
            ]
        ]
    },
    {
        "id": "78dc2a0d97724006",
        "type": "json",
        "z": "d73ac6438fe4af23",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 430,
        "y": 480,
        "wires": [
            [
                "cb5a69fe368291c3",
                "babc0f08e56a7d9a"
            ]
        ]
    },
    {
        "id": "5b1287c9643ffc45",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 300,
        "y": 400,
        "wires": []
    },
    {
        "id": "babc0f08e56a7d9a",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "debug 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 400,
        "wires": []
    },
    {
        "id": "8ce0c2261e47e728",
        "type": "change",
        "z": "d73ac6438fe4af23",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.menu.bm.stats.SR",
                "tot": "msg",
                "dc": true
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 320,
        "y": 560,
        "wires": [
            [
                "37b206aaa662d850",
                "78dc2a0d97724006"
            ]
        ]
    },
    {
        "id": "4c173e1c4d61b156",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "sr value",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "sr",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1680,
        "y": 700,
        "wires": []
    },
    {
        "id": "3593fb84350011de",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "stream deck output",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1930,
        "y": 640,
        "wires": []
    },
    {
        "id": "fbdc26cfcbbecc4f",
        "type": "sd-output",
        "z": "d73ac6438fe4af23",
        "name": "Stream Deck Out",
        "streamdeckID": "1",
        "title": "sr",
        "title-type": "msg",
        "image": "",
        "image-type": "str",
        "state": "",
        "state-type": "str",
        "x": 1770,
        "y": 560,
        "wires": [
            [
                "3593fb84350011de",
                "8192fc5b7f888688"
            ]
        ]
    },
    {
        "id": "e9c7e420791dd0d9",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "debug 7",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 680,
        "y": 900,
        "wires": []
    },
    {
        "id": "f78bd0552f21ace0",
        "type": "websocket-listener",
        "path": "/sr",
        "wholemsg": "false"
    },
    {
        "id": "7eeccd3f1bd7ade7",
        "type": "websocket-listener",
        "path": "/gosu",
        "wholemsg": "false"
    }
]
ybizeul commented 1 year ago

Hi Yohann,

I think you're using the sd-input wrong.

sd-input and sd-output are helper nodes to help you set context automatically on the messages going to the streamdeck.

Every event coming from streamdeck is used to build the cache, like context ID for each key, etc.

What's typically used is the "willAppear" message sent by the StreamDeck when starting. Every key sends that message and from that time going forward the node red plugin cache knows what to do when addressing the key later on.

Try something like this and see how it goes :

[
    {
        "id": "0abf7bee6de541c5",
        "type": "websocket in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "f78bd0552f21ace0",
        "client": "",
        "x": 470,
        "y": 800,
        "wires": [
            [
                "7771914bae0c4546",
                "e9c7e420791dd0d9"
            ]
        ]
    },
    {
        "id": "12b11d6da553bd31",
        "type": "websocket in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "7eeccd3f1bd7ade7",
        "client": "",
        "x": 140,
        "y": 560,
        "wires": [
            [
                "5c1a0560d30372b3",
                "287150dec732e0c8"
            ]
        ]
    },
    {
        "id": "8192fc5b7f888688",
        "type": "websocket out",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "f78bd0552f21ace0",
        "client": "",
        "x": 1980,
        "y": 560,
        "wires": []
    },
    {
        "id": "4f9ac307df38509d",
        "type": "sd-input",
        "z": "d73ac6438fe4af23",
        "name": "Stream Deck In",
        "x": 1380,
        "y": 560,
        "wires": [
            [
                "0b17778dd4f0133e"
            ]
        ]
    },
    {
        "id": "0b17778dd4f0133e",
        "type": "function",
        "z": "d73ac6438fe4af23",
        "name": "gosu add",
        "func": "const fs = global.get('fsModule');\nlet str = fs.readFileSync(\"C:/Users/yohan/Documents/websocket/files/sr.txt\", 'utf8');\nmsg.sr = str.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1560,
        "y": 560,
        "wires": [
            [
                "7212809494cb6a5a",
                "4c173e1c4d61b156",
                "fbdc26cfcbbecc4f"
            ]
        ]
    },
    {
        "id": "e978c52c6ee841ea",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "stream deck context",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1360,
        "y": 640,
        "wires": []
    },
    {
        "id": "7212809494cb6a5a",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "full payload",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1690,
        "y": 640,
        "wires": []
    },
    {
        "id": "019f9ced8cde6efa",
        "type": "file in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\srcontext.txt",
        "filenameType": "str",
        "format": "utf8",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 1050,
        "y": 560,
        "wires": [
            [
                "4f9ac307df38509d",
                "e978c52c6ee841ea"
            ]
        ]
    },
    {
        "id": "cb5a69fe368291c3",
        "type": "file",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\sr.txt",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "true",
        "encoding": "none",
        "x": 620,
        "y": 560,
        "wires": [
            [
                "019f9ced8cde6efa",
                "e11f5f93a01be469"
            ]
        ]
    },
    {
        "id": "7771914bae0c4546",
        "type": "file",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\srcontext.txt",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "true",
        "encoding": "utf8",
        "x": 810,
        "y": 800,
        "wires": [
            []
        ]
    },
    {
        "id": "e11f5f93a01be469",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "sr value cached",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 880,
        "y": 640,
        "wires": []
    },
    {
        "id": "37b206aaa662d850",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "gosu extract funtion",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 490,
        "y": 640,
        "wires": []
    },
    {
        "id": "5c1a0560d30372b3",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "gosu websocket",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 280,
        "y": 640,
        "wires": []
    },
    {
        "id": "287150dec732e0c8",
        "type": "json",
        "z": "d73ac6438fe4af23",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 210,
        "y": 480,
        "wires": [
            [
                "5b1287c9643ffc45",
                "8ce0c2261e47e728"
            ]
        ]
    },
    {
        "id": "78dc2a0d97724006",
        "type": "json",
        "z": "d73ac6438fe4af23",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 430,
        "y": 480,
        "wires": [
            [
                "cb5a69fe368291c3",
                "babc0f08e56a7d9a"
            ]
        ]
    },
    {
        "id": "5b1287c9643ffc45",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "debug 1",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 300,
        "y": 400,
        "wires": []
    },
    {
        "id": "babc0f08e56a7d9a",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "debug 2",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 400,
        "wires": []
    },
    {
        "id": "8ce0c2261e47e728",
        "type": "change",
        "z": "d73ac6438fe4af23",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.menu.bm.stats.SR",
                "tot": "msg",
                "dc": true
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 320,
        "y": 560,
        "wires": [
            [
                "37b206aaa662d850",
                "78dc2a0d97724006"
            ]
        ]
    },
    {
        "id": "4c173e1c4d61b156",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "sr value",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "sr",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1680,
        "y": 700,
        "wires": []
    },
    {
        "id": "3593fb84350011de",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "stream deck output",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 1930,
        "y": 640,
        "wires": []
    },
    {
        "id": "fbdc26cfcbbecc4f",
        "type": "sd-output",
        "z": "d73ac6438fe4af23",
        "name": "Stream Deck Out",
        "streamdeckID": "1",
        "title": "sr",
        "title-type": "msg",
        "image": "",
        "image-type": "str",
        "state": "",
        "state-type": "str",
        "x": 1770,
        "y": 560,
        "wires": [
            [
                "3593fb84350011de",
                "8192fc5b7f888688"
            ]
        ]
    },
    {
        "id": "e9c7e420791dd0d9",
        "type": "debug",
        "z": "d73ac6438fe4af23",
        "name": "debug 7",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 680,
        "y": 900,
        "wires": []
    },
    {
        "id": "f78bd0552f21ace0",
        "type": "websocket-listener",
        "path": "/sr",
        "wholemsg": "false"
    },
    {
        "id": "7eeccd3f1bd7ade7",
        "type": "websocket-listener",
        "path": "/gosu",
        "wholemsg": "false"
    }
]
YohannLuigi commented 1 year ago

When testing this node red flow i had the same problem, where the button would only update if interacted with.

But i followed ur advice and rewrote the flow as to not mess with the message coming from the websocket to the sd input. I then added the following node that can resend msg while limiting the amount of msg per second. (https://flows.nodered.org/node/node-red-contrib-msg-resend)

My stream deck is now properly continuously updated. Thanks a lot for the tip and thanks again for this amazing plugin!

The working node red flow for anyone interested:

[
    {
        "id": "12b11d6da553bd31",
        "type": "websocket in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "7eeccd3f1bd7ade7",
        "client": "",
        "x": 140,
        "y": 120,
        "wires": [
            [
                "287150dec732e0c8"
            ]
        ]
    },
    {
        "id": "8192fc5b7f888688",
        "type": "websocket out",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "f78bd0552f21ace0",
        "client": "",
        "x": 940,
        "y": 40,
        "wires": []
    },
    {
        "id": "4f9ac307df38509d",
        "type": "sd-input",
        "z": "d73ac6438fe4af23",
        "name": "Stream Deck In",
        "x": 440,
        "y": 40,
        "wires": [
            [
                "0b17778dd4f0133e"
            ]
        ]
    },
    {
        "id": "0b17778dd4f0133e",
        "type": "function",
        "z": "d73ac6438fe4af23",
        "name": "gosu add",
        "func": "const fs = global.get('fsModule');\nlet str = fs.readFileSync(\"C:/Users/yohan/Documents/websocket/files/sr.txt\", 'utf8');\nmsg.sr = str.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 600,
        "y": 40,
        "wires": [
            [
                "fbdc26cfcbbecc4f"
            ]
        ]
    },
    {
        "id": "cb5a69fe368291c3",
        "type": "file",
        "z": "d73ac6438fe4af23",
        "name": "",
        "filename": "C:\\Users\\yohan\\Documents\\websocket\\files\\sr.txt",
        "filenameType": "str",
        "appendNewline": true,
        "createDir": false,
        "overwriteFile": "true",
        "encoding": "none",
        "x": 780,
        "y": 120,
        "wires": [
            []
        ]
    },
    {
        "id": "287150dec732e0c8",
        "type": "json",
        "z": "d73ac6438fe4af23",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 270,
        "y": 120,
        "wires": [
            [
                "8ce0c2261e47e728"
            ]
        ]
    },
    {
        "id": "78dc2a0d97724006",
        "type": "json",
        "z": "d73ac6438fe4af23",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 530,
        "y": 120,
        "wires": [
            [
                "cb5a69fe368291c3"
            ]
        ]
    },
    {
        "id": "8ce0c2261e47e728",
        "type": "change",
        "z": "d73ac6438fe4af23",
        "name": "Extract sr",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.menu.bm.stats.SR",
                "tot": "msg",
                "dc": true
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 400,
        "y": 120,
        "wires": [
            [
                "78dc2a0d97724006"
            ]
        ]
    },
    {
        "id": "fbdc26cfcbbecc4f",
        "type": "sd-output",
        "z": "d73ac6438fe4af23",
        "name": "Stream Deck Out",
        "streamdeckID": "1",
        "title": "sr",
        "title-type": "msg",
        "image": "",
        "image-type": "str",
        "state": "",
        "state-type": "str",
        "x": 770,
        "y": 40,
        "wires": [
            [
                "8192fc5b7f888688"
            ]
        ]
    },
    {
        "id": "8717bb0738bb7fb5",
        "type": "websocket in",
        "z": "d73ac6438fe4af23",
        "name": "",
        "server": "f78bd0552f21ace0",
        "client": "",
        "x": 130,
        "y": 40,
        "wires": [
            [
                "7706547d8d38f75f"
            ]
        ]
    },
    {
        "id": "7706547d8d38f75f",
        "type": "msg-resend",
        "z": "d73ac6438fe4af23",
        "interval": "300",
        "intervalUnit": "msecs",
        "maximum": "-1",
        "bytopic": false,
        "clone": true,
        "firstDelayed": false,
        "addCounters": false,
        "waitForResend": false,
        "highRate": false,
        "outputCountField": "",
        "outputMaxField": "",
        "name": "",
        "x": 270,
        "y": 40,
        "wires": [
            [
                "4f9ac307df38509d"
            ]
        ]
    },
    {
        "id": "7eeccd3f1bd7ade7",
        "type": "websocket-listener",
        "path": "/gosu",
        "wholemsg": "false"
    },
    {
        "id": "f78bd0552f21ace0",
        "type": "websocket-listener",
        "path": "/sr",
        "wholemsg": "false"
    }
]