[
  {
    "id": "e988a544ca1bcd59",
    "type": "group",
    "style": {
      "stroke": "#999999",
      "stroke-opacity": "1",
      "fill": "none",
      "fill-opacity": "1",
      "label": true,
      "label-position": "nw",
      "color": "#a4a4a4"
    },
    "nodes": [
      "ab51209bc227d8ba",
      "c6671fdfd583c842",
      "d914a931f597e03a",
      "c293b10f2fa61e41",
      "a5df4f28682253a4",
      "ef9b9c058cf08342",
      "d0198e771d752f49",
      "84b27644e2072972",
      "2cc8d6c2c0fe59cd",
      "94a4fc2b5a549962",
      "335964fbf764e0b3",
      "01c708ba2abb991f",
      "208cb8e3927a60d4",
      "a223fa3cbd762616",
      "941678853c6bb991",
      "3e83ce2b3df8a6aa",
      "a21af985c049c499",
      "27da5daa457e18cd",
      "d6487a2507e0b51d",
      "e8b16a2ac2dd88b1",
      "c9fdf846a34d6657",
      "dd16944cf0ce94e7",
      "1aa618e11e8c180e",
      "e8e6d4bbfbf4a29b",
      "1fee2ca2b3e2205c",
      "8f520588acceaaa9",
      "d56f7fdb7c733ae9"
    ],
    "x": 24,
    "y": 4529,
    "w": 1152,
    "h": 632
  },
  {
    "id": "ab51209bc227d8ba",
    "type": "widget-AirConditioning",
    "g": "e988a544ca1bcd59",
    "dropdownRoom": "",
    "dropdownCategory": "",
    "dropdownWidget": "",
    "displayName": "Air Conditioning (set device)",
    "x": 570,
    "y": 4820,
    "wires": [
      [
        "a223fa3cbd762616"
      ],
      [
        "941678853c6bb991"
      ],
      [
        "3e83ce2b3df8a6aa"
      ],
      [
        "a21af985c049c499"
      ],
      [
        "27da5daa457e18cd"
      ],
      [
        "d6487a2507e0b51d"
      ],
      [
        "e8b16a2ac2dd88b1"
      ],
      [
        "c9fdf846a34d6657"
      ],
      [
        "dd16944cf0ce94e7"
      ],
      [
        "1aa618e11e8c180e"
      ],
      [
        "e8e6d4bbfbf4a29b"
      ]
    ]
  },
  {
    "id": "c6671fdfd583c842",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "AC ON",
    "props": [
      {
        "p": "inputTarget",
        "v": "On/Off",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 130,
    "y": 4640,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "d914a931f597e03a",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "AC OFF",
    "props": [
      {
        "p": "inputTarget",
        "v": "On/Off",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "false",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 140,
    "y": 4680,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "c293b10f2fa61e41",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Heating Mode",
    "props": [
      {
        "p": "inputTarget",
        "v": "Heating Mode",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 150,
    "y": 4720,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "a5df4f28682253a4",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Cooling Mode",
    "props": [
      {
        "p": "inputTarget",
        "v": "Cooling Mode",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 150,
    "y": 4760,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "ef9b9c058cf08342",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Auto Mode",
    "props": [
      {
        "p": "inputTarget",
        "v": "Auto Mode",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 140,
    "y": 4800,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "d0198e771d752f49",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Set 22°C",
    "props": [
      {
        "p": "inputTarget",
        "v": "Setpoint",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "22",
        "vt": "num"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 140,
    "y": 4840,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "84b27644e2072972",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Temperature 25°C (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "Temperature",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "25",
        "vt": "num"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 200,
    "y": 4880,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "2cc8d6c2c0fe59cd",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "On/Off Feedback (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "On/Off feedback",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 200,
    "y": 4920,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "94a4fc2b5a549962",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Heating Feedback (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "Heating feedback",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 200,
    "y": 4960,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "335964fbf764e0b3",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Cooling Feedback (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "Cooling feedback",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 200,
    "y": 5000,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "01c708ba2abb991f",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Auto Feedback (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "Auto feedback",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "true",
        "vt": "bool"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 190,
    "y": 5080,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "208cb8e3927a60d4",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Setpoint Feedback (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "Actual setpoint",
        "vt": "str"
      },
      {
        "p": "payload",
        "v": "22",
        "vt": "num"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 200,
    "y": 5120,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "a223fa3cbd762616",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "1 · On/Off (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 970,
    "y": 4650,
    "wires": []
  },
  {
    "id": "941678853c6bb991",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "2 · On/Off Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 1000,
    "y": 4690,
    "wires": []
  },
  {
    "id": "3e83ce2b3df8a6aa",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "3 · Heating Mode (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 990,
    "y": 4730,
    "wires": []
  },
  {
    "id": "a21af985c049c499",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "4 · Heating Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 1010,
    "y": 4770,
    "wires": []
  },
  {
    "id": "27da5daa457e18cd",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "5 · Cooling Mode (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 990,
    "y": 4810,
    "wires": []
  },
  {
    "id": "d6487a2507e0b51d",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "6 · Cooling Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 1010,
    "y": 4850,
    "wires": []
  },
  {
    "id": "e8b16a2ac2dd88b1",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "7 · Auto Mode (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 970,
    "y": 4890,
    "wires": []
  },
  {
    "id": "c9fdf846a34d6657",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "8 · Auto Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 990,
    "y": 4930,
    "wires": []
  },
  {
    "id": "dd16944cf0ce94e7",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "9 · Setpoint (float)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 970,
    "y": 4970,
    "wires": []
  },
  {
    "id": "1aa618e11e8c180e",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "10 · Actual Setpoint (float)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 1010,
    "y": 5010,
    "wires": []
  },
  {
    "id": "e8e6d4bbfbf4a29b",
    "type": "debug",
    "g": "e988a544ca1bcd59",
    "name": "11 · Temperature (float)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 1000,
    "y": 5050,
    "wires": []
  },
  {
    "id": "1fee2ca2b3e2205c",
    "type": "function",
    "g": "e988a544ca1bcd59",
    "name": "AC Schedule: Cool->Heat->Auto",
    "func": "// AC Schedule: Turn on, Cool mode, then Heat mode, then Auto\nlet schedule = [\n    { inputTarget: \"On/Off\", payload: true, delay: 0 },\n    { inputTarget: \"Cooling Mode\", payload: true, delay: 2000 },\n    { inputTarget: \"Setpoint\", payload: 20, delay: 3000 },\n    { inputTarget: \"Heating Mode\", payload: true, delay: 6000 },\n    { inputTarget: \"Setpoint\", payload: 24, delay: 7000 },\n    { inputTarget: \"Auto Mode\", payload: true, delay: 10000 },\n    { inputTarget: \"Setpoint\", payload: 22, delay: 11000 }\n];\n\nnode.status({\n    fill: \"blue\",\n    shape: \"dot\", \n    text: \"❄️🔥 Running AC Schedule\"\n});\n\n// Send each message with delay\nschedule.forEach((msg, index) => {\n    setTimeout(() => {\n        node.send(msg);\n        if (index === schedule.length - 1) {\n            node.status({\n                fill: \"green\",\n                shape: \"dot\", \n                text: \"✅ Schedule Complete\"\n            });\n        }\n    }, msg.delay);\n});\n\nreturn null;",
    "outputs": 1,
    "timeout": 0,
    "noerr": 0,
    "initialize": "",
    "finalize": "",
    "libs": [],
    "x": 430,
    "y": 5050,
    "wires": [
      [
        "ab51209bc227d8ba"
      ]
    ]
  },
  {
    "id": "8f520588acceaaa9",
    "type": "inject",
    "g": "e988a544ca1bcd59",
    "name": "Run AC Schedule",
    "props": [],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 160,
    "y": 5040,
    "wires": [
      [
        "1fee2ca2b3e2205c"
      ]
    ]
  },
  {
    "id": "d56f7fdb7c733ae9",
    "type": "comment",
    "g": "e988a544ca1bcd59",
    "name": "Communication Air Conditioning System",
    "info": "## Air Conditioning node\nDevice: double-click the device node and choose the device of your installation, then Deploy.\n\n### Input targets\n- `On/Off`, `Heating Mode`, `Cooling Mode`, `Auto Mode` — commands, true / false\n- `Setpoint` — command, °C\n- `On/Off feedback`, `Heating feedback`, `Cooling feedback`, `Auto feedback` — feedback, true / false\n- `Actual setpoint`, `Temperature` — feedback, °C\n\n### Outputs\n1. On/Off · 2. On/Off feedback · 3. Heating Mode · 4. Heating feedback · 5. Cooling Mode · 6. Cooling feedback · 7. Auto Mode · 8. Auto feedback · 9. Setpoint · 10. Actual setpoint · 11. Temperature\n\n### Rules (node-red-cgen-widget-nodes 1.15)\n- `msg.inputTarget` must match a name above exactly (case-sensitive). Use an **Input Target** node to pick it from a list. A message with a missing or unknown target is ignored.\n- A message from the flow is sent to the server and also leaves on the output of the same name.\n- Outputs also fire when the device changes elsewhere: a **command** output when the app, a scenario, an automation or another flow commands it (only when the value changes), a **feedback** output each time the device reports a value.\n- Writing a feedback / status target updates the value HyperVisu shows; nothing is sent to the device. Use it with VIRTUAL devices.",
    "x": 330,
    "y": 4570,
    "wires": []
  }
]