From 3c760b136b562a26f7e557f2bdaabe3ee4302c20 Mon Sep 17 00:00:00 2001 From: ayhamdabbas Date: Mon, 5 Feb 2024 14:31:53 +0100 Subject: [PATCH 1/4] Create a new driver for pir illuminance sensor --- app.json | 97 ++- .../pir_illumenance_sensor/assets/icon.svg | 576 ++++++++++++++++++ .../assets/images/large.PNG | Bin 0 -> 32357 bytes .../assets/images/small.PNG | Bin 0 -> 3817 bytes drivers/pir_illumenance_sensor/device.js | 331 ++++++++++ .../driver.compose.json | 56 ++ .../driver.settings.compose.json | 1 + 7 files changed, 1043 insertions(+), 18 deletions(-) create mode 100644 drivers/pir_illumenance_sensor/assets/icon.svg create mode 100644 drivers/pir_illumenance_sensor/assets/images/large.PNG create mode 100644 drivers/pir_illumenance_sensor/assets/images/small.PNG create mode 100644 drivers/pir_illumenance_sensor/device.js create mode 100644 drivers/pir_illumenance_sensor/driver.compose.json create mode 100644 drivers/pir_illumenance_sensor/driver.settings.compose.json diff --git a/app.json b/app.json index a06186c7..efeea757 100644 --- a/app.json +++ b/app.json @@ -3251,11 +3251,63 @@ ] }, { - "id": "outdoor_plug", + "id": "outdoor_plug", + "name": { + "en": "Outdoor Plug without metering" + }, + "class": "socket", + "platforms": [ + "local" + ], + "connectivity": [ + "zigbee" + ], + "capabilities": [ + "onoff" + ], + "capabilitiesOptions": { + "measure_power": { + "approximated": true + } + }, + "images": { + "large": "/drivers/outdoor_plug/assets/images/large.png", + "small": "/drivers/outdoor_plug/assets/images/small.png" + }, + "zigbee": { + "manufacturerName": [ + "_TZ3000_pnzfdr9y" + ], + "productId": [ + "TS0101" + ], + "endpoints": { + "1": { + "clusters": [ + 0, + 4, + 5, + 6 + ], + "bindings": [ + 6 + ] + } + }, + "learnmode": { + "instruction": { + "en": "Press and hold down on/off switch for aprox 5 seconds until the LED blinks rapidly." + } + } + }, + "settings": [] + }, + { + "id": "pir_illumenance_sensor", "name": { - "en": "Outdoor Plug without metering" + "en": "PIR illumenance sensor" }, - "class": "socket", + "class": "sensor", "platforms": [ "local" ], @@ -3263,40 +3315,49 @@ "zigbee" ], "capabilities": [ - "onoff" + "alarm_motion", + "alarm_battery", + "measure_luminance" ], - "capabilitiesOptions": { - "measure_power": { - "approximated": true - } + "energy": { + "batteries": [ + "CR123A" + ] }, "images": { - "large": "/drivers/outdoor_plug/assets/images/large.png", - "small": "/drivers/outdoor_plug/assets/images/small.png" + "large": "/drivers/pir_illumenance_sensor/assets/images/large.png", + "small": "/drivers/pir_illumenance_sensor/assets/images/small.png" }, "zigbee": { "manufacturerName": [ - "_TZ3000_pnzfdr9y" + "_TZE200_3towulqd" ], "productId": [ - "TS0101" + "TS0601" ], "endpoints": { "1": { "clusters": [ 0, - 4, - 5, - 6 + 3, + 1280, + 57346, + 61184, + 60928, + 57344, + 1, + 1024 ], "bindings": [ - 6 + 1, + 1280 ] } }, "learnmode": { + "image": "/drivers/pir_illumenance_sensor/assets/learn.svg", "instruction": { - "en": "Press and hold down on/off switch for aprox 5 seconds until the LED blinks rapidly." + "en": "Press the reset button for aprox 5 seconds until the LED blinks." } } }, @@ -9140,4 +9201,4 @@ "setable": true } } -} \ No newline at end of file +} diff --git a/drivers/pir_illumenance_sensor/assets/icon.svg b/drivers/pir_illumenance_sensor/assets/icon.svg new file mode 100644 index 00000000..b4d86fa8 --- /dev/null +++ b/drivers/pir_illumenance_sensor/assets/icon.svg @@ -0,0 +1,576 @@ + + + + + + + diff --git a/drivers/pir_illumenance_sensor/assets/images/large.PNG b/drivers/pir_illumenance_sensor/assets/images/large.PNG new file mode 100644 index 0000000000000000000000000000000000000000..6e29334c034ebd436b6e380211045f34f2f140da GIT binary patch literal 32357 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�c3jtnXdKL0ZtHf$^sMPO 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 { + this.onIASZoneStatusChangeNotification(payload); + } + // measure_luminance + zclNode.endpoints[1].clusters[CLUSTER.ILLUMINANCE_MEASUREMENT.NAME] + .on('attr.measuredValue', this.onIlluminanceMeasuredAttributeReport.bind(this)); + } + + onIlluminanceMeasuredAttributeReport(measuredValue) { + const parsedValue = Math.pow (10,((measuredValue - 1) / 10000)); + this.log('measure_luminance | Luminance - measuredValue (lux):', parsedValue); + this.setCapabilityValue('measure_luminance', parsedValue).catch(this.error); + } + + onIASZoneStatusChangeNotification({ zoneStatus, extendedStatus, zoneId, delay, }) { + this.log('IASZoneStatusChangeNotification received:', zoneStatus, extendedStatus, zoneId, delay); + this.setCapabilityValue('alarm_motion', zoneStatus.alarm1).catch(this.error); + this.setCapabilityValue('alarm_battery', zoneStatus.battery).catch(this.error); + } + + onDeleted(){ + this.log("PIR illumenance Sensor removed") + } + +} + +module.exports = pir_illumenance_sensor; + +//{ +// "ids": { +// "modelId": "TS0601", +// "manufacturerName": "_TZE200_3towulqd" +// }, +// "endpoints": { +// "ieeeAddress": "a4:c1:38:5e:ab:6e:a8:db", +// "networkAddress": 10175, +// "modelId": "TS0601", +// "manufacturerName": "_TZE200_3towulqd", +// "endpointDescriptors": [ +// { +// "status": "SUCCESS", +// "nwkAddrOfInterest": 10175, +// "_reserved": 26, +// "endpointId": 1, +// "applicationProfileId": 260, +// "applicationDeviceId": 1026, +// "applicationDeviceVersion": 0, +// "_reserved1": 1, +// "inputClusters": [ +// 0, +// 3, +// 1280, +// 57346, +// 61184, +// 60928, +// 57344, +// 1, +// 1024 +// ], +// "outputClusters": [] +// } +// ], +// "deviceType": "enddevice", +// "receiveWhenIdle": false, +// "swBuildId": "0122052017", +// "capabilities": { +// "alternatePANCoordinator": false, +// "deviceType": false, +// "powerSourceMains": false, +// "receiveWhenIdle": false, +// "security": false, +// "allocateAddress": true +// }, +// "extendedEndpointDescriptors": { +// "1": { +// "clusters": { +// "basic": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0, +// "name": "zclVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 1, +// "name": "appVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 2, +// "name": "stackVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 3, +// "name": "hwVersion" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 4, +// "name": "manufacturerName" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 5, +// "name": "modelId" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 7, +// "name": "powerSource" +// }, +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 18, +// "name": "deviceEnabled" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 16384, +// "name": "swBuildId" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision" +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "identify": { +// "attributes": [ +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 0, +// "name": "identifyTime", +// "value": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "iasZone": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0, +// "name": "zoneState", +// "value": "notEnrolled" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 1, +// "name": "zoneType", +// "value": "motionSensor" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 2, +// "name": "zoneStatus", +// "value": { +// "type": "Buffer", +// "data": [ +// 0, +// 0 +// ] +// } +// }, +// { +// "acl": [ +// "readable", +// "writable" +// ], +// "id": 16, +// "name": "iasCIEAddress", +// "value": "5c:c7:c1:ff:fe:5b:ce:ab" +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 17, +// "name": "zoneId", +// "value": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "powerConfiguration": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 32, +// "name": "batteryVoltage", +// "value": 33 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 33, +// "name": "batteryPercentageRemaining", +// "value": 200 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// }, +// "illuminanceMeasurement": { +// "attributes": [ +// { +// "acl": [ +// "readable" +// ], +// "id": 0, +// "name": "measuredValue", +// "value": 1000 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 1, +// "name": "minMeasuredValue", +// "value": 0 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 2, +// "name": "maxMeasuredValue", +// "value": 4000 +// }, +// { +// "acl": [ +// "readable" +// ], +// "id": 65533, +// "name": "clusterRevision", +// "value": 1 +// } +// ], +// "commandsGenerated": "UNSUP_GENERAL_COMMAND", +// "commandsReceived": "UNSUP_GENERAL_COMMAND" +// } +// }, +// "bindings": { } +// } +// } +// } +//} + diff --git a/drivers/pir_illumenance_sensor/driver.compose.json b/drivers/pir_illumenance_sensor/driver.compose.json new file mode 100644 index 00000000..a6342f13 --- /dev/null +++ b/drivers/pir_illumenance_sensor/driver.compose.json @@ -0,0 +1,56 @@ +{ + "id": "pir_illumenance_sensor", + "name": { + "en": "PIR illumenance sensor" + }, + "class": "sensor", + "platforms": [ "local" ], + "connectivity": [ "zigbee" ], + "capabilities": [ + "alarm_motion", + "alarm_battery", + "measure_luminance" + ], + "energy": { + "batteries": [ + "CR123A" + ] + }, + "images": { + "large": "{{driverAssetsPath}}/images/large.png", + "small": "{{driverAssetsPath}}/images/small.png" + }, + "zigbee": { + "manufacturerName": [ + "_TZE200_3towulqd" + ], + "productId": [ + "TS0601" + ], + "endpoints": { + "1": { + "clusters": [ + 0, + 3, + 1280, + 57346, + 61184, + 60928, + 57344, + 1, + 1024 + ], + "bindings": [ + 1, + 1280 + ] + } + }, + "learnmode": { + "image": "{{driverAssetsPath}}/learn.svg", + "instruction": { + "en": "Press the reset button for aprox 5 seconds until the LED blinks." + } + } + } +} diff --git a/drivers/pir_illumenance_sensor/driver.settings.compose.json b/drivers/pir_illumenance_sensor/driver.settings.compose.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/drivers/pir_illumenance_sensor/driver.settings.compose.json @@ -0,0 +1 @@ +[] \ No newline at end of file From 38d15d9408c427053676699f9493261e1fbecd08 Mon Sep 17 00:00:00 2001 From: Manar Alkassam Date: Tue, 6 Feb 2024 14:33:19 +0100 Subject: [PATCH 2/4] update the SVG file for pir sensor --- .../pir_illumenance_sensor/assets/icon.svg | 578 +----------------- 1 file changed, 4 insertions(+), 574 deletions(-) diff --git a/drivers/pir_illumenance_sensor/assets/icon.svg b/drivers/pir_illumenance_sensor/assets/icon.svg index b4d86fa8..ebab8558 100644 --- a/drivers/pir_illumenance_sensor/assets/icon.svg +++ b/drivers/pir_illumenance_sensor/assets/icon.svg @@ -1,576 +1,6 @@ - - + - - - + + + From 663ae5274a4c445e3f198e7c049e2885d5e143ef Mon Sep 17 00:00:00 2001 From: Mihai Tudor Date: Wed, 7 Feb 2024 12:01:17 +0100 Subject: [PATCH 3/4] Corrected driver name & battery type --- app.json | 14 +++++++------- .../assets/icon.svg | 0 .../assets/images/large.PNG | Bin .../assets/images/small.PNG | Bin .../device.js | 6 +++--- .../driver.compose.json | 14 +++++++------- .../driver.settings.compose.json | 0 7 files changed, 17 insertions(+), 17 deletions(-) rename drivers/{pir_illumenance_sensor => pir_motion_illuminance_sensor}/assets/icon.svg (100%) rename drivers/{pir_illumenance_sensor => pir_motion_illuminance_sensor}/assets/images/large.PNG (100%) rename drivers/{pir_illumenance_sensor => pir_motion_illuminance_sensor}/assets/images/small.PNG (100%) rename drivers/{pir_illumenance_sensor => pir_motion_illuminance_sensor}/device.js (97%) rename drivers/{pir_illumenance_sensor => pir_motion_illuminance_sensor}/driver.compose.json (83%) rename drivers/{pir_illumenance_sensor => pir_motion_illuminance_sensor}/driver.settings.compose.json (100%) diff --git a/app.json b/app.json index efeea757..3c5148c5 100644 --- a/app.json +++ b/app.json @@ -3302,10 +3302,10 @@ }, "settings": [] }, - { - "id": "pir_illumenance_sensor", + { + "id": "pir_motion_illuminance_sensor", "name": { - "en": "PIR illumenance sensor" + "en": "PIR motion illuminance sensor" }, "class": "sensor", "platforms": [ @@ -3321,12 +3321,12 @@ ], "energy": { "batteries": [ - "CR123A" + "CR2450" ] }, "images": { - "large": "/drivers/pir_illumenance_sensor/assets/images/large.png", - "small": "/drivers/pir_illumenance_sensor/assets/images/small.png" + "large": "/drivers/pir_motion_illuminance_sensor/assets/images/large.png", + "small": "/drivers/pir_motion_illuminance_sensor/assets/images/small.png" }, "zigbee": { "manufacturerName": [ @@ -3355,7 +3355,7 @@ } }, "learnmode": { - "image": "/drivers/pir_illumenance_sensor/assets/learn.svg", + "image": "/drivers/pir_motion_illuminance_sensor/assets/learn.svg", "instruction": { "en": "Press the reset button for aprox 5 seconds until the LED blinks." } diff --git a/drivers/pir_illumenance_sensor/assets/icon.svg b/drivers/pir_motion_illuminance_sensor/assets/icon.svg similarity index 100% rename from drivers/pir_illumenance_sensor/assets/icon.svg rename to drivers/pir_motion_illuminance_sensor/assets/icon.svg diff --git a/drivers/pir_illumenance_sensor/assets/images/large.PNG b/drivers/pir_motion_illuminance_sensor/assets/images/large.PNG similarity index 100% rename from drivers/pir_illumenance_sensor/assets/images/large.PNG rename to drivers/pir_motion_illuminance_sensor/assets/images/large.PNG diff --git a/drivers/pir_illumenance_sensor/assets/images/small.PNG b/drivers/pir_motion_illuminance_sensor/assets/images/small.PNG similarity index 100% rename from drivers/pir_illumenance_sensor/assets/images/small.PNG rename to drivers/pir_motion_illuminance_sensor/assets/images/small.PNG diff --git a/drivers/pir_illumenance_sensor/device.js b/drivers/pir_motion_illuminance_sensor/device.js similarity index 97% rename from drivers/pir_illumenance_sensor/device.js rename to drivers/pir_motion_illuminance_sensor/device.js index fd002aaf..5b506a6a 100644 --- a/drivers/pir_illumenance_sensor/device.js +++ b/drivers/pir_motion_illuminance_sensor/device.js @@ -4,7 +4,7 @@ const Homey = require('homey'); const { ZigBeeDevice } = require('homey-zigbeedriver'); const { debug, CLUSTER } = require('zigbee-clusters'); -class pir_illumenance_sensor extends ZigBeeDevice { +class pir_motion_illuminance_sensor extends ZigBeeDevice { async onNodeInit({ zclNode }) { @@ -32,12 +32,12 @@ class pir_illumenance_sensor extends ZigBeeDevice { } onDeleted(){ - this.log("PIR illumenance Sensor removed") + this.log("PIR motion illuminance sensor removed") } } -module.exports = pir_illumenance_sensor; +module.exports = pir_motion_illuminance_sensor; //{ // "ids": { diff --git a/drivers/pir_illumenance_sensor/driver.compose.json b/drivers/pir_motion_illuminance_sensor/driver.compose.json similarity index 83% rename from drivers/pir_illumenance_sensor/driver.compose.json rename to drivers/pir_motion_illuminance_sensor/driver.compose.json index a6342f13..1994bf65 100644 --- a/drivers/pir_illumenance_sensor/driver.compose.json +++ b/drivers/pir_motion_illuminance_sensor/driver.compose.json @@ -1,7 +1,7 @@ { - "id": "pir_illumenance_sensor", + "id": "pir_motion_illuminance_sensor", "name": { - "en": "PIR illumenance sensor" + "en": "PIR motion illuminance sensor" }, "class": "sensor", "platforms": [ "local" ], @@ -13,7 +13,7 @@ ], "energy": { "batteries": [ - "CR123A" + "CR2450" ] }, "images": { @@ -21,9 +21,9 @@ "small": "{{driverAssetsPath}}/images/small.png" }, "zigbee": { - "manufacturerName": [ - "_TZE200_3towulqd" - ], + "manufacturerName": [ + "_TZE200_3towulqd" + ], "productId": [ "TS0601" ], @@ -53,4 +53,4 @@ } } } -} +} \ No newline at end of file diff --git a/drivers/pir_illumenance_sensor/driver.settings.compose.json b/drivers/pir_motion_illuminance_sensor/driver.settings.compose.json similarity index 100% rename from drivers/pir_illumenance_sensor/driver.settings.compose.json rename to drivers/pir_motion_illuminance_sensor/driver.settings.compose.json From 2e11dbd45f7e436a8292fc912544bf522ff81689 Mon Sep 17 00:00:00 2001 From: Mihai Tudor Date: Thu, 8 Feb 2024 09:25:46 +0100 Subject: [PATCH 4/4] Added battery information reporting --- app.json | 22 +++++++++++++++++-- .../pir_motion_illuminance_sensor/device.js | 14 ++++++++++-- .../driver.compose.json | 3 ++- .../driver.settings.compose.json | 19 +++++++++++++++- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/app.json b/app.json index 869a92ed..f39800f1 100644 --- a/app.json +++ b/app.json @@ -3297,7 +3297,8 @@ "capabilities": [ "alarm_motion", "alarm_battery", - "measure_luminance" + "measure_luminance", + "measure_battery" ], "energy": { "batteries": [ @@ -3341,7 +3342,24 @@ } } }, - "settings": [] + "settings": [ + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (percent)" + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given." + }, + "value": 20, + "attr": { + "step": 1, + "min": 10, + "max": 90 + } + } + ] }, { "id": "pir_sensor_2", diff --git a/drivers/pir_motion_illuminance_sensor/device.js b/drivers/pir_motion_illuminance_sensor/device.js index 5b506a6a..991bce4e 100644 --- a/drivers/pir_motion_illuminance_sensor/device.js +++ b/drivers/pir_motion_illuminance_sensor/device.js @@ -14,13 +14,17 @@ class pir_motion_illuminance_sensor extends ZigBeeDevice { zclNode.endpoints[1].clusters[CLUSTER.IAS_ZONE.NAME].onZoneStatusChangeNotification = payload => { this.onIASZoneStatusChangeNotification(payload); } + // measure_battery // alarm_battery + zclNode.endpoints[1].clusters[CLUSTER.POWER_CONFIGURATION.NAME] + .on('attr.batteryPercentageRemaining', this.onBatteryPercentageRemainingAttributeReport.bind(this)); // measure_luminance zclNode.endpoints[1].clusters[CLUSTER.ILLUMINANCE_MEASUREMENT.NAME] .on('attr.measuredValue', this.onIlluminanceMeasuredAttributeReport.bind(this)); + } onIlluminanceMeasuredAttributeReport(measuredValue) { - const parsedValue = Math.pow (10,((measuredValue - 1) / 10000)); + const parsedValue = Math.round(Math.pow(10,((measuredValue - 1) / 10000))); this.log('measure_luminance | Luminance - measuredValue (lux):', parsedValue); this.setCapabilityValue('measure_luminance', parsedValue).catch(this.error); } @@ -28,7 +32,13 @@ class pir_motion_illuminance_sensor extends ZigBeeDevice { onIASZoneStatusChangeNotification({ zoneStatus, extendedStatus, zoneId, delay, }) { this.log('IASZoneStatusChangeNotification received:', zoneStatus, extendedStatus, zoneId, delay); this.setCapabilityValue('alarm_motion', zoneStatus.alarm1).catch(this.error); - this.setCapabilityValue('alarm_battery', zoneStatus.battery).catch(this.error); + } + + onBatteryPercentageRemainingAttributeReport(batteryPercentageRemaining) { + const batteryThreshold = this.getSetting('batteryThreshold') || 20; + this.log("measure_battery | powerConfiguration - batteryPercentageRemaining (%): ", batteryPercentageRemaining/2); + this.setCapabilityValue('measure_battery', batteryPercentageRemaining/2).catch(this.error); + this.setCapabilityValue('alarm_battery', (batteryPercentageRemaining/2 < batteryThreshold) ? true : false).catch(this.error); } onDeleted(){ diff --git a/drivers/pir_motion_illuminance_sensor/driver.compose.json b/drivers/pir_motion_illuminance_sensor/driver.compose.json index 1994bf65..b971f567 100644 --- a/drivers/pir_motion_illuminance_sensor/driver.compose.json +++ b/drivers/pir_motion_illuminance_sensor/driver.compose.json @@ -9,7 +9,8 @@ "capabilities": [ "alarm_motion", "alarm_battery", - "measure_luminance" + "measure_luminance", + "measure_battery" ], "energy": { "batteries": [ diff --git a/drivers/pir_motion_illuminance_sensor/driver.settings.compose.json b/drivers/pir_motion_illuminance_sensor/driver.settings.compose.json index 0637a088..61524650 100644 --- a/drivers/pir_motion_illuminance_sensor/driver.settings.compose.json +++ b/drivers/pir_motion_illuminance_sensor/driver.settings.compose.json @@ -1 +1,18 @@ -[] \ No newline at end of file +[ + { + "id": "batteryThreshold", + "type": "number", + "label": { + "en": "Battery Low Alarm Voltage Threshold (percent)" + }, + "hint": { + "en": "This setting determines the threshold before a battery alarm is given." + }, + "value": 20, + "attr": { + "step": 1, + "min": 10, + "max": 90 + } + } +] \ No newline at end of file