diff --git a/_data/hardware-partners.yml b/_data/hardware-partners.yml
index dd95ac963e..d2b8979f43 100644
--- a/_data/hardware-partners.yml
+++ b/_data/hardware-partners.yml
@@ -558,6 +558,38 @@
want to focus on their own applications and core competencies rather than the
underlying hardware platform or production logistics when creating products for
the IoT.
+- name: Sensy32
+ type:
+ - Bluetooth LE
+ - Wi-Fi
+ industry:
+ - Smart Cities
+ - Agriculture
+ - Industrial Manufacturing
+ - Smart Buildings
+ - Energy Management
+ - Environmental Monitoring
+ use-case:
+ - Smart Energy
+ - Environment Monitoring
+ - Smart Retail
+ - Smart Farming
+ - Air Quality Monitoring
+ hardware-types:
+ - Microcontrollers
+ - Sensors
+ - Gateways
+ - Other devices
+ logo: /images/partners/sensy32-logo.svg
+ page: /partners/hardware/sensy32
+ site:
+ href: https://sensy32.io/
+ links:
+ single-board-computers-guides:
+ 0:
+ label: Connect Sensy32 to ThingsBoard
+ href: /docs/devices-library/sensy32/
+ description: All-in-One Sensor IoT Board with LCD designed for sensor enthusiasts, developers, and IoT creators. Powered by ESP32-S3 and packed with a wide array of sensors, it enables seamless monitoring, analysis, and visualization of real-world data. Backed by a robust ESP32-S3 Wifi and Bluetooth module, Sensy32 is not just a board; it's a gateway to endless possibilities.
- name: DECODE
type:
- GSM/GPRS
diff --git a/_data/pages_info.yml b/_data/pages_info.yml
index c5b254b214..c341e1627e 100644
--- a/_data/pages_info.yml
+++ b/_data/pages_info.yml
@@ -270,6 +270,9 @@
"/docs/devices-library/s26x-lorawan-temperature-sensor/":
url: "/docs/devices-library/s26x-lorawan-temperature-sensor/"
redirect_from: []
+"/docs/devices-library/sensy32/":
+ url: "/docs/devices-library/sensy32/"
+ redirect_from: []
"/docs/devices-library/socketsync-bluetooth-gateway/":
url: "/docs/devices-library/socketsync-bluetooth-gateway/"
redirect_from: []
@@ -1303,6 +1306,9 @@
"/docs/paas/devices-library/s26x-lorawan-temperature-sensor/":
url: "/docs/paas/devices-library/s26x-lorawan-temperature-sensor/"
redirect_from: []
+"/docs/paas/devices-library/sensy32/":
+ url: "/docs/paas/devices-library/sensy32/"
+ redirect_from: []
"/docs/paas/devices-library/socketsync-bluetooth-gateway/":
url: "/docs/paas/devices-library/socketsync-bluetooth-gateway/"
redirect_from: []
@@ -1673,6 +1679,9 @@
"/docs/paas/eu/devices-library/s26x-lorawan-temperature-sensor/":
url: "/docs/paas/eu/devices-library/s26x-lorawan-temperature-sensor/"
redirect_from: []
+"/docs/paas/eu/devices-library/sensy32/":
+ url: "/docs/paas/eu/devices-library/sensy32/"
+ redirect_from: []
"/docs/paas/eu/devices-library/socketsync-bluetooth-gateway/":
url: "/docs/paas/eu/devices-library/socketsync-bluetooth-gateway/"
redirect_from: []
@@ -3129,6 +3138,9 @@
"/docs/pe/devices-library/s26x-lorawan-temperature-sensor/":
url: "/docs/pe/devices-library/s26x-lorawan-temperature-sensor/"
redirect_from: []
+"/docs/pe/devices-library/sensy32/":
+ url: "/docs/pe/devices-library/sensy32/"
+ redirect_from: []
"/docs/pe/devices-library/socketsync-bluetooth-gateway/":
url: "/docs/pe/devices-library/socketsync-bluetooth-gateway/"
redirect_from: []
diff --git a/_includes/docs/devices-library/guides/sensy32.md b/_includes/docs/devices-library/guides/sensy32.md
new file mode 100644
index 0000000000..bec93f707c
--- /dev/null
+++ b/_includes/docs/devices-library/guides/sensy32.md
@@ -0,0 +1,311 @@
+
+{% assign deviceName = page.title | remove: "How to connect " | remove: "to ThingsBoard?" %}
+{% assign deviceVendorLink = "https://www.tindie.com/products/sensy32/sensy32-all-in-one-sensor-iot-board-with-lcd/" %}
+{% assign thingsboardHost = "https://" | append: hostName %}
+{% assign prerequisites = '
+- ' | append: deviceName | append: '
+- A smartphone with the Ezurio Xbit app for configuration of the RS26x ([Android](https://play.google.com/store/apps/details?id=com.rfpros.xbitmobile&hl=en_US){:target="_blank"}/[iOS](https://apps.apple.com/us/app/canvas-xbit-mobile/id6478117073){:target="_blank"})
+- LoRaWAN gateway (e.g. [Ezurio RG1xx](https://www.ezurio.com/iot-devices/lorawan-iot-devices/sentrius-rg1xx-lorawan-gateway-wi-fi-ethernet-optional-lte-us-only){:target="_blank"})
+- [The Things Stack Community Edition account](https://www.thethingsnetwork.org/){: target="_blank"}
+ '
+ %}
+
+## Introduction
+
+{: style="float: left; max-width: 200px; max-height: 200px; margin: 0px 10px 0px 0px"}
+[The Sensy32]({{deviceVendorLink}}){: target="_blank"} is an IoT board designed for sensor enthusiasts, developers, and IoT creators.
+Powered by ESP32-S3 and packed with a wide array of sensors, it enables seamless monitoring, analysis, and visualization of real-world data.
+
+
+
+The Sensy32 supports Wi-Fi and Bluetooth connectivity, complemented by two USB Type-C ports that enable charging and power supply, programming and firmware uploads, data communication, peripheral connectivity, and powering external devices such as sensors.
+
+
+
+The Sensy32 board includes the following components and sensors:
+- UV Light Sensor
+- IR Motion and Human Presence Sensor
+- Humidity and Temperature Sensor
+- Altitude and Pressure Sensor
+- 9-DOF Orientation IMU Sensor (Accelerometer/Magnetometer/Gyro)
+- Microcontroller (ESP32-S3 Wi-Fi and Bluetooth)
+- 32Mb Nor Flash Memory
+- USB to Serial Converter
+- Light Intensity Sensor
+- Battery Charger
+- RGB LEDs
+- MEMS Microphone
+- A built-in LCD screen that allows real-time monitoring and control.
+
+In this guide, we will learn how to create a device on Thingsboard, install required libraries and tools.
+After this we will modify our code and upload it to the device, and check the results of our coding and check data on ThingsBoard using imported dashboard.
+
+## Prerequisites
+
+To continue with this guide, we will need the following:
+- Editor [Arduino IDE](https://www.arduino.cc/en/software){:target="_blank"}
+- [CP210xVCP Driver](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers){:target="_blank"}
+- Sensy32 board (you can get it from [Tindie](https://www.tindie.com/products/sensy32/sensy32-all-in-one-sensor-iot-board-with-lcd/){:target="_blank"} or [Elecrow](https://www.elecrow.com/){:target="_blank"})
+- [ThingsBoard account]({{ thingsboardHost }}){: target="_blank"}
+
+## Install required libraries and tools
+
+Open the [Arduino IDE](https://www.arduino.cc/en/software){:target="_blank"} and install the board package:
+
+**1.** Go to **File > Preferences** and add the following URL to the **Additional Boards Manager URLs** field:
+
+```text
+https://dl.espressif.com/dl/package_esp32_index.json
+```
+{:.copy-code}
+
+{% assign preferences = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/preferences.png
+ title: Go to **File > Preferences** and add the following URL to the **Additional Boards Manager URLs** field: https://dl.espressif.com/dl/package_esp32_index.json
+'
+%}
+
+{% include images-gallery.liquid imageCollection=preferences %}
+
+**2.** Go to **Tools > Board > Board Manager** and install the **ESP32 by Espressif Systems** board.
+
+{% assign preferences = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager.png
+ title: Then go to **Tools > Board > Board Manager** and install the **ESP32 by Espressif Systems** board.
+'
+%}
+
+{% include images-gallery.liquid imageCollection=preferences %}
+
+
+
+**3.** After the installation is complete, select the board by Board menu: **Tools > Board > ESP32 > ESP32S3 Dev Module**.
+
+Connect the Sensy32 board to the computer using a USB cable and select the port for the device: **Tools > Port > /dev/ttyUSB0**.
+
+Port depends on operation system and may be different:
+- for Linux it will be /dev/ttyUSBX
+- for MacOS it will be usb.serialX.. or usb.modemX..
+- for Windows - COMX.
+
+- Where X - some number, that was assigned by your system.
+
+{% assign preferences = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module.png
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port.png
+'
+%}
+
+{% include images-gallery.liquid showListImageTitles="true" imageCollection=preferences %}
+
+**4.** To install the needed libraries - we will need to do the following steps:
+- Go to the **Tools** tab and click on **Manage libraries**.
+- Enter the name of the following libraries in the search bar and click **INSTALL**: "ThingsBoard", "ss_oled", "Adafruit TSL259", "SparkFun BNO08x", "SparkFun STHS34PF80", "BMP388_DEV", "SparkFun BME280", "Adafruit LTR390 Library".
+- If prompted to install library dependencies, simply click **Install All** to ensure all necessary libraries are installed.
+
+{% assign manageLibraries = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/manage-libraries.png
+ title: Go to the **Tools** tab and click on **Manage libraries**.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/install-all.png
+ title: If prompted to install library dependencies, simply click **Install All** to ensure all necessary libraries are installed.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-1.png
+ title: **ThingsBoard**: This is the ThingsBoard Arduino SDK, used to connect with the ThingsBoard Platform.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-2.png
+ title: **ss_oled.h**: This library is used to configure and display data on the LCD screen.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-3.png
+ title: **Adafruit_LTR390.h**: A library for communicating with the Adafruit_LTR390 UV sensor.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-4.png
+ title: **SparkFun_BNO08x_Arduino_Library.h**: Simplifies interfacing with BNO08x series sensors in Arduino projects.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-5.png
+ title: **SparkFun_STHS34PF80_Arduino_Library.h**: Simplifies interfacing with the STHS34PF80 sensor in Arduino projects.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-6.png
+ title: **BMP388_DEV.h**: This library facilitates interaction with the BMP388 sensor module.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-7.png
+ title: **SparkFunBME280.h**: This library helps work with the SparkFun BME280 sensor, allowing you to read temperature, humidity, and pressure data.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/library-8.png
+ title: **Adafruit_TSL2591.h**: A library for communicating with the Adafruit_TSL2591 Light sensor.
+'
+%}
+
+{% include images-gallery.liquid imageCollection=manageLibraries %}
+
+Let's dive deeper to see what are these libraries are used for:
+- **ThingsBoard**: This is the ThingsBoard Arduino SDK, used to connect with the ThingsBoard Platform.
+- **ss_oled.h**: This library is used to configure and display data on the LCD screen.
+- **SparkFunBME280.h**: This library helps work with the SparkFun BME280 sensor, allowing you to read temperature, humidity, and pressure data.
+- **BMP388_DEV.h**: This library facilitates interaction with the BMP388 sensor module.
+- **Adafruit_LTR390.h**: A library for communicating with the Adafruit_LTR390 UV sensor.
+- **Adafruit_TSL2591.h**: A library for communicating with the Adafruit_TSL2591 Light sensor.
+- **Adafruit_Sensor.h**: Provides common functionality for working without various sensors, simplifying sensor integration in projects.
+- **SparkFun_BNO08x_Arduino_Library.h**: Simplifies interfacing with BNO08x series sensors in Arduino projects.
+- **SparkFun_STHS34PF80_Arduino_Library.h**: Simplifies interfacing with the STHS34PF80 sensor in Arduino projects.
+
+{% capture difference %}
+**Please note:** All provided code examples require ThingsBoard Library version 0.14.0
+{% endcapture %}
+{% include templates/info-banner.md content=difference %}
+
+At this point, we have installed all required libraries and tools.
+
+## Create device on ThingsBoard
+
+For simplicity, we will provide the device manually using the UI.
+
+{% assign createDeviceOnThingsBoardPE = '
+ ===
+ image: /images/helloworld/getting-started-pe/hello-world-1-1-provision-device-1-pe.png
+ title: Log in to your ThingsBoard instance and go to the **Entities > Devices** section.
+ ===
+ image: /images/helloworld/getting-started-pe/hello-world-1-1-provision-device-2-pe.png
+ title: Click the "**+**" button in the top-right corner and select Add new device.
+ ===
+ image: /images/helloworld/getting-started-pe/hello-world-1-1-provision-device-3-pe.png
+ title: Enter a device name, for example "My New Device". You can leave all other fields with their default values. Click **Add** to add the device.
+ ===
+ image: /images/helloworld/getting-started-pe/hello-world-1-1-provision-device-4-pe.png
+ title: Your first device has been added.
+'
+%}
+
+{% assign createDeviceOnThingsBoardCE = '
+ ===
+ image: /images/helloworld/getting-started-ce/hello-world-1-1-provision-device-1-ce.png
+ title: Log in to your ThingsBoard instance and go to the **Entities > Devices** section.
+ ===
+ image: /images/helloworld/getting-started-ce/hello-world-1-1-provision-device-2-ce.png
+ title: Click the "**+**" button in the top-right corner and select Add new device.
+ ===
+ image: /images/helloworld/getting-started-ce/hello-world-1-1-provision-device-3-ce.png
+ title: Enter a device name, for example "My New Device". You can leave all other fields with their default values. Click **Add** to add the device.
+ ===
+ image: /images/helloworld/getting-started-ce/hello-world-1-1-provision-device-4-ce.png
+ title: Your first device has been added.
+'
+%}
+
+{% if page.docsPrefix == "pe/" or page.docsPrefix contains "paas/" or docsPrefix == "pe/" or docsPrefix contains "paas/" %}
+{% include images-gallery.liquid showListImageTitles="true" imageCollection=createDeviceOnThingsBoardPE %}
+{% else %}
+{% include images-gallery.liquid showListImageTitles="true" imageCollection=createDeviceOnThingsBoardCE %}
+{% endif %}
+
+
+## Connect device to ThingsBoard
+
+To connect your device, you’ll first need to get its credentials. While ThingsBoard supports a variety of device credentials, for this guide, we will use the default auto-generated credentials, which is an access token.
+
+{% assign connectDevicePE = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe.png
+ title: Click on the device row in the table to open device details.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe.png
+ title: Click **Copy access token**. The token will be copied to your clipboard. Please save it in a safe place.
+'
+%}
+
+{% include images-gallery.liquid showListImageTitles="true" imageCollection=connectDevicePE %}
+
+Now it's time to program the board to read data, display it on the Sensy board LCD screen, and connect to ThingsBoard.
+
+To do this, you can use the code below. It contains all required functionality for this guide.
+
+> Click to download the **source code**: [thingsboard.ino](/docs/devices-library/resources/sensy32/thingsboard.ino){:target="_blank" download="thingsboard.ino"}
+
+{% capture difference %}
+⚠️ Don't forget to replace placeholders with your real WiFi network SSID, password, ThingsBoard device access token.
+{% endcapture %}
+{% include templates/info-banner.md content=difference %}
+
+```text
+constexpr char WIFI_SSID[] = "YOUR_WIFI_SSID";
+
+constexpr char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
+
+constexpr char TOKEN[] = "YOUR_ACCESS_TOKEN";
+```
+
+Then upload the code to the device by pressing the Upload button or keyboard combination Ctrl+U.
+
+{% assign upload = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/upload.png
+'
+%}
+
+{% include images-gallery.liquid imageCollection=upload %}
+
+If you cannot upload the code and receive an error: `Property 'upload.tool.serial' is undefined` you can do the following:
+
+{% assign programmer = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer.png
+ title: Go to **Tools > Programmer** and select **Esptool** as a programmer.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer.png
+ title: Go to **Sketch > Upload Using Programmer**.
+'
+%}
+
+{% include images-gallery.liquid showListImageTitles="true" imageCollection=programmer %}
+
+## Check data on ThingsBoard
+
+ThingsBoard provides the ability to create and customize interactive visualizations (dashboards) for monitoring and managing data and devices.
+
+Through ThingsBoard dashboards, you can efficiently manage and monitor your IoT devices and data. So, we will create the dashboard for our device.
+
+To do this, you can either create your own dashboard using custom widgets or import a ready-made one.
+
+In this example we will upload a ready-to-use dashboard. You can also customize it or create your own.
+
+To import the ready-to-use dashboard, follow these steps:
+- First download the [My Dashboard](/docs/devices-library/resources/dashboards/sensy32/sensy32-demo-dashboard.json){:target="_blank" download="sensy32-demo-dashboard.json"} file.
+
+{% assign importDashboard = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe.png
+ title: Navigate to the **Dashboards** page. Click on the "**+**" icon in the top right corner. Select **Import dashboard**.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe.png
+ title: In the dashboard import window, **upload the JSON file** and click the **Import** button.
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe.png
+ title: Dashboard has been imported.
+'
+%}
+
+{% include images-gallery.liquid showListImageTitles="true" imageCollection=importDashboard %}
+
+"sensy32-demo-dashboard" structure:
+- To check the data from our device we need to open the imported dashboard by clicking on it in the table.
+- The view of "sensy32-demo-dashboard" containing widgets representing the following telemetry values: **temperature, humidity, altitude, pressure, motion, uv, accelerometer (valX, valY, and valZ), orientation (quatI, quatJ, quatK, quatReal, and quatRadianAccuracy), light (ir, full, visible, lux)**.
+- You can also add a Widget to display device & Wi-Fi information.
+
+{% assign myDashboard = '
+ ===
+ image: /images/devices-library/ready-to-go-devices/sensy32/my-dashboard.png
+'
+%}
+
+{% include images-gallery.liquid imageCollection=myDashboard %}
+
+## Conclusion
+
+Now you can easily connect your Sensy32 and start sending data to ThingsBoard.
+
+To go further, explore the [ThingsBoard documentation](https://thingsboard.io/docs/pe/){:target="_blank"} to learn more about key features, such as creating [dashboards](https://thingsboard.io/docs/pe/user-guide/dashboards/){:target="_blank"} to visualize your telemetry, or setting up [alarm rules](https://thingsboard.io/docs/pe/user-guide/alarm-rules/){:target="_blank"} to monitor device behavior in real time.
\ No newline at end of file
diff --git a/docs/devices-library/resources/dashboards/sensy32/sensy32-demo-dashboard.json b/docs/devices-library/resources/dashboards/sensy32/sensy32-demo-dashboard.json
new file mode 100644
index 0000000000..69b3db7f52
--- /dev/null
+++ b/docs/devices-library/resources/dashboards/sensy32/sensy32-demo-dashboard.json
@@ -0,0 +1,2958 @@
+{
+ "title": "Demo dashboard",
+ "image": null,
+ "mobileHide": false,
+ "mobileOrder": null,
+ "configuration": {
+ "description": "",
+ "widgets": {
+ "b3d77137-f9a4-a0ee-1851-faaeb4d9d98c": {
+ "typeFullFqn": "system.radar",
+ "type": "latest",
+ "sizeX": 5,
+ "sizeY": 4,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "quatI",
+ "type": "timeseries",
+ "label": "quatI",
+ "color": "#08872B",
+ "settings": {},
+ "_hash": 0.5382726216373133,
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "quatJ",
+ "type": "timeseries",
+ "label": "quatJ",
+ "color": "#FF4D5A",
+ "settings": {},
+ "_hash": 0.9340401269489176,
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "quatK",
+ "type": "timeseries",
+ "label": "quatK",
+ "color": "#FFDE30",
+ "settings": {},
+ "_hash": 0.7778710881025356,
+ "aggregationType": "NONE",
+ "units": null,
+ "decimals": null,
+ "funcBody": null,
+ "usePostProcessing": null,
+ "postFuncBody": null
+ },
+ {
+ "name": "quatReal",
+ "type": "timeseries",
+ "label": "quatReal",
+ "color": "#4907FF",
+ "settings": {},
+ "_hash": 0.7833936202076677,
+ "decimals": 0
+ },
+ {
+ "name": "quatRadianAccuracy",
+ "type": "timeseries",
+ "label": "quatRadianAccuracy",
+ "color": "#F407FF",
+ "settings": {},
+ "_hash": 0.07678160705899517,
+ "decimals": 0
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "timewindow": {
+ "displayValue": "",
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 1,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideQuickInterval": false
+ },
+ "history": {
+ "historyType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "fixedTimewindow": {
+ "startTimeMs": 1762782461058,
+ "endTimeMs": 1762868861058
+ },
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideFixedInterval": false,
+ "hideQuickInterval": false
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": null,
+ "padding": "0px",
+ "settings": {
+ "sortSeries": false,
+ "animation": {
+ "animation": true,
+ "animationThreshold": 2000,
+ "animationDuration": 1000,
+ "animationEasing": "cubicOut",
+ "animationDelay": 0,
+ "animationDurationUpdate": 500,
+ "animationEasingUpdate": "cubicOut",
+ "animationDelayUpdate": 0
+ },
+ "showLegend": true,
+ "legendPosition": "bottom",
+ "legendLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "legendLabelColor": "rgba(0, 0, 0, 0.38)",
+ "legendValueFont": {
+ "family": "Roboto",
+ "size": 14,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "20px"
+ },
+ "legendValueColor": "rgba(0, 0, 0, 0.87)",
+ "legendShowTotal": true,
+ "showTooltip": true,
+ "tooltipValueType": "percentage",
+ "tooltipValueDecimals": 0,
+ "tooltipValueFont": {
+ "family": "Roboto",
+ "size": 13,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "16px"
+ },
+ "tooltipValueColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipBackgroundColor": "rgba(255, 255, 255, 0.76)",
+ "tooltipBackgroundBlur": 4,
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "padding": "12px",
+ "shape": "polygon",
+ "color": "var(--tb-primary-500)",
+ "showLine": true,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": true,
+ "pointShape": "circle",
+ "pointSize": 4,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 80,
+ "end": 20
+ }
+ },
+ "normalizeAxes": false,
+ "axisShowLabel": true,
+ "axisLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "axisShowTickLabels": false,
+ "axisTickLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "axisTickLabelColor": "rgba(0, 0, 0, 0.54)"
+ },
+ "title": "Orientation",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "units": null,
+ "decimals": 0,
+ "useDashboardTimewindow": true,
+ "showLegend": false,
+ "widgetStyle": {},
+ "actions": {
+ "headerButton": []
+ },
+ "configMode": "basic",
+ "displayTimewindow": true,
+ "margin": "0px",
+ "borderRadius": "",
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "titleFont": {
+ "size": 16,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal",
+ "lineHeight": "24px"
+ },
+ "titleIcon": "radar",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "iconSize": "24px",
+ "timewindowStyle": {
+ "showIcon": false,
+ "iconSize": "24px",
+ "icon": null,
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "400",
+ "style": "normal",
+ "lineHeight": "16px"
+ },
+ "color": "rgba(0, 0, 0, 0.38)",
+ "displayTypePrefix": true
+ },
+ "enableDataExport": false,
+ "titleColor": null
+ },
+ "row": 0,
+ "col": 0,
+ "id": "b3d77137-f9a4-a0ee-1851-faaeb4d9d98c"
+ },
+ "9002e18c-2d4d-edb4-b94c-f04ffcf7e481": {
+ "typeFullFqn": "system.simple_uv_index_chart_card",
+ "type": "timeseries",
+ "sizeX": 4.5,
+ "sizeY": 2,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "uv",
+ "type": "timeseries",
+ "label": "UV Index",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "settings": {},
+ "_hash": 0.7249489000094165
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ },
+ "latestDataKeys": [
+ {
+ "name": "uv",
+ "type": "timeseries",
+ "label": "Latest",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "settings": {},
+ "_hash": 0.7249489000094165,
+ "units": null,
+ "decimals": null
+ }
+ ]
+ }
+ ],
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": null,
+ "padding": "0",
+ "settings": {
+ "layout": "left",
+ "autoScale": true,
+ "showValue": true,
+ "valueFont": {
+ "family": "Roboto",
+ "size": 28,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "32px"
+ },
+ "valueColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": 0,
+ "to": 2,
+ "color": "#80C32C"
+ },
+ {
+ "from": 2,
+ "to": 5,
+ "color": "#FFA600"
+ },
+ {
+ "from": 5,
+ "to": 7,
+ "color": "#F36900"
+ },
+ {
+ "from": 7,
+ "to": 10,
+ "color": "#F04022"
+ },
+ {
+ "from": 10,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "padding": "12px"
+ },
+ "title": "UV Index",
+ "dropShadow": true,
+ "enableFullscreen": false,
+ "titleStyle": null,
+ "mobileHeight": null,
+ "configMode": "basic",
+ "actions": {},
+ "showTitleIcon": true,
+ "titleIcon": "light_mode",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "titleFont": {
+ "size": 16,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal",
+ "lineHeight": "24px"
+ },
+ "iconSize": "18px",
+ "titleTooltip": "",
+ "widgetStyle": {},
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "useDashboardTimewindow": true,
+ "decimals": 0,
+ "titleColor": "rgba(0, 0, 0, 0.87)",
+ "borderRadius": null,
+ "units": null,
+ "displayTimewindow": true,
+ "timewindow": {
+ "hideAggregation": false,
+ "hideAggInterval": false,
+ "hideTimezone": false,
+ "selectedTab": 1,
+ "history": {
+ "historyType": 2,
+ "timewindowMs": 60000,
+ "interval": 43200000,
+ "fixedTimewindow": {
+ "startTimeMs": 1697382151041,
+ "endTimeMs": 1697468551041
+ },
+ "quickInterval": "CURRENT_MONTH_SO_FAR"
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "timewindowStyle": {
+ "showIcon": false,
+ "iconSize": "24px",
+ "icon": "query_builder",
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "400",
+ "style": "normal",
+ "lineHeight": "16px"
+ },
+ "color": "rgba(0, 0, 0, 0.38)",
+ "displayTypePrefix": true
+ },
+ "enableDataExport": false
+ },
+ "row": 0,
+ "col": 0,
+ "id": "9002e18c-2d4d-edb4-b94c-f04ffcf7e481"
+ },
+ "1dd20baf-c3dc-318b-9d9a-79b298feee46": {
+ "typeFullFqn": "system.indoor_humidity_card",
+ "type": "latest",
+ "sizeX": 3,
+ "sizeY": 3,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "humidity",
+ "type": "timeseries",
+ "label": "Humidity",
+ "color": "#2196f3",
+ "settings": {},
+ "_hash": 0.41089488883169234
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "timewindow": {
+ "displayValue": "",
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 1,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideQuickInterval": false
+ },
+ "history": {
+ "historyType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "fixedTimewindow": {
+ "startTimeMs": 1762781255091,
+ "endTimeMs": 1762867655091
+ },
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideFixedInterval": false,
+ "hideQuickInterval": false
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "showTitle": false,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "labelPosition": "top",
+ "layout": "square",
+ "showLabel": true,
+ "labelFont": {
+ "family": "Roboto",
+ "size": 16,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "labelColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "showIcon": true,
+ "iconSize": 40,
+ "iconSizeUnit": "px",
+ "icon": "mdi:water-percent",
+ "iconColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 30,
+ "color": "#FFA600"
+ },
+ {
+ "from": 30,
+ "to": 60,
+ "color": "#3FA71A"
+ },
+ {
+ "from": 60,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "valueFont": {
+ "family": "Roboto",
+ "size": 52,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "valueColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 30,
+ "color": "#FFA600"
+ },
+ {
+ "from": 30,
+ "to": 60,
+ "color": "#3FA71A"
+ },
+ {
+ "from": 60,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ }
+ },
+ "showDate": true,
+ "dateFormat": {
+ "format": null,
+ "lastUpdateAgo": true,
+ "custom": false
+ },
+ "dateFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "dateColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.38)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "autoScale": true,
+ "padding": ""
+ },
+ "title": "Humidity card",
+ "dropShadow": true,
+ "enableFullscreen": false,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "units": "g/m³",
+ "decimals": 0,
+ "useDashboardTimewindow": true,
+ "showLegend": false,
+ "widgetStyle": {},
+ "actions": {},
+ "configMode": "basic",
+ "displayTimewindow": true,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "titleFont": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1.6"
+ },
+ "titleIcon": "",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "iconSize": "14px",
+ "timewindowStyle": {
+ "showIcon": true,
+ "iconSize": "14px",
+ "icon": "query_builder",
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1"
+ },
+ "color": null
+ },
+ "enableDataExport": false
+ },
+ "row": 0,
+ "col": 0,
+ "id": "1dd20baf-c3dc-318b-9d9a-79b298feee46"
+ },
+ "a2a042dc-f5d1-2a3d-02a3-b44f8573003d": {
+ "typeFullFqn": "system.indoor_temperature_card",
+ "type": "latest",
+ "sizeX": 3,
+ "sizeY": 3,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "temperature",
+ "type": "timeseries",
+ "label": "Temperature",
+ "color": "#2196f3",
+ "settings": {},
+ "_hash": 0.3566427098482704
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "timewindow": {
+ "displayValue": "",
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 1,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideQuickInterval": false
+ },
+ "history": {
+ "historyType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "fixedTimewindow": {
+ "startTimeMs": 1762781224632,
+ "endTimeMs": 1762867624632
+ },
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideFixedInterval": false,
+ "hideQuickInterval": false
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "showTitle": false,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "labelPosition": "top",
+ "layout": "square",
+ "showLabel": true,
+ "labelFont": {
+ "family": "Roboto",
+ "size": 16,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "labelColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "showIcon": true,
+ "iconSize": 40,
+ "iconSizeUnit": "px",
+ "icon": "thermostat",
+ "iconColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 18,
+ "color": "#234CC7"
+ },
+ {
+ "from": 18,
+ "to": 24,
+ "color": "#3FA71A"
+ },
+ {
+ "from": 24,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "valueFont": {
+ "family": "Roboto",
+ "size": 52,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "valueColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 18,
+ "color": "#234CC7"
+ },
+ {
+ "from": 18,
+ "to": 24,
+ "color": "#3FA71A"
+ },
+ {
+ "from": 24,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ }
+ },
+ "showDate": true,
+ "dateFormat": {
+ "format": null,
+ "lastUpdateAgo": true,
+ "custom": false
+ },
+ "dateFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "dateColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.38)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "autoScale": true,
+ "padding": ""
+ },
+ "title": "Temperature card",
+ "dropShadow": true,
+ "enableFullscreen": false,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "units": "°C",
+ "decimals": 0,
+ "useDashboardTimewindow": true,
+ "showLegend": false,
+ "widgetStyle": {},
+ "actions": {},
+ "configMode": "basic",
+ "displayTimewindow": true,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "titleFont": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1.6"
+ },
+ "titleIcon": "",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "iconSize": "14px",
+ "timewindowStyle": {
+ "showIcon": true,
+ "iconSize": "14px",
+ "icon": "query_builder",
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1"
+ },
+ "color": null
+ },
+ "enableDataExport": false
+ },
+ "row": 0,
+ "col": 0,
+ "id": "a2a042dc-f5d1-2a3d-02a3-b44f8573003d"
+ },
+ "8697d2b8-d2b5-f277-2f37-a9161c7522c3": {
+ "typeFullFqn": "system.line_chart",
+ "type": "timeseries",
+ "sizeX": 8,
+ "sizeY": 5,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "valX",
+ "type": "timeseries",
+ "label": "X",
+ "color": "#2196f3",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.9246418463778795,
+ "units": null,
+ "decimals": 0
+ },
+ {
+ "name": "valY",
+ "type": "timeseries",
+ "label": "Y",
+ "color": "#4caf50",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.272962120868969,
+ "decimals": 0
+ },
+ {
+ "name": "valZ",
+ "type": "timeseries",
+ "label": "Z",
+ "color": "#F5DD00",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.6515500618227403,
+ "decimals": 0
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ },
+ "latestDataKeys": []
+ }
+ ],
+ "timewindow": {
+ "hideAggregation": false,
+ "hideAggInterval": false,
+ "hideTimezone": false,
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 0,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "interval": 1000
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ },
+ "timezone": null
+ },
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "showLegend": true,
+ "legendConfig": {
+ "direction": "column",
+ "position": "top",
+ "sortDataKeys": false,
+ "showMin": false,
+ "showMax": false,
+ "showAvg": true,
+ "showTotal": false,
+ "showLatest": false,
+ "valueFormat": null
+ },
+ "thresholds": [],
+ "dataZoom": true,
+ "stack": false,
+ "yAxis": {
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "left",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)"
+ },
+ "xAxis": {
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "bottom",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 10,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "ticksFormat": {},
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)"
+ },
+ "legendLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "legendLabelColor": "rgba(0, 0, 0, 0.76)",
+ "showTooltip": true,
+ "tooltipTrigger": "axis",
+ "tooltipValueFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "16px"
+ },
+ "tooltipValueColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipShowDate": true,
+ "tooltipDateFormat": {
+ "format": null,
+ "lastUpdateAgo": false,
+ "custom": false,
+ "auto": true,
+ "autoDateFormatSettings": {}
+ },
+ "tooltipDateFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "tooltipDateColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipDateInterval": true,
+ "tooltipBackgroundColor": "rgba(255, 255, 255, 0.76)",
+ "tooltipBackgroundBlur": 4,
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "yAxes": {
+ "default": {
+ "units": null,
+ "decimals": 0,
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "left",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "ticksFormatter": null,
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)",
+ "id": "default",
+ "order": 0
+ }
+ },
+ "noAggregationBarWidthSettings": {
+ "strategy": "group",
+ "groupWidth": {
+ "relative": true,
+ "relativeWidth": 2,
+ "absoluteWidth": 1000
+ },
+ "barWidth": {
+ "relative": true,
+ "relativeWidth": 2,
+ "absoluteWidth": 1000
+ }
+ },
+ "animation": {
+ "animation": true,
+ "animationThreshold": 2000,
+ "animationDuration": 500,
+ "animationEasing": "cubicOut",
+ "animationDelay": 0,
+ "animationDurationUpdate": 300,
+ "animationEasingUpdate": "cubicOut",
+ "animationDelayUpdate": 0
+ },
+ "padding": "12px",
+ "comparisonEnabled": false,
+ "timeForComparison": "previousInterval",
+ "comparisonCustomIntervalValue": 7200000,
+ "comparisonXAxis": {
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "top",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 10,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "ticksFormat": {},
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)"
+ },
+ "grid": {
+ "show": false,
+ "backgroundColor": null,
+ "borderWidth": 1,
+ "borderColor": "#ccc"
+ },
+ "legendColumnTitleFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "legendColumnTitleColor": "rgba(0, 0, 0, 0.38)",
+ "legendValueFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "16px"
+ },
+ "legendValueColor": "rgba(0, 0, 0, 0.87)",
+ "tooltipLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "tooltipLabelColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipHideZeroValues": null,
+ "tooltipStackedShowTotal": false
+ },
+ "title": "Accelerometer",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "titleStyle": null,
+ "mobileHeight": null,
+ "configMode": "basic",
+ "actions": {},
+ "showTitleIcon": false,
+ "titleIcon": "thermostat",
+ "iconColor": "#1F6BDD",
+ "useDashboardTimewindow": false,
+ "displayTimewindow": true,
+ "titleFont": {
+ "size": 16,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal",
+ "lineHeight": "24px"
+ },
+ "titleColor": "rgba(0, 0, 0, 0.87)",
+ "titleTooltip": "",
+ "widgetStyle": {},
+ "widgetCss": "",
+ "pageSize": 1024,
+ "units": "",
+ "decimals": null,
+ "noDataDisplayMessage": "",
+ "timewindowStyle": {
+ "showIcon": false,
+ "iconSize": "24px",
+ "icon": null,
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "400",
+ "style": "normal",
+ "lineHeight": "16px"
+ },
+ "color": "rgba(0, 0, 0, 0.38)",
+ "displayTypePrefix": true
+ },
+ "margin": "0px",
+ "borderRadius": "0px",
+ "iconSize": "0px",
+ "enableDataExport": true
+ },
+ "row": 0,
+ "col": 0,
+ "id": "8697d2b8-d2b5-f277-2f37-a9161c7522c3"
+ },
+ "dae5bc37-3bca-bd4e-caed-a43ad59612fe": {
+ "typeFullFqn": "system.line_chart",
+ "type": "timeseries",
+ "sizeX": 8,
+ "sizeY": 5,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "ir",
+ "type": "timeseries",
+ "label": "IR",
+ "color": "#2196f3",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.8849361570112894,
+ "units": null,
+ "decimals": 0
+ },
+ {
+ "name": "full",
+ "type": "timeseries",
+ "label": "Full",
+ "color": "#4caf50",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.4102286520167244,
+ "decimals": 0
+ },
+ {
+ "name": "visible",
+ "type": "timeseries",
+ "label": "Visible",
+ "color": "#f44336",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.6282696855606542,
+ "decimals": 0
+ },
+ {
+ "name": "lux",
+ "type": "timeseries",
+ "label": "Lux",
+ "color": "#ffc107",
+ "settings": {
+ "yAxisId": "default",
+ "showInLegend": true,
+ "dataHiddenByDefault": false,
+ "type": "line",
+ "lineSettings": {
+ "showLine": true,
+ "step": false,
+ "stepType": "start",
+ "smooth": false,
+ "lineType": "solid",
+ "lineWidth": 2,
+ "showPoints": false,
+ "showPointLabel": false,
+ "pointLabelPosition": "top",
+ "pointLabelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "pointLabelColor": "rgba(0, 0, 0, 0.76)",
+ "enablePointLabelBackground": false,
+ "pointLabelBackground": "rgba(255,255,255,0.56)",
+ "pointShape": "emptyCircle",
+ "pointSize": 4,
+ "fillAreaSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "barSettings": {
+ "showBorder": false,
+ "borderWidth": 2,
+ "borderRadius": 0,
+ "showLabel": false,
+ "labelPosition": "top",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.76)",
+ "enableLabelBackground": false,
+ "labelBackground": "rgba(255,255,255,0.56)",
+ "backgroundSettings": {
+ "type": "none",
+ "opacity": 0.4,
+ "gradient": {
+ "start": 100,
+ "end": 0
+ }
+ }
+ },
+ "comparisonSettings": {
+ "showValuesForComparison": false,
+ "comparisonValuesLabel": "",
+ "color": ""
+ }
+ },
+ "_hash": 0.5507816432910342,
+ "decimals": 0
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ },
+ "latestDataKeys": []
+ }
+ ],
+ "timewindow": {
+ "hideAggregation": false,
+ "hideAggInterval": false,
+ "hideTimezone": false,
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 0,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "interval": 1000
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ },
+ "timezone": null
+ },
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "showLegend": true,
+ "legendConfig": {
+ "direction": "column",
+ "position": "top",
+ "sortDataKeys": false,
+ "showMin": false,
+ "showMax": false,
+ "showAvg": true,
+ "showTotal": false,
+ "showLatest": false,
+ "valueFormat": null
+ },
+ "thresholds": [],
+ "dataZoom": true,
+ "stack": false,
+ "yAxis": {
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "left",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)"
+ },
+ "xAxis": {
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "bottom",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 10,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "ticksFormat": {},
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)"
+ },
+ "legendLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "legendLabelColor": "rgba(0, 0, 0, 0.76)",
+ "showTooltip": true,
+ "tooltipTrigger": "axis",
+ "tooltipValueFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "16px"
+ },
+ "tooltipValueColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipShowDate": true,
+ "tooltipDateFormat": {
+ "format": null,
+ "lastUpdateAgo": false,
+ "custom": false,
+ "auto": true,
+ "autoDateFormatSettings": {}
+ },
+ "tooltipDateFont": {
+ "family": "Roboto",
+ "size": 11,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "tooltipDateColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipDateInterval": true,
+ "tooltipBackgroundColor": "rgba(255, 255, 255, 0.76)",
+ "tooltipBackgroundBlur": 4,
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "yAxes": {
+ "default": {
+ "units": null,
+ "decimals": 0,
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "left",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "ticksFormatter": null,
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)",
+ "id": "default",
+ "order": 0
+ }
+ },
+ "noAggregationBarWidthSettings": {
+ "strategy": "group",
+ "groupWidth": {
+ "relative": true,
+ "relativeWidth": 2,
+ "absoluteWidth": 1000
+ },
+ "barWidth": {
+ "relative": true,
+ "relativeWidth": 2,
+ "absoluteWidth": 1000
+ }
+ },
+ "animation": {
+ "animation": true,
+ "animationThreshold": 2000,
+ "animationDuration": 500,
+ "animationEasing": "cubicOut",
+ "animationDelay": 0,
+ "animationDurationUpdate": 300,
+ "animationEasingUpdate": "cubicOut",
+ "animationDelayUpdate": 0
+ },
+ "padding": "12px",
+ "comparisonEnabled": false,
+ "timeForComparison": "previousInterval",
+ "comparisonCustomIntervalValue": 7200000,
+ "comparisonXAxis": {
+ "show": true,
+ "label": "",
+ "labelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "600",
+ "lineHeight": "1"
+ },
+ "labelColor": "rgba(0, 0, 0, 0.54)",
+ "position": "top",
+ "showTickLabels": true,
+ "tickLabelFont": {
+ "family": "Roboto",
+ "size": 10,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "1"
+ },
+ "tickLabelColor": "rgba(0, 0, 0, 0.54)",
+ "ticksFormat": {},
+ "showTicks": true,
+ "ticksColor": "rgba(0, 0, 0, 0.54)",
+ "showLine": true,
+ "lineColor": "rgba(0, 0, 0, 0.54)",
+ "showSplitLines": true,
+ "splitLinesColor": "rgba(0, 0, 0, 0.12)"
+ },
+ "grid": {
+ "show": false,
+ "backgroundColor": null,
+ "borderWidth": 1,
+ "borderColor": "#ccc"
+ },
+ "legendColumnTitleFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "legendColumnTitleColor": "rgba(0, 0, 0, 0.38)",
+ "legendValueFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "16px"
+ },
+ "legendValueColor": "rgba(0, 0, 0, 0.87)",
+ "tooltipLabelFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "400",
+ "lineHeight": "16px"
+ },
+ "tooltipLabelColor": "rgba(0, 0, 0, 0.76)",
+ "tooltipHideZeroValues": null,
+ "tooltipStackedShowTotal": false
+ },
+ "title": "Light",
+ "dropShadow": true,
+ "enableFullscreen": true,
+ "titleStyle": null,
+ "mobileHeight": null,
+ "configMode": "basic",
+ "actions": {},
+ "showTitleIcon": false,
+ "titleIcon": "thermostat",
+ "iconColor": "#1F6BDD",
+ "useDashboardTimewindow": false,
+ "displayTimewindow": true,
+ "titleFont": {
+ "size": 16,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal",
+ "lineHeight": "24px"
+ },
+ "titleColor": "rgba(0, 0, 0, 0.87)",
+ "titleTooltip": "",
+ "widgetStyle": {},
+ "widgetCss": "",
+ "pageSize": 1024,
+ "units": "",
+ "decimals": null,
+ "noDataDisplayMessage": "",
+ "timewindowStyle": {
+ "showIcon": false,
+ "iconSize": "24px",
+ "icon": null,
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "400",
+ "style": "normal",
+ "lineHeight": "16px"
+ },
+ "color": "rgba(0, 0, 0, 0.38)",
+ "displayTypePrefix": true
+ },
+ "margin": "0px",
+ "borderRadius": "0px",
+ "iconSize": "0px",
+ "enableDataExport": true
+ },
+ "row": 0,
+ "col": 0,
+ "id": "dae5bc37-3bca-bd4e-caed-a43ad59612fe"
+ },
+ "214ee023-a000-1470-ba93-918a54bbdf2f": {
+ "typeFullFqn": "system.pressure_card",
+ "type": "latest",
+ "sizeX": 3,
+ "sizeY": 3,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "pressure",
+ "type": "timeseries",
+ "label": "Pressure",
+ "color": "#2196f3",
+ "settings": {},
+ "_hash": 0.1304755286885697
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "timewindow": {
+ "displayValue": "",
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 1,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideQuickInterval": false
+ },
+ "history": {
+ "historyType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "fixedTimewindow": {
+ "startTimeMs": 1762781293430,
+ "endTimeMs": 1762867693430
+ },
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideFixedInterval": false,
+ "hideQuickInterval": false
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "showTitle": false,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "labelPosition": "top",
+ "layout": "square",
+ "showLabel": true,
+ "labelFont": {
+ "family": "Roboto",
+ "size": 16,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "labelColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "showIcon": true,
+ "iconSize": 40,
+ "iconSizeUnit": "px",
+ "icon": "compress",
+ "iconColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 1000,
+ "color": "#D81838"
+ },
+ {
+ "from": 1000,
+ "to": 1020,
+ "color": "#80C32C"
+ },
+ {
+ "from": 1020,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "valueFont": {
+ "size": 36,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal"
+ },
+ "valueColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 1000,
+ "color": "#D81838"
+ },
+ {
+ "from": 1000,
+ "to": 1020,
+ "color": "#80C32C"
+ },
+ {
+ "from": 1020,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ }
+ },
+ "showDate": true,
+ "dateFormat": {
+ "format": null,
+ "lastUpdateAgo": true,
+ "custom": false
+ },
+ "dateFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "dateColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.38)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "autoScale": true,
+ "padding": ""
+ },
+ "title": "Pressure card",
+ "dropShadow": true,
+ "enableFullscreen": false,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "units": "hPa",
+ "decimals": 0,
+ "useDashboardTimewindow": true,
+ "showLegend": false,
+ "widgetStyle": {},
+ "actions": {},
+ "configMode": "basic",
+ "displayTimewindow": true,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "titleFont": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1.6"
+ },
+ "titleIcon": "",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "iconSize": "14px",
+ "timewindowStyle": {
+ "showIcon": true,
+ "iconSize": "14px",
+ "icon": "query_builder",
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1"
+ },
+ "color": null
+ },
+ "enableDataExport": false
+ },
+ "row": 0,
+ "col": 0,
+ "id": "214ee023-a000-1470-ba93-918a54bbdf2f"
+ },
+ "8a4205e1-54f2-2879-e81e-9dfed04a814f": {
+ "typeFullFqn": "system.pressure_card",
+ "type": "latest",
+ "sizeX": 3,
+ "sizeY": 3,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "altitude",
+ "type": "timeseries",
+ "label": "Altitude",
+ "color": "#2196f3",
+ "settings": {},
+ "_hash": 0.07560007119088208
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ }
+ }
+ ],
+ "timewindow": {
+ "displayValue": "",
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 1,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideQuickInterval": false
+ },
+ "history": {
+ "historyType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "fixedTimewindow": {
+ "startTimeMs": 1762781510326,
+ "endTimeMs": 1762867910326
+ },
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideFixedInterval": false,
+ "hideQuickInterval": false
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "showTitle": false,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "padding": "0px",
+ "settings": {
+ "labelPosition": "top",
+ "layout": "square",
+ "showLabel": true,
+ "labelFont": {
+ "family": "Roboto",
+ "size": 16,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "labelColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "showIcon": true,
+ "iconSize": 40,
+ "iconSizeUnit": "px",
+ "icon": "height",
+ "iconColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "gradient": {
+ "advancedMode": false,
+ "gradient": [
+ "rgba(0, 255, 0, 1)",
+ "rgba(255, 0, 0, 1)"
+ ],
+ "gradientAdvanced": [
+ {
+ "source": {
+ "type": "constant"
+ },
+ "color": "rgba(0, 255, 0, 1)"
+ },
+ {
+ "source": {
+ "type": "constant"
+ },
+ "color": "rgba(255, 0, 0, 1)"
+ }
+ ],
+ "minValue": 0,
+ "maxValue": 100
+ },
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 1000,
+ "color": "#D81838"
+ },
+ {
+ "from": 1000,
+ "to": 1020,
+ "color": "#E89623"
+ },
+ {
+ "from": 1020,
+ "to": null,
+ "color": "#D81838"
+ }
+ ],
+ "rangeAdvanced": []
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "valueFont": {
+ "size": 36,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal"
+ },
+ "valueColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "gradient": {
+ "advancedMode": false,
+ "gradient": [
+ "rgba(0, 255, 0, 1)",
+ "rgba(255, 0, 0, 1)"
+ ],
+ "gradientAdvanced": [
+ {
+ "source": {
+ "type": "constant"
+ },
+ "color": "rgba(0, 255, 0, 1)"
+ },
+ {
+ "source": {
+ "type": "constant"
+ },
+ "color": "rgba(255, 0, 0, 1)"
+ }
+ ],
+ "minValue": 0,
+ "maxValue": 100
+ },
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": null,
+ "to": 1000,
+ "color": "#D81838"
+ },
+ {
+ "from": 1000,
+ "to": 1020,
+ "color": "#E89623"
+ },
+ {
+ "from": 1020,
+ "to": null,
+ "color": "#D81838"
+ }
+ ],
+ "rangeAdvanced": []
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "showDate": true,
+ "dateFormat": {
+ "format": null,
+ "lastUpdateAgo": true,
+ "custom": false
+ },
+ "dateFont": {
+ "family": "Roboto",
+ "size": 12,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500"
+ },
+ "dateColor": {
+ "type": "constant",
+ "color": "rgba(0, 0, 0, 0.38)",
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "autoScale": true,
+ "padding": ""
+ },
+ "title": "Pressure card",
+ "dropShadow": true,
+ "enableFullscreen": false,
+ "titleStyle": {
+ "fontSize": "16px",
+ "fontWeight": 400
+ },
+ "units": "m",
+ "decimals": 0,
+ "useDashboardTimewindow": true,
+ "showLegend": false,
+ "widgetStyle": {},
+ "actions": {},
+ "configMode": "basic",
+ "displayTimewindow": true,
+ "margin": "0px",
+ "borderRadius": "0px",
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "showTitleIcon": false,
+ "titleTooltip": "",
+ "titleFont": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1.6"
+ },
+ "titleIcon": "",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "iconSize": "14px",
+ "timewindowStyle": {
+ "showIcon": true,
+ "iconSize": "14px",
+ "icon": "query_builder",
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": null,
+ "weight": null,
+ "style": null,
+ "lineHeight": "1"
+ },
+ "color": null
+ },
+ "enableDataExport": false
+ },
+ "row": 0,
+ "col": 0,
+ "id": "8a4205e1-54f2-2879-e81e-9dfed04a814f"
+ },
+ "55ba16ee-a471-96db-fec3-76e3d23b8b42": {
+ "typeFullFqn": "system.simple_flow_rate_chart_card",
+ "type": "timeseries",
+ "sizeX": 4.5,
+ "sizeY": 2,
+ "config": {
+ "datasources": [
+ {
+ "type": "entity",
+ "name": "",
+ "entityAliasId": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "dataKeys": [
+ {
+ "name": "motion",
+ "type": "timeseries",
+ "label": "motion",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "settings": {},
+ "_hash": 0.4769248810549319
+ }
+ ],
+ "alarmFilterConfig": {
+ "statusList": [
+ "ACTIVE"
+ ]
+ },
+ "latestDataKeys": [
+ {
+ "name": "motion",
+ "type": "timeseries",
+ "label": "Latest",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "settings": {},
+ "_hash": 0.4769248810549319,
+ "units": null,
+ "decimals": null
+ }
+ ]
+ }
+ ],
+ "showTitle": true,
+ "backgroundColor": "rgba(0, 0, 0, 0)",
+ "color": null,
+ "padding": "0px",
+ "settings": {
+ "layout": "left",
+ "autoScale": true,
+ "showValue": true,
+ "valueFont": {
+ "family": "Roboto",
+ "size": 28,
+ "sizeUnit": "px",
+ "style": "normal",
+ "weight": "500",
+ "lineHeight": "32px"
+ },
+ "valueColor": {
+ "type": "range",
+ "color": "rgba(0, 0, 0, 0.87)",
+ "rangeList": {
+ "advancedMode": false,
+ "range": [
+ {
+ "from": 0,
+ "to": 10,
+ "color": "#305AD7"
+ },
+ {
+ "from": 10,
+ "to": 30,
+ "color": "#3FA71A"
+ },
+ {
+ "from": 30,
+ "to": 50,
+ "color": "#F36900"
+ },
+ {
+ "from": 50,
+ "to": null,
+ "color": "#D81838"
+ }
+ ]
+ },
+ "colorFunction": "var temperature = value;\nif (typeof temperature !== undefined) {\n var percent = (temperature + 60)/120 * 100;\n return tinycolor.mix('blue', 'red', percent).toHexString();\n}\nreturn 'blue';"
+ },
+ "background": {
+ "type": "color",
+ "color": "#fff",
+ "overlay": {
+ "enabled": false,
+ "color": "rgba(255,255,255,0.72)",
+ "blur": 3
+ }
+ },
+ "padding": "12px"
+ },
+ "title": "Motion",
+ "dropShadow": true,
+ "enableFullscreen": false,
+ "titleStyle": null,
+ "mobileHeight": null,
+ "configMode": "basic",
+ "actions": {},
+ "showTitleIcon": true,
+ "titleIcon": "mdi:run-fast",
+ "iconColor": "rgba(0, 0, 0, 0.87)",
+ "titleFont": {
+ "size": 16,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "500",
+ "style": "normal",
+ "lineHeight": "24px"
+ },
+ "iconSize": "18px",
+ "titleTooltip": "",
+ "widgetStyle": {},
+ "widgetCss": "",
+ "pageSize": 1024,
+ "noDataDisplayMessage": "",
+ "useDashboardTimewindow": true,
+ "decimals": 0,
+ "titleColor": "rgba(0, 0, 0, 0.87)",
+ "borderRadius": "0px",
+ "units": null,
+ "displayTimewindow": true,
+ "timewindow": {
+ "hideAggregation": false,
+ "hideAggInterval": false,
+ "hideTimezone": false,
+ "selectedTab": 1,
+ "history": {
+ "historyType": 2,
+ "timewindowMs": 60000,
+ "interval": 43200000,
+ "fixedTimewindow": {
+ "startTimeMs": 1697382151041,
+ "endTimeMs": 1697468551041
+ },
+ "quickInterval": "CURRENT_MONTH_SO_FAR"
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "timewindowStyle": {
+ "showIcon": false,
+ "iconSize": "24px",
+ "icon": "query_builder",
+ "iconPosition": "left",
+ "font": {
+ "size": 12,
+ "sizeUnit": "px",
+ "family": "Roboto",
+ "weight": "400",
+ "style": "normal",
+ "lineHeight": "16px"
+ },
+ "color": "rgba(0, 0, 0, 0.38)",
+ "displayTypePrefix": true
+ },
+ "margin": "0px",
+ "enableDataExport": false
+ },
+ "row": 0,
+ "col": 0,
+ "id": "55ba16ee-a471-96db-fec3-76e3d23b8b42"
+ }
+ },
+ "states": {
+ "default": {
+ "name": "My New Dashboard",
+ "root": true,
+ "layouts": {
+ "main": {
+ "widgets": {
+ "b3d77137-f9a4-a0ee-1851-faaeb4d9d98c": {
+ "sizeX": 7,
+ "sizeY": 7,
+ "row": 3,
+ "col": 8
+ },
+ "9002e18c-2d4d-edb4-b94c-f04ffcf7e481": {
+ "sizeX": 6,
+ "sizeY": 3,
+ "mobileHeight": null,
+ "row": 0,
+ "col": 6
+ },
+ "1dd20baf-c3dc-318b-9d9a-79b298feee46": {
+ "sizeX": 3,
+ "sizeY": 3,
+ "row": 0,
+ "col": 3
+ },
+ "a2a042dc-f5d1-2a3d-02a3-b44f8573003d": {
+ "sizeX": 3,
+ "sizeY": 3,
+ "row": 0,
+ "col": 0
+ },
+ "8697d2b8-d2b5-f277-2f37-a9161c7522c3": {
+ "sizeX": 9,
+ "sizeY": 7,
+ "mobileHeight": null,
+ "row": 3,
+ "col": 15
+ },
+ "dae5bc37-3bca-bd4e-caed-a43ad59612fe": {
+ "sizeX": 8,
+ "sizeY": 7,
+ "mobileHeight": null,
+ "row": 3,
+ "col": 0
+ },
+ "214ee023-a000-1470-ba93-918a54bbdf2f": {
+ "sizeX": 3,
+ "sizeY": 3,
+ "row": 0,
+ "col": 12
+ },
+ "8a4205e1-54f2-2879-e81e-9dfed04a814f": {
+ "sizeX": 3,
+ "sizeY": 3,
+ "row": 0,
+ "col": 15
+ },
+ "55ba16ee-a471-96db-fec3-76e3d23b8b42": {
+ "sizeX": 6,
+ "sizeY": 3,
+ "mobileHeight": null,
+ "row": 0,
+ "col": 18
+ }
+ },
+ "gridSettings": {
+ "layoutType": "default",
+ "backgroundColor": "#eeeeee",
+ "columns": 24,
+ "margin": 10,
+ "outerMargin": true,
+ "backgroundSizeMode": "100%"
+ }
+ }
+ }
+ }
+ },
+ "entityAliases": {
+ "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3": {
+ "id": "fc4d0cf0-04b5-0d6c-0344-e0fd497fecd3",
+ "alias": "Single device",
+ "filter": {
+ "type": "entityName",
+ "resolveMultiple": true,
+ "entityType": "DEVICE",
+ "entityNameFilter": "My New Device"
+ }
+ }
+ },
+ "filters": {},
+ "timewindow": {
+ "displayValue": "",
+ "hideAggregation": false,
+ "hideAggInterval": false,
+ "hideTimezone": false,
+ "selectedTab": 0,
+ "realtime": {
+ "realtimeType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideQuickInterval": false
+ },
+ "history": {
+ "historyType": 0,
+ "interval": 1000,
+ "timewindowMs": 60000,
+ "fixedTimewindow": {
+ "startTimeMs": 1762789150183,
+ "endTimeMs": 1762875550183
+ },
+ "quickInterval": "CURRENT_DAY",
+ "hideInterval": false,
+ "hideLastInterval": false,
+ "hideFixedInterval": false,
+ "hideQuickInterval": false
+ },
+ "aggregation": {
+ "type": "AVG",
+ "limit": 25000
+ }
+ },
+ "settings": {
+ "stateControllerId": "entity",
+ "showTitle": false,
+ "showDashboardsSelect": true,
+ "showEntitiesSelect": true,
+ "showDashboardTimewindow": true,
+ "showDashboardExport": true,
+ "toolbarAlwaysOpen": true
+ }
+ },
+ "name": "Demo dashboard",
+ "resources": []
+}
\ No newline at end of file
diff --git a/docs/devices-library/resources/sensy32/thingsboard.ino b/docs/devices-library/resources/sensy32/thingsboard.ino
new file mode 100644
index 0000000000..0dd211c1d1
--- /dev/null
+++ b/docs/devices-library/resources/sensy32/thingsboard.ino
@@ -0,0 +1,683 @@
+#if defined(ESP8266)
+#include
+#define THINGSBOARD_ENABLE_PROGMEM 0
+#elif defined(ESP32) || defined(RASPBERRYPI_PICO) || defined(RASPBERRYPI_PICO_W)
+#include
+#endif
+
+#ifndef LED_BUILTIN
+#define LED_BUILTIN 99
+#endif
+
+#include
+#include
+#include
+#include
+/*
+ Specific packages for each Sensor
+*/
+#include "SparkFun_BNO08x_Arduino_Library.h" // package needed for Accelerometer and Orientation Sensors // http://librarymanager/All#SparkFun_BNO08x
+#include // package needed for Light Sensor
+#include "Adafruit_TSL2591.h" // package needed for Light Sensor
+#include "SparkFun_STHS34PF80_Arduino_Library.h" // package needed for Motion Sensor
+#include // package needed for Altitude - Pressure Sensor
+#include "SparkFunBME280.h" // package needed for Temperature - Humidity Sensor
+#include "Adafruit_LTR390.h" // package needed for UV Sensor
+
+// Sensors Configurations
+BNO08x myIMU; // accelerometer & orientation
+Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); // light // pass in a number for the sensor identifier (for your use later)
+STHS34PF80_I2C mySensorMo; // motion
+BMP388_DEV bmp388; // pressure and altitude
+BME280 mySensorTem; // temperature and humidity
+Adafruit_LTR390 ltr = Adafruit_LTR390(); // uv
+
+/*
+ OLED / LCD Configuration
+*/
+
+SSOLED ssoled;
+
+// if your system doesn't have enough RAM for a back buffer, comment out
+// this line (e.g. ATtiny85)
+#define USE_BACKBUFFER
+
+#ifdef USE_BACKBUFFER
+static uint8_t ucBackBuffer[1024];
+#else
+static uint8_t *ucBackBuffer = NULL;
+#endif
+
+// Use -1 for the Wire library default pins
+// or specify the pin numbers to use with the Wire library or bit banging on any GPIO pins
+// These are the pin numbers for the M5Stack Atom default I2C
+#define SDA_PIN -1
+#define SCL_PIN -1
+// Set this to -1 to disable or the GPIO pin number connected to the reset
+// line of your display if it requires an external reset
+#define RESET_PIN -1
+// let ss_oled figure out the display address
+#define OLED_ADDR -1
+// don't rotate the display
+#define FLIP180 0
+// don't invert the display
+#define INVERT 0
+// Bit-Bang the I2C bus
+#define USE_HW_I2C 1
+
+// Change these if you're using a different OLED display
+#define MY_OLED OLED_128x64
+#define OLED_WIDTH 128
+#define OLED_HEIGHT 64
+
+// Global Variables Definition
+int16_t presenceVal = 0; // presence sensor
+volatile boolean dataReady = false; // pressure and altitude sensor
+float temperature, pressure, altitude, humidity, uvData, lux;
+float quatI, quatJ, quatK, quatReal, quatRadianAccuracy;
+float valX, valY, valZ;
+uint16_t ir, full, visible;
+
+int int_pin = 33; // pressure and altitude sensor
+
+int currentPage = 0; // Variable to track the current page
+unsigned long lastPageSwitch = 0; // Timestamp for the last page switch
+const unsigned long pageDuration = 5000; // Time to show each page (milliseconds)
+
+// WIFI Configuration
+constexpr char WIFI_SSID[] = "YOUR_WIFI_SSID";
+constexpr char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
+
+// See https://thingsboard.io/docs/pe/getting-started-guides/helloworld/
+// to understand how to obtain an access token
+constexpr char TOKEN[] = "YOUR_DEVICE_ACCESS_TOKEN";
+
+// Thingsboard we want to establish a connection too
+// use the below: if you are using ThingsBoard Cloud (America)
+constexpr char THINGSBOARD_SERVER[] = "thingsboard.cloud";
+// use the below: if you are using ThingsBoard Cloud (Europe)
+// constexpr char THINGSBOARD_SERVER[] = "eu.thingsboard.cloud";
+
+// MQTT port used to communicate with the server, 1883 is the default unencrypted MQTT port.
+constexpr uint16_t THINGSBOARD_PORT = 1883U;
+
+// Maximum size packets will ever be sent or received by the underlying MQTT client,
+// if the size is to small messages might not be sent or received messages will be discarded
+constexpr uint32_t MAX_MESSAGE_SIZE = 1024U;
+
+// Baud rate for the debugging serial connection.
+// If the Serial output is mangled, ensure to change the monitor speed accordingly to this variable
+constexpr uint32_t SERIAL_DEBUG_BAUD = 115200U;
+
+// Initialize underlying client, used to establish a connection
+WiFiClient wifiClient;
+
+// Initalize the Mqtt client instance
+Arduino_MQTT_Client mqttClient(wifiClient);
+
+// Initialize ThingsBoard instance with the maximum needed buffer size, stack size and the apis we want to use
+ThingsBoard tb(mqttClient, MAX_MESSAGE_SIZE);
+
+// For telemetry
+constexpr int16_t telemetrySendInterval = 2000U;
+uint32_t previousDataSend;
+
+/// @brief Initalizes WiFi connection,
+// will endlessly delay until a connection has been successfully established
+void InitWiFi() {
+ Serial.println("Connecting to AP ...");
+ // Attempting to establish a connection to the given WiFi network
+ WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
+ while (WiFi.status() != WL_CONNECTED) {
+ // Delay 500ms until a connection has been succesfully established
+ delay(500);
+ Serial.print(".");
+ }
+ Serial.println("Connected to AP");
+}
+
+/// @brief Reconnects the WiFi uses InitWiFi if the connection has been removed
+/// @return Returns true as soon as a connection has been established again
+const bool reconnect() {
+ // Check to ensure we aren't connected yet
+ const wl_status_t status = WiFi.status();
+ if (status == WL_CONNECTED) {
+ return true;
+ }
+
+ // If we aren't establish a new connection to the given WiFi network
+ InitWiFi();
+ return true;
+}
+
+void setupLcd() {
+ //LCD Setup
+ int rc;
+ // The I2C SDA/SCL pins set to -1 means to use the default Wire library
+ // If pins were specified, they would be bit-banged in software
+ // oledInit(SSOLED *, type, oled_addr, rotate180, invert, bWire, SDA_PIN, SCL_PIN, RESET_PIN, speed)
+
+ rc = oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L); // use standard I2C bus at 400Khz
+ if (rc != OLED_NOT_FOUND) {
+ char *msgs[] = { (char *)"SSD1306 @ 0x3C", (char *)"SSD1306 @ 0x3D", (char *)"SH1106 @ 0x3C", (char *)"SH1106 @ 0x3D" };
+ oledFill(&ssoled, 0, 1);
+ oledWriteString(&ssoled, 0, 0, 0, msgs[rc], FONT_NORMAL, 0, 1);
+ oledSetBackBuffer(&ssoled, ucBackBuffer);
+ delay(2000);
+
+}
+}
+
+// Here is where you define the sensor outputs you want to receive
+void setReports(void) {
+ Serial.println("Setting desired reports");
+
+ // Enable accelerometer
+ if (myIMU.enableAccelerometer() == true) {
+ Serial.println("Accelerometer enabled");
+ Serial.println("Output: x, y, z (m/s^2)");
+ } else {
+ Serial.println("Could not enable accelerometer");
+ }
+
+ // Enable rotation vector
+ if (myIMU.enableRotationVector() == true) {
+ Serial.println("Rotation vector enabled");
+ Serial.println("Output: i, j, k, real, accuracy");
+ } else {
+ Serial.println("Could not enable rotation vector");
+ }
+}
+
+void setup() {
+ // Initialize serial connection for debugging
+ Serial.begin(SERIAL_DEBUG_BAUD);
+ Serial.println();
+ Wire.begin(7, 6);
+ InitWiFi();
+ if (LED_BUILTIN != 99) {
+ pinMode(LED_BUILTIN, OUTPUT);
+ }
+ while (!Serial) delay(10); // Wait for Serial to become available
+
+ mySensorTem.setI2CAddress(0x76); // Initialize Temperature/Humidity Sensor
+
+ if(tsl.begin()==false){ // light
+ Serial.println("No sensor for Light found ... check your wiring?");
+ while (1);
+ } else if(mySensorMo.begin()==false){ // motion
+ Serial.println("No sensor for Motion found ... check your wiring?");
+ while (1);
+ } else if(bmp388.begin()==false){ // pressure and altitude
+ Serial.println("No BMP388 Sensor found for Pressure and Altitude.");
+ while (1);
+ } else if (mySensorTem.beginI2C(Wire)==false){ // temperature and humidity //Begin communication over I2C
+ Serial.println("No BMP388 Sensor found for Temperature and Humidity.");
+ while (1);
+ }else if (ltr.begin()==false) { // uv
+ Serial.println("Couldn't find LTR sensor for UV!");
+ while (1);
+ }else if (myIMU.begin() == false) { // acccelerometer and orientation
+ Serial.println("BNO08x not detected. Check connections. Freezing...");
+ while (1);
+ }
+
+ // light
+ Serial.println("Found a TSL2591 for Light sensor.");
+ displayLightSensorDetails();
+ configureLightSensor();
+
+ // motion
+ Serial.println("Found a STHS34PF80_I2C for Motion sensor.");
+ Serial.println("Open the Serial Plotter for graphical viewing");
+ delay(1000);
+
+ // pressure and altitude
+ bmp388.enableInterrupt(); // Enable the BMP388's interrupt (INT) pin
+ attachInterrupt(digitalPinToInterrupt(int_pin), interruptHandler, RISING); // Set interrupt to call interruptHandler function on D2
+ bmp388.setTimeStandby(TIME_STANDBY_1280MS); // Set the standby time to 1.3 seconds
+ bmp388.startNormalConversion(); // Start BMP388 continuous conversion in NORMAL_MODE
+ Serial.println("BMP388 Sensor found for Pressure and Altitude.");
+
+ // temperature and humidity
+ Serial.println("BME280 Sensor found for Temperature and Humidity.");
+
+ // uv
+ Serial.println("Found a LTR sensor for UV!");
+ ltr.setMode(LTR390_MODE_UVS);
+ if (ltr.getMode() == LTR390_MODE_ALS) {
+ Serial.println("LTR sensor is in ALS mode");
+ } else {
+ Serial.println("LTR sensor is in UVS mode");
+ }
+
+ ltr.setGain(LTR390_GAIN_3);
+ Serial.println("LTR sensor Gain : ");
+ switch (ltr.getGain()) {
+ case LTR390_GAIN_1: Serial.println(1); break;
+ case LTR390_GAIN_3: Serial.println(3); break;
+ case LTR390_GAIN_6: Serial.println(6); break;
+ case LTR390_GAIN_9: Serial.println(9); break;
+ case LTR390_GAIN_18: Serial.println(18); break;
+ }
+
+ ltr.setResolution(LTR390_RESOLUTION_16BIT);
+ Serial.println("LTR sensor Resolution : ");
+ switch (ltr.getResolution()) {
+ case LTR390_RESOLUTION_13BIT: Serial.println(13); break;
+ case LTR390_RESOLUTION_16BIT: Serial.println(16); break;
+ case LTR390_RESOLUTION_17BIT: Serial.println(17); break;
+ case LTR390_RESOLUTION_18BIT: Serial.println(18); break;
+ case LTR390_RESOLUTION_19BIT: Serial.println(19); break;
+ case LTR390_RESOLUTION_20BIT: Serial.println(20); break;
+ }
+
+ ltr.setThresholds(100, 1000);
+ ltr.configInterrupt(true, LTR390_MODE_UVS);
+
+ // acccelerometer and orientation
+ Serial.println("BNO08x found!");
+ setReports();
+
+ setupLcd();
+}
+
+void displayLightSensorDetails(void) {
+ sensor_t sensor;
+ tsl.getSensor(&sensor);
+ Serial.println(F("------------------------------------"));
+ Serial.print(F("Sensor: "));
+ Serial.println(sensor.name);
+ Serial.print(F("Driver Ver: "));
+ Serial.println(sensor.version);
+ Serial.print(F("Unique ID: "));
+ Serial.println(sensor.sensor_id);
+ Serial.print(F("Max Value: "));
+ Serial.print(sensor.max_value);
+ Serial.println(F(" lux"));
+ Serial.print(F("Min Value: "));
+ Serial.print(sensor.min_value);
+ Serial.println(F(" lux"));
+ Serial.print(F("Resolution: "));
+ Serial.print(sensor.resolution, 4);
+ Serial.println(F(" lux"));
+ Serial.println(F("------------------------------------"));
+ Serial.println(F(""));
+ delay(500);
+}
+
+void interruptHandler() { // Interrupt handler function
+ dataReady = true; // Set the dataReady flag
+}
+
+void configureLightSensor(void) {
+ // You can change the gain on the fly, to adapt to brighter/dimmer light situations
+ //tsl.setGain(TSL2591_GAIN_LOW); // 1x gain (bright light)
+ tsl.setGain(TSL2591_GAIN_MED); // 25x gain
+ //tsl.setGain(TSL2591_GAIN_HIGH); // 428x gain
+
+ // Changing the integration time gives you a longer time over which to sense light
+ // longer timelines are slower, but are good in very low light situtations!
+ // tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); // shortest integration time (bright light)
+ // tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS);
+ tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS);
+ // tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS);
+ // tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS);
+ // tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS); // longest integration time (dim light)
+
+ /* Display the gain and integration time for reference sake */
+ Serial.println(F("------------------------------------"));
+ Serial.print(F("Gain: "));
+ tsl2591Gain_t gain = tsl.getGain();
+ switch (gain) {
+ case TSL2591_GAIN_LOW:
+ Serial.println(F("1x (Low)"));
+ break;
+ case TSL2591_GAIN_MED:
+ Serial.println(F("25x (Medium)"));
+ break;
+ case TSL2591_GAIN_HIGH:
+ Serial.println(F("428x (High)"));
+ break;
+ case TSL2591_GAIN_MAX:
+ Serial.println(F("9876x (Max)"));
+ break;
+ }
+ Serial.print(F("Timing: "));
+ Serial.print((tsl.getTiming() + 1) * 100, DEC);
+ Serial.println(F(" ms"));
+ Serial.println(F("------------------------------------"));
+ Serial.println(F(""));
+}
+
+void getLightData(void){
+ // More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum
+ // That way you can do whatever math and comparisons you want!
+ uint32_t lum = tsl.getFullLuminosity();
+ ir = lum >> 16;
+ full = lum & 0xFFFF;
+ visible = full - ir;
+ lux = tsl.calculateLux(full, ir);
+ Serial.print(F("[ "));
+ Serial.print(millis());
+ Serial.print(F(" ms ] "));
+ Serial.print(F("IR: "));
+ Serial.print(ir);
+ Serial.print(F(" "));
+ Serial.print(F("Full: "));
+ Serial.print(full);
+ Serial.print(F(" "));
+ Serial.print(F("Visible: "));
+ Serial.print(visible);
+ Serial.print(F(" "));
+ Serial.print(F("Lux: "));
+ Serial.println(lux, 6);
+}
+
+void getPressureAltitudeData(void) {
+ bmp388.getMeasurements(temperature, pressure, altitude); // Read the measurements
+ Serial.print("Temperature: ");
+ Serial.print(temperature); // Display the results
+ Serial.print(F("*C "));
+ Serial.print(" Pressure: ");
+ Serial.print(pressure);
+ Serial.print(F("hPa "));
+ Serial.print(" Altitude: ");
+ Serial.print(altitude);
+ Serial.println(F("m"));
+}
+
+void getTemperatureHumidityData(void){
+ temperature = mySensorTem.readTempC();
+ humidity = mySensorTem.readFloatHumidity();
+ pressure = (mySensorTem.readFloatPressure()/100);
+ altitude = mySensorTem.readFloatAltitudeMeters();
+
+ if (isnan(temperature) || isnan(humidity) || isnan(pressure) || isnan(altitude)) {
+ Serial.println("Error reading sensor data");
+ return;
+ }
+ Serial.print("Humidity: ");
+ Serial.print(humidity, 0);
+ Serial.print(F("g.m-3 "));
+
+ Serial.print(" Pressure: ");
+ Serial.print(pressure, 0);
+ Serial.print(F("hPa "));
+
+ Serial.print(" Altitude: ");
+ Serial.print(altitude, 1);
+ Serial.print(F("m "));
+
+ Serial.print(" Temperature: ");
+ Serial.print(temperature, 2);
+ Serial.println(F("*C "));
+
+}
+
+void getUvSensorData(void){
+ Serial.print("UV data: ");
+ uvData = ltr.readUVS();
+ Serial.println(uvData);
+}
+
+void getMotionData(void){
+ sths34pf80_tmos_drdy_status_t dataReady;
+ mySensorMo.getDataReady(&dataReady);
+ mySensorMo.getPresenceValue(&presenceVal);
+ Serial.print("Presence Value: ");
+ Serial.println(presenceVal);
+}
+
+void getAccelerometerOrientationData(void){
+ // Check if the sensor has been reset
+
+ if (myIMU.wasReset()) {
+ Serial.println("Sensor was reset. Re-enabling reports...");
+ setReports();
+ }
+
+ // Check if a new sensor event has occurred
+ if (myIMU.getSensorEvent() == true) {
+ // Handle accelerometer data
+ if (myIMU.getSensorEventID() == SENSOR_REPORTID_ACCELEROMETER) {
+ valX = myIMU.getAccelX();
+ valY = myIMU.getAccelY();
+ valZ = myIMU.getAccelZ();
+
+ Serial.print("Accelerometer: ");
+ Serial.print("X=");
+ Serial.print(valX, 2);
+ Serial.print(" Y=");
+ Serial.print(valY, 2);
+ Serial.print(" Z=");
+ Serial.println(valZ, 2);
+ }
+
+ // Handle rotation vector data
+ if (myIMU.getSensorEventID() == SENSOR_REPORTID_ROTATION_VECTOR) {
+ quatI = myIMU.getQuatI();
+ quatJ = myIMU.getQuatJ();
+ quatK = myIMU.getQuatK();
+ quatReal = myIMU.getQuatReal();
+ quatRadianAccuracy = myIMU.getQuatRadianAccuracy();
+
+ Serial.print("Rotation Vector: ");
+ Serial.print("i=");
+ Serial.print(quatI, 2);
+ Serial.print(" j=");
+ Serial.print(quatJ, 2);
+ Serial.print(" k=");
+ Serial.print(quatK, 2);
+ Serial.print(" real=");
+ Serial.print(quatReal, 2);
+ Serial.print(" accuracy=");
+ Serial.println(quatRadianAccuracy, 2);
+ }
+ }
+}
+
+void sendDataToLcd() {
+ int i, x, y;
+ char szTemp[32];
+ unsigned long ms;
+ unsigned long now = millis();
+
+ // Check if it's time to switch the page
+ if (now - lastPageSwitch > pageDuration) {
+ lastPageSwitch = now; // Update timestamp
+ currentPage = (currentPage + 1) % 7; // Cycle through 6 pages (0 to 6)
+ }
+
+ // Clear the OLED display before drawing new content
+ oledFill(&ssoled, 0x0, 1);
+
+ // Display content based on the current page
+ switch (currentPage) {
+ case 0: // Light page
+ oledWriteString(&ssoled, 0, 3, 1, (char *)"IR:", FONT_SMALL, 0, 1);
+ dtostrf(ir, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 50, 1, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 3, (char *)"Full:", FONT_SMALL, 0, 1);
+ dtostrf(full, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 50, 3, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 5, (char *)"Visible:", FONT_SMALL, 0, 1);
+ dtostrf(visible, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 50, 5, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 7, (char *)"Lux:", FONT_SMALL, 0, 1);
+ dtostrf(lux, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 50, 7, szTemp, FONT_SMALL, 0, 1);
+ break;
+
+ case 1: // Altitude & pressure page
+ oledWriteString(&ssoled, 0, 3, 3, (char *)"Altitude:", FONT_SMALL, 0, 1);
+ dtostrf(altitude, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 3, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 5, (char *)"Pressure:", FONT_SMALL, 0, 1);
+ dtostrf(pressure, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 5, szTemp, FONT_SMALL, 0, 1);
+ break;
+
+ case 2: // Temperature & humidity page
+ oledWriteString(&ssoled, 0, 3, 3, (char *)"Temp:", FONT_SMALL, 0, 1);
+ dtostrf(temperature, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 3, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 5, (char *)"Humidity:", FONT_SMALL, 0, 1);
+ dtostrf(humidity, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 5, szTemp, FONT_SMALL, 0, 1);
+ break;
+
+ case 3: // UV & Presence page
+ oledWriteString(&ssoled, 0, 3, 3, (char *)"UV:", FONT_SMALL, 0, 1);
+ dtostrf(uvData, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 3, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 5, (char *)"Presence:", FONT_SMALL, 0, 1);
+ dtostrf(presenceVal, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 5, szTemp, FONT_SMALL, 0, 1);
+ break;
+
+ case 4: // Accelerometer page
+ oledWriteString(&ssoled, 0, 25, 2, (char *)"X:", FONT_SMALL, 0, 1);
+ dtostrf(valX, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 35, 2, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 25, 4, (char *)"Y:", FONT_SMALL, 0, 1);
+ dtostrf(valY, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 35, 4, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 25, 6, (char *)"Z:", FONT_SMALL, 0, 1);
+ dtostrf(valZ, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 35, 6, szTemp, FONT_SMALL, 0, 1);
+ break;
+
+ case 5: // Orientation 1st page
+ oledWriteString(&ssoled, 0, 25, 2, (char *)"I:", FONT_SMALL, 0, 1);
+ dtostrf(quatI, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 35, 2, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 25, 4, (char *)"J:", FONT_SMALL, 0, 1);
+ dtostrf(quatJ, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 35, 4, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 25, 6, (char *)"K:", FONT_SMALL, 0, 1);
+ dtostrf(quatK, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 35, 6, szTemp, FONT_SMALL, 0, 1);
+ break;
+
+ case 6: // Orientation 2nd page
+ oledWriteString(&ssoled, 0, 3, 3, (char *)"Real:", FONT_SMALL, 0, 1);
+ dtostrf(quatReal, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 3, szTemp, FONT_SMALL, 0, 1);
+
+ oledWriteString(&ssoled, 0, 3, 5, (char *)"Accuracy:", FONT_SMALL, 0, 1);
+ dtostrf(quatRadianAccuracy, 10, 2, szTemp);
+ oledWriteString(&ssoled, 0, 56, 5, szTemp, FONT_SMALL, 0, 1);
+ break;
+ }
+}
+
+void loop() {
+ delay(10);
+
+ if (!reconnect()) {
+ return;
+ }
+
+ if (!tb.connected()) {
+ // Connect to the ThingsBoard
+ Serial.print("Connecting to: ");
+ Serial.print(THINGSBOARD_SERVER);
+ Serial.print(" with token ");
+ Serial.println(TOKEN);
+
+ if (!tb.connect(THINGSBOARD_SERVER, TOKEN, THINGSBOARD_PORT)) {
+ Serial.println("Failed to connect");
+ return;
+ }
+ // Sending a MAC address as an attribute
+ tb.sendAttributeData("macAddress", WiFi.macAddress().c_str());
+
+ }
+
+ // Sending telemetry every telemetrySendInterval time
+ if (millis() - previousDataSend > telemetrySendInterval) {
+ previousDataSend = millis();
+ Serial.println();
+
+ // light sensor
+ Serial.println(F("------------------------- Light Sensor --------------------------"));
+ getLightData();
+ Serial.println();
+
+ // altitude and pressure sensor
+ Serial.println(F("---------------- Pressure and Altitude Sensor --------------------"));
+ getPressureAltitudeData();
+ Serial.println();
+
+ // temperature and humidity sensor
+ Serial.println(F("---------------- Temperature and Humidity Sensor ------------------"));
+ getTemperatureHumidityData();
+ Serial.println();
+
+ // uv sensor
+ Serial.println(F("----------------------------- UV Sensor ---------------------------"));
+ getUvSensorData();
+ Serial.println();
+
+ // motion sensor
+ Serial.println(F("-------------------------- Motion Sensor --------------------------"));
+ getMotionData();
+ Serial.println();
+
+ // accelerometer and orientation sensor
+ Serial.println(F("------------- Accelerometer and Orientation Sensor ----------------"));
+ getAccelerometerOrientationData();
+ Serial.println();
+
+ // Send Data to LCD
+ sendDataToLcd();
+
+ // Send Data to ThingsBoard
+ // end temperture data
+ tb.sendTelemetryData("temperature", temperature);
+ // send humidity data
+ tb.sendTelemetryData("humidity", humidity);
+ // send altitude data
+ tb.sendTelemetryData("altitude", altitude);
+ // send pressure data
+ tb.sendTelemetryData("pressure", pressure);
+ // send motion data
+ tb.sendTelemetryData("motion", presenceVal);
+ // send uv data
+ tb.sendTelemetryData("uv", uvData);
+ // send accelerometer data
+ tb.sendTelemetryData("valX", valX);
+ tb.sendTelemetryData("valY", valY);
+ tb.sendTelemetryData("valZ", valZ);
+ // send orientation data
+ tb.sendTelemetryData("quatI", quatI);
+ tb.sendTelemetryData("quatJ", quatJ);
+ tb.sendTelemetryData("quatK", quatK);
+ tb.sendTelemetryData("quatReal", quatReal);
+ tb.sendTelemetryData("quatRadianAccuracy", quatRadianAccuracy);
+ // send light data
+ tb.sendTelemetryData("ir", ir);
+ tb.sendTelemetryData("full", full);
+ tb.sendTelemetryData("visible", visible);
+ tb.sendTelemetryData("lux", lux);
+ // send some WiFi information
+ tb.sendAttributeData("rssi", WiFi.RSSI());
+ tb.sendAttributeData("channel", WiFi.channel());
+ tb.sendAttributeData("bssid", WiFi.BSSIDstr().c_str());
+ tb.sendAttributeData("localIp", WiFi.localIP().toString().c_str());
+ tb.sendAttributeData("ssid", WiFi.SSID().c_str());
+ }
+
+ tb.loop();
+}
diff --git a/docs/devices-library/sensy32.md b/docs/devices-library/sensy32.md
new file mode 100644
index 0000000000..b683b6f5b5
--- /dev/null
+++ b/docs/devices-library/sensy32.md
@@ -0,0 +1,15 @@
+---
+layout: devices-library-article
+title: How to connect Sensy32 to ThingsBoard?
+category: Other devices
+connectivity: WIFI, Bluetooth
+vendor: Sensy32
+hasIntegrationDeviceConfiguration: true
+deviceImageFileName: sensy32.svg
+---
+
+* TOC
+{:toc}
+
+{% include get-hosts-name.html %}
+{% include /docs/devices-library/guides/sensy32.md %}
diff --git a/docs/paas/devices-library/sensy32.md b/docs/paas/devices-library/sensy32.md
new file mode 100644
index 0000000000..17ab00056a
--- /dev/null
+++ b/docs/paas/devices-library/sensy32.md
@@ -0,0 +1,16 @@
+---
+layout: devices-library-article
+title: How to connect Sensy32 to ThingsBoard?
+category: Other devices
+connectivity: WIFI, Bluetooth
+vendor: Sensy32
+hasIntegrationDeviceConfiguration: true
+deviceImageFileName: sensy32.svg
+docsPrefix: paas/
+---
+
+* TOC
+{:toc}
+
+{% include get-hosts-name.html docsPrefix=page.docsPrefix %}
+{% include /docs/devices-library/guides/sensy32.md %}
diff --git a/docs/paas/eu/devices-library/sensy32.md b/docs/paas/eu/devices-library/sensy32.md
new file mode 100644
index 0000000000..b59739d579
--- /dev/null
+++ b/docs/paas/eu/devices-library/sensy32.md
@@ -0,0 +1,17 @@
+---
+layout: devices-library-article
+title: How to connect Sensy32 to ThingsBoard?
+category: Other devices
+connectivity: WIFI, Bluetooth
+vendor: Sensy32
+hasIntegrationDeviceConfiguration: true
+deviceImageFileName: sensy32.svg
+docsPrefix: paas/eu/
+docsTag: paas-eu
+---
+
+* TOC
+{:toc}
+
+{% include get-hosts-name.html docsTag=page.docsTag %}
+{% include /docs/devices-library/guides/sensy32.md %}
diff --git a/docs/pe/devices-library/sensy32.md b/docs/pe/devices-library/sensy32.md
new file mode 100644
index 0000000000..827dabf2d2
--- /dev/null
+++ b/docs/pe/devices-library/sensy32.md
@@ -0,0 +1,17 @@
+---
+layout: devices-library-article
+title: How to connect Sensy32 to ThingsBoard?
+category: Other devices
+connectivity: WIFI, Bluetooth
+vendor: Sensy32
+hasIntegrationDeviceConfiguration: true
+deviceImageFileName: sensy32.svg
+docsPrefix: pe/
+docsTag: pe
+---
+
+* TOC
+{:toc}
+
+{% include get-hosts-name.html docsPrefix=page.docsPrefix %}
+{% include /docs/devices-library/guides/sensy32.md %}
diff --git a/images/devices-library/ready-to-go-devices/sensy32/carte-electro-preview.png b/images/devices-library/ready-to-go-devices/sensy32/carte-electro-preview.png
new file mode 100644
index 0000000000..4612d95006
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/carte-electro-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/carte-electro.png b/images/devices-library/ready-to-go-devices/sensy32/carte-electro.png
new file mode 100644
index 0000000000..369275e236
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/carte-electro.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager-preview.png b/images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager-preview.png
new file mode 100644
index 0000000000..aca9f0a7fc
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager.png b/images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager.png
new file mode 100644
index 0000000000..c5be43381f
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/esp32-arduino-ide-board-manager.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port-preview.png b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port-preview.png
new file mode 100644
index 0000000000..50880b6e28
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port.png b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port.png
new file mode 100644
index 0000000000..9e5c7eda24
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-port.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-preview.png b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-preview.png
new file mode 100644
index 0000000000..f3932cb5a1
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module.png b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module.png
new file mode 100644
index 0000000000..85cf98c887
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/esp32-s3-dev-module.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-1-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-1-pe-preview.png
new file mode 100644
index 0000000000..0398ebd8d3
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-1-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-1-pe.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-1-pe.png
new file mode 100644
index 0000000000..a9046d23c3
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-1-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-2-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-2-pe-preview.png
new file mode 100644
index 0000000000..0e43390cd0
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-2-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-2-pe.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-2-pe.png
new file mode 100644
index 0000000000..4370dfd9f0
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-2-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-3-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-3-pe-preview.png
new file mode 100644
index 0000000000..606f85535a
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-3-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-3-pe.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-3-pe.png
new file mode 100644
index 0000000000..cb2be6fe7c
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-3-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-4-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-4-pe-preview.png
new file mode 100644
index 0000000000..e16c55c716
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-4-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-4-pe.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-4-pe.png
new file mode 100644
index 0000000000..4bb7a9631d
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-1-1-provision-device-4-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe-preview.png
new file mode 100644
index 0000000000..196bc16572
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe.png
new file mode 100644
index 0000000000..208f11a2f5
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-1-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe-preview.png
new file mode 100644
index 0000000000..2662aa7e84
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe.png b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe.png
new file mode 100644
index 0000000000..b2e810f1db
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/hello-world-2-1-connect-device-2-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe-preview.png
new file mode 100644
index 0000000000..1b37f06bb0
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe.png b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe.png
new file mode 100644
index 0000000000..0f8d25df5f
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-1-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe-preview.png
new file mode 100644
index 0000000000..e5af34c322
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe.png b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe.png
new file mode 100644
index 0000000000..7e31f5ed22
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-2-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe-preview.png b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe-preview.png
new file mode 100644
index 0000000000..ee6be6639e
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe.png b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe.png
new file mode 100644
index 0000000000..36b96b4768
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/import-dashboard-3-pe.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/install-all-preview.png b/images/devices-library/ready-to-go-devices/sensy32/install-all-preview.png
new file mode 100644
index 0000000000..e618e2e849
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/install-all-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/install-all.png b/images/devices-library/ready-to-go-devices/sensy32/install-all.png
new file mode 100644
index 0000000000..8c13d550b6
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/install-all.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-1-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-1-preview.png
new file mode 100644
index 0000000000..d2069a4c8b
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-1-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-1.png b/images/devices-library/ready-to-go-devices/sensy32/library-1.png
new file mode 100644
index 0000000000..3e7f6c6312
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-1.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-2-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-2-preview.png
new file mode 100644
index 0000000000..493cadd25f
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-2-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-2.png b/images/devices-library/ready-to-go-devices/sensy32/library-2.png
new file mode 100644
index 0000000000..c77336ebdf
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-2.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-3-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-3-preview.png
new file mode 100644
index 0000000000..a8fc23743b
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-3-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-3.png b/images/devices-library/ready-to-go-devices/sensy32/library-3.png
new file mode 100644
index 0000000000..90be0fba1b
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-3.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-4-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-4-preview.png
new file mode 100644
index 0000000000..758bcf4918
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-4-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-4.png b/images/devices-library/ready-to-go-devices/sensy32/library-4.png
new file mode 100644
index 0000000000..dc24503068
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-4.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-5-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-5-preview.png
new file mode 100644
index 0000000000..3c175cae69
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-5-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-5.png b/images/devices-library/ready-to-go-devices/sensy32/library-5.png
new file mode 100644
index 0000000000..ab57a9eeaf
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-5.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-6-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-6-preview.png
new file mode 100644
index 0000000000..d75eb2818e
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-6-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-6.png b/images/devices-library/ready-to-go-devices/sensy32/library-6.png
new file mode 100644
index 0000000000..38af269837
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-6.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-7-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-7-preview.png
new file mode 100644
index 0000000000..7a3a6a9f97
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-7-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-7.png b/images/devices-library/ready-to-go-devices/sensy32/library-7.png
new file mode 100644
index 0000000000..54dd428348
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-7.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-8-preview.png b/images/devices-library/ready-to-go-devices/sensy32/library-8-preview.png
new file mode 100644
index 0000000000..f48bc212cf
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-8-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/library-8.png b/images/devices-library/ready-to-go-devices/sensy32/library-8.png
new file mode 100644
index 0000000000..b0ea0a68fb
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/library-8.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/manage-libraries-preview.png b/images/devices-library/ready-to-go-devices/sensy32/manage-libraries-preview.png
new file mode 100644
index 0000000000..d01a791fb3
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/manage-libraries-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/manage-libraries.png b/images/devices-library/ready-to-go-devices/sensy32/manage-libraries.png
new file mode 100644
index 0000000000..694d51dfdb
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/manage-libraries.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/my-dashboard-preview.png b/images/devices-library/ready-to-go-devices/sensy32/my-dashboard-preview.png
new file mode 100644
index 0000000000..c5d8eb7722
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/my-dashboard-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/my-dashboard.png b/images/devices-library/ready-to-go-devices/sensy32/my-dashboard.png
new file mode 100644
index 0000000000..53608821fa
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/my-dashboard.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/preferences-preview.png b/images/devices-library/ready-to-go-devices/sensy32/preferences-preview.png
new file mode 100644
index 0000000000..bd57b0b520
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/preferences-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/preferences.png b/images/devices-library/ready-to-go-devices/sensy32/preferences.png
new file mode 100644
index 0000000000..ba63ad9354
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/preferences.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer-preview.png b/images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer-preview.png
new file mode 100644
index 0000000000..4214120f0e
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer.png b/images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer.png
new file mode 100644
index 0000000000..f5972c1598
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/select-esptool-programmer.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/upload-preview.png b/images/devices-library/ready-to-go-devices/sensy32/upload-preview.png
new file mode 100644
index 0000000000..9111f9954f
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/upload-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer-preview.png b/images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer-preview.png
new file mode 100644
index 0000000000..42bb6e9ab5
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer-preview.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer.png b/images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer.png
new file mode 100644
index 0000000000..f3e2b325c7
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/upload-using-programmer.png differ
diff --git a/images/devices-library/ready-to-go-devices/sensy32/upload.png b/images/devices-library/ready-to-go-devices/sensy32/upload.png
new file mode 100644
index 0000000000..ddf2289181
Binary files /dev/null and b/images/devices-library/ready-to-go-devices/sensy32/upload.png differ
diff --git a/images/devices-library/sensy32.svg b/images/devices-library/sensy32.svg
new file mode 100644
index 0000000000..d264af0100
--- /dev/null
+++ b/images/devices-library/sensy32.svg
@@ -0,0 +1,9 @@
+
diff --git a/images/partners/sensy32-logo.svg b/images/partners/sensy32-logo.svg
new file mode 100644
index 0000000000..98bcc18cf5
--- /dev/null
+++ b/images/partners/sensy32-logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/partners/hardware/sensy32.md b/partners/hardware/sensy32.md
new file mode 100644
index 0000000000..d2c738d652
--- /dev/null
+++ b/partners/hardware/sensy32.md
@@ -0,0 +1,9 @@
+---
+layout: hardware-partner
+hardware-partner: Sensy32
+description: All-in-One Sensor IoT Board with LCD designed for sensor enthusiasts, developers, and IoT creators. Powered by ESP32-S3 and packed with a wide array of sensors, it enables seamless monitoring, analysis, and visualization of real-world data. Backed by a robust ESP32-S3 Wifi and Bluetooth module, Sensy32 is not just a board; it's a gateway to endless possibilities.
+
+---
+
+
+