homebridge-resideo
Version:
The Resideo plugin allows you to access your Resideo device(s) from HomeKit.
612 lines (611 loc) • 33.5 kB
JSON
{
"pluginAlias": "Resideo",
"pluginType": "platform",
"singular": true,
"customUi": true,
"customUiPath": "./dist/homebridge-ui",
"headerDisplay": "<p align='center'><img width='250px' src='https://user-images.githubusercontent.com/3979615/71876008-d99d7400-3179-11ea-909b-9d2a3d1e670f.png'></p>\n\nThe **Homebridge Resideo** plugin allows you to control Resideo thermostats and also view your Leak and Room Sensors from HomeKit. \n\nTo get started link your Resideo account using the button below.",
"footerDisplay": "Your Resideo account has been linked. Please raise any issues on our [project page](https://github.com/homebridge-plugins/homebridge-resideo/issues).\n\nIf you would like to have other Resideo Devices besides Thermostat, Leak Sensors, or Room Sensors added to this plugin fill out [Feature Request Form](https://github.com/homebridge-plugins/homebridge-resideo/issues/new?assignees=&labels=&template=feature_request.md).",
"schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"title": "Name",
"default": "Resideo"
},
"credentials": {
"type": "object",
"properties": {
"consumerKey": {
"title": "Consumer Key",
"type": "string",
"x-schema-form": {
"type": "consumerKey"
}
},
"consumerSecret": {
"title": "Consumer Secret",
"type": "string",
"x-schema-form": {
"type": "customerSecret"
}
},
"refreshToken": {
"title": "Refresh Token",
"type": "string",
"x-schema-form": {
"type": "refreshToken"
}
},
"notice": {
"title": "Notice",
"type": "string",
"default": "Keep your tokens a secret!"
}
},
"required": ["consumerKey", "consumerSecret", "refreshToken", "notice"]
},
"options": {
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"title": "Devices",
"type": "object",
"properties": {
"deviceID": {
"title": "Device ID",
"type": "string",
"placeholder": "81F3UT59513F"
},
"configDeviceName": {
"title": "Device Name",
"type": "string",
"pattern": "^[a-zA-Z0-9]+([a-zA-Z0-9 ]*[a-zA-Z0-9]+)?$",
"placeholder": "Hallway Thermostat",
"condition": {
"functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].deviceID);"
}
},
"hide_device": {
"title": "Hide Device",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].deviceID);"
}
},
"deviceClass": {
"title": "Device Class",
"type": "string",
"oneOf": [
{
"title": "Thermostat",
"enum": ["Thermostat"]
},
{
"title": "Leak Sensor",
"enum": ["LeakDetector"]
},
{
"title": "Shut Off Valve",
"enum": ["ShutoffValve"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].deviceID && !model.options.devices[arrayIndices].hide_device);"
}
},
"deviceModel": {
"title": "Thermostat Model",
"type": "string",
"placeholder": "T5",
"typeahead": {
"source": ["T9", "T10", "T5", "T6", "Round"]
},
"condition": {
"functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].deviceID && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat');"
}
},
"thermostat": {
"type": "object",
"properties": {
"show_auto": {
"title": "Show Auto Mode",
"description": "Will show Auto mode, even if device API doesn't show it.",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID);"
}
},
"hide_fan": {
"title": "Hide Thermostat Fan",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID);"
}
},
"hide_humidity": {
"title": "Hide Thermostat Humidity Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID);"
}
},
"statefulStatus": {
"title": "Enable Stateful Programmable Switch (Only Works in 3rd Party Home Apps) for Automations on NoHold, TemporaryHold, PermanentHold",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID);"
}
},
"thermostatSetpointStatus": {
"title": "Thermostat Setpoint Status (LCC Devices Only)",
"type": "string",
"description": "[PermanentHold] will hold the setpoint until user requests another change.\n[NoHold] will return to schedule.\n[TemporaryHold] will hold the set temperature until next schedule.",
"placeholder": "PermanentHold",
"oneOf": [
{
"title": "Permanent Hold",
"enum": ["PermanentHold"]
},
{
"title": "No Hold",
"enum": ["NoHold"]
},
{
"title": "Temporary Hold",
"enum": ["TemporaryHold"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10' || model.options.devices[arrayIndices].deviceModel === 'T5' || model.options.devices[arrayIndices].deviceModel === 'T6'));"
}
},
"roompriority": {
"title": "Room Priority Settings (T9-T10 Only)",
"type": "object",
"properties": {
"deviceType": {
"title": "Display As",
"type": "string",
"oneOf": [
{
"title": "Thermostat",
"enum": ["Thermostat"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
},
"priorityType": {
"title": "Priority Type",
"type": "string",
"placeholder": "PickARoom",
"oneOf": [
{
"title": "Pick A Room",
"enum": ["PickARoom"]
},
{
"title": "Whole House",
"enum": ["WholeHouse"]
},
{
"title": "Follow Me",
"enum": ["FollowMe"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
},
"refreshRate": {
"title": "Room Sensor Thermostat Refresh Rate",
"type": "number",
"minimum": 30,
"placeholder": 360,
"description": "Indicates the number of seconds between polls of Resideo API.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
},
"pushRate": {
"title": "Room Sensor Thermostat Push Rate",
"type": "number",
"minimum": 30,
"placeholder": 360,
"description": "Indicates the number of seconds between pushes to the Resideo API.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
},
"logging": {
"title": "Room Sensor Thermostat Logging Override Setting",
"type": "string",
"required": true,
"default": "",
"oneOf": [
{
"title": "Default Logging",
"enum": [""]
},
{
"title": "Standard Logging",
"enum": ["standard"]
},
{
"title": "No Logging",
"enum": ["none"]
},
{
"title": "Debug Logging",
"enum": ["debug"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
}
},
"required": ["deviceType", "priorityType", "logging"],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
},
"roomsensor": {
"title": "Room Sensor Settings (T9-T10 Only)",
"type": "object",
"properties": {
"hide_roomsensor": {
"title": "Hide Roomsensor(s)",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10'));"
}
},
"hide_temperature": {
"title": "Hide Roomsensor Temperature Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
}
},
"hide_humidity": {
"title": "Hide Roomsensor Humidity Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
}
},
"hide_occupancy": {
"title": "Hide Roomsensor Occupancy Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
}
},
"refreshRate": {
"title": "Room Sensor Refresh Rate",
"type": "number",
"minimum": 30,
"placeholder": 360,
"description": "Indicates the number of seconds between polls of Resideo API.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
}
},
"pushRate": {
"title": "Room Sensor Push Rate",
"type": "number",
"minimum": 30,
"placeholder": 360,
"description": "Indicates the number of seconds between pushes to the Resideo API.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
}
},
"logging": {
"title": "Room Sensor Logging Override Setting",
"type": "string",
"required": true,
"default": "",
"oneOf": [
{
"title": "Default Logging",
"enum": [""]
},
{
"title": "Standard Logging",
"enum": ["standard"]
},
{
"title": "No Logging",
"enum": ["none"]
},
{
"title": "Debug Logging",
"enum": ["debug"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
}
}
},
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'Thermostat' && model.options.devices[arrayIndices].deviceID && (model.options.devices[arrayIndices].deviceModel === 'T9' || model.options.devices[arrayIndices].deviceModel === 'T10') && !model.options.devices[arrayIndices].thermostat.roomsensor.hide_roomsensor);"
},
"required": ["logging"]
}
}
},
"leaksensor": {
"title": "Leak Sensor",
"type": "object",
"properties": {
"hide_leak": {
"title": "Hide Leak Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'LeakDetector' && model.options.devices[arrayIndices].deviceID);"
}
},
"hide_temperature": {
"title": "Hide Temperature Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'LeakDetector' && model.options.devices[arrayIndices].deviceID);"
}
},
"hide_humidity": {
"title": "Hide Humidity Service",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceClass === 'LeakDetector' && model.options.devices[arrayIndices].deviceID);"
}
}
}
},
"retry": {
"title": "Retry",
"type": "boolean",
"description": "Retry after receiving a Resideo API Error.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID);"
}
},
"external": {
"title": "External Accessory",
"type": "boolean",
"condition": {
"functionBody": "return (model.options && model.options.devices && model.options.devices[arrayIndices].deviceID && !model.options.devices[arrayIndices].hide_device);"
}
},
"firmware": {
"title": "Firmware Override",
"type": "string",
"placeholder": "1.2.8",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && model.options.devices[arrayIndices].deviceID);"
}
},
"refreshRate": {
"title": "Device Refresh Rate",
"type": "number",
"minimum": 30,
"placeholder": 360,
"description": "Indicates the number of seconds between polls of Resideo API.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].deviceClass === 'Thermostat' || model.options.devices[arrayIndices].deviceClass === 'LeakDetector') && model.options.devices[arrayIndices].deviceID);"
}
},
"pushRate": {
"title": "Device Push Rate",
"type": "number",
"placeholder": 1,
"description": "Indicates the number of seconds between pushes to the of Resideo API.",
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].deviceClass === 'Thermostat' || model.options.devices[arrayIndices].deviceClass === 'LeakDetector') && model.options.devices[arrayIndices].deviceID);"
}
},
"logging": {
"title": "Device Logging Override Setting",
"type": "string",
"required": true,
"default": "",
"oneOf": [
{
"title": "Default Logging",
"enum": [""]
},
{
"title": "Standard Logging",
"enum": ["standard"]
},
{
"title": "No Logging",
"enum": ["none"]
},
{
"title": "Debug Logging",
"enum": ["debug"]
}
],
"condition": {
"functionBody": "return (model.options && model.options.devices && !model.options.devices[arrayIndices].hide_device && (model.options.devices[arrayIndices].deviceClass === 'Thermostat' || model.options.devices[arrayIndices].deviceClass === 'LeakDetector') && model.options.devices[arrayIndices].deviceID);"
}
}
},
"required": ["deviceID", "deviceClass", "logging"]
}
},
"refreshRate": {
"title": "Refresh Rate",
"type": "number",
"minimum": 30,
"placeholder": 120,
"description": "Indicates the number of seconds between polls of the Resideo service."
},
"pushRate": {
"title": "Push Rate",
"type": "number",
"placeholder": 1,
"description": "Indicates the number of seconds between pushes to Honewell Home API."
},
"logging": {
"title": "Logging Setting",
"type": "string",
"required": true,
"default": "",
"oneOf": [
{
"title": "Default Logging",
"enum": [""]
},
{
"title": "Standard Logging",
"enum": ["standard"]
},
{
"title": "No Logging",
"enum": ["none"]
},
{
"title": "Debug Logging",
"enum": ["debug"]
}
]
},
"allowInvalidCharacters": {
"title": "Allow Invalid Characters",
"type": "boolean",
"description": "If true, invalid characters will be allowed in the device name."
}
},
"required": ["logging"]
}
},
"required": ["name", "credentials"]
},
"layout": [
{
"type": "fieldset",
"title": "Resideo Account Info",
"expandable": true,
"expanded": false,
"items": [
{
"type": "help",
"helpvalue": "<h5></h5><em class='primary-text'>This is for Manual Setup Only.</em>"
},
"credentials.consumerKey",
"credentials.consumerSecret",
"credentials.refreshToken"
]
},
{
"type": "fieldset",
"title": "Resideo Device Settings",
"expandable": true,
"expanded": false,
"items": [
{
"key": "options.devices",
"notitle": true,
"type": "tabarray",
"title": "{{ value.configDeviceName || value.deviceID || 'New Resideo Device' }}",
"expandable": true,
"expanded": false,
"orderable": false,
"items": [
"options.devices[].configDeviceName",
"options.devices[].deviceID",
"options.devices[].hide_device",
"options.devices[].deviceClass",
"options.devices[].deviceModel",
"options.devices[].thermostat.show_auto",
"options.devices[].thermostat.hide_fan",
"options.devices[].thermostat.hide_humidity",
"options.devices[].thermostat.thermostatSetpointStatus",
"options.devices[].leaksensor.hide_leak",
"options.devices[].leaksensor.hide_temperature",
"options.devices[].leaksensor.hide_humidity",
{
"key": "options.devices[].thermostat.roompriority",
"type": "fieldset",
"expandable": true,
"expanded": false,
"items": [
"options.devices[].thermostat.roompriority.deviceType",
"options.devices[].thermostat.roompriority.priorityType",
{
"key": "options.devices[].thermostat.roompriority.refreshRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, for retrieving the latest device status from the Resido API. This interval applies only to this specific device's roompriority Thermostat(s).</em>"
},
{
"key": "options.devices[].thermostat.roompriority.pushRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, between pushes to the Resideo API for this specific device's roompriority Thermostat(s).</em>"
},
"options.devices[].thermostat.roompriority.logging"
]
},
{
"key": "options.devices[].thermostat.roomsensor",
"type": "fieldset",
"expandable": true,
"expanded": false,
"items": [
"options.devices[].thermostat.roomsensor.hide_roomsensor",
"options.devices[].thermostat.roomsensor.hide_temperature",
"options.devices[].thermostat.roomsensor.hide_humidity",
"options.devices[].thermostat.roomsensor.hide_occupancy",
{
"key": "options.devices[].thermostat.roomsensor.refreshRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, for retrieving the latest device status from the Resido API. This interval applies only to this specific device's roomsensor(s).</em>"
},
{
"key": "options.devices[].thermostat.roomsensor.pushRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, between pushes to the Resideo API for this specific device's roomsensor(s).</em>"
},
"options.devices[].thermostat.roomsensor.logging"
]
},
"options.devices[].retry",
"options.devices[].firmware",
"options.devices[].external",
{
"key": "options.devices[].refreshRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, for retrieving the latest device status from the Resido API. This interval applies only to this specific device.</em>"
},
{
"key": "options.devices[].pushRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, between pushes to the Resideo API for this specific device.</em>"
},
"options.devices[].logging"
]
}
]
},
{
"type": "fieldset",
"title": "Advanced Settings",
"expandable": true,
"expanded": false,
"items": [
{
"key": "options.refreshRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, for retrieving the latest device status from the Resido API.</em>"
},
{
"key": "options.pushRate",
"description": "<em class='primary-text'>Specifies the interval, in seconds, between pushes to the Resideo API.</em>"
},
"options.logging",
"options.allowInvalidCharacters"
]
}
]
}