{
    "pluginAlias": "HDLBusproHomebridge",
    "pluginType": "platform",
    "singular": true,
    "schema": {
        "type": "object",
        "properties": {
            "name": {
                "title": "Name",
                "type": "string",
                "default": "HDLBusproHomebridge",
                "description": "The name for this HDL Buspro platform instance (appears in Homebridge Logs).",
                "required": true
            },
            "buses": {
                "title": "Buses",
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "bus_name": {
                            "title": "Bus name",
                            "description": "The name of your bus.",
                            "type": "string",
                            "default": "New bus",
                            "minLength": 1,
                            "required": true
                        },
                        "bus_IP": {
                            "title": "Bus IP address",
                            "description": "The IP address of your bus.",
                            "type": "string",
                            "format": "ipv4",
                            "placeholder": "10.0.0.1",
                            "required": true,
                            "style": {
                                "color": "#FFFFFF" 
                            }
                        },
                        "bus_port": {
                            "title": "Bus port",
                            "description": "The port of your bus.",
                            "type": "integer",
                            "default": 6000,
                            "required": true
                        },
                        "subnets": {
                            "title": "Subnets",
                            "type": "array",
                            "required": true,
                            "items": {
                                "type": "object",
                                "properties": {
                                    "subnet_number": {
                                        "title": "Subnet number",
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 254
                                    },
                                    "cd_number": {
                                        "title": "Control device number",
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 254
                                    },
                                    "devices": {
                                        "title": "Devices",
                                        "type": "array",
                                        "required": true,
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "device_name": {
                                                    "title": "Device Name",
                                                    "type": "string"
                                                },
                                                "device_address": {
                                                    "title": "Device Address",
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 254
                                                },
                                                "device_type": {
                                                    "title": "Device type",
                                                    "type": "string",
                                                    "oneOf": [
                                                        {
                                                            "title": "Relay Lightbulb",
                                                            "enum": ["relaylightbulb"]
                                                        },
                                                        {
                                                            "title": "Relay Dimmable Lightbulb",
                                                            "enum": ["relaydimmablelightbulb"]
                                                        },
                                                        {
                                                            "title": "Relay Lock",
                                                            "enum": ["relaylock"]
                                                        },
                                                        {
                                                            "title": "Dry Contact",
                                                            "enum": ["drycontact"]
                                                        },
                                                        {
                                                            "title": "Sensor",
                                                            "enum": ["sensor8in1"]
                                                        },
                                                        {
                                                            "title": "Relay Curtains",
                                                            "enum": ["relaycurtains"]
                                                        },
                                                        {
                                                            "title": "Relay Curtain Valve",
                                                            "enum": ["relaycurtainvalve"]
                                                        },
                                                        {
                                                            "title": "Relay RGB",
                                                            "enum": ["relayrgb"]
                                                        },
                                                        {
                                                            "title": "Relay Fan",
                                                            "enum": ["relayfan"]
                                                        }
                                                    ]
                                                },
                                                "area": {
                                                    "title": "Area",
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 254,
                                                    "default": 1,
                                                    "description": "Change it in case your relay supports areas"
                                                },
                                                "channel": {
                                                    "title": "Device Channel",
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 254
                                                },
                                                "red_channel": {
                                                    "title": "Red Channel",
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 254
                                                },
                                                "green_channel": {
                                                    "title": "Green Channel",
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 254
                                                },
                                                "blue_channel": {
                                                    "title": "Blue Channel",
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 254
                                                },
                                                "lock_timeout": {
                                                    "title": "Lock timeout",
                                                    "type": "number",
                                                    "minimum": 0
                                                },
                                                "nc": {
                                                    "title": "Circuit type",
                                                    "type": "boolean",
                                                    "description": "Allows to flip logic for which state of contact is active",
                                                    "default": true
                                                },
                                                "duration": {
                                                    "title": "Duration",
                                                    "type": "number",
                                                    "description": "How long does it take for curtain to fully open. Should coincide with value from HDL.",
                                                    "minimum": 0
                                                },
                                                "curtains_precision": {
                                                    "title": "Curtains position precision (%)",
                                                    "type": "number",
                                                    "description": "Due to the fact HDL can only measure percentage of curtains open by timer and the fact that HDL relay and your HB server have a lag, precise condition in current/target levels may leave curtain status bugged as 'opening'. Increase this value if this happens.",
                                                    "minimum": 0,
                                                    "default": 5
                                                },
                                                "drycontact_type": {
                                                    "title": "Dry contact purpose",
                                                    "type": "string",
                                                    "description": "Select dry contact purpose",
                                                    "oneOf": [
                                                        {
                                                            "title": "Leak Sensor",
                                                            "enum": ["leaksensor"]
                                                        },
                                                        {
                                                            "title": "Contact Sensor",
                                                            "enum": ["contactsensor"]
                                                        },
                                                        {
                                                            "title": "Smoke Sensor",
                                                            "enum": ["smokesensor"]
                                                        },
                                                        {
                                                            "title": "Occupancy Sensor",
                                                            "enum": ["occupancysensor"]
                                                        }
                                                    ]
                                                },
                                                "valve_type": {
                                                    "title": "Valve type",
                                                    "type": "string",
                                                    "description": "Select 1 of four valve types",
                                                    "oneOf": [
                                                        {
                                                            "title": "General Valve",
                                                            "enum": [0]
                                                        },
                                                        {
                                                            "title": "Irrigation",
                                                            "enum": [1]
                                                        },
                                                        {
                                                            "title": "Shower Head",
                                                            "enum": [2]
                                                        },
                                                        {
                                                            "title": "Water Faucet",
                                                            "enum": [3]
                                                        }
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "required": ["name", "buses"]
    },
    "layout": [
        {
            "key": "name",
            "type": "string",
            "placeholder": "My HDL Buspro System"
        },
        {
            "key": "buses",
            "type": "tabarray",
            "title": "{{ value.bus_name || 'bus' }}",
            "items": [
                "buses[].bus_name",
                "buses[].bus_IP",
                "buses[].bus_port",
                {
                    "key": "buses[]",
                    "type": "array",
                    "title": "{{ value.title }}",
                    "items": [
                        {
                            "key": "buses[].subnets",
                            "title": "Subnets",
                            "buttonText": "Add Bus subnets",
                            "type": "array",
                            "expandable": true,
                            "expanded": true,
                            "items": [
                                "buses[].subnets[].subnet_number",
                                "buses[].subnets[].cd_number",
                                {
                                    "key": "buses[].subnets[].devices",
                                    "buttonText": "Add device",
                                    "type": "array",
                                    "expandable": true,
                                    "expanded": false,
                                    "items": [
                                        "buses[].subnets[].devices[].device_name",
                                        "buses[].subnets[].devices[].device_address",
                                        "buses[].subnets[].devices[].device_type",
                                        {
                                            "key": "buses[].subnets[].devices[].area",
                                            "condition": {
                                                "functionBody": "return (['drycontact'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].channel",
                                            "condition": {
                                                "functionBody": "return (['relaylightbulb', 'relaydimmablelightbulb', 'drycontact', 'relaylock', 'relaycurtains', 'relayfan'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].red_channel",
                                            "condition": {
                                                "functionBody": "return (['relayrgb'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].green_channel",
                                            "condition": {
                                                "functionBody": "return (['relayrgb'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].blue_channel",
                                            "condition": {
                                                "functionBody": "return (['relayrgb'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].drycontact_type",
                                            "condition": {
                                                "functionBody": "return (['drycontact'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].lock_timeout",
                                            "condition": {
                                                "functionBody": "return (['relaylock'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].duration",
                                            "condition": {
                                                "functionBody": "return (['relaycurtains'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].nc",
                                            "type": "radios-inline",
                                            "titleMap": [
                                                {
                                                    "name": "Normally closed",
                                                    "value": true
                                                },
                                                {
                                                    "name": "Normally open",
                                                    "value": false
                                                }
                                            ],
                                            "condition": {
                                                "functionBody": "return (['relaylock', 'drycontact'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].valve_type",
                                            "condition": {
                                                "functionBody": "return (['relaycurtainvalve'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        },
                                        {
                                            "key": "buses[].subnets[].devices[].curtains_precision",
                                            "condition": {
                                                "functionBody": "return (['relaycurtains'].includes(model.buses[arrayIndices[0]].subnets[arrayIndices[1]].devices[arrayIndices[2]].device_type))"
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}