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 + +![{{deviceName}}](/images/devices-library/{{page.deviceImageFileName}}){: 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. + +--- + + +