[
  {
    "id": "beac36c81d48b2e8",
    "type": "group",
    "style": {
      "stroke": "#999999",
      "stroke-opacity": "1",
      "fill": "none",
      "fill-opacity": "1",
      "label": true,
      "label-position": "nw",
      "color": "#a4a4a4"
    },
    "nodes": [
      "7ff5642c72aa11eb",
      "c0c4258f5a901dd6",
      "53b4fc0ba401a5b2",
      "135dc4ac1a6e94b3",
      "48685216f5118955",
      "3ef943fc6ffcd967",
      "ad7116d4dd195812",
      "3296d170a3ea0698",
      "87cef25baf18ae60",
      "10954a7ab1a4c615",
      "691283d56c487f9c",
      "a9bdae737785b31a",
      "b4b64d3e030f868f",
      "af6bc754fae218db",
      "c92f60e00b4cef81",
      "4015b654e6707c90",
      "818b0f6e108c79a4",
      "da7292a17c5429c0",
      "267d6adc64b4fa6c",
      "1f244d5693090d1d",
      "d86651b1e5cb6f6e",
      "bba518c66331789f",
      "ed6365df38360ab8",
      "b34d9c97b98c7da1",
      "019486d0059cd4a8",
      "7de4631efa6f5003",
      "a91db140ec6b924a",
      "c98f698cdb8afd44",
      "75c27bfc46795702",
      "1b7afe74084161c9",
      "22415607c7547407"
    ],
    "x": 1394,
    "y": 2459,
    "w": 1332,
    "h": 622
  },
  {
    "id": "7ff5642c72aa11eb",
    "type": "widget-AirConditioning",
    "g": "beac36c81d48b2e8",
    "dropdownRoom": "",
    "dropdownCategory": "",
    "dropdownWidget": "",
    "displayName": "Air Conditioning (set device)",
    "x": 2160,
    "y": 2720,
    "wires": [
      [
        "af6bc754fae218db"
      ],
      [
        "c92f60e00b4cef81"
      ],
      [
        "4015b654e6707c90"
      ],
      [
        "818b0f6e108c79a4"
      ],
      [
        "da7292a17c5429c0"
      ],
      [
        "267d6adc64b4fa6c"
      ],
      [
        "1f244d5693090d1d"
      ],
      [
        "d86651b1e5cb6f6e"
      ],
      [
        "bba518c66331789f"
      ],
      [
        "ed6365df38360ab8"
      ],
      [
        "b34d9c97b98c7da1"
      ]
    ]
  },
  {
    "id": "c0c4258f5a901dd6",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "name": "AC ON",
    "props": [
      {
        "p": "inputTarget",
        "v": "On/Off",
        "vt": "str"
      },
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "payload": "true",
    "payloadType": "bool",
    "x": 1890,
    "y": 2500,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "53b4fc0ba401a5b2",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1900,
    "y": 2540,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "135dc4ac1a6e94b3",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1910,
    "y": 2580,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "48685216f5118955",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1910,
    "y": 2620,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "3ef943fc6ffcd967",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1900,
    "y": 2660,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "ad7116d4dd195812",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "name": "21°C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "payload": "21",
    "payloadType": "num",
    "x": 1490,
    "y": 2720,
    "wires": [
      [
        "75c27bfc46795702"
      ]
    ]
  },
  {
    "id": "3296d170a3ea0698",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "name": "25°C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "payload": "25",
    "payloadType": "num",
    "x": 1490,
    "y": 2680,
    "wires": [
      [
        "c98f698cdb8afd44"
      ]
    ]
  },
  {
    "id": "87cef25baf18ae60",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "name": "On/Off Feedback (feedback)",
    "props": [
      {
        "p": "inputTarget",
        "v": "On/Off feedback",
        "vt": "str"
      },
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "payload": "false",
    "payloadType": "bool",
    "x": 1580,
    "y": 2840,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "10954a7ab1a4c615",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1580,
    "y": 2880,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "691283d56c487f9c",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1580,
    "y": 2920,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "a9bdae737785b31a",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1570,
    "y": 2960,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "b4b64d3e030f868f",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "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": 1580,
    "y": 3000,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "af6bc754fae218db",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "1 · On/Off (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2520,
    "y": 2560,
    "wires": []
  },
  {
    "id": "c92f60e00b4cef81",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "2 · On/Off Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2550,
    "y": 2600,
    "wires": []
  },
  {
    "id": "4015b654e6707c90",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "3 · Heating Mode (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2540,
    "y": 2640,
    "wires": []
  },
  {
    "id": "818b0f6e108c79a4",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "4 · Heating Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2560,
    "y": 2680,
    "wires": []
  },
  {
    "id": "da7292a17c5429c0",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "5 · Cooling Mode (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2540,
    "y": 2720,
    "wires": []
  },
  {
    "id": "267d6adc64b4fa6c",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "6 · Cooling Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2560,
    "y": 2760,
    "wires": []
  },
  {
    "id": "1f244d5693090d1d",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "7 · Auto Mode (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2520,
    "y": 2800,
    "wires": []
  },
  {
    "id": "d86651b1e5cb6f6e",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "8 · Auto Feedback (bool)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2540,
    "y": 2840,
    "wires": []
  },
  {
    "id": "bba518c66331789f",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "9 · Setpoint (float)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2520,
    "y": 2880,
    "wires": []
  },
  {
    "id": "ed6365df38360ab8",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "10 · Actual Setpoint (float)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2560,
    "y": 2920,
    "wires": []
  },
  {
    "id": "b34d9c97b98c7da1",
    "type": "debug",
    "g": "beac36c81d48b2e8",
    "name": "11 · Temperature (float)",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "payload",
    "targetType": "msg",
    "statusVal": "",
    "statusType": "auto",
    "x": 2550,
    "y": 2960,
    "wires": []
  },
  {
    "id": "019486d0059cd4a8",
    "type": "function",
    "g": "beac36c81d48b2e8",
    "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": 1810,
    "y": 3040,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "7de4631efa6f5003",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "name": "Run AC Schedule",
    "props": [],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "x": 1550,
    "y": 3040,
    "wires": [
      [
        "019486d0059cd4a8"
      ]
    ]
  },
  {
    "id": "a91db140ec6b924a",
    "type": "comment",
    "g": "beac36c81d48b2e8",
    "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": 1570,
    "y": 2500,
    "wires": []
  },
  {
    "id": "c98f698cdb8afd44",
    "type": "hypervisu-input-target",
    "g": "beac36c81d48b2e8",
    "selectedWidget": "19",
    "selectedInput": "Actual setpoint",
    "displayName": "Input Target",
    "x": 1700,
    "y": 2680,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "75c27bfc46795702",
    "type": "hypervisu-input-target",
    "g": "beac36c81d48b2e8",
    "selectedWidget": "19",
    "selectedInput": "Temperature",
    "displayName": "Input Target",
    "x": 1690,
    "y": 2720,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "1b7afe74084161c9",
    "type": "hypervisu-input-target",
    "g": "beac36c81d48b2e8",
    "selectedWidget": "19",
    "selectedInput": "Setpoint",
    "displayName": "Input Target",
    "x": 1680,
    "y": 2760,
    "wires": [
      [
        "7ff5642c72aa11eb"
      ]
    ]
  },
  {
    "id": "22415607c7547407",
    "type": "inject",
    "g": "beac36c81d48b2e8",
    "name": "23°C",
    "props": [
      {
        "p": "payload"
      }
    ],
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": "0",
    "topic": "",
    "payload": "23",
    "payloadType": "num",
    "x": 1490,
    "y": 2760,
    "wires": [
      [
        "1b7afe74084161c9"
      ]
    ]
  }
]