[ { "id": "brd05c91e3", "type": "mqtt-broker", "name": "mosquitto", "broker": "mosquitto", "port": "1883", "clientid": "", "autoConnect": true, "usetls": false, "protocolVersion": "4", "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closeQos": "0", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" }, { "id": "uib31315d0b", "type": "ui-base", "name": "Dashboard", "path": "/dashboard", "includeClientData": true, "acceptsClientConfig": [ "ui-notification", "ui-control" ], "showPathInSidebar": false, "navigationStyle": "default", "titleBarStyle": "default" }, { "id": "uit1f2d1d17", "type": "ui-theme", "name": "Default Theme", "colors": { "surface": "#ffffff", "primary": "#0094CE", "bgPage": "#eeeeee", "groupBg": "#ffffff", "groupOutline": "#cccccc" }, "sizes": { "pagePadding": "12px", "groupGap": "12px", "groupBorderRadius": "4px", "widgetGap": "12px" } }, { "id": "uipc7a69acb", "type": "ui-page", "name": "Home", "ui": "uib31315d0b", "icon": "home", "path": "/home", "theme": "uit1f2d1d17", "layout": "flex", "order": 0, "className": "", "visible": true, "disabled": false }, { "id": "uig32ecccd2", "type": "ui-group", "name": "Plugs", "page": "uipc7a69acb", "width": "6", "height": "1", "order": 1, "showTitle": true, "className": "", "visible": true, "disabled": false }, { "id": "f810d3244", "type": "tab", "label": "Zigbee Monitor", "disabled": false, "info": "Button dispatches single vs hold-release to different plug sets. Plug plumbing (state-in, /set out, dashboard widget, per-channel mapper) is generated by flow2json.py from the plugs lists below.", "env": [] }, { "id": "zigbee-state-squiggle", "type": "mqtt in", "wires": [ [ "text-squiggle" ] ], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Squiggle", "qos": "0", "datatype": "auto", "z": "f810d3244", "x": 170, "y": 80 }, { "id": "text-squiggle", "type": "ui-text", "wires": [], "name": "Squiggle", "group": "uig32ecccd2", "width": "6", "height": "2", "order": 1, "label": "Squiggle", "format": "{{msg.payload.state}}", "layout": "row-spread", "className": "", "z": "f810d3244", "x": 770, "y": 150 }, { "id": "plug-out-squiggle", "type": "mqtt out", "wires": [], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Squiggle/set", "qos": "2", "retain": false, "z": "f810d3244", "x": 770, "y": 220 }, { "id": "zigbee-state-sideboard", "type": "mqtt in", "wires": [ [ "text-sideboard" ] ], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Sideboard Lamp", "qos": "0", "datatype": "auto", "z": "f810d3244", "x": 170, "y": 290 }, { "id": "text-sideboard", "type": "ui-text", "wires": [], "name": "Sideboard Lamp", "group": "uig32ecccd2", "width": "6", "height": "2", "order": 2, "label": "Sideboard Lamp", "format": "{{msg.payload.state}}", "layout": "row-spread", "className": "", "z": "f810d3244", "x": 770, "y": 360 }, { "id": "plug-out-sideboard", "type": "mqtt out", "wires": [], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Sideboard Lamp/set", "qos": "2", "retain": false, "z": "f810d3244", "x": 770, "y": 430 }, { "id": "zigbee-state-bamboo", "type": "mqtt in", "wires": [ [ "text-bamboo" ] ], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Bamboo Lights", "qos": "0", "datatype": "auto", "z": "f810d3244", "x": 170, "y": 500 }, { "id": "text-bamboo", "type": "ui-text", "wires": [], "name": "Bamboo Lights", "group": "uig32ecccd2", "width": "6", "height": "2", "order": 3, "label": "Bamboo Lights", "format": "{{msg.payload.state}}", "layout": "row-spread", "className": "", "z": "f810d3244", "x": 770, "y": 570 }, { "id": "plug-out-bamboo", "type": "mqtt out", "wires": [], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Bamboo Lights/set", "qos": "2", "retain": false, "z": "f810d3244", "x": 770, "y": 640 }, { "id": "zigbee-state-couch", "type": "mqtt in", "wires": [ [ "text-couch" ] ], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Dual Outlet - Couch", "qos": "0", "datatype": "auto", "z": "f810d3244", "x": 170, "y": 710 }, { "id": "text-couch", "type": "ui-text", "wires": [], "name": "Dual Outlet - Couch", "group": "uig32ecccd2", "width": "6", "height": "2", "order": 4, "label": "Dual Outlet - Couch", "format": "{{msg.payload.state_1}} / {{msg.payload.state_2}}", "layout": "row-spread", "className": "", "z": "f810d3244", "x": 770, "y": 780 }, { "id": "mapper-couch", "type": "function", "wires": [ [ "plug-out-couch" ] ], "name": "Toggle each outlet", "func": "msg.payload = {state_1: 'TOGGLE', state_2: 'TOGGLE'};\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "z": "f810d3244", "x": 450, "y": 850 }, { "id": "plug-out-couch", "type": "mqtt out", "wires": [], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/Dual Outlet - Couch/set", "qos": "2", "retain": false, "z": "f810d3244", "x": 770, "y": 920 }, { "id": "zigbee-state-djbooth", "type": "mqtt in", "wires": [ [ "text-djbooth" ] ], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/DJ Booth", "qos": "0", "datatype": "auto", "z": "f810d3244", "x": 170, "y": 990 }, { "id": "text-djbooth", "type": "ui-text", "wires": [], "name": "DJ Booth", "group": "uig32ecccd2", "width": "6", "height": "2", "order": 5, "label": "DJ Booth", "format": "{{msg.payload.state}}", "layout": "row-spread", "className": "", "z": "f810d3244", "x": 770, "y": 1060 }, { "id": "plug-out-djbooth", "type": "mqtt out", "wires": [], "name": "", "broker": "brd05c91e3", "topic": "zigbee2mqtt/DJ Booth/set", "qos": "2", "retain": false, "z": "f810d3244", "x": 770, "y": 1130 }, { "id": "button-in", "type": "mqtt in", "wires": [ [ "single-filter", "hold-filter" ] ], "name": "", "x": 170, "y": 80, "broker": "brd05c91e3", "topic": "zigbee2mqtt/Door Button", "qos": "0", "datatype": "auto", "z": "f810d3244" }, { "id": "single-filter", "type": "function", "wires": [ [ "plug-out-squiggle", "plug-out-sideboard", "plug-out-bamboo", "mapper-couch" ] ], "name": "Single click", "x": 450, "y": 80, "func": "const now = Date.now();\nconst last = context.get('lastTime') || 0;\nif (now - last < 50) return null;\ncontext.set('lastTime', now);\ntry {\n const p = JSON.parse(msg.payload);\n if (p.action === 'single') {\n msg.payload = { state: 'TOGGLE' };\n return msg;\n }\n} catch (e) {}\nreturn null;\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "z": "f810d3244" }, { "id": "hold-filter", "type": "function", "wires": [ [ "plug-out-djbooth" ] ], "name": "Hold release", "x": 450, "y": 80, "func": "const now = Date.now();\nconst last = context.get('lastTime') || 0;\nif (now - last < 50) return null;\ncontext.set('lastTime', now);\ntry {\n const p = JSON.parse(msg.payload);\n if (p.action === 'release') {\n msg.payload = { state: 'TOGGLE' };\n return msg;\n }\n} catch (e) {}\nreturn null;\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "z": "f810d3244" }, { "id": "permit-btn", "type": "ui-button", "wires": [ [ "mqtt-out" ] ], "name": "Permit Join (60s)", "x": 170, "y": 220, "group": "uig32ecccd2", "payload": "{\"value\": true, \"time\": 60}", "payloadType": "json", "topic": "zigbee2mqtt/bridge/request/permit_join", "width": "3", "height": "1", "order": 9, "className": "", "z": "f810d3244", "icon": "", "label": "Permit Join (60s)" }, { "id": "mqtt-out", "type": "mqtt out", "wires": [], "name": "", "x": 770, "y": 220, "broker": "brd05c91e3", "topic": "", "qos": "2", "retain": false, "z": "f810d3244" } ]