Skip to content

Instantly share code, notes, and snippets.

@shbatm
Last active August 3, 2023 20:25
Show Gist options
  • Save shbatm/b1dcf01e78ca8c877432a2070e861900 to your computer and use it in GitHub Desktop.
Save shbatm/b1dcf01e78ca8c877432a2070e861900 to your computer and use it in GitHub Desktop.
Century VS VGreen EVO Node-RED RS485 Control
[
{
"id": "9856a1d38d13eaca",
"type": "tab",
"label": "Century VS Pump Control",
"disabled": false,
"info": "",
"env": []
},
{
"id": "0b8cc767e1d33f36",
"type": "tab",
"label": "Discovery",
"disabled": false,
"info": "",
"env": []
},
{
"id": "5009531429fbeac6",
"type": "tab",
"label": "Testing",
"disabled": false,
"info": "",
"env": []
},
{
"id": "927832aead2f5fea",
"type": "group",
"z": "9856a1d38d13eaca",
"name": "Serial Comms",
"style": {
"stroke": "#ff0000",
"fill": "#ffbfbf",
"fill-opacity": "0.52",
"label": true,
"color": "#000000"
},
"nodes": [
"15381188ce92036c",
"15c28d09e12eb077",
"ec6342cad808afe5",
"2a28bc47eff77744",
"b2fe3c569209c4e7",
"3bd2d948f28c6502",
"b44ccc7877a2be15"
],
"x": 914,
"y": 179,
"w": 612,
"h": 142
},
{
"id": "42ec027f56f75fc3",
"type": "junction",
"z": "0b8cc767e1d33f36",
"x": 560,
"y": 140,
"wires": [
[
"e297237faa0368c1",
"1f6daea9a3817c19",
"3d58e446346e585e",
"9b493016d3a1e737",
"65270f8e6232ba37",
"4f62b5cb98529931",
"b4b0db590b51bd61",
"b4559c057a9e4e84",
"4ad822d5a507dce2",
"a897a22d073195e5"
]
]
},
{
"id": "3ee19bd474ee13a9",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 460,
"wires": [
[
"114dcb299af1d170",
"ed1e7575f92d95b1",
"a2753cbd2209a013"
]
]
},
{
"id": "c758db1d6466f4d0",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 980,
"y": 700,
"wires": [
[
"94ef44a77b2dfe64",
"46bc79ee5b833e5e",
"159f9b5e26c6c389"
]
]
},
{
"id": "606324011d7bbf0a",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 680,
"wires": [
[
"82dd53db072751ce",
"3b9c6ef378bc6ba1"
]
]
},
{
"id": "2ed72ae53bdecbd9",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 980,
"y": 500,
"wires": [
[
"d57a8908f6ddef08",
"65c04568a955e257"
]
]
},
{
"id": "8865d8114489529b",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 940,
"y": 720,
"wires": [
[
"c758db1d6466f4d0"
]
]
},
{
"id": "443aaab7b4cb6a8c",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 580,
"wires": [
[
"a5a1bf72f23f55d8",
"7fd53b9d08463a29"
]
]
},
{
"id": "ad28d9ed11bb4562",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 980,
"y": 620,
"wires": [
[
"efc823c8b8697a1f",
"3749220ec5e4af58"
]
]
},
{
"id": "bef015b50f79d33a",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 700,
"y": 1280,
"wires": [
[
"a6350ebe85ecd080"
]
]
},
{
"id": "c28a163409c834e2",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 780,
"wires": [
[
"489f747b383515b3",
"fa4d6ea0827cec5e"
]
]
},
{
"id": "eda98a70a4b354b8",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 980,
"y": 820,
"wires": [
[
"5ef00dd339776cef",
"a10c89b3db825710"
]
]
},
{
"id": "4785572017fce44a",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 880,
"wires": [
[
"815e89d8f8d2a26e",
"2232dc901efaa633"
]
]
},
{
"id": "bba17e656f3471af",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 980,
"y": 920,
"wires": [
[
"62a9892f3f654245",
"8fedc03c590b3285"
]
]
},
{
"id": "52412dd9c6b64122",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 980,
"wires": [
[
"d12836adba922648",
"7a280a5b52669187"
]
]
},
{
"id": "185974b58432a9d5",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 980,
"y": 1020,
"wires": [
[
"4cb729eb16dd8486",
"57fc08c115c23bfe"
]
]
},
{
"id": "34c8e66c9117a153",
"type": "junction",
"z": "9856a1d38d13eaca",
"x": 1240,
"y": 1080,
"wires": [
[
"ead0ada6ee788607",
"eb0e0b0d06bae896"
]
]
},
{
"id": "70d595318ad0cd72",
"type": "serial-port",
"serialport": "/dev/serial/by-id/usb-FTDI_USB-RS485_Cable_FT7EA6B6-if00-port0",
"serialbaud": "9600",
"databits": "8",
"parity": "none",
"stopbits": "1",
"waitfor": "",
"dtr": "none",
"rts": "none",
"cts": "none",
"dsr": "none",
"newline": "50",
"bin": "bin",
"out": "interbyte",
"addchar": "",
"responsetimeout": "3000"
},
{
"id": "2996cb7f9b91f906",
"type": "mqtt-broker",
"name": "Home Assistant",
"broker": "192.168.1.1",
"port": "1883",
"clientid": "aqualink-rs-node-red",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "aqualink-nr/status",
"birthQos": "0",
"birthRetain": "true",
"birthPayload": "online",
"birthMsg": {},
"closeTopic": "aqualink-nr/status",
"closeQos": "0",
"closeRetain": "true",
"closePayload": "offline",
"closeMsg": {},
"willTopic": "aqualink-nr/status",
"willQos": "0",
"willRetain": "true",
"willPayload": "offline",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
},
{
"id": "3fe341deb791895d",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "43"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 360,
"wires": [
[
"15313b5d48ecc4e0"
]
]
},
{
"id": "475bb5b88fc4ec27",
"type": "inject",
"z": "9856a1d38d13eaca",
"name": "Get Status",
"props": [],
"repeat": "5",
"crontab": "",
"once": true,
"onceDelay": "1",
"topic": "",
"x": 100,
"y": 360,
"wires": [
[
"805cdcd9b1887272"
]
]
},
{
"id": "bd4bc3e2bd030a14",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Motor Status",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1510,
"y": 400,
"wires": []
},
{
"id": "2edc52c6b5caf98a",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "41"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 690,
"y": 1580,
"wires": [
[
"0fa33270fef00b29"
]
]
},
{
"id": "b8c5bc1aa027ce58",
"type": "inject",
"z": "9856a1d38d13eaca",
"name": "Go",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 530,
"y": 1560,
"wires": [
[
"2edc52c6b5caf98a"
]
]
},
{
"id": "82f1d9fb7cb2e986",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "42"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 690,
"y": 1660,
"wires": [
[
"43d526e1a24335ab"
]
]
},
{
"id": "2e792f92f3dead67",
"type": "inject",
"z": "9856a1d38d13eaca",
"name": "Stop",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 530,
"y": 1640,
"wires": [
[
"82f1d9fb7cb2e986"
]
]
},
{
"id": "301cbfb6b3dfa361",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "44"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "mode",
"type": "byte",
"length": 1,
"dataType": "str",
"data": "0"
},
{
"name": "speed",
"type": "uint16le",
"length": 1,
"dataType": "jsonata",
"data": "payload*4"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 1010,
"y": 1340,
"wires": [
[
"51d8025d6801b13f"
]
]
},
{
"id": "89fee9f6e9a2964e",
"type": "inject",
"z": "9856a1d38d13eaca",
"name": "Set Demand",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 150,
"y": 1500,
"wires": [
[
"dc134d75a115f423"
]
]
},
{
"id": "2274705a6d34c36c",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Motor Set Demand",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1590,
"y": 1340,
"wires": []
},
{
"id": "5278cf8bcb2e9c0d",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 460,
"wires": [
[
"e02d930b4bc13943"
]
]
},
{
"id": "114dcb299af1d170",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Speed Value",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1390,
"y": 500,
"wires": []
},
{
"id": "373b1b08f5bbcb4c",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 580,
"wires": [
[
"a877925ae9253b37"
]
]
},
{
"id": "a5a1bf72f23f55d8",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Current Value",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1400,
"y": 620,
"wires": []
},
{
"id": "696dcf268e07cb5b",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "/1000",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 580,
"wires": [
[
"ad28d9ed11bb4562"
]
]
},
{
"id": "7b20cdf23d3c3c9d",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Filter Pump",
"topic": "aqualinkd/Filter_Pump",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 90,
"y": 60,
"wires": [
[
"49c498588ec62ebc"
]
]
},
{
"id": "49c498588ec62ebc",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "",
"rules": [
{
"t": "set",
"p": "pump_on",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 310,
"y": 60,
"wires": [
[
"b3a1abcb1cdcf955",
"8af346049398efea"
]
]
},
{
"id": "b3a1abcb1cdcf955",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Pump On",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 520,
"y": 40,
"wires": []
},
{
"id": "aabe1de92c8f18af",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Format Status",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "$lookup(\t {\t \"00\":\"stopped\",\t \"09\":\"boot\",\t \"0b\": \"running\",\t \"20\": \"fault\"\t },\t payload\t)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1320,
"y": 360,
"wires": [
[
"bd4bc3e2bd030a14",
"4703066f31f10bb5"
]
]
},
{
"id": "ad32feeeb3ba227f",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "hex",
"name": "status",
"offset": 0,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 360,
"wires": [
[
"f03633129b33107b",
"2f1837693c6c5cc0"
]
]
},
{
"id": "4703066f31f10bb5",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_status",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1550,
"y": 360,
"wires": []
},
{
"id": "805cdcd9b1887272",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 330,
"y": 360,
"wires": [
[
"3fe341deb791895d"
],
[
"61109a0e98136dca"
]
]
},
{
"id": "44af821c2f82ee5e",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 330,
"y": 460,
"wires": [
[
"5278cf8bcb2e9c0d"
],
[
"1df5892b99e699a0",
"9cbd1b8bdc1f631e"
]
]
},
{
"id": "ab6a6927aef0646c",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "/4",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 460,
"wires": [
[
"2ed72ae53bdecbd9"
]
]
},
{
"id": "ed1e7575f92d95b1",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_speed",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1430,
"y": 460,
"wires": []
},
{
"id": "973e010ee2ff2624",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "false",
"repair": false,
"outputs": 2,
"x": 330,
"y": 580,
"wires": [
[
"373b1b08f5bbcb4c"
],
[
"f54ccb8e7a722fa1",
"5ec988d96ae0e32d"
]
]
},
{
"id": "7fd53b9d08463a29",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_current",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1430,
"y": 580,
"wires": []
},
{
"id": "e1e3e789212d3308",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "Pump Go",
"links": [
"fcc9695096cea357"
],
"x": 555,
"y": 1600,
"wires": [
[
"2edc52c6b5caf98a"
]
]
},
{
"id": "fcc9695096cea357",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "Pump Set Demand",
"mode": "link",
"links": [
"e1e3e789212d3308",
"d15193bc17607eed"
],
"x": 1285,
"y": 1400,
"wires": []
},
{
"id": "e28a345839aa6003",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 680,
"wires": [
[
"b575422a85ea0db1"
]
]
},
{
"id": "3b9c6ef378bc6ba1",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Demand Value",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1400,
"y": 720,
"wires": []
},
{
"id": "dee06ba78bb6907a",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 330,
"y": 680,
"wires": [
[
"e28a345839aa6003"
],
[
"8a87c5043bf80cb0",
"f6bc15ceb61dbd44"
]
]
},
{
"id": "5454f251f5acc9ee",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "/4",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 680,
"wires": [
[
"c758db1d6466f4d0"
]
]
},
{
"id": "82dd53db072751ce",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_target_speed",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1450,
"y": 680,
"wires": []
},
{
"id": "a686f6cefc8cd582",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Pump Target Speed",
"topic": "aqualink-nr/pump_target_speed/set",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 150,
"y": 1360,
"wires": [
[
"a6350ebe85ecd080",
"237343edf7786b5b"
]
]
},
{
"id": "0c6ac4facff93db8",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_target_speed",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1630,
"y": 1380,
"wires": []
},
{
"id": "bda3037a145009a2",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "0?",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "gt",
"v": "0",
"vt": "num"
},
{
"t": "eq",
"v": "0",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 810,
"y": 1360,
"wires": [
[
"301cbfb6b3dfa361"
],
[
"ecc0b61b0c49e4e5",
"0c6ac4facff93db8"
]
]
},
{
"id": "ecc0b61b0c49e4e5",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "Target Speed 0",
"mode": "link",
"links": [
"01816a40e86df819"
],
"x": 975,
"y": 1400,
"wires": []
},
{
"id": "01816a40e86df819",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "Pump Stop",
"links": [
"ecc0b61b0c49e4e5"
],
"x": 565,
"y": 1680,
"wires": [
[
"82f1d9fb7cb2e986"
]
]
},
{
"id": "afabc6ce13c5e8a3",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 1,
"length": 1,
"offsetbit": 0,
"scale": "/4",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 1330,
"y": 1340,
"wires": [
[
"2274705a6d34c36c",
"0c6ac4facff93db8"
]
]
},
{
"id": "61109a0e98136dca",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Speed",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"00\"\n}",
"output": "json",
"x": 110,
"y": 460,
"wires": [
[
"44af821c2f82ee5e"
]
]
},
{
"id": "c84b1ee2d0589a75",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Cleaner Pump",
"topic": "aqualinkd/Aux_1",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 90,
"y": 160,
"wires": [
[
"b0fb27e4516b817d"
]
]
},
{
"id": "b0fb27e4516b817d",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "",
"rules": [
{
"t": "set",
"p": "cleaner_on",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 310,
"y": 160,
"wires": [
[
"924d6c736ff753c1"
]
]
},
{
"id": "924d6c736ff753c1",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Cleaner On",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 530,
"y": 160,
"wires": []
},
{
"id": "206189d56d7c2de1",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Pump Run",
"topic": "aqualink-nr/pump_run/set",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 140,
"y": 1620,
"wires": [
[
"75eec75ee6702654"
]
]
},
{
"id": "65600a32ed1bcaf3",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_run",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1180,
"y": 1580,
"wires": []
},
{
"id": "12a7ca669d3ac850",
"type": "function",
"z": "9856a1d38d13eaca",
"name": "Speed to On/Off",
"func": "if (msg.payload > 0) {\n msg.payload = \"ON\";\n} else {\n msg.payload = \"OFF\";\n}\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 940,
"y": 1520,
"wires": [
[
"65600a32ed1bcaf3"
]
]
},
{
"id": "a2753cbd2209a013",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "Speed Read",
"mode": "link",
"links": [
"b5627b790619c3d8"
],
"x": 1335,
"y": 540,
"wires": []
},
{
"id": "b5627b790619c3d8",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "Run Switch",
"links": [
"a2753cbd2209a013"
],
"x": 815,
"y": 1520,
"wires": [
[
"12a7ca669d3ac850"
]
]
},
{
"id": "238d96936802c14a",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Store Target",
"rules": [
{
"t": "set",
"p": "target_speed",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 830,
"y": 1400,
"wires": [
[]
]
},
{
"id": "75eec75ee6702654",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "ON/OFF",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "ON",
"vt": "str"
},
{
"t": "eq",
"v": "OFF",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 300,
"y": 1620,
"wires": [
[
"2edc52c6b5caf98a",
"dc134d75a115f423"
],
[
"82f1d9fb7cb2e986"
]
]
},
{
"id": "dc134d75a115f423",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Get Target",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "target_speed",
"tot": "flow"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 390,
"y": 1500,
"wires": [
[
"5dff72d07a169bc1"
]
]
},
{
"id": "5e27d594ed74cb79",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "ON",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "ON",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 970,
"y": 1580,
"wires": [
[
"65600a32ed1bcaf3"
]
]
},
{
"id": "9f9843abaf3083d7",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "OFF",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "OFF",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 970,
"y": 1660,
"wires": [
[
"65600a32ed1bcaf3"
]
]
},
{
"id": "4b3a0a811247516c",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Spa Heater Enabled",
"topic": "aqualinkd/Spa_Heater/enabled",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 110,
"y": 220,
"wires": [
[
"3ef8b7dc59d155bb"
]
]
},
{
"id": "3ef8b7dc59d155bb",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "",
"rules": [
{
"t": "set",
"p": "spa_heater_enabled",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 360,
"y": 220,
"wires": [
[
"7fc3ec16b21d5395"
]
]
},
{
"id": "7fc3ec16b21d5395",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Heater Enabled",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 600,
"y": 220,
"wires": []
},
{
"id": "a030e9b158e4dbf4",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Pool Heater Enabled",
"topic": "aqualinkd/Pool_Heater/enabled",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 110,
"y": 280,
"wires": [
[
"4b529de83445df6a"
]
]
},
{
"id": "4b529de83445df6a",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "",
"rules": [
{
"t": "set",
"p": "pool_heater_enabled",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 360,
"y": 280,
"wires": [
[
"c8e53cb19834f117"
]
]
},
{
"id": "c8e53cb19834f117",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Heater Enabled",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 600,
"y": 280,
"wires": []
},
{
"id": "5550d5ac98b808d9",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "0",
"vt": "num"
},
{
"t": "eq",
"v": "1",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 650,
"y": 100,
"wires": [
[
"f19a12b6816876d3"
],
[
"69df13b4b5c07425"
]
]
},
{
"id": "a6350ebe85ecd080",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 410,
"y": 1360,
"wires": [
[
"5dff72d07a169bc1"
]
]
},
{
"id": "94ef44a77b2dfe64",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Store Demand",
"rules": [
{
"t": "set",
"p": "target_speed",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1120,
"y": 740,
"wires": [
[
"0cf5e4c4033732e9"
]
]
},
{
"id": "f54ccb8e7a722fa1",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0.0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 620,
"wires": [
[
"ad28d9ed11bb4562"
]
]
},
{
"id": "1df5892b99e699a0",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0.0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 500,
"wires": [
[
"2ed72ae53bdecbd9"
]
]
},
{
"id": "8a87c5043bf80cb0",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0.0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 720,
"wires": [
[
"8865d8114489529b"
]
]
},
{
"id": "5dff72d07a169bc1",
"type": "function",
"z": "9856a1d38d13eaca",
"name": "Min Speed for Heater",
"func": "const min_speed = 2400;\n\nlet spa_heater = flow.get(\"spa_heater_enabled\");\nlet pool_heater = flow.get(\"pool_heater_enabled\"); \n\nif (spa_heater || pool_heater) {\n if (msg.payload < min_speed) {\n msg.payload = min_speed;\n node.status({ fill: \"red\", shape: \"dot\", text: `Speed adjusted to ${min_speed}` });\n return msg;\n }\n node.status({ fill: \"green\", shape: \"dot\", text: `Speed OK for heater` });\n return msg;\n} \nnode.status({ fill: \"green\", shape: \"ring\", text: `No heater in use` });\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 620,
"y": 1360,
"wires": [
[
"bda3037a145009a2",
"238d96936802c14a"
]
]
},
{
"id": "9cbd1b8bdc1f631e",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Current",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"01\"\n}",
"output": "json",
"x": 120,
"y": 580,
"wires": [
[
"973e010ee2ff2624"
]
]
},
{
"id": "5ec988d96ae0e32d",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Demand",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"03\"\n}",
"output": "json",
"x": 120,
"y": 680,
"wires": [
[
"dee06ba78bb6907a"
]
]
},
{
"id": "0f29a84c5c5e0d68",
"type": "cron-filter",
"z": "9856a1d38d13eaca",
"name": "Not 0700-0800 or 1600-1700",
"crontab": "* * 0-6,8-15,17-23 * * * *",
"x": 420,
"y": 2140,
"wires": [
[
"534e4d91d06dfc23"
]
]
},
{
"id": "972a23c34cb68d85",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "1800",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1800",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 210,
"y": 2140,
"wires": [
[
"0f29a84c5c5e0d68"
]
]
},
{
"id": "380c2223e3d4824a",
"type": "cron-filter",
"z": "9856a1d38d13eaca",
"name": "0700-0800 or 1600-1700",
"crontab": "* * 7,16 * * * *",
"x": 410,
"y": 2180,
"wires": [
[
"534e4d91d06dfc23"
]
]
},
{
"id": "57dc37a7e12bbe2d",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "2950",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "3000",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 210,
"y": 2180,
"wires": [
[
"380c2223e3d4824a"
]
]
},
{
"id": "06ad6e5a9253c850",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Pump Schedule Set",
"topic": "aqualink-nr/pump_schedule/set",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 170,
"y": 1740,
"wires": [
[
"c81e53d2823450e8"
]
]
},
{
"id": "c81e53d2823450e8",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "ON",
"vt": "str"
},
{
"t": "eq",
"v": "OFF",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 350,
"y": 1740,
"wires": [
[
"7fdfec3ab876e0d2"
],
[
"7fdfec3ab876e0d2"
]
]
},
{
"id": "7fdfec3ab876e0d2",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_schedule",
"qos": "",
"retain": "true",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 600,
"y": 1740,
"wires": []
},
{
"id": "cc55743bb712bdc9",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "Schedule In",
"links": [],
"x": 95,
"y": 2160,
"wires": [
[
"972a23c34cb68d85",
"57dc37a7e12bbe2d"
]
]
},
{
"id": "534e4d91d06dfc23",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "Schedule Out",
"mode": "return",
"links": [],
"x": 605,
"y": 2160,
"wires": []
},
{
"id": "a809b7ce6f439b82",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Sched Speed",
"links": [
"cc55743bb712bdc9"
],
"linkType": "static",
"timeout": "30",
"x": 380,
"y": 1280,
"wires": [
[
"5ebcbb8892ca1aa7"
]
]
},
{
"id": "61b793f22cb0261c",
"type": "comment",
"z": "9856a1d38d13eaca",
"name": "Schedule",
"info": "",
"x": 140,
"y": 2100,
"wires": []
},
{
"id": "f49466b8275ed2b8",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "Priming Delay",
"pauseType": "delay",
"timeout": "170",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 1000,
"y": 100,
"wires": [
[
"362e83248885fac0"
]
]
},
{
"id": "f19a12b6816876d3",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Reset",
"rules": [
{
"t": "set",
"p": "reset",
"pt": "msg",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 80,
"wires": [
[
"f49466b8275ed2b8"
]
]
},
{
"id": "046175adc7824848",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Following Schedule?",
"topic": "aqualink-nr/pump_schedule",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 170,
"y": 1800,
"wires": [
[
"225d0311a9846c48"
]
]
},
{
"id": "05ade3e47f398686",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Store Sched Enabled",
"rules": [
{
"t": "set",
"p": "schedule_enabled",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 540,
"y": 1800,
"wires": [
[
"134112ac273a67f3"
]
]
},
{
"id": "134112ac273a67f3",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Schedule Enabled?",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "$flowContext(\"schedule_enabled\")\t",
"targetType": "jsonata",
"statusVal": "payload",
"statusType": "auto",
"x": 770,
"y": 1800,
"wires": []
},
{
"id": "d08cbee75dba0fbb",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Follow Schedule?",
"property": "schedule_enabled",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "ON",
"vt": "str"
},
{
"t": "eq",
"v": "OFF",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 170,
"y": 1280,
"wires": [
[
"a809b7ce6f439b82"
],
[]
]
},
{
"id": "b270dc6dc937911b",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "link in 1",
"links": [
"7c27e7881d003242"
],
"x": 385,
"y": 1700,
"wires": [
[
"7fdfec3ab876e0d2"
]
]
},
{
"id": "225d0311a9846c48",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "rbe",
"gap": "",
"start": "",
"inout": "out",
"septopics": true,
"property": "payload",
"topi": "topic",
"x": 350,
"y": 1800,
"wires": [
[
"05ade3e47f398686"
]
]
},
{
"id": "237343edf7786b5b",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Sched OFF",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "OFF",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 410,
"y": 1420,
"wires": [
[
"7c27e7881d003242"
]
]
},
{
"id": "7c27e7881d003242",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "link out 2",
"mode": "link",
"links": [
"b270dc6dc937911b",
"4a7358bc52fc815a"
],
"x": 525,
"y": 1420,
"wires": []
},
{
"id": "5ebcbb8892ca1aa7",
"type": "function",
"z": "9856a1d38d13eaca",
"name": "At Speed?",
"func": "let target_speed = flow.get(\"target_speed\");\nlet priming = flow.get(\"priming\");\n\n// Check if we're at the scheduled target speed\nif (msg.payload === target_speed) {\n node.status({fill:\"green\",shape:\"dot\",text:`At target ${msg.payload}`});\n return null;\n}\n\n// or if the pump is still priming\nif (priming) {\n node.status({ fill: \"yellow\", shape: \"dot\", text: \"Still priming\" });\n return null;\n}\n\n// If not update the flow variable and proceed with new speed.\nflow.set(\"target_speed\", msg.payload);\nnode.status({fill:\"red\",shape:\"ring\",text:`New Speed ${msg.payload}`});\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 570,
"y": 1280,
"wires": [
[
"bef015b50f79d33a"
]
]
},
{
"id": "69df13b4b5c07425",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Priming",
"rules": [
{
"t": "set",
"p": "priming",
"pt": "flow",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 820,
"y": 120,
"wires": [
[
"f49466b8275ed2b8"
]
]
},
{
"id": "362e83248885fac0",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Done Priming",
"rules": [
{
"t": "set",
"p": "priming",
"pt": "flow",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1200,
"y": 100,
"wires": [
[]
]
},
{
"id": "8af346049398efea",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "rbe",
"gap": "",
"start": "",
"inout": "out",
"septopics": true,
"property": "payload",
"topi": "topic",
"x": 510,
"y": 100,
"wires": [
[
"5550d5ac98b808d9"
]
]
},
{
"id": "d93016d36e83b648",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Boost Mode Set",
"topic": "aqualink-nr/pump_boost/set",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 160,
"y": 1900,
"wires": [
[
"da11096def3a0353"
]
]
},
{
"id": "da11096def3a0353",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "ON",
"vt": "str"
},
{
"t": "eq",
"v": "OFF",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 350,
"y": 1900,
"wires": [
[
"2f44d37dd4e891f5"
],
[
"2f44d37dd4e891f5"
]
]
},
{
"id": "2f44d37dd4e891f5",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_boost",
"qos": "",
"retain": "true",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 590,
"y": 1900,
"wires": []
},
{
"id": "09dc31a6978f7282",
"type": "mqtt in",
"z": "9856a1d38d13eaca",
"name": "Boost Mode?",
"topic": "aqualink-nr/pump_boost",
"qos": "2",
"datatype": "auto-detect",
"broker": "2996cb7f9b91f906",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 150,
"y": 1960,
"wires": [
[
"5c221ece0a285b8a"
]
]
},
{
"id": "1c888c385bccf777",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Store pump_boost",
"rules": [
{
"t": "set",
"p": "pump_boost",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 530,
"y": 1960,
"wires": [
[
"fa6d7f421a11a000"
]
]
},
{
"id": "fa6d7f421a11a000",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Boost Mode?",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "$flowContext(\"pump_boost\")\t",
"targetType": "jsonata",
"statusVal": "payload",
"statusType": "auto",
"x": 750,
"y": 1960,
"wires": []
},
{
"id": "4a7358bc52fc815a",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "link in 2",
"links": [
"7c27e7881d003242",
"7e3833b20884fb6c"
],
"x": 385,
"y": 1860,
"wires": [
[
"2f44d37dd4e891f5"
]
]
},
{
"id": "5c221ece0a285b8a",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "rbe",
"gap": "",
"start": "",
"inout": "out",
"septopics": true,
"property": "payload",
"topi": "topic",
"x": 350,
"y": 1960,
"wires": [
[
"1c888c385bccf777",
"40a142a015cb9902"
]
]
},
{
"id": "8ae1a1d4c09cfb1f",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Boost Mode?",
"property": "pump_boost",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "ON",
"vt": "str"
},
{
"t": "eq",
"v": "OFF",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 190,
"y": 1200,
"wires": [
[
"e40d742037120669"
],
[
"d08cbee75dba0fbb"
]
]
},
{
"id": "e40d742037120669",
"type": "function",
"z": "9856a1d38d13eaca",
"name": "At Speed?",
"func": "let priming = flow.get(\"priming\");\nlet boost_speed = 3450;\n\n// Check if we're at the scheduled target speed\nif (msg.payload === boost_speed) {\n node.status({fill:\"green\",shape:\"dot\",text:`At boost speed ${msg.payload}`});\n return null;\n}\n\n// or if the pump is still priming\nif (priming) {\n node.status({ fill: \"yellow\", shape: \"dot\", text: \"Still priming\" });\n return null;\n}\n\n// If not, proceed with new speed.\nmsg.payload = boost_speed;\nnode.status({ fill: \"red\", shape: \"ring\", text: `New Speed ${boost_speed}`});\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 570,
"y": 1200,
"wires": [
[
"bef015b50f79d33a"
]
]
},
{
"id": "b5505107690d9120",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "delay",
"timeout": "30",
"timeoutUnits": "minutes",
"rate": "1",
"nbRateUnits": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": false,
"allowrate": false,
"outputs": 1,
"x": 770,
"y": 2020,
"wires": [
[
"a36c4f6039edb7e9"
]
]
},
{
"id": "a36c4f6039edb7e9",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Boost OFF",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "OFF",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 950,
"y": 2020,
"wires": [
[
"7e3833b20884fb6c"
]
]
},
{
"id": "7e3833b20884fb6c",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "link out 3",
"mode": "link",
"links": [
"4a7358bc52fc815a"
],
"x": 1065,
"y": 2020,
"wires": []
},
{
"id": "40a142a015cb9902",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "ON",
"vt": "str"
},
{
"t": "eq",
"v": "OFF",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 490,
"y": 2000,
"wires": [
[
"b5505107690d9120"
],
[
"4127f594976762e2"
]
]
},
{
"id": "4127f594976762e2",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "Reset",
"rules": [
{
"t": "set",
"p": "reset",
"pt": "msg",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 630,
"y": 2040,
"wires": [
[
"b5505107690d9120"
]
]
},
{
"id": "f6bc15ceb61dbd44",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Shaft Power",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"0a\"\n}",
"output": "json",
"x": 130,
"y": 780,
"wires": [
[
"b63115af550674c9"
]
]
},
{
"id": "d9552ee1e8158fd8",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 780,
"wires": [
[
"5b0a98625cf55f34"
]
]
},
{
"id": "489f747b383515b3",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Output Power",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1400,
"y": 820,
"wires": []
},
{
"id": "a5d91f6f892a344b",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 780,
"wires": [
[
"eda98a70a4b354b8"
]
]
},
{
"id": "b63115af550674c9",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "false",
"repair": false,
"outputs": 2,
"x": 330,
"y": 780,
"wires": [
[
"d9552ee1e8158fd8"
],
[
"c1b0d106c165f997",
"06c1e0ef16747009"
]
]
},
{
"id": "fa4d6ea0827cec5e",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_output_power",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1450,
"y": 780,
"wires": []
},
{
"id": "c1b0d106c165f997",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0.0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 820,
"wires": [
[
"eda98a70a4b354b8"
]
]
},
{
"id": "06c1e0ef16747009",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Inverter Power",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"05\"\n}",
"output": "json",
"x": 140,
"y": 880,
"wires": [
[
"84f0057416057941"
]
]
},
{
"id": "d79518222f16760a",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 880,
"wires": [
[
"a235bb5283d470aa"
]
]
},
{
"id": "815e89d8f8d2a26e",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Inverter Input Power",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1420,
"y": 920,
"wires": []
},
{
"id": "066d899bbcf2244d",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 880,
"wires": [
[
"bba17e656f3471af"
]
]
},
{
"id": "84f0057416057941",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "false",
"repair": false,
"outputs": 2,
"x": 330,
"y": 880,
"wires": [
[
"d79518222f16760a"
],
[
"cfab475da831c990",
"72f4e1e779ba618c"
]
]
},
{
"id": "2232dc901efaa633",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_input_power",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1450,
"y": 880,
"wires": []
},
{
"id": "cfab475da831c990",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0.0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 920,
"wires": [
[
"bba17e656f3471af"
]
]
},
{
"id": "72f4e1e779ba618c",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Bus Voltage",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"06\"\n}",
"output": "json",
"x": 130,
"y": 980,
"wires": [
[
"f6c9f1a425d8de4c"
]
]
},
{
"id": "458e97797557e358",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 980,
"wires": [
[
"4533d49327560a2a"
]
]
},
{
"id": "d12836adba922648",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "DC Bus Voltage",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1400,
"y": 1020,
"wires": []
},
{
"id": "88f6ebb608da8b2c",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "/64",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 980,
"wires": [
[
"185974b58432a9d5"
]
]
},
{
"id": "f6c9f1a425d8de4c",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "false",
"repair": false,
"outputs": 2,
"x": 330,
"y": 980,
"wires": [
[
"458e97797557e358"
],
[
"9bb2b4ebdeba2d0b",
"c14fe640d524f1a8"
]
]
},
{
"id": "7a280a5b52669187",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_dc_bus_voltage",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1460,
"y": 980,
"wires": []
},
{
"id": "9bb2b4ebdeba2d0b",
"type": "change",
"z": "9856a1d38d13eaca",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0.0",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 510,
"y": 1020,
"wires": [
[
"185974b58432a9d5"
]
]
},
{
"id": "c14fe640d524f1a8",
"type": "template",
"z": "9856a1d38d13eaca",
"name": "Previous Fault",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"09\"\n}",
"output": "json",
"x": 140,
"y": 1080,
"wires": [
[
"3a844e883c737470"
]
]
},
{
"id": "fd1f2cbd837f86be",
"type": "buffer-maker",
"z": "9856a1d38d13eaca",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 530,
"y": 1080,
"wires": [
[
"b9941b6367c99613"
]
]
},
{
"id": "ead0ada6ee788607",
"type": "debug",
"z": "9856a1d38d13eaca",
"name": "Previous Fault",
"active": false,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1400,
"y": 1120,
"wires": []
},
{
"id": "d2c1f04a1b685254",
"type": "buffer-parser",
"z": "9856a1d38d13eaca",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "hex",
"name": "value",
"offset": 0,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 870,
"y": 1080,
"wires": [
[
"033641d56247364c",
"5356cb0212a12a2f"
]
]
},
{
"id": "3a844e883c737470",
"type": "switch",
"z": "9856a1d38d13eaca",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
},
{
"t": "else"
}
],
"checkall": "false",
"repair": false,
"outputs": 2,
"x": 330,
"y": 1080,
"wires": [
[
"fd1f2cbd837f86be"
],
[]
]
},
{
"id": "eb0e0b0d06bae896",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"name": "",
"topic": "aqualink-nr/pump_fault",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1420,
"y": 1080,
"wires": []
},
{
"id": "0cf5e4c4033732e9",
"type": "link out",
"z": "9856a1d38d13eaca",
"name": "Check Demand",
"mode": "link",
"links": [
"316e3181807ea58d"
],
"x": 1235,
"y": 740,
"wires": []
},
{
"id": "316e3181807ea58d",
"type": "link in",
"z": "9856a1d38d13eaca",
"name": "Check Demand",
"links": [
"0cf5e4c4033732e9"
],
"x": 75,
"y": 1200,
"wires": [
[
"8ae1a1d4c09cfb1f"
]
]
},
{
"id": "15381188ce92036c",
"type": "link in",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "Serial In",
"links": [],
"x": 955,
"y": 220,
"wires": [
[
"ec6342cad808afe5"
]
]
},
{
"id": "15c28d09e12eb077",
"type": "serial request",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "Pump",
"serial": "70d595318ad0cd72",
"x": 1190,
"y": 220,
"wires": [
[
"b2fe3c569209c4e7"
]
]
},
{
"id": "ec6342cad808afe5",
"type": "function",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "CRC16",
"func": "function crc16(buffer) {\n var crc = 0xFFFF;\n var odd;\n\n for (var i = 0; i < buffer.length; i++) {\n crc = crc ^ buffer[i];\n\n for (var j = 0; j < 8; j++) {\n odd = crc & 0x0001;\n crc = crc >> 1;\n if (odd) {\n crc = crc ^ 0xA001;\n }\n }\n }\n\n return crc;\n};\n\nfunction swap16(val) {\n return ((val & 0xFF) << 8)\n | ((val >> 8) & 0xFF);\n}\n\nlet checksumBuffer = Buffer.allocUnsafe(2);\nchecksumBuffer.writeUInt16LE(crc16(msg.payload), 0);\nmsg.payload = Buffer.concat([msg.payload, checksumBuffer], \n msg.payload.length + checksumBuffer.length);\n\nreturn msg;\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1060,
"y": 220,
"wires": [
[
"15c28d09e12eb077"
]
]
},
{
"id": "2a28bc47eff77744",
"type": "link out",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "Serial Out",
"mode": "return",
"links": [],
"x": 1485,
"y": 220,
"wires": []
},
{
"id": "15313b5d48ecc4e0",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 360,
"wires": [
[
"ad32feeeb3ba227f",
"61109a0e98136dca"
]
]
},
{
"id": "e02d930b4bc13943",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 460,
"wires": [
[
"ab6a6927aef0646c",
"9cbd1b8bdc1f631e"
]
]
},
{
"id": "a877925ae9253b37",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 580,
"wires": [
[
"696dcf268e07cb5b",
"5ec988d96ae0e32d"
]
]
},
{
"id": "b575422a85ea0db1",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 680,
"wires": [
[
"5454f251f5acc9ee",
"f6bc15ceb61dbd44"
]
]
},
{
"id": "5b0a98625cf55f34",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 780,
"wires": [
[
"a5d91f6f892a344b",
"06c1e0ef16747009"
]
]
},
{
"id": "a235bb5283d470aa",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 880,
"wires": [
[
"066d899bbcf2244d",
"72f4e1e779ba618c"
]
]
},
{
"id": "4533d49327560a2a",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 980,
"wires": [
[
"88f6ebb608da8b2c",
"c14fe640d524f1a8"
]
]
},
{
"id": "b9941b6367c99613",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 690,
"y": 1080,
"wires": [
[
"d2c1f04a1b685254"
]
]
},
{
"id": "51d8025d6801b13f",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 1170,
"y": 1340,
"wires": [
[
"afabc6ce13c5e8a3",
"fcc9695096cea357"
]
]
},
{
"id": "0fa33270fef00b29",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 830,
"y": 1580,
"wires": [
[
"5e27d594ed74cb79"
]
]
},
{
"id": "43d526e1a24335ab",
"type": "link call",
"z": "9856a1d38d13eaca",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 830,
"y": 1660,
"wires": [
[
"9f9843abaf3083d7"
]
]
},
{
"id": "b2fe3c569209c4e7",
"type": "function",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "Check CRC16",
"func": "function crc16(buffer) {\n var crc = 0xFFFF;\n var odd;\n\n for (var i = 0; i < buffer.length; i++) {\n crc = crc ^ buffer[i];\n\n for (var j = 0; j < 8; j++) {\n odd = crc & 0x0001;\n crc = crc >> 1;\n if (odd) {\n crc = crc ^ 0xA001;\n }\n }\n }\n\n return crc;\n};\n\nlet nack_codes = {\n \"01\": \"Command not recognized / illegal\",\n \"02\": \"Operand out of allowed range\",\n \"03\": \"Data out of range\",\n \"04\": \"General failure: fault mode\",\n \"05\": \"Incorrect command length\",\n \"06\": \"Command cannot be executed now\",\n \"09\": \"Buffer error\",\n \"0A\": \"Running parameters incomplete\",\n \"10\": \"OK\"\n};\n\nlet received_crc = msg.payload.readUInt16LE(msg.payload.length - 2);\n\nmsg.payload = msg.payload.subarray(0, -2);\nlet calc_crc = crc16(msg.payload);\n\n\nif (received_crc === calc_crc) {\n let cmd = msg.payload[1].toString(16);\n let ack = msg.payload[2].toString(16);\n msg.payload = msg.payload.subarray(3);\n if (ack === \"10\") {\n node.status({fill:\"green\",shape:\"dot\",text:`Cmd ${cmd} OK`});\n return msg;\n }\n node.status({ fill: \"red\", shape: \"ring\", text: `Bad Cmd ${cmd}: ${nack_codes[ack]}`});\n node.error(`NACK Received: ${cmd} ${nack_codes[ack]}`, msg);\n}\n\nnode.status({fill:\"red\",shape:\"ring\",text:\"Invalid message\"});\nnode.error(\"Invalid message, checksum mismatch\", msg);\nreturn null;\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1360,
"y": 220,
"wires": [
[
"2a28bc47eff77744"
]
]
},
{
"id": "f03633129b33107b",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 360,
"wires": [
[
"aabe1de92c8f18af"
]
]
},
{
"id": "2f1837693c6c5cc0",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "rbei",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1090,
"y": 400,
"wires": [
[
"aabe1de92c8f18af"
]
]
},
{
"id": "65c04568a955e257",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "deadbandEq",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1100,
"y": 500,
"wires": [
[
"3ee19bd474ee13a9"
]
]
},
{
"id": "d57a8908f6ddef08",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 460,
"wires": [
[
"3ee19bd474ee13a9"
]
]
},
{
"id": "efc823c8b8697a1f",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "deadbandEq",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1100,
"y": 620,
"wires": [
[
"443aaab7b4cb6a8c"
]
]
},
{
"id": "3749220ec5e4af58",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 580,
"wires": [
[
"443aaab7b4cb6a8c"
]
]
},
{
"id": "159f9b5e26c6c389",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "deadbandEq",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1120,
"y": 700,
"wires": [
[
"606324011d7bbf0a"
]
]
},
{
"id": "46bc79ee5b833e5e",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1120,
"y": 660,
"wires": [
[
"606324011d7bbf0a"
]
]
},
{
"id": "a10c89b3db825710",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "deadbandEq",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1100,
"y": 820,
"wires": [
[
"c28a163409c834e2"
]
]
},
{
"id": "5ef00dd339776cef",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 780,
"wires": [
[
"c28a163409c834e2"
]
]
},
{
"id": "8fedc03c590b3285",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "deadbandEq",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1100,
"y": 920,
"wires": [
[
"4785572017fce44a"
]
]
},
{
"id": "62a9892f3f654245",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 880,
"wires": [
[
"4785572017fce44a"
]
]
},
{
"id": "57fc08c115c23bfe",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "deadbandEq",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1100,
"y": 1020,
"wires": [
[
"52412dd9c6b64122"
]
]
},
{
"id": "4cb729eb16dd8486",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 980,
"wires": [
[
"52412dd9c6b64122"
]
]
},
{
"id": "033641d56247364c",
"type": "delay",
"z": "9856a1d38d13eaca",
"name": "",
"pauseType": "rate",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"nbRateUnits": "30",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"drop": true,
"allowrate": false,
"outputs": 1,
"x": 1100,
"y": 1080,
"wires": [
[
"34c8e66c9117a153"
]
]
},
{
"id": "5356cb0212a12a2f",
"type": "rbe",
"z": "9856a1d38d13eaca",
"name": "",
"func": "rbei",
"gap": "20%",
"start": "",
"inout": "out",
"septopics": false,
"property": "payload",
"topi": "topic",
"x": 1090,
"y": 1120,
"wires": [
[
"34c8e66c9117a153"
]
]
},
{
"id": "3bd2d948f28c6502",
"type": "catch",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "Serial Error",
"scope": [
"15c28d09e12eb077"
],
"uncaught": false,
"x": 1070,
"y": 280,
"wires": [
[
"b44ccc7877a2be15"
]
]
},
{
"id": "b44ccc7877a2be15",
"type": "mqtt out",
"z": "9856a1d38d13eaca",
"g": "927832aead2f5fea",
"name": "",
"topic": "aqualink-nr/last_serial_comms_error",
"qos": "",
"retain": "true",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1330,
"y": 280,
"wires": []
},
{
"id": "f0927bbfeb643062",
"type": "mqtt out",
"z": "0b8cc767e1d33f36",
"name": "",
"topic": "",
"qos": "",
"retain": "true",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "2996cb7f9b91f906",
"x": 1330,
"y": 140,
"wires": []
},
{
"id": "c7678859afd0c898",
"type": "inject",
"z": "0b8cc767e1d33f36",
"name": "Send Discovery Info",
"props": [],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": "0.5",
"topic": "",
"x": 200,
"y": 140,
"wires": [
[
"9783f19f0e5f9d10"
]
]
},
{
"id": "652272f6e8be157d",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Status",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/sensor/aqualink-nr/pump_status/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1050,
"y": 80,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "9783f19f0e5f9d10",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Device Info",
"field": "device_payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"name\": \"Pool Filter Pump\",\n \"configuration_url\": \"http://aqualink-rps.lan.bond.casa:1880/ui\",\n \"suggested_area\": \"Pool\",\n \"sw_version\": \"1.0.0\",\n \"manufacturer\": \"Century\",\n \"model\": \"VGreen Evo\",\n \"identifiers\": [\n \"2a:c3:bb:68:5d:4c\"\n ],\n \"connections\": [\n [\n \"mac\",\n \"2a:c3:bb:68:5d:4c\"\n ]\n ]\n}",
"output": "json",
"x": 450,
"y": 140,
"wires": [
[
"42ec027f56f75fc3"
]
]
},
{
"id": "e297237faa0368c1",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Status Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"icon\": \"mdi:pump\",\n \"unique_id\": \"vgreen_evo_pump_status\",\n \"state_topic\": \"aqualink-nr/pump_status\",\n \"name\": \"Pool Filter Pump Status\",\n \"device_class\": \"enum\"\n}\n",
"output": "json",
"x": 770,
"y": 80,
"wires": [
[
"652272f6e8be157d"
]
]
},
{
"id": "1f6daea9a3817c19",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Speed Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"icon\": \"mdi:speedometer\",\n \"unique_id\": \"vgreen_evo_pump_speed\",\n \"state_topic\": \"aqualink-nr/pump_speed\",\n \"name\": \"Pool Filter Pump Speed\",\n \"state_class\": \"measurement\",\n \"unit_of_measurement\": \"rpm\"\n}",
"output": "json",
"x": 770,
"y": 120,
"wires": [
[
"a7b2c7f8664fe740"
]
]
},
{
"id": "a7b2c7f8664fe740",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Speed",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/sensor/aqualink-nr/pump_speed/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1050,
"y": 120,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "3d58e446346e585e",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Current Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_current\",\n \"state_topic\": \"aqualink-nr/pump_current\",\n \"name\": \"Pool Filter Pump Current\",\n \"state_class\": \"measurement\",\n \"unit_of_measurement\": \"A\",\n \"device_class\": \"current\"\n}",
"output": "json",
"x": 780,
"y": 160,
"wires": [
[
"e319fc26dd4d6443"
]
]
},
{
"id": "e319fc26dd4d6443",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Current",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/sensor/aqualink-nr/pump_current/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1060,
"y": 160,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "9b493016d3a1e737",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Target Speed Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_target_speed\",\n \"state_topic\": \"aqualink-nr/pump_target_speed\",\n \"command_topic\": \"aqualink-nr/pump_target_speed/set\",\n \"name\": \"Pool Filter Pump Target Speed\",\n \"unit_of_measurement\": \"rpm\",\n \"min\": 1150,\n \"max\": 3450,\n \"mode\": \"slider\",\n \"step\": 50,\n \"icon\": \"mdi:speedometer\"\n}",
"output": "json",
"x": 800,
"y": 200,
"wires": [
[
"8233024ebd5c042d"
]
]
},
{
"id": "8233024ebd5c042d",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Target Speed",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/number/aqualink-nr/pump_target_speed/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1080,
"y": 200,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "65270f8e6232ba37",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Run Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_run\",\n \"state_topic\": \"aqualink-nr/pump_run\",\n \"command_topic\": \"aqualink-nr/pump_run/set\",\n \"name\": \"Pool Filter Pump Run\",\n \"icon\": \"mdi:pump\"\n}",
"output": "json",
"x": 770,
"y": 240,
"wires": [
[
"9fe4ed5b6b57f421"
]
]
},
{
"id": "9fe4ed5b6b57f421",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Run",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/switch/aqualink-nr/pump_run/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1050,
"y": 240,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "2e250cfd413905c9",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Schedule",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/switch/aqualink-nr/pump_schedule/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1060,
"y": 280,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "4f62b5cb98529931",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Schedule Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_schedule\",\n \"state_topic\": \"aqualink-nr/pump_schedule\",\n \"command_topic\": \"aqualink-nr/pump_schedule/set\",\n \"name\": \"Pool Filter Pump Schedule\",\n \"icon\": \"mdi:calendar-clock\"\n}",
"output": "json",
"x": 780,
"y": 280,
"wires": [
[
"2e250cfd413905c9"
]
]
},
{
"id": "b4b0db590b51bd61",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Skim Boost Discovery Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_boost\",\n \"state_topic\": \"aqualink-nr/pump_boost\",\n \"command_topic\": \"aqualink-nr/pump_boost/set\",\n \"name\": \"Pool Filter Pump Skim Boost\",\n \"icon\": \"mdi:calendar-clock\"\n}",
"output": "json",
"x": 790,
"y": 320,
"wires": [
[
"017a124da2c8419c"
]
]
},
{
"id": "017a124da2c8419c",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Skim Boost",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/switch/aqualink-nr/pump_boost/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1070,
"y": 320,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "b4559c057a9e4e84",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Output Power Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_output_power\",\n \"state_topic\": \"aqualink-nr/pump_output_power\",\n \"name\": \"Pool Filter Pump Output Power\",\n \"state_class\": \"measurement\",\n \"unit_of_measurement\": \"W\",\n \"device_class\": \"power\"\n}",
"output": "json",
"x": 760,
"y": 360,
"wires": [
[
"db6fb19d235a72f0"
]
]
},
{
"id": "db6fb19d235a72f0",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Output Power",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/sensor/aqualink-nr/pump_output_power/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1080,
"y": 360,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "4ad822d5a507dce2",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Input Power Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_input_power\",\n \"state_topic\": \"aqualink-nr/pump_input_power\",\n \"name\": \"Pool Filter Pump Input Power\",\n \"state_class\": \"measurement\",\n \"unit_of_measurement\": \"W\",\n \"device_class\": \"power\"\n}",
"output": "json",
"x": 760,
"y": 400,
"wires": [
[
"c53506cb7bb9a260"
]
]
},
{
"id": "c53506cb7bb9a260",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Input Power",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/sensor/aqualink-nr/pump_input_power/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1070,
"y": 400,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "a897a22d073195e5",
"type": "template",
"z": "0b8cc767e1d33f36",
"name": "Pump Fault Code Payload",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"availability\": [\n {\n \"payload_available\": \"online\",\n \"payload_not_available\": \"offline\",\n \"topic\": \"aqualink-nr/status\"\n }\n ],\n \"force_update\": true,\n \"expire_after\": 3600,\n \"unique_id\": \"vgreen_evo_pump_fault\",\n \"state_topic\": \"aqualink-nr/pump_fault\",\n \"name\": \"Pool Filter Pump Fault Code\",\n \"device_class\": \"enum\"\n}",
"output": "json",
"x": 750,
"y": 440,
"wires": [
[
"d6e5aa02b1119d30"
]
]
},
{
"id": "d6e5aa02b1119d30",
"type": "change",
"z": "0b8cc767e1d33f36",
"name": "Pump Fault Code",
"rules": [
{
"t": "set",
"p": "topic",
"pt": "msg",
"to": "homeassistant/sensor/aqualink-nr/pump_fault/config",
"tot": "str"
},
{
"t": "set",
"p": "payload.device",
"pt": "msg",
"to": "device_payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1070,
"y": 440,
"wires": [
[
"f0927bbfeb643062"
]
]
},
{
"id": "80d36e7adbe2c06c",
"type": "buffer-maker",
"z": "5009531429fbeac6",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "45"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "byte",
"length": 1,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 690,
"y": 60,
"wires": [
[
"01ae7cfcc1091a64"
]
]
},
{
"id": "b8ed759c7b68d912",
"type": "inject",
"z": "5009531429fbeac6",
"name": "Read Sensor",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 130,
"y": 60,
"wires": [
[
"37307a76dc8d3784"
]
]
},
{
"id": "af9fbea860ba9919",
"type": "debug",
"z": "5009531429fbeac6",
"name": "Read Sensor Value",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1210,
"y": 60,
"wires": []
},
{
"id": "c97e8820e3bd9b3f",
"type": "buffer-parser",
"z": "5009531429fbeac6",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "hex",
"name": "page",
"offset": 0,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
},
{
"type": "hex",
"name": "address",
"offset": 1,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
},
{
"type": "int16le",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "keyvalue",
"resultTypeType": "return",
"multipleResult": false,
"fanOutMultipleResult": false,
"setTopic": true,
"outputs": 1,
"x": 1010,
"y": 60,
"wires": [
[
"af9fbea860ba9919"
]
]
},
{
"id": "37307a76dc8d3784",
"type": "template",
"z": "5009531429fbeac6",
"name": "Page/Address",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": 0,\n \"address\": \"0a\"\n}",
"output": "json",
"x": 320,
"y": 60,
"wires": [
[
"8fce8548d604c1a1"
]
]
},
{
"id": "f8ae4884a308f614",
"type": "buffer-maker",
"z": "5009531429fbeac6",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "64"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
},
{
"name": "length",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.length"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 690,
"y": 100,
"wires": [
[
"91a3b09cae387053"
]
]
},
{
"id": "551165a453f320d2",
"type": "inject",
"z": "5009531429fbeac6",
"name": "Read Config",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 130,
"y": 100,
"wires": [
[
"fec81c861b1ec238"
]
]
},
{
"id": "421955f5ceb1cfe4",
"type": "debug",
"z": "5009531429fbeac6",
"name": "Read Sensor Value",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1210,
"y": 100,
"wires": []
},
{
"id": "012e9d20164d4082",
"type": "buffer-parser",
"z": "5009531429fbeac6",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "byte",
"name": "hours",
"offset": 3,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "keyvalue",
"resultTypeType": "return",
"multipleResult": false,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 1010,
"y": 100,
"wires": [
[
"421955f5ceb1cfe4"
]
]
},
{
"id": "d2944b2534c00a16",
"type": "switch",
"z": "5009531429fbeac6",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 510,
"y": 100,
"wires": [
[
"f8ae4884a308f614"
]
]
},
{
"id": "fec81c861b1ec238",
"type": "template",
"z": "5009531429fbeac6",
"name": "Override Time",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": \"0A\",\n \"address\": \"63\",\n \"length\": \"00\"\n}",
"output": "json",
"x": 320,
"y": 100,
"wires": [
[
"d2944b2534c00a16"
]
]
},
{
"id": "cac3eb05cb70d5df",
"type": "buffer-maker",
"z": "5009531429fbeac6",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "15"
},
{
"name": "function",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "64"
},
{
"name": "ack",
"type": "hex",
"length": 2,
"dataType": "str",
"data": "20"
},
{
"name": "page",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.page"
},
{
"name": "address",
"type": "hex",
"length": 2,
"dataType": "msg",
"data": "payload.address"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 690,
"y": 140,
"wires": [
[
"198ef7f13f6a223f"
]
]
},
{
"id": "cca5ae01e951656b",
"type": "inject",
"z": "5009531429fbeac6",
"name": "Read Config",
"props": [],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 130,
"y": 140,
"wires": [
[
"4e3c70a08b8ad5e9"
]
]
},
{
"id": "982ece2c7783d429",
"type": "debug",
"z": "5009531429fbeac6",
"name": "Read Sensor Value",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1210,
"y": 140,
"wires": []
},
{
"id": "8680c965e5bc84ad",
"type": "buffer-parser",
"z": "5009531429fbeac6",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "byte",
"name": "value",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": true,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 1010,
"y": 140,
"wires": [
[
"982ece2c7783d429"
]
]
},
{
"id": "7ce302eeb730a5bb",
"type": "switch",
"z": "5009531429fbeac6",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 510,
"y": 140,
"wires": [
[
"cac3eb05cb70d5df"
]
]
},
{
"id": "4e3c70a08b8ad5e9",
"type": "template",
"z": "5009531429fbeac6",
"name": "Override Minutes",
"field": "payload",
"fieldType": "msg",
"format": "json",
"syntax": "mustache",
"template": "{\n \"page\": \"0A\",\n \"address\": \"59\"\n}",
"output": "json",
"x": 330,
"y": 140,
"wires": [
[
"7ce302eeb730a5bb"
]
]
},
{
"id": "01ae7cfcc1091a64",
"type": "link call",
"z": "5009531429fbeac6",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 850,
"y": 60,
"wires": [
[
"c97e8820e3bd9b3f"
]
]
},
{
"id": "91a3b09cae387053",
"type": "link call",
"z": "5009531429fbeac6",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 850,
"y": 100,
"wires": [
[
"012e9d20164d4082"
]
]
},
{
"id": "198ef7f13f6a223f",
"type": "link call",
"z": "5009531429fbeac6",
"name": "Serial",
"links": [
"15381188ce92036c"
],
"linkType": "static",
"timeout": "15",
"x": 850,
"y": 140,
"wires": [
[
"8680c965e5bc84ad"
]
]
},
{
"id": "8fce8548d604c1a1",
"type": "switch",
"z": "5009531429fbeac6",
"name": "Pump On?",
"property": "pump_on",
"propertyType": "flow",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "num"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 510,
"y": 60,
"wires": [
[
"80d36e7adbe2c06c"
]
]
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment