Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [
- {
- "id": "afd3d04528cf5eb1",
- "type": "group",
- "z": "06d093a44e455a57",
- "name": "AE200 Interface",
- "style": {
- "label": true
- },
- "nodes": [
- "957fcdfcaa073380",
- "23449e4aaa4ad337",
- "bbc90588f0c1632e",
- "e7cc387079689a12",
- "074047158cd41451",
- "d9d4e69475f10ee0",
- "9fcf57953e3cab6f",
- "d4c484521d315266",
- "f2fb06c469c4ae05",
- "bdbf0a8f25f63703",
- "4d45f5bb512d6b93",
- "064bf80f5d0583a9",
- "25406b72b21d984c",
- "a02b673b49a5ca66",
- "f9d1e2a70f2990bd",
- "88e4d9ef86236b0f",
- "ab3d2158cf1feec2",
- "5ab1e0b5fa9ce97d",
- "92080183eec1ef07",
- "908f45f4f3fca18a",
- "9f0b76bb906c9fb1",
- "ff9ea310bc5f7dfe",
- "359efa85d3785f3c",
- "292a2d3678e64bc3",
- "18a0944d01943312",
- "5f2595c6be7136c2",
- "d3c54ccf89aef8c8",
- "aa56d185614cca6f",
- "b1529e96e463ee0e",
- "e2ee675075332f3e",
- "74109a521cf1af56",
- "226482e540b69d27",
- "33d58eeb2d9b2ba9",
- "f190122e9c98fe5c",
- "615866257bf8c479",
- "44616ffc4f3dbc73",
- "290dc8f2945a6a99",
- "546bd26ea31e65ca",
- "c7653e4292c70726",
- "4bd563752b45384c",
- "b704ebbbe4c5e9db"
- ],
- "x": 34,
- "y": 19,
- "w": 1392,
- "h": 562
- },
- {
- "id": "957fcdfcaa073380",
- "type": "websocket in",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "AE-200 Web Socket",
- "server": "",
- "client": "9ee1a86948c818e6",
- "x": 150,
- "y": 260,
- "wires": [
- [
- "074047158cd41451"
- ]
- ]
- },
- {
- "id": "23449e4aaa4ad337",
- "type": "inject",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Hourly",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "3600",
- "crontab": "",
- "once": false,
- "onceDelay": "3",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 140,
- "y": 100,
- "wires": [
- [
- "bbc90588f0c1632e",
- "ff9ea310bc5f7dfe"
- ]
- ]
- },
- {
- "id": "bbc90588f0c1632e",
- "type": "template",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "MnetList",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "plain",
- "template": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<Packet>\n<Command>getRequest</Command>\n<DatabaseManager>\n<ControlGroup>\n<MnetList />\n</ControlGroup>\n</DatabaseManager>\n</Packet>",
- "output": "str",
- "x": 340,
- "y": 100,
- "wires": [
- [
- "e7cc387079689a12"
- ]
- ]
- },
- {
- "id": "e7cc387079689a12",
- "type": "websocket out",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "AE-200 Web Socket",
- "server": "",
- "client": "9ee1a86948c818e6",
- "x": 620,
- "y": 140,
- "wires": []
- },
- {
- "id": "074047158cd41451",
- "type": "xml",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "property": "payload",
- "attr": "",
- "chr": "",
- "x": 330,
- "y": 260,
- "wires": [
- [
- "d9d4e69475f10ee0"
- ]
- ]
- },
- {
- "id": "d9d4e69475f10ee0",
- "type": "switch",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Packet Type",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "jsonata_exp",
- "v": "$exists(payload.Packet.DatabaseManager.ControlGroup.MnetList.MnetRecord)",
- "vt": "jsonata"
- },
- {
- "t": "jsonata_exp",
- "v": "$exists(payload.Packet.DatabaseManager.Mnet)",
- "vt": "jsonata"
- },
- {
- "t": "jsonata_exp",
- "v": "$exists(payload.Packet.DatabaseManager.SystemData)",
- "vt": "jsonata"
- },
- {
- "t": "else"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 4,
- "x": 350,
- "y": 340,
- "wires": [
- [
- "f9d1e2a70f2990bd",
- "615866257bf8c479"
- ],
- [
- "92080183eec1ef07",
- "f190122e9c98fe5c"
- ],
- [
- "18a0944d01943312"
- ],
- [
- "359efa85d3785f3c"
- ]
- ]
- },
- {
- "id": "9fcf57953e3cab6f",
- "type": "mqtt out",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Retain",
- "topic": "",
- "qos": "",
- "retain": "true",
- "respTopic": "",
- "contentType": "",
- "userProps": "",
- "correl": "",
- "expiry": "",
- "broker": "188340c12e25adf5",
- "x": 790,
- "y": 520,
- "wires": []
- },
- {
- "id": "d4c484521d315266",
- "type": "debug",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "debug 94",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 800,
- "y": 460,
- "wires": []
- },
- {
- "id": "f2fb06c469c4ae05",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Climate States",
- "func": "const fanModeMapping = { \"AUTO\": \"Auto\", \"LOW\": \"Low\", \"MID2\": \"Medium L\", \"MID1\": \"Medium H\", \"HIGH\": \"High\"};\nconst swingModeMapping = { \"HORIZONTAL\": \"Horizontal\", \"MID0\": \"Mid 0\", \"MID1\": \"Mid 1\", \"MID2\": \"Mid 2\", \"VERTICAL\": \"Vertical\", \"SWING\": \"Swing\", \"AUTO\": \"Auto\" };\nconst modeMapping = {\"OFF\": \"off\", \"COOL\": \"cool\", \"DRY\": \"dry\", \"FAN\": \"fan_only\", \"HEAT\": \"heat\", \"AUTO\": \"auto\", \"AUTOCOOL\": \"auto\", \"AUTOHEAT\": \"auto\", \"LC_AUTO\": \"Auto\", \"HEATRECOVERY\": \"Heat Recovery\", \"BYPASS\": \"Bypass\"};\n\nlet packet = msg.payload.Packet.DatabaseManager[0].Mnet;\nlet ae200_cache = global.get(\"ae200_cache\");\n\npacket.forEach(item => {\n let record = item.$\n if (!record.hasOwnProperty(\"Group\")) {return;}\n let cache = ae200_cache[record.Group];\n \n var baseTopic = \"ae200/mnet_\" + record.Group;\n\n // If we're dealing with AC power or mode state...\n if (cache.Model == \"IC\" && (record.hasOwnProperty(\"Drive\") || record.hasOwnProperty(\"Mode\"))) {\n\n // Mode status message - compute from drive and mode...\n let powerstate = cache.Drive;\n let modestate = cache.Mode;\n\n // Use latest if present...\n if (record.hasOwnProperty(\"Drive\")) { powerstate = record[\"Drive\"]; }\n if (record.hasOwnProperty(\"Mode\")) { modestate = record[\"Mode\"]; }\n\n if (powerstate != \"ON\") {\n node.send({\n payload: \"off\",\n topic: `${baseTopic}/mode/state`\n });\n } else {\n node.send({\n payload: modeMapping[modestate],\n topic: `${baseTopic}/mode/state`\n });\n }\n\n } else {\n \n // Treat drive and mode seperatley...\n \n if (record.hasOwnProperty(\"Drive\")) {\n node.send({\n payload: record[\"Drive\"],\n topic: `${baseTopic}/power/state`\n });\n }\n \n if (record.hasOwnProperty(\"Mode\")) {\n node.send({\n payload: modeMapping[record[\"Mode\"]],\n topic: `${baseTopic}/mode/state`\n });\n }\n\n }\n \n // Manage temp setpoints based on mode...\n \n switch (cache.Mode) {\n \n case \"AUTO\":\n case \"AUTOHEAT\":\n \n node.send({\n payload: \"None\",\n topic: `${baseTopic}/temperature/state`\n });\n\n node.send({\n //payload: record[\"SetTemp1\"],\n payload: cache.SetTemp1,\n topic: `${baseTopic}/temperature_high/state`\n });\n \n node.send({\n //|payload: record[\"SetTemp2\"],\n payload: cache.SetTemp2,\n topic: `${baseTopic}/temperature_low/state`\n });\n \n break;\n \n case \"HEAT\":\n \n node.send({\n //|payload: record[\"SetTemp2\"],\n payload: cache.SetTemp2,\n topic: `${baseTopic}/temperature/state`\n });\n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature_high/state`\n });\n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature_low/state`\n });\n \n \n break;\n \n case \"COOL\":\n case \"DRY\":\n \n node.send({\n //payload: record[\"SetTemp1\"],\n payload: cache.SetTemp1,\n topic: `${baseTopic}/temperature/state`\n });\n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature_high/state`\n });\n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature_low/state`\n });\n \n break;\n\n default:\n \n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature/state`\n });\n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature_high/state`\n });\n \n node.send({\n payload: null,\n topic: `${baseTopic}/temperature_low/state`\n });\n \n break;\n \n }\n\n // Current temperature message\n if (record.hasOwnProperty(\"InletTemp\")) {\n var currentTemp = record[\"InletTemp\"];\n let currentTempMsg = {\n payload: currentTemp,\n topic: `${baseTopic}/current_temperature`\n };\n node.send(currentTempMsg);\n }\n\n // Fan speed message...\n if (record.hasOwnProperty(\"FanSpeed\")) {\n var fanSpeed = record[\"FanSpeed\"]; \n if (cache.Model == \"LC\") {\n \n // Percentage mapping for Lossnay...\n let fanSpeedMsg = {\n payload: Object.keys(fanModeMapping).indexOf(fanSpeed),\n topic: `${baseTopic}/fan_speed/state`\n };\n node.send(fanSpeedMsg);\n \n } else {\n \n // Level map for AC units...\n\n let mappedFanSpeed = fanModeMapping[fanSpeed];\n let fanSpeedMsg = {\n payload: mappedFanSpeed,\n topic: `${baseTopic}/fan_mode/state`\n };\n node.send(fanSpeedMsg);\n\n }\n }\n\n // Swing mode message\n if (record.hasOwnProperty(\"AirDirection\")) {\n var airDirection = record[\"AirDirection\"];\n let mappedSwingMode = swingModeMapping[airDirection];\n let swingModeMsg = {\n payload: mappedSwingMode,\n topic: `${baseTopic}/swing_mode/state`\n };\n node.send(swingModeMsg);\n }\n \n // Filter sign mode message\n if (record.hasOwnProperty(\"FilterSign\")) {\n let filterSignMsg = {\n payload: record[\"FilterSign\"],\n topic: `${baseTopic}/filter_sign/state`\n };\n node.send(filterSignMsg);\n }\n \n // Error sign mode message\n if (record.hasOwnProperty(\"ErrorSign\")) {\n let errorSignMsg = {\n payload: record[\"ErrorSign\"],\n topic: `${baseTopic}/error_sign/state`\n };\n node.send(errorSignMsg);\n }\n \n});\n\nreturn null;\n",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 460,
- "wires": [
- [
- "d4c484521d315266",
- "9fcf57953e3cab6f"
- ]
- ]
- },
- {
- "id": "bdbf0a8f25f63703",
- "type": "status",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Websocket Status",
- "scope": [
- "957fcdfcaa073380"
- ],
- "x": 850,
- "y": 140,
- "wires": [
- [
- "064bf80f5d0583a9"
- ]
- ]
- },
- {
- "id": "4d45f5bb512d6b93",
- "type": "mqtt in",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "topic": "ae200/+/+/set",
- "qos": "2",
- "datatype": "auto-detect",
- "broker": "188340c12e25adf5",
- "nl": false,
- "rap": true,
- "rh": 0,
- "inputs": 0,
- "x": 130,
- "y": 500,
- "wires": [
- [
- "908f45f4f3fca18a",
- "c7653e4292c70726"
- ]
- ]
- },
- {
- "id": "064bf80f5d0583a9",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Availability",
- "func": "msg.payload = msg.status.fill === \"green\" ? \"online\" : \"offline\";\nmsg.topic = \"ae200/availability\";\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1050,
- "y": 140,
- "wires": [
- [
- "25406b72b21d984c"
- ]
- ]
- },
- {
- "id": "25406b72b21d984c",
- "type": "mqtt out",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Retain",
- "topic": "",
- "qos": "",
- "retain": "true",
- "respTopic": "",
- "contentType": "",
- "userProps": "",
- "correl": "",
- "expiry": "",
- "broker": "188340c12e25adf5",
- "x": 1210,
- "y": 140,
- "wires": []
- },
- {
- "id": "a02b673b49a5ca66",
- "type": "websocket out",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "AE-200 Web Socket",
- "server": "",
- "client": "9ee1a86948c818e6",
- "x": 840,
- "y": 340,
- "wires": []
- },
- {
- "id": "f9d1e2a70f2990bd",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Status Request",
- "func": "var mnetRecords = msg.payload.Packet.DatabaseManager[0].ControlGroup[0].MnetList[0].MnetRecord;\n\nvar xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\\n';\nxml += '<Packet>\\n';\nxml += ' <Command>getRequest</Command>\\n';\nxml += ' <DatabaseManager>\\n';\n\nfor (var i = 0; i < mnetRecords.length; i++) {\n var record = mnetRecords[i];\n var group = record[\"$\"][\"Group\"];\n\n // Full known set of states...\n //xml += '<Mnet Group=\"' + group + '\" Drive=\"*\" Vent24h=\"*\" Mode=\"*\" VentMode=\"*\" ModeStatus=\"*\" SetTemp=\"*\" SetTemp1=\"*\" SetTemp2=\"*\" SetTemp3=\"*\" SetTemp4=\"*\" SetTemp5=\"*\" SetHumidity=\"*\" InletTemp=\"*\" InletHumidity=\"*\" AirDirection=\"*\" FanSpeed=\"*\" RemoCon=\"*\" DriveItem=\"*\" ModeItem=\"*\" SetTempItem=\"*\" FilterItem=\"*\" AirDirItem=\"*\" FanSpeedItem=\"*\" TimerItem=\"*\" CheckWaterItem=\"*\" FilterSign=\"*\" Hold=\"*\" EnergyControl=\"*\" EnergyControlIC=\"*\" SetbackControl=\"*\" Ventilation=\"*\" VentiDrive=\"*\" VentiFan=\"*\" Schedule=\"*\" ScheduleAvail=\"*\" ErrorSign=\"*\" CheckWater=\"*\" TempLimitCool=\"*\" TempLimitHeat=\"*\" TempLimit=\"*\" CoolMin=\"*\" CoolMax=\"*\" HeatMin=\"*\" HeatMax=\"*\" AutoMin=\"*\" AutoMax=\"*\" TurnOff=\"*\" MaxSaveValue=\"*\" RoomHumidity=\"*\" Brightness=\"*\" Occupancy=\"*\" NightPurge=\"*\" Humid=\"*\" Vent24hMode=\"*\" SnowFanMode=\"*\" InletTempHWHP=\"*\" OutletTempHWHP=\"*\" HeadTempHWHP=\"*\" OutdoorTemp=\"*\" BrineTemp=\"*\" HeadInletTempCH=\"*\" BACnetTurnOff=\"*\" AISmartStart=\"*\" Model=\"*\" SubModel=\"*\" GroupType=\"*\" IcKind=\"*\" AutoModeSW=\"*\" AutoModeSWEx=\"*\" DryModeSW=\"*\" FanModeSW=\"*\" SetbackModeSW=\"*\" FanSpeedSW=\"*\" FanAutoSW=\"*\" FanExLowSW=\"*\" AirDirectionSW=\"*\" AirStageSW=\"*\" AirAutoSW=\"*\" SwingSW=\"*\" VentilationSW=\"*\" BypassSW=\"*\" LcAutoSW=\"*\" HeatRecoverySW=\"*\" MidTempSW=\"*\" LowTempSW=\"*\" HeatingSW=\"*\" HeatingEcoSW=\"*\" HotWaterSW=\"*\" AntiFreezeSW=\"*\" CoolingSW=\"*\" TempRange1Low1=\"*\" TempRange1High1=\"*\" TempRange1Low2=\"*\" TempRange1High2=\"*\" TempRange1Low3=\"*\" TempRange1High3=\"*\" TempRange1Low4=\"*\" TempRange1High4=\"*\" TempRange1Low5=\"*\" TempRange1High5=\"*\" Deadband=\"*\" TempDetail=\"*\" TempDetailC=\"*\" TempDetail_C=\"*\" HumiditySW=\"*\" HoldSW=\"*\" ProhibitSW=\"*\" NightPurgeSW=\"*\" Vent24hSW=\"*\" HumidSW=\"*\" HumidAutoSW=\"*\" FanExHighSW=\"*\" HumidOffSW=\"*\" FanHumidSW=\"*\" CoolHumidSW=\"*\" AISmartStartSW=\"*\" RemoConProhibitSW=\"*\" />\\n';\n\n // Currently needed...\n xml += '<Mnet Group=\"' + group + '\" Drive=\"*\" Mode=\"*\" SetTemp1=\"*\" SetTemp2=\"*\" InletTemp=\"*\" AirDirection=\"*\" FanSpeed=\"*\" FilterSign=\"*\" Schedule=\"*\" ErrorSign=\"*\" Model=\"*\" />\\n' \n \n}\n\nxml += ' </DatabaseManager>\\n';\nxml += '</Packet>\\n';\n\nmsg = {payload: xml}\n\nreturn msg;",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 600,
- "y": 340,
- "wires": [
- [
- "a02b673b49a5ca66"
- ]
- ]
- },
- {
- "id": "88e4d9ef86236b0f",
- "type": "inject",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": false,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 1140,
- "y": 400,
- "wires": [
- [
- "ab3d2158cf1feec2"
- ]
- ]
- },
- {
- "id": "ab3d2158cf1feec2",
- "type": "change",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Get Cache",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "ae200_cache",
- "tot": "global"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1150,
- "y": 440,
- "wires": [
- [
- "5ab1e0b5fa9ce97d"
- ]
- ]
- },
- {
- "id": "5ab1e0b5fa9ce97d",
- "type": "debug",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "debug 98",
- "active": true,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 1140,
- "y": 480,
- "wires": []
- },
- {
- "id": "92080183eec1ef07",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Raw States",
- "func": "\n// We need to update the raw states into the cache first\n// because some of the climate states are inter-dependant\n// other sates (e.g. temp high/low setpoint based on mode).\n\n// If there's no global cache yet, we can stop...\nif (typeof global.get(\"ae200_cache\") !== \"object\") {\n return null;\n}\n\n//const keysToInclude = [\"Drive\", \"Vent24h\", \"Mode\", \"VentMode\", \"ModeStatus\", \"SetTemp\", \"SetTemp1\", \"SetTemp2\", \"SetTemp3\", \"SetTemp4\", \"SetTemp5\", \"SetHumidity\", \"InletTemp\", \"InletHumidity\", \"AirDirection\", \"FanSpeed\", \"RemoCon\", \"DriveItem\", \"ModeItem\", \"SetTempItem\", \"FilterItem\", \"AirDirItem\", \"FanSpeedItem\", \"TimerItem\", \"CheckWaterItem\", \"FilterSign\", \"Hold\", \"EnergyControl\", \"EnergyControlIC\", \"SetbackControl\", \"Ventilation\", \"VentiDrive\", \"VentiFan\", \"Schedule\", \"ScheduleAvail\", \"ErrorSign\", \"CheckWater\", \"TempLimitCool\", \"TempLimitHeat\", \"TempLimit\", \"CoolMin\", \"CoolMax\", \"HeatMin\", \"HeatMax\", \"AutoMin\", \"AutoMax\", \"TurnOff\", \"MaxSaveValue\", \"RoomHumidity\", \"Brightness\", \"Occupancy\", \"NightPurge\", \"Humid\", \"Vent24hMode\", \"SnowFanMode\", \"InletTempHWHP\", \"OutletTempHWHP\", \"HeadTempHWHP\", \"OutdoorTemp\", \"BrineTemp\", \"HeadInletTempCH\", \"BACnetTurnOff\", \"AISmartStart\", \"Model\", \"SubModel\", \"GroupType\", \"IcKind\", \"AutoModeSW\", \"AutoModeSWEx\", \"DryModeSW\", \"FanModeSW\", \"SetbackModeSW\", \"FanSpeedSW\", \"FanAutoSW\", \"FanExLowSW\", \"AirDirectionSW\", \"AirStageSW\", \"AirAutoSW\", \"SwingSW\", \"VentilationSW\", \"BypassSW\", \"LcAutoSW\", \"HeatRecoverySW\", \"MidTempSW\", \"LowTempSW\", \"HeatingSW\", \"HeatingEcoSW\", \"HotWaterSW\", \"AntiFreezeSW\", \"CoolingSW\", \"TempRange1Low1\", \"TempRange1High1\", \"TempRange1Low2\", \"TempRange1High2\", \"TempRange1Low3\", \"TempRange1High3\", \"TempRange1Low4\", \"TempRange1High4\", \"TempRange1Low5\", \"TempRange1High5\", \"Deadband\", \"TempDetail\", \"TempDetailC\", \"TempDetail_C\", \"HumiditySW\", \"HoldSW\", \"ProhibitSW\", \"NightPurgeSW\", \"Vent24hSW\", \"HumidSW\", \"HumidAutoSW\", \"FanExHighSW\", \"HumidOffSW\", \"FanHumidSW\", \"CoolHumidSW\", \"AISmartStartSW\", \"RemoConProhibitSW\"];\nconst keysToInclude = [\"Drive\", \"Mode\", \"VentMode\", \"SetTemp1\", \"SetTemp2\", \"InletTemp\", \"AirDirection\", \"FanSpeed\", \"FilterSign\", \"Schedule\", \"ErrorSign\", \"Model\"];\n\nlet packet = msg.payload.Packet.DatabaseManager[0].Mnet;\nlet ae200_cache = global.get(\"ae200_cache\");\nconst baseTopic = \"ae200/mnet_\";\n\npacket.forEach(item => {\n let record = item.$\n let groupId = record.Group\n \n if (!ae200_cache[groupId]) {\n ae200_cache[groupId] = {};\n }\n\n for (let state in record) {\n if (state !== \"Group\" && keysToInclude.includes(state)) {\n \n // Set the cache state...\n ae200_cache[groupId][state] = record[state];\n \n // Send raw MQTT packet if we want it...\n node.send([{\n topic: `${baseTopic}${groupId}/${state}`,\n payload: record[state]\n }, null]);\n \n }\n }\n\n});\n\n// Save cache changes...\nglobal.set(\"ae200_cache\", ae200_cache);\n\n// Pass on the message...\nreturn [null, msg];\n",
- "outputs": 2,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 590,
- "y": 400,
- "wires": [
- [
- "546bd26ea31e65ca"
- ],
- [
- "f2fb06c469c4ae05",
- "d4c484521d315266"
- ]
- ]
- },
- {
- "id": "908f45f4f3fca18a",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Set Climate",
- "func": "const fanModeMapping = { \"Auto\": \"AUTO\", \"Low\": \"LOW\", \"Medium L\": \"MID2\", \"Medium H\": \"MID1\", \"High\": \"HIGH\"};\nconst swingModeMapping = { \"Horizontal\": \"HORIZONTAL\", \"Mid 0\": \"MID0\", \"Mid 1\": \"MID1\", \"Mid 2\": \"MID2\", \"Vertical\": \"VERTICAL\", \"Swing\": \"SWING\", \"Auto\": \"AUTO\" };\nconst modeMapping = { \"off\": \"OFF\", \"cool\": \"COOL\", \"dry\": \"DRY\", \"fan_only\": \"FAN\", \"heat\": \"HEAT\", \"auto\": \"AUTO\", \"lc_auto\": \"LC_AUTO\", \"Heat Recovery\": \"HEATRECOVERY\", \"Bypass\": \"BYPASS\"};\n\nvar groupId = msg.topic.match(/mnet_(\\d+)/)[1];\nvar topicParts = msg.topic.split('/');\nvar state_type = topicParts[topicParts.length - 2];\n\nlet ae200_cache = global.get(\"ae200_cache\");\nlet cache = ae200_cache[groupId];\n\nvar keyName;\nvar value = msg.payload;\nvar setDrive = null;\n\nswitch (state_type) {\n case \"power\":\n keyName = \"Drive\";\n break;\n \n case \"mode\":\n if (value === \"off\") {\n keyName = \"Drive\";\n value = \"OFF\";\n } else if (value === \"on\") {\n keyName = \"Mode\";\n value = modeMapping[value];\n setDrive = \"ON\";\n } else {\n keyName = \"Mode\";\n if (cache.Model == \"LC\" && value == \"Auto\") {value = \"lc_auto\";}\n if (cache.Model == \"IC\") {setDrive = \"ON\";}\n value = modeMapping[value];\n }\n break;\n \n case \"swing_mode\":\n keyName = \"AirDirection\";\n value = swingModeMapping[value];\n break;\n \n case \"fan_mode\":\n keyName = \"FanSpeed\";\n value = fanModeMapping[value];\n break;\n \n case \"fan_speed\":\n if (value == 0) {\n // Power off?\n keyName = \"Drive\";\n value = \"OFF\";\n } else {\n keyName = \"FanSpeed\";\n value = Object.values(fanModeMapping)[value];\n setDrive = \"ON\";\n }\n break;\n \n case \"temperature\":\n \n switch (cache.Mode)\n {\n \n case \"HEAT\":\n keyName = \"SetTemp2\";\n break;\n \n case \"COOL\":\n case \"DRY\":\n keyName = \"SetTemp1\";\n break;\n \n default:\n node.error(\"Unable to update setpoint.\");\n break;\n \n } \n\n break;\n \n case \"temperature_low\":\n keyName = \"SetTemp2\";\n break;\n \n case \"temperature_high\":\n keyName = \"SetTemp1\";\n break;\n \n default:\n node.error(\"Set type not handled.\");\n break;\n \n}\n\nif (!keyName) {\n return null;\n}\n\n// Construct the XML string\nvar xmlString = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' +\n '<Packet>\\n' +\n ' <Command>setResponse</Command>\\n' +\n ' <DatabaseManager>\\n' +\n ' <Mnet Group=\"' + groupId + '\" ' + keyName + '=\"' + value + '\"';\nif (setDrive !== null) {\n xmlString += ' Drive=\"' + setDrive + '\"';\n}\nxmlString += ' />\\n' +\n ' </DatabaseManager>\\n' +\n '</Packet>';\n\n// Set the constructed XML string as the new payload\nmsg.payload = xmlString;\n\n// Return the message object\nreturn msg;\n",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 310,
- "y": 500,
- "wires": [
- [
- "9f0b76bb906c9fb1",
- "c7653e4292c70726"
- ]
- ]
- },
- {
- "id": "9f0b76bb906c9fb1",
- "type": "websocket out",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "AE-200 Web Socket",
- "server": "",
- "client": "9ee1a86948c818e6",
- "x": 340,
- "y": 540,
- "wires": []
- },
- {
- "id": "ff9ea310bc5f7dfe",
- "type": "template",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "MnetStatus",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "plain",
- "template": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<Packet>\n<Command>getRequest</Command>\n<DatabaseManager>\n<SystemData MnetStatus=\"*\" />\n</DatabaseManager>\n</Packet>",
- "output": "str",
- "x": 350,
- "y": 140,
- "wires": [
- [
- "e7cc387079689a12"
- ]
- ]
- },
- {
- "id": "359efa85d3785f3c",
- "type": "debug",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "debug 101",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 350,
- "y": 420,
- "wires": []
- },
- {
- "id": "292a2d3678e64bc3",
- "type": "inject",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Keep Alive",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "60",
- "crontab": "",
- "once": false,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 150,
- "y": 140,
- "wires": [
- [
- "ff9ea310bc5f7dfe"
- ]
- ]
- },
- {
- "id": "18a0944d01943312",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Status Check",
- "func": "\nif (msg.payload.Packet.DatabaseManager[0].SystemData[0].$.MnetStatus == \"NORMAL\") {\n msg.payload = \"online\";\n msg.topic = \"ae200/availability\";\n return msg; \n} else {\n return null;\n}",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 590,
- "y": 520,
- "wires": [
- [
- "9fcf57953e3cab6f"
- ]
- ]
- },
- {
- "id": "5f2595c6be7136c2",
- "type": "template",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "AlarmStatusList",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "plain",
- "template": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<Packet>\n<Command>getRequest</Command>\n<DatabaseManager>\n<Mnet>\n<AlarmStatusList />\n</Mnet>\n</DatabaseManager>\n</Packet>",
- "output": "str",
- "x": 360,
- "y": 180,
- "wires": [
- [
- "e7cc387079689a12"
- ]
- ]
- },
- {
- "id": "d3c54ccf89aef8c8",
- "type": "inject",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": false,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 140,
- "y": 180,
- "wires": [
- [
- "5f2595c6be7136c2"
- ]
- ]
- },
- {
- "id": "aa56d185614cca6f",
- "type": "join",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "mode": "custom",
- "build": "object",
- "property": "payload",
- "propertyType": "msg",
- "key": "topic",
- "joiner": "\\n",
- "joinerType": "str",
- "useparts": false,
- "accumulate": false,
- "timeout": "",
- "count": "2",
- "reduceRight": false,
- "reduceExp": "",
- "reduceInit": "",
- "reduceInitType": "num",
- "reduceFixup": "",
- "x": 990,
- "y": 240,
- "wires": [
- [
- "226482e540b69d27"
- ]
- ]
- },
- {
- "id": "b1529e96e463ee0e",
- "type": "change",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "payload.Packet.DatabaseManager[0].ControlGroup[0].MnetList[0].MnetRecord",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "topic",
- "pt": "msg",
- "to": "devices",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 800,
- "y": 240,
- "wires": [
- [
- "aa56d185614cca6f"
- ]
- ]
- },
- {
- "id": "e2ee675075332f3e",
- "type": "change",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "payload.Packet.DatabaseManager[0].Mnet",
- "tot": "msg"
- },
- {
- "t": "set",
- "p": "topic",
- "pt": "msg",
- "to": "states",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 800,
- "y": 280,
- "wires": [
- [
- "aa56d185614cca6f"
- ]
- ]
- },
- {
- "id": "74109a521cf1af56",
- "type": "debug",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "debug 1",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 1320,
- "y": 240,
- "wires": []
- },
- {
- "id": "226482e540b69d27",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Combine",
- "func": "// Input data (from msg.payload)\nlet devices = msg.payload.devices;\nlet states = msg.payload.states;\n\n// Create an empty object to store the grouped data\nlet groupedData = {};\n\n// Iterate over devices to build the group structure\ndevices.forEach(device => {\n let groupId = device.$.Group;\n if (!groupedData[groupId]) {\n // Initialize the group with the Group and GroupNameWeb\n groupedData[groupId] = {\n Group: groupId,\n GroupNameWeb: device.$.GroupNameWeb\n };\n }\n});\n\n// Iterate over states and add unique state keys to the relevant group\nstates.forEach(state => {\n let groupId = state.$.Group;\n if (groupedData[groupId]) {\n Object.keys(state.$).forEach(key => {\n // Ignore already existing keys (i.e., duplicate keys)\n if (!groupedData[groupId][key]) {\n groupedData[groupId][key] = state.$[key];\n }\n });\n }\n});\n\n// Return the grouped data as an object with groupId as the key\nmsg.payload = groupedData;\nreturn msg;\n",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1140,
- "y": 240,
- "wires": [
- [
- "33d58eeb2d9b2ba9"
- ]
- ]
- },
- {
- "id": "33d58eeb2d9b2ba9",
- "type": "change",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "ae200_cache",
- "pt": "global",
- "to": "payload",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1190,
- "y": 280,
- "wires": [
- [
- "74109a521cf1af56",
- "44616ffc4f3dbc73"
- ]
- ]
- },
- {
- "id": "f190122e9c98fe5c",
- "type": "switch",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "property": "payload.Packet.DatabaseManager[0].Mnet[0].$.Model",
- "propertyType": "msg",
- "rules": [
- {
- "t": "nempty"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 1,
- "x": 570,
- "y": 280,
- "wires": [
- [
- "e2ee675075332f3e"
- ]
- ]
- },
- {
- "id": "615866257bf8c479",
- "type": "switch",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "",
- "property": "payload.Packet.DatabaseManager[0].ControlGroup[0].MnetList[0].MnetRecord[0].$.GroupNameWeb",
- "propertyType": "msg",
- "rules": [
- {
- "t": "nempty"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 1,
- "x": 570,
- "y": 240,
- "wires": [
- [
- "b1529e96e463ee0e"
- ]
- ]
- },
- {
- "id": "44616ffc4f3dbc73",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Discovery Packets",
- "func": "\n// Define the device information once\nvar ha_device = {\n identifiers: [\"AE200_Controller\"],\n manufacturer: \"Mitsubishi\",\n name: \"AE-200\",\n model: \"AE-200\"\n};\n\nlet ae200_cache = global.get(\"ae200_cache\");\n\nObject.entries(ae200_cache).forEach(([group, device]) => {\n\n var name = device.GroupNameWeb;\n var uniqueId = \"mnet_\" + group;\n var baseTopic = `ae200/${uniqueId}`;\n\n // Create base discovery message with common properties\n let configMsg = {\n payload: {\n name: name,\n object_id: uniqueId,\n device: ha_device,\n availability_topic: \"ae200/availability\",\n payload_available: \"online\",\n payload_not_available: \"offline\",\n unique_id: uniqueId,\n platform: \"mqtt\" // Adjusted inside conditionals if needed\n },\n topic: \"\" // Adjusted later based on model\n };\n \n if (device.Model === \"IC\") {\n \n // AC Unit (climate entity)\n Object.assign(configMsg.payload, {\n modes: [\"off\", \"cool\", \"dry\", \"fan_only\", \"heat\", \"auto\"],\n mode_command_topic: `${baseTopic}/mode/set`,\n mode_state_topic: `${baseTopic}/mode/state`,\n \n temperature_state_topic: `${baseTopic}/temperature/state`,\n temperature_command_topic: `${baseTopic}/temperature/set`,\n temperature_high_state_topic: `${baseTopic}/temperature_high/state`,\n temperature_high_command_topic: `${baseTopic}/temperature_high/set`,\n temperature_low_state_topic: `${baseTopic}/temperature_low/state`,\n temperature_low_command_topic: `${baseTopic}/temperature_low/set`,\n current_temperature_topic: `${baseTopic}/current_temperature`,\n \n fan_mode_state_topic: `${baseTopic}/fan_mode/state`,\n fan_mode_command_topic: `${baseTopic}/fan_mode/set`,\n fan_modes: [\"Auto\", \"Low\", \"Medium L\", \"Medium H\", \"High\"],\n \n swing_mode_state_topic: `${baseTopic}/swing_mode/state`,\n swing_mode_command_topic: `${baseTopic}/swing_mode/set`,\n swing_modes: [\"Horizontal\", \"Mid 0\", \"Mid 1\", \"Mid 2\", \"Vertical\", \"Swing\", \"Auto\"],\n \n min_temp: 14,\n max_temp: 26,\n temp_step: 0.5,\n temperature_unit: \"C\",\n //platform: \"mqtt\"\n });\n \n configMsg.topic = `homeassistant/climate/${uniqueId}/config`;\n \n } else if (device.Model === \"LC\") {\n \n // Lossnay Unit (fan entity)\n Object.assign(configMsg.payload, {\n state_topic: `${baseTopic}/power/state`,\n command_topic: `${baseTopic}/power/set`,\n\n percentage_state_topic : `${baseTopic}/fan_speed/state`,\n percentage_command_topic : `${baseTopic}/fan_speed/set`,\n speed_range_min: 1,\n speed_range_max: 4,\n //fan_modes: [\"LOW\", \"MID2\", \"MID1\", \"HIGH\"],\n \n preset_mode_state_topic: `${baseTopic}/mode/state`,\n preset_mode_command_topic: `${baseTopic}/mode/set`,\n preset_modes : [\"Auto\", \"Heat Recovery\", \"Bypass\"],\n //platform: \"fan\"\n });\n \n configMsg.topic = `homeassistant/fan/${uniqueId}/config`;\n \n }\n \n // Output the configuration message\n configMsg.payload = JSON.stringify(configMsg.payload);\n node.send([configMsg, null]);\n \n // Now let's add a filter sign for this...\n if (device.Model === \"IC\") {\n \n let filterMsg = {\n payload: {\n name: name + \" Filter\",\n object_id: uniqueId + \"_filter\",\n device: ha_device,\n availability_topic: \"ae200/availability\",\n payload_available: \"online\",\n payload_not_available: \"offline\",\n unique_id: uniqueId + \"_filter\",\n state_topic: `${baseTopic}/filter_sign/state`,\n payload_on: \"ON\",\n payload_off: \"OFF\",\n device_class: \"problem\",\n icon: \"mdi:air-filter\",\n },\n topic: `homeassistant/binary_sensor/${uniqueId}/filter_sign/config`\n };\n \n // Output the configuration message\n filterMsg.payload = JSON.stringify(filterMsg.payload);\n node.send([filterMsg, null]);\n \n }\n \n // And finally, and error sign...\n let errorMsg = {\n payload: {\n name: name + \" Error\",\n object_id: uniqueId + \"_error\",\n device: ha_device,\n availability_topic: \"ae200/availability\",\n payload_available: \"online\",\n payload_not_available: \"offline\",\n unique_id: uniqueId + \"_error\",\n state_topic: `${baseTopic}/error_sign/state`,\n payload_on: \"ON\",\n payload_off: \"OFF\",\n device_class: \"problem\", // Marks as a problem in HA\n icon: \"mdi:alert-circle-outline\",\n },\n topic: `homeassistant/binary_sensor/${uniqueId}/error_sign/config`\n };\n\n\n // Output the configuration message\n errorMsg.payload = JSON.stringify(errorMsg.payload);\n node.send([errorMsg, null]);\n \n \n});\n\nreturn null;\n",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1170,
- "y": 320,
- "wires": [
- [
- "290dc8f2945a6a99",
- "74109a521cf1af56"
- ]
- ]
- },
- {
- "id": "290dc8f2945a6a99",
- "type": "mqtt out",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Retain",
- "topic": "",
- "qos": "",
- "retain": "true",
- "respTopic": "",
- "contentType": "",
- "userProps": "",
- "correl": "",
- "expiry": "",
- "broker": "188340c12e25adf5",
- "x": 1350,
- "y": 320,
- "wires": []
- },
- {
- "id": "546bd26ea31e65ca",
- "type": "debug",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "debug 99",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 800,
- "y": 400,
- "wires": []
- },
- {
- "id": "c7653e4292c70726",
- "type": "debug",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "debug 3",
- "active": false,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "false",
- "statusVal": "",
- "statusType": "auto",
- "x": 300,
- "y": 460,
- "wires": []
- },
- {
- "id": "4bd563752b45384c",
- "type": "function",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Cache Empty?",
- "func": "if (typeof global.get(\"ae200_cache\") !== \"object\") {\n return msg;\n} else {\n return null;\n}",
- "outputs": 1,
- "timeout": 0,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 360,
- "y": 60,
- "wires": [
- [
- "bbc90588f0c1632e"
- ]
- ]
- },
- {
- "id": "b704ebbbe4c5e9db",
- "type": "inject",
- "z": "06d093a44e455a57",
- "g": "afd3d04528cf5eb1",
- "name": "Startup",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "2",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 140,
- "y": 60,
- "wires": [
- [
- "4bd563752b45384c"
- ]
- ]
- },
- {
- "id": "9ee1a86948c818e6",
- "type": "websocket-client",
- "path": "ws://10.10.0.15/b_xmlproc/",
- "tls": "",
- "wholemsg": "false",
- "hb": "30",
- "subprotocol": "b_xmlproc",
- "headers": [
- {
- "keyType": "other",
- "keyValue": "Origin",
- "valueType": "other",
- "valueValue": "null"
- }
- ]
- },
- {
- "id": "188340c12e25adf5",
- "type": "mqtt-broker",
- "name": "TC MQTT",
- "broker": "10.10.0.45",
- "port": "1883",
- "clientid": "",
- "autoConnect": true,
- "usetls": false,
- "protocolVersion": "4",
- "keepalive": "60",
- "cleansession": true,
- "autoUnsubscribe": true,
- "birthTopic": "",
- "birthQos": "0",
- "birthPayload": "",
- "birthMsg": {},
- "closeTopic": "",
- "closeQos": "0",
- "closePayload": "",
- "closeMsg": {},
- "willTopic": "",
- "willQos": "0",
- "willPayload": "",
- "willMsg": {},
- "userProps": "",
- "sessionExpiry": ""
- }
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement