From bd46353d8ce0527dec36edb31716f1edfdf739f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 26 Mar 2026 11:30:17 +0100 Subject: [PATCH 1/5] Create Changelog for milesight-iot-am107 --- milesight-iot-am107/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 milesight-iot-am107/CHANGELOG.md diff --git a/milesight-iot-am107/CHANGELOG.md b/milesight-iot-am107/CHANGELOG.md new file mode 100644 index 000000000..b585d3a0f --- /dev/null +++ b/milesight-iot-am107/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 1.0.0 - 2026-03-26 + +- First version of plugin \ No newline at end of file From 4cf34dd90d81ef48f68e6f8b9db15d34706a5e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 26 Mar 2026 11:30:18 +0100 Subject: [PATCH 2/5] Create LICENSE for milesight-iot-am107 --- milesight-iot-am107/LICENSE.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 milesight-iot-am107/LICENSE.md diff --git a/milesight-iot-am107/LICENSE.md b/milesight-iot-am107/LICENSE.md new file mode 100644 index 000000000..bffeef341 --- /dev/null +++ b/milesight-iot-am107/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2026 Thinger.io + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From 5011015f56b35b8f36651826d3e26d0d2af18114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 26 Mar 2026 11:30:39 +0100 Subject: [PATCH 3/5] Upload image milesight-iot-am107 --- milesight-iot-am107/assets/am107.png | Bin 0 -> 63659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 milesight-iot-am107/assets/am107.png diff --git a/milesight-iot-am107/assets/am107.png b/milesight-iot-am107/assets/am107.png new file mode 100644 index 0000000000000000000000000000000000000000..7298648721e3ad6f1f291829596e889427a0242e GIT binary patch literal 63659 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 E0V3)W#sB~S literal 0 HcmV?d00001 From 513c61a246955a7bd1f7ae4a6347fe2fb11ad34f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 26 Mar 2026 11:31:57 +0100 Subject: [PATCH 4/5] Create README for milesight-iot-am107 --- milesight-iot-am107/README.md | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 milesight-iot-am107/README.md diff --git a/milesight-iot-am107/README.md b/milesight-iot-am107/README.md new file mode 100644 index 000000000..a4e3f1590 --- /dev/null +++ b/milesight-iot-am107/README.md @@ -0,0 +1,59 @@ +# AM107 - Ambience Monitoring Sensors + +The Milesight AM107 is a comprehensive LoRaWAN ambience monitoring sensor designed for Indoor Air Quality (IAQ) monitoring. This all-in-one device integrates seven smart sensors to measure CO2 concentration, temperature, humidity, light, TVOC (Total Volatile Organic Compounds), barometric pressure, and motion detection (PIR). The AM107 displays IAQ data in real-time and is equipped with NFC (Near Field Communication) for easy configuration via smartphone or PC software. + +## Features + +- **7-in-1 Multi-Sensor Solution**: Temperature, humidity, light intensity, CO2, TVOC, barometric pressure, and motion (PIR) detection +- **LoRaWAN Connectivity**: Long-range wireless communication for reliable data transmission +- **Real-Time Data Display**: Built-in display for instant IAQ data visualization +- **NFC Configuration**: Simple setup and configuration via smartphone or PC +- **Battery or USB Powered**: Dual power options with 2 × 1.5V AA alkaline batteries or Type-C port +- **Compact Design**: Dimensions of 105 × 21.2 × 70.4 mm +- **IP30 Enclosure**: Suitable for indoor environments +- **Wide Temperature Range**: Operating temperature from 0°C to 45°C (sensor range: -20°C to +70°C) + +## Use Cases + +- Indoor Air Quality (IAQ) monitoring in offices, schools, and commercial buildings +- Smart building automation and environmental control +- Workspace occupancy detection and management +- HVAC system optimization +- Health and safety compliance monitoring + +## Thinger.io Integration + +The AM107 integrates seamlessly with Thinger.io through LoRaWAN network servers, enabling centralized monitoring and data analysis of all environmental parameters. + +## Requirements + +A LoRaWAN server is required to communicate the Milesight AM107 into Thinger.io, some options are: + +- [The Things Stack](https://www.thethingsindustries.com/stack/) +- [LORIOT](https://loriot.io/) +- [ChirpStack](https://www.chirpstack.io/) + +Alongside, the corresponding plugin for the selected LoRaWAN server needs to be installed in your Thinger.io instance. + +## Get Started + +### Installation + +Look for the plugin in the [Thinger.io Plugin Store](https://marketplace.thinger.io/) and install it in your Thinger.io instance. Once the plugin is installed a new Product will be created for this device. + +### Configuration + +The Product is already preconfigured, check that the auto provision prefix matches the one selected in your LoRaWAN server plugin in Thinger.io, or change it to your desire. + +### Usage + +Start sending uplinks for autoprovisioning devices and buckets. +This product also provides a predefined dashboard and downlinks. + +## Additional Resources + +Milesight resources can be found at: + +- [Product Page](https://www.milesight.com/iot/product/lorawan-sensor/am107) +- [Device Repository](https://www.thethingsnetwork.org/device-repository/devices/milesight-iot/am107/) +- [Thinger docs](https://docs.thinger.io) \ No newline at end of file From a9c990a54d724e898db35005429f7ff0d3c0e01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 26 Mar 2026 11:35:09 +0100 Subject: [PATCH 5/5] Create plugin.json for milesight-iot-am107 --- milesight-iot-am107/plugin.json | 1068 +++++++++++++++++++++++++++++++ 1 file changed, 1068 insertions(+) create mode 100644 milesight-iot-am107/plugin.json diff --git a/milesight-iot-am107/plugin.json b/milesight-iot-am107/plugin.json new file mode 100644 index 000000000..436a7f3a9 --- /dev/null +++ b/milesight-iot-am107/plugin.json @@ -0,0 +1,1068 @@ +{ + "name": "milesight_iot_am107", + "version": "1.0.0", + "description": "Ambience Monitoring Sensors", + "author": "Thinger.io", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/thinger-io/plugins.git", + "directory": "milesight-iot-am107" + }, + "metadata": { + "name": "Milesight-Iot AM107", + "description": "Ambience Monitoring Sensors", + "image": "assets/am107.png", + "category": "devices", + "vendor": "milesight-iot" + }, + "resources": { + "products": [ + { + "description": "Ambience Monitoring Sensors", + "enabled": true, + "name": "Milesight-Iot AM107", + "product": "milesight_iot_am107", + "profile": { + "api": { + "downlink": { + "enabled": true, + "handle_connectivity": false, + "request": { + "data": { + "path": "/downlink", + "payload": "{\r\n \"data\" : \"{{payload.data=\"\"}}\",\r\n \"port\" : {{payload.port=2}},\r\n \"priority\": {{payload.priority=3}},\r\n \"confirmed\" : {{payload.confirmed=false}},\r\n \"uplink\" : {{property.uplink}} \r\n}", + "payload_function": "", + "payload_type": "", + "plugin": "{{property.uplink.source}}", + "target": "plugin_endpoint" + } + }, + "response": { + "data": { + "source": "request_response" + } + } + }, + "uplink": { + "enabled": true, + "handle_connectivity": true, + "request": { + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource_stream": "uplink", + "target": "resource_stream" + } + }, + "response": { + "data": { + "source": "request_response" + } + } + } + }, + "autoprovisions": { + "device_autoprovisioning": { + "config": { + "mode": "pattern", + "pattern": "am107_.*" + }, + "enabled": true + } + }, + "buckets": { + "milesight_am107_data": { + "backend": "mongodb", + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource_stream": "uplink_decoded", + "target": "resource_stream" + }, + "enabled": true, + "retention": { + "period": 3, + "unit": "months" + }, + "tags": [] + } + }, + "code": { + "code": "function decodeThingerUplink(thingerData) {\n // 0. If data has already been decoded, we will return it\n if (thingerData.decodedPayload) return thingerData.decodedPayload;\n \n // 1. Extract and Validate Input\n // We need 'payload' (hex string) and 'fPort' (integer)\n const hexPayload = thingerData.payload || \"\";\n const port = thingerData.fPort || 1;\n\n // 2. Convert Hex String to Byte Array\n const bytes = [];\n for (let i = 0; i < hexPayload.length; i += 2) {\n bytes.push(parseInt(hexPayload.substr(i, 2), 16));\n }\n\n // 3. Dynamic Function Detection and Execution\n \n // CASE A: (The Things Stack v3)\n if (typeof decodeUplink === 'function') {\n try {\n const input = {\n bytes: bytes,\n fPort: port\n };\n var result = decodeUplink(input);\n \n if (result.data) return result.data;\n\n return result; \n } catch (e) {\n console.error(\"Error inside decodeUplink:\", e);\n throw e;\n }\n }\n\n // CASE B: Legacy TTN (v2)\n else if (typeof Decoder === 'function') {\n try {\n return Decoder(bytes, port);\n } catch (e) {\n console.error(\"Error inside Decoder:\", e);\n throw e;\n }\n }\n\n // CASE C: No decoder found\n else {\n throw new Error(\"No compatible TTN decoder function (decodeUplink or Decoder) found in scope.\");\n }\n}\n\n\n// TTN decoder\n\nfunction decodeUplink(input) {\n var res = Decoder(input.bytes, input.fPort);\n if (res.error) {\n return {\n errors: [res.error],\n };\n }\n return {\n data: res,\n };\n}\n\n/**\n * Payload Decoder for The Things Network\n * \n * Copyright 2021 Milesight IoT\n * \n * @product AM104 / AM107\n */\nfunction Decoder(bytes, port) {\n var decoded = {};\n\n for (var i = 0; i < bytes.length;) {\n var channel_id = bytes[i++];\n var channel_type = bytes[i++];\n // BATTERY\n if (channel_id === 0x01 && channel_type === 0x75) {\n decoded.battery = bytes[i];\n i += 1;\n }\n // TEMPERATURE\n else if (channel_id === 0x03 && channel_type === 0x67) {\n // ℃\n decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;\n i += 2;\n\n // ℉\n // decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10 * 1.8 + 32;\n // i +=2;\n }\n // HUMIDITY\n else if (channel_id === 0x04 && channel_type === 0x68) {\n decoded.humidity = bytes[i] / 2;\n i += 1;\n }\n // PIR\n else if (channel_id === 0x05 && channel_type === 0x6A) {\n decoded.activity = readUInt16LE(bytes.slice(i, i + 2));\n i += 2;\n }\n // LIGHT\n else if (channel_id === 0x06 && channel_type === 0x65) {\n decoded.illumination = readUInt16LE(bytes.slice(i, i + 2));\n decoded.infrared_and_visible = readUInt16LE(bytes.slice(i + 2, i + 4));\n decoded.infrared = readUInt16LE(bytes.slice(i + 4, i + 6));\n i += 6;\n }\n // CO2\n else if (channel_id === 0x07 && channel_type === 0x7D) {\n decoded.co2 = readUInt16LE(bytes.slice(i, i + 2));\n i += 2;\n }\n // TVOC\n else if (channel_id === 0x08 && channel_type === 0x7D) {\n decoded.tvoc = readUInt16LE(bytes.slice(i, i + 2));\n i += 2;\n }\n // PRESSURE\n else if (channel_id === 0x09 && channel_type === 0x73) {\n decoded.pressure = readUInt16LE(bytes.slice(i, i + 2)) / 10;\n i += 2;\n } else {\n break;\n }\n }\n\n return decoded;\n}\n\n/* ******************************************\n* bytes to number\n********************************************/\nfunction readUInt16LE(bytes) {\n var value = (bytes[1] << 8) + bytes[0];\n return value & 0xffff;\n}\n\nfunction readInt16LE(bytes) {\n var ref = readUInt16LE(bytes);\n return ref > 0x7fff ? ref - 0x10000 : ref;\n}\n", + "environment": "javascript", + "storage": "", + "version": "1.0" + }, + "properties": { + "uplink": { + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource": "uplink", + "source": "resource", + "update": "events" + }, + "default": { + "source": "value" + }, + "enabled": true + } + } + }, + "_resources": { + "properties": [ + { + "property": "dashboard", + "value": { + "tabs": [ + { + "name": "Environment", + "widgets": [ + { + "layout": { + "col": 0, + "row": 0, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Temperature" + }, + "properties": { + "decimalPlaces": 2, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "ºC", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#d1311f", + "name": "Temperature", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 0, + "row": 5, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Humidity" + }, + "properties": { + "decimalPlaces": 2, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "%", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "humidity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#329fcd", + "name": "Humidity", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 2, + "row": 0, + "sizeX": 4, + "sizeY": 10 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Temperature & Humidity (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'area',\n stacked: false\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth'\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: [\n {\n title: {\n text: 'Temperature (ºC)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(2);\n }\n }\n },\n {\n opposite: true,\n title: {\n text: 'Humidity (%)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(2);\n }\n }\n }\n ],\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#d1311f", + "name": "Temperature", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "humidity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#329fcd", + "name": "Humidity", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + }, + { + "layout": { + "col": 0, + "row": 10, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Battery" + }, + "properties": { + "color": "#2ebd59", + "gradient": false, + "max": 100, + "min": 0, + "unit": "%" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "battery", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#2ebd59", + "name": "Battery", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "gauge" + }, + { + "layout": { + "col": 2, + "row": 10, + "sizeX": 4, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Battery (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'line'\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth'\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: {\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n },\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "battery", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#2ebd59", + "name": "Battery", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + } + ] + }, + { + "name": "Air Quality", + "widgets": [ + { + "layout": { + "col": 0, + "row": 0, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "CO2" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "ppm", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "co2", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e67e22", + "name": "CO2", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 0, + "row": 5, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "TVOC" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "ppb", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "tvoc", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#9b59b6", + "name": "TVOC", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 0, + "row": 10, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Pressure" + }, + "properties": { + "decimalPlaces": 1, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "hPa", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "pressure", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#34495e", + "name": "Pressure", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 2, + "row": 0, + "sizeX": 4, + "sizeY": 10 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "CO2 & TVOC (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'line',\n stacked: false\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth',\n width: 2\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: [\n {\n title: {\n text: 'CO2 (ppm)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n },\n {\n opposite: true,\n title: {\n text: 'TVOC (ppb)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n }\n ],\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "co2", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e67e22", + "name": "CO2", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "tvoc", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#9b59b6", + "name": "TVOC", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + }, + { + "layout": { + "col": 2, + "row": 10, + "sizeX": 4, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Pressure (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'line'\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth',\n width: 2\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: {\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(1);\n }\n }\n },\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "pressure", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#34495e", + "name": "Pressure", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + } + ] + }, + { + "name": "Light & Motion", + "widgets": [ + { + "layout": { + "col": 0, + "row": 0, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Illumination" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "lux", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "illumination", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#f1c40f", + "name": "Illumination", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 0, + "row": 5, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "PIR Activity" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "events", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "activity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#27ae60", + "name": "Activity", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 2, + "row": 0, + "sizeX": 4, + "sizeY": 10 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Illumination (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'area',\n stacked: false\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth',\n width: 2\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: {\n title: {\n text: 'Light (lux)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n },\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n },\n fill: {\n type: 'gradient',\n gradient: {\n shadeIntensity: 1,\n opacityFrom: 0.7,\n opacityTo: 0.3\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "illumination", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#f1c40f", + "name": "Illumination", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "infrared_and_visible", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e74c3c", + "name": "IR + Visible", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "infrared", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#95a5a6", + "name": "Infrared", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + }, + { + "layout": { + "col": 2, + "row": 10, + "sizeX": 4, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "PIR Activity (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'bar'\n },\n dataLabels: {\n enabled: false\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: {\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n },\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "activity", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#27ae60", + "name": "Activity", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + }, + { + "layout": { + "col": 0, + "row": 10, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Infrared" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "18px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "60px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "60px", + "textWeight": "font-light", + "unit": "lux", + "unitSize": "18px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_am107_data", + "mapping": "infrared", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#95a5a6", + "name": "Infrared", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + } + ] + } + ] + } + } + ] + } + } + ] + } +} \ No newline at end of file