diff --git a/.gitignore b/.gitignore
index 92f284028..071293d97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,5 +2,9 @@
.DS_Store
**/.DS_Store
+Nextion2Text.*
+*.cmd
+*.bat
+
# Ignore IntelliJ IDEA project directory
.idea
diff --git a/README.md b/README.md
index d36ad9638..79024b5a8 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@ The goal was to create a version that allows everyone to use the NSpanel fully l
đ WE ARE LOOKING FOR YOU! _**We are always looking for people who would like to support this project. We are looking for help with "programming new features, writing documentation or translating documentation to EN. If you are interested then please contact us :)**_
+
## NSPanel:
![2 Home](https://user-images.githubusercontent.com/41958506/212768891-9610d800-43c5-454f-a8b6-6b7c43677b5d.png)
@@ -35,46 +36,46 @@ The goal was to create a version that allows everyone to use the NSpanel fully l
![3 Buttonpage](https://user-images.githubusercontent.com/41958506/203654022-c6d81263-ce56-4a84-917a-9d4911f19f55.png)
![NEW Domains](https://user-images.githubusercontent.com/41958506/206879659-3aea30c1-b126-4d52-a869-abf6adfc8fa1.png)
-(Home and Buttonpage)
+(Home and Button page)
![4 lightsetting 1](https://user-images.githubusercontent.com/41958506/203654055-943d1910-7673-4d9f-ad81-7ef00d155e5a.png)
![5 Lightsetting 2](https://user-images.githubusercontent.com/41958506/203654076-93e110df-f314-4cf1-8500-ed667f2202fd.png)
-(Lightsettings - Brightness and TEMP Color)
+(Light settings - Brightness and TEMP Color)
![6 Lightsetting 3](https://user-images.githubusercontent.com/41958506/203654179-f7303b02-c886-4890-b976-cb498940a627.png)
![7 Thermostat](https://user-images.githubusercontent.com/41958506/203654189-4294b634-430f-423c-b170-9f1680f94b0e.png)
-(Colorwheel and Thermostat)
+(Light color wheel and Thermostat)
![8 Cover](https://user-images.githubusercontent.com/41958506/203654290-c6ec2f2f-7924-492c-914c-0d96dc3907e0.png)
![9 Weather](https://user-images.githubusercontent.com/41958506/203654307-24000d00-b7e1-47eb-bd64-9e97b508db52.png)
-(Coversetting and Weather Forecast)
+(Cover settings and Weather forecast)
![10 Settings](https://user-images.githubusercontent.com/41958506/203654386-e4e574ad-8674-4268-84dd-1c4e40f98eb9.png)
![1 Boot](https://user-images.githubusercontent.com/41958506/203667473-d33523a4-3197-4838-9099-cccebfc727db.png)
-(NSPanel Settings and Boot Screen)
+(NSPanel settings and Boot screen)
![Device Setting 1](https://user-images.githubusercontent.com/41958506/203723223-8afc0e44-51cf-49ed-8a49-8ba713716639.png)
![Device Setting 2](https://user-images.githubusercontent.com/41958506/203724491-53ecd93d-bc7c-4c2d-850b-f106691e2639.png)
-(HA Device Setting for Example temperature correction)
-
+(HA device settings - Temperature correction)
+
## Blueprint:
![Blueprint 1](https://user-images.githubusercontent.com/41958506/203655004-a11f5a1c-d098-4e1a-958a-0293e50000b2.png)
![Blueprint 2](https://user-images.githubusercontent.com/41958506/203655014-e6cae9df-aaf8-4537-8165-b8f44a177d3b.png)
-
+
## Features:
- Easy to use and simple configuration via Blueprint - no change in the code is necessary
- 32 buttons on 4 button pages with long press function for settings (more buttons are also possible)
@@ -82,9 +83,9 @@ The goal was to create a version that allows everyone to use the NSpanel fully l
- Buttons show current brightness and cover position in the button itself
- Buttons label can be assigned via blueprint
- Weather + 5 days weather forecast
-- Thermostat + Touch + Relay control for floor heating
-- Light control (brightness-slider, colorwheel, TempColor-slider) - via long Press
-- Cover control (open, close, position-slider) - via long press
+- Thermostat + Touch + [Relay control for floor heating](/docs/en/addon_climate.md)
+- Light control (brightness, color and temperature) - via long Press
+- Cover control (open, close and position) - via long press
- Settings page (display brightness, display dim brightness, sleep mode, reboot NSPanel)
- Swipe between pages
- Top menu with 10 icons for specific states
@@ -93,10 +94,10 @@ The goal was to create a version that allows everyone to use the NSpanel fully l
- 2 physical switches with optional fallback mode
- and much more ;)
+
+## Pages
-# Pages
-
-## Home
+### Home
- Current weather with button to Weather Forcast page
- Hardware buttons can be freely assigned
- Hardware button label (optional)
@@ -107,63 +108,75 @@ The goal was to create a version that allows everyone to use the NSpanel fully l
- Room humidity
- Up to 3 user's selectable entities
-
-## Button Page
-- 32 Button
+
+### Button Page
+- Up to 32 buttons
- 4 Button pages
- Button design is automatically generated based on the selected entity
- Buttons show current brightness and cover position in the button itself
- Buttons label can be assigned via blueprint
-- all buttons with long press function
-- automatic detection by long press if it is a light or cover for submenu
-- swipe between all pages
-- swipe also down and up for fast access to certain pages
-
+- All buttons with long press function
+- Automatic detection by long press if it is a light, cover or climate for submenu
+- Swipe between all pages
+- Swipe also down and up for fast access to certain pages
-## Light Settings
+
+### Light Settings
- Light current state
-- Brightness Slider
-- Colorwheel
-- TempColor slider
+- Brightness slider
+- RGB color wheel
+- Color temperature slider
- Jump back to the right button page
-
-## Cover Settings
+
+### Cover Settings
- Open and close cover
- Cover position via slider
-- Cover battery value if available (I use Ikea roller blind)
+- Cover battery value (when available)
- jump back to the right button page
+
+### Thermostat / Climate
+- Target temperature control slider
+- Current temperature
+- 4 user's selectable values (for water and external temperatures, etc.)
+- All the standard climate controls from Home Assistant (`heat`, `fan`, `cool`, `auto`, `dry`)
+- 2 user's selectable buttons
+- [Can be used for local control (even when Wi-Fi is unavailable) when your panel's relays are used to control your cooler/heater](/docs/en/addon_climate.md)
+
+
+### Fan speed
+- Turn-on and turn-off fan
+- Set speed via slider or buttons
+- jump back to the right button page
-## Thermostat
-- Touch Temp control
-- Outside temperature
-- Hot water
-- heating on, off and idle
-- Hot water button
+
+### Alarm
+- Arm/disarm an alarm (standard modes supported by Home Assistant)
+- Support to numeric pin for arming or disarming
-## Weather Forecast
-- 5 days Weather Forecast via swipe (Integration Accuweather - but should also go with other integrations)
-- Lowest and highest temperature outside
+
+### Weather Forecast
+- 5 days weather forecast via swipe (supports most used weather integrations)
+- Min and max outside temperatures
- Date
-- Rain probability
-- Sunshine hours
-- UV index
-- Thunderstorm probability
-- Wind speed
-
-
-## Display Settings
+- Other weather parameters (when provided by your integration):
+ - Rain probability
+ - Sunshine hours
+ - UV index
+ - Thunderstorm probability
+ - Wind speed
+
+
+### Display Settings
- Restart NSPanel
-- Sleep mode - display off after time X
+- Sleep mode - Turn off display after given time (seconds)
- Display brightness slider
- Display dim brightness slider
-- Status Brightness in %
-
-
+
## Thanks to:
SmartHome Yourself: https://www.youtube.com/c/SmarthomeyourselfDe_DIY
diff --git a/custom_configuration/nspanel_blank_code/Program.s.txt b/custom_configuration/nspanel_blank_code/Program.s.txt
new file mode 100644
index 000000000..c007e76bb
--- /dev/null
+++ b/custom_configuration/nspanel_blank_code/Program.s.txt
@@ -0,0 +1,8 @@
+Program.s
+ //The following code is only run once when power on, and is generally used for global variable definition and power on initialization data
+ int sys0=0,sys1=0,sys2=0 //At present, the definition of global variable only supports 4-byte signed integer (int), and other types of global quantity declaration are not supported. If you want to use string type, you can use variable control in the page to implement
+ bauds=115200//Configure baudrate
+ dim=100//Configure backlight
+ recmod=0//Serial data parsing mode:0-Passive mode;1-Active mode
+ printh 00 00 00 ff ff ff 88 ff ff ff//Output power on information to serial port
+ page 0 //Power on start page 0
diff --git a/custom_configuration/nspanel_blank_code/page0.txt b/custom_configuration/nspanel_blank_code/page0.txt
new file mode 100644
index 000000000..e6969bb5b
--- /dev/null
+++ b/custom_configuration/nspanel_blank_code/page0.txt
@@ -0,0 +1,21 @@
+Page page0
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+QR Code qr0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Text : https://github.com/Blackymas/NSPanel_HA_Blueprint
+ Max. Text Size : 50
+
diff --git a/docs/en/addon_climate.md b/docs/en/addon_climate.md
new file mode 100644
index 000000000..95b61d5cb
--- /dev/null
+++ b/docs/en/addon_climate.md
@@ -0,0 +1,137 @@
+# Add-on: Climate
+
+## Description
+This add-on enables the use of your panel's relays to act as a thermostat (either cooler or heater) using the internal temperature sensor and independent of the network availability.
+
+### Attention
+1. The NSPanel is limited to 2A per relay. Don't use it for directly power your cooler/heater if exceeding the panel specifications:
+ - 150W/110V/Gang, 300W/110V/Total
+ - 300W/220V/Gang, 600W/220V/Total
+ - More details on the [Sonoff NSPanel's page](https://sonoff.tech/product/central-control-panel/nspanel/) and the [product specifications document](https://sonoff.tech/wp-content/uploads/2021/11/%E4%BA%A7%E5%93%81%E5%8F%82%E6%95%B0%E8%A1%A8-NSPanel-20210831.pdf).
+
+2. At this moment you have to choose between `heat` or `cool`. The dual/simultaneous operation is not supported at this moment.
+3. A target temperature must be set on the climate entity in Home Assistant or the page Climate in your panel.
+
+
+## Installation
+You will need to add the reference to `addon_climate_heat` or `addon_climate_cool` files on your ESPHome settings in the `package` section and after te `remote_package` (base code), as shown bellow (for `heat` in this example):
+
+```yaml
+substitutions:
+ ###### CHANGE ME START ######
+ device_name: "YOUR_NSPANEL_NAME"
+ wifi_ssid: !secret wifi_ssid
+ wifi_password: !secret wifi_password
+
+ nextion_update_url: "http://homeassistant.local:8123/local/nspanel_eu.tft"
+
+ ##### addon-configuration #####
+ ## addon_climate ##
+ heater_relay: "1" # possible values: 1/2
+
+ ##### CHANGE ME END #####
+
+
+packages:
+ remote_package:
+ url: https://github.com/Blackymas/NSPanel_HA_Blueprint
+ ref: main
+ files:
+ - nspanel_esphome.yaml # Core package
+ # - nspanel_esphome_addon_climate_cool.yaml # activate for local climate (cooling) control
+ - nspanel_esphome_addon_climate_heat.yaml # activate for local climate (heater) control
+
+ refresh: 300s
+```
+
+## Configuration
+
+The following keys are available to be used in your `substitutions`:
+
+Key|Required|Supported values|Default|Description
+:-|:-:|:-:|:-:|:-
+cooler_relay|Mandatory for `cool`|`1` or `2`|`0` (disabled)|Relay used for control the cooler. User `1` for "Relay 1" or `2` for "Relay 2".
+heater_relay|Mandatory for `heat`|`1` or `2`|`0` (disabled)|Relay used for control the heater. User `1` for "Relay 1" or `2` for "Relay 2".
+temp_units|Optional|`°C` or `°F`|`°C`|Temperature unit.
+min_off_time|Optional|Positive integer representing the number of seconds|`300`|Minimum duration (in seconds) the cooling/heating action must be disengaged before it may be engaged.
+min_run_time|Optional|Positive integer representing the number of seconds|`300`|Minimum duration (in seconds) the cooling/heating action must be engaged before it may be disengaged.
+min_idle_time|Optional|Positive integer representing the number of seconds|`30`|Minimum duration (in seconds) the idle action must be active before calling another climate action.
+temp_min|Optional|Number representing a temperature in the selected unit|`15` for `cool`, `5` for `heat`|The minimum temperature the climate device can reach. Used to set the range of the frontend gauge.
+temp_max|Optional|Number representing a temperature in the selected unit|`45` for `cool`, `25` for `heat`|The maximum temperature the climate device can reach. Used to set the range of the frontend gauge.
+temp_step|Optional|Number representing a temperature in the selected unit|`0.5`|The granularity with which the target temperature can be controlled.
+
+- All values must be delimited with `""`
+- For more details on the keys, please take a look at [ESPHome Base Climate Configurations](https://esphome.io/components/climate/index.html#base-climate-configuration) and [ESPHome Climate Thermostat - Additional actions behavior](https://esphome.io/components/climate/thermostat.html#additional-actions-behavior).
+
+
+### Examples:
+
+#### Cooler:
+
+```yaml
+substitutions:
+ ###### CHANGE ME START ######
+ device_name: "YOUR_NSPANEL_NAME"
+ wifi_ssid: !secret wifi_ssid
+ wifi_password: !secret wifi_password
+
+ nextion_update_url: "http://homeassistant.local:8123/local/nspanel_us.tft"
+
+
+ ##### addon-configuration #####
+ ## addon_climate ##
+ cooler_relay: "1" #Use relay 1
+ temp_units: "°F" #Temperatures in Fahrenheit
+ temp_min: "40" #Min supported temperature is 40°F
+ temp_max: "80" #Max supported temperature is 80°F
+ temp_step: "1" #Temperature granularity is 1°F
+
+ ##### CHANGE ME END #####
+
+
+packages:
+ remote_package:
+ url: https://github.com/Blackymas/NSPanel_HA_Blueprint
+ ref: main
+ files:
+ - nspanel_esphome.yaml # Core package
+ - nspanel_esphome_addon_climate_cool.yaml # activate for local climate (cooling) control
+ # - nspanel_esphome_addon_climate_heat.yaml # activate for local climate (heater) control
+ refresh: 300s
+```
+
+
+#### Heater:
+
+```yaml
+substitutions:
+ ###### CHANGE ME START ######
+ device_name: "YOUR_NSPANEL_NAME"
+ wifi_ssid: !secret wifi_ssid
+ wifi_password: !secret wifi_password
+
+ nextion_update_url: "http://homeassistant.local:8123/local/nspanel_us.tft"
+
+
+ ##### addon-configuration #####
+ ## addon_climate ##
+ heater_relay: "1" #Use relay 1
+ temp_units: "°F" #Temperatures in Fahrenheit
+ temp_min: "40" #Min supported temperature is 40°F
+ temp_max: "80" #Max supported temperature is 80°F
+ temp_step: "1" #Temperature granularity is 1°F
+
+ ##### CHANGE ME END #####
+
+
+packages:
+ remote_package:
+ url: https://github.com/Blackymas/NSPanel_HA_Blueprint
+ ref: main
+ files:
+ - nspanel_esphome.yaml # Core package
+ # - nspanel_esphome_addon_climate_cool.yaml # activate for local climate (cooling) control
+ - nspanel_esphome_addon_climate_heat.yaml # activate for local climate (heater) control
+ refresh: 300s
+```
+
diff --git a/docs/en/alarm.md b/docs/en/alarm.md
new file mode 100644
index 000000000..ee4a4d65d
--- /dev/null
+++ b/docs/en/alarm.md
@@ -0,0 +1,52 @@
+# Alarm Control Panel
+
+You can control an Alarm Control Panel from your NSPanel, which will allow you to set the alarm mode between the standard modes supported by Home Assistant (Home, Away, Night, Vacation or Custom bypass) or disarm the alarm.
+
+Currently, only alarms without a code or alarms with a numeric code will be supported. If your alarm requires a text code, you will still be able to display it on your NSPanel, however, when you click in any button it will send services calls to Home Assistant without the code and it will fail for the calls where a code is required.
+
+
+### Security advisory
+
+By default, the communication between your NSPanel (ESPHome) and Home Assistant (HA) is not encrypted, which means a person with access to your network could potentially monitor the communication between your panel and HA and replicate the service calls. Although this is not a big issue for most of the service calls (turn-on a light, close a curtain, etc.), it can be a problem when controlling your alarm system.
+Based on that, we hardly reccoment the use of API encryption for all users controlling an Alarm system via a NSPanel. You can easily enable this by following the ["API encryption" example available here](customization.md#api-encryption).
+
+
+## Configuration
+### Allow the device to make Home Assistant service calls
+First, you have to configure your Home Assistant to allow your panel to make service calls. All other services are called from the Blueprint, however this requires the ESPHome to send an event containing in plain text all the information needed to the service call, which could be a security issue, so all the alarm calls will be driven by the panel to ensure a safer environment.
+To enable this option, go to your ESPHome integrations panel (Settings > Devices and Services > ESPHome) and click "Configure" next to the entry related to your panel:
+![image](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/37bfc622-c0cd-4941-a397-3eeb2ddbe6a2)
+
+Then check the option "Allow the device to make Home Assistant service calls":
+![image](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/9b20a1b6-94ad-4fff-aef2-eb3599db9bf1)
+
+### Blueprint settings
+Open the automation based on the NSPanel Blueprint and look for a section related to "Alarm Control Panel".
+Select your alarm control panel entity, click "Save", and your are done. :sunglasses:
+![image](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/859d3f4b-9a05-4694-9e2c-c32ab3a5e22f)
+
+
+
+## Controlling your alarm from your panel
+When an alarm control panel is set in your Blueprint automation, you will see the alarm icon on your panel's Home page. This icon will change following the alarm state as described in the table below.
+
+A click on that icon will show the Alarm Control Panel page:
+![image](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/bc312981-3d5a-42c7-b0b4-203457ff549f)
+
+You can change your alarm settings with a single click on the button related to the new state you want to set your alarm to, or close the page to go back to Home page.
+
+### Description of states shown with the alarm icon
+
+State | Color | Icon | Icon name | Description
+-- | -- | -- | -- | --
+disarmed | White |![shield-off-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/5b1c8219-3958-4096-9100-0b4ef47e7dac)|mdi:shield-off-outline | The alarm is disarmed (off).
+armed_home | Green |![shield-home-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/1ed9347b-139a-4729-a795-b08934b56581)| mdi:shield-home-outline | The alarm is armed in home mode.
+armed_away | Green |![shield-lock-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/998db33c-3ec5-47dd-9686-c28eee81e9eb)| mdi:shield-lock-outline | The alarm is armed in away mode.
+armed_night | Green |![shield-moon-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/84528bca-577d-4a43-8366-e6f9e41bc7b4)| mdi:shield-moon-outline | The alarm is armed in night mode.
+armed_vacation | Green |![shield-airplane-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/067218de-ec8c-4fce-a427-7848a7ae9f27)| mdi:shield-airplane-outline | The alarm is armed in vacation mode.
+armed_custom_bypass | Green |![shield-half-full](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/af7ed346-28eb-4796-b62b-2a51e9cb6272)| mdi:shield-half-full | The alarm is armed in bypass mode.
+pending | Amber |![shield-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/31bcd613-04d6-455a-a443-3299211d487e)| mdi:shield-outline | The alarm is pending (towards triggered).
+arming | Amber |![shield-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/31bcd613-04d6-455a-a443-3299211d487e)| mdi:shield-outline | The alarm is arming.
+disarming | Amber |![shield-off-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/37c02584-dd65-4575-8d95-c7346de599e4)| mdi:shield-off-outline | The alarm is disarming.
+triggered | Red |![shield-alert-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/ee1ec55b-e671-4aa0-9baa-77eb2a8c8c7f)| mdi:shield-alert-outline | The alarm is triggered.
+unknown / unavailable | White |![shield-alert-outline](https://github.com/Blackymas/NSPanel_HA_Blueprint/assets/94725493/a382e5ab-2e16-453c-bc9b-b3dcd3825de7)| mdi:shield-alert-outline | The alarm state is unknown or unavailable
diff --git a/docs/en/customization.md b/docs/en/customization.md
new file mode 100644
index 000000000..3f79f8376
--- /dev/null
+++ b/docs/en/customization.md
@@ -0,0 +1,166 @@
+# Customization
+
+## Description
+This project adds lots of functionalities to your NSPanel and we are constantly adding new features based on user's feedback. However, you might have some specific case that are not included on the current implementation or is not a common case for other users.
+
+You can take advantage of [ESPHome Configuration Types](https://esphome.io/guides/configuration-types.html) to add your custom functionality or even to customize an existing functionality with minimum effort and this document intents to clarify how to use this and give some examples of customization.
+
+Please feel free to add your own customation to this document by creating a PR in the `dev` branch.
+
+***IMPORTANT:** Use customization at your own risk. Custom/advanced systems won't be supported by this project's team.*
+
+
+## Instructions
+There's nothing particular for this project, so you can just use any of the [ESPHome Configuration Types](https://esphome.io/guides/configuration-types.html) and only edit your local ESPHome yaml settings.
+
+Most of the ESPHome components in this project contains an `Id`, which can be used together with the `!extend` key to add or replace existing code.
+
+You should add your customizations at the end of your ESPHome yaml, as in the example bellow:
+
+```yaml
+substitutions:
+ ###### CHANGE ME START ######
+ device_name: "YOUR_NSPANEL_NAME"
+ wifi_ssid: !secret wifi_ssid
+ wifi_password: !secret wifi_password
+
+ nextion_update_url: "http://homeassistant.local:8123/local/nspanel_us.tft"
+
+ ##### addon-configuration #####
+ ## addon_climate ##
+ # addon_climate_heater_relay: "1" # possible values: 1/2
+
+ ##### CHANGE ME END #####
+
+packages:
+ remote_package:
+ url: https://github.com/Blackymas/NSPanel_HA_Blueprint
+ ref: main
+ files:
+ - nspanel_esphome.yaml
+ #- nspanel_esphome_addon_climate.yaml # activate local climate-control
+ refresh: 300s
+
+##### My customization - Start #####
+# Encrypt the communication between ESPHome and Home Assistant
+api:
+ encryption:
+ key: !secret api_encryption_key
+# More detailed log (for troubleshooting only)
+logger:
+ level: VERBOSE
+##### My customization - End #####
+```
+
+
+## Examples
+### API encryption
+This is highly recommended when you are transfer sensitive information between your panel and Home Assistant, as when you use your panel to enter the PIN for an Alarm Control Panel.
+
+```yaml
+# Encrypt the communication between ESPHome and Home Assistant
+api:
+ encryption:
+ key: !secret api_encryption_key
+```
+
+### Custom OTA password
+By default, the Wi-Fi password will be used as your OTA password, but you can replace it.
+First, you need to change the default password using this code.
+```yaml
+# change OTA password, remove after flashing
+esphome:
+ on_boot:
+ - lambda: |-
+ id(my_ota).set_auth_password("New password");
+ota:
+ password: !secret wifi_password
+ id: my_ota
+```
+After flashing the device, you must remove the code above and replace it with the code below to start using this customization.
+```yaml
+# Use my global OTA password
+ota:
+ password: !secret ota_password
+```
+
+### Web server credentials
+By default, the web server credentials are defined by this project using `admin` as `username` and your `Wi-Fi password` as `password`, but you can replace it using this customization:
+```yaml
+# Custom web server credentials
+web_server:
+ auth:
+ username: !secret web_server_username
+ password: !secret web_server_password
+```
+
+### Reboot when API fails
+Reboot your panel if it loses it's connection to Home Assistant for more than a certain time (15 minutes in this example).
+Sometimes the low level ESP functions could report that the ESP is connected to the network, when in fact it is not and only a full reboot fixes it.
+To support long times without Wi-Fi, this is disabled by default in this project, but you can set a reasonable interval to restart, based on your network reliability.
+```yaml
+# Reboot if HA is not connected for 15 minutes
+api:
+ reboot_timeout: 15min
+```
+
+### Change uart's baud rate
+Use this to change the baud rate on the communication between ESPHome and Nextion display.
+Important: Use only when troubleshooting as your display should be set to always communicate at 115200 bps.
+```yaml
+# Set Nextion comm's baud rate to 9600 bps
+uart:
+ baud_rate: 9600
+```
+
+### Manual IP
+Set IP address manually.
+```yaml
+# Set IP address manually
+wifi:
+ networks:
+ - id: !extend wifi_default
+ manual_ip:
+ static_ip: 192.168.0.123
+ gateway: 192.168.0.1
+ subnet: 255.255.255.0
+```
+
+### Hidden Wi-Fi
+Connect to a hidden Wi-Fi network.
+```yaml
+# Connect to a hidden Wi-Fi network.
+wifi:
+ networks:
+ - id: !extend wifi_default
+ hidden: true
+ fast_connect: true
+```
+
+### Connect to multiple networks
+NSPanel will attempt to connect to the one with the highest signal strength or, if you set a priority, it will try to connect to the highest priority. After failing it will connect to the second network.
+```yaml
+# Set dual network
+wifi:
+ networks:
+ - id: !extend wifi_default
+ priority: 10
+ - ssid: !secret wifi_ssid_backup
+ password: !secret wifi_password_backup
+ priority: 0
+```
+
+### SNTP (time) server
+ESPHome takes it's time from Home Assistant, however you can configure it to use a Network Time Server instead.
+```yaml
+# Use my own local network time server
+time:
+ - id: !extend time_provider
+ platform: sntp
+ timezone: Europe/Stockholm
+ servers:
+ - !secret mysntpserver
+ - europe.pool.ntp.org
+ - 0.pool.ntp.org
+```
+
diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml
index 6454b819a..34bbd0778 100644
--- a/nspanel_blueprint.yaml
+++ b/nspanel_blueprint.yaml
@@ -18,27 +18,27 @@ blueprint:
The goal was to create a version that allows everyone to use the NSpanel fully local without having to deal with programming or reading hours of documentation - *AND YES WE DID IT!!!!* ;)
- đ Full documentation and installation video is available here [NSPanel Configuration, Setup and HowTo](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki).
+ đ Full documentation and installation video is available here: [NSPanel Configuration, Setup and HowTo](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki).
đ Step by Step - [Setup Video](https://www.youtube.com/watch?v=3afPFg6kUdc)
- đ How to create "Issues" when I have a problem [WIKI HowTo](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki)
+ đ How to create "Issues" when I have a problem: [WIKI HowTo](https://github.com/Blackymas/NSPanel_HA_Blueprint/wiki)
- â All Feature Requests can be found here [All Feature Request](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/new%20feature%20request)
+ â All Feature Requests can be found here: [All Feature Request](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/new%20feature%20request)
- đ Roadmap Roadmap can be found here [Roadmap](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/roadmap)
+ đ Roadmap can be found here: [Roadmap](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/roadmap)
- âšī¸ Version: v.3.4
+ âšī¸ Version: v4.0
source_url: https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/nspanel_blueprint.yaml
domain: automation
homeassistant:
- min_version: 2022.11.1
+ min_version: 2023.5.0
# yamllint disable rule:line-length
input:
@@ -52,9 +52,9 @@ blueprint:
default: []
selector:
device:
- #filter: # requires 2023.4, so will be implemented later
- # - integration: esphome
- # model: esp32dev
+ filter:
+ - integration: esphome
+ model: esp32dev
multiple: false
##### SYSTEM SETTINGS #####
@@ -64,67 +64,10 @@ blueprint:
*SYSTEM settings*
*Select the language for your NSPanel*
- default: 'ENG'
+ default: en
selector:
- select:
- mode: dropdown
- options:
- - label: 'Bulgarian'
- value: BGR
- - label: 'Croatian'
- value: HRV
- - label: 'Czech'
- value: CZE
- - label: 'Danish'
- value: DNK
- - label: 'Dutch'
- value: NLD
- - label: 'English'
- value: ENG
- - label: 'Estonian'
- value: EST
- - label: 'Finnish'
- value: FIN
- - label: 'French'
- value: FRA
- - label: 'German'
- value: DEU
- - label: 'Greek'
- value: GRC
- - label: 'Hebrew'
- value: HEB
- - label: 'Hungarian'
- value: HUN
- - label: 'Indonesian'
- value: IDN
- - label: 'Italian'
- value: ITA
- - label: 'Latvian'
- value: LVA
- - label: 'Lithuanian'
- value: LTU
- - label: 'Norwegian'
- value: NOR
- - label: 'Polish'
- value: POL
- - label: 'Portuguese'
- value: PRT
- - label: 'Romanian'
- value: ROU
- - label: 'Russian'
- value: RUS
- - label: 'Slovak'
- value: SVK
- - label: 'Slovene'
- value: SVN
- - label: 'Spanish'
- value: ESP
- - label: 'Swedish'
- value: SWE
- - label: 'Turkish'
- value: TUR
- - label: 'Ukrainian'
- value: UKR
+ language:
+ languages: [en, bg, hr, cs, da, nl, et, fi, fr, de, el, he, hu, id, it, lv, lt, nb, pl, pt, ro, ru, sk, sl, es, sv, tr, uk]
date_format:
name: Date Format
description: >
@@ -163,7 +106,7 @@ blueprint:
- label: 'HH:MM (ex. 08:30 and 20:30)'
value: '%H:%M'
- label: 'H:MM AM/PM (ex. 8:30AM and 8:30PM)'
- value: '%-I:%M'
+ value: '%-I:%M %p'
- label: 'H:MM 24H (ex. 8:30 and 20:30)'
value: '%-H:%M'
@@ -199,8 +142,9 @@ blueprint:
default: []
selector:
entity:
- domain:
- - weather
+ filter:
+ domain:
+ - weather
##### Page Home #####
##### Temperature - Page Home #####
@@ -211,10 +155,13 @@ blueprint:
*If no outdoor sensor is available, leave the field empty and the value from your selected weather integration will be used automatically*
default: []
- selector:
+ selector: &entity_temp_sensor-selector
entity:
- domain:
- - sensor
+ filter:
+ domain:
+ - sensor
+ device_class:
+ - temperature
home_outdoor_temp_label_color:
name: Outdoor Temperature Sensor - LABEL COLOR (Optional)
description: >
@@ -231,10 +178,7 @@ blueprint:
*An indoor temperature sensor is not necessary. Leave the field empty if you want to use the temperature sensor of the NSPanel. Additionally a temperature correction for the NSPanel sensor is possible under HA Devices. So everyone can adjust the sensor exactly*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_temp_sensor-selector
home_indoor_temp_icon:
name: Indoor Temperature Sensor - ICON (Optional)
description: >
@@ -264,7 +208,7 @@ blueprint:
##### PLACEHOLDER ######################################################################
placeholder02:
name: ' '
- description: '# â
SENSOR HOME PAGE â
'
+ description: '# â
HOME PAGE - SENSORS â
'
default: ' '
selector: *placeholder-selector
##### PLACEHOLDER ######################################################################
@@ -275,10 +219,11 @@ blueprint:
*Entity which should be displayed*
default: []
- selector:
+ selector: &entity_sensor-selector
entity:
- domain:
- - sensor
+ filter:
+ domain:
+ - sensor
home_value01_icon:
name: Sensor 01 - ICON (Optional)
description: >
@@ -310,10 +255,7 @@ blueprint:
*Entity which should be displayed*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_sensor-selector
home_value02_icon:
name: Sensor 02 - ICON (Optional)
description: >
@@ -345,10 +287,7 @@ blueprint:
*Entity which should be displayed*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_sensor-selector
home_value03_icon:
name: Sensor 03 - ICON (Optional)
description: >
@@ -377,7 +316,7 @@ blueprint:
##### PLACEHOLDER ######################################################################
placeholder03:
name: ' '
- description: '# â
CHIPS â
'
+ description: '# â
HOME PAGE - CHIPS â
'
default: ' '
selector: *placeholder-selector
##### PLACEHOLDER ######################################################################
@@ -390,12 +329,13 @@ blueprint:
default: []
selector: &chip-entity-selector
entity:
- domain:
- - binary_sensor
- - input_boolean
- - light
- - sensor
- - switch
+ filter:
+ domain:
+ - binary_sensor
+ - input_boolean
+ - light
+ - sensor
+ - switch
chip01_icon:
name: Chip 01 - ICON (Optional)
description: >
@@ -556,6 +496,93 @@ blueprint:
*Icon color which should be displayed*
default: [128, 128, 128] #33808 Grey light
selector: *color-selector
+ ## Custom buttons - Page Home
+ ##### PLACEHOLDER ######################################################################
+ placeholder18:
+ name: ' '
+ description: '# â
HOME PAGE - CUSTOM BUTTONS â
'
+ default: ' '
+ selector: *placeholder-selector
+ ##### PLACEHOLDER ######################################################################
+ ## Page Home - Custom button 01
+ home_custom_button01:
+ name: Custom button 01 - ENTITY (Optional)
+ description: >
+ *HOME page*
+
+ *Entity which should be displayed (ONLY climate | cover | fan | light | media_player)*
+ default: []
+ selector: &home-custom-button-entity-selector
+ entity:
+ filter:
+ domain:
+ - climate
+ - cover
+ - fan
+ - light
+ - media_player
+ home_custom_button01_icon:
+ name: Custom button 01 - ICON (Optional)
+ description: >
+ *HOME page*
+
+ *Icon which should be displayed (Default - an icon matching the entity will be set automatically)*
+ default: []
+ selector: *icon-selector
+ ## Page Home - Custom button 02
+ home_custom_button02:
+ name: Custom button 02 - ENTITY (Optional)
+ description: >
+ *HOME page*
+
+ *Entity which should be displayed (ONLY climate | cover | fan | light | media_player)*
+ default: []
+ selector: *home-custom-button-entity-selector
+ home_custom_button02_icon:
+ name: Custom button 02 - ICON (Optional)
+ description: >
+ *HOME page*
+
+ *Icon which should be displayed (Default - an icon matching the entity will be set automatically)*
+ default: []
+ selector: *icon-selector
+ ## Page Home - Custom button 03
+ home_custom_button03:
+ name: Custom button 03 - ENTITY (Optional)
+ description: >
+ *HOME page*
+
+ *Entity which should be displayed (ONLY climate | cover | fan | light | media_player)*
+ default: []
+ selector: *home-custom-button-entity-selector
+ home_custom_button03_icon:
+ name: Custom button 03 - ICON (Optional)
+ description: >
+ *HOME page*
+
+ *Icon which should be displayed (Default - an icon matching the entity will be set automatically)*
+ default: []
+ selector: *icon-selector
+
+ ##### Alarm Control Panel - Page Alarm
+ ##### PLACEHOLDER ######################################################################
+ placeholder17:
+ name: ' '
+ description: '# â
ALARM CONTROL PANEL â
'
+ default: ' '
+ selector: *placeholder-selector
+ ##### PLACEHOLDER ######################################################################
+ alarm:
+ name: Alarm Control Panel to control from Home page - ENTITY (Optional)
+ description: >
+ *ALARM page*
+
+ *If an entity is selected, the **"Alarm page"** is activated and enabled.
+ default: []
+ selector:
+ entity:
+ filter:
+ domain: alarm_control_panel
##### Climate - Page Climate #####
##### PLACEHOLDER ######################################################################
@@ -574,7 +601,8 @@ blueprint:
default: []
selector:
entity:
- domain: climate
+ filter:
+ domain: climate
## Climate page - Custom buttons
## Climate page - Custom button 01
climate_button08:
@@ -582,24 +610,25 @@ blueprint:
description: >
*CLIMATE page*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: &climate-custom-button-entity-selector
entity:
- domain:
- - light
- - switch
- - cover
- - input_boolean
- - automation
- - button
- - input_button
- - scene
- - person
- - script
- - binary_sensor
- - fan
- #- climate
+ filter:
+ domain:
+ - light
+ - switch
+ - cover
+ - input_boolean
+ - automation
+ - button
+ - input_button
+ - scene
+ - person
+ - script
+ - binary_sensor
+ - fan
+ #- climate
climate_button08_icon:
name: Custom button 01 - ICON (Optional)
description: >
@@ -631,7 +660,7 @@ blueprint:
description: >
*CLIMATE page*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *climate-custom-button-entity-selector
climate_button09_icon:
@@ -669,10 +698,7 @@ blueprint:
*Entity which should be controlled*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_sensor-selector
climate_value01_icon:
name: Sensor 01 - ICON (Optional)
description: >
@@ -705,10 +731,7 @@ blueprint:
*Entity which should be displayed*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_sensor-selector
climate_value02_icon:
name: Sensor 02 - ICON (Optional)
description: >
@@ -741,10 +764,7 @@ blueprint:
*Entity which should be displayed*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_sensor-selector
climate_value03_icon:
name: Sensor 03 - ICON (Optional)
description: >
@@ -777,10 +797,7 @@ blueprint:
*Entity which should be displayed*
default: []
- selector:
- entity:
- domain:
- - sensor
+ selector: *entity_sensor-selector
climate_value04_icon:
name: Sensor 04 - ICON (Optional)
description: >
@@ -820,7 +837,7 @@ blueprint:
description: >
*HOME page*
- *activate QR Code page and QR Code Button on the home page* '
+ *activate QR Code page and QR Code Button on the home page*
selector:
boolean:
qrcode_label:
@@ -866,28 +883,6 @@ blueprint:
default: ' '
selector: *placeholder-selector
##### PLACEHOLDER ######################################################################
- hold_delay:
- name: Delay for HW-Button hold in seconds - VALUE
- description: >
- *SYSTEM settings*
-
- *Time in seconds to detect a hold*'
- default: 1.0
- selector:
- number:
- min: 1.0
- max: 10.0
- step: 1.0
- unit_of_measurement: seconds
- relay_1_local_fallback:
- name: Activate relay 1 local fallback - TRUE/FALSE (Optional)
- default: false
- description: >
- *SYSTEM settings*
-
- *activate this to use left button to toggle relay 1 if display is offline*
- selector:
- boolean:
left_button_entity:
name: Left hardware button - ENTITY (Optional)
description: >
@@ -897,23 +892,27 @@ blueprint:
default: []
selector: &hardware-button-selector
entity:
- domain:
- - light
- - switch
- - input_boolean
- - cover
- - automation
- - button
- - input_button
- - scene
- - script
- - fan
+ filter:
+ domain:
+ - light
+ - switch
+ - input_boolean
+ - cover
+ - automation
+ - button
+ - input_button
+ - scene
+ - script
+ - fan
+ - media_player
left_button_name:
name: Left hardware button name - LABEL (Optional)
description: >
*HOME page*
*Label which should be displayed (10 characters are supported)*
+
+ Note: This label is not visible on the US landscape model.
default: []
selector:
text: {}
@@ -946,15 +945,6 @@ blueprint:
*LABEL color which should be displayed*
default: [200, 204, 200] #52857 Grey super light
selector: *color-selector
- relay_2_local_fallback:
- name: Activate relay 2 local fallback - TRUE/FALSE (Optional)
- default: false
- description: >
- *SYSTEM settings*
-
- *activate this to use right button to toggle relay 2 if display is offline* '
- selector:
- boolean:
right_button_entity:
name: Right hardware button - ENTITY (Optional)
description: >
@@ -969,6 +959,8 @@ blueprint:
*HOME page*
*Label which should be displayed (10 characters are supported)*
+
+ Note: This label is not visible on the US landscape model.
default: []
selector:
text: {}
@@ -1021,24 +1013,26 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: &button-entity-selector
entity:
- domain:
- - light
- - switch
- - cover
- - input_boolean
- - automation
- - button
- - input_button
- - scene
- - person
- - script
- - binary_sensor
- - fan
- - climate
+ filter:
+ domain:
+ - light
+ - switch
+ - cover
+ - input_boolean
+ - automation
+ - button
+ - input_button
+ - scene
+ - person
+ - script
+ - binary_sensor
+ - fan
+ - climate
+ - media_player
entity01_name:
name: Button 01 name - LABEL (Optional)
description: >
@@ -1078,7 +1072,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity02_name:
@@ -1120,7 +1114,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity03_name:
@@ -1162,7 +1156,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity04_name:
@@ -1204,7 +1198,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity05_name:
@@ -1246,7 +1240,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity06_name:
@@ -1288,7 +1282,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity07_name:
@@ -1330,7 +1324,7 @@ blueprint:
description: >
*ButtonPage01*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity08_name:
@@ -1389,7 +1383,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity09_name:
@@ -1431,7 +1425,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity10_name:
@@ -1473,7 +1467,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity11_name:
@@ -1515,7 +1509,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity12_name:
@@ -1557,7 +1551,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity13_name:
@@ -1599,7 +1593,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity14_name:
@@ -1641,7 +1635,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity15_name:
@@ -1683,7 +1677,7 @@ blueprint:
description: >
*ButtonPage02*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity16_name:
@@ -1742,7 +1736,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity17_name:
@@ -1784,7 +1778,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity18_name:
@@ -1826,7 +1820,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity19_name:
@@ -1868,7 +1862,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity20_name:
@@ -1910,7 +1904,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity21_name:
@@ -1952,7 +1946,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity22_name:
@@ -1994,7 +1988,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity23_name:
@@ -2036,7 +2030,7 @@ blueprint:
description: >
*ButtonPage03*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity24_name:
@@ -2095,7 +2089,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity25_name:
@@ -2137,7 +2131,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity26_name:
@@ -2179,7 +2173,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity27_name:
@@ -2221,7 +2215,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity28_name:
@@ -2263,7 +2257,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity29_name:
@@ -2305,7 +2299,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity30_name:
@@ -2347,7 +2341,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity31_name:
@@ -2389,7 +2383,7 @@ blueprint:
description: >
*ButtonPage04*
- *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate)*
+ *Entity which should be switched (ONLY light | switch | cover | input_boolean | automation | button | input_button | scene | person | script | binary_sensor | fan | climate | media_player)*
default: []
selector: *button-entity-selector
entity32_name:
@@ -3503,22 +3497,21 @@ trace:
#############################################################
trigger_variables:
- nspanel_name_temp: !input 'nspanel_name'
- nspanel_entities: '{{ device_entities(nspanel_name_temp) }}'
+ nspanel_deviceid: !input 'nspanel_name'
+ nspanel_entities: '{{ device_entities(nspanel_deviceid) }}'
nspanel_name: >
{% if nspanel_entities | count > 0 %}{{ (nspanel_entities | selectattr(None, "search", "_nextion_display") | list | first).split(".")[1].split("_nextion_display")[0] }}
- {% elif nspanel_name_temp is string %}{{ nspanel_name_temp | replace("-","_") | replace(" ","_") | replace("___","_") | replace("__","_") }}
+ {% elif nspanel_deviceid is string %}{{ nspanel_deviceid | replace("-","_") | replace(" ","_") | replace("___","_") | replace("__","_") }}
{% endif %}
left_button: 'binary_sensor.{{ nspanel_name }}_left_button'
right_button: 'binary_sensor.{{ nspanel_name }}_right_button'
nextion_inited: 'binary_sensor.{{ nspanel_name }}_nextion_display'
- nspanelevent: 'sensor.{{ nspanel_name }}_nspanel_event'
+ currentpage: 'sensor.{{ nspanel_name }}_current_page'
relay01_entity: 'switch.{{ nspanel_name }}_relay_1'
relay02_entity: 'switch.{{ nspanel_name }}_relay_2'
nspaneltemp: 'sensor.{{ nspanel_name }}_temperature'
- settings_entity: 'sensor.{{ nspanel_name }}_settings_entity'
- reboot_button: 'button.{{ nspanel_name }}_restart'
switch_sleep_mode: 'switch.{{ nspanel_name }}_sleep_mode'
+ thermostat_embedded: 'climate.{{ nspanel_name }}_thermostat'
##### notification Trigger #####
notification_unread: 'switch.{{ nspanel_name }}_notification_unread'
@@ -3527,8 +3520,7 @@ trigger_variables:
variables:
##### GENERAL #####
- blueprint_version: '3.4'
- language: !input 'language'
+ blueprint_version: '4.0'
date_format_temp: !input 'date_format'
#Avoid breaking change for existing users with legacy type format
date_format: >
@@ -3538,20 +3530,9 @@ variables:
else "%A, " ~ date_format_temp
}}
- time_format: !input 'time_format'
- time: '{{ as_timestamp(now()) | timestamp_custom(time_format) }}'
- meridiem: '{{ as_timestamp(now()) | timestamp_custom("%p") if time_format == "%-I:%M" }}'
sun_is_up: '{{ is_state("sun.sun", "above_horizon") }}'
notification_sound: 'switch.{{ nspanel_name }}_notification_sound'
- confirmation_message: 'switch.{{ nspanel_name }}_confirmation_message'
-
- nspanel_event: >
- {{
- states(nspanelevent)
- if nspanelevent is string and states(nspanelevent) not in ["unavailable", "unknown", "", None]
- else { "page": "unknown", "component": "unknown", "value": "unknown" }
- }}
# yamllint disable-line rule:line-length
all_icons: { blank: "\uFFFF", unknown: "\uE027", unavailable: "\uE027", ab-testing: "\uE1C8", abacus: "\uF6DF", abjad-arabic: "\uF327", abjad-hebrew: "\uF328", abugida-devanagari: "\uF329", abugida-thai: "\uF32A", access-point: "\uE002", access-point-check: "\uF537", access-point-minus: "\uF538", access-point-network: "\uE001", access-point-network-off: "\uEBE0", access-point-off: "\uF510", access-point-plus: "\uF539", access-point-remove: "\uF53A", account: "\uE003", account-alert: "\uE004", account-alert-outline: "\uEB4F", account-arrow-down: "\uF867", account-arrow-down-outline: "\uF868", account-arrow-left: "\uEB50", account-arrow-left-outline: "\uEB51", account-arrow-right: "\uEB52", account-arrow-right-outline: "\uEB53", account-arrow-up: "\uF866", account-arrow-up-outline: "\uF869", account-box: "\uE005", account-box-multiple: "\uE933", account-box-multiple-outline: "\uF009", account-box-outline: "\uE006", account-cancel: "\uF2DE", account-cancel-outline: "\uF2DF", account-cash: "\uF096", account-cash-outline: "\uF097", account-check: "\uE007", account-check-outline: "\uEBE1", account-child: "\uEA88", account-child-circle: "\uEA89", account-child-outline: "\uF0C7", account-circle: "\uE008", account-circle-outline: "\uEB54", account-clock: "\uEB55", account-clock-outline: "\uEB56", account-cog: "\uF36F", account-cog-outline: "\uF370", account-convert: "\uE009", account-convert-outline: "\uF300", account-cowboy-hat: "\uEE9A", account-cowboy-hat-outline: "\uF7F2", account-details: "\uE630", account-details-outline: "\uF371", account-edit: "\uE6BB", account-edit-outline: "\uEFFA", account-eye: "\uE41F", account-eye-outline: "\uF27A", account-filter: "\uE935", account-filter-outline: "\uEF9C", account-group: "\uE848", account-group-outline: "\uEB57", account-hard-hat: "\uE5B4", account-hard-hat-outline: "\uFA1E", account-heart: "\uE898", account-heart-outline: "\uEBE2", account-injury: "\uF814", account-injury-outline: "\uF815", account-key: "\uE00A", account-key-outline: "\uEBE3", account-lock: "\uF15D", account-lock-open: "\uF95F", account-lock-open-outline: "\uF960", account-lock-outline: "\uF15E", account-minus: "\uE00C", account-minus-outline: "\uEAEB", account-multiple: "\uE00D", account-multiple-check: "\uE8C4", account-multiple-check-outline: "\uF1FD", account-multiple-minus: "\uE5D2", account-multiple-minus-outline: "\uEBE4", account-multiple-outline: "\uE00E", account-multiple-plus: "\uE00F", account-multiple-plus-outline: "\uE7FF", account-multiple-remove: "\uF209", account-multiple-remove-outline: "\uF20A", account-music: "\uE802", account-music-outline: "\uECE8", account-network: "\uE010", account-network-outline: "\uEBE5", account-off: "\uE011", account-off-outline: "\uEBE6", account-outline: "\uE012", account-plus: "\uE013", account-plus-outline: "\uE800", account-question: "\uEB58", account-question-outline: "\uEB59", account-reactivate: "\uF52A", account-reactivate-outline: "\uF52B", account-remove: "\uE014", account-remove-outline: "\uEAEC", account-school: "\uFA1F", account-school-outline: "\uFA20", account-search: "\uE015", account-search-outline: "\uE934", account-settings: "\uE62F", account-settings-outline: "\uF0C8", account-star: "\uE016", account-star-outline: "\uEBE7", account-supervisor: "\uEA8A", account-supervisor-circle: "\uEA8B", account-supervisor-circle-outline: "\uF4EB", account-supervisor-outline: "\uF12C", account-switch: "\uE018", account-switch-outline: "\uE4CA", account-sync: "\uF91A", account-sync-outline: "\uF91B", account-tie: "\uECE2", account-tie-hat: "\uF897", account-tie-hat-outline: "\uF898", account-tie-outline: "\uF0C9", account-tie-voice: "\uF307", account-tie-voice-off: "\uF309", account-tie-voice-off-outline: "\uF30A", account-tie-voice-outline: "\uF308", account-tie-woman: "\uFA8B", account-voice: "\uE5CA", account-voice-off: "\uEED3", account-wrench: "\uF899", account-wrench-outline: "\uF89A", adjust: "\uE019", advertisements: "\uF929", advertisements-off: "\uF92A", air-conditioner: "\uE01A", air-filter: "\uED42", air-horn: "\uEDAB", air-humidifier: "\uF098", air-humidifier-off: "\uF465", air-purifier: "\uED43", airbag: "\uEBE8", airballoon: "\uE01B", airballoon-outline: "\uF00A", airplane: "\uE01C", airplane-alert: "\uF879", airplane-check: "\uF87A", airplane-clock: "\uF87B", airplane-cog: "\uF87C", airplane-edit: "\uF87D", airplane-landing: "\uE5D3", airplane-marker: "\uF87E", airplane-minus: "\uF87F", airplane-off: "\uE01D", airplane-plus: "\uF880", airplane-remove: "\uF881", airplane-search: "\uF882", airplane-settings: "\uF883", airplane-takeoff: "\uE5D4", airport: "\uE84A", alarm: "\uE01F", alarm-bell: "\uE78D", alarm-check: "\uE020", alarm-light: "\uE78E", alarm-light-off: "\uF71D", alarm-light-off-outline: "\uF71E", alarm-light-outline: "\uEBE9", alarm-multiple: "\uE021", alarm-note: "\uEE70", alarm-note-off: "\uEE71", alarm-off: "\uE022", alarm-panel: "\uF5C3", alarm-panel-outline: "\uF5C4", alarm-plus: "\uE023", alarm-snooze: "\uE68D", album: "\uE024", alert: "\uE025", alert-box: "\uE026", alert-box-outline: "\uECE3", alert-circle: "\uE027", alert-circle-check: "\uF1EC", alert-circle-check-outline: "\uF1ED", alert-circle-outline: "\uE5D5", alert-decagram: "\uE6BC", alert-decagram-outline: "\uECE4", alert-minus: "\uF4BA", alert-minus-outline: "\uF4BD", alert-octagon: "\uE028", alert-octagon-outline: "\uECE5", alert-octagram: "\uE766", alert-octagram-outline: "\uECE6", alert-outline: "\uE029", alert-plus: "\uF4B9", alert-plus-outline: "\uF4BC", alert-remove: "\uF4BB", alert-remove-outline: "\uF4BE", alert-rhombus: "\uF1CD", alert-rhombus-outline: "\uF1CE", alien: "\uE899", alien-outline: "\uF0CA", align-horizontal-center: "\uF1C2", align-horizontal-distribute: "\uF961", align-horizontal-left: "\uF1C1", align-horizontal-right: "\uF1C3", align-vertical-bottom: "\uF1C4", align-vertical-center: "\uF1C5", align-vertical-distribute: "\uF962", align-vertical-top: "\uF1C6", all-inclusive: "\uE6BD", all-inclusive-box: "\uF88C", all-inclusive-box-outline: "\uF88D", allergy: "\uF257", alpha: "\uE02A", alpha-a: "\uEAED", alpha-a-box: "\uEB07", alpha-a-box-outline: "\uEBEA", alpha-a-circle: "\uEBEB", alpha-a-circle-outline: "\uEBEC", alpha-b: "\uEAEE", alpha-b-box: "\uEB08", alpha-b-box-outline: "\uEBED", alpha-b-circle: "\uEBEE", alpha-b-circle-outline: "\uEBEF", alpha-c: "\uEAEF", alpha-c-box: "\uEB09", alpha-c-box-outline: "\uEBF0", alpha-c-circle: "\uEBF1", alpha-c-circle-outline: "\uEBF2", alpha-d: "\uEAF0", alpha-d-box: "\uEB0A", alpha-d-box-outline: "\uEBF3", alpha-d-circle: "\uEBF4", alpha-d-circle-outline: "\uEBF5", alpha-e: "\uEAF1", alpha-e-box: "\uEB0B", alpha-e-box-outline: "\uEBF6", alpha-e-circle: "\uEBF7", alpha-e-circle-outline: "\uEBF8", alpha-f: "\uEAF2", alpha-f-box: "\uEB0C", alpha-f-box-outline: "\uEBF9", alpha-f-circle: "\uEBFA", alpha-f-circle-outline: "\uEBFB", alpha-g: "\uEAF3", alpha-g-box: "\uEB0D", alpha-g-box-outline: "\uEBFC", alpha-g-circle: "\uEBFD", alpha-g-circle-outline: "\uEBFE", alpha-h: "\uEAF4", alpha-h-box: "\uEB0E", alpha-h-box-outline: "\uEBFF", alpha-h-circle: "\uEC00", alpha-h-circle-outline: "\uEC01", alpha-i: "\uEAF5", alpha-i-box: "\uEB0F", alpha-i-box-outline: "\uEC02", alpha-i-circle: "\uEC03", alpha-i-circle-outline: "\uEC04", alpha-j: "\uEAF6", alpha-j-box: "\uEB10", alpha-j-box-outline: "\uEC05", alpha-j-circle: "\uEC06", alpha-j-circle-outline: "\uEC07", alpha-k: "\uEAF7", alpha-k-box: "\uEB11", alpha-k-box-outline: "\uEC08", alpha-k-circle: "\uEC09", alpha-k-circle-outline: "\uEC0A", alpha-l: "\uEAF8", alpha-l-box: "\uEB12", alpha-l-box-outline: "\uEC0B", alpha-l-circle: "\uEC0C", alpha-l-circle-outline: "\uEC0D", alpha-m: "\uEAF9", alpha-m-box: "\uEB13", alpha-m-box-outline: "\uEC0E", alpha-m-circle: "\uEC0F", alpha-m-circle-outline: "\uEC10", alpha-n: "\uEAFA", alpha-n-box: "\uEB14", alpha-n-box-outline: "\uEC11", alpha-n-circle: "\uEC12", alpha-n-circle-outline: "\uEC13", alpha-o: "\uEAFB", alpha-o-box: "\uEB15", alpha-o-box-outline: "\uEC14", alpha-o-circle: "\uEC15", alpha-o-circle-outline: "\uEC16", alpha-p: "\uEAFC", alpha-p-box: "\uEB16", alpha-p-box-outline: "\uEC17", alpha-p-circle: "\uEC18", alpha-p-circle-outline: "\uEC19", alpha-q: "\uEAFD", alpha-q-box: "\uEB17", alpha-q-box-outline: "\uEC1A", alpha-q-circle: "\uEC1B", alpha-q-circle-outline: "\uEC1C", alpha-r: "\uEAFE", alpha-r-box: "\uEB18", alpha-r-box-outline: "\uEC1D", alpha-r-circle: "\uEC1E", alpha-r-circle-outline: "\uEC1F", alpha-s: "\uEAFF", alpha-s-box: "\uEB19", alpha-s-box-outline: "\uEC20", alpha-s-circle: "\uEC21", alpha-s-circle-outline: "\uEC22", alpha-t: "\uEB00", alpha-t-box: "\uEB1A", alpha-t-box-outline: "\uEC23", alpha-t-circle: "\uEC24", alpha-t-circle-outline: "\uEC25", alpha-u: "\uEB01", alpha-u-box: "\uEB1B", alpha-u-box-outline: "\uEC26", alpha-u-circle: "\uEC27", alpha-u-circle-outline: "\uEC28", alpha-v: "\uEB02", alpha-v-box: "\uEB1C", alpha-v-box-outline: "\uEC29", alpha-v-circle: "\uEC2A", alpha-v-circle-outline: "\uEC2B", alpha-w: "\uEB03", alpha-w-box: "\uEB1D", alpha-w-box-outline: "\uEC2C", alpha-w-circle: "\uEC2D", alpha-w-circle-outline: "\uEC2E", alpha-x: "\uEB04", alpha-x-box: "\uEB1E", alpha-x-box-outline: "\uEC2F", alpha-x-circle: "\uEC30", alpha-x-circle-outline: "\uEC31", alpha-y: "\uEB05", alpha-y-box: "\uEB1F", alpha-y-box-outline: "\uEC32", alpha-y-circle: "\uEC33", alpha-y-circle-outline: "\uEC34", alpha-z: "\uEB06", alpha-z-box: "\uEB20", alpha-z-box-outline: "\uEC35", alpha-z-circle: "\uEC36", alpha-z-circle-outline: "\uEC37", alphabet-aurebesh: "\uF32B", alphabet-cyrillic: "\uF32C", alphabet-greek: "\uF32D", alphabet-latin: "\uF32E", alphabet-piqad: "\uF32F", alphabet-tengwar: "\uF336", alphabetical: "\uE02B", alphabetical-off: "\uF00B", alphabetical-variant: "\uF00C", alphabetical-variant-off: "\uF00D", altimeter: "\uE5D6", ambulance: "\uE02E", ammunition: "\uECE7", ampersand: "\uEA8C", amplifier: "\uE02F", amplifier-off: "\uF1B4", anchor: "\uE030", android: "\uE031", android-messages: "\uED44", android-studio: "\uE033", angle-acute: "\uE936", angle-obtuse: "\uE937", angle-right: "\uE938", angular: "\uE6B1", angularjs: "\uE6BE", animation: "\uE5D7", animation-outline: "\uEA8E", animation-play: "\uE939", animation-play-outline: "\uEA8F", ansible: "\uF099", antenna: "\uF118", anvil: "\uE89A", apache-kafka: "\uF00E", api: "\uF09A", api-off: "\uF256", apple: "\uE034", apple-finder: "\uE035", apple-icloud: "\uE037", apple-ios: "\uE036", apple-keyboard-caps: "\uE631", apple-keyboard-command: "\uE632", apple-keyboard-control: "\uE633", apple-keyboard-option: "\uE634", apple-keyboard-shift: "\uE635", apple-safari: "\uE038", application: "\uE8C5", application-array: "\uF0F4", application-array-outline: "\uF0F5", application-braces: "\uF0F6", application-braces-outline: "\uF0F7", application-brackets: "\uEC8A", application-brackets-outline: "\uEC8B", application-cog: "\uE674", application-cog-outline: "\uF576", application-edit: "\uE0AD", application-edit-outline: "\uE618", application-export: "\uEDAC", application-import: "\uEDAD", application-outline: "\uE613", application-parentheses: "\uF0F8", application-parentheses-outline: "\uF0F9", application-settings: "\uEB5F", application-settings-outline: "\uF554", application-variable: "\uF0FA", application-variable-outline: "\uF0FB", approximately-equal: "\uEF9D", approximately-equal-box: "\uEF9E", apps: "\uE03A", apps-box: "\uED45", arch: "\uE8C6", archive: "\uE03B", archive-alert: "\uF4FC", archive-alert-outline: "\uF4FD", archive-arrow-down: "\uF258", archive-arrow-down-outline: "\uF259", archive-arrow-up: "\uF25A", archive-arrow-up-outline: "\uF25B", archive-cancel: "\uF74A", archive-cancel-outline: "\uF74B", archive-check: "\uF74C", archive-check-outline: "\uF74D", archive-clock: "\uF74E", archive-clock-outline: "\uF74F", archive-cog: "\uF750", archive-cog-outline: "\uF751", archive-edit: "\uF752", archive-edit-outline: "\uF753", archive-eye: "\uF754", archive-eye-outline: "\uF755", archive-lock: "\uF756", archive-lock-open: "\uF757", archive-lock-open-outline: "\uF758", archive-lock-outline: "\uF759", archive-marker: "\uF75A", archive-marker-outline: "\uF75B", archive-minus: "\uF75C", archive-minus-outline: "\uF75D", archive-music: "\uF75E", archive-music-outline: "\uF75F", archive-off: "\uF760", archive-off-outline: "\uF761", archive-outline: "\uF20D", archive-plus: "\uF762", archive-plus-outline: "\uF763", archive-refresh: "\uF764", archive-refresh-outline: "\uF765", archive-remove: "\uF766", archive-remove-outline: "\uF767", archive-search: "\uF768", archive-search-outline: "\uF769", archive-settings: "\uF76A", archive-settings-outline: "\uF76B", archive-star: "\uF76C", archive-star-outline: "\uF76D", archive-sync: "\uF76E", archive-sync-outline: "\uF76F", arm-flex: "\uEFD6", arm-flex-outline: "\uEFD5", arrange-bring-forward: "\uE03C", arrange-bring-to-front: "\uE03D", arrange-send-backward: "\uE03E", arrange-send-to-back: "\uE03F", arrow-all: "\uE040", arrow-bottom-left: "\uE041", arrow-bottom-left-bold-box: "\uF963", arrow-bottom-left-bold-box-outline: "\uF964", arrow-bottom-left-bold-outline: "\uE9B6", arrow-bottom-left-thick: "\uE9B7", arrow-bottom-left-thin: "\uF9B5", arrow-bottom-left-thin-circle-outline: "\uF595", arrow-bottom-right: "\uE042", arrow-bottom-right-bold-box: "\uF965", arrow-bottom-right-bold-box-outline: "\uF966", arrow-bottom-right-bold-outline: "\uE9B8", arrow-bottom-right-thick: "\uE9B9", arrow-bottom-right-thin: "\uF9B6", arrow-bottom-right-thin-circle-outline: "\uF594", arrow-collapse: "\uE614", arrow-collapse-all: "\uE043", arrow-collapse-down: "\uE791", arrow-collapse-horizontal: "\uE84B", arrow-collapse-left: "\uE792", arrow-collapse-right: "\uE793", arrow-collapse-up: "\uE794", arrow-collapse-vertical: "\uE84C", arrow-decision: "\uE9BA", arrow-decision-auto: "\uE9BB", arrow-decision-auto-outline: "\uE9BC", arrow-decision-outline: "\uE9BD", arrow-down: "\uE044", arrow-down-bold: "\uE72D", arrow-down-bold-box: "\uE72E", arrow-down-bold-box-outline: "\uE72F", arrow-down-bold-circle: "\uE046", arrow-down-bold-circle-outline: "\uE047", arrow-down-bold-hexagon-outline: "\uE048", arrow-down-bold-outline: "\uE9BE", arrow-down-box: "\uE6BF", arrow-down-circle: "\uECDA", arrow-down-circle-outline: "\uECDB", arrow-down-drop-circle: "\uE049", arrow-down-drop-circle-outline: "\uE04A", arrow-down-left: "\uF7A0", arrow-down-left-bold: "\uF7A1", arrow-down-right: "\uF7A2", arrow-down-right-bold: "\uF7A3", arrow-down-thick: "\uE045", arrow-down-thin: "\uF9B2", arrow-down-thin-circle-outline: "\uF598", arrow-expand: "\uE615", arrow-expand-all: "\uE04B", arrow-expand-down: "\uE795", arrow-expand-horizontal: "\uE84D", arrow-expand-left: "\uE796", arrow-expand-right: "\uE797", arrow-expand-up: "\uE798", arrow-expand-vertical: "\uE84E", arrow-horizontal-lock: "\uF15A", arrow-left: "\uE04C", arrow-left-bold: "\uE730", arrow-left-bold-box: "\uE731", arrow-left-bold-box-outline: "\uE732", arrow-left-bold-circle: "\uE04E", arrow-left-bold-circle-outline: "\uE04F", arrow-left-bold-hexagon-outline: "\uE050", arrow-left-bold-outline: "\uE9BF", arrow-left-bottom: "\uF7A4", arrow-left-bottom-bold: "\uF7A5", arrow-left-box: "\uE6C0", arrow-left-circle: "\uECDC", arrow-left-circle-outline: "\uECDD", arrow-left-drop-circle: "\uE051", arrow-left-drop-circle-outline: "\uE052", arrow-left-right: "\uEE72", arrow-left-right-bold: "\uEE73", arrow-left-right-bold-outline: "\uE9C0", arrow-left-thick: "\uE04D", arrow-left-thin: "\uF9B0", arrow-left-thin-circle-outline: "\uF599", arrow-left-top: "\uF7A6", arrow-left-top-bold: "\uF7A7", arrow-projectile: "\uF83F", arrow-projectile-multiple: "\uF83E", arrow-right: "\uE053", arrow-right-bold: "\uE733", arrow-right-bold-box: "\uE734", arrow-right-bold-box-outline: "\uE735", arrow-right-bold-circle: "\uE055", arrow-right-bold-circle-outline: "\uE056", arrow-right-bold-hexagon-outline: "\uE057", arrow-right-bold-outline: "\uE9C1", arrow-right-bottom: "\uF7A8", arrow-right-bottom-bold: "\uF7A9", arrow-right-box: "\uE6C1", arrow-right-circle: "\uECDE", arrow-right-circle-outline: "\uECDF", arrow-right-drop-circle: "\uE058", arrow-right-drop-circle-outline: "\uE059", arrow-right-thick: "\uE054", arrow-right-thin: "\uF9AF", arrow-right-thin-circle-outline: "\uF597", arrow-right-top: "\uF7AA", arrow-right-top-bold: "\uF7AB", arrow-split-horizontal: "\uE93A", arrow-split-vertical: "\uE93B", arrow-top-left: "\uE05A", arrow-top-left-bold-box: "\uF967", arrow-top-left-bold-box-outline: "\uF968", arrow-top-left-bold-outline: "\uE9C2", arrow-top-left-bottom-right: "\uEE74", arrow-top-left-bottom-right-bold: "\uEE75", arrow-top-left-thick: "\uE9C3", arrow-top-left-thin: "\uF9B4", arrow-top-left-thin-circle-outline: "\uF592", arrow-top-right: "\uE05B", arrow-top-right-bold-box: "\uF969", arrow-top-right-bold-box-outline: "\uF96A", arrow-top-right-bold-outline: "\uE9C4", arrow-top-right-bottom-left: "\uEE76", arrow-top-right-bottom-left-bold: "\uEE77", arrow-top-right-thick: "\uE9C5", arrow-top-right-thin: "\uF9B3", arrow-top-right-thin-circle-outline: "\uF593", arrow-u-down-left: "\uF7AC", arrow-u-down-left-bold: "\uF7AD", arrow-u-down-right: "\uF7AE", arrow-u-down-right-bold: "\uF7AF", arrow-u-left-bottom: "\uF7B0", arrow-u-left-bottom-bold: "\uF7B1", arrow-u-left-top: "\uF7B2", arrow-u-left-top-bold: "\uF7B3", arrow-u-right-bottom: "\uF7B4", arrow-u-right-bottom-bold: "\uF7B5", arrow-u-right-top: "\uF7B6", arrow-u-right-top-bold: "\uF7B7", arrow-u-up-left: "\uF7B8", arrow-u-up-left-bold: "\uF7B9", arrow-u-up-right: "\uF7BA", arrow-u-up-right-bold: "\uF7BB", arrow-up: "\uE05C", arrow-up-bold: "\uE736", arrow-up-bold-box: "\uE737", arrow-up-bold-box-outline: "\uE738", arrow-up-bold-circle: "\uE05E", arrow-up-bold-circle-outline: "\uE05F", arrow-up-bold-hexagon-outline: "\uE060", arrow-up-bold-outline: "\uE9C6", arrow-up-box: "\uE6C2", arrow-up-circle: "\uECE0", arrow-up-circle-outline: "\uECE1", arrow-up-down: "\uEE78", arrow-up-down-bold: "\uEE79", arrow-up-down-bold-outline: "\uE9C7", arrow-up-drop-circle: "\uE061", arrow-up-drop-circle-outline: "\uE062", arrow-up-left: "\uF7BC", arrow-up-left-bold: "\uF7BD", arrow-up-right: "\uF7BE", arrow-up-right-bold: "\uF7BF", arrow-up-thick: "\uE05D", arrow-up-thin: "\uF9B1", arrow-up-thin-circle-outline: "\uF596", arrow-vertical-lock: "\uF15B", artstation: "\uEB5A", aspect-ratio: "\uEA23", assistant: "\uE063", asterisk: "\uE6C3", asterisk-circle-outline: "\uFA26", at: "\uE064", atlassian: "\uE803", atm: "\uED46", atom: "\uE767", atom-variant: "\uEE7A", attachment: "\uE065", attachment-check: "\uFAC0", attachment-lock: "\uF9C3", attachment-minus: "\uFAC1", attachment-off: "\uFAC2", attachment-plus: "\uFAC3", attachment-remove: "\uFAC4", audio-input-rca: "\uF86A", audio-input-stereo-minijack: "\uF86B", audio-input-xlr: "\uF86C", audio-video: "\uE93C", audio-video-off: "\uF1B5", augmented-reality: "\uE84F", auto-download: "\uF37D", auto-fix: "\uE067", auto-upload: "\uE068", autorenew: "\uE069", autorenew-off: "\uF9E6", av-timer: "\uE06A", aws: "\uEE0E", axe: "\uE8C7", axe-battle: "\uF841", axis: "\uED47", axis-arrow: "\uED48", axis-arrow-info: "\uF40D", axis-arrow-lock: "\uED49", axis-lock: "\uED4A", axis-x-arrow: "\uED4B", axis-x-arrow-lock: "\uED4C", axis-x-rotate-clockwise: "\uED4D", axis-x-rotate-counterclockwise: "\uED4E", axis-x-y-arrow-lock: "\uED4F", axis-y-arrow: "\uED50", axis-y-arrow-lock: "\uED51", axis-y-rotate-clockwise: "\uED52", axis-y-rotate-counterclockwise: "\uED53", axis-z-arrow: "\uED54", axis-z-arrow-lock: "\uED55", axis-z-rotate-clockwise: "\uED56", axis-z-rotate-counterclockwise: "\uED57", babel: "\uEA24", baby: "\uE06B", baby-bottle: "\uEF38", baby-bottle-outline: "\uEF39", baby-buggy: "\uF3DF", baby-carriage: "\uE68E", baby-carriage-off: "\uEF9F", baby-face: "\uEE7B", baby-face-outline: "\uEE7C", backburger: "\uE06C", backspace: "\uE06D", backspace-outline: "\uEB5B", backspace-reverse: "\uEE7D", backspace-reverse-outline: "\uEE7E", backup-restore: "\uE06E", bacteria: "\uEED4", bacteria-outline: "\uEED5", badge-account: "\uEDA6", badge-account-alert: "\uEDA7", badge-account-alert-outline: "\uEDA8", badge-account-horizontal: "\uEE0C", badge-account-horizontal-outline: "\uEE0D", badge-account-outline: "\uEDA9", badminton: "\uE850", bag-carry-on: "\uEF3A", bag-carry-on-check: "\uED64", bag-carry-on-off: "\uEF3B", bag-checked: "\uEF3C", bag-personal: "\uEE0F", bag-personal-off: "\uEE10", bag-personal-off-outline: "\uEE11", bag-personal-outline: "\uEE12", bag-suitcase: "\uF58A", bag-suitcase-off: "\uF58C", bag-suitcase-off-outline: "\uF58D", bag-suitcase-outline: "\uF58B", baguette: "\uEF3D", balcony: "\uF816", balloon: "\uEA25", ballot: "\uE9C8", ballot-outline: "\uE9C9", ballot-recount: "\uEC38", ballot-recount-outline: "\uEC39", bandage: "\uEDAE", bank: "\uE06F", bank-check: "\uF654", bank-minus: "\uEDAF", bank-off: "\uF655", bank-off-outline: "\uF656", bank-outline: "\uEE7F", bank-plus: "\uEDB0", bank-remove: "\uEDB1", bank-transfer: "\uEA26", bank-transfer-in: "\uEA27", bank-transfer-out: "\uEA28", barcode: "\uE070", barcode-off: "\uF235", barcode-scan: "\uE071", barley: "\uE072", barley-off: "\uEB5C", barn: "\uEB5D", barrel: "\uE073", barrel-outline: "\uFA27", baseball: "\uE851", baseball-bat: "\uE852", baseball-diamond: "\uF5EB", baseball-diamond-outline: "\uF5EC", bash: "\uF182", basket: "\uE075", basket-check: "\uF8E4", basket-check-outline: "\uF8E5", basket-fill: "\uE076", basket-minus: "\uF522", basket-minus-outline: "\uF523", basket-off: "\uF524", basket-off-outline: "\uF525", basket-outline: "\uF180", basket-plus: "\uF526", basket-plus-outline: "\uF527", basket-remove: "\uF528", basket-remove-outline: "\uF529", basket-unfill: "\uE077", basketball: "\uE805", basketball-hoop: "\uEC3A", basketball-hoop-outline: "\uEC3B", bat: "\uEB5E", bathtub: "\uF817", bathtub-outline: "\uF818", battery: "\uE078", battery-10: "\uE079", battery-10-bluetooth: "\uE93D", battery-20: "\uE07A", battery-20-bluetooth: "\uE93E", battery-30: "\uE07B", battery-30-bluetooth: "\uE93F", battery-40: "\uE07C", battery-40-bluetooth: "\uE940", battery-50: "\uE07D", battery-50-bluetooth: "\uE941", battery-60: "\uE07E", battery-60-bluetooth: "\uE942", battery-70: "\uE07F", battery-70-bluetooth: "\uE943", battery-80: "\uE080", battery-80-bluetooth: "\uE944", battery-90: "\uE081", battery-90-bluetooth: "\uE945", battery-alert: "\uE082", battery-alert-bluetooth: "\uE946", battery-alert-variant: "\uF0CB", battery-alert-variant-outline: "\uF0CC", battery-arrow-down: "\uF7DD", battery-arrow-down-outline: "\uF7DE", battery-arrow-up: "\uF7DF", battery-arrow-up-outline: "\uF7E0", battery-bluetooth: "\uE947", battery-bluetooth-variant: "\uE948", battery-charging: "\uE083", battery-charging-10: "\uE89B", battery-charging-100: "\uE084", battery-charging-20: "\uE085", battery-charging-30: "\uE086", battery-charging-40: "\uE087", battery-charging-50: "\uE89C", battery-charging-60: "\uE088", battery-charging-70: "\uE89D", battery-charging-80: "\uE089", battery-charging-90: "\uE08A", battery-charging-high: "\uF2A5", battery-charging-low: "\uF2A3", battery-charging-medium: "\uF2A4", battery-charging-outline: "\uE89E", battery-charging-wireless: "\uE806", battery-charging-wireless-10: "\uE807", battery-charging-wireless-20: "\uE808", battery-charging-wireless-30: "\uE809", battery-charging-wireless-40: "\uE80A", battery-charging-wireless-50: "\uE80B", battery-charging-wireless-60: "\uE80C", battery-charging-wireless-70: "\uE80D", battery-charging-wireless-80: "\uE80E", battery-charging-wireless-90: "\uE80F", battery-charging-wireless-alert: "\uE810", battery-charging-wireless-outline: "\uE811", battery-check: "\uF7E1", battery-check-outline: "\uF7E2", battery-clock: "\uF9E4", battery-clock-outline: "\uF9E5", battery-heart: "\uF20E", battery-heart-outline: "\uF20F", battery-heart-variant: "\uF210", battery-high: "\uF2A2", battery-lock: "\uF79B", battery-lock-open: "\uF79C", battery-low: "\uF2A0", battery-medium: "\uF2A1", battery-minus: "\uF7E3", battery-minus-outline: "\uF7E4", battery-minus-variant: "\uE08B", battery-negative: "\uE08C", battery-off: "\uF25C", battery-off-outline: "\uF25D", battery-outline: "\uE08D", battery-plus: "\uF7E5", battery-plus-outline: "\uF7E6", battery-plus-variant: "\uE08E", battery-positive: "\uE08F", battery-remove: "\uF7E7", battery-remove-outline: "\uF7E8", battery-sync: "\uF833", battery-sync-outline: "\uF834", battery-unknown: "\uE090", battery-unknown-bluetooth: "\uE949", beach: "\uE091", beaker: "\uECE9", beaker-alert: "\uF228", beaker-alert-outline: "\uF229", beaker-check: "\uF22A", beaker-check-outline: "\uF22B", beaker-minus: "\uF22C", beaker-minus-outline: "\uF22D", beaker-outline: "\uE68F", beaker-plus: "\uF22E", beaker-plus-outline: "\uF22F", beaker-question: "\uF230", beaker-question-outline: "\uF231", beaker-remove: "\uF232", beaker-remove-outline: "\uF233", bed: "\uE2E2", bed-double: "\uEFD3", bed-double-outline: "\uEFD2", bed-empty: "\uE89F", bed-king: "\uEFD1", bed-king-outline: "\uEFD0", bed-outline: "\uE098", bed-queen: "\uEFCF", bed-queen-outline: "\uEFDA", bed-single: "\uF06C", bed-single-outline: "\uF06D", bee: "\uEFA0", bee-flower: "\uEFA1", beehive-off-outline: "\uF3EC", beehive-outline: "\uF0CD", beekeeper: "\uF4E1", beer: "\uE097", beer-outline: "\uF30B", bell: "\uE099", bell-alert: "\uED58", bell-alert-outline: "\uEE80", bell-badge: "\uF16A", bell-badge-outline: "\uE177", bell-cancel: "\uF3E6", bell-cancel-outline: "\uF3E7", bell-check: "\uF1E4", bell-check-outline: "\uF1E5", bell-circle: "\uED59", bell-circle-outline: "\uED5A", bell-cog: "\uFA28", bell-cog-outline: "\uFA29", bell-minus: "\uF3E8", bell-minus-outline: "\uF3E9", bell-off: "\uE09A", bell-off-outline: "\uEA90", bell-outline: "\uE09B", bell-plus: "\uE09C", bell-plus-outline: "\uEA91", bell-remove: "\uF3EA", bell-remove-outline: "\uF3EB", bell-ring: "\uE09D", bell-ring-outline: "\uE09E", bell-sleep: "\uE09F", bell-sleep-outline: "\uEA92", beta: "\uE0A0", betamax: "\uE9CA", biathlon: "\uEE13", bicycle: "\uF09B", bicycle-basket: "\uF234", bicycle-cargo: "\uF89B", bicycle-electric: "\uF5B3", bicycle-penny-farthing: "\uF5E8", bike: "\uE0A2", bike-fast: "\uF11E", billboard: "\uF00F", billiards: "\uEB60", billiards-rack: "\uEB61", binoculars: "\uE0A4", bio: "\uE0A5", biohazard: "\uE0A6", bird: "\uF5C5", bitbucket: "\uE0A7", bitcoin: "\uE812", black-mesa: "\uE0A8", blender: "\uECEA", blender-outline: "\uF819", blender-software: "\uE0AA", blinds: "\uE0AB", blinds-horizontal: "\uFA2A", blinds-horizontal-closed: "\uFA2B", blinds-open: "\uF010", blinds-vertical: "\uFA2C", blinds-vertical-closed: "\uFA2D", block-helper: "\uE0AC", blood-bag: "\uECEB", bluetooth: "\uE0AE", bluetooth-audio: "\uE0AF", bluetooth-connect: "\uE0B0", bluetooth-off: "\uE0B1", bluetooth-settings: "\uE0B2", bluetooth-transfer: "\uE0B3", blur: "\uE0B4", blur-linear: "\uE0B5", blur-off: "\uE0B6", blur-radial: "\uE0B7", bolt: "\uEDB2", bomb: "\uE690", bomb-off: "\uE6C4", bone: "\uE0B8", bone-off: "\uF9DF", book: "\uE0B9", book-account: "\uF3AC", book-account-outline: "\uF3AD", book-alert: "\uF67B", book-alert-outline: "\uF67C", book-alphabet: "\uE61C", book-arrow-down: "\uF67D", book-arrow-down-outline: "\uF67E", book-arrow-left: "\uF67F", book-arrow-left-outline: "\uF680", book-arrow-right: "\uF681", book-arrow-right-outline: "\uF682", book-arrow-up: "\uF683", book-arrow-up-outline: "\uF684", book-cancel: "\uF685", book-cancel-outline: "\uF686", book-check: "\uF4F2", book-check-outline: "\uF4F3", book-clock: "\uF687", book-clock-outline: "\uF688", book-cog: "\uF689", book-cog-outline: "\uF68A", book-cross: "\uE0A1", book-edit: "\uF68B", book-edit-outline: "\uF68C", book-education: "\uF6C8", book-education-outline: "\uF6C9", book-heart: "\uFA1C", book-heart-outline: "\uFA1D", book-information-variant: "\uF06E", book-lock: "\uE799", book-lock-open: "\uE79A", book-lock-open-outline: "\uF68D", book-lock-outline: "\uF68E", book-marker: "\uF68F", book-marker-outline: "\uF690", book-minus: "\uE5D8", book-minus-multiple: "\uEA93", book-minus-multiple-outline: "\uE90A", book-minus-outline: "\uF691", book-multiple: "\uE0BA", book-multiple-outline: "\uE435", book-music: "\uE066", book-music-outline: "\uF692", book-off: "\uF693", book-off-outline: "\uF694", book-open: "\uE0BC", book-open-blank-variant: "\uE0BD", book-open-outline: "\uEB62", book-open-page-variant: "\uE5D9", book-open-page-variant-outline: "\uF5D5", book-open-variant: "\uF4F6", book-outline: "\uEB63", book-play: "\uEE81", book-play-outline: "\uEE82", book-plus: "\uE5DA", book-plus-multiple: "\uEA94", book-plus-multiple-outline: "\uEADD", book-plus-outline: "\uF695", book-refresh: "\uF696", book-refresh-outline: "\uF697", book-remove: "\uEA96", book-remove-multiple: "\uEA95", book-remove-multiple-outline: "\uE4C9", book-remove-outline: "\uF698", book-search: "\uEE83", book-search-outline: "\uEE84", book-settings: "\uF699", book-settings-outline: "\uF69A", book-sync: "\uF69B", book-sync-outline: "\uF6C7", book-variant: "\uE0BE", book-variant-multiple: "\uE0BB", bookmark: "\uE0BF", bookmark-box-multiple: "\uF96B", bookmark-box-multiple-outline: "\uF96C", bookmark-check: "\uE0C0", bookmark-check-outline: "\uF37A", bookmark-minus: "\uE9CB", bookmark-minus-outline: "\uE9CC", bookmark-multiple: "\uEE14", bookmark-multiple-outline: "\uEE15", bookmark-music: "\uE0C1", bookmark-music-outline: "\uF378", bookmark-off: "\uE9CD", bookmark-off-outline: "\uE9CE", bookmark-outline: "\uE0C2", bookmark-plus: "\uE0C4", bookmark-plus-outline: "\uE0C3", bookmark-remove: "\uE0C5", bookmark-remove-outline: "\uF379", bookshelf: "\uF25E", boom-gate: "\uEE85", boom-gate-alert: "\uEE86", boom-gate-alert-outline: "\uEE87", boom-gate-arrow-down: "\uEE88", boom-gate-arrow-down-outline: "\uEE89", boom-gate-arrow-up: "\uEE8B", boom-gate-arrow-up-outline: "\uEE8C", boom-gate-outline: "\uEE8A", boom-gate-up: "\uF7F8", boom-gate-up-outline: "\uF7F9", boombox: "\uE5DB", boomerang: "\uF0CE", bootstrap: "\uE6C5", border-all: "\uE0C6", border-all-variant: "\uE8A0", border-bottom: "\uE0C7", border-bottom-variant: "\uE8A1", border-color: "\uE0C8", border-horizontal: "\uE0C9", border-inside: "\uE0CA", border-left: "\uE0CB", border-left-variant: "\uE8A2", border-none: "\uE0CC", border-none-variant: "\uE8A3", border-outside: "\uE0CD", border-right: "\uE0CE", border-right-variant: "\uE8A4", border-style: "\uE0CF", border-top: "\uE0D0", border-top-variant: "\uE8A5", border-vertical: "\uE0D1", bottle-soda: "\uF06F", bottle-soda-classic: "\uF070", bottle-soda-classic-outline: "\uF362", bottle-soda-outline: "\uF071", bottle-tonic: "\uF12D", bottle-tonic-outline: "\uF12E", bottle-tonic-plus: "\uF12F", bottle-tonic-plus-outline: "\uF130", bottle-tonic-skull: "\uF131", bottle-tonic-skull-outline: "\uF132", bottle-wine: "\uE853", bottle-wine-outline: "\uF30F", bow-arrow: "\uF840", bow-tie: "\uE677", bowl: "\uE28D", bowl-mix: "\uE616", bowl-mix-outline: "\uE2E3", bowl-outline: "\uE2A8", bowling: "\uE0D2", box: "\uE0D3", box-cutter: "\uE0D4", box-cutter-off: "\uEB49", box-shadow: "\uE636", boxing-glove: "\uEB64", braille: "\uE9CF", brain: "\uE9D0", bread-slice: "\uECED", bread-slice-outline: "\uECEE", bridge: "\uE617", briefcase: "\uE0D5", briefcase-account: "\uECEF", briefcase-account-outline: "\uECF0", briefcase-arrow-left-right: "\uFA8C", briefcase-arrow-left-right-outline: "\uFA8D", briefcase-arrow-up-down: "\uFA8E", briefcase-arrow-up-down-outline: "\uFA8F", briefcase-check: "\uE0D6", briefcase-check-outline: "\uF31D", briefcase-clock: "\uF0CF", briefcase-clock-outline: "\uF0D0", briefcase-download: "\uE0D7", briefcase-download-outline: "\uEC3C", briefcase-edit: "\uEA97", briefcase-edit-outline: "\uEC3D", briefcase-eye: "\uF7D8", briefcase-eye-outline: "\uF7D9", briefcase-minus: "\uEA29", briefcase-minus-outline: "\uEC3E", briefcase-off: "\uF657", briefcase-off-outline: "\uF658", briefcase-outline: "\uE813", briefcase-plus: "\uEA2A", briefcase-plus-outline: "\uEC3F", briefcase-remove: "\uEA2B", briefcase-remove-outline: "\uEC40", briefcase-search: "\uEA2C", briefcase-search-outline: "\uEC41", briefcase-upload: "\uE0D8", briefcase-upload-outline: "\uEC42", briefcase-variant: "\uF493", briefcase-variant-off: "\uF659", briefcase-variant-off-outline: "\uF65A", briefcase-variant-outline: "\uF494", brightness-1: "\uE0D9", brightness-2: "\uE0DA", brightness-3: "\uE0DB", brightness-4: "\uE0DC", brightness-5: "\uE0DD", brightness-6: "\uE0DE", brightness-7: "\uE0DF", brightness-auto: "\uE0E0", brightness-percent: "\uECF1", broadcast: "\uF71F", broadcast-off: "\uF720", broom: "\uE0E1", brush: "\uE0E2", brush-off: "\uF770", brush-outline: "\uFA0C", brush-variant: "\uF812", bucket: "\uF414", bucket-outline: "\uF415", buffet: "\uE577", bug: "\uE0E3", bug-check: "\uEA2D", bug-check-outline: "\uEA2E", bug-outline: "\uEA2F", bugle: "\uEDB3", bulkhead-light: "\uFA2E", bulldozer: "\uEB21", bullet: "\uECF2", bulletin-board: "\uE0E4", bullhorn: "\uE0E5", bullhorn-outline: "\uEB22", bullhorn-variant: "\uF96D", bullhorn-variant-outline: "\uF96E", bullseye: "\uE5DC", bullseye-arrow: "\uE8C8", bulma: "\uF2E6", bunk-bed: "\uF301", bunk-bed-outline: "\uE096", bus: "\uE0E6", bus-alert: "\uEA98", bus-articulated-end: "\uE79B", bus-articulated-front: "\uE79C", bus-clock: "\uE8C9", bus-double-decker: "\uE79D", bus-electric: "\uF91C", bus-marker: "\uF211", bus-multiple: "\uEF3E", bus-school: "\uE79E", bus-side: "\uE79F", bus-stop: "\uF011", bus-stop-covered: "\uF012", bus-stop-uncovered: "\uF013", butterfly: "\uF588", butterfly-outline: "\uF589", cabin-a-frame: "\uF88B", cable-data: "\uF393", cached: "\uE0E7", cactus: "\uEDB4", cake: "\uE0E8", cake-layered: "\uE0E9", cake-variant: "\uE0EA", cake-variant-outline: "\uF7EF", calculator: "\uE0EB", calculator-variant: "\uEA99", calculator-variant-outline: "\uF5A5", calendar: "\uE0EC", calendar-account: "\uEED6", calendar-account-outline: "\uEED7", calendar-alert: "\uEA30", calendar-arrow-left: "\uF133", calendar-arrow-right: "\uF134", calendar-blank: "\uE0ED", calendar-blank-multiple: "\uF072", calendar-blank-outline: "\uEB65", calendar-check: "\uE0EE", calendar-check-outline: "\uEC43", calendar-clock: "\uE0EF", calendar-clock-outline: "\uF6E0", calendar-collapse-horizontal: "\uF89C", calendar-cursor: "\uF57A", calendar-edit: "\uE8A6", calendar-end: "\uF66B", calendar-expand-horizontal: "\uF89D", calendar-export: "\uEB23", calendar-heart: "\uE9D1", calendar-import: "\uEB24", calendar-lock: "\uF640", calendar-lock-outline: "\uF641", calendar-minus: "\uED5B", calendar-month: "\uEE16", calendar-month-outline: "\uEE17", calendar-multiple: "\uE0F0", calendar-multiple-check: "\uE0F1", calendar-multiselect: "\uEA31", calendar-outline: "\uEB66", calendar-plus: "\uE0F2", calendar-question: "\uE691", calendar-range: "\uE678", calendar-range-outline: "\uEB67", calendar-refresh: "\uE1E0", calendar-refresh-outline: "\uE202", calendar-remove: "\uE0F3", calendar-remove-outline: "\uEC44", calendar-search: "\uE94B", calendar-star: "\uE9D2", calendar-start: "\uF66C", calendar-sync: "\uEE8D", calendar-sync-outline: "\uEE8E", calendar-text: "\uE0F4", calendar-text-outline: "\uEC45", calendar-today: "\uE0F5", calendar-today-outline: "\uFA2F", calendar-week: "\uEA32", calendar-week-begin: "\uEA33", calendar-week-begin-outline: "\uFA30", calendar-week-end: "\uFA31", calendar-week-end-outline: "\uFA32", calendar-week-outline: "\uFA33", calendar-weekend: "\uEED8", calendar-weekend-outline: "\uEED9", call-made: "\uE0F6", call-merge: "\uE0F7", call-missed: "\uE0F8", call-received: "\uE0F9", call-split: "\uE0FA", camcorder: "\uE0FB", camcorder-off: "\uE0FE", camera: "\uE0FF", camera-account: "\uE8CA", camera-burst: "\uE692", camera-control: "\uEB68", camera-document: "\uF870", camera-document-off: "\uF871", camera-enhance: "\uE100", camera-enhance-outline: "\uEB69", camera-flip: "\uF5D8", camera-flip-outline: "\uF5D9", camera-front: "\uE101", camera-front-variant: "\uE102", camera-gopro: "\uE7A0", camera-image: "\uE8CB", camera-iris: "\uE103", camera-lock: "\uFA13", camera-lock-outline: "\uFA14", camera-marker: "\uF9A6", camera-marker-outline: "\uF9A7", camera-metering-center: "\uE7A1", camera-metering-matrix: "\uE7A2", camera-metering-partial: "\uE7A3", camera-metering-spot: "\uE7A4", camera-off: "\uE5DE", camera-off-outline: "\uF9BE", camera-outline: "\uED5C", camera-party-mode: "\uE104", camera-plus: "\uEEDA", camera-plus-outline: "\uEEDB", camera-rear: "\uE105", camera-rear-variant: "\uE106", camera-retake: "\uEE18", camera-retake-outline: "\uEE19", camera-switch: "\uE107", camera-switch-outline: "\uE849", camera-timer: "\uE108", camera-wireless: "\uEDB5", camera-wireless-outline: "\uEDB6", campfire: "\uEEDC", cancel: "\uE739", candelabra: "\uF7D1", candelabra-fire: "\uF7D2", candle: "\uE5E1", candy: "\uF96F", candy-off: "\uF970", candy-off-outline: "\uF971", candy-outline: "\uF972", candycane: "\uE109", cannabis: "\uE7A5", cannabis-off: "\uF66D", caps-lock: "\uEA9A", car: "\uE10A", car-2-plus: "\uF014", car-3-plus: "\uF015", car-arrow-left: "\uF3B1", car-arrow-right: "\uF3B2", car-back: "\uEE1A", car-battery: "\uE10B", car-brake-abs: "\uEC46", car-brake-alert: "\uEC47", car-brake-fluid-level: "\uF908", car-brake-hold: "\uED5D", car-brake-low-pressure: "\uF909", car-brake-parking: "\uED5E", car-brake-retarder: "\uF016", car-brake-temperature: "\uF90A", car-brake-worn-linings: "\uF90B", car-child-seat: "\uEFA2", car-clock: "\uF973", car-clutch: "\uF017", car-cog: "\uF3CB", car-connected: "\uE10C", car-convertible: "\uE7A6", car-coolant-level: "\uF018", car-cruise-control: "\uED5F", car-defrost-front: "\uED60", car-defrost-rear: "\uED61", car-door: "\uEB6A", car-door-lock: "\uF09C", car-electric: "\uEB6B", car-electric-outline: "\uF5B4", car-emergency: "\uF60E", car-esp: "\uEC48", car-estate: "\uE7A7", car-hatchback: "\uE7A8", car-info: "\uF1BD", car-key: "\uEB6C", car-lifted-pickup: "\uF52C", car-light-alert: "\uF90C", car-light-dimmed: "\uEC49", car-light-fog: "\uEC4A", car-light-high: "\uEC4B", car-limousine: "\uE8CC", car-multiple: "\uEB6D", car-off: "\uEE1B", car-outline: "\uF4EC", car-parking-lights: "\uED62", car-pickup: "\uE7A9", car-seat: "\uEFA3", car-seat-cooler: "\uEFA4", car-seat-heater: "\uEFA5", car-select: "\uF878", car-settings: "\uF3CC", car-shift-pattern: "\uEF3F", car-side: "\uE7AA", car-speed-limiter: "\uF90D", car-sports: "\uE7AB", car-tire-alert: "\uEC4C", car-traction-control: "\uED63", car-turbocharger: "\uF019", car-wash: "\uE10D", car-windshield: "\uF01A", car-windshield-outline: "\uF01B", car-wireless: "\uF877", car-wrench: "\uF813", carabiner: "\uF4BF", caravan: "\uE7AC", card: "\uEB6E", card-account-details: "\uE5D1", card-account-details-outline: "\uEDAA", card-account-details-star: "\uE2A2", card-account-details-star-outline: "\uE6DA", card-account-mail: "\uE18D", card-account-mail-outline: "\uEE97", card-account-phone: "\uEE98", card-account-phone-outline: "\uEE99", card-bulleted: "\uEB6F", card-bulleted-off: "\uEB70", card-bulleted-off-outline: "\uEB71", card-bulleted-outline: "\uEB72", card-bulleted-settings: "\uEB73", card-bulleted-settings-outline: "\uEB74", card-minus: "\uF5FF", card-minus-outline: "\uF600", card-multiple: "\uF7F0", card-multiple-outline: "\uF7F1", card-off: "\uF601", card-off-outline: "\uF602", card-outline: "\uEB75", card-plus: "\uF1FE", card-plus-outline: "\uF1FF", card-remove: "\uF603", card-remove-outline: "\uF604", card-search: "\uF073", card-search-outline: "\uF074", card-text: "\uEB76", card-text-outline: "\uEB77", cards: "\uE637", cards-club: "\uE8CD", cards-club-outline: "\uF89E", cards-diamond: "\uE8CE", cards-diamond-outline: "\uF01C", cards-heart: "\uE8CF", cards-heart-outline: "\uF89F", cards-outline: "\uE638", cards-playing: "\uF8A0", cards-playing-club: "\uF8A1", cards-playing-club-multiple: "\uF8A2", cards-playing-club-multiple-outline: "\uF8A3", cards-playing-club-outline: "\uF8A4", cards-playing-diamond: "\uF8A5", cards-playing-diamond-multiple: "\uF8A6", cards-playing-diamond-multiple-outline: "\uF8A7", cards-playing-diamond-outline: "\uF8A8", cards-playing-heart: "\uF8A9", cards-playing-heart-multiple: "\uF8AA", cards-playing-heart-multiple-outline: "\uF8AB", cards-playing-heart-outline: "\uF8AC", cards-playing-outline: "\uE639", cards-playing-spade: "\uF8AD", cards-playing-spade-multiple: "\uF8AE", cards-playing-spade-multiple-outline: "\uF8AF", cards-playing-spade-outline: "\uF8B0", cards-spade: "\uE8D0", cards-spade-outline: "\uF8B1", cards-variant: "\uE6C6", carrot: "\uE10E", cart: "\uE10F", cart-arrow-down: "\uED65", cart-arrow-right: "\uEC4D", cart-arrow-up: "\uED66", cart-check: "\uF5E9", cart-heart: "\uF8DF", cart-minus: "\uED67", cart-off: "\uE66A", cart-outline: "\uE110", cart-plus: "\uE111", cart-remove: "\uED68", cart-variant: "\uF5EA", case-sensitive-alt: "\uE112", cash: "\uE113", cash-100: "\uE114", cash-check: "\uF4ED", cash-clock: "\uFA90", cash-fast: "\uF85B", cash-lock: "\uF4E9", cash-lock-open: "\uF4EA", cash-marker: "\uEDB7", cash-minus: "\uF25F", cash-multiple: "\uE115", cash-plus: "\uF260", cash-refund: "\uEA9B", cash-register: "\uECF3", cash-remove: "\uF261", cash-sync: "\uFA91", cassette: "\uE9D3", cast: "\uE117", cast-audio: "\uF01D", cast-audio-variant: "\uF748", cast-connected: "\uE118", cast-education: "\uEE1C", cast-off: "\uE789", cast-variant: "\uE01E", castle: "\uE119", cat: "\uE11A", cctv: "\uE7AD", cctv-off: "\uF85E", ceiling-fan: "\uF796", ceiling-fan-light: "\uF797", ceiling-light: "\uE768", ceiling-light-multiple: "\uF8DC", ceiling-light-multiple-outline: "\uF8DD", ceiling-light-outline: "\uF7C6", cellphone: "\uE11B", cellphone-arrow-down: "\uE9D4", cellphone-arrow-down-variant: "\uF9C4", cellphone-basic: "\uE11D", cellphone-charging: "\uF396", cellphone-check: "\uF7FC", cellphone-cog: "\uE950", cellphone-dock: "\uE11E", cellphone-information: "\uEF40", cellphone-key: "\uE94D", cellphone-link: "\uE120", cellphone-link-off: "\uE121", cellphone-lock: "\uE94E", cellphone-marker: "\uF839", cellphone-message: "\uE8D2", cellphone-message-off: "\uF0D1", cellphone-nfc: "\uEE8F", cellphone-nfc-off: "\uF2D7", cellphone-off: "\uE94F", cellphone-play: "\uF01E", cellphone-remove: "\uE94C", cellphone-screenshot: "\uEA34", cellphone-settings: "\uE122", cellphone-sound: "\uE951", cellphone-text: "\uE8D1", cellphone-wireless: "\uE814", centos: "\uF119", certificate: "\uE123", certificate-outline: "\uF187", chair-rolling: "\uEF47", chair-school: "\uE124", chandelier: "\uF792", charity: "\uEC4E", chart-arc: "\uE125", chart-areaspline: "\uE126", chart-areaspline-variant: "\uEE90", chart-bar: "\uE127", chart-bar-stacked: "\uE769", chart-bell-curve: "\uEC4F", chart-bell-curve-cumulative: "\uEFA6", chart-box: "\uF54C", chart-box-outline: "\uF54D", chart-box-plus-outline: "\uF54E", chart-bubble: "\uE5E2", chart-donut: "\uE7AE", chart-donut-variant: "\uE7AF", chart-gantt: "\uE66B", chart-histogram: "\uE128", chart-line: "\uE129", chart-line-stacked: "\uE76A", chart-line-variant: "\uE7B0", chart-multiline: "\uE8D3", chart-multiple: "\uF212", chart-pie: "\uE12A", chart-ppf: "\uF37F", chart-sankey: "\uF1DE", chart-sankey-variant: "\uF1DF", chart-scatter-plot: "\uEE91", chart-scatter-plot-hexbin: "\uE66C", chart-timeline: "\uE66D", chart-timeline-variant: "\uEE92", chart-timeline-variant-shimmer: "\uF5B5", chart-tree: "\uEE93", chart-waterfall: "\uF917", chat: "\uEB78", chat-alert: "\uEB79", chat-alert-outline: "\uF2C8", chat-minus: "\uF40F", chat-minus-outline: "\uF412", chat-outline: "\uEEDD", chat-plus: "\uF40E", chat-plus-outline: "\uF411", chat-processing: "\uEB7A", chat-processing-outline: "\uF2C9", chat-question: "\uF737", chat-question-outline: "\uF738", chat-remove: "\uF410", chat-remove-outline: "\uF413", chat-sleep: "\uF2D0", chat-sleep-outline: "\uF2D1", check: "\uE12B", check-all: "\uE12C", check-bold: "\uEE1D", check-circle: "\uE5DF", check-circle-outline: "\uE5E0", check-decagram: "\uE790", check-decagram-outline: "\uF73F", check-network: "\uEC52", check-network-outline: "\uEC53", check-outline: "\uE854", check-underline: "\uEE1E", check-underline-circle: "\uEE1F", check-underline-circle-outline: "\uEE20", checkbook: "\uEA9C", checkbox-blank: "\uE12D", checkbox-blank-badge: "\uF175", checkbox-blank-badge-outline: "\uE116", checkbox-blank-circle: "\uE12E", checkbox-blank-circle-outline: "\uE12F", checkbox-blank-off: "\uF2EB", checkbox-blank-off-outline: "\uF2EC", checkbox-blank-outline: "\uE130", checkbox-intermediate: "\uE855", checkbox-marked: "\uE131", checkbox-marked-circle: "\uE132", checkbox-marked-circle-outline: "\uE133", checkbox-marked-circle-plus-outline: "\uF926", checkbox-marked-outline: "\uE134", checkbox-multiple-blank: "\uE135", checkbox-multiple-blank-circle: "\uE63A", checkbox-multiple-blank-circle-outline: "\uE63B", checkbox-multiple-blank-outline: "\uE136", checkbox-multiple-marked: "\uE137", checkbox-multiple-marked-circle: "\uE63C", checkbox-multiple-marked-circle-outline: "\uE63D", checkbox-multiple-marked-outline: "\uE138", checkbox-multiple-outline: "\uEC50", checkbox-outline: "\uEC51", checkerboard: "\uE139", checkerboard-minus: "\uF201", checkerboard-plus: "\uF200", checkerboard-remove: "\uF202", cheese: "\uF2B8", cheese-off: "\uF3ED", chef-hat: "\uEB7B", chemical-weapon: "\uE13A", chess-bishop: "\uE85B", chess-king: "\uE856", chess-knight: "\uE857", chess-pawn: "\uE858", chess-queen: "\uE859", chess-rook: "\uE85A", chevron-double-down: "\uE13B", chevron-double-left: "\uE13C", chevron-double-right: "\uE13D", chevron-double-up: "\uE13E", chevron-down: "\uE13F", chevron-down-box: "\uE9D5", chevron-down-box-outline: "\uE9D6", chevron-down-circle: "\uEB25", chevron-down-circle-outline: "\uEB26", chevron-left: "\uE140", chevron-left-box: "\uE9D7", chevron-left-box-outline: "\uE9D8", chevron-left-circle: "\uEB27", chevron-left-circle-outline: "\uEB28", chevron-right: "\uE141", chevron-right-box: "\uE9D9", chevron-right-box-outline: "\uE9DA", chevron-right-circle: "\uEB29", chevron-right-circle-outline: "\uEB2A", chevron-triple-down: "\uEDB8", chevron-triple-left: "\uEDB9", chevron-triple-right: "\uEDBA", chevron-triple-up: "\uEDBB", chevron-up: "\uE142", chevron-up-box: "\uE9DB", chevron-up-box-outline: "\uE9DC", chevron-up-circle: "\uEB2B", chevron-up-circle-outline: "\uEB2C", chili-alert: "\uF7E9", chili-alert-outline: "\uF7EA", chili-hot: "\uE7B1", chili-hot-outline: "\uF7EB", chili-medium: "\uE7B2", chili-medium-outline: "\uF7EC", chili-mild: "\uE7B3", chili-mild-outline: "\uF7ED", chili-off: "\uF466", chili-off-outline: "\uF7EE", chip: "\uE619", church: "\uE143", cigar: "\uF188", cigar-off: "\uF41A", circle: "\uE764", circle-box: "\uF5DB", circle-box-outline: "\uF5DC", circle-double: "\uEE94", circle-edit-outline: "\uE8D4", circle-expand: "\uEE95", circle-half: "\uF394", circle-half-full: "\uF395", circle-medium: "\uE9DD", circle-multiple: "\uEB37", circle-multiple-outline: "\uE694", circle-off-outline: "\uF0D2", circle-opacity: "\uF852", circle-outline: "\uE765", circle-slice-1: "\uEA9D", circle-slice-2: "\uEA9E", circle-slice-3: "\uEA9F", circle-slice-4: "\uEAA0", circle-slice-5: "\uEAA1", circle-slice-6: "\uEAA2", circle-slice-7: "\uEAA3", circle-slice-8: "\uEAA4", circle-small: "\uE9DE", circular-saw: "\uEE21", city: "\uE145", city-variant: "\uEA35", city-variant-outline: "\uEA36", clipboard: "\uE146", clipboard-account: "\uE147", clipboard-account-outline: "\uEC54", clipboard-alert: "\uE148", clipboard-alert-outline: "\uECF6", clipboard-arrow-down: "\uE149", clipboard-arrow-down-outline: "\uEC55", clipboard-arrow-left: "\uE14A", clipboard-arrow-left-outline: "\uECF7", clipboard-arrow-right: "\uECF8", clipboard-arrow-right-outline: "\uECF9", clipboard-arrow-up: "\uEC56", clipboard-arrow-up-outline: "\uEC57", clipboard-check: "\uE14D", clipboard-check-multiple: "\uF262", clipboard-check-multiple-outline: "\uF263", clipboard-check-outline: "\uE8A7", clipboard-clock: "\uF6E1", clipboard-clock-outline: "\uF6E2", clipboard-edit: "\uF4E4", clipboard-edit-outline: "\uF4E5", clipboard-file: "\uF264", clipboard-file-outline: "\uF265", clipboard-flow: "\uE6C7", clipboard-flow-outline: "\uF116", clipboard-list: "\uF0D3", clipboard-list-outline: "\uF0D4", clipboard-minus: "\uF617", clipboard-minus-outline: "\uF618", clipboard-multiple: "\uF266", clipboard-multiple-outline: "\uF267", clipboard-off: "\uF619", clipboard-off-outline: "\uF61A", clipboard-outline: "\uE14B", clipboard-play: "\uEC58", clipboard-play-multiple: "\uF268", clipboard-play-multiple-outline: "\uF269", clipboard-play-outline: "\uEC59", clipboard-plus: "\uE750", clipboard-plus-outline: "\uF31E", clipboard-pulse: "\uE85C", clipboard-pulse-outline: "\uE85D", clipboard-remove: "\uF61B", clipboard-remove-outline: "\uF61C", clipboard-search: "\uF61D", clipboard-search-outline: "\uF61E", clipboard-text: "\uE14C", clipboard-text-clock: "\uF8F8", clipboard-text-clock-outline: "\uF8F9", clipboard-text-multiple: "\uF26A", clipboard-text-multiple-outline: "\uF26B", clipboard-text-off: "\uF61F", clipboard-text-off-outline: "\uF620", clipboard-text-outline: "\uEA37", clipboard-text-play: "\uEC5A", clipboard-text-play-outline: "\uEC5B", clipboard-text-search: "\uF621", clipboard-text-search-outline: "\uF622", clippy: "\uE14E", clock: "\uE953", clock-alert: "\uE954", clock-alert-outline: "\uE5CD", clock-check: "\uEFA7", clock-check-outline: "\uEFA8", clock-digital: "\uEE96", clock-edit: "\uF9B9", clock-edit-outline: "\uF9BA", clock-end: "\uE150", clock-fast: "\uE151", clock-in: "\uE152", clock-minus: "\uF862", clock-minus-outline: "\uF863", clock-out: "\uE153", clock-outline: "\uE14F", clock-plus: "\uF860", clock-plus-outline: "\uF861", clock-remove: "\uF864", clock-remove-outline: "\uF865", clock-start: "\uE154", clock-time-eight: "\uF445", clock-time-eight-outline: "\uF451", clock-time-eleven: "\uF448", clock-time-eleven-outline: "\uF454", clock-time-five: "\uF442", clock-time-five-outline: "\uF44E", clock-time-four: "\uF441", clock-time-four-outline: "\uF44D", clock-time-nine: "\uF446", clock-time-nine-outline: "\uF452", clock-time-one: "\uF43E", clock-time-one-outline: "\uF44A", clock-time-seven: "\uF444", clock-time-seven-outline: "\uF450", clock-time-six: "\uF443", clock-time-six-outline: "\uF44F", clock-time-ten: "\uF447", clock-time-ten-outline: "\uF453", clock-time-three: "\uF440", clock-time-three-outline: "\uF44C", clock-time-twelve: "\uF449", clock-time-twelve-outline: "\uF455", clock-time-two: "\uF43F", clock-time-two-outline: "\uF44B", close: "\uE155", close-box: "\uE156", close-box-multiple: "\uEC5C", close-box-multiple-outline: "\uEC5D", close-box-outline: "\uE157", close-circle: "\uE158", close-circle-multiple: "\uE629", close-circle-multiple-outline: "\uE882", close-circle-outline: "\uE159", close-network: "\uE15A", close-network-outline: "\uEC5E", close-octagon: "\uE15B", close-octagon-outline: "\uE15C", close-outline: "\uE6C8", close-thick: "\uF397", closed-caption: "\uE15D", closed-caption-outline: "\uEDBC", cloud: "\uE15E", cloud-alert: "\uE9DF", cloud-braces: "\uE7B4", cloud-check: "\uE15F", cloud-check-outline: "\uF2CB", cloud-circle: "\uE160", cloud-download: "\uE161", cloud-download-outline: "\uEB7C", cloud-lock: "\uF1F0", cloud-lock-outline: "\uF1F1", cloud-off-outline: "\uE163", cloud-outline: "\uE162", cloud-percent: "\uFA34", cloud-percent-outline: "\uFA35", cloud-print: "\uE164", cloud-print-outline: "\uE165", cloud-question: "\uEA38", cloud-refresh: "\uE529", cloud-search: "\uE955", cloud-search-outline: "\uE956", cloud-sync: "\uE63E", cloud-sync-outline: "\uF2D5", cloud-tags: "\uE7B5", cloud-upload: "\uE166", cloud-upload-outline: "\uEB7D", clover: "\uE815", coach-lamp: "\uF01F", coach-lamp-variant: "\uFA36", coat-rack: "\uF09D", code-array: "\uE167", code-braces: "\uE168", code-braces-box: "\uF0D5", code-brackets: "\uE169", code-equal: "\uE16A", code-greater-than: "\uE16B", code-greater-than-or-equal: "\uE16C", code-json: "\uE625", code-less-than: "\uE16D", code-less-than-or-equal: "\uE16E", code-not-equal: "\uE16F", code-not-equal-variant: "\uE170", code-parentheses: "\uE171", code-parentheses-box: "\uF0D6", code-string: "\uE172", code-tags: "\uE173", code-tags-check: "\uE693", codepen: "\uE174", coffee: "\uE175", coffee-maker: "\uF09E", coffee-maker-check: "\uF930", coffee-maker-check-outline: "\uF931", coffee-maker-outline: "\uF81A", coffee-off: "\uEFA9", coffee-off-outline: "\uEFAA", coffee-outline: "\uE6C9", coffee-to-go: "\uE176", coffee-to-go-outline: "\uF30D", coffin: "\uEB7E", cog: "\uE492", cog-box: "\uE493", cog-clockwise: "\uF1DC", cog-counterclockwise: "\uF1DD", cog-off: "\uF3CD", cog-off-outline: "\uF3CE", cog-outline: "\uE8BA", cog-pause: "\uF932", cog-pause-outline: "\uF933", cog-play: "\uF934", cog-play-outline: "\uF935", cog-refresh: "\uF45D", cog-refresh-outline: "\uF45E", cog-stop: "\uF936", cog-stop-outline: "\uF937", cog-sync: "\uF45F", cog-sync-outline: "\uF460", cog-transfer: "\uF05A", cog-transfer-outline: "\uF05B", cogs: "\uE8D5", collage: "\uE63F", collapse-all: "\uEAA5", collapse-all-outline: "\uEAA6", color-helper: "\uE178", comma: "\uEE22", comma-box: "\uEE2A", comma-box-outline: "\uEE23", comma-circle: "\uEE24", comma-circle-outline: "\uEE25", comment: "\uE179", comment-account: "\uE17A", comment-account-outline: "\uE17B", comment-alert: "\uE17C", comment-alert-outline: "\uE17D", comment-arrow-left: "\uE9E0", comment-arrow-left-outline: "\uE9E1", comment-arrow-right: "\uE9E2", comment-arrow-right-outline: "\uE9E3", comment-bookmark: "\uF5AD", comment-bookmark-outline: "\uF5AE", comment-check: "\uE17E", comment-check-outline: "\uE17F", comment-edit: "\uF1BE", comment-edit-outline: "\uF2C3", comment-eye: "\uEA39", comment-eye-outline: "\uEA3A", comment-flash: "\uF5AF", comment-flash-outline: "\uF5B0", comment-minus: "\uF5DE", comment-minus-outline: "\uF5DF", comment-multiple: "\uE85E", comment-multiple-outline: "\uE180", comment-off: "\uF5E0", comment-off-outline: "\uF5E1", comment-outline: "\uE181", comment-plus: "\uE9E4", comment-plus-outline: "\uE182", comment-processing: "\uE183", comment-processing-outline: "\uE184", comment-question: "\uE816", comment-question-outline: "\uE185", comment-quote: "\uF020", comment-quote-outline: "\uF021", comment-remove: "\uE5DD", comment-remove-outline: "\uE186", comment-search: "\uEA3B", comment-search-outline: "\uEA3C", comment-text: "\uE187", comment-text-multiple: "\uE85F", comment-text-multiple-outline: "\uE860", comment-text-outline: "\uE188", compare: "\uE189", compare-horizontal: "\uF491", compare-remove: "\uF8B2", compare-vertical: "\uF492", compass: "\uE18A", compass-off: "\uEB7F", compass-off-outline: "\uEB80", compass-outline: "\uE18B", compass-rose: "\uF381", compost: "\uFA37", cone: "\uF94B", cone-off: "\uF94C", connection: "\uF615", console: "\uE18C", console-line: "\uE7B6", console-network: "\uE8A8", console-network-outline: "\uEC5F", consolidate: "\uF0D7", contactless-payment: "\uED69", contactless-payment-circle: "\uE320", contactless-payment-circle-outline: "\uE407", contacts: "\uE6CA", contacts-outline: "\uE5B7", contain: "\uEA3D", contain-end: "\uEA3E", contain-start: "\uEA3F", content-copy: "\uE18E", content-cut: "\uE18F", content-duplicate: "\uE190", content-paste: "\uE191", content-save: "\uE192", content-save-alert: "\uEF41", content-save-alert-outline: "\uEF42", content-save-all: "\uE193", content-save-all-outline: "\uEF43", content-save-check: "\uF8E9", content-save-check-outline: "\uF8EA", content-save-cog: "\uF45A", content-save-cog-outline: "\uF45B", content-save-edit: "\uECFA", content-save-edit-outline: "\uECFB", content-save-move: "\uEE26", content-save-move-outline: "\uEE27", content-save-off: "\uF642", content-save-off-outline: "\uF643", content-save-outline: "\uE817", content-save-settings: "\uE61A", content-save-settings-outline: "\uEB2D", contrast: "\uE194", contrast-box: "\uE195", contrast-circle: "\uE196", controller-classic: "\uEB81", controller-classic-outline: "\uEB82", cookie: "\uE197", cookie-alert: "\uF6CF", cookie-alert-outline: "\uF6D0", cookie-check: "\uF6D1", cookie-check-outline: "\uF6D2", cookie-clock: "\uF6E3", cookie-clock-outline: "\uF6E4", cookie-cog: "\uF6D3", cookie-cog-outline: "\uF6D4", cookie-edit: "\uF6E5", cookie-edit-outline: "\uF6E6", cookie-lock: "\uF6E7", cookie-lock-outline: "\uF6E8", cookie-minus: "\uF6D9", cookie-minus-outline: "\uF6DA", cookie-off: "\uF6E9", cookie-off-outline: "\uF6EA", cookie-outline: "\uF6DD", cookie-plus: "\uF6D5", cookie-plus-outline: "\uF6D6", cookie-refresh: "\uF6EB", cookie-refresh-outline: "\uF6EC", cookie-remove: "\uF6D7", cookie-remove-outline: "\uF6D8", cookie-settings: "\uF6DB", cookie-settings-outline: "\uF6DC", coolant-temperature: "\uE3C7", copyleft: "\uF938", copyright: "\uE5E5", cordova: "\uE957", corn: "\uE7B7", corn-off: "\uF3EE", cosine-wave: "\uF478", counter: "\uE198", countertop: "\uF81B", countertop-outline: "\uF81C", cow: "\uE199", cow-off: "\uF8FB", cpu-32-bit: "\uEEDE", cpu-64-bit: "\uEEDF", cradle: "\uF98A", cradle-outline: "\uF990", crane: "\uE861", creation: "\uE673", creative-commons: "\uED6A", credit-card: "\uEFEE", credit-card-check: "\uF3CF", credit-card-check-outline: "\uF3D0", credit-card-chip: "\uF90E", credit-card-chip-outline: "\uF90F", credit-card-clock: "\uEEE0", credit-card-clock-outline: "\uEEE1", credit-card-edit: "\uF7D6", credit-card-edit-outline: "\uF7D7", credit-card-fast: "\uF910", credit-card-fast-outline: "\uF911", credit-card-lock: "\uF8E6", credit-card-lock-outline: "\uF8E7", credit-card-marker: "\uE6A7", credit-card-marker-outline: "\uEDBD", credit-card-minus: "\uEFAB", credit-card-minus-outline: "\uEFAC", credit-card-multiple: "\uEFEF", credit-card-multiple-outline: "\uE19B", credit-card-off: "\uEFF0", credit-card-off-outline: "\uE5E3", credit-card-outline: "\uE19A", credit-card-plus: "\uEFF1", credit-card-plus-outline: "\uE675", credit-card-refresh: "\uF644", credit-card-refresh-outline: "\uF645", credit-card-refund: "\uEFF2", credit-card-refund-outline: "\uEAA7", credit-card-remove: "\uEFAD", credit-card-remove-outline: "\uEFAE", credit-card-scan: "\uEFF3", credit-card-scan-outline: "\uE19C", credit-card-search: "\uF646", credit-card-search-outline: "\uF647", credit-card-settings: "\uEFF4", credit-card-settings-outline: "\uE8D6", credit-card-sync: "\uF648", credit-card-sync-outline: "\uF649", credit-card-wireless: "\uE801", credit-card-wireless-off: "\uE579", credit-card-wireless-off-outline: "\uE57A", credit-card-wireless-outline: "\uED6B", cricket: "\uED6C", crop: "\uE19D", crop-free: "\uE19E", crop-landscape: "\uE19F", crop-portrait: "\uE1A0", crop-rotate: "\uE695", crop-square: "\uE1A1", cross: "\uE952", cross-bolnisi: "\uECEC", cross-celtic: "\uECF4", cross-outline: "\uECF5", crosshairs: "\uE1A2", crosshairs-gps: "\uE1A3", crosshairs-off: "\uEF44", crosshairs-question: "\uF135", crowd: "\uF974", crown: "\uE1A4", crown-circle: "\uF7DB", crown-circle-outline: "\uF7DC", crown-outline: "\uF1CF", cryengine: "\uE958", crystal-ball: "\uEB2E", cube: "\uE1A5", cube-off: "\uF41B", cube-off-outline: "\uF41C", cube-outline: "\uE1A6", cube-scan: "\uEB83", cube-send: "\uE1A7", cube-unfolded: "\uE1A8", cup: "\uE1A9", cup-off: "\uE5E4", cup-off-outline: "\uF37C", cup-outline: "\uF30E", cup-water: "\uE1AA", cupboard: "\uEF45", cupboard-outline: "\uEF46", cupcake: "\uE959", curling: "\uE862", currency-bdt: "\uE863", currency-brl: "\uEB84", currency-btc: "\uE1AB", currency-cny: "\uE7B9", currency-eth: "\uE7BA", currency-eur: "\uE1AC", currency-eur-off: "\uF314", currency-fra: "\uFA38", currency-gbp: "\uE1AD", currency-ils: "\uEC60", currency-inr: "\uE1AE", currency-jpy: "\uE7BB", currency-krw: "\uE7BC", currency-kzt: "\uE864", currency-mnt: "\uF511", currency-ngn: "\uE1AF", currency-php: "\uE9E5", currency-rial: "\uEE9B", currency-rub: "\uE1B0", currency-rupee: "\uF975", currency-sign: "\uE7BD", currency-try: "\uE1B1", currency-twd: "\uE7BE", currency-usd: "\uE1C0", currency-usd-off: "\uE679", current-ac: "\uF47F", current-dc: "\uE95B", cursor-default: "\uE1BF", cursor-default-click: "\uECFC", cursor-default-click-outline: "\uECFD", cursor-default-gesture: "\uF126", cursor-default-gesture-outline: "\uF127", cursor-default-outline: "\uE1BE", cursor-move: "\uE1BD", cursor-pointer: "\uE1BC", cursor-text: "\uE5E6", curtains: "\uF845", curtains-closed: "\uF846", cylinder: "\uF94D", cylinder-off: "\uF94E", dance-ballroom: "\uF5FA", dance-pole: "\uF577", data-matrix: "\uF53B", data-matrix-edit: "\uF53C", data-matrix-minus: "\uF53D", data-matrix-plus: "\uF53E", data-matrix-remove: "\uF53F", data-matrix-scan: "\uF540", database: "\uE1BB", database-alert: "\uF639", database-alert-outline: "\uF623", database-arrow-down: "\uF63A", database-arrow-down-outline: "\uF624", database-arrow-left: "\uF63B", database-arrow-left-outline: "\uF625", database-arrow-right: "\uF63C", database-arrow-right-outline: "\uF626", database-arrow-up: "\uF63D", database-arrow-up-outline: "\uF627", database-check: "\uEAA8", database-check-outline: "\uF628", database-clock: "\uF63E", database-clock-outline: "\uF629", database-cog: "\uF64A", database-cog-outline: "\uF64B", database-edit: "\uEB85", database-edit-outline: "\uF62A", database-export: "\uE95D", database-export-outline: "\uF62B", database-eye: "\uF91E", database-eye-off: "\uF91F", database-eye-off-outline: "\uF920", database-eye-outline: "\uF921", database-import: "\uE95C", database-import-outline: "\uF62C", database-lock: "\uEAA9", database-lock-outline: "\uF62D", database-marker: "\uF2F5", database-marker-outline: "\uF62E", database-minus: "\uE1BA", database-minus-outline: "\uF62F", database-off: "\uF63F", database-off-outline: "\uF630", database-outline: "\uF631", database-plus: "\uE1B9", database-plus-outline: "\uF632", database-refresh: "\uE5C1", database-refresh-outline: "\uF633", database-remove: "\uECFF", database-remove-outline: "\uF634", database-search: "\uE865", database-search-outline: "\uF635", database-settings: "\uED00", database-settings-outline: "\uF636", database-sync: "\uECFE", database-sync-outline: "\uF637", death-star: "\uE8D7", death-star-variant: "\uE8D8", deathly-hallows: "\uEB86", debian: "\uE8D9", debug-step-into: "\uE1B8", debug-step-out: "\uE1B7", debug-step-over: "\uE1B6", decagram: "\uE76B", decagram-outline: "\uE76C", decimal: "\uF0A0", decimal-comma: "\uF0A1", decimal-comma-decrease: "\uF0A2", decimal-comma-increase: "\uF0A3", decimal-decrease: "\uE1B5", decimal-increase: "\uE1B4", delete: "\uE1B3", delete-alert: "\uF0A4", delete-alert-outline: "\uF0A5", delete-circle: "\uE682", delete-circle-outline: "\uEB87", delete-clock: "\uF555", delete-clock-outline: "\uF556", delete-empty: "\uE6CB", delete-empty-outline: "\uEE9C", delete-forever: "\uE5E7", delete-forever-outline: "\uEB88", delete-off: "\uF0A6", delete-off-outline: "\uF0A7", delete-outline: "\uE9E6", delete-restore: "\uE818", delete-sweep: "\uE5E8", delete-sweep-outline: "\uEC61", delete-variant: "\uE1B2", delta: "\uE1C1", desk: "\uF238", desk-lamp: "\uE95E", deskphone: "\uE1C2", desktop-classic: "\uE7BF", desktop-mac: "\uE1C3", desktop-mac-dashboard: "\uE9E7", desktop-tower: "\uE1C4", desktop-tower-monitor: "\uEAAA", details: "\uE1C5", dev-to: "\uED6D", developer-board: "\uE696", deviantart: "\uE1C6", devices: "\uEFAF", dharmachakra: "\uE94A", diabetes: "\uF125", dialpad: "\uE61B", diameter: "\uEC62", diameter-outline: "\uEC63", diameter-variant: "\uEC64", diamond: "\uEB89", diamond-outline: "\uEB8A", diamond-stone: "\uE1C7", dice-1: "\uE1C9", dice-1-outline: "\uF149", dice-2: "\uE1CA", dice-2-outline: "\uF14A", dice-3: "\uE1CB", dice-3-outline: "\uF14B", dice-4: "\uE1CC", dice-4-outline: "\uF14C", dice-5: "\uE1CD", dice-5-outline: "\uF14D", dice-6: "\uE1CE", dice-6-outline: "\uF14E", dice-d10: "\uF152", dice-d10-outline: "\uE76E", dice-d12: "\uF153", dice-d12-outline: "\uE866", dice-d20: "\uF154", dice-d20-outline: "\uE5E9", dice-d4: "\uF14F", dice-d4-outline: "\uE5EA", dice-d6: "\uF150", dice-d6-outline: "\uE5EC", dice-d8: "\uF151", dice-d8-outline: "\uE5EB", dice-multiple: "\uE76D", dice-multiple-outline: "\uF155", digital-ocean: "\uF236", dip-switch: "\uE7C0", directions: "\uE1CF", directions-fork: "\uE640", disc: "\uE5ED", disc-alert: "\uE1D0", disc-player: "\uE95F", discord: "\uE66E", dishwasher: "\uEAAB", dishwasher-alert: "\uF1B7", dishwasher-off: "\uF1B8", disqus: "\uE1D1", distribute-horizontal-center: "\uF1C8", distribute-horizontal-left: "\uF1C7", distribute-horizontal-right: "\uF1C9", distribute-vertical-bottom: "\uF1CA", distribute-vertical-center: "\uF1CB", distribute-vertical-top: "\uF1CC", diversify: "\uF876", diving: "\uF976", diving-flippers: "\uEDBE", diving-helmet: "\uEDBF", diving-scuba: "\uEDC0", diving-scuba-flag: "\uEDC1", diving-scuba-tank: "\uEDC2", diving-scuba-tank-multiple: "\uEDC3", diving-snorkel: "\uEDC4", division: "\uE1D3", division-box: "\uE1D4", dlna: "\uEA40", dna: "\uE683", dns: "\uE1D5", dns-outline: "\uEB8B", dock-bottom: "\uF0A8", dock-left: "\uF0A9", dock-right: "\uF0AA", dock-top: "\uF512", dock-window: "\uF0AB", docker: "\uE867", doctor: "\uEA41", dog: "\uEA42", dog-service: "\uEAAC", dog-side: "\uEA43", dog-side-off: "\uF6ED", dolby: "\uE6B2", dolly: "\uEE9D", dolphin: "\uF8B3", domain: "\uE1D6", domain-off: "\uED6E", domain-plus: "\uF0AC", domain-remove: "\uF0AD", dome-light: "\uF41D", domino-mask: "\uF022", donkey: "\uE7C1", door: "\uE819", door-closed: "\uE81A", door-closed-lock: "\uF0AE", door-open: "\uE81B", door-sliding: "\uF81D", door-sliding-lock: "\uF81E", door-sliding-open: "\uF81F", doorbell: "\uF2E5", doorbell-video: "\uE868", dot-net: "\uEAAD", dots-circle: "\uF977", dots-grid: "\uF5FB", dots-hexagon: "\uF5FE", dots-horizontal: "\uE1D7", dots-horizontal-circle: "\uE7C2", dots-horizontal-circle-outline: "\uEB8C", dots-square: "\uF5FC", dots-triangle: "\uF5FD", dots-vertical: "\uE1D8", dots-vertical-circle: "\uE7C3", dots-vertical-circle-outline: "\uEB8D", download: "\uE1D9", download-box: "\uF461", download-box-outline: "\uF462", download-circle: "\uF463", download-circle-outline: "\uF464", download-lock: "\uF31F", download-lock-outline: "\uF320", download-multiple: "\uE9E8", download-network: "\uE6F3", download-network-outline: "\uEC65", download-off: "\uF0AF", download-off-outline: "\uF0B0", download-outline: "\uEB8E", drag: "\uE1DA", drag-horizontal: "\uE1DB", drag-horizontal-variant: "\uF2EF", drag-variant: "\uEB8F", drag-vertical: "\uE1DC", drag-vertical-variant: "\uF2F0", drama-masks: "\uED01", draw: "\uEF48", draw-pen: "\uF9B8", drawing: "\uE1DD", drawing-box: "\uE1DE", dresser: "\uEF49", dresser-outline: "\uEF4A", drone: "\uE1E1", dropbox: "\uE1E2", drupal: "\uE1E3", duck: "\uE1E4", dumbbell: "\uE1E5", dump-truck: "\uEC66", ear-hearing: "\uE7C4", ear-hearing-loop: "\uFAED", ear-hearing-off: "\uEA44", earbuds: "\uF84E", earbuds-off: "\uF84F", earbuds-off-outline: "\uF850", earbuds-outline: "\uF851", earth: "\uE1E6", earth-arrow-right: "\uF310", earth-box: "\uE6CC", earth-box-minus: "\uF406", earth-box-off: "\uE6CD", earth-box-plus: "\uF405", earth-box-remove: "\uF407", earth-minus: "\uF403", earth-off: "\uE1E7", earth-plus: "\uF402", earth-remove: "\uF404", egg: "\uEAAE", egg-easter: "\uEAAF", egg-fried: "\uF849", egg-off: "\uF3EF", egg-off-outline: "\uF3F0", egg-outline: "\uF3F1", eiffel-tower: "\uF56A", eight-track: "\uE9E9", eject: "\uE1E9", eject-outline: "\uEB90", electric-switch: "\uEE9E", electric-switch-closed: "\uF0D8", electron-framework: "\uF023", elephant: "\uE7C5", elevation-decline: "\uE1EA", elevation-rise: "\uE1EB", elevator: "\uE1EC", elevator-down: "\uF2C1", elevator-passenger: "\uF380", elevator-passenger-off: "\uF978", elevator-passenger-off-outline: "\uF979", elevator-passenger-outline: "\uF97A", elevator-up: "\uF2C0", ellipse: "\uEE9F", ellipse-outline: "\uEEA0", email: "\uE1ED", email-alert: "\uE6CE", email-alert-outline: "\uED41", email-box: "\uED02", email-check: "\uEAB0", email-check-outline: "\uEAB1", email-edit: "\uEEE2", email-edit-outline: "\uEEE3", email-fast: "\uF86E", email-fast-outline: "\uF86F", email-lock: "\uE1F0", email-mark-as-unread: "\uEB91", email-minus: "\uEEE4", email-minus-outline: "\uEEE5", email-multiple: "\uEEE6", email-multiple-outline: "\uEEE7", email-newsletter: "\uEFB0", email-off: "\uF3E2", email-off-outline: "\uF3E3", email-open: "\uE1EE", email-open-multiple: "\uEEE8", email-open-multiple-outline: "\uEEE9", email-open-outline: "\uE5EE", email-outline: "\uE1EF", email-plus: "\uE9EA", email-plus-outline: "\uE9EB", email-receive: "\uF0D9", email-receive-outline: "\uF0DA", email-remove: "\uF660", email-remove-outline: "\uF661", email-seal: "\uF95A", email-seal-outline: "\uF95B", email-search: "\uE960", email-search-outline: "\uE961", email-send: "\uF0DB", email-send-outline: "\uF0DC", email-sync: "\uF2C6", email-sync-outline: "\uF2C7", email-variant: "\uE5EF", ember: "\uEB2F", emby: "\uE6B3", emoticon: "\uEC67", emoticon-angry: "\uEC68", emoticon-angry-outline: "\uEC69", emoticon-confused: "\uF0DD", emoticon-confused-outline: "\uF0DE", emoticon-cool: "\uEC6A", emoticon-cool-outline: "\uE1F2", emoticon-cry: "\uEC6B", emoticon-cry-outline: "\uEC6C", emoticon-dead: "\uEC6D", emoticon-dead-outline: "\uE69A", emoticon-devil: "\uEC6E", emoticon-devil-outline: "\uE1F3", emoticon-excited: "\uEC6F", emoticon-excited-outline: "\uE69B", emoticon-frown: "\uEF4B", emoticon-frown-outline: "\uEF4C", emoticon-happy: "\uEC70", emoticon-happy-outline: "\uE1F4", emoticon-kiss: "\uEC71", emoticon-kiss-outline: "\uEC72", emoticon-lol: "\uF213", emoticon-lol-outline: "\uF214", emoticon-neutral: "\uEC73", emoticon-neutral-outline: "\uE1F5", emoticon-outline: "\uE1F1", emoticon-poop: "\uE1F6", emoticon-poop-outline: "\uEC74", emoticon-sad: "\uEC75", emoticon-sad-outline: "\uE1F7", emoticon-sick: "\uF57B", emoticon-sick-outline: "\uF57C", emoticon-tongue: "\uE1F8", emoticon-tongue-outline: "\uEC76", emoticon-wink: "\uEC77", emoticon-wink-outline: "\uEC78", engine: "\uE1F9", engine-off: "\uEA45", engine-off-outline: "\uEA46", engine-outline: "\uE1FA", epsilon: "\uF0DF", equal: "\uE1FB", equal-box: "\uE1FC", equalizer: "\uEEA1", equalizer-outline: "\uEEA2", eraser: "\uE1FD", eraser-variant: "\uE641", escalator: "\uE1FE", escalator-box: "\uF398", escalator-down: "\uF2BF", escalator-up: "\uF2BE", eslint: "\uEC79", et: "\uEAB2", ethereum: "\uE869", ethernet: "\uE1FF", ethernet-cable: "\uE200", ethernet-cable-off: "\uE201", ev-plug-ccs1: "\uF518", ev-plug-ccs2: "\uF519", ev-plug-chademo: "\uF51A", ev-plug-tesla: "\uF51B", ev-plug-type1: "\uF51C", ev-plug-type2: "\uF51D", ev-station: "\uE5F0", evernote: "\uE203", excavator: "\uF024", exclamation: "\uE204", exclamation-thick: "\uF237", exit-run: "\uEA47", exit-to-app: "\uE205", expand-all: "\uEAB3", expand-all-outline: "\uEAB4", expansion-card: "\uE8AD", expansion-card-variant: "\uEFB1", exponent: "\uE962", exponent-box: "\uE963", export: "\uE206", export-variant: "\uEB92", eye: "\uE207", eye-arrow-left: "\uF8FC", eye-arrow-left-outline: "\uF8FD", eye-arrow-right: "\uF8FE", eye-arrow-right-outline: "\uF8FF", eye-check: "\uED03", eye-check-outline: "\uED04", eye-circle: "\uEB93", eye-circle-outline: "\uEB94", eye-minus: "\uF025", eye-minus-outline: "\uF026", eye-off: "\uE208", eye-off-outline: "\uE6D0", eye-outline: "\uE6CF", eye-plus: "\uE86A", eye-plus-outline: "\uE86B", eye-refresh: "\uF97B", eye-refresh-outline: "\uF97C", eye-remove: "\uF5E2", eye-remove-outline: "\uF5E3", eye-settings: "\uE86C", eye-settings-outline: "\uE86D", eyedropper: "\uE209", eyedropper-minus: "\uF3DC", eyedropper-off: "\uF3DE", eyedropper-plus: "\uF3DB", eyedropper-remove: "\uF3DD", eyedropper-variant: "\uE20A", face-agent: "\uED6F", face-man: "\uE642", face-man-outline: "\uEB95", face-man-profile: "\uE643", face-man-shimmer: "\uF5CB", face-man-shimmer-outline: "\uF5CC", face-mask: "\uF585", face-mask-outline: "\uF586", face-recognition: "\uEC7A", face-woman: "\uF076", face-woman-outline: "\uF077", face-woman-profile: "\uF075", face-woman-shimmer: "\uF5CD", face-woman-shimmer-outline: "\uF5CE", facebook: "\uE20B", facebook-gaming: "\uE7DC", facebook-messenger: "\uE20D", facebook-workplace: "\uEB30", factory: "\uE20E", family-tree: "\uF60D", fan: "\uE20F", fan-alert: "\uF46B", fan-auto: "\uF71C", fan-chevron-down: "\uF46C", fan-chevron-up: "\uF46D", fan-clock: "\uFA39", fan-minus: "\uF46F", fan-off: "\uE81C", fan-plus: "\uF46E", fan-remove: "\uF470", fan-speed-1: "\uF471", fan-speed-2: "\uF472", fan-speed-3: "\uF473", fast-forward: "\uE210", fast-forward-10: "\uED70", fast-forward-15: "\uF939", fast-forward-30: "\uED05", fast-forward-5: "\uF1F7", fast-forward-60: "\uF60A", fast-forward-outline: "\uE6D1", fax: "\uE211", feather: "\uE6D2", feature-search: "\uEA48", feature-search-outline: "\uEA49", fedora: "\uE8DA", fence: "\uF799", fence-electric: "\uF7F5", fencing: "\uF4C0", ferris-wheel: "\uEEA3", ferry: "\uE212", file: "\uE213", file-account: "\uE73A", file-account-outline: "\uF027", file-alert: "\uEA4A", file-alert-outline: "\uEA4B", file-arrow-left-right: "\uFA92", file-arrow-left-right-outline: "\uFA93", file-arrow-up-down: "\uFA94", file-arrow-up-down-outline: "\uFA95", file-cabinet: "\uEAB5", file-cad: "\uEEEA", file-cad-box: "\uEEEB", file-cancel: "\uEDC5", file-cancel-outline: "\uEDC6", file-certificate: "\uF185", file-certificate-outline: "\uF186", file-chart: "\uE214", file-chart-check: "\uF9C5", file-chart-check-outline: "\uF9C6", file-chart-outline: "\uF028", file-check: "\uE215", file-check-outline: "\uEE28", file-clock: "\uF2E0", file-clock-outline: "\uF2E1", file-cloud: "\uE216", file-cloud-outline: "\uF029", file-code: "\uE22D", file-code-outline: "\uF02A", file-cog: "\uF07A", file-cog-outline: "\uF07B", file-compare: "\uE8A9", file-delimited: "\uE217", file-delimited-outline: "\uEEA4", file-document: "\uE218", file-document-alert: "\uFA96", file-document-alert-outline: "\uFA97", file-document-check: "\uFA98", file-document-check-outline: "\uFA99", file-document-edit: "\uEDC7", file-document-edit-outline: "\uEDC8", file-document-minus: "\uFA9A", file-document-minus-outline: "\uFA9B", file-document-multiple: "\uF516", file-document-multiple-outline: "\uF517", file-document-outline: "\uE9ED", file-document-plus: "\uFA9C", file-document-plus-outline: "\uFA9D", file-document-remove: "\uFA9E", file-document-remove-outline: "\uFA9F", file-download: "\uE964", file-download-outline: "\uE965", file-edit: "\uF1E6", file-edit-outline: "\uF1E7", file-excel: "\uE21A", file-excel-box: "\uE21B", file-excel-box-outline: "\uF02B", file-excel-outline: "\uF02C", file-export: "\uE21C", file-export-outline: "\uF02D", file-eye: "\uEDC9", file-eye-outline: "\uEDCA", file-find: "\uE21D", file-find-outline: "\uEB96", file-gif-box: "\uED77", file-hidden: "\uE612", file-image: "\uE21E", file-image-marker: "\uF771", file-image-marker-outline: "\uF772", file-image-minus: "\uF93A", file-image-minus-outline: "\uF93B", file-image-outline: "\uEEAF", file-image-plus: "\uF93C", file-image-plus-outline: "\uF93D", file-image-remove: "\uF93E", file-image-remove-outline: "\uF93F", file-import: "\uE21F", file-import-outline: "\uF02E", file-jpg-box: "\uE224", file-key: "\uF183", file-key-outline: "\uF184", file-link: "\uF176", file-link-outline: "\uF177", file-lock: "\uE220", file-lock-open: "\uF9C7", file-lock-open-outline: "\uF9C8", file-lock-outline: "\uF02F", file-marker: "\uF773", file-marker-outline: "\uF774", file-minus: "\uFAA0", file-minus-outline: "\uFAA1", file-move: "\uEAB8", file-move-outline: "\uF030", file-multiple: "\uE221", file-multiple-outline: "\uF031", file-music: "\uE222", file-music-outline: "\uEE29", file-outline: "\uE223", file-pdf-box: "\uE225", file-percent: "\uE81D", file-percent-outline: "\uF032", file-phone: "\uF178", file-phone-outline: "\uF179", file-plus: "\uE751", file-plus-outline: "\uEEEC", file-png-box: "\uEE2C", file-powerpoint: "\uE226", file-powerpoint-box: "\uE227", file-powerpoint-box-outline: "\uF033", file-powerpoint-outline: "\uF034", file-presentation-box: "\uE228", file-question: "\uE86E", file-question-outline: "\uF035", file-refresh: "\uE917", file-refresh-outline: "\uE540", file-remove: "\uEB97", file-remove-outline: "\uF036", file-replace: "\uEB31", file-replace-outline: "\uEB32", file-restore: "\uE66F", file-restore-outline: "\uF037", file-rotate-left: "\uFA3A", file-rotate-left-outline: "\uFA3B", file-rotate-right: "\uFA3C", file-rotate-right-outline: "\uFA3D", file-search: "\uEC7B", file-search-outline: "\uEC7C", file-send: "\uE229", file-send-outline: "\uF038", file-settings: "\uF078", file-settings-outline: "\uF079", file-sign: "\uF9C2", file-star: "\uF039", file-star-outline: "\uF03A", file-swap: "\uEFB3", file-swap-outline: "\uEFB4", file-sync: "\uF215", file-sync-outline: "\uF216", file-table: "\uEC7D", file-table-box: "\uF0E0", file-table-box-multiple: "\uF0E1", file-table-box-multiple-outline: "\uF0E2", file-table-box-outline: "\uF0E3", file-table-outline: "\uEC7E", file-tree: "\uE644", file-tree-outline: "\uF3D1", file-undo: "\uE8DB", file-undo-outline: "\uF03B", file-upload: "\uEA4C", file-upload-outline: "\uEA4D", file-video: "\uE22A", file-video-outline: "\uEE2B", file-word: "\uE22B", file-word-box: "\uE22C", file-word-box-outline: "\uF03C", file-word-outline: "\uF03D", film: "\uE22E", filmstrip: "\uE22F", filmstrip-box: "\uE331", filmstrip-box-multiple: "\uED17", filmstrip-off: "\uE230", filter: "\uE231", filter-check: "\uF8EB", filter-check-outline: "\uF8EC", filter-cog: "\uFAA2", filter-cog-outline: "\uFAA3", filter-menu: "\uF0E4", filter-menu-outline: "\uF0E5", filter-minus: "\uEEED", filter-minus-outline: "\uEEEE", filter-multiple: "\uFA3E", filter-multiple-outline: "\uFA3F", filter-off: "\uF4EE", filter-off-outline: "\uF4EF", filter-outline: "\uE232", filter-plus: "\uEEEF", filter-plus-outline: "\uEEF0", filter-remove: "\uE233", filter-remove-outline: "\uE234", filter-settings: "\uFAA4", filter-settings-outline: "\uFAA5", filter-variant: "\uE235", filter-variant-minus: "\uF111", filter-variant-plus: "\uF112", filter-variant-remove: "\uF03E", finance: "\uE81E", find-replace: "\uE6D3", fingerprint: "\uE236", fingerprint-off: "\uEEB0", fire: "\uE237", fire-alert: "\uF5D6", fire-circle: "\uF806", fire-extinguisher: "\uEEF1", fire-hydrant: "\uF136", fire-hydrant-alert: "\uF137", fire-hydrant-off: "\uF138", fire-off: "\uF721", fire-truck: "\uE8AA", firebase: "\uE966", firefox: "\uE238", fireplace: "\uEE2D", fireplace-off: "\uEE2E", firewire: "\uE5BD", firework: "\uEE2F", firework-off: "\uF722", fish: "\uE239", fish-off: "\uF3F2", fishbowl: "\uEEF2", fishbowl-outline: "\uEEF3", fit-to-page: "\uEEF4", fit-to-page-outline: "\uEEF5", fit-to-screen: "\uF8F3", fit-to-screen-outline: "\uF8F4", flag: "\uE23A", flag-checkered: "\uE23B", flag-minus: "\uEB98", flag-minus-outline: "\uF0B1", flag-off: "\uF8ED", flag-off-outline: "\uF8EE", flag-outline: "\uE23C", flag-plus: "\uEB99", flag-plus-outline: "\uF0B2", flag-remove: "\uEB9A", flag-remove-outline: "\uF0B3", flag-triangle: "\uE23E", flag-variant: "\uE23F", flag-variant-outline: "\uE23D", flare: "\uED71", flash: "\uE240", flash-alert: "\uEEF6", flash-alert-outline: "\uEEF7", flash-auto: "\uE241", flash-off: "\uE242", flash-outline: "\uE6D4", flash-red-eye: "\uE67A", flashlight: "\uE243", flashlight-off: "\uE244", flask: "\uE092", flask-empty: "\uE093", flask-empty-minus: "\uF239", flask-empty-minus-outline: "\uF23A", flask-empty-off: "\uF3F3", flask-empty-off-outline: "\uF3F4", flask-empty-outline: "\uE094", flask-empty-plus: "\uF23B", flask-empty-plus-outline: "\uF23C", flask-empty-remove: "\uF23D", flask-empty-remove-outline: "\uF23E", flask-minus: "\uF23F", flask-minus-outline: "\uF240", flask-off: "\uF3F5", flask-off-outline: "\uF3F6", flask-outline: "\uE095", flask-plus: "\uF241", flask-plus-outline: "\uF242", flask-remove: "\uF243", flask-remove-outline: "\uF244", flask-round-bottom: "\uF24A", flask-round-bottom-empty: "\uF24B", flask-round-bottom-empty-outline: "\uF24C", flask-round-bottom-outline: "\uF24D", fleur-de-lis: "\uF302", flip-horizontal: "\uF0E6", flip-to-back: "\uE246", flip-to-front: "\uE247", flip-vertical: "\uF0E7", floor-lamp: "\uE8DC", floor-lamp-dual: "\uF03F", floor-lamp-dual-outline: "\uF7CD", floor-lamp-outline: "\uF7C7", floor-lamp-torchiere: "\uF746", floor-lamp-torchiere-outline: "\uF7D5", floor-lamp-torchiere-variant: "\uF040", floor-lamp-torchiere-variant-outline: "\uF7CE", floor-plan: "\uE820", floppy: "\uE248", floppy-variant: "\uE9EE", flower: "\uE249", flower-outline: "\uE9EF", flower-pollen: "\uF884", flower-pollen-outline: "\uF885", flower-poppy: "\uED07", flower-tulip: "\uE9F0", flower-tulip-outline: "\uE9F1", focus-auto: "\uEF4D", focus-field: "\uEF4E", focus-field-horizontal: "\uEF4F", focus-field-vertical: "\uEF50", folder: "\uE24A", folder-account: "\uE24B", folder-account-outline: "\uEB9B", folder-alert: "\uEDCB", folder-alert-outline: "\uEDCC", folder-arrow-down: "\uF9E7", folder-arrow-down-outline: "\uF9E8", folder-arrow-left: "\uF9E9", folder-arrow-left-outline: "\uF9EA", folder-arrow-left-right: "\uF9EB", folder-arrow-left-right-outline: "\uF9EC", folder-arrow-right: "\uF9ED", folder-arrow-right-outline: "\uF9EE", folder-arrow-up: "\uF9EF", folder-arrow-up-down: "\uF9F0", folder-arrow-up-down-outline: "\uF9F1", folder-arrow-up-outline: "\uF9F2", folder-cancel: "\uF9F3", folder-cancel-outline: "\uF9F4", folder-check: "\uF97D", folder-check-outline: "\uF97E", folder-clock: "\uEAB9", folder-clock-outline: "\uEABA", folder-cog: "\uF07E", folder-cog-outline: "\uF07F", folder-download: "\uE24C", folder-download-outline: "\uF0E8", folder-edit: "\uE8DD", folder-edit-outline: "\uEDCD", folder-eye: "\uF789", folder-eye-outline: "\uF78A", folder-file: "\uF9F5", folder-file-outline: "\uF9F6", folder-google-drive: "\uE24D", folder-heart: "\uF0E9", folder-heart-outline: "\uF0EA", folder-hidden: "\uF79D", folder-home: "\uF0B4", folder-home-outline: "\uF0B5", folder-image: "\uE24E", folder-information: "\uF0B6", folder-information-outline: "\uF0B7", folder-key: "\uE8AB", folder-key-network: "\uE8AC", folder-key-network-outline: "\uEC7F", folder-key-outline: "\uF0EB", folder-lock: "\uE24F", folder-lock-open: "\uE250", folder-lock-open-outline: "\uFAA6", folder-lock-outline: "\uFAA7", folder-marker: "\uF26C", folder-marker-outline: "\uF26D", folder-move: "\uE251", folder-move-outline: "\uF245", folder-multiple: "\uE252", folder-multiple-image: "\uE253", folder-multiple-outline: "\uE254", folder-multiple-plus: "\uF47D", folder-multiple-plus-outline: "\uF47E", folder-music: "\uF358", folder-music-outline: "\uF359", folder-network: "\uE86F", folder-network-outline: "\uEC80", folder-off: "\uF9F7", folder-off-outline: "\uF9F8", folder-open: "\uE76F", folder-open-outline: "\uEDCE", folder-outline: "\uE255", folder-play: "\uF9F9", folder-play-outline: "\uF9FA", folder-plus: "\uE256", folder-plus-outline: "\uEB9C", folder-pound: "\uED08", folder-pound-outline: "\uED09", folder-question: "\uF9C9", folder-question-outline: "\uF9CA", folder-refresh: "\uE748", folder-refresh-outline: "\uE541", folder-remove: "\uE257", folder-remove-outline: "\uEB9D", folder-search: "\uE967", folder-search-outline: "\uE968", folder-settings: "\uF07C", folder-settings-outline: "\uF07D", folder-star: "\uE69C", folder-star-multiple: "\uF3D2", folder-star-multiple-outline: "\uF3D3", folder-star-outline: "\uEB9E", folder-swap: "\uEFB5", folder-swap-outline: "\uEFB6", folder-sync: "\uED0A", folder-sync-outline: "\uED0B", folder-table: "\uF2E2", folder-table-outline: "\uF2E3", folder-text: "\uEC81", folder-text-outline: "\uEC82", folder-upload: "\uE258", folder-upload-outline: "\uF0EC", folder-wrench: "\uF9FB", folder-wrench-outline: "\uF9FC", folder-zip: "\uE6EA", folder-zip-outline: "\uE7B8", font-awesome: "\uE039", food: "\uE259", food-apple: "\uE25A", food-apple-outline: "\uEC83", food-croissant: "\uE7C7", food-drumstick: "\uF41E", food-drumstick-off: "\uF467", food-drumstick-off-outline: "\uF468", food-drumstick-outline: "\uF41F", food-fork-drink: "\uE5F1", food-halal: "\uF571", food-hot-dog: "\uF84A", food-kosher: "\uF572", food-off: "\uE5F2", food-off-outline: "\uF914", food-outline: "\uF915", food-steak: "\uF469", food-steak-off: "\uF46A", food-takeout-box: "\uF835", food-takeout-box-outline: "\uF836", food-turkey: "\uF71B", food-variant: "\uE25B", food-variant-off: "\uF3E4", foot-print: "\uEF51", football: "\uE25C", football-australian: "\uE25D", football-helmet: "\uE25E", forest: "\uF896", forklift: "\uE7C8", form-dropdown: "\uF3FF", form-select: "\uF400", form-textarea: "\uF094", form-textbox: "\uE60D", form-textbox-lock: "\uF35C", form-textbox-password: "\uE7F4", format-align-bottom: "\uE752", format-align-center: "\uE25F", format-align-justify: "\uE260", format-align-left: "\uE261", format-align-middle: "\uE753", format-align-right: "\uE262", format-align-top: "\uE754", format-annotation-minus: "\uEABB", format-annotation-plus: "\uE645", format-bold: "\uE263", format-clear: "\uE264", format-color-fill: "\uE265", format-color-highlight: "\uEE30", format-color-marker-cancel: "\uF312", format-color-text: "\uE69D", format-columns: "\uE8DE", format-float-center: "\uE266", format-float-left: "\uE267", format-float-none: "\uE268", format-float-right: "\uE269", format-font: "\uE6D5", format-font-size-decrease: "\uE9F2", format-font-size-increase: "\uE9F3", format-header-1: "\uE26A", format-header-2: "\uE26B", format-header-3: "\uE26C", format-header-4: "\uE26D", format-header-5: "\uE26E", format-header-6: "\uE26F", format-header-decrease: "\uE270", format-header-equal: "\uE271", format-header-increase: "\uE272", format-header-pound: "\uE273", format-horizontal-align-center: "\uE61D", format-horizontal-align-left: "\uE61E", format-horizontal-align-right: "\uE61F", format-indent-decrease: "\uE274", format-indent-increase: "\uE275", format-italic: "\uE276", format-letter-case: "\uEB33", format-letter-case-lower: "\uEB34", format-letter-case-upper: "\uEB35", format-letter-ends-with: "\uEFB7", format-letter-matches: "\uEFB8", format-letter-spacing: "\uF955", format-letter-starts-with: "\uEFB9", format-line-spacing: "\uE277", format-line-style: "\uE5C7", format-line-weight: "\uE5C8", format-list-bulleted: "\uE278", format-list-bulleted-square: "\uEDCF", format-list-bulleted-triangle: "\uEEB1", format-list-bulleted-type: "\uE279", format-list-checkbox: "\uE969", format-list-checks: "\uE755", format-list-group: "\uF85F", format-list-numbered: "\uE27A", format-list-numbered-rtl: "\uED0C", format-list-text: "\uF26E", format-overline: "\uEEB2", format-page-break: "\uE6D6", format-page-split: "\uF916", format-paint: "\uE27B", format-paragraph: "\uE27C", format-pilcrow: "\uE6D7", format-quote-close: "\uE27D", format-quote-close-outline: "\uF1A7", format-quote-open: "\uE756", format-quote-open-outline: "\uF1A6", format-rotate-90: "\uE6A9", format-section: "\uE69E", format-size: "\uE27E", format-strikethrough: "\uE27F", format-strikethrough-variant: "\uE280", format-subscript: "\uE281", format-superscript: "\uE282", format-text: "\uE283", format-text-rotation-angle-down: "\uEFBA", format-text-rotation-angle-up: "\uEFBB", format-text-rotation-down: "\uED72", format-text-rotation-down-vertical: "\uEFBC", format-text-rotation-none: "\uED73", format-text-rotation-up: "\uEFBD", format-text-rotation-vertical: "\uEFBE", format-text-variant: "\uEE31", format-text-variant-outline: "\uF50E", format-text-wrapping-clip: "\uED0D", format-text-wrapping-overflow: "\uED0E", format-text-wrapping-wrap: "\uED0F", format-textbox: "\uED10", format-textdirection-l-to-r: "\uE284", format-textdirection-r-to-l: "\uE285", format-title: "\uE5F3", format-underline: "\uE286", format-underline-wavy: "\uF8E8", format-vertical-align-bottom: "\uE620", format-vertical-align-center: "\uE621", format-vertical-align-top: "\uE622", format-wrap-inline: "\uE287", format-wrap-square: "\uE288", format-wrap-tight: "\uE289", format-wrap-top-bottom: "\uE28A", forum: "\uE28B", forum-minus: "\uFAA8", forum-minus-outline: "\uFAA9", forum-outline: "\uE821", forum-plus: "\uFAAA", forum-plus-outline: "\uFAAB", forum-remove: "\uFAAC", forum-remove-outline: "\uFAAD", forward: "\uE28C", forwardburger: "\uED74", fountain: "\uE96A", fountain-pen: "\uED11", fountain-pen-tip: "\uED12", fraction-one-half: "\uF991", freebsd: "\uE8DF", french-fries: "\uF956", frequently-asked-questions: "\uEEB3", fridge: "\uE28F", fridge-alert: "\uF1B0", fridge-alert-outline: "\uF1B1", fridge-bottom: "\uE291", fridge-industrial: "\uF5ED", fridge-industrial-alert: "\uF5EE", fridge-industrial-alert-outline: "\uF5EF", fridge-industrial-off: "\uF5F0", fridge-industrial-off-outline: "\uF5F1", fridge-industrial-outline: "\uF5F2", fridge-off: "\uF1AE", fridge-off-outline: "\uF1AF", fridge-outline: "\uE28E", fridge-top: "\uE290", fridge-variant: "\uF5F3", fridge-variant-alert: "\uF5F4", fridge-variant-alert-outline: "\uF5F5", fridge-variant-off: "\uF5F6", fridge-variant-off-outline: "\uF5F7", fridge-variant-outline: "\uF5F8", fruit-cherries: "\uF041", fruit-cherries-off: "\uF3F7", fruit-citrus: "\uF042", fruit-citrus-off: "\uF3F8", fruit-grapes: "\uF043", fruit-grapes-outline: "\uF044", fruit-pear: "\uFA0D", fruit-pineapple: "\uF045", fruit-watermelon: "\uF046", fuel: "\uE7C9", fuel-cell: "\uF8B4", fullscreen: "\uE292", fullscreen-exit: "\uE293", function: "\uE294", function-variant: "\uE870", furigana-horizontal: "\uF080", furigana-vertical: "\uF081", fuse: "\uEC84", fuse-alert: "\uF42C", fuse-blade: "\uEC85", fuse-off: "\uF42B", gamepad: "\uE295", gamepad-circle: "\uEE32", gamepad-circle-down: "\uEE33", gamepad-circle-left: "\uEE34", gamepad-circle-outline: "\uEE35", gamepad-circle-right: "\uEE36", gamepad-circle-up: "\uEE37", gamepad-down: "\uEE38", gamepad-left: "\uEE39", gamepad-outline: "\uF918", gamepad-right: "\uEE3A", gamepad-round: "\uEE3B", gamepad-round-down: "\uEE3C", gamepad-round-left: "\uEE3D", gamepad-round-outline: "\uEE3E", gamepad-round-right: "\uEE3F", gamepad-round-up: "\uEE40", gamepad-square: "\uEEB4", gamepad-square-outline: "\uEEB5", gamepad-up: "\uEE41", gamepad-variant: "\uE296", gamepad-variant-outline: "\uEEB6", gamma: "\uF0ED", gantry-crane: "\uEDD0", garage: "\uE6D8", garage-alert: "\uE871", garage-alert-variant: "\uF2D4", garage-lock: "\uF7FA", garage-open: "\uE6D9", garage-open-variant: "\uF2D3", garage-variant: "\uF2D2", garage-variant-lock: "\uF7FB", gas-burner: "\uFA1A", gas-cylinder: "\uE646", gas-station: "\uE297", gas-station-off: "\uF408", gas-station-off-outline: "\uF409", gas-station-outline: "\uEEB7", gate: "\uE298", gate-alert: "\uF7F7", gate-and: "\uE8E0", gate-arrow-left: "\uF7F6", gate-arrow-right: "\uF168", gate-nand: "\uE8E1", gate-nor: "\uE8E2", gate-not: "\uE8E3", gate-open: "\uF169", gate-or: "\uE8E4", gate-xnor: "\uE8E5", gate-xor: "\uE8E6", gatsby: "\uEE42", gauge: "\uE299", gauge-empty: "\uE872", gauge-full: "\uE873", gauge-low: "\uE874", gavel: "\uE29A", gender-female: "\uE29B", gender-male: "\uE29C", gender-male-female: "\uE29D", gender-male-female-variant: "\uF13E", gender-non-binary: "\uF13F", gender-transgender: "\uE29E", gentoo: "\uE8E7", gesture: "\uE7CA", gesture-double-tap: "\uE73B", gesture-pinch: "\uEABC", gesture-spread: "\uEABD", gesture-swipe: "\uED75", gesture-swipe-down: "\uE73C", gesture-swipe-horizontal: "\uEABE", gesture-swipe-left: "\uE73D", gesture-swipe-right: "\uE73E", gesture-swipe-up: "\uE73F", gesture-swipe-vertical: "\uEABF", gesture-tap: "\uE740", gesture-tap-box: "\uF2A8", gesture-tap-button: "\uF2A7", gesture-tap-hold: "\uED76", gesture-two-double-tap: "\uE741", gesture-two-tap: "\uE742", ghost: "\uE29F", ghost-off: "\uE9F4", ghost-off-outline: "\uF65B", ghost-outline: "\uF65C", gift: "\uEE43", gift-off: "\uF6EE", gift-off-outline: "\uF6EF", gift-open: "\uF6F0", gift-open-outline: "\uF6F1", gift-outline: "\uE2A0", git: "\uE2A1", github: "\uE2A3", gitlab: "\uEB9F", glass-cocktail: "\uE355", glass-cocktail-off: "\uF5E5", glass-flute: "\uE2A4", glass-fragile: "\uF872", glass-mug: "\uE2A5", glass-mug-off: "\uF5E6", glass-mug-variant: "\uF115", glass-mug-variant-off: "\uF5E7", glass-pint-outline: "\uF30C", glass-stange: "\uE2A6", glass-tulip: "\uE2A7", glass-wine: "\uE875", glasses: "\uE2A9", globe-light: "\uF2D6", globe-model: "\uE8E8", gmail: "\uE2AA", gnome: "\uE2AB", go-kart: "\uED78", go-kart-track: "\uED79", gog: "\uEBA0", gold: "\uF24E", golf: "\uE822", golf-cart: "\uF1A3", golf-tee: "\uF082", gondola: "\uE685", goodreads: "\uED7A", google: "\uE2AC", google-ads: "\uEC86", google-analytics: "\uE7CB", google-assistant: "\uE7CC", google-cardboard: "\uE2AD", google-chrome: "\uE2AE", google-circles: "\uE2AF", google-circles-communities: "\uE2B0", google-circles-extended: "\uE2B1", google-circles-group: "\uE2B2", google-classroom: "\uE2BF", google-cloud: "\uF1F5", google-controller: "\uE2B3", google-controller-off: "\uE2B4", google-downasaur: "\uF361", google-drive: "\uE2B5", google-earth: "\uE2B6", google-fit: "\uE96B", google-glass: "\uE2B7", google-hangouts: "\uE2C8", google-home: "\uE823", google-keep: "\uE6DB", google-lens: "\uE9F5", google-maps: "\uE5F4", google-my-business: "\uF047", google-nearby: "\uE2B8", google-play: "\uE2BB", google-plus: "\uE2BC", google-podcast: "\uEEB8", google-spreadsheet: "\uE9F6", google-street-view: "\uEC87", google-translate: "\uE2BE", gradient-horizontal: "\uF749", gradient-vertical: "\uE69F", grain: "\uED7B", graph: "\uF048", graph-outline: "\uF049", graphql: "\uE876", grass: "\uF50F", grave-stone: "\uEBA1", grease-pencil: "\uE647", greater-than: "\uE96C", greater-than-or-equal: "\uE96D", greenhouse: "\uE02C", grid: "\uE2C0", grid-large: "\uE757", grid-off: "\uE2C1", grill: "\uEE44", grill-outline: "\uF189", group: "\uE2C2", guitar-acoustic: "\uE770", guitar-electric: "\uE2C3", guitar-pick: "\uE2C4", guitar-pick-outline: "\uE2C5", guy-fawkes-mask: "\uE824", gymnastics: "\uFA40", hail: "\uEAC0", hair-dryer: "\uF0EE", hair-dryer-outline: "\uF0EF", halloween: "\uEBA2", hamburger: "\uE684", hamburger-check: "\uF775", hamburger-minus: "\uF776", hamburger-off: "\uF777", hamburger-plus: "\uF778", hamburger-remove: "\uF779", hammer: "\uE8E9", hammer-screwdriver: "\uF321", hammer-sickle: "\uF886", hammer-wrench: "\uF322", hand-back-left: "\uEE45", hand-back-left-off: "\uF82F", hand-back-left-off-outline: "\uF831", hand-back-left-outline: "\uF82B", hand-back-right: "\uEE46", hand-back-right-off: "\uF830", hand-back-right-off-outline: "\uF832", hand-back-right-outline: "\uF82C", hand-clap: "\uF94A", hand-clap-off: "\uFA41", hand-coin: "\uF88E", hand-coin-outline: "\uF88F", hand-extended: "\uF8B5", hand-extended-outline: "\uF8B6", hand-front-left: "\uF82A", hand-front-left-outline: "\uF82D", hand-front-right: "\uEA4E", hand-front-right-outline: "\uF82E", hand-heart: "\uF0F0", hand-heart-outline: "\uF57D", hand-okay: "\uEA4F", hand-peace: "\uEA50", hand-peace-variant: "\uEA51", hand-pointing-down: "\uEA52", hand-pointing-left: "\uEA53", hand-pointing-right: "\uE2C6", hand-pointing-up: "\uEA54", hand-saw: "\uEE47", hand-wash: "\uF57E", hand-wash-outline: "\uF57F", hand-water: "\uF39E", hand-wave: "\uF820", hand-wave-outline: "\uF821", handball: "\uEF52", handcuffs: "\uF13D", hands-pray: "\uE578", handshake: "\uF217", handshake-outline: "\uF5A0", hanger: "\uE2C7", hard-hat: "\uE96E", harddisk: "\uE2C9", harddisk-plus: "\uF04A", harddisk-remove: "\uF04B", hat-fedora: "\uEBA3", hazard-lights: "\uEC88", hdr: "\uED7C", hdr-off: "\uED7D", head: "\uF35D", head-alert: "\uF337", head-alert-outline: "\uF338", head-check: "\uF339", head-check-outline: "\uF33A", head-cog: "\uF33B", head-cog-outline: "\uF33C", head-dots-horizontal: "\uF33D", head-dots-horizontal-outline: "\uF33E", head-flash: "\uF33F", head-flash-outline: "\uF340", head-heart: "\uF341", head-heart-outline: "\uF342", head-lightbulb: "\uF343", head-lightbulb-outline: "\uF344", head-minus: "\uF345", head-minus-outline: "\uF346", head-outline: "\uF35E", head-plus: "\uF347", head-plus-outline: "\uF348", head-question: "\uF349", head-question-outline: "\uF34A", head-remove: "\uF34B", head-remove-outline: "\uF34C", head-snowflake: "\uF34D", head-snowflake-outline: "\uF34E", head-sync: "\uF34F", head-sync-outline: "\uF350", headphones: "\uE2CA", headphones-bluetooth: "\uE96F", headphones-box: "\uE2CB", headphones-off: "\uE7CD", headphones-settings: "\uE2CC", headset: "\uE2CD", headset-dock: "\uE2CE", headset-off: "\uE2CF", heart: "\uE2D0", heart-box: "\uE2D1", heart-box-outline: "\uE2D2", heart-broken: "\uE2D3", heart-broken-outline: "\uED13", heart-circle: "\uE970", heart-circle-outline: "\uE971", heart-cog: "\uF662", heart-cog-outline: "\uF663", heart-flash: "\uEEF8", heart-half: "\uE6DE", heart-half-full: "\uE6DD", heart-half-outline: "\uE6DF", heart-minus: "\uF42E", heart-minus-outline: "\uF431", heart-multiple: "\uEA55", heart-multiple-outline: "\uEA56", heart-off: "\uE758", heart-off-outline: "\uF433", heart-outline: "\uE2D4", heart-plus: "\uF42D", heart-plus-outline: "\uF430", heart-pulse: "\uE5F5", heart-remove: "\uF42F", heart-remove-outline: "\uF432", heart-settings: "\uF664", heart-settings-outline: "\uF665", heat-pump: "\uFA42", heat-pump-outline: "\uFA43", heat-wave: "\uFA44", heating-coil: "\uFAAE", helicopter: "\uEAC1", help: "\uE2D5", help-box: "\uE78A", help-circle: "\uE2D6", help-circle-outline: "\uE624", help-network: "\uE6F4", help-network-outline: "\uEC89", help-rhombus: "\uEBA4", help-rhombus-outline: "\uEBA5", hexadecimal: "\uF2A6", hexagon: "\uE2D7", hexagon-multiple: "\uE6E0", hexagon-multiple-outline: "\uF0F1", hexagon-outline: "\uE2D8", hexagon-slice-1: "\uEAC2", hexagon-slice-2: "\uEAC3", hexagon-slice-3: "\uEAC4", hexagon-slice-4: "\uEAC5", hexagon-slice-5: "\uEAC6", hexagon-slice-6: "\uEAC7", hexagram: "\uEAC8", hexagram-outline: "\uEAC9", high-definition: "\uE7CE", high-definition-box: "\uE877", highway: "\uE5F6", hiking: "\uED7E", history: "\uE2D9", hockey-puck: "\uE878", hockey-sticks: "\uE879", hololens: "\uE2DA", home: "\uE2DB", home-account: "\uE825", home-alert: "\uE87A", home-alert-outline: "\uF5CF", home-analytics: "\uEEB9", home-assistant: "\uE7CF", home-automation: "\uE7D0", home-battery: "\uF900", home-battery-outline: "\uF901", home-circle: "\uE7D1", home-circle-outline: "\uF04C", home-city: "\uED14", home-city-outline: "\uED15", home-clock: "\uFA11", home-clock-outline: "\uFA12", home-edit: "\uF158", home-edit-outline: "\uF159", home-export-outline: "\uEF9A", home-flood: "\uEEF9", home-floor-0: "\uEDD1", home-floor-1: "\uED7F", home-floor-2: "\uED80", home-floor-3: "\uED81", home-floor-a: "\uED82", home-floor-b: "\uED83", home-floor-g: "\uED84", home-floor-l: "\uED85", home-floor-negative-1: "\uEDD2", home-group: "\uEDD3", home-group-minus: "\uF9C0", home-group-plus: "\uF9BF", home-group-remove: "\uF9C1", home-heart: "\uE826", home-import-outline: "\uEF9B", home-lightbulb: "\uF250", home-lightbulb-outline: "\uF251", home-lightning-bolt: "\uF902", home-lightning-bolt-outline: "\uF903", home-lock: "\uE8EA", home-lock-open: "\uE8EB", home-map-marker: "\uE5F7", home-minus: "\uE973", home-minus-outline: "\uF3D4", home-modern: "\uE2DC", home-off: "\uFA45", home-off-outline: "\uFA46", home-outline: "\uE6A0", home-plus: "\uE974", home-plus-outline: "\uF3D5", home-remove: "\uF246", home-remove-outline: "\uF3D6", home-roof: "\uF12A", home-search: "\uF3AF", home-search-outline: "\uF3B0", home-switch: "\uF793", home-switch-outline: "\uF794", home-thermometer: "\uEF53", home-thermometer-outline: "\uEF54", home-variant: "\uE2DD", home-variant-outline: "\uEBA6", hook: "\uE6E1", hook-off: "\uE6E2", hoop-house: "\uEE55", hops: "\uE2DE", horizontal-rotate-clockwise: "\uF0F2", horizontal-rotate-counterclockwise: "\uF0F3", horse: "\uF5BE", horse-human: "\uF5BF", horse-variant: "\uF5C0", horse-variant-fast: "\uF86D", horseshoe: "\uEA57", hospital: "\uEFF5", hospital-box: "\uE2DF", hospital-box-outline: "\uEFF6", hospital-building: "\uE2E0", hospital-marker: "\uE2E1", hot-tub: "\uE827", hours-24: "\uF477", hubspot: "\uED16", hulu: "\uE828", human: "\uE2E5", human-baby-changing-table: "\uF38A", human-cane: "\uF580", human-capacity-decrease: "\uF59A", human-capacity-increase: "\uF59B", human-child: "\uE2E6", human-dolly: "\uF97F", human-edit: "\uF4E7", human-female: "\uE648", human-female-boy: "\uEA58", human-female-dance: "\uF5C8", human-female-female: "\uEA59", human-female-girl: "\uEA5A", human-greeting: "\uF7C3", human-greeting-proximity: "\uF59C", human-greeting-variant: "\uE649", human-handsdown: "\uE64A", human-handsup: "\uE64B", human-male: "\uE64C", human-male-board: "\uE88F", human-male-board-poll: "\uE845", human-male-boy: "\uEA5B", human-male-child: "\uF38B", human-male-female: "\uE2E7", human-male-female-child: "\uF822", human-male-girl: "\uEA5C", human-male-height: "\uEEFA", human-male-height-variant: "\uEEFB", human-male-male: "\uEA5D", human-non-binary: "\uF847", human-pregnant: "\uE5CE", human-queue: "\uF570", human-scooter: "\uF1E8", human-wheelchair: "\uF38C", human-white-cane: "\uF980", humble-bundle: "\uE743", hvac: "\uF351", hvac-off: "\uF59D", hydraulic-oil-level: "\uF323", hydraulic-oil-temperature: "\uF324", hydro-power: "\uF2E4", hydrogen-station: "\uF893", ice-cream: "\uE829", ice-cream-off: "\uEE51", ice-pop: "\uEEFC", id-card: "\uEFBF", identifier: "\uEEFD", ideogram-cjk: "\uF330", ideogram-cjk-variant: "\uF331", image: "\uE2E8", image-album: "\uE2E9", image-area: "\uE2EA", image-area-close: "\uE2EB", image-auto-adjust: "\uEFC0", image-broken: "\uE2EC", image-broken-variant: "\uE2ED", image-edit: "\uF1E2", image-edit-outline: "\uF1E3", image-filter-black-white: "\uE2EF", image-filter-center-focus: "\uE2F0", image-filter-center-focus-strong: "\uEEFE", image-filter-center-focus-strong-outline: "\uEEFF", image-filter-center-focus-weak: "\uE2F1", image-filter-drama: "\uE2F2", image-filter-frames: "\uE2F3", image-filter-hdr: "\uE2F4", image-filter-none: "\uE2F5", image-filter-tilt-shift: "\uE2F6", image-filter-vintage: "\uE2F7", image-frame: "\uEE48", image-lock: "\uFAAF", image-lock-outline: "\uFAB0", image-marker: "\uF77A", image-marker-outline: "\uF77B", image-minus: "\uF418", image-move: "\uE9F7", image-multiple: "\uE2F8", image-multiple-outline: "\uE2EE", image-off: "\uE82A", image-off-outline: "\uF1D0", image-outline: "\uE975", image-plus: "\uE87B", image-refresh: "\uF9FD", image-refresh-outline: "\uF9FE", image-remove: "\uF417", image-search: "\uE976", image-search-outline: "\uE977", image-size-select-actual: "\uEC8C", image-size-select-large: "\uEC8D", image-size-select-small: "\uEC8E", image-sync: "\uF9FF", image-sync-outline: "\uFA00", image-text: "\uF60C", import: "\uE2F9", inbox: "\uE686", inbox-arrow-down: "\uE2FA", inbox-arrow-down-outline: "\uF26F", inbox-arrow-up: "\uE3D0", inbox-arrow-up-outline: "\uF270", inbox-full: "\uF271", inbox-full-outline: "\uF272", inbox-multiple: "\uE8AF", inbox-multiple-outline: "\uEBA7", inbox-outline: "\uF273", inbox-remove: "\uF59E", inbox-remove-outline: "\uF59F", incognito: "\uE5F8", incognito-circle: "\uF420", incognito-circle-off: "\uF421", incognito-off: "\uE074", induction: "\uF84B", infinity: "\uE6E3", information: "\uE2FB", information-off: "\uF78B", information-off-outline: "\uF78C", information-outline: "\uE2FC", information-variant: "\uE64D", instagram: "\uE2FD", instrument-triangle: "\uF04D", integrated-circuit-chip: "\uF912", invert-colors: "\uE300", invert-colors-off: "\uEE49", iobroker: "\uF2E7", ip: "\uEA5E", ip-network: "\uEA5F", ip-network-outline: "\uEC8F", ip-outline: "\uF981", ipod: "\uEC90", iron: "\uF823", iron-board: "\uF837", iron-outline: "\uF824", island: "\uF04E", iv-bag: "\uF0B8", jabber: "\uEDD4", jeepney: "\uE301", jellyfish: "\uEF00", jellyfish-outline: "\uEF01", jira: "\uE302", jquery: "\uE87C", jsfiddle: "\uE303", jump-rope: "\uF2FE", kabaddi: "\uED86", kangaroo: "\uF557", karate: "\uE82B", kayaking: "\uE8AE", keg: "\uE304", kettle: "\uE5F9", kettle-alert: "\uF316", kettle-alert-outline: "\uF317", kettle-off: "\uF31A", kettle-off-outline: "\uF31B", kettle-outline: "\uEF55", kettle-pour-over: "\uF73B", kettle-steam: "\uF318", kettle-steam-outline: "\uF319", kettlebell: "\uF2FF", key: "\uE305", key-alert: "\uF982", key-alert-outline: "\uF983", key-arrow-right: "\uF311", key-chain: "\uF573", key-chain-variant: "\uF574", key-change: "\uE306", key-link: "\uF19E", key-minus: "\uE307", key-outline: "\uEDD5", key-plus: "\uE308", key-remove: "\uE309", key-star: "\uF19D", key-variant: "\uE30A", key-wireless: "\uEFC1", keyboard: "\uE30B", keyboard-backspace: "\uE30C", keyboard-caps: "\uE30D", keyboard-close: "\uE30E", keyboard-esc: "\uF2B6", keyboard-f1: "\uF2AA", keyboard-f10: "\uF2B3", keyboard-f11: "\uF2B4", keyboard-f12: "\uF2B5", keyboard-f2: "\uF2AB", keyboard-f3: "\uF2AC", keyboard-f4: "\uF2AD", keyboard-f5: "\uF2AE", keyboard-f6: "\uF2AF", keyboard-f7: "\uF2B0", keyboard-f8: "\uF2B1", keyboard-f9: "\uF2B2", keyboard-off: "\uE30F", keyboard-off-outline: "\uEE4A", keyboard-outline: "\uE97A", keyboard-return: "\uE310", keyboard-settings: "\uE9F8", keyboard-settings-outline: "\uE9F9", keyboard-space: "\uF04F", keyboard-tab: "\uE311", keyboard-tab-reverse: "\uE324", keyboard-variant: "\uE312", khanda: "\uF0FC", kickstarter: "\uE744", kite: "\uF984", kite-outline: "\uF985", kitesurfing: "\uF743", klingon: "\uF35A", knife: "\uE9FA", knife-military: "\uE9FB", koala: "\uF73E", kodi: "\uE313", kubernetes: "\uF0FD", label: "\uE314", label-multiple: "\uF374", label-multiple-outline: "\uF375", label-off: "\uEACA", label-off-outline: "\uEACB", label-outline: "\uE315", label-percent: "\uF2E9", label-percent-outline: "\uF2EA", label-variant: "\uEACC", label-variant-outline: "\uEACD", ladder: "\uF5A1", ladybug: "\uE82C", lambda: "\uE626", lamp: "\uE6B4", lamp-outline: "\uF7CF", lamps: "\uF575", lamps-outline: "\uF7D0", lan: "\uE316", lan-check: "\uF2A9", lan-connect: "\uE317", lan-disconnect: "\uE318", lan-pending: "\uE319", land-fields: "\uFAB1", land-plots: "\uFAB2", land-plots-circle: "\uFAB3", land-plots-circle-variant: "\uFAB4", land-rows-horizontal: "\uFAB5", land-rows-vertical: "\uFAB6", landslide: "\uFA47", landslide-outline: "\uFA48", language-c: "\uE670", language-cpp: "\uE671", language-csharp: "\uE31A", language-css3: "\uE31B", language-fortran: "\uF219", language-go: "\uE7D2", language-haskell: "\uEC91", language-html5: "\uE31C", language-java: "\uEB36", language-javascript: "\uE31D", language-kotlin: "\uF218", language-lua: "\uE8B0", language-markdown: "\uE353", language-markdown-outline: "\uEF5A", language-php: "\uE31E", language-python: "\uE31F", language-r: "\uE7D3", language-ruby: "\uED2C", language-ruby-on-rails: "\uEACE", language-rust: "\uF616", language-swift: "\uE6E4", language-typescript: "\uE6E5", language-xaml: "\uE672", laptop: "\uE321", laptop-account: "\uFA49", laptop-off: "\uE6E6", laravel: "\uEACF", laser-pointer: "\uF483", lasso: "\uEF02", lastpass: "\uE445", latitude: "\uEF56", launch: "\uE326", lava-lamp: "\uE7D4", layers: "\uE327", layers-edit: "\uF891", layers-minus: "\uEE4B", layers-off: "\uE328", layers-off-outline: "\uE9FC", layers-outline: "\uE9FD", layers-plus: "\uEE4C", layers-remove: "\uEE4D", layers-search: "\uF205", layers-search-outline: "\uF206", layers-triple: "\uEF57", layers-triple-outline: "\uEF58", lead-pencil: "\uE64E", leaf: "\uE329", leaf-circle: "\uF904", leaf-circle-outline: "\uF905", leaf-maple: "\uEC92", leaf-maple-off: "\uF2D9", leaf-off: "\uF2D8", leak: "\uEDD6", leak-off: "\uEDD7", lecturn: "\uFAEF", led-off: "\uE32A", led-on: "\uE32B", led-outline: "\uE32C", led-strip: "\uE7D5", led-strip-variant: "\uF050", led-strip-variant-off: "\uFA4A", led-variant-off: "\uE32D", led-variant-on: "\uE32E", led-variant-outline: "\uE32F", leek: "\uF17C", less-than: "\uE97B", less-than-or-equal: "\uE97C", library: "\uE330", library-outline: "\uFA21", library-shelves: "\uEBA8", license: "\uEFC2", lifebuoy: "\uE87D", light-flood-down: "\uF986", light-flood-up: "\uF987", light-recessed: "\uF79A", light-switch: "\uE97D", light-switch-off: "\uFA23", lightbulb: "\uE334", lightbulb-alert: "\uF9E0", lightbulb-alert-outline: "\uF9E1", lightbulb-auto: "\uF7FF", lightbulb-auto-outline: "\uF800", lightbulb-cfl: "\uF207", lightbulb-cfl-off: "\uF208", lightbulb-cfl-spiral: "\uF274", lightbulb-cfl-spiral-off: "\uF2C2", lightbulb-fluorescent-tube: "\uF803", lightbulb-fluorescent-tube-outline: "\uF804", lightbulb-group: "\uF252", lightbulb-group-off: "\uF2CC", lightbulb-group-off-outline: "\uF2CD", lightbulb-group-outline: "\uF253", lightbulb-multiple: "\uF254", lightbulb-multiple-off: "\uF2CE", lightbulb-multiple-off-outline: "\uF2CF", lightbulb-multiple-outline: "\uF255", lightbulb-night: "\uFA4B", lightbulb-night-outline: "\uFA4C", lightbulb-off: "\uEE4E", lightbulb-off-outline: "\uEE4F", lightbulb-on: "\uE6E7", lightbulb-on-10: "\uFA4D", lightbulb-on-20: "\uFA4E", lightbulb-on-30: "\uFA4F", lightbulb-on-40: "\uFA50", lightbulb-on-50: "\uFA51", lightbulb-on-60: "\uFA52", lightbulb-on-70: "\uFA53", lightbulb-on-80: "\uFA54", lightbulb-on-90: "\uFA55", lightbulb-on-outline: "\uE6E8", lightbulb-outline: "\uE335", lightbulb-question: "\uF9E2", lightbulb-question-outline: "\uF9E3", lightbulb-spot: "\uF7F3", lightbulb-spot-off: "\uF7F4", lightbulb-variant: "\uF801", lightbulb-variant-outline: "\uF802", lighthouse: "\uE9FE", lighthouse-on: "\uE9FF", lightning-bolt: "\uF40A", lightning-bolt-circle: "\uE81F", lightning-bolt-outline: "\uF40B", line-scan: "\uE623", lingerie: "\uF475", link: "\uE336", link-box: "\uED19", link-box-outline: "\uED1A", link-box-variant: "\uED1B", link-box-variant-outline: "\uED1C", link-lock: "\uF0B9", link-off: "\uE337", link-plus: "\uEC93", link-variant: "\uE338", link-variant-minus: "\uF0FE", link-variant-off: "\uE339", link-variant-plus: "\uF0FF", link-variant-remove: "\uF100", linkedin: "\uE33A", linux: "\uE33C", linux-mint: "\uE8EC", lipstick: "\uF3B4", liquid-spot: "\uF825", liquor: "\uF91D", list-status: "\uF5AA", litecoin: "\uEA60", loading: "\uE771", location-enter: "\uEFC3", location-exit: "\uEFC4", lock: "\uE33D", lock-alert: "\uE8ED", lock-alert-outline: "\uF5D0", lock-check: "\uF399", lock-check-outline: "\uF6A7", lock-clock: "\uE97E", lock-minus: "\uF6A8", lock-minus-outline: "\uF6A9", lock-off: "\uF670", lock-off-outline: "\uF671", lock-open: "\uE33E", lock-open-alert: "\uF39A", lock-open-alert-outline: "\uF5D1", lock-open-check: "\uF39B", lock-open-check-outline: "\uF6AA", lock-open-minus: "\uF6AB", lock-open-minus-outline: "\uF6AC", lock-open-outline: "\uE33F", lock-open-plus: "\uF6AD", lock-open-plus-outline: "\uF6AE", lock-open-remove: "\uF6AF", lock-open-remove-outline: "\uF6B0", lock-open-variant: "\uEFC5", lock-open-variant-outline: "\uEFC6", lock-outline: "\uE340", lock-pattern: "\uE6E9", lock-plus: "\uE5FA", lock-plus-outline: "\uF6B1", lock-question: "\uE8EE", lock-remove: "\uF6B2", lock-remove-outline: "\uF6B3", lock-reset: "\uE772", lock-smart: "\uE8B1", locker: "\uE7D6", locker-multiple: "\uE7D7", login: "\uE341", login-variant: "\uE5FB", logout: "\uE342", logout-variant: "\uE5FC", longitude: "\uEF59", looks: "\uE343", lotion: "\uF581", lotion-outline: "\uF582", lotion-plus: "\uF583", lotion-plus-outline: "\uF584", loupe: "\uE344", lumx: "\uE345", lungs: "\uF083", mace: "\uF842", magazine-pistol: "\uE323", magazine-rifle: "\uE322", magic-staff: "\uF843", magnet: "\uE346", magnet-on: "\uE347", magnify: "\uE348", magnify-close: "\uE97F", magnify-expand: "\uF873", magnify-minus: "\uE349", magnify-minus-cursor: "\uEA61", magnify-minus-outline: "\uE6EB", magnify-plus: "\uE34A", magnify-plus-cursor: "\uEA62", magnify-plus-outline: "\uE6EC", magnify-remove-cursor: "\uF20B", magnify-remove-outline: "\uF20C", magnify-scan: "\uF275", mail: "\uEEBA", mailbox: "\uE6ED", mailbox-open: "\uED87", mailbox-open-outline: "\uED88", mailbox-open-up: "\uED89", mailbox-open-up-outline: "\uED8A", mailbox-outline: "\uED8B", mailbox-up: "\uED8C", mailbox-up-outline: "\uED8D", manjaro: "\uF609", map: "\uE34C", map-check: "\uEEBB", map-check-outline: "\uEEBC", map-clock: "\uED1D", map-clock-outline: "\uED1E", map-legend: "\uEA00", map-marker: "\uE34D", map-marker-account: "\uF8E2", map-marker-account-outline: "\uF8E3", map-marker-alert: "\uEF04", map-marker-alert-outline: "\uEF05", map-marker-check: "\uEC94", map-marker-check-outline: "\uF2FA", map-marker-circle: "\uE34E", map-marker-distance: "\uE8EF", map-marker-down: "\uF101", map-marker-left: "\uF2DA", map-marker-left-outline: "\uF2DC", map-marker-minus: "\uE64F", map-marker-minus-outline: "\uF2F8", map-marker-multiple: "\uE34F", map-marker-multiple-outline: "\uF276", map-marker-off: "\uE350", map-marker-off-outline: "\uF2FC", map-marker-outline: "\uE7D8", map-marker-path: "\uED1F", map-marker-plus: "\uE650", map-marker-plus-outline: "\uF2F7", map-marker-question: "\uEF06", map-marker-question-outline: "\uEF07", map-marker-radius: "\uE351", map-marker-radius-outline: "\uF2FB", map-marker-remove: "\uEF08", map-marker-remove-outline: "\uF2F9", map-marker-remove-variant: "\uEF09", map-marker-right: "\uF2DB", map-marker-right-outline: "\uF2DD", map-marker-star: "\uF607", map-marker-star-outline: "\uF608", map-marker-up: "\uF102", map-minus: "\uE980", map-outline: "\uE981", map-plus: "\uE982", map-search: "\uE983", map-search-outline: "\uE984", mapbox: "\uEBA9", margin: "\uE352", marker: "\uE651", marker-cancel: "\uEDD8", marker-check: "\uE354", mastodon: "\uEAD0", material-design: "\uE985", material-ui: "\uE356", math-compass: "\uE357", math-cos: "\uEC95", math-integral: "\uEFC7", math-integral-box: "\uEFC8", math-log: "\uF084", math-norm: "\uEFC9", math-norm-box: "\uEFCA", math-sin: "\uEC96", math-tan: "\uEC97", matrix: "\uE627", medal: "\uE986", medal-outline: "\uF325", medical-bag: "\uE6EE", medical-cotton-swab: "\uFAB7", meditation: "\uF17A", memory: "\uE35A", menorah: "\uF7D3", menorah-fire: "\uF7D4", menu: "\uE35B", menu-down: "\uE35C", menu-down-outline: "\uE6B5", menu-left: "\uE35D", menu-left-outline: "\uEA01", menu-open: "\uEBAA", menu-right: "\uE35E", menu-right-outline: "\uEA02", menu-swap: "\uEA63", menu-swap-outline: "\uEA64", menu-up: "\uE35F", menu-up-outline: "\uE6B6", merge: "\uEF5B", message: "\uE360", message-alert: "\uE361", message-alert-outline: "\uEA03", message-arrow-left: "\uF2F1", message-arrow-left-outline: "\uF2F2", message-arrow-right: "\uF2F3", message-arrow-right-outline: "\uF2F4", message-badge: "\uF940", message-badge-outline: "\uF941", message-bookmark: "\uF5AB", message-bookmark-outline: "\uF5AC", message-bulleted: "\uE6A1", message-bulleted-off: "\uE6A2", message-cog: "\uE6F0", message-cog-outline: "\uF171", message-draw: "\uE362", message-fast: "\uF9CB", message-fast-outline: "\uF9CC", message-flash: "\uF5A8", message-flash-outline: "\uF5A9", message-image: "\uE363", message-image-outline: "\uF16B", message-lock: "\uEFCB", message-lock-outline: "\uF16C", message-minus: "\uF16D", message-minus-outline: "\uF16E", message-off: "\uF64C", message-off-outline: "\uF64D", message-outline: "\uE364", message-plus: "\uE652", message-plus-outline: "\uF0BA", message-processing: "\uE365", message-processing-outline: "\uF16F", message-question: "\uF739", message-question-outline: "\uF73A", message-reply: "\uE366", message-reply-outline: "\uF73C", message-reply-text: "\uE367", message-reply-text-outline: "\uF73D", message-settings: "\uE6EF", message-settings-outline: "\uF170", message-star: "\uE699", message-star-outline: "\uF24F", message-text: "\uE368", message-text-clock: "\uF172", message-text-clock-outline: "\uF173", message-text-fast: "\uF9CD", message-text-fast-outline: "\uF9CE", message-text-lock: "\uEFCC", message-text-lock-outline: "\uF174", message-text-outline: "\uE369", message-video: "\uE36A", meteor: "\uE628", meter-electric: "\uFA56", meter-electric-outline: "\uFA57", meter-gas: "\uFA58", meter-gas-outline: "\uFA59", metronome: "\uE7D9", metronome-tick: "\uE7DA", micro-sd: "\uE7DB", microphone: "\uE36B", microphone-minus: "\uE8B2", microphone-off: "\uE36C", microphone-outline: "\uE36D", microphone-plus: "\uE8B3", microphone-question: "\uF988", microphone-question-outline: "\uF989", microphone-settings: "\uE36E", microphone-variant: "\uE36F", microphone-variant-off: "\uE370", microscope: "\uE653", microsoft: "\uE371", microsoft-access: "\uF38D", microsoft-azure: "\uE804", microsoft-azure-devops: "\uEFD4", microsoft-bing: "\uE0A3", microsoft-dynamics-365: "\uE987", microsoft-edge: "\uE1E8", microsoft-excel: "\uF38E", microsoft-internet-explorer: "\uE2FF", microsoft-office: "\uE3C5", microsoft-onedrive: "\uE3C9", microsoft-onenote: "\uE746", microsoft-outlook: "\uED21", microsoft-powerpoint: "\uF38F", microsoft-sharepoint: "\uF390", microsoft-teams: "\uE2BA", microsoft-visual-studio: "\uE60F", microsoft-visual-studio-code: "\uEA1D", microsoft-windows: "\uE5B2", microsoft-windows-classic: "\uEA20", microsoft-word: "\uF391", microsoft-xbox: "\uE5B8", microsoft-xbox-controller: "\uE5B9", microsoft-xbox-controller-battery-alert: "\uE74A", microsoft-xbox-controller-battery-charging: "\uEA21", microsoft-xbox-controller-battery-empty: "\uE74B", microsoft-xbox-controller-battery-full: "\uE74C", microsoft-xbox-controller-battery-low: "\uE74D", microsoft-xbox-controller-battery-medium: "\uE74E", microsoft-xbox-controller-battery-unknown: "\uE74F", microsoft-xbox-controller-menu: "\uEE6E", microsoft-xbox-controller-off: "\uE5BA", microsoft-xbox-controller-view: "\uEE6F", microwave: "\uEC98", microwave-off: "\uF422", middleware: "\uEF5C", middleware-outline: "\uEF5D", midi: "\uE8F0", midi-port: "\uE8F1", mine: "\uEDD9", minecraft: "\uE372", mini-sd: "\uEA04", minidisc: "\uEA05", minus: "\uE373", minus-box: "\uE374", minus-box-multiple: "\uF140", minus-box-multiple-outline: "\uF141", minus-box-outline: "\uE6F1", minus-circle: "\uE375", minus-circle-multiple: "\uE359", minus-circle-multiple-outline: "\uEAD2", minus-circle-off: "\uF458", minus-circle-off-outline: "\uF459", minus-circle-outline: "\uE376", minus-network: "\uE377", minus-network-outline: "\uEC99", minus-thick: "\uF638", mirror: "\uF1FC", mirror-rectangle: "\uF79E", mirror-variant: "\uF79F", mixed-martial-arts: "\uED8E", mixed-reality: "\uE87E", molecule: "\uEBAB", molecule-co: "\uF2FD", molecule-co2: "\uE7E3", monitor: "\uE378", monitor-account: "\uFA5A", monitor-arrow-down: "\uF9CF", monitor-arrow-down-variant: "\uF9D0", monitor-cellphone: "\uE988", monitor-cellphone-star: "\uE989", monitor-dashboard: "\uEA06", monitor-edit: "\uF2C5", monitor-eye: "\uF3B3", monitor-lock: "\uEDDA", monitor-multiple: "\uE379", monitor-off: "\uED8F", monitor-screenshot: "\uEE50", monitor-share: "\uF482", monitor-shimmer: "\uF103", monitor-small: "\uF875", monitor-speaker: "\uEF5E", monitor-speaker-off: "\uEF5F", monitor-star: "\uEDDB", moon-first-quarter: "\uEF60", moon-full: "\uEF61", moon-last-quarter: "\uEF62", moon-new: "\uEF63", moon-waning-crescent: "\uEF64", moon-waning-gibbous: "\uEF65", moon-waxing-crescent: "\uEF66", moon-waxing-gibbous: "\uEF67", moped: "\uF085", moped-electric: "\uF5B6", moped-electric-outline: "\uF5B7", moped-outline: "\uF5B8", more: "\uE37A", mortar-pestle: "\uF747", mortar-pestle-plus: "\uE3F0", mosque: "\uF826", mother-heart: "\uF313", mother-nurse: "\uED20", motion: "\uF5B1", motion-outline: "\uF5B2", motion-pause: "\uF58F", motion-pause-outline: "\uF591", motion-play: "\uF58E", motion-play-outline: "\uF590", motion-sensor: "\uED90", motion-sensor-off: "\uF434", motorbike: "\uE37B", motorbike-electric: "\uF5B9", mouse: "\uE37C", mouse-bluetooth: "\uE98A", mouse-move-down: "\uF54F", mouse-move-up: "\uF550", mouse-move-vertical: "\uF551", mouse-off: "\uE37D", mouse-variant: "\uE37E", mouse-variant-off: "\uE37F", move-resize: "\uE654", move-resize-variant: "\uE655", movie: "\uE380", movie-check: "\uF6F2", movie-check-outline: "\uF6F3", movie-cog: "\uF6F4", movie-cog-outline: "\uF6F5", movie-edit: "\uF121", movie-edit-outline: "\uF122", movie-filter: "\uF123", movie-filter-outline: "\uF124", movie-minus: "\uF6F6", movie-minus-outline: "\uF6F7", movie-off: "\uF6F8", movie-off-outline: "\uF6F9", movie-open: "\uEFCD", movie-open-check: "\uF6FA", movie-open-check-outline: "\uF6FB", movie-open-cog: "\uF6FC", movie-open-cog-outline: "\uF6FD", movie-open-edit: "\uF6FE", movie-open-edit-outline: "\uF6FF", movie-open-minus: "\uF700", movie-open-minus-outline: "\uF701", movie-open-off: "\uF702", movie-open-off-outline: "\uF703", movie-open-outline: "\uEFCE", movie-open-play: "\uF704", movie-open-play-outline: "\uF705", movie-open-plus: "\uF706", movie-open-plus-outline: "\uF707", movie-open-remove: "\uF708", movie-open-remove-outline: "\uF709", movie-open-settings: "\uF70A", movie-open-settings-outline: "\uF70B", movie-open-star: "\uF70C", movie-open-star-outline: "\uF70D", movie-outline: "\uEDDC", movie-play: "\uF70E", movie-play-outline: "\uF70F", movie-plus: "\uF710", movie-plus-outline: "\uF711", movie-remove: "\uF712", movie-remove-outline: "\uF713", movie-roll: "\uE7DD", movie-search: "\uF1D1", movie-search-outline: "\uF1D2", movie-settings: "\uF714", movie-settings-outline: "\uF715", movie-star: "\uF716", movie-star-outline: "\uF717", mower: "\uF66E", mower-bag: "\uF66F", muffin: "\uE98B", multicast: "\uF892", multiplication: "\uE381", multiplication-box: "\uE382", mushroom: "\uE7DE", mushroom-off: "\uF3F9", mushroom-off-outline: "\uF3FA", mushroom-outline: "\uE7DF", music: "\uE759", music-accidental-double-flat: "\uEF68", music-accidental-double-sharp: "\uEF69", music-accidental-flat: "\uEF6A", music-accidental-natural: "\uEF6B", music-accidental-sharp: "\uEF6C", music-box: "\uE383", music-box-multiple: "\uE332", music-box-multiple-outline: "\uEF03", music-box-outline: "\uE384", music-circle: "\uE385", music-circle-outline: "\uEAD3", music-clef-alto: "\uEF6D", music-clef-bass: "\uEF6E", music-clef-treble: "\uEF6F", music-note: "\uE386", music-note-bluetooth: "\uE5FD", music-note-bluetooth-off: "\uE5FE", music-note-eighth: "\uE387", music-note-eighth-dotted: "\uEF70", music-note-half: "\uE388", music-note-half-dotted: "\uEF71", music-note-off: "\uE389", music-note-off-outline: "\uEF72", music-note-outline: "\uEF73", music-note-plus: "\uEDDD", music-note-quarter: "\uE38A", music-note-quarter-dotted: "\uEF74", music-note-sixteenth: "\uE38B", music-note-sixteenth-dotted: "\uEF75", music-note-whole: "\uE38C", music-note-whole-dotted: "\uEF76", music-off: "\uE75A", music-rest-eighth: "\uEF77", music-rest-half: "\uEF78", music-rest-quarter: "\uEF79", music-rest-sixteenth: "\uEF7A", music-rest-whole: "\uEF7B", mustache: "\uF5DD", nail: "\uEDDE", nas: "\uE8F2", nativescript: "\uE87F", nature: "\uE38D", nature-people: "\uE38E", navigation: "\uE38F", navigation-outline: "\uF606", navigation-variant: "\uF8EF", navigation-variant-outline: "\uF8F0", near-me: "\uE5CC", necklace: "\uEF0A", needle: "\uE390", needle-off: "\uF9D1", netflix: "\uE745", network: "\uE6F2", network-off: "\uEC9A", network-off-outline: "\uEC9B", network-outline: "\uEC9C", network-pos: "\uFACA", network-strength-1: "\uE8F3", network-strength-1-alert: "\uE8F4", network-strength-2: "\uE8F5", network-strength-2-alert: "\uE8F6", network-strength-3: "\uE8F7", network-strength-3-alert: "\uE8F8", network-strength-4: "\uE8F9", network-strength-4-alert: "\uE8FA", network-strength-4-cog: "\uF919", network-strength-off: "\uE8FB", network-strength-off-outline: "\uE8FC", network-strength-outline: "\uE8FD", new-box: "\uE393", newspaper: "\uE394", newspaper-check: "\uF942", newspaper-minus: "\uEF0B", newspaper-plus: "\uEF0C", newspaper-remove: "\uF943", newspaper-variant: "\uF000", newspaper-variant-multiple: "\uF001", newspaper-variant-multiple-outline: "\uF002", newspaper-variant-outline: "\uF003", nfc: "\uE395", nfc-search-variant: "\uEE52", nfc-tap: "\uE396", nfc-variant: "\uE397", nfc-variant-off: "\uEE53", ninja: "\uE773", nintendo-game-boy: "\uF392", nintendo-switch: "\uE7E0", nintendo-wii: "\uE5AA", nintendo-wiiu: "\uE72C", nix: "\uF104", nodejs: "\uE398", noodles: "\uF17D", not-equal: "\uE98C", not-equal-variant: "\uE98D", note: "\uE399", note-alert: "\uF77C", note-alert-outline: "\uF77D", note-check: "\uF77E", note-check-outline: "\uF77F", note-edit: "\uF780", note-edit-outline: "\uF781", note-minus: "\uF64E", note-minus-outline: "\uF64F", note-multiple: "\uE6B7", note-multiple-outline: "\uE6B8", note-off: "\uF782", note-off-outline: "\uF783", note-outline: "\uE39A", note-plus: "\uE39B", note-plus-outline: "\uE39C", note-remove: "\uF650", note-remove-outline: "\uF651", note-search: "\uF652", note-search-outline: "\uF653", note-text: "\uE39D", note-text-outline: "\uF1D6", notebook: "\uE82D", notebook-check: "\uF4F4", notebook-check-outline: "\uF4F5", notebook-edit: "\uF4E6", notebook-edit-outline: "\uF4E8", notebook-heart: "\uFA0A", notebook-heart-outline: "\uFA0B", notebook-minus: "\uF60F", notebook-minus-outline: "\uF610", notebook-multiple: "\uEE54", notebook-outline: "\uEEBE", notebook-plus: "\uF611", notebook-plus-outline: "\uF612", notebook-remove: "\uF613", notebook-remove-outline: "\uF614", notification-clear-all: "\uE39E", npm: "\uE6F6", nuke: "\uE6A3", null: "\uE7E1", numeric: "\uE39F", numeric-0: "\uEB38", numeric-0-box: "\uE3A0", numeric-0-box-multiple: "\uEF0D", numeric-0-box-multiple-outline: "\uE3A1", numeric-0-box-outline: "\uE3A2", numeric-0-circle: "\uEC9D", numeric-0-circle-outline: "\uEC9E", numeric-1: "\uEB39", numeric-1-box: "\uE3A3", numeric-1-box-multiple: "\uEF0E", numeric-1-box-multiple-outline: "\uE3A4", numeric-1-box-outline: "\uE3A5", numeric-1-circle: "\uEC9F", numeric-1-circle-outline: "\uECA0", numeric-10: "\uEFE8", numeric-10-box: "\uEF7C", numeric-10-box-multiple: "\uEFE9", numeric-10-box-multiple-outline: "\uEFEA", numeric-10-box-outline: "\uEF7D", numeric-10-circle: "\uEFEB", numeric-10-circle-outline: "\uEFEC", numeric-2: "\uEB3A", numeric-2-box: "\uE3A6", numeric-2-box-multiple: "\uEF0F", numeric-2-box-multiple-outline: "\uE3A7", numeric-2-box-outline: "\uE3A8", numeric-2-circle: "\uECA1", numeric-2-circle-outline: "\uECA2", numeric-3: "\uEB3B", numeric-3-box: "\uE3A9", numeric-3-box-multiple: "\uEF10", numeric-3-box-multiple-outline: "\uE3AA", numeric-3-box-outline: "\uE3AB", numeric-3-circle: "\uECA3", numeric-3-circle-outline: "\uECA4", numeric-4: "\uEB3C", numeric-4-box: "\uE3AC", numeric-4-box-multiple: "\uEF11", numeric-4-box-multiple-outline: "\uE3B1", numeric-4-box-outline: "\uE3AD", numeric-4-circle: "\uECA5", numeric-4-circle-outline: "\uECA6", numeric-5: "\uEB3D", numeric-5-box: "\uE3B0", numeric-5-box-multiple: "\uEF12", numeric-5-box-multiple-outline: "\uE3AE", numeric-5-box-outline: "\uE3AF", numeric-5-circle: "\uECA7", numeric-5-circle-outline: "\uECA8", numeric-6: "\uEB3E", numeric-6-box: "\uE3B2", numeric-6-box-multiple: "\uEF13", numeric-6-box-multiple-outline: "\uE3B3", numeric-6-box-outline: "\uE3B4", numeric-6-circle: "\uECA9", numeric-6-circle-outline: "\uECAA", numeric-7: "\uEB3F", numeric-7-box: "\uE3B5", numeric-7-box-multiple: "\uEF14", numeric-7-box-multiple-outline: "\uE3B6", numeric-7-box-outline: "\uE3B7", numeric-7-circle: "\uECAB", numeric-7-circle-outline: "\uECAC", numeric-8: "\uEB40", numeric-8-box: "\uE3B8", numeric-8-box-multiple: "\uEF15", numeric-8-box-multiple-outline: "\uE3B9", numeric-8-box-outline: "\uE3BA", numeric-8-circle: "\uECAD", numeric-8-circle-outline: "\uECAE", numeric-9: "\uEB41", numeric-9-box: "\uE3BB", numeric-9-box-multiple: "\uEF16", numeric-9-box-multiple-outline: "\uE3BC", numeric-9-box-outline: "\uE3BD", numeric-9-circle: "\uECAF", numeric-9-circle-outline: "\uECB0", numeric-9-plus: "\uEFED", numeric-9-plus-box: "\uE3BE", numeric-9-plus-box-multiple: "\uEF17", numeric-9-plus-box-multiple-outline: "\uE3BF", numeric-9-plus-box-outline: "\uE3C0", numeric-9-plus-circle: "\uECB1", numeric-9-plus-circle-outline: "\uECB2", numeric-negative-1: "\uF051", numeric-off: "\uF9D2", numeric-positive-1: "\uF5CA", nut: "\uE6F7", nutrition: "\uE3C1", nuxt: "\uF105", oar: "\uE67B", ocarina: "\uEDDF", oci: "\uF2E8", ocr: "\uF139", octagon: "\uE3C2", octagon-outline: "\uE3C3", octagram: "\uE6F8", octagram-outline: "\uE774", octahedron: "\uF94F", octahedron-off: "\uF950", odnoklassniki: "\uE3C4", offer: "\uF21A", office-building: "\uE990", office-building-cog: "\uF948", office-building-cog-outline: "\uF949", office-building-marker: "\uF51F", office-building-marker-outline: "\uF520", office-building-outline: "\uF51E", oil: "\uE3C6", oil-lamp: "\uEF18", oil-level: "\uF052", oil-temperature: "\uEFF7", om: "\uE972", omega: "\uE3C8", one-up: "\uEBAC", onepassword: "\uE880", opacity: "\uE5CB", open-in-app: "\uE3CA", open-in-new: "\uE3CB", open-source-initiative: "\uEBAD", openid: "\uE3CC", opera: "\uE3CD", orbit: "\uE017", orbit-variant: "\uF5DA", order-alphabetical-ascending: "\uE20C", order-alphabetical-descending: "\uED06", order-bool-ascending: "\uE2BD", order-bool-ascending-variant: "\uE98E", order-bool-descending: "\uF383", order-bool-descending-variant: "\uE98F", order-numeric-ascending: "\uE544", order-numeric-descending: "\uE545", origin: "\uEB42", ornament: "\uE3CE", ornament-variant: "\uE3CF", outdoor-lamp: "\uF053", overscan: "\uF004", owl: "\uE3D1", pac-man: "\uEBAE", package: "\uE3D2", package-down: "\uE3D3", package-up: "\uE3D4", package-variant: "\uE3D5", package-variant-closed: "\uE3D6", package-variant-closed-minus: "\uF9D3", package-variant-closed-plus: "\uF9D4", package-variant-closed-remove: "\uF9D5", package-variant-minus: "\uF9D6", package-variant-plus: "\uF9D7", package-variant-remove: "\uF9D8", page-first: "\uE5FF", page-last: "\uE600", page-layout-body: "\uE6F9", page-layout-footer: "\uE6FA", page-layout-header: "\uE6FB", page-layout-header-footer: "\uEF7E", page-layout-sidebar-left: "\uE6FC", page-layout-sidebar-right: "\uE6FD", page-next: "\uEBAF", page-next-outline: "\uEBB0", page-previous: "\uEBB1", page-previous-outline: "\uEBB2", pail: "\uF416", pail-minus: "\uF436", pail-minus-outline: "\uF43B", pail-off: "\uF438", pail-off-outline: "\uF43D", pail-outline: "\uF439", pail-plus: "\uF435", pail-plus-outline: "\uF43A", pail-remove: "\uF437", pail-remove-outline: "\uF43C", palette: "\uE3D7", palette-advanced: "\uE3D8", palette-outline: "\uEE0B", palette-swatch: "\uE8B4", palette-swatch-outline: "\uF35B", palette-swatch-variant: "\uF959", palm-tree: "\uF054", pan: "\uEBB3", pan-bottom-left: "\uEBB4", pan-bottom-right: "\uEBB5", pan-down: "\uEBB6", pan-horizontal: "\uEBB7", pan-left: "\uEBB8", pan-right: "\uEBB9", pan-top-left: "\uEBBA", pan-top-right: "\uEBBB", pan-up: "\uEBBC", pan-vertical: "\uEBBD", panda: "\uE3D9", pandora: "\uE3DA", panorama: "\uE3DB", panorama-fisheye: "\uE3DC", panorama-horizontal: "\uF927", panorama-horizontal-outline: "\uE3DD", panorama-outline: "\uF98B", panorama-sphere: "\uF98C", panorama-sphere-outline: "\uF98D", panorama-variant: "\uF98E", panorama-variant-outline: "\uF98F", panorama-vertical: "\uF928", panorama-vertical-outline: "\uE3DE", panorama-wide-angle: "\uF95E", panorama-wide-angle-outline: "\uE3DF", paper-cut-vertical: "\uE3E0", paper-roll: "\uF156", paper-roll-outline: "\uF157", paperclip: "\uE3E1", paperclip-check: "\uFAC5", paperclip-lock: "\uF9D9", paperclip-minus: "\uFAC6", paperclip-off: "\uFAC7", paperclip-plus: "\uFAC8", paperclip-remove: "\uFAC9", parachute: "\uECB3", parachute-outline: "\uECB4", paragliding: "\uF744", parking: "\uE3E2", party-popper: "\uF055", passport: "\uE7E2", passport-biometric: "\uEDE0", pasta: "\uF15F", patio-heater: "\uEF7F", patreon: "\uE881", pause: "\uE3E3", pause-circle: "\uE3E4", pause-circle-outline: "\uE3E5", pause-octagon: "\uE3E6", pause-octagon-outline: "\uE3E7", paw: "\uE3E8", paw-off: "\uE656", paw-off-outline: "\uF675", paw-outline: "\uF674", peace: "\uE883", peanut: "\uEFFB", peanut-off: "\uEFFC", peanut-off-outline: "\uEFFE", peanut-outline: "\uEFFD", pen: "\uE3E9", pen-lock: "\uEDE1", pen-minus: "\uEDE2", pen-off: "\uEDE3", pen-plus: "\uEDE4", pen-remove: "\uEDE5", pencil: "\uE3EA", pencil-box: "\uE3EB", pencil-box-multiple: "\uF143", pencil-box-multiple-outline: "\uF144", pencil-box-outline: "\uE3EC", pencil-circle: "\uE6FE", pencil-circle-outline: "\uE775", pencil-lock: "\uE3ED", pencil-lock-outline: "\uEDE6", pencil-minus: "\uEDE7", pencil-minus-outline: "\uEDE8", pencil-off: "\uE3EE", pencil-off-outline: "\uEDE9", pencil-outline: "\uECB5", pencil-plus: "\uEDEA", pencil-plus-outline: "\uEDEB", pencil-remove: "\uEDEC", pencil-remove-outline: "\uEDED", pencil-ruler: "\uF352", penguin: "\uEEBF", pentagon: "\uE700", pentagon-outline: "\uE6FF", pentagram: "\uF666", percent: "\uE3EF", percent-box: "\uFA01", percent-box-outline: "\uFA02", percent-circle: "\uFA03", percent-circle-outline: "\uFA04", percent-outline: "\uF277", periodic-table: "\uE8B5", perspective-less: "\uED22", perspective-more: "\uED23", ph: "\uF7C4", phone: "\uE3F1", phone-alert: "\uEF19", phone-alert-outline: "\uF18D", phone-bluetooth: "\uE3F2", phone-bluetooth-outline: "\uF18E", phone-cancel: "\uF0BB", phone-cancel-outline: "\uF18F", phone-check: "\uF1A8", phone-check-outline: "\uF1A9", phone-classic: "\uE601", phone-classic-off: "\uF278", phone-clock: "\uF9DA", phone-dial: "\uF558", phone-dial-outline: "\uF559", phone-forward: "\uE3F3", phone-forward-outline: "\uF190", phone-hangup: "\uE3F4", phone-hangup-outline: "\uF191", phone-in-talk: "\uE3F5", phone-in-talk-outline: "\uF181", phone-incoming: "\uE3F6", phone-incoming-outline: "\uF192", phone-lock: "\uE3F7", phone-lock-outline: "\uF193", phone-log: "\uE3F8", phone-log-outline: "\uF194", phone-message: "\uF195", phone-message-outline: "\uF196", phone-minus: "\uE657", phone-minus-outline: "\uF197", phone-missed: "\uE3F9", phone-missed-outline: "\uF1A4", phone-off: "\uEDEE", phone-off-outline: "\uF1A5", phone-outgoing: "\uE3FA", phone-outgoing-outline: "\uF198", phone-outline: "\uEDEF", phone-paused: "\uE3FB", phone-paused-outline: "\uF199", phone-plus: "\uE658", phone-plus-outline: "\uF19A", phone-refresh: "\uF992", phone-refresh-outline: "\uF993", phone-remove: "\uF52E", phone-remove-outline: "\uF52F", phone-return: "\uE82E", phone-return-outline: "\uF19B", phone-ring: "\uF1AA", phone-ring-outline: "\uF1AB", phone-rotate-landscape: "\uE884", phone-rotate-portrait: "\uE885", phone-settings: "\uE3FC", phone-settings-outline: "\uF19C", phone-sync: "\uF994", phone-sync-outline: "\uF995", phone-voip: "\uE3FD", pi: "\uE3FE", pi-box: "\uE3FF", pi-hole: "\uEDF0", piano: "\uE67C", piano-off: "\uE697", pickaxe: "\uE8B6", picture-in-picture-bottom-right: "\uEE56", picture-in-picture-bottom-right-outline: "\uEE57", picture-in-picture-top-right: "\uEE58", picture-in-picture-top-right-outline: "\uEE59", pier: "\uE886", pier-crane: "\uE887", pig: "\uE400", pig-variant: "\uF005", pig-variant-outline: "\uF677", piggy-bank: "\uF006", piggy-bank-outline: "\uF678", pill: "\uE401", pill-off: "\uFA5B", pillar: "\uE701", pin: "\uE402", pin-off: "\uE403", pin-off-outline: "\uE92F", pin-outline: "\uE930", pine-tree: "\uE404", pine-tree-box: "\uE405", pine-tree-fire: "\uF419", pinterest: "\uE406", pinwheel: "\uEAD4", pinwheel-outline: "\uEAD5", pipe: "\uE7E4", pipe-disconnected: "\uE7E5", pipe-leak: "\uE888", pipe-valve: "\uF84C", pipe-wrench: "\uF353", pirate: "\uEA07", pistol: "\uE702", piston: "\uE889", pitchfork: "\uF552", pizza: "\uE408", play: "\uE409", play-box: "\uF279", play-box-lock: "\uFA15", play-box-lock-open: "\uFA16", play-box-lock-open-outline: "\uFA17", play-box-lock-outline: "\uFA18", play-box-multiple: "\uED18", play-box-multiple-outline: "\uF3E5", play-box-outline: "\uE40A", play-circle: "\uE40B", play-circle-outline: "\uE40C", play-network: "\uE88A", play-network-outline: "\uECB6", play-outline: "\uEF1A", play-pause: "\uE40D", play-protected-content: "\uE40E", play-speed: "\uE8FE", playlist-check: "\uE5C6", playlist-edit: "\uE8FF", playlist-minus: "\uE40F", playlist-music: "\uECB7", playlist-music-outline: "\uECB8", playlist-play: "\uE410", playlist-plus: "\uE411", playlist-remove: "\uE412", playlist-star: "\uEDF1", plex: "\uE6B9", pliers: "\uF9A3", plus: "\uE414", plus-box: "\uE415", plus-box-multiple: "\uE333", plus-box-multiple-outline: "\uF142", plus-box-outline: "\uE703", plus-circle: "\uE416", plus-circle-multiple: "\uE34B", plus-circle-multiple-outline: "\uE417", plus-circle-outline: "\uE418", plus-lock: "\uFA5C", plus-lock-open: "\uFA5D", plus-minus: "\uE991", plus-minus-box: "\uE992", plus-minus-variant: "\uF4C8", plus-network: "\uE419", plus-network-outline: "\uECB9", plus-outline: "\uE704", plus-thick: "\uF1EB", podcast: "\uE993", podium: "\uED24", podium-bronze: "\uED25", podium-gold: "\uED26", podium-silver: "\uED27", point-of-sale: "\uED91", pokeball: "\uE41C", pokemon-go: "\uEA08", poker-chip: "\uE82F", polaroid: "\uE41D", police-badge: "\uF166", police-badge-outline: "\uF167", police-station: "\uF838", poll: "\uE41E", polo: "\uF4C2", polymer: "\uE420", pool: "\uE605", pool-thermometer: "\uFA5E", popcorn: "\uE421", post: "\uF007", post-lamp: "\uFA5F", post-outline: "\uF008", postage-stamp: "\uECBA", pot: "\uE2E4", pot-mix: "\uE65A", pot-mix-outline: "\uE676", pot-outline: "\uE2FE", pot-steam: "\uE659", pot-steam-outline: "\uE325", pound: "\uE422", pound-box: "\uE423", pound-box-outline: "\uF17E", power: "\uE424", power-cycle: "\uE900", power-off: "\uE901", power-on: "\uE902", power-plug: "\uE6A4", power-plug-off: "\uE6A5", power-plug-off-outline: "\uF423", power-plug-outline: "\uF424", power-settings: "\uE425", power-sleep: "\uE903", power-socket: "\uE426", power-socket-au: "\uE904", power-socket-ch: "\uEFB2", power-socket-de: "\uF106", power-socket-eu: "\uE7E6", power-socket-fr: "\uF107", power-socket-it: "\uF4FE", power-socket-jp: "\uF108", power-socket-uk: "\uE7E7", power-socket-us: "\uE7E8", power-standby: "\uE905", powershell: "\uEA09", prescription: "\uE705", presentation: "\uE427", presentation-play: "\uE428", pretzel: "\uF561", printer: "\uE429", printer-3d: "\uE42A", printer-3d-nozzle: "\uEE5A", printer-3d-nozzle-alert: "\uF1BF", printer-3d-nozzle-alert-outline: "\uF1C0", printer-3d-nozzle-heat: "\uF8B7", printer-3d-nozzle-heat-outline: "\uF8B8", printer-3d-nozzle-outline: "\uEE5B", printer-alert: "\uE42B", printer-check: "\uF145", printer-eye: "\uF457", printer-off: "\uEE5C", printer-off-outline: "\uF784", printer-outline: "\uF785", printer-pos: "\uF056", printer-search: "\uF456", printer-settings: "\uE706", printer-wireless: "\uEA0A", priority-high: "\uE602", priority-low: "\uE603", professional-hexagon: "\uE42C", progress-alert: "\uECBB", progress-check: "\uE994", progress-clock: "\uE995", progress-close: "\uF109", progress-download: "\uE996", progress-pencil: "\uF786", progress-question: "\uF521", progress-star: "\uF787", progress-upload: "\uE997", progress-wrench: "\uECBC", projector: "\uE42D", projector-off: "\uFA22", projector-screen: "\uE42E", projector-screen-off: "\uF80C", projector-screen-off-outline: "\uF80D", projector-screen-outline: "\uF723", projector-screen-variant: "\uF80E", projector-screen-variant-off: "\uF80F", projector-screen-variant-off-outline: "\uF810", projector-screen-variant-outline: "\uF811", propane-tank: "\uF356", propane-tank-outline: "\uF357", protocol: "\uEFD7", publish: "\uE6A6", publish-off: "\uF944", pulse: "\uE42F", pump: "\uF401", pumpkin: "\uEBBE", purse: "\uEF1B", purse-outline: "\uEF1C", puzzle: "\uE430", puzzle-check: "\uF425", puzzle-check-outline: "\uF426", puzzle-edit: "\uF4D2", puzzle-edit-outline: "\uF4D8", puzzle-heart: "\uF4D3", puzzle-heart-outline: "\uF4D9", puzzle-minus: "\uF4D0", puzzle-minus-outline: "\uF4D6", puzzle-outline: "\uEA65", puzzle-plus: "\uF4CF", puzzle-plus-outline: "\uF4D5", puzzle-remove: "\uF4D1", puzzle-remove-outline: "\uF4D7", puzzle-star: "\uF4D4", puzzle-star-outline: "\uF4DA", pyramid: "\uF951", pyramid-off: "\uF952", qi: "\uE998", qqchat: "\uE604", qrcode: "\uE431", qrcode-edit: "\uE8B7", qrcode-minus: "\uF18B", qrcode-plus: "\uF18A", qrcode-remove: "\uF18C", qrcode-scan: "\uE432", quadcopter: "\uE433", quality-high: "\uE434", quality-low: "\uEA0B", quality-medium: "\uEA0C", quora: "\uED28", rabbit: "\uE906", rabbit-variant: "\uFA60", rabbit-variant-outline: "\uFA61", racing-helmet: "\uED92", racquetball: "\uED93", radar: "\uE436", radiator: "\uE437", radiator-disabled: "\uEAD6", radiator-off: "\uEAD7", radio: "\uE438", radio-am: "\uECBD", radio-fm: "\uECBE", radio-handheld: "\uE439", radio-off: "\uF21B", radio-tower: "\uE43A", radioactive: "\uE43B", radioactive-circle: "\uF85C", radioactive-circle-outline: "\uF85D", radioactive-off: "\uEEC0", radiobox-blank: "\uE43C", radiobox-marked: "\uE43D", radiology-box: "\uF4C4", radiology-box-outline: "\uF4C5", radius: "\uECBF", radius-outline: "\uECC0", railroad-light: "\uEF1D", rake: "\uF543", raspberry-pi: "\uE43E", raw: "\uFA0E", raw-off: "\uFA0F", ray-end: "\uE43F", ray-end-arrow: "\uE440", ray-start: "\uE441", ray-start-arrow: "\uE442", ray-start-end: "\uE443", ray-start-vertex-end: "\uF5D7", ray-vertex: "\uE444", razor-double-edge: "\uF996", razor-single-edge: "\uF997", react: "\uE707", read: "\uE446", receipt: "\uE448", receipt-outline: "\uF9DB", receipt-text-check: "\uFA62", receipt-text-check-outline: "\uFA63", receipt-text-minus: "\uFA64", receipt-text-minus-outline: "\uFA65", receipt-text-plus: "\uFA66", receipt-text-plus-outline: "\uFA67", receipt-text-remove: "\uFA68", receipt-text-remove-outline: "\uFA69", record: "\uE449", record-circle: "\uEEC1", record-circle-outline: "\uEEC2", record-player: "\uE999", record-rec: "\uE44A", rectangle: "\uEE5D", rectangle-outline: "\uEE5E", recycle: "\uE44B", recycle-variant: "\uF39C", reddit: "\uE44C", redhat: "\uF11A", redo: "\uE44D", redo-variant: "\uE44E", reflect-horizontal: "\uEA0D", reflect-vertical: "\uEA0E", refresh: "\uE44F", refresh-auto: "\uF8F1", refresh-circle: "\uF376", regex: "\uE450", registered-trademark: "\uEA66", reiterate: "\uF587", relation-many-to-many: "\uF495", relation-many-to-one: "\uF496", relation-many-to-one-or-many: "\uF497", relation-many-to-only-one: "\uF498", relation-many-to-zero-or-many: "\uF499", relation-many-to-zero-or-one: "\uF49A", relation-one-or-many-to-many: "\uF49B", relation-one-or-many-to-one: "\uF49C", relation-one-or-many-to-one-or-many: "\uF49D", relation-one-or-many-to-only-one: "\uF49E", relation-one-or-many-to-zero-or-many: "\uF49F", relation-one-or-many-to-zero-or-one: "\uF4A0", relation-one-to-many: "\uF4A1", relation-one-to-one: "\uF4A2", relation-one-to-one-or-many: "\uF4A3", relation-one-to-only-one: "\uF4A4", relation-one-to-zero-or-many: "\uF4A5", relation-one-to-zero-or-one: "\uF4A6", relation-only-one-to-many: "\uF4A7", relation-only-one-to-one: "\uF4A8", relation-only-one-to-one-or-many: "\uF4A9", relation-only-one-to-only-one: "\uF4AA", relation-only-one-to-zero-or-many: "\uF4AB", relation-only-one-to-zero-or-one: "\uF4AC", relation-zero-or-many-to-many: "\uF4AD", relation-zero-or-many-to-one: "\uF4AE", relation-zero-or-many-to-one-or-many: "\uF4AF", relation-zero-or-many-to-only-one: "\uF4B0", relation-zero-or-many-to-zero-or-many: "\uF4B1", relation-zero-or-many-to-zero-or-one: "\uF4B2", relation-zero-or-one-to-many: "\uF4B3", relation-zero-or-one-to-one: "\uF4B4", relation-zero-or-one-to-one-or-many: "\uF4B5", relation-zero-or-one-to-only-one: "\uF4B6", relation-zero-or-one-to-zero-or-many: "\uF4B7", relation-zero-or-one-to-zero-or-one: "\uF4B8", relative-scale: "\uE451", reload: "\uE452", reload-alert: "\uF10A", reminder: "\uE88B", remote: "\uE453", remote-desktop: "\uE8B8", remote-off: "\uEEC3", remote-tv: "\uEEC4", remote-tv-off: "\uEEC5", rename-box: "\uE454", reorder-horizontal: "\uE687", reorder-vertical: "\uE688", repeat: "\uE455", repeat-off: "\uE456", repeat-once: "\uE457", repeat-variant: "\uE546", replay: "\uE458", reply: "\uE459", reply-all: "\uE45A", reply-all-outline: "\uEF1E", reply-circle: "\uF1AD", reply-outline: "\uEF1F", reproduction: "\uE45B", resistor: "\uEB43", resistor-nodes: "\uEB44", resize: "\uEA67", resize-bottom-right: "\uE45C", responsive: "\uE45D", restart: "\uE708", restart-alert: "\uF10B", restart-off: "\uED94", restore: "\uE99A", restore-alert: "\uF10C", rewind: "\uE45E", rewind-10: "\uED29", rewind-15: "\uF945", rewind-30: "\uED95", rewind-5: "\uF1F8", rewind-60: "\uF60B", rewind-outline: "\uE709", rhombus: "\uE70A", rhombus-medium: "\uEA0F", rhombus-medium-outline: "\uF4DB", rhombus-outline: "\uE70B", rhombus-split: "\uEA10", rhombus-split-outline: "\uF4DC", ribbon: "\uE45F", rice: "\uE7E9", rickshaw: "\uF5BA", rickshaw-electric: "\uF5BB", ring: "\uE7EA", rivet: "\uEE5F", road: "\uE460", road-variant: "\uE461", robber: "\uF057", robot: "\uE6A8", robot-angry: "\uF69C", robot-angry-outline: "\uF69D", robot-confused: "\uF69E", robot-confused-outline: "\uF69F", robot-dead: "\uF6A0", robot-dead-outline: "\uF6A1", robot-excited: "\uF6A2", robot-excited-outline: "\uF6A3", robot-happy: "\uF718", robot-happy-outline: "\uF719", robot-industrial: "\uEB45", robot-industrial-outline: "\uFA19", robot-love: "\uF6A4", robot-love-outline: "\uF6A5", robot-mower: "\uF1F6", robot-mower-outline: "\uF1F2", robot-off: "\uF6A6", robot-off-outline: "\uF67A", robot-outline: "\uF679", robot-vacuum: "\uE70C", robot-vacuum-variant: "\uE907", rocket: "\uE462", rocket-launch: "\uF4DD", rocket-launch-outline: "\uF4DE", rocket-outline: "\uF3AE", rodent: "\uF326", roller-shade: "\uFA6A", roller-shade-closed: "\uFA6B", roller-skate: "\uED2A", roller-skate-off: "\uE144", rollerblade: "\uED2B", rollerblade-off: "\uE02D", rollupjs: "\uEBBF", rolodex: "\uFAB8", rolodex-outline: "\uFAB9", roman-numeral-1: "\uF087", roman-numeral-10: "\uF090", roman-numeral-2: "\uF088", roman-numeral-3: "\uF089", roman-numeral-4: "\uF08A", roman-numeral-5: "\uF08B", roman-numeral-6: "\uF08C", roman-numeral-7: "\uF08D", roman-numeral-8: "\uF08E", roman-numeral-9: "\uF08F", room-service: "\uE88C", room-service-outline: "\uED96", rotate-360: "\uF998", rotate-3d: "\uEEC6", rotate-3d-variant: "\uE463", rotate-left: "\uE464", rotate-left-variant: "\uE465", rotate-orbit: "\uED97", rotate-right: "\uE466", rotate-right-variant: "\uE467", rounded-corner: "\uE606", router: "\uF1E1", router-network: "\uF086", router-wireless: "\uE468", router-wireless-off: "\uF5A2", router-wireless-settings: "\uEA68", routes: "\uE469", routes-clock: "\uF058", rowing: "\uE607", rss: "\uE46A", rss-box: "\uE46B", rss-off: "\uEF20", rug: "\uF474", rugby: "\uED98", ruler: "\uE46C", ruler-square: "\uECC1", ruler-square-compass: "\uEEBD", run: "\uE70D", run-fast: "\uE46D", rv-truck: "\uF1D3", sack: "\uED2D", sack-percent: "\uED2E", safe: "\uEA69", safe-square: "\uF27B", safe-square-outline: "\uF27C", safety-goggles: "\uED2F", sail-boat: "\uEEC7", sail-boat-sink: "\uFAEE", sale: "\uE46E", sale-outline: "\uFA05", salesforce: "\uE88D", sass: "\uE7EB", satellite: "\uE46F", satellite-uplink: "\uE908", satellite-variant: "\uE470", sausage: "\uE8B9", sausage-off: "\uF788", saw-blade: "\uEE60", sawtooth-wave: "\uF479", saxophone: "\uE608", scale: "\uE471", scale-balance: "\uE5D0", scale-bathroom: "\uE472", scale-off: "\uF059", scale-unbalanced: "\uF9B7", scan-helper: "\uF3D7", scanner: "\uE6AA", scanner-off: "\uE909", scatter-plot: "\uEEC8", scatter-plot-outline: "\uEEC9", scent: "\uF957", scent-off: "\uF958", school: "\uE473", school-outline: "\uF17F", scissors-cutting: "\uEA6A", scooter: "\uF5BC", scooter-electric: "\uF5BD", scoreboard: "\uF27D", scoreboard-outline: "\uF27E", screen-rotation: "\uE474", screen-rotation-lock: "\uE477", screw-flat-top: "\uEDF2", screw-lag: "\uEDF3", screw-machine-flat-top: "\uEDF4", screw-machine-round-top: "\uEDF5", screw-round-top: "\uEDF6", screwdriver: "\uE475", script: "\uEBC0", script-outline: "\uE476", script-text: "\uEBC1", script-text-key: "\uF724", script-text-key-outline: "\uF725", script-text-outline: "\uEBC2", script-text-play: "\uF726", script-text-play-outline: "\uF727", sd: "\uE478", seal: "\uE479", seal-variant: "\uEFD8", search-web: "\uE70E", seat: "\uECC2", seat-flat: "\uE47A", seat-flat-angled: "\uE47B", seat-individual-suite: "\uE47C", seat-legroom-extra: "\uE47D", seat-legroom-normal: "\uE47E", seat-legroom-reduced: "\uE47F", seat-outline: "\uECC3", seat-passenger: "\uF248", seat-recline-extra: "\uE480", seat-recline-normal: "\uE481", seatbelt: "\uECC4", security: "\uE482", security-network: "\uE483", seed: "\uEE61", seed-off: "\uF3FC", seed-off-outline: "\uF3FD", seed-outline: "\uEE62", seed-plus: "\uFA6C", seed-plus-outline: "\uFA6D", seesaw: "\uF5A3", segment: "\uEECA", select: "\uE484", select-all: "\uE485", select-color: "\uED30", select-compare: "\uEAD8", select-drag: "\uEA6B", select-group: "\uEF81", select-inverse: "\uE486", select-marker: "\uF27F", select-multiple: "\uF280", select-multiple-marker: "\uF281", select-off: "\uE487", select-place: "\uEFD9", select-remove: "\uF7C0", select-search: "\uF203", selection: "\uE488", selection-drag: "\uEA6C", selection-ellipse: "\uED31", selection-ellipse-arrow-inside: "\uEF21", selection-ellipse-remove: "\uF7C1", selection-marker: "\uF282", selection-multiple: "\uF284", selection-multiple-marker: "\uF283", selection-off: "\uE776", selection-remove: "\uF7C2", selection-search: "\uF204", semantic-web: "\uF315", send: "\uE489", send-check: "\uF160", send-check-outline: "\uF161", send-circle: "\uEDF7", send-circle-outline: "\uEDF8", send-clock: "\uF162", send-clock-outline: "\uF163", send-lock: "\uE7EC", send-lock-outline: "\uF165", send-outline: "\uF164", serial-port: "\uE65B", server: "\uE48A", server-minus: "\uE48B", server-network: "\uE48C", server-network-off: "\uE48D", server-off: "\uE48E", server-plus: "\uE48F", server-remove: "\uE490", server-security: "\uE491", set-all: "\uE777", set-center: "\uE778", set-center-right: "\uE779", set-left: "\uE77A", set-left-center: "\uE77B", set-left-right: "\uE77C", set-merge: "\uF4DF", set-none: "\uE77D", set-right: "\uE77E", set-split: "\uF4E0", set-square: "\uF45C", set-top-box: "\uE99E", settings-helper: "\uEA6D", shaker: "\uF10D", shaker-outline: "\uF10E", shape: "\uE830", shape-circle-plus: "\uE65C", shape-outline: "\uE831", shape-oval-plus: "\uF1F9", shape-plus: "\uE494", shape-polygon-plus: "\uE65D", shape-rectangle-plus: "\uE65E", shape-square-plus: "\uE65F", shape-square-rounded-plus: "\uF4F9", share: "\uE495", share-all: "\uF1F3", share-all-outline: "\uF1F4", share-circle: "\uF1AC", share-off: "\uEF22", share-off-outline: "\uEF23", share-outline: "\uE931", share-variant: "\uE496", share-variant-outline: "\uF513", shark: "\uF8B9", shark-fin: "\uF672", shark-fin-outline: "\uF673", shark-off: "\uF8BA", sheep: "\uECC5", shield: "\uE497", shield-account: "\uE88E", shield-account-outline: "\uEA11", shield-account-variant: "\uF5A6", shield-account-variant-outline: "\uF5A7", shield-airplane: "\uE6BA", shield-airplane-outline: "\uECC6", shield-alert: "\uEECB", shield-alert-outline: "\uEECC", shield-bug: "\uF3D9", shield-bug-outline: "\uF3DA", shield-car: "\uEF82", shield-check: "\uE564", shield-check-outline: "\uECC7", shield-cross: "\uECC8", shield-cross-outline: "\uECC9", shield-crown: "\uF8BB", shield-crown-outline: "\uF8BC", shield-edit: "\uF19F", shield-edit-outline: "\uF1A0", shield-half: "\uF35F", shield-half-full: "\uE77F", shield-home: "\uE689", shield-home-outline: "\uECCA", shield-key: "\uEBC3", shield-key-outline: "\uEBC4", shield-link-variant: "\uED32", shield-link-variant-outline: "\uED33", shield-lock: "\uE99C", shield-lock-open: "\uF999", shield-lock-open-outline: "\uF99A", shield-lock-outline: "\uECCB", shield-moon: "\uF827", shield-moon-outline: "\uF828", shield-off: "\uE99D", shield-off-outline: "\uE99B", shield-outline: "\uE498", shield-plus: "\uEAD9", shield-plus-outline: "\uEADA", shield-refresh: "\uE0A9", shield-refresh-outline: "\uE1DF", shield-remove: "\uEADB", shield-remove-outline: "\uEADC", shield-search: "\uED99", shield-star: "\uF13A", shield-star-outline: "\uF13B", shield-sun: "\uF05C", shield-sun-outline: "\uF05D", shield-sword: "\uF8BD", shield-sword-outline: "\uF8BE", shield-sync: "\uF1A1", shield-sync-outline: "\uF1A2", shimmer: "\uF544", ship-wheel: "\uE832", shipping-pallet: "\uF84D", shoe-ballet: "\uF5C9", shoe-cleat: "\uF5C6", shoe-formal: "\uEB46", shoe-heel: "\uEB47", shoe-print: "\uEDF9", shoe-sneaker: "\uF5C7", shopping: "\uE499", shopping-music: "\uE49A", shopping-outline: "\uF1D4", shopping-search: "\uEF83", shopping-search-outline: "\uFA6E", shore: "\uF4F8", shovel: "\uE70F", shovel-off: "\uE710", shower: "\uE99F", shower-head: "\uE9A0", shredder: "\uE49B", shuffle: "\uE49C", shuffle-disabled: "\uE49D", shuffle-variant: "\uE49E", shuriken: "\uF37E", sickle: "\uF8BF", sigma: "\uE49F", sigma-lower: "\uE62A", sign-caution: "\uE4A0", sign-direction: "\uE780", sign-direction-minus: "\uEFFF", sign-direction-plus: "\uEFDB", sign-direction-remove: "\uEFDC", sign-pole: "\uF4F7", sign-real-estate: "\uF117", sign-text: "\uE781", signal: "\uE4A1", signal-2g: "\uE711", signal-3g: "\uE712", signal-4g: "\uE713", signal-5g: "\uEA6E", signal-cellular-1: "\uE8BB", signal-cellular-2: "\uE8BC", signal-cellular-3: "\uE8BD", signal-cellular-outline: "\uE8BE", signal-distance-variant: "\uEE63", signal-hspa: "\uE714", signal-hspa-plus: "\uE715", signal-off: "\uE782", signal-variant: "\uE609", signature: "\uEDFA", signature-freehand: "\uEDFB", signature-image: "\uEDFC", signature-text: "\uEDFD", silo: "\uEB48", silverware: "\uE4A2", silverware-clean: "\uEFDD", silverware-fork: "\uE4A3", silverware-fork-knife: "\uEA6F", silverware-spoon: "\uE4A4", silverware-variant: "\uE4A5", sim: "\uE4A6", sim-alert: "\uE4A7", sim-alert-outline: "\uF5D2", sim-off: "\uE4A8", sim-off-outline: "\uF5D3", sim-outline: "\uF5D4", simple-icons: "\uF31C", sina-weibo: "\uEADE", sine-wave: "\uE95A", sitemap: "\uE4A9", sitemap-outline: "\uF99B", size-l: "\uF3A5", size-m: "\uF3A4", size-s: "\uF3A3", size-xl: "\uF3A6", size-xs: "\uF3A2", size-xxl: "\uF3A7", size-xxs: "\uF3A1", size-xxxl: "\uF3A8", skate: "\uED34", skate-off: "\uE698", skateboard: "\uF4C1", skateboarding: "\uE500", skew-less: "\uED35", skew-more: "\uED36", ski: "\uF303", ski-cross-country: "\uF304", ski-water: "\uF305", skip-backward: "\uE4AA", skip-backward-outline: "\uEF24", skip-forward: "\uE4AB", skip-forward-outline: "\uEF25", skip-next: "\uE4AC", skip-next-circle: "\uE660", skip-next-circle-outline: "\uE661", skip-next-outline: "\uEF26", skip-previous: "\uE4AD", skip-previous-circle: "\uE662", skip-previous-circle-outline: "\uE663", skip-previous-outline: "\uEF27", skull: "\uE68B", skull-crossbones: "\uEBC5", skull-crossbones-outline: "\uEBC6", skull-outline: "\uEBC7", skull-scan: "\uF4C6", skull-scan-outline: "\uF4C7", skype: "\uE4AE", skype-business: "\uE4AF", slack: "\uE4B0", slash-forward: "\uEFDE", slash-forward-box: "\uEFDF", sledding: "\uE41A", sleep: "\uE4B1", sleep-off: "\uE4B2", slide: "\uF5A4", slope-downhill: "\uEDFE", slope-uphill: "\uEDFF", slot-machine: "\uF113", slot-machine-outline: "\uF114", smart-card: "\uF0BC", smart-card-off: "\uF8F6", smart-card-off-outline: "\uF8F7", smart-card-outline: "\uF0BD", smart-card-reader: "\uF0BE", smart-card-reader-outline: "\uF0BF", smog: "\uEA70", smoke: "\uF798", smoke-detector: "\uE391", smoke-detector-alert: "\uF92D", smoke-detector-alert-outline: "\uF92E", smoke-detector-off: "\uF808", smoke-detector-off-outline: "\uF809", smoke-detector-outline: "\uF807", smoke-detector-variant: "\uF80A", smoke-detector-variant-alert: "\uF92F", smoke-detector-variant-off: "\uF80B", smoking: "\uE4B3", smoking-off: "\uE4B4", smoking-pipe: "\uF40C", smoking-pipe-off: "\uF427", snail: "\uF676", snake: "\uF50D", snapchat: "\uE4B5", snowboard: "\uF306", snowflake: "\uE716", snowflake-alert: "\uEF28", snowflake-check: "\uFA6F", snowflake-melt: "\uF2CA", snowflake-off: "\uF4E2", snowflake-thermometer: "\uFA70", snowflake-variant: "\uEF29", snowman: "\uE4B6", snowmobile: "\uE6DC", snowshoeing: "\uFA71", soccer: "\uE4B7", soccer-field: "\uE833", social-distance-2-meters: "\uF578", social-distance-6-feet: "\uF579", sofa: "\uE4B8", sofa-outline: "\uF56C", sofa-single: "\uF56D", sofa-single-outline: "\uF56E", solar-panel: "\uED9A", solar-panel-large: "\uED9B", solar-power: "\uEA71", solar-power-variant: "\uFA72", solar-power-variant-outline: "\uFA73", soldering-iron: "\uF091", solid: "\uE68C", sony-playstation: "\uE413", sort: "\uE4B9", sort-alphabetical-ascending: "\uE5BC", sort-alphabetical-ascending-variant: "\uF147", sort-alphabetical-descending: "\uE5BE", sort-alphabetical-descending-variant: "\uF148", sort-alphabetical-variant: "\uE4BA", sort-ascending: "\uE4BB", sort-bool-ascending: "\uF384", sort-bool-ascending-variant: "\uF385", sort-bool-descending: "\uF386", sort-bool-descending-variant: "\uF387", sort-calendar-ascending: "\uF546", sort-calendar-descending: "\uF547", sort-clock-ascending: "\uF548", sort-clock-ascending-outline: "\uF549", sort-clock-descending: "\uF54A", sort-clock-descending-outline: "\uF54B", sort-descending: "\uE4BC", sort-numeric-ascending: "\uF388", sort-numeric-ascending-variant: "\uE90C", sort-numeric-descending: "\uF389", sort-numeric-descending-variant: "\uEAD1", sort-numeric-variant: "\uE4BD", sort-reverse-variant: "\uE33B", sort-variant: "\uE4BE", sort-variant-lock: "\uECCC", sort-variant-lock-open: "\uECCD", sort-variant-off: "\uFABA", sort-variant-remove: "\uF146", soundbar: "\uF7DA", soundcloud: "\uE4BF", source-branch: "\uE62B", source-branch-check: "\uF4CE", source-branch-minus: "\uF4CA", source-branch-plus: "\uF4C9", source-branch-refresh: "\uF4CC", source-branch-remove: "\uF4CB", source-branch-sync: "\uF4CD", source-commit: "\uE717", source-commit-end: "\uE718", source-commit-end-local: "\uE719", source-commit-local: "\uE71A", source-commit-next-local: "\uE71B", source-commit-start: "\uE71C", source-commit-start-next-local: "\uE71D", source-fork: "\uE4C0", source-merge: "\uE62C", source-pull: "\uE4C1", source-repository: "\uECCE", source-repository-multiple: "\uECCF", soy-sauce: "\uE7ED", soy-sauce-off: "\uF3FB", spa: "\uECD0", spa-outline: "\uECD1", space-invaders: "\uEBC8", space-station: "\uF382", spade: "\uEE64", speaker: "\uE4C2", speaker-bluetooth: "\uE9A1", speaker-multiple: "\uED37", speaker-off: "\uE4C3", speaker-wireless: "\uE71E", spear: "\uF844", speedometer: "\uE4C4", speedometer-medium: "\uEF84", speedometer-slow: "\uEF85", spellcheck: "\uE4C5", sphere: "\uF953", sphere-off: "\uF954", spider: "\uF1E9", spider-thread: "\uF1EA", spider-web: "\uEBC9", spirit-level: "\uF4F0", spoon-sugar: "\uF428", spotify: "\uE4C6", spotlight: "\uE4C7", spotlight-beam: "\uE4C8", spray: "\uE664", spray-bottle: "\uEADF", sprinkler: "\uF05E", sprinkler-fire: "\uF99C", sprinkler-variant: "\uF05F", sprout: "\uEE65", sprout-outline: "\uEE66", square: "\uE763", square-circle: "\uF4FF", square-edit-outline: "\uE90B", square-medium: "\uEA12", square-medium-outline: "\uEA13", square-off: "\uF2ED", square-off-outline: "\uF2EE", square-opacity: "\uF853", square-outline: "\uE762", square-root: "\uE783", square-root-box: "\uE9A2", square-rounded: "\uF4FA", square-rounded-badge: "\uFA06", square-rounded-badge-outline: "\uFA07", square-rounded-outline: "\uF4FB", square-small: "\uEA14", square-wave: "\uF47A", squeegee: "\uEAE0", ssh: "\uE8BF", stack-exchange: "\uE60A", stack-overflow: "\uE4CB", stackpath: "\uE358", stadium: "\uEFF8", stadium-variant: "\uE71F", stairs: "\uE4CC", stairs-box: "\uF39D", stairs-down: "\uF2BD", stairs-up: "\uF2BC", stamper: "\uED38", standard-definition: "\uE7EE", star: "\uE4CD", star-box: "\uEA72", star-box-multiple: "\uF285", star-box-multiple-outline: "\uF286", star-box-outline: "\uEA73", star-check: "\uF565", star-check-outline: "\uF569", star-circle: "\uE4CE", star-circle-outline: "\uE9A3", star-cog: "\uF667", star-cog-outline: "\uF668", star-crescent: "\uE978", star-david: "\uE979", star-face: "\uE9A4", star-four-points: "\uEAE1", star-four-points-outline: "\uEAE2", star-half: "\uE245", star-half-full: "\uE4CF", star-minus: "\uF563", star-minus-outline: "\uF567", star-off: "\uE4D0", star-off-outline: "\uF55A", star-outline: "\uE4D1", star-plus: "\uF562", star-plus-outline: "\uF566", star-remove: "\uF564", star-remove-outline: "\uF568", star-settings: "\uF669", star-settings-outline: "\uF66A", star-shooting: "\uF740", star-shooting-outline: "\uF741", star-three-points: "\uEAE3", star-three-points-outline: "\uEAE4", state-machine: "\uF1EE", steam: "\uE4D2", steering: "\uE4D3", steering-off: "\uE90D", step-backward: "\uE4D4", step-backward-2: "\uE4D5", step-forward: "\uE4D6", step-forward-2: "\uE4D7", stethoscope: "\uE4D8", sticker: "\uF363", sticker-alert: "\uF364", sticker-alert-outline: "\uF365", sticker-check: "\uF366", sticker-check-outline: "\uF367", sticker-circle-outline: "\uE5CF", sticker-emoji: "\uE784", sticker-minus: "\uF368", sticker-minus-outline: "\uF369", sticker-outline: "\uF36A", sticker-plus: "\uF36B", sticker-plus-outline: "\uF36C", sticker-remove: "\uF36D", sticker-remove-outline: "\uF36E", sticker-text: "\uF78D", sticker-text-outline: "\uF78E", stocking: "\uE4D9", stomach: "\uF092", stool: "\uF95C", stool-outline: "\uF95D", stop: "\uE4DA", stop-circle: "\uE665", stop-circle-outline: "\uE666", storage-tank: "\uFA74", storage-tank-outline: "\uFA75", store: "\uE4DB", store-24-hour: "\uE4DC", store-alert: "\uF8C0", store-alert-outline: "\uF8C1", store-check: "\uF8C2", store-check-outline: "\uF8C3", store-clock: "\uF8C4", store-clock-outline: "\uF8C5", store-cog: "\uF8C6", store-cog-outline: "\uF8C7", store-edit: "\uF8C8", store-edit-outline: "\uF8C9", store-marker: "\uF8CA", store-marker-outline: "\uF8CB", store-minus: "\uF65D", store-minus-outline: "\uF8CC", store-off: "\uF8CD", store-off-outline: "\uF8CE", store-outline: "\uF360", store-plus: "\uF65E", store-plus-outline: "\uF8CF", store-remove: "\uF65F", store-remove-outline: "\uF8D0", store-search: "\uF8D1", store-search-outline: "\uF8D2", store-settings: "\uF8D3", store-settings-outline: "\uF8D4", storefront: "\uE7C6", storefront-outline: "\uF0C0", stove: "\uE4DD", strategy: "\uF1D5", stretch-to-page: "\uEF2A", stretch-to-page-outline: "\uEF2B", string-lights: "\uF2B9", string-lights-off: "\uF2BA", subdirectory-arrow-left: "\uE60B", subdirectory-arrow-right: "\uE60C", submarine: "\uF56B", subtitles: "\uEA15", subtitles-outline: "\uEA16", subway: "\uE6AB", subway-alert-variant: "\uED9C", subway-variant: "\uE4DE", summit: "\uE785", sun-clock: "\uFA76", sun-clock-outline: "\uFA77", sun-compass: "\uF9A4", sun-snowflake: "\uF795", sun-snowflake-variant: "\uFA78", sun-thermometer: "\uF8D5", sun-thermometer-outline: "\uF8D6", sun-wireless: "\uF7FD", sun-wireless-outline: "\uF7FE", sunglasses: "\uE4DF", surfing: "\uF745", surround-sound: "\uE5C4", surround-sound-2-0: "\uE7EF", surround-sound-2-1: "\uF728", surround-sound-3-1: "\uE7F0", surround-sound-5-1: "\uE7F1", surround-sound-5-1-2: "\uF729", surround-sound-7-1: "\uE7F2", svg: "\uE720", swap-horizontal: "\uE4E0", swap-horizontal-bold: "\uEBCC", swap-horizontal-circle: "\uEFE0", swap-horizontal-circle-outline: "\uEFE1", swap-horizontal-variant: "\uE8C0", swap-vertical: "\uE4E1", swap-vertical-bold: "\uEBCD", swap-vertical-circle: "\uEFE2", swap-vertical-circle-outline: "\uEFE3", swap-vertical-variant: "\uE8C1", swim: "\uE4E2", switch: "\uE4E3", sword: "\uE4E4", sword-cross: "\uE786", syllabary-hangul: "\uF332", syllabary-hiragana: "\uF333", syllabary-katakana: "\uF334", syllabary-katakana-halfwidth: "\uF335", symbol: "\uF500", symfony: "\uEAE5", sync: "\uE4E5", sync-alert: "\uE4E6", sync-circle: "\uF377", sync-off: "\uE4E7", tab: "\uE4E8", tab-minus: "\uEB4A", tab-plus: "\uE75B", tab-remove: "\uEB4B", tab-search: "\uF99D", tab-unselected: "\uE4E9", table: "\uE4EA", table-account: "\uF3B8", table-alert: "\uF3B9", table-arrow-down: "\uF3BA", table-arrow-left: "\uF3BB", table-arrow-right: "\uF3BC", table-arrow-up: "\uF3BD", table-border: "\uEA17", table-cancel: "\uF3BE", table-chair: "\uF060", table-check: "\uF3BF", table-clock: "\uF3C0", table-cog: "\uF3C1", table-column: "\uE834", table-column-plus-after: "\uE4EB", table-column-plus-before: "\uE4EC", table-column-remove: "\uE4ED", table-column-width: "\uE4EE", table-edit: "\uE4EF", table-eye: "\uF093", table-eye-off: "\uF3C2", table-furniture: "\uE5BB", table-headers-eye: "\uF21C", table-headers-eye-off: "\uF21D", table-heart: "\uF3C3", table-key: "\uF3C4", table-large: "\uE4F0", table-large-plus: "\uEF86", table-large-remove: "\uEF87", table-lock: "\uF3C5", table-merge-cells: "\uE9A5", table-minus: "\uF3C6", table-multiple: "\uF3C7", table-network: "\uF3C8", table-of-contents: "\uE835", table-off: "\uF3C9", table-picnic: "\uF742", table-pivot: "\uF83B", table-plus: "\uEA74", table-refresh: "\uF39F", table-remove: "\uEA75", table-row: "\uE836", table-row-height: "\uE4F1", table-row-plus-after: "\uE4F2", table-row-plus-before: "\uE4F3", table-row-remove: "\uE4F4", table-search: "\uE90E", table-settings: "\uE837", table-split-cell: "\uF429", table-star: "\uF3CA", table-sync: "\uF3A0", table-tennis: "\uEE67", tablet: "\uE4F5", tablet-android: "\uE4F6", tablet-cellphone: "\uE9A6", tablet-dashboard: "\uEECD", taco: "\uE761", tag: "\uE4F8", tag-arrow-down: "\uF72A", tag-arrow-down-outline: "\uF72B", tag-arrow-left: "\uF72C", tag-arrow-left-outline: "\uF72D", tag-arrow-right: "\uF72E", tag-arrow-right-outline: "\uF72F", tag-arrow-up: "\uF730", tag-arrow-up-outline: "\uF731", tag-check: "\uFA79", tag-check-outline: "\uFA7A", tag-faces: "\uE4F9", tag-heart: "\uE68A", tag-heart-outline: "\uEBCE", tag-minus: "\uE90F", tag-minus-outline: "\uF21E", tag-multiple: "\uE4FA", tag-multiple-outline: "\uF2F6", tag-off: "\uF21F", tag-off-outline: "\uF220", tag-outline: "\uE4FB", tag-plus: "\uE721", tag-plus-outline: "\uF221", tag-remove: "\uE722", tag-remove-outline: "\uF222", tag-search: "\uF906", tag-search-outline: "\uF907", tag-text: "\uF223", tag-text-outline: "\uE4FC", tailwind: "\uF3FE", tally-mark-1: "\uFABB", tally-mark-2: "\uFABC", tally-mark-3: "\uFABD", tally-mark-4: "\uFABE", tally-mark-5: "\uFABF", tangram: "\uE4F7", tank: "\uED39", tanker-truck: "\uEFE4", tape-drive: "\uF6DE", tape-measure: "\uEB4C", target: "\uE4FD", target-account: "\uEBCF", target-variant: "\uEA76", taxi: "\uE4FE", tea: "\uED9D", tea-outline: "\uED9E", teamviewer: "\uE4FF", teddy-bear: "\uF8FA", telescope: "\uEB4D", television: "\uE501", television-ambient-light: "\uF355", television-box: "\uE838", television-classic: "\uE7F3", television-classic-off: "\uE839", television-guide: "\uE502", television-off: "\uE83A", television-pause: "\uEF88", television-play: "\uEECE", television-shimmer: "\uF10F", television-stop: "\uEF89", temperature-celsius: "\uE503", temperature-fahrenheit: "\uE504", temperature-kelvin: "\uE505", tennis: "\uED9F", tennis-ball: "\uE506", tent: "\uE507", terraform: "\uF061", terrain: "\uE508", test-tube: "\uE667", test-tube-empty: "\uE910", test-tube-off: "\uE911", text: "\uE9A7", text-account: "\uF56F", text-box: "\uE219", text-box-check: "\uEEA5", text-box-check-outline: "\uEEA6", text-box-edit: "\uFA7B", text-box-edit-outline: "\uFA7C", text-box-minus: "\uEEA7", text-box-minus-outline: "\uEEA8", text-box-multiple: "\uEAB6", text-box-multiple-outline: "\uEAB7", text-box-outline: "\uE9EC", text-box-plus: "\uEEA9", text-box-plus-outline: "\uEEAA", text-box-remove: "\uEEAB", text-box-remove-outline: "\uEEAC", text-box-search: "\uEEAD", text-box-search-outline: "\uEEAE", text-long: "\uE9A9", text-recognition: "\uF13C", text-search: "\uF3B7", text-search-variant: "\uFA7D", text-shadow: "\uE668", text-short: "\uE9A8", text-to-speech: "\uE509", text-to-speech-off: "\uE50A", texture: "\uE50B", texture-box: "\uEFE5", theater: "\uE50C", theme-light-dark: "\uE50D", thermometer: "\uE50E", thermometer-alert: "\uEE00", thermometer-bluetooth: "\uF894", thermometer-check: "\uFA7E", thermometer-chevron-down: "\uEE01", thermometer-chevron-up: "\uEE02", thermometer-high: "\uF0C1", thermometer-lines: "\uE50F", thermometer-low: "\uF0C2", thermometer-minus: "\uEE03", thermometer-off: "\uF530", thermometer-plus: "\uEE04", thermometer-water: "\uFA7F", thermostat: "\uE392", thermostat-box: "\uE890", thought-bubble: "\uE7F5", thought-bubble-outline: "\uE7F6", thumb-down: "\uE510", thumb-down-outline: "\uE511", thumb-up: "\uE512", thumb-up-outline: "\uE513", thumbs-up-down: "\uE514", thumbs-up-down-outline: "\uF913", ticket: "\uE515", ticket-account: "\uE516", ticket-confirmation: "\uE517", ticket-confirmation-outline: "\uF3A9", ticket-outline: "\uE912", ticket-percent: "\uE723", ticket-percent-outline: "\uF42A", tie: "\uE518", tilde: "\uE724", tilde-off: "\uF8F2", timelapse: "\uE519", timeline: "\uEBD0", timeline-alert: "\uEF94", timeline-alert-outline: "\uEF97", timeline-check: "\uF531", timeline-check-outline: "\uF532", timeline-clock: "\uF1FA", timeline-clock-outline: "\uF1FB", timeline-help: "\uEF98", timeline-help-outline: "\uEF99", timeline-minus: "\uF533", timeline-minus-outline: "\uF534", timeline-outline: "\uEBD1", timeline-plus: "\uEF95", timeline-plus-outline: "\uEF96", timeline-remove: "\uF535", timeline-remove-outline: "\uF536", timeline-text: "\uEBD2", timeline-text-outline: "\uEBD3", timer: "\uF3AA", timer-10: "\uE51B", timer-3: "\uE51C", timer-alert: "\uFACB", timer-alert-outline: "\uFACC", timer-cancel: "\uFACD", timer-cancel-outline: "\uFACE", timer-check: "\uFACF", timer-check-outline: "\uFAD0", timer-cog: "\uF924", timer-cog-outline: "\uF925", timer-edit: "\uFAD1", timer-edit-outline: "\uFAD2", timer-lock: "\uFAD3", timer-lock-open: "\uFAD4", timer-lock-open-outline: "\uFAD5", timer-lock-outline: "\uFAD6", timer-marker: "\uFAD7", timer-marker-outline: "\uFAD8", timer-minus: "\uFAD9", timer-minus-outline: "\uFADA", timer-music: "\uFADB", timer-music-outline: "\uFADC", timer-off: "\uF3AB", timer-off-outline: "\uE51D", timer-outline: "\uE51A", timer-pause: "\uFADD", timer-pause-outline: "\uFADE", timer-play: "\uFADF", timer-play-outline: "\uFAE0", timer-plus: "\uFAE1", timer-plus-outline: "\uFAE2", timer-refresh: "\uFAE3", timer-refresh-outline: "\uFAE4", timer-remove: "\uFAE5", timer-remove-outline: "\uFAE6", timer-sand: "\uE51E", timer-sand-complete: "\uF99E", timer-sand-empty: "\uE6AC", timer-sand-full: "\uE78B", timer-sand-paused: "\uF99F", timer-settings: "\uF922", timer-settings-outline: "\uF923", timer-star: "\uFAE7", timer-star-outline: "\uFAE8", timer-stop: "\uFAE9", timer-stop-outline: "\uFAEA", timer-sync: "\uFAEB", timer-sync-outline: "\uFAEC", timetable: "\uE51F", tire: "\uF895", toaster: "\uF062", toaster-off: "\uF1B6", toaster-oven: "\uECD2", toggle-switch: "\uE520", toggle-switch-off: "\uE521", toggle-switch-off-outline: "\uEA18", toggle-switch-outline: "\uEA19", toggle-switch-variant: "\uFA24", toggle-switch-variant-off: "\uFA25", toilet: "\uE9AA", toolbox: "\uE9AB", toolbox-outline: "\uE9AC", tools: "\uF063", tooltip: "\uE522", tooltip-account: "\uE00B", tooltip-cellphone: "\uF83A", tooltip-check: "\uF55B", tooltip-check-outline: "\uF55C", tooltip-edit: "\uE523", tooltip-edit-outline: "\uF2C4", tooltip-image: "\uE524", tooltip-image-outline: "\uEBD4", tooltip-minus: "\uF55D", tooltip-minus-outline: "\uF55E", tooltip-outline: "\uE525", tooltip-plus: "\uEBD5", tooltip-plus-outline: "\uE526", tooltip-remove: "\uF55F", tooltip-remove-outline: "\uF560", tooltip-text: "\uE527", tooltip-text-outline: "\uEBD6", tooth: "\uE8C2", tooth-outline: "\uE528", toothbrush: "\uF128", toothbrush-electric: "\uF12B", toothbrush-paste: "\uF129", torch: "\uF605", tortoise: "\uED3A", toslink: "\uF2B7", tournament: "\uE9AD", tow-truck: "\uE83B", tower-beach: "\uE680", tower-fire: "\uE681", town-hall: "\uF874", toy-brick: "\uF287", toy-brick-marker: "\uF288", toy-brick-marker-outline: "\uF289", toy-brick-minus: "\uF28A", toy-brick-minus-outline: "\uF28B", toy-brick-outline: "\uF28C", toy-brick-plus: "\uF28D", toy-brick-plus-outline: "\uF28E", toy-brick-remove: "\uF28F", toy-brick-remove-outline: "\uF290", toy-brick-search: "\uF291", toy-brick-search-outline: "\uF292", track-light: "\uE913", trackpad: "\uE7F7", trackpad-lock: "\uE932", tractor: "\uE891", tractor-variant: "\uF4C3", trademark: "\uEA77", traffic-cone: "\uF37B", traffic-light: "\uE52A", traffic-light-outline: "\uF829", train: "\uE52B", train-car: "\uEBD7", train-car-passenger: "\uF732", train-car-passenger-door: "\uF733", train-car-passenger-door-open: "\uF734", train-car-passenger-variant: "\uF735", train-variant: "\uE8C3", tram: "\uE52C", tram-side: "\uEFE6", transcribe: "\uE52D", transcribe-close: "\uE52E", transfer: "\uF064", transfer-down: "\uEDA0", transfer-left: "\uEDA1", transfer-right: "\uE52F", transfer-up: "\uEDA2", transit-connection: "\uED3B", transit-connection-horizontal: "\uF545", transit-connection-variant: "\uED3C", transit-detour: "\uEF8A", transit-skip: "\uF514", transit-transfer: "\uE6AD", transition: "\uE914", transition-masked: "\uE915", translate: "\uE5C9", translate-off: "\uEE05", transmission-tower: "\uED3D", transmission-tower-export: "\uF92B", transmission-tower-import: "\uF92C", transmission-tower-off: "\uF9DC", trash-can: "\uEA78", trash-can-outline: "\uEA79", tray: "\uF293", tray-alert: "\uF294", tray-arrow-down: "\uE11F", tray-arrow-up: "\uE11C", tray-full: "\uF295", tray-minus: "\uF296", tray-plus: "\uF297", tray-remove: "\uF298", treasure-chest: "\uE725", tree: "\uE530", tree-outline: "\uEE68", trello: "\uE531", trending-down: "\uE532", trending-neutral: "\uE533", trending-up: "\uE534", triangle: "\uE535", triangle-outline: "\uE536", triangle-small-down: "\uFA08", triangle-small-up: "\uFA09", triangle-wave: "\uF47B", triforce: "\uEBD8", trophy: "\uE537", trophy-award: "\uE538", trophy-broken: "\uEDA3", trophy-outline: "\uE539", trophy-variant: "\uE53A", trophy-variant-outline: "\uE53B", truck: "\uE53C", truck-alert: "\uF9DD", truck-alert-outline: "\uF9DE", truck-cargo-container: "\uF8D7", truck-check: "\uECD3", truck-check-outline: "\uF299", truck-delivery: "\uE53D", truck-delivery-outline: "\uF29A", truck-fast: "\uE787", truck-fast-outline: "\uF29B", truck-flatbed: "\uF890", truck-minus: "\uF9AD", truck-minus-outline: "\uF9BC", truck-outline: "\uF29C", truck-plus: "\uF9AC", truck-plus-outline: "\uF9BB", truck-remove: "\uF9AE", truck-remove-outline: "\uF9BD", truck-snowflake: "\uF9A5", truck-trailer: "\uE726", trumpet: "\uF095", tshirt-crew: "\uEA7A", tshirt-crew-outline: "\uE53E", tshirt-v: "\uEA7B", tshirt-v-outline: "\uE53F", tsunami: "\uFA80", tumble-dryer: "\uE916", tumble-dryer-alert: "\uF1B9", tumble-dryer-off: "\uF1BA", tune: "\uE62D", tune-variant: "\uF541", tune-vertical: "\uE669", tune-vertical-variant: "\uF542", tunnel: "\uF83C", tunnel-outline: "\uF83D", turbine: "\uFA81", turkey: "\uF71A", turnstile: "\uECD4", turnstile-outline: "\uECD5", turtle: "\uECD6", twitch: "\uE542", twitter: "\uE543", two-factor-authentication: "\uE9AE", typewriter: "\uEF2C", ubisoft: "\uEBD9", ubuntu: "\uE547", ufo: "\uF0C3", ufo-outline: "\uF0C4", ultra-high-definition: "\uE7F8", umbraco: "\uE548", umbrella: "\uE549", umbrella-beach: "\uF889", umbrella-beach-outline: "\uF88A", umbrella-closed: "\uE9AF", umbrella-closed-outline: "\uF3E1", umbrella-closed-variant: "\uF3E0", umbrella-outline: "\uE54A", undo: "\uE54B", undo-variant: "\uE54C", unfold-less-horizontal: "\uE54D", unfold-less-vertical: "\uE75F", unfold-more-horizontal: "\uE54E", unfold-more-vertical: "\uE760", ungroup: "\uE54F", unicode: "\uEECF", unicorn: "\uF5C1", unicorn-variant: "\uF5C2", unicycle: "\uF5E4", unity: "\uE6AE", unreal: "\uE9B0", update: "\uE6AF", upload: "\uE551", upload-lock: "\uF372", upload-lock-outline: "\uF373", upload-multiple: "\uE83C", upload-network: "\uE6F5", upload-network-outline: "\uECD7", upload-off: "\uF0C5", upload-off-outline: "\uF0C6", upload-outline: "\uEE06", usb: "\uE552", usb-flash-drive: "\uF29D", usb-flash-drive-outline: "\uF29E", usb-port: "\uF1EF", vacuum: "\uF9A0", vacuum-outline: "\uF9A1", valve: "\uF065", valve-closed: "\uF066", valve-open: "\uF067", van-passenger: "\uE7F9", van-utility: "\uE7FA", vanish: "\uE7FB", vanish-quarter: "\uF553", vanity-light: "\uF1E0", variable: "\uEAE6", variable-box: "\uF110", vector-arrange-above: "\uE553", vector-arrange-below: "\uE554", vector-bezier: "\uEAE7", vector-circle: "\uE555", vector-circle-variant: "\uE556", vector-combine: "\uE557", vector-curve: "\uE558", vector-difference: "\uE559", vector-difference-ab: "\uE55A", vector-difference-ba: "\uE55B", vector-ellipse: "\uE892", vector-intersection: "\uE55C", vector-line: "\uE55D", vector-link: "\uEFE7", vector-point: "\uE55E", vector-polygon: "\uE55F", vector-polygon-variant: "\uF855", vector-polyline: "\uE560", vector-polyline-edit: "\uF224", vector-polyline-minus: "\uF225", vector-polyline-plus: "\uF226", vector-polyline-remove: "\uF227", vector-radius: "\uE749", vector-rectangle: "\uE5C5", vector-selection: "\uE561", vector-square: "\uE000", vector-square-close: "\uF856", vector-square-edit: "\uF8D8", vector-square-minus: "\uF8D9", vector-square-open: "\uF857", vector-square-plus: "\uF8DA", vector-square-remove: "\uF8DB", vector-triangle: "\uE562", vector-union: "\uE563", vhs: "\uEA1A", vibrate: "\uE565", vibrate-off: "\uECD8", video: "\uE566", video-2d: "\uFA1B", video-3d: "\uE7FC", video-3d-off: "\uF3D8", video-3d-variant: "\uEED0", video-4k-box: "\uE83D", video-account: "\uE918", video-box: "\uE0FC", video-box-off: "\uE0FD", video-check: "\uF068", video-check-outline: "\uF069", video-high-definition: "\uF52D", video-image: "\uE919", video-input-antenna: "\uE83E", video-input-component: "\uE83F", video-input-hdmi: "\uE840", video-input-scart: "\uEF8B", video-input-svideo: "\uE841", video-marker: "\uF9A8", video-marker-outline: "\uF9A9", video-minus: "\uE9B1", video-minus-outline: "\uE2B9", video-off: "\uE567", video-off-outline: "\uEBDA", video-outline: "\uEBDB", video-plus: "\uE9B2", video-plus-outline: "\uE1D2", video-stabilization: "\uE91A", video-switch: "\uE568", video-switch-outline: "\uE78F", video-vintage: "\uEA1B", video-wireless: "\uEED1", video-wireless-outline: "\uEED2", view-agenda: "\uE569", view-agenda-outline: "\uF1D7", view-array: "\uE56A", view-array-outline: "\uF484", view-carousel: "\uE56B", view-carousel-outline: "\uF485", view-column: "\uE56C", view-column-outline: "\uF486", view-comfy: "\uEE69", view-comfy-outline: "\uF487", view-compact: "\uEE6A", view-compact-outline: "\uEE6B", view-dashboard: "\uE56D", view-dashboard-edit: "\uF946", view-dashboard-edit-outline: "\uF947", view-dashboard-outline: "\uEA1C", view-dashboard-variant: "\uE842", view-dashboard-variant-outline: "\uF488", view-day: "\uE56E", view-day-outline: "\uF489", view-gallery: "\uF887", view-gallery-outline: "\uF888", view-grid: "\uE56F", view-grid-outline: "\uF1D8", view-grid-plus: "\uEF8C", view-grid-plus-outline: "\uF1D9", view-headline: "\uE570", view-list: "\uE571", view-list-outline: "\uF48A", view-module: "\uE572", view-module-outline: "\uF48B", view-parallel: "\uE727", view-parallel-outline: "\uF48C", view-quilt: "\uE573", view-quilt-outline: "\uF48D", view-sequential: "\uE728", view-sequential-outline: "\uF48E", view-split-horizontal: "\uEBCA", view-split-vertical: "\uEBCB", view-stream: "\uE574", view-stream-outline: "\uF48F", view-week: "\uE575", view-week-outline: "\uF490", vimeo: "\uE576", violin: "\uE60E", virtual-reality: "\uE893", virus: "\uF3B5", virus-off: "\uF8E0", virus-off-outline: "\uF8E1", virus-outline: "\uF3B6", vlc: "\uE57B", voicemail: "\uE57C", volcano: "\uFA82", volcano-outline: "\uFA83", volleyball: "\uE9B3", volume-high: "\uE57D", volume-low: "\uE57E", volume-medium: "\uE57F", volume-minus: "\uE75D", volume-mute: "\uE75E", volume-off: "\uE580", volume-plus: "\uE75C", volume-source: "\uF11F", volume-variant-off: "\uEE07", volume-vibrate: "\uF120", vote: "\uEA1E", vote-outline: "\uEA1F", vpn: "\uE581", vuejs: "\uE843", vuetify: "\uEE6C", walk: "\uE582", wall: "\uE7FD", wall-fire: "\uFA10", wall-sconce: "\uE91B", wall-sconce-flat: "\uE91C", wall-sconce-flat-outline: "\uF7C8", wall-sconce-flat-variant: "\uE41B", wall-sconce-flat-variant-outline: "\uF7C9", wall-sconce-outline: "\uF7CA", wall-sconce-round: "\uE747", wall-sconce-round-outline: "\uF7CB", wall-sconce-round-variant: "\uE91D", wall-sconce-round-variant-outline: "\uF7CC", wallet: "\uE583", wallet-giftcard: "\uE584", wallet-membership: "\uE585", wallet-outline: "\uEBDC", wallet-plus: "\uEF8D", wallet-plus-outline: "\uEF8E", wallet-travel: "\uE586", wallpaper: "\uEE08", wan: "\uE587", wardrobe: "\uEF8F", wardrobe-outline: "\uEF90", warehouse: "\uEF80", washing-machine: "\uE729", washing-machine-alert: "\uF1BB", washing-machine-off: "\uF1BC", watch: "\uE588", watch-export: "\uE589", watch-export-variant: "\uE894", watch-import: "\uE58A", watch-import-variant: "\uE895", watch-variant: "\uE896", watch-vibrate: "\uE6B0", watch-vibrate-off: "\uECD9", water: "\uE58B", water-alert: "\uF501", water-alert-outline: "\uF502", water-boiler: "\uEF91", water-boiler-alert: "\uF1B2", water-boiler-off: "\uF1B3", water-check: "\uF503", water-check-outline: "\uF504", water-circle: "\uF805", water-minus: "\uF505", water-minus-outline: "\uF506", water-off: "\uE58C", water-off-outline: "\uF507", water-opacity: "\uF854", water-outline: "\uEE09", water-percent: "\uE58D", water-percent-alert: "\uF508", water-plus: "\uF509", water-plus-outline: "\uF50A", water-polo: "\uF29F", water-pump: "\uE58E", water-pump-off: "\uEF92", water-remove: "\uF50B", water-remove-outline: "\uF50C", water-sync: "\uF7C5", water-thermometer: "\uFA84", water-thermometer-outline: "\uFA85", water-well: "\uF06A", water-well-outline: "\uF06B", waterfall: "\uF848", watering-can: "\uF480", watering-can-outline: "\uF481", watermark: "\uE611", wave: "\uEF2D", waveform: "\uF47C", waves: "\uE78C", waves-arrow-left: "\uF858", waves-arrow-right: "\uF859", waves-arrow-up: "\uF85A", waze: "\uEBDD", weather-cloudy: "\uE58F", weather-cloudy-alert: "\uEF2E", weather-cloudy-arrow-right: "\uEE6D", weather-cloudy-clock: "\uF8F5", weather-fog: "\uE590", weather-hail: "\uE591", weather-hazy: "\uEF2F", weather-hurricane: "\uE897", weather-lightning: "\uE592", weather-lightning-rainy: "\uE67D", weather-night: "\uE593", weather-night-partly-cloudy: "\uEF30", weather-partly-cloudy: "\uE594", weather-partly-lightning: "\uEF31", weather-partly-rainy: "\uEF32", weather-partly-snowy: "\uEF33", weather-partly-snowy-rainy: "\uEF34", weather-pouring: "\uE595", weather-rainy: "\uE596", weather-snowy: "\uE597", weather-snowy-heavy: "\uEF35", weather-snowy-rainy: "\uE67E", weather-sunny: "\uE598", weather-sunny-alert: "\uEF36", weather-sunny-off: "\uF4E3", weather-sunset: "\uE599", weather-sunset-down: "\uE59A", weather-sunset-up: "\uE59B", weather-tornado: "\uEF37", weather-windy: "\uE59C", weather-windy-variant: "\uE59D", web: "\uE59E", web-box: "\uEF93", web-cancel: "\uF78F", web-check: "\uE788", web-clock: "\uF249", web-minus: "\uF09F", web-off: "\uEA8D", web-plus: "\uE032", web-refresh: "\uF790", web-remove: "\uE550", web-sync: "\uF791", webcam: "\uE59F", webcam-off: "\uF736", webhook: "\uE62E", webpack: "\uE72A", webrtc: "\uF247", wechat: "\uE610", weight: "\uE5A0", weight-gram: "\uED3E", weight-kilogram: "\uE5A1", weight-lifter: "\uF15C", weight-pound: "\uE9B4", whatsapp: "\uE5A2", wheel-barrow: "\uF4F1", wheelchair: "\uFA86", wheelchair-accessibility: "\uE5A3", whistle: "\uE9B5", whistle-outline: "\uF2BB", white-balance-auto: "\uE5A4", white-balance-incandescent: "\uE5A5", white-balance-iridescent: "\uE5A6", white-balance-sunny: "\uE5A7", widgets: "\uE72B", widgets-outline: "\uF354", wifi: "\uE5A8", wifi-alert: "\uF6B4", wifi-arrow-down: "\uF6B5", wifi-arrow-left: "\uF6B6", wifi-arrow-left-right: "\uF6B7", wifi-arrow-right: "\uF6B8", wifi-arrow-up: "\uF6B9", wifi-arrow-up-down: "\uF6BA", wifi-cancel: "\uF6BB", wifi-check: "\uF6BC", wifi-cog: "\uF6BD", wifi-lock: "\uF6BE", wifi-lock-open: "\uF6BF", wifi-marker: "\uF6C0", wifi-minus: "\uF6C1", wifi-off: "\uE5A9", wifi-plus: "\uF6C2", wifi-refresh: "\uF6C3", wifi-remove: "\uF6C4", wifi-settings: "\uF6C5", wifi-star: "\uEE0A", wifi-strength-1: "\uE91E", wifi-strength-1-alert: "\uE91F", wifi-strength-1-lock: "\uE920", wifi-strength-1-lock-open: "\uF6CA", wifi-strength-2: "\uE921", wifi-strength-2-alert: "\uE922", wifi-strength-2-lock: "\uE923", wifi-strength-2-lock-open: "\uF6CB", wifi-strength-3: "\uE924", wifi-strength-3-alert: "\uE925", wifi-strength-3-lock: "\uE926", wifi-strength-3-lock-open: "\uF6CC", wifi-strength-4: "\uE927", wifi-strength-4-alert: "\uE928", wifi-strength-4-lock: "\uE929", wifi-strength-4-lock-open: "\uF6CD", wifi-strength-alert-outline: "\uE92A", wifi-strength-lock-open-outline: "\uF6CE", wifi-strength-lock-outline: "\uE92B", wifi-strength-off: "\uE92C", wifi-strength-off-outline: "\uE92D", wifi-strength-outline: "\uE92E", wifi-sync: "\uF6C6", wikipedia: "\uE5AB", wind-power: "\uFA87", wind-power-outline: "\uFA88", wind-turbine: "\uEDA4", wind-turbine-alert: "\uF9AA", wind-turbine-check: "\uF9AB", window-close: "\uE5AC", window-closed: "\uE5AD", window-closed-variant: "\uF1DA", window-maximize: "\uE5AE", window-minimize: "\uE5AF", window-open: "\uE5B0", window-open-variant: "\uF1DB", window-restore: "\uE5B1", window-shutter: "\uF11B", window-shutter-alert: "\uF11C", window-shutter-cog: "\uFA89", window-shutter-open: "\uF11D", window-shutter-settings: "\uFA8A", windsock: "\uF5F9", wiper: "\uEAE8", wiper-wash: "\uEDA5", wiper-wash-alert: "\uF8DE", wizard-hat: "\uF476", wordpress: "\uE5B3", wrap: "\uE5B5", wrap-disabled: "\uEBDE", wrench: "\uE5B6", wrench-clock: "\uF9A2", wrench-outline: "\uEBDF", xamarin: "\uE844", xml: "\uE5BF", xmpp: "\uE7FE", yahoo: "\uEB4E", yeast: "\uE5C0", yin-yang: "\uE67F", yoga: "\uF17B", youtube: "\uE5C2", youtube-gaming: "\uE847", youtube-studio: "\uE846", youtube-subscription: "\uED3F", youtube-tv: "\uE447", yurt: "\uF515", z-wave: "\uEAE9", zend: "\uEAEA", zigbee: "\uED40", zip-box: "\uE5C3", zip-box-outline: "\uEFF9", zip-disk: "\uEA22", zodiac-aquarius: "\uEA7C", zodiac-aries: "\uEA7D", zodiac-cancer: "\uEA7E", zodiac-capricorn: "\uEA7F", zodiac-gemini: "\uEA80", zodiac-leo: "\uEA81", zodiac-libra: "\uEA82", zodiac-pisces: "\uEA83", zodiac-sagittarius: "\uEA84", zodiac-scorpio: "\uEA85", zodiac-taurus: "\uEA86", zodiac-virgo: "\uEA87" }
@@ -3559,38 +3540,48 @@ variables:
##### Nextion dict ####
nextion:
color:
- blue: '1055' # rgb(0, 128, 248)
- grey_dark: '10597' # rgb(40, 44, 40)
- grey_light: '33808' # rgb(128, 128, 128)
- grey_super_light: '52857' # rgb(200, 204, 200)
- red: '63488' # rgb(248, 0, 0)
- white: '65535' # rgb(255, 255, 255)
- yellow: '65472' # rgb(248, 248, 0)
+ blue: [1055] #'1055' # rgb(0, 128, 248)
+ grey_dark: [10597] #'10597' # rgb(40, 44, 40)
+ grey_light: [33808] #'33808' # rgb(128, 128, 128)
+ grey_super_light: [52857] #'52857' # rgb(200, 204, 200)
+ grey_white: [59164] #'59164' # rgb(225, 225, 225)
+ red: [63488] #'63488' # rgb(248, 0, 0)
+ white: [65535] #'65535' # rgb(255, 255, 255)
+ yellow: [65472] #'65472' # rgb(248, 248, 0)
#### Colors from HA Style:
- green: '19818' # rgb(76, 175, 80)
- orange: '64704' # rgb(255, 152, 0)
- cyan: '1530' # rgb(0, 188, 212)
- deep-orange: '64164' # rgb(255, 87, 34)
- amber: '65024' # rgb(255, 193, 7)
- "off": '35921' #8a8a8a
- disabled: '48631' # rgb(189, 189, 189)
+ green: [19818] #'19818' # rgb(76, 175, 80)
+ orange: [64704] #'64704' # rgb(255, 152, 0)
+ cyan: [1530] #'1530' # rgb(0, 188, 212)
+ deep-orange: [64164] #'64164' # rgb(255, 87, 34)
+ amber: [65024] #'65024' # rgb(255, 193, 7)
+ "off": [35921] #'35921' #8a8a8a
+ disabled: [48631] #'48631' # rgb(189, 189, 189)
+ unavailable: [6339] #'6339'
command:
- text_printf: 'esphome.{{ nspanel_name }}_send_command_text_printf'
- value: 'esphome.{{ nspanel_name }}_send_command_value'
- printf: 'esphome.{{ nspanel_name }}_send_command_printf'
- font_color: 'esphome.{{ nspanel_name }}_send_command_font_color'
- background_color: 'esphome.{{ nspanel_name }}_send_command_background_color'
- notification_show: 'esphome.{{ nspanel_name }}_notification_show'
- notification_clear: 'esphome.{{ nspanel_name }}_notification_clear'
- play_rtttl: 'esphome.{{ nspanel_name }}_play_rtttl'
- set_settings_entity: 'esphome.{{ nspanel_name }}_set_settings_entity'
+ alarm_settings: 'esphome.{{ nspanel_name }}_alarm_settings'
+ #background_color: 'esphome.{{ nspanel_name }}_send_command_background_color'
+ #font_color: 'esphome.{{ nspanel_name }}_send_command_font_color'
+ global_settings: 'esphome.{{ nspanel_name }}_global_settings'
hide: 'esphome.{{ nspanel_name }}_send_command_hide'
+ media_player: 'esphome.{{ nspanel_name }}_media_player'
+ notification_clear: 'esphome.{{ nspanel_name }}_notification_clear'
+ #notification_show: 'esphome.{{ nspanel_name }}_notification_show'
+ open_entity_settings_page: 'esphome.{{ nspanel_name }}_open_entity_settings_page'
+ page_home: 'esphome.{{ nspanel_name }}_page_home'
+ page_settings: 'esphome.{{ nspanel_name }}_page_settings'
+ #play_rtttl: 'esphome.{{ nspanel_name }}_play_rtttl'
+ printf: 'esphome.{{ nspanel_name }}_send_command_printf'
+ qrcode: 'esphome.{{ nspanel_name }}_qrcode'
+ set_button: 'esphome.{{ nspanel_name }}_set_button'
+ set_climate: 'esphome.{{ nspanel_name }}_set_climate'
+ set_component_color: 'esphome.{{ nspanel_name }}_set_component_color'
+ set_entity: 'esphome.{{ nspanel_name }}_set_entity'
show: 'esphome.{{ nspanel_name }}_send_command_show'
show_all: 'esphome.{{ nspanel_name }}_send_command_show_all'
+ text_printf: 'esphome.{{ nspanel_name }}_send_command_text_printf'
tft_upload: 'esphome.{{ nspanel_name }}_upload_tft'
- set_button: 'esphome.{{ nspanel_name }}_set_button'
- set_entity: 'esphome.{{ nspanel_name }}_set_entity'
- set_climate: 'esphome.{{ nspanel_name }}_set_climate'
+ value: 'esphome.{{ nspanel_name }}_send_command_value'
+ wake_up: 'esphome.{{ nspanel_name }}_wake_up'
icon:
domain:
automation: "\uF6FC" #F6FC
@@ -3602,6 +3593,7 @@ variables:
input_boolean: "\uEA19" #EA19
input_button: "\uF2A7" #F2A7
light: "\uE334" #E334
+ media_player: "\uE117" # mdi:cast
person: "\uE003" #E003
scene: "\uEE0B" #EE0B
script: "\uF45D" #F45D
@@ -3616,29 +3608,9 @@ variables:
gauge: "\uE299" #E299
unknown: '{{ all_icons.unknown }}' #"\uE2D5"
pic:
- hvac:
- button:
- blank: "79"
- "off": "80"
- "on": "81"
- unknown: "79"
- hardware:
- button:
- "off": "77"
- closed: "77"
- closing: "77"
- "false": "77"
- "on": "78"
- open: "78"
- opened: "78"
- "true": "78"
button:
- "off": "101"
- "on": "102"
- heating:
- button:
- "off": "82"
- "on": "83"
+ "off": "35"
+ "on": "36"
weather:
sunny: '{{ "2" if sun_is_up else "15"}}' #some weather providers returns "sunny" for "clear-night"
cloudy: "3"
@@ -3654,6 +3626,7 @@ variables:
lightning: "10"
partlycloudy: '{{ "11" if sun_is_up else "12"}}'
lightning_rainy: '{{ "13" if sun_is_up else "14"}}'
+ lightning-rainy: '{{ "13" if sun_is_up else "14"}}'
execptional: '{{ "13" if sun_is_up else "14"}}'
clear_night: "15"
clear-night: "15"
@@ -3661,6 +3634,7 @@ variables:
unavailable: ""
page:
+ current: '{{ states(currentpage) }}'
home: "home"
weatherpages:
- "weather01"
@@ -3672,8 +3646,9 @@ variables:
settings: "settings"
boot: "boot"
screensaver: "screensaver"
- light: "lightsettings"
- cover: "coversettings"
+ light: "light"
+ cover: "cover"
+ fan: "fan"
buttonpages:
- "buttonpage01"
- "buttonpage02"
@@ -3686,10 +3661,17 @@ variables:
- "entitypage02"
- "entitypage03"
- "entitypage04"
+ alarm: "alarm"
+ keyb_num: "keyb_num"
+ media_player: "media_player"
+ confirm: "confirm"
##### MUI Multilingual User Interface #####
+ language_tmp: !input 'language'
+ language: '{{ language_tmp if language_tmp is string and language_tmp in ["bg", "hr", "cs", "da", "nl", "et", "fi", "fr", "de", "el", "he", "hu", "id", "it", "lv", "lt", "nb", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "tr", "uk"] else "en" }}'
+
mui:
- BGR:
+ bg: #Bulgarian
weekdays:
mon: ĐĐžĐŊĐĩĐ´ĐĩĐģĐŊиĐē
tue: ĐŅĐžŅĐŊиĐē
@@ -3746,7 +3728,21 @@ variables:
please_confirm: ĐĐžĐģŅ, ĐŋĐžŅвŅŅĐ´ĐĩŅĐĩ
unavailable: ĐĐĩĐ´ĐžŅŅŅĐŋĐĩĐŊ
no_name: ĐŅĐŧĐ° иĐŧĐĩ
- CZE:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ cs: #Czech
weekdays:
mon: PondÄlÃ
tue: ÃterÃŊ
@@ -3803,7 +3799,92 @@ variables:
please_confirm: PotvrÄte prosÃm
unavailable: Unavailable
no_name: No name
- DEU: #German
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ da: #Danish
+ weekdays:
+ mon: Mandag
+ tue: Tirsdag
+ wed: Onsdag
+ thu: Torsdag
+ fri: Fredag
+ sat: Lørdag
+ sun: Søndag
+ weekdays_short:
+ mon: Mon
+ tue: Tue
+ wed: Wed
+ thu: Thu
+ fri: Fri
+ sat: Sat
+ sun: Sun
+ months:
+ jan: January
+ feb: February
+ mar: March
+ apr: April
+ may: May
+ jun: June
+ jul: July
+ aug: August
+ sep: September
+ oct: October
+ nov: November
+ dec: December
+ months_short:
+ jan: Jan
+ feb: Feb
+ mar: Mar
+ apr: Apr
+ may: May
+ jun: Jun
+ jul: Jul
+ aug: Aug
+ sep: Sep
+ oct: Oct
+ nov: Nov
+ dec: Dec
+ relative_day:
+ today: I dag
+ tomorrow: I morgen
+ in_2_days: om 2 dage
+ in_3_days: om 3 dage
+ in_4_days: om 4 dage
+ climate:
+ states:
+ "on": pÃĨ
+ "off": off
+ heat: varme
+ please_confirm: BekrÃĻft venligst
+ unavailable: Unavailable
+ no_name: No name
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ de: #German
weekdays:
mon: Montag
tue: Dienstag
@@ -3860,15 +3941,100 @@ variables:
please_confirm: Bitte bestätigen
unavailable: Unavailable
no_name: No name
- DNK:
+ alarm:
+ home: Zuhause
+ away: Abwesend
+ night: Nacht
+ vacation: Urlaub
+ bypass: Bypass
+ disarm: Deaktiviert
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ el: #Greek
weekdays:
- mon: Mandag
- tue: Tirsdag
- wed: Onsdag
- thu: Torsdag
- fri: Fredag
- sat: Lørdag
- sun: Søndag
+ mon: ÎÎĩĪ
ĪÎĪÎą
+ tue: ΤĪίĪΡ
+ wed: ΤÎĩĪÎŦĪĪΡ
+ thu: Î ÎÎŧĪĪΡ
+ fri: Î ÎąĪÎąĪÎēÎĩĪ
ÎŽ
+ sat: ÎŖÎŦββιĪÎŋ
+ sun: ÎĪ
ĪΚιÎēÎŽ
+ weekdays_short:
+ mon: ÎÎĩĪ
+ tue: ΤĪΚ
+ wed: ΤÎĩĪ
+ thu: Î ÎĩÎŧ
+ fri: Î ÎąĪ
+ sat: ÎŖιβ
+ sun: ÎĪ
Ī
+ months:
+ jan: ÎÎąÎŊÎŋĪ
ÎŦĪΚÎŋĪ
+ feb: ÎĻÎĩβĪÎŋĪ
ÎŦĪΚÎŋĪ
+ mar: ÎÎŦĪĪΚÎŋĪ
+ apr: ÎĪĪίÎģÎŋĪ
+ may: ÎÎŦΚÎŋĪ
+ jun: ÎÎŋĪÎŊΚÎŋĪ
+ jul: ÎÎŋĪÎģΚÎŋĪ
+ aug: ÎĪÎŗÎŋĪ
ĪĪÎŋĪ
+ sep: ÎŖÎĩĪĪÎÎŧβĪΚÎŋĪ
+ oct: ÎÎēĪĪβĪΚÎŋĪ
+ nov: ÎÎŋÎÎŧβĪΚÎŋĪ
+ dec: ÎÎĩÎēÎÎŧβĪΚÎŋĪ
+ months_short:
+ jan: ÎÎąÎŊ
+ feb: ÎĻÎĩβ
+ mar: ÎÎąĪ
+ apr: ÎĪĪ
+ may: ÎιΚ
+ jun: ÎÎŋĪ
ÎŊ
+ jul: ÎÎŋĪ
Îģ
+ aug: ÎĪ
Îŗ
+ sep: ÎŖÎĩĪ
+ oct: ÎÎēĪ
+ nov: ÎÎŋÎĩ
+ dec: ÎÎĩÎē
+ relative_day:
+ today: ÎŖÎŽÎŧÎĩĪÎą
+ tomorrow: ÎĪĪΚÎŋ
+ in_2_days: ĪÎĩ 2 ΡÎŧÎĪÎĩĪ
+ in_3_days: ĪÎĩ 3 ΡÎŧÎĪÎĩĪ
+ in_4_days: ĪÎĩ 4 ΡÎŧÎĪÎĩĪ
+ climate:
+ states:
+ "on": ÎÎŊÎĩĪÎŗĪ
+ "off": ÎÎŊÎĩÎŊÎĩĪÎŗĪ
+ heat: ÎÎĪÎŧÎąÎŊĪΡ
+ please_confirm: Î ÎąĪÎąÎēÎąÎģĪ ÎĩĪΚβÎĩβιΚĪĪĪÎĩ
+ unavailable: ÎΡ δΚιθÎĪΚÎŧÎŋ
+ no_name: ΧĪĪίĪ ĪÎŊÎŋÎŧÎą
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ en: #English
+ weekdays:
+ mon: Monday
+ tue: Tuesday
+ wed: Wednesday
+ thu: Thursday
+ fri: Friday
+ sat: Saturday
+ sun: Sunday
weekdays_short:
mon: Mon
tue: Tue
@@ -3904,77 +4070,34 @@ variables:
nov: Nov
dec: Dec
relative_day:
- today: I dag
- tomorrow: I morgen
- in_2_days: om 2 dage
- in_3_days: om 3 dage
- in_4_days: om 4 dage
+ today: Today
+ tomorrow: Tomorrow
+ in_2_days: In 2 days
+ in_3_days: In 3 days
+ in_4_days: In 4 days
climate:
states:
- "on": pÃĨ
+ "on": on
"off": off
- heat: varme
- please_confirm: BekrÃĻft venligst
+ heat: heat
+ please_confirm: Please confirm
unavailable: Unavailable
no_name: No name
- ENG: #English
- weekdays:
- mon: Monday
- tue: Tuesday
- wed: Wednesday
- thu: Thursday
- fri: Friday
- sat: Saturday
- sun: Sunday
- weekdays_short:
- mon: Mon
- tue: Tue
- wed: Wed
- thu: Thu
- fri: Fri
- sat: Sat
- sun: Sun
- months:
- jan: January
- feb: February
- mar: March
- apr: April
- may: May
- jun: June
- jul: July
- aug: August
- sep: September
- oct: October
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: May
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Oct
- nov: Nov
- dec: Dec
- relative_day:
- today: Today
- tomorrow: Tomorrow
- in_2_days: In 2 days
- in_3_days: In 3 days
- in_4_days: In 4 days
- climate:
- states:
- "on": on
- "off": off
- heat: heat
- please_confirm: Please confirm
- unavailable: Unavailable
- no_name: No name
- ESP: #Spanish
+ alarm:
+ home: Home
+ away: Away
+ night: Night
+ vacation: Holiday
+ bypass: Custom bypass
+ disarm: Disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep mode
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ es: #Spanish
weekdays:
mon: Lunes
tue: Martes
@@ -4027,11 +4150,25 @@ variables:
states:
"on": Encendido
"off": Apagado
- heat: calor
+ heat: Calentar
please_confirm: Por favor, confirme
unavailable: No disponible
no_name: Sin nombre
- EST:
+ alarm:
+ home: Casa
+ away: Fuera
+ night: Noche
+ vacation: Vacaciones
+ bypass: Bypass
+ disarm: Desarmar
+ settings:
+ reboot: Reiniciar
+ sleep: Dormir
+ brightness: Brillo
+ bright: Brillante
+ dimming: AtenuaciÃŗn
+ dim: Oscuro
+ et: #Estonian
weekdays:
mon: Esmaspäev
tue: Teisipäev
@@ -4088,7 +4225,21 @@ variables:
please_confirm: Palun kinnitage
unavailable: Unavailable
no_name: No name
- FIN: #Finnish
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ fi: #Finnish
weekdays:
mon: Maanantai
tue: Tiistai
@@ -4145,7 +4296,24 @@ variables:
please_confirm: Vahvista
unavailable: Unavailable
no_name: No name
- FRA: #French
+ alarm:
+ home: Kotona
+ away: Poissa
+ night: YÃļ
+ vacation: Loma
+ bypass: Ohitus
+ disarm: Pois
+ settings:
+ reboot: Uudelleenkäynnistys
+ sleep: Lepotila
+ brightness: Kirkkaus
+ bright: Kirkas
+ dimming: Himmennys
+ dim: Himmeä
+ #Finnish is sometimes difficult language to get short words out of... :)
+ #Uudelleenkäynnistys could be shortened as "Uudelleenkäynn." (if there is room for that dot), 2nd best would be "Uud.käynnistys", lastly "Uud.käynn.". Then there is this non-official translation "Boottaus" (but I'd prefer not).
+ #If in current version there is this title (Brightness, Kirkkaus in Finnish) before those two sliders, you can use "Kirkas" and "Himmeä" for them.
+ fr: #French
weekdays:
mon: Lundi
tue: Mardi
@@ -4202,64 +4370,21 @@ variables:
please_confirm: Veuillez confirmer
unavailable: Indisponible
no_name: Sans nom
- GRC: #Greek
- weekdays:
- mon: ÎÎĩĪ
ĪÎĪÎą
- tue: ΤĪίĪΡ
- wed: ΤÎĩĪÎŦĪĪΡ
- thu: Î ÎÎŧĪĪΡ
- fri: Î ÎąĪÎąĪÎēÎĩĪ
ÎŽ
- sat: ÎŖÎŦββιĪÎŋ
- sun: ÎĪ
ĪΚιÎēÎŽ
- weekdays_short:
- mon: ÎÎĩĪ
- tue: ΤĪΚ
- wed: ΤÎĩĪ
- thu: Î ÎĩÎŧ
- fri: Î ÎąĪ
- sat: ÎŖιβ
- sun: ÎĪ
Ī
- months:
- jan: ÎÎąÎŊÎŋĪ
ÎŦĪΚÎŋĪ
- feb: ÎĻÎĩβĪÎŋĪ
ÎŦĪΚÎŋĪ
- mar: ÎÎŦĪĪΚÎŋĪ
- apr: ÎĪĪίÎģÎŋĪ
- may: ÎÎŦΚÎŋĪ
- jun: ÎÎŋĪÎŊΚÎŋĪ
- jul: ÎÎŋĪÎģΚÎŋĪ
- aug: ÎĪÎŗÎŋĪ
ĪĪÎŋĪ
- sep: ÎŖÎĩĪĪÎÎŧβĪΚÎŋĪ
- oct: ÎÎēĪĪβĪΚÎŋĪ
- nov: ÎÎŋÎÎŧβĪΚÎŋĪ
- dec: ÎÎĩÎēÎÎŧβĪΚÎŋĪ
- months_short:
- jan: ÎÎąÎŊ
- feb: ÎĻÎĩβ
- mar: ÎÎąĪ
- apr: ÎĪĪ
- may: ÎιΚ
- jun: ÎÎŋĪ
ÎŊ
- jul: ÎÎŋĪ
Îģ
- aug: ÎĪ
Îŗ
- sep: ÎŖÎĩĪ
- oct: ÎÎēĪ
- nov: ÎÎŋÎĩ
- dec: ÎÎĩÎē
- relative_day:
- today: ÎŖÎŽÎŧÎĩĪÎą
- tomorrow: ÎĪĪΚÎŋ
- in_2_days: ĪÎĩ 2 ΡÎŧÎĪÎĩĪ
- in_3_days: ĪÎĩ 3 ΡÎŧÎĪÎĩĪ
- in_4_days: ĪÎĩ 4 ΡÎŧÎĪÎĩĪ
- climate:
- states:
- "on": ÎÎŊÎĩĪÎŗĪ
- "off": ÎÎŊÎĩÎŊÎĩĪÎŗĪ
- heat: ÎÎĪÎŧÎąÎŊĪΡ
- please_confirm: Î ÎąĪÎąÎēÎąÎģĪ ÎĩĪΚβÎĩβιΚĪĪĪÎĩ
- unavailable: ÎΡ δΚιθÎĪΚÎŧÎŋ
- no_name: ΧĪĪίĪ ĪÎŊÎŋÎŧÎą
- HEB: #Hebrew
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ he: #Hebrew
weekdays:
mon: ×× ×Š
tue: ×׊××׊
@@ -4316,7 +4441,21 @@ variables:
please_confirm: ×¨×Š× ×׊ק××
unavailable: Unavailable
no_name: No name
- HRV: #Croatian
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ hr: #Croatian
weekdays:
mon: Ponedjeljak
tue: Utorak
@@ -4373,7 +4512,21 @@ variables:
please_confirm: Molim potvrdite
unavailable: Nedostupno
no_name: Bez imena
- HUN:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ hu: #Hungarian
weekdays:
mon: HÊtfÅ
tue: Kedd
@@ -4430,7 +4583,21 @@ variables:
please_confirm: KÊrjÃŧk, erÅsÃtse meg
unavailable: Unavailable
no_name: No name
- IDN:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ id: #Indonesian
weekdays:
mon: Senin
tue: Selasa
@@ -4487,7 +4654,21 @@ variables:
please_confirm: Mohon konfirmasi
unavailable: Unavailable
no_name: No name
- ITA: #Italian
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ it: #Italian
weekdays:
mon: LunedÃŦ
tue: MartedÃŦ
@@ -4533,18 +4714,32 @@ variables:
relative_day:
today: Oggi
tomorrow: Domani
- in_2_days: in 2 giorni
- in_3_days: in 3 giorni
- in_4_days: in 4 giorni
+ in_2_days: Dopodomani
+ in_3_days: In 3 giorni
+ in_4_days: In 4 giorni
climate:
states:
"on": on
"off": off
- heat: caldo
+ heat: Riscaldamento
please_confirm: Confermare
unavailable: Unavailable
no_name: No name
- LTU:
+ alarm:
+ home: Casa
+ away: Fuori di Casa
+ night: Notte
+ vacation: Vacanza
+ bypass: Bypass
+ disarm: Disarmato
+ settings:
+ reboot: Riavvio
+ sleep: Modalità ECO
+ brightness: LuminositÃ
+ bright: Modalità Luminosa
+ dimming: Regolazione
+ dim: Reg.
+ lt: #Lithuanian
weekdays:
mon: Pirmadienis
tue: Antradienis
@@ -4601,7 +4796,21 @@ variables:
please_confirm: PraÅĄome patvirtinti
unavailable: Unavailable
no_name: No name
- LVA:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ lv: #Latvian
weekdays:
mon: Pirmdiena
tue: Otrdiena
@@ -4658,64 +4867,21 @@ variables:
please_confirm: LÅĢdzu, apstipriniet
unavailable: Unavailable
no_name: No name
- NLD:
- weekdays:
- mon: Maandag
- tue: Dinsdag
- wed: Woensdag
- thu: Donderdag
- fri: Vrijdag
- sat: Zaterdag
- sun: Zondag
- weekdays_short:
- mon: Mon
- tue: Tue
- wed: Wed
- thu: Thu
- fri: Fri
- sat: Sat
- sun: Sun
- months:
- jan: January
- feb: February
- mar: March
- apr: April
- may: May
- jun: June
- jul: July
- aug: August
- sep: September
- oct: October
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: May
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Oct
- nov: Nov
- dec: Dec
- relative_day:
- today: Vandaag
- tomorrow: Morgen
- in_2_days: in 2 dagen
- in_3_days: in 3 dagen
- in_4_days: in 4 dagen
- climate:
- states:
- "on": aan
- "off": uit
- heat: verwarm
- please_confirm: Bevestig alstublieft
- unavailable: Unavailable
- no_name: No name
- NOR: #Norwegian
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ nb: #Norwegian
weekdays:
mon: Mandag
tue: Tirsdag
@@ -4772,7 +4938,92 @@ variables:
please_confirm: Vennligst bekreft
unavailable: Unavailable
no_name: No name
- POL: #Polish
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ nl: #Dutch
+ weekdays:
+ mon: Maandag
+ tue: Dinsdag
+ wed: Woensdag
+ thu: Donderdag
+ fri: Vrijdag
+ sat: Zaterdag
+ sun: Zondag
+ weekdays_short:
+ mon: Ma
+ tue: Di
+ wed: Wo
+ thu: Do
+ fri: Vr
+ sat: Za
+ sun: Zo
+ months:
+ jan: Januari
+ feb: Februari
+ mar: Maart
+ apr: April
+ may: Mei
+ jun: Juni
+ jul: Juli
+ aug: Augustus
+ sep: September
+ oct: Oktober
+ nov: November
+ dec: December
+ months_short:
+ jan: Jan
+ feb: Feb
+ mar: Mar
+ apr: Apr
+ may: Mei
+ jun: Jun
+ jul: Jul
+ aug: Aug
+ sep: Sep
+ oct: Okt
+ nov: Nov
+ dec: Dec
+ relative_day:
+ today: Vandaag
+ tomorrow: Morgen
+ in_2_days: Overmorgen
+ in_3_days: Over 3 dagen
+ in_4_days: Over 4 dagen
+ climate:
+ states:
+ "on": aan
+ "off": uit
+ heat: verwarm
+ please_confirm: Bevestig
+ unavailable: Niet beschikbaar
+ no_name: Geen naam
+ alarm:
+ home: Thuis
+ away: Weg
+ night: Nacht
+ vacation: Vakantie
+ bypass: Omzeil
+ disarm: Ontgrendel
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ pl: #Polish
weekdays:
mon: PoniedziaÅek
tue: Wtorek
@@ -4829,7 +5080,21 @@ variables:
please_confirm: ProszÄ o potwierdzenie
unavailable: NiedostÄpny
no_name: Bez nazwy
- PRT: #Portuguese
+ alarm:
+ home: Dom
+ away: Poza domem
+ night: Noc
+ vacation: Wakacje
+ bypass: Bypass
+ disarm: Rozbojenie
+ settings:
+ reboot: Restartuj
+ sleep: Usypianie
+ brightness: JasnoÅÄ
+ bright: Jasny
+ dimming: Åciemnianie
+ dim: Ciemny
+ pt: #Portuguese
weekdays:
mon: Segunda-feira
tue: Terça-feira
@@ -4854,7 +5119,7 @@ variables:
may: Maio
jun: Junho
jul: Julho
- aug: Augosto
+ aug: Agosto
sep: Setembro
oct: Outubro
nov: Novembro
@@ -4886,7 +5151,21 @@ variables:
please_confirm: Confirme, por favor
unavailable: IndisponÃvel
no_name: Sem nome
- ROU:
+ alarm:
+ home: Em casa
+ away: Ausente
+ night: Noturno
+ vacation: FÊrias
+ bypass: Personalizado
+ disarm: Desarmar
+ settings:
+ reboot: Reiniciar
+ sleep: Dormir
+ brightness: Brilho
+ bright: Normal
+ dimming: Escurecer
+ dim: Escuro
+ ro: #Romanian
weekdays:
mon: Luni
tue: MarČi
@@ -4943,7 +5222,21 @@ variables:
please_confirm: VÄ rugÄm sÄ confirmaČi
unavailable: Unavailable
no_name: No name
- RUS:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ ru: #Russian
weekdays:
mon: ĐĐžĐŊĐĩĐ´ĐĩĐģŅĐŊиĐē
tue: ĐŅĐžŅĐŊиĐē
@@ -5000,7 +5293,21 @@ variables:
please_confirm: ĐĐžĐļĐ°ĐģŅĐšŅŅĐ°, ĐŋОдŅвĐĩŅдиŅĐĩ
unavailable: Unavailable
no_name: No name
- SVK:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ sk: #Slovak
weekdays:
mon: Pondelok
tue: Utorok
@@ -5057,7 +5364,21 @@ variables:
please_confirm: PotvrÄte, prosÃm
unavailable: Unavailable
no_name: No name
- SVN:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ sl: #Slovenian
weekdays:
mon: Ponedeljek
tue: Torek
@@ -5067,24 +5388,24 @@ variables:
sat: Sobota
sun: Nedelja
weekdays_short:
- mon: Mon
- tue: Tue
- wed: Wed
- thu: Thu
- fri: Fri
- sat: Sat
- sun: Sun
+ mon: Pon
+ tue: Tor
+ wed: Sre
+ thu: Äet
+ fri: Pet
+ sat: Sob
+ sun: Ned
months:
- jan: January
- feb: February
- mar: March
+ jan: Januar
+ feb: Februar
+ mar: Marec
apr: April
- may: May
- jun: June
- jul: July
- aug: August
+ may: Maj
+ jun: Junij
+ jul: Julij
+ aug: Avgust
sep: September
- oct: October
+ oct: Oktober
nov: November
dec: December
months_short:
@@ -5092,12 +5413,12 @@ variables:
feb: Feb
mar: Mar
apr: Apr
- may: May
+ may: Maj
jun: Jun
jul: Jul
- aug: Aug
+ aug: Avg
sep: Sep
- oct: Oct
+ oct: Okt
nov: Nov
dec: Dec
relative_day:
@@ -5114,7 +5435,21 @@ variables:
please_confirm: Prosimo, potrdite
unavailable: Unavailable
no_name: No name
- SWE: #Swedish
+ alarm:
+ home: Doma
+ away: Odsoten
+ night: NoÄ
+ vacation: Dopust
+ bypass: ObmoÄje izlopljeno
+ disarm: Izklop
+ settings:
+ reboot: Ponovni zagon
+ sleep: Spanje
+ brightness: Osvetlitev
+ bright: Svetlo
+ dimming: Zatemnitev
+ dim: Zatemnjeno
+ sv: #Swedish
weekdays:
mon: MÃĨndag
tue: Tisdag
@@ -5171,7 +5506,21 @@ variables:
please_confirm: Vänligen bekräfta
unavailable: Otillgänglig
no_name: Inget namn
- TUR:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ tr: #Turkish
weekdays:
mon: Pazartesi
tue: SalÄą
@@ -5228,7 +5577,21 @@ variables:
please_confirm: LÃŧtfen onaylayÄąn
unavailable: Unavailable
no_name: No name
- UKR:
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
+ uk: #Ukrainian
weekdays:
mon: ĐĐžĐŊĐĩĐ´ŅĐģĐžĐē
tue: ĐŅвŅĐžŅĐžĐē
@@ -5285,6 +5648,20 @@ variables:
please_confirm: ĐŅĐ´Ņ ĐģĐ°ŅĐēĐ°, ĐŋŅĐ´ŅвĐĩŅĐ´ŅŅŅ
unavailable: Unavailable
no_name: No name
+ alarm:
+ home: home
+ away: away
+ night: night
+ vacation: vacation
+ bypass: bypass
+ disarm: disarm
+ settings:
+ reboot: Reboot
+ sleep: Sleep
+ brightness: Brightness
+ bright: Bright
+ dimming: Dimming
+ dim: Dim
##### WEATHER ####
weather_entity_tmp: !input 'weather_entity' # used only during the creation of weather in variables
@@ -5294,113 +5671,61 @@ variables:
{% endif %}
temperature_units: "°"
- ##### Home page #####
- page_home:
- buttons: ### Feature Buttons ###
- - icon: "" # NOT IN USE
- color_rgb:
- "on": "" # NOT IN USE
- "off": "" # NOT IN USE
- - icon: "" # NOT IN USE
- color_rgb:
- "on": "" # NOT IN USE
- "off": "" # NOT IN USE
- - icon: "" # NOT IN USE
- color_rgb:
- "on": "" # NOT IN USE
- "off": "" # NOT IN USE
- - icon: !input 'home_button04_icon' #E1ED
- color_rgb:
- "on": !input 'home_button04_icon_color01'
- "off": !input 'home_button04_icon_color02'
- - icon: !input 'home_button05_icon' #E432
- color_rgb:
- "on": !input 'home_button05_icon_color'
- "off": "" # NOT IN USE
- - icon: !input 'home_button06_icon' #EDCF
- color_rgb:
- "on": !input 'home_button06_icon_color'
- "off": "" # NOT IN USE
- - icon: "" # NOT IN USE
- color_rgb:
- "on": "" # NOT IN USE
- "off": "" # NOT IN USE
- general:
- outdoor_temp:
- label:
- color_rgb: !input 'home_outdoor_temp_label_color'
- indoor_temp:
- icon:
- icon: !input 'home_indoor_temp_icon' #E50E
- color_rgb: !input 'home_indoor_temp_icon_color'
- label:
- color_rgb: !input 'home_indoor_temp_label_color'
- time:
- label:
- color_rgb: !input 'time_label_color'
- date:
- label:
- color_rgb: !input 'date_label_color'
- hardware:
- buttons: #### HARDWARE BUTTONS #####
- left:
- entity: !input 'left_button_entity'
- name: !input 'left_button_name'
- color_rgb: !input 'left_button_color'
- hold_select: !input 'left_button_hold_select'
- #custom_action: !input 'left_button_hold_custom_action'
- right:
- entity: !input 'right_button_entity'
- name: !input 'right_button_name'
- color_rgb: !input 'right_button_color'
- hold_select: !input 'right_button_hold_select'
- #custom_action: !input 'right_button_hold_custom_action'
##### Climate page #####
page_climate:
buttons:
hvac_mode:
- mode: auto
- icon: calendar-sync
- color: green
+ icon: calendar-sync #ee8d
+ color: green #'19818'
component: button01
- mode: heat_cool
- icon: autorenew
- color: amber
+ icon: autorenew #e069
+ color: amber #'65024'
component: button02
- mode: heat
- icon: fire
- color: deep-orange
+ icon: fire #e237
+ color: deep-orange #'64164'
component: button03
- mode: cool
- icon: snowflake
- color: blue
+ icon: snowflake #e716
+ color: blue #'1055'
component: button04
- mode: dry
- icon: water-percent
- color: orange
+ icon: water-percent #e58d
+ color: orange #'64704'
component: button05
- mode: fan_only
- icon: fan
- color: cyan
+ icon: fan #e20f
+ color: cyan #'1530'
component: button06
- mode: "off"
- icon: power
- color: "off"
+ icon: power #e424
+ color: "off" #'35921'
component: button07
- qrcode_enabled: !input 'qrcode_enabled'
###### SYNC SETTINGS #####
delay_value: !input 'delay'
##### GENERAL ENTITYS #####
- outdoortemp: !input 'outdoortemp'
- indoortemp: !input 'indoortemp'
climate: !input 'climate'
- relay_1_local_fallback: !input 'relay_1_local_fallback'
- relay_2_local_fallback: !input 'relay_2_local_fallback'
-
- ##### ENTITIES #####
- entitypages_enabled: !input 'entitypages_enabled'
+ embedded_climate: '{{ climate == thermostat_embedded }}'
+ indoor_temperature_sensor: !input 'indoortemp'
+ embedded_indoor_temperature: '{{ indoor_temperature_sensor == nspaneltemp or not (indoor_temperature_sensor is string and indoor_temperature_sensor is match "sensor.")}}'
+ alarm: !input 'alarm'
+
+ enum:
+ color_mode: # Possible light color modes. - https://github.com/home-assistant/core/blob/dev/homeassistant/components/light/__init__.py
+ unknown: "[]"
+ onoff: "[]"
+ brightness: "[]"
+ color_temp: "[]"
+ hs: "[]"
+ xy: "[]"
+ rgb: "[]"
+ rgbw: "[]"
+ rgbww: "[]"
+ white: "[]"
#############################################################
##### CLOSE - Variables #####
@@ -5414,12 +5739,13 @@ variables:
trigger:
##### Trigger - General #################################################################################################################
- ##### settings_entity - Trigger 'settings_entity' #####
- - platform: event
- event_type: state_changed
+
+ ##### Panel Event - This is the new main event handler introduced on v4.0 to get info from the panel #####
+ - id: nspanel_event
+ platform: event
+ event_type: esphome.nspanel_ha_blueprint
event_data:
- entity_id: '{{ settings_entity }}'
- id: settings_entity
+ device_id: !input 'nspanel_name'
##### Reboot - Trigger 'nspanel_boot_init' #####
- platform: template
@@ -5428,17 +5754,13 @@ trigger:
seconds: 1
id: nspanel_boot_init
- ##### NSPanel event changed #####
- - platform: event
- event_type: state_changed
- event_data:
- entity_id: '{{ nspanelevent }}'
- id: nspanelevent_changed
-
- ##### Automation reload
+ ##### Automation reload or HA started
- platform: event
event_type: automation_reloaded
id: automation_reloaded
+ - platform: homeassistant
+ event: start
+ id: ha_started
##### Trigger - Buttons - State change #################################################################################################################
##### Button01 Sync - Trigger 'current_state_entity01' #####
@@ -5854,6 +6176,14 @@ trigger:
entity_id: '{{ relay02_entity }}'
id: relay02_state
+ ##### Trigger - Alarm Control Panel - State change #################################################################################################################
+ ##### Alarm - Trigger 'alarm_state' #####
+ - platform: event
+ event_type: state_changed
+ event_data:
+ entity_id: !input 'alarm'
+ id: alarm_state
+
##### Trigger - Climate - State change #################################################################################################################
##### Climate - Trigger 'climate_state' #####
- platform: event
@@ -5908,34 +6238,8 @@ trigger:
- unavailable
id: climate_button09_state
- ##### Trigger - Notifications #################################################################################################################
-
- ##### Notification Text - Trigger 'notification_text_state' #####
- - platform: event
- event_type: state_changed
- event_data:
- entity_id: '{{ notification_text }}'
- id: notification_text_state
-
- ##### Notification Text - Trigger 'notification_text_state' #####
- - platform: event
- event_type: state_changed
- event_data:
- entity_id: '{{ notification_unread }}'
- id: notification_unread_state
-
##### Trigger - Hardware buttons #################################################################################################################
- ##### Left Button - Trigger 'left_button_press' #####
- - platform: template
- value_template: '{{ is_state(left_button, "on") | default(false) if left_button is string else false }}'
- id: left_button_press
-
- ##### Right Button - Trigger 'right_button_press' #####
- - platform: template
- value_template: '{{ is_state(right_button, "on") | default(false) if right_button is string else false }}'
- id: right_button_press
-
##### Left Button - State 'left_button_state' #####
- platform: state
entity_id: !input 'left_button_entity'
@@ -5975,13 +6279,6 @@ trigger:
entity_id: !input 'indoortemp'
id: indoortemp_state
- ##### NSPAnel Temp Sensor - Trigger 'nspaneltemp_state' #####
- - platform: event
- event_type: state_changed
- event_data:
- entity_id: '{{ nspaneltemp }}'
- id: nspaneltemp_state
-
##### Trigger - Weather #################################################################################################################
#### Weather state changed #######
- platform: event
@@ -6013,21 +6310,28 @@ trigger:
condition:
- '{{ is_state(nextion_inited, "on") | default(false) if nextion_inited is string else false }}'
- - condition: or
+ - condition: or # Do not update values when page home is not visible
conditions:
- condition: not
conditions:
- condition: trigger
id:
- - trigger_entitypage01
+ - home_value01_state
+ - home_value02_state
+ - home_value03_state
+ - '{{ page.current == page.home }}'
+ - condition: or # Do not update values when page entities is not visible
+ conditions:
+ - condition: not
+ conditions:
+ - condition: trigger
+ id:
+ - trigger_entitypage01
- trigger_entitypage02
- trigger_entitypage03
- trigger_entitypage04
- - '{{ page.entitypages[0] in states(nspanelevent) }}'
- - '{{ page.entitypages[1] in states(nspanelevent) }}'
- - '{{ page.entitypages[2] in states(nspanelevent) }}'
- - '{{ page.entitypages[3] in states(nspanelevent) }}'
- - condition: or
+ - '{{ page.current in page.entitypages }}'
+ - condition: or # Do not update values when page climate is not visible
conditions:
- condition: not
conditions:
@@ -6039,7 +6343,14 @@ condition:
- climate_value04_state
- climate_button08_state
- climate_button09_state
- - '{{ page.climate in states(nspanelevent) }}'
+ - '{{ page.current == page.climate }}'
+ - condition: or
+ conditions:
+ - condition: not
+ conditions:
+ - condition: trigger
+ id: indoortemp_state
+ - '{{ not embedded_indoor_temperature }}'
#############################################################
##### START - Action #####
@@ -6047,202 +6358,279 @@ condition:
action:
- alias: Main choices
choose:
- ##### JUMP TO - settings page lightsettings /coversettings / climate (SETTINGS ENTITY CHANGED) #####
- - alias: 'Jump to light/cover/climate settings page'
+ ##### DATE #####
+ - alias: 'Date'
conditions:
- condition: trigger
- id: settings_entity
- - '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
+ id: time_state
sequence:
- - &variables-settings_entity
- variables:
- settings_entity_state: >
- {{
- states(settings_entity)
- if settings_entity is string
- else "unknown"
- }}
- settings_entity_dict: >
- {{
- settings_entity_state
- if settings_entity_state is mapping
- else { "page": "home", "entity": "unknown" }
- }}
- settings_entity_domain: >
+ ##### NSPanel Date #####
+ - &refresh-date
+ service: '{{ nextion.command.text_printf }}'
+ data:
+ component: home.date
+ message: >
{{
- settings_entity_dict.entity.split(".")[0]
- if
- settings_entity_dict.entity is defined and
- settings_entity_dict.entity is string and
- settings_entity_dict.entity.split(".") | count > 0
- else "unknown"
+ as_timestamp(now())
+ | timestamp_custom
+ (
+ date_format
+ | replace("%A", (dict.values(mui[language].weekdays) | list)[now().weekday()])
+ | replace("%a", (dict.values(mui[language].weekdays_short) | list)[now().weekday()])
+ | replace("%B", (dict.values(mui[language].months) | list)[now().month-1])
+ | replace("%b", (dict.values(mui[language].months_short) | list)[now().month-1])
+ )
}}
- - if: '{{ settings_entity_domain in ["light", "cover", "climate"] }}'
- then:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page[settings_entity_domain] }}'
- continue_on_error: true
- - &delay-default
- delay:
- milliseconds: '{{ delay_value }}'
- - service: '{{ nextion.command.printf }}' # This can be moved to TFT on the 3 settings pages (and why not all pages?) and reduce the load from Blueprint comms
- data:
- cmd: 'dim=home.brightness.val'
- continue_on_error: true
+ continue_on_error: true
- ##### DATE AND TIME #####
- - alias: 'Date & Time'
+ ##### Boot detected #####
+ - alias: Boot init
conditions:
- condition: trigger
- id: time_state
+ id: nspanel_boot_init
sequence:
- - &refresh-datetime
+ - &global_settings
if: '{{ true }}'
then:
- ##### NSPanel Date #####
- ### DATE Font Color ###
- - service: '{{ nextion.command.font_color }}'
+ - &variables_hardware
+ variables:
+ hardware:
+ buttons:
+ left:
+ entity: !input 'left_button_entity'
+ name: !input 'left_button_name'
+ color_rgb: !input 'left_button_color'
+ hold_select: !input 'left_button_hold_select'
+ #custom_action: !input 'left_button_hold_custom_action'
+ right:
+ entity: !input 'right_button_entity'
+ name: !input 'right_button_name'
+ color_rgb: !input 'right_button_color'
+ hold_select: !input 'right_button_hold_select'
+ #custom_action: !input 'right_button_hold_custom_action'
+ relays:
+ relay1:
+ icon: !input 'relay01_icon' #E3A5
+ icon_color_rgb: !input 'relay01_icon_color'
+ relay2:
+ icon: !input 'relay02_icon' #E3A8
+ icon_color_rgb: !input 'relay02_icon_color'
+
+ - &variables-home_buttons
+ variables:
+ bt_notific:
+ icon: !input 'home_button04_icon' #E1ED
+ color_normal: !input 'home_button04_icon_color01'
+ color_unread: !input 'home_button04_icon_color02'
+ bt_entities:
+ enabled: !input 'entitypages_enabled'
+ icon: !input 'home_button06_icon' #EDCF
+ color_rgb: !input 'home_button06_icon_color'
+ bt_qrcode:
+ enabled: !input 'qrcode_enabled'
+ icon: !input 'home_button05_icon' #E432
+ color_rgb: !input 'home_button05_icon_color'
+ title: !input 'qrcode_label'
+ qrcode: !input 'qrcode_value'
+
+ - &variables-date_time
+ variables:
+ display:
+ date:
+ format:
+ color_rgb: !input 'date_label_color'
+ time:
+ format: !input 'time_format'
+ color_rgb: !input 'time_label_color'
+
+ - service: '{{ nextion.command.page_home }}'
data:
- component: home.date
- message: >
+ notification_icon: >
{{
- page_home.general.date.label.color_rgb
- if is_number(page_home.general.date.label.color_rgb)
- else ((page_home.general.date.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.date.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.date.label.color_rgb[2] //(2**3))
+ all_icons[bt_notific.icon.split(":")[1]] | default(bt_notific.icon
+ if bt_notific.icon is string
+ else all_icons["email"])
}}
- continue_on_error: true
- - *delay-default
- ### DATE Font ###
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.date
- message: >
+ notification_icon_color_normal: '{{ [ bt_notific.color_normal ] if is_number(bt_notific.color_normal) else bt_notific.color_normal }}'
+ notification_icon_color_unread: '{{ [ bt_notific.color_unread ] if is_number(bt_notific.color_unread) else bt_notific.color_unread }}'
+ qrcode: '{{ bt_qrcode.enabled }}'
+ qrcode_icon: >
{{
- as_timestamp(now())
- | timestamp_custom
- (
- date_format
- | replace("%A", (dict.values(mui[language].weekdays) | list)[now().weekday()])
- | replace("%a", (dict.values(mui[language].weekdays_short) | list)[now().weekday()])
- | replace("%B", (dict.values(mui[language].months) | list)[now().month-1])
- | replace("%b", (dict.values(mui[language].months_short) | list)[now().month-1])
- )
+ all_icons[bt_qrcode.icon.split(":")[1]] | default(bt_qrcode.icon
+ if bt_qrcode.icon is string
+ else all_icons["format-list-bulleted-square"])
}}
- continue_on_error: true
- ##### NSPanel Time #####
- ### TIME Font Color ###
- - *delay-default
- - service: '{{ nextion.command.font_color }}'
- data:
- component: home.time
- message: >
+ qrcode_icon_color: '{{ [ bt_qrcode.color_rgb ] if is_number(bt_qrcode.color_rgb) else bt_qrcode.color_rgb }}'
+ entities_pages: '{{ bt_entities.enabled }}'
+ entities_pages_icon: >
+ {{
+ all_icons[bt_entities.icon.split(":")[1]] | default(bt_entities.icon
+ if bt_entities.icon is string
+ else all_icons["format-list-bulleted-square"])
+ }}
+ entities_pages_icon_color: '{{ [ bt_entities.color_rgb ] if is_number(bt_entities.color_rgb) else bt_entities.color_rgb }}'
+ alarm_state: >
{{
- page_home.general.time.label.color_rgb
- if is_number(page_home.general.time.label.color_rgb)
- else ((page_home.general.time.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.time.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.time.label.color_rgb[2] //(2**3))
+ states(alarm) | default("")
+ if alarm is string and alarm | length > 0
+ else ""
}}
continue_on_error: true
- ### TIME Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
+ - &delay-default
+ delay:
+ milliseconds: '{{ delay_value }}'
+
+ - service: '{{ nextion.command.qrcode }}'
data:
- component: home.time
- message: '{{ time }}'
+ title: '{{ bt_qrcode.title }}'
+ qrcode: '{{ bt_qrcode.qrcode }}'
+ show: false
continue_on_error: true
- - if: '{{ meridiem }}'
- then:
- ### TIME Meridiem Font Color ###
- - *delay-default
- - service: '{{ nextion.command.font_color }}'
- data:
- component: home.meridiem
- message: >
- {{
- page_home.general.time.label.color_rgb
- if is_number(page_home.general.time.label.color_rgb)
- else ((page_home.general.time.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.time.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.time.label.color_rgb[2] //(2**3))
- }}
- continue_on_error: true
- ### TIME Meridiem Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.meridiem
- message: '{{ meridiem }}'
- continue_on_error: true
-
- ##### BOOT NSPANEL - boot init #####
- - alias: Boot init
- conditions:
- - condition: trigger
- id: nspanel_boot_init
- - '{{ nspanel_event.page != page.home or (is_state(settings_entity, ["unavailable", "unknown", "", None]) | default(False) if settings_entity is string else False) }}'
- sequence:
- ##### NSPanel boot init only #####
- - delay:
- milliseconds: 100
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: boot.bluep_version
- message: '{{ blueprint_version }}'
- continue_on_error: true
-
- ###### Set local fallback ######
- - service: 'switch.turn_{{ "on" if relay_1_local_fallback else "off" }}'
- data:
- entity_id: "switch.{{ nspanel_name }}_relay_1_local_fallback"
- continue_on_error: true
- - service: 'switch.turn_{{ "on" if relay_2_local_fallback else "off" }}'
- data:
- entity_id: "switch.{{ nspanel_name }}_relay_2_local_fallback"
- continue_on_error: true
-
- ##### clear notification icon #####
- - service: '{{ nextion.command.notification_clear }}'
- data: {}
- continue_on_error: true
+ - *delay-default
- ###### NSPanel beep ######
- - delay:
- milliseconds: 2000
- - if: '{{ is_state(notification_sound, "on") }}'
- then:
- - service: '{{ nextion.command.play_rtttl }}'
+ - service: '{{ nextion.command.page_settings}}'
data:
- song_str: 'two short:d=4,o=5,b=100:16e6,16e6'
+ reboot: '{{ mui[language].settings.reboot }}'
+ sleep_mode: '{{ mui[language].settings.sleep }}'
+ brightness: '{{ mui[language].settings.brightness }}'
+ bright: '{{ mui[language].settings.bright }}'
+ dim: '{{ mui[language].settings.dim }}'
continue_on_error: true
+ - *delay-default
- ##### Update Date & Time before showing the Home page #####
- - *refresh-datetime
+ - service: '{{ nextion.command.global_settings }}'
+ data:
+ blueprint_version: '{{ blueprint_version }}'
+ relay1_local_control: '{{ hardware.buttons.left.entity == relay01_entity }}'
+ relay1_icon: >
+ {{
+ all_icons[hardware.relays.relay1.icon.split(":")[1]] | default("\uE3A5")
+ if hardware.relays.relay1.icon.split(":") | count > 0
+ else
+ (
+ hardware.relays.relay1.icon
+ if hardware.relays.relay1.icon is string
+ else "\uE3A5"
+ )
+ }}
+ relay1_icon_color: >
+ {{
+ hardware.relays.relay1.icon_color_rgb
+ if is_number(hardware.relays.relay1.icon_color_rgb)
+ else ((hardware.relays.relay1.icon_color_rgb[0] //(2**3)) *(2**11))+((hardware.relays.relay1.icon_color_rgb[1] //(2**2)) *(2**5))+(hardware.relays.relay1.icon_color_rgb[2] //(2**3))
+ }}
+ relay2_local_control: '{{ hardware.buttons.right.entity == relay02_entity }}'
+ relay2_icon: >
+ {{
+ all_icons[hardware.relays.relay2.icon.split(":")[1]] | default("\uE3A8")
+ if hardware.relays.relay2.icon.split(":") | count > 0
+ else
+ (
+ hardware.relays.relay2.icon
+ if hardware.relays.relay2.icon is string
+ else "\uE3A8"
+ )
+ }}
+ relay2_icon_color: >
+ {{
+ hardware.relays.relay2.icon_color_rgb
+ if is_number(hardware.relays.relay2.icon_color_rgb)
+ else ((hardware.relays.relay2.icon_color_rgb[0] //(2**3)) *(2**11))+((hardware.relays.relay2.icon_color_rgb[1] //(2**2)) *(2**5))+(hardware.relays.relay2.icon_color_rgb[2] //(2**3))
+ }}
+ date_color: >
+ {{
+ display.date.color_rgb
+ if is_number(display.date.color_rgb)
+ else ((display.date.color_rgb[0] //(2**3)) *(2**11))+((display.date.color_rgb[1] //(2**2)) *(2**5))+(display.date.color_rgb[2] //(2**3))
+ }}
+ time_format: '{{ display.time.format }}'
+ time_color: >
+ {{
+ display.time.color_rgb
+ if is_number(display.time.color_rgb)
+ else ((display.time.color_rgb[0] //(2**3)) *(2**11))+((display.time.color_rgb[1] //(2**2)) *(2**5))+(display.time.color_rgb[2] //(2**3))
+ }}
+ embedded_climate: '{{ embedded_climate }}'
+ embedded_indoor_temperature: '{{ embedded_indoor_temperature }}'
+ temperature_unit_is_fahrenheit: '{{ state_attr((nspaneltemp if embedded_indoor_temperature else indoor_temperature_sensor), "unit_of_measurement") | default("") in ["°F", "F"]}}'
+ mui_please_confirm: '{{ mui[language].please_confirm }}'
+ continue_on_error: true
+ - *delay-default
- ##### NSPanel boot init finished and jump to Home Page#####
- - *delay-default
- - &jump_page_home
- service: '{{ nextion.command.printf }}'
- data:
- cmd: "page {{ page.home }}"
- continue_on_error: true
+ ##### Update Date & Time before showing the Home page #####
+ - *refresh-date
##### NSPanel event #####
- - alias: NSPanel Event
+ - alias: NSPanel event
conditions:
- condition: trigger
- id: nspanelevent_changed
+ id: nspanel_event
sequence:
- - alias: NSPanel Event component changed
- choose:
+ - &variable_nspanel_event
+ variables:
+ nspanel_event: '{{ trigger.event.data }}'
+ - choose:
+ ##### BOOT NSPANEL - boot init #####
+ - alias: Boot init
+ conditions:
+ - '{{ nspanel_event.type == "boot"}}'
+ - '{{ nspanel_event.step is defined and nspanel_event.step in ["nextion_init", "timeout"]}}'
+ sequence:
+ - *global_settings
+
+ ##### Service call #####
+ - alias: NSPanel service call
+ conditions:
+ - '{{ nspanel_event.type == "service_call"}}'
+ - '{{ nspanel_event.service is defined and nspanel_event.service is string and nspanel_event.service | length > 0 }}'
+ - '{{ nspanel_event.service.split(".") | count == 2 }}' # prevents call to null service
+ - '{{ nspanel_event.service.split(".")[0] | length > 0 and nspanel_event.service.split(".")[0] not in ["null", None] }}' # prevents call to null service
+ - '{{ nspanel_event.service.split(".")[1] | length > 0 and nspanel_event.service.split(".")[1] not in ["null", None] }}' # prevents call to null service
+ - '{{ nspanel_event.service | length > (2+nspanel_event.service.index(".")) }}' # prevents call to null service
+ - '{{ nspanel_event.service is not match "alarm_control_panel." }}' # Prevent the use of this call for alarm control due to safety reasons
+ - '{{ nspanel_event.entity is defined and nspanel_event.entity is string and nspanel_event.entity | length > 0 }}'
+ sequence:
+ - if: '{{ nspanel_event.key is defined and nspanel_event.key is string and nspanel_event.key | length > 0 }}'
+ then:
+ - service: '{{ nspanel_event.service }}'
+ data: { "{{ nspanel_event.key }}": "{{ nspanel_event.value }}" }
+ target:
+ entity_id: '{{ nspanel_event.entity }}'
+ continue_on_error: true
+ else:
+ - service: '{{ nspanel_event.service }}'
+ target:
+ entity_id: '{{ nspanel_event.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 500
+ - service: homeassistant.update_entity
+ data:
+ entity_id: '{{ nspanel_event.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 1500
+ - service: homeassistant.update_entity
+ data:
+ entity_id: '{{ nspanel_event.entity }}'
+ continue_on_error: true
+
+ ##### Page changed #####
- alias: Page changed
- conditions: '{{ nspanel_event.component == "currentpage" }}'
+ conditions:
+ - '{{ nspanel_event.type == "page_changed"}}'
sequence:
- choose:
## PAGE HOME ##
- alias: Home page
conditions: '{{ nspanel_event.page == page.home }}'
sequence: &refresh_page_home
- - service: '{{ nextion.command.set_settings_entity }}'
+ ##### Set entity variable #####
+ - &set_entity_variable
+ service: '{{ nextion.command.text_printf }}'
data:
- entity: '{{ nspanel_event }}'
+ component: home.climate_entity
+ message: '{{ "embedded_climate" if climate == thermostat_embedded else climate }}'
continue_on_error: true
##### Weather Icon Home Page #####
@@ -6250,7 +6638,7 @@ action:
- &refresh-page_home-weather_pic
service: '{{ nextion.command.printf }}'
data:
- cmd: home.weather.pic={{ nextion.pic.weather[states(weather_entity) | default("unavailable") if weather_entity is string else "unavailable"] | default(None) }}
+ cmd: home.weather.pic={{ nextion.pic.weather[states(weather_entity) | default("unavailable") if weather_entity is string and has_value(weather_entity) else "unavailable"] | default(None) }}
continue_on_error: true
- &refresh-page_home-outdoor_temp
@@ -6258,10 +6646,11 @@ action:
then:
##### NSPanel Outdoor Temp #####
- variables:
+ outdoor_temp_entity: !input 'outdoortemp'
outdoor_temp_state: >
{{
- states(outdoortemp) | default("unavailable")
- if outdoortemp is string and outdoortemp is match "sensor."
+ states(outdoor_temp_entity, rounded=true) | default("unavailable")
+ if outdoor_temp_entity is string and outdoor_temp_entity is match "sensor." and has_value(outdoor_temp_entity)
else "unavailable"
}}
outdoor_temp: >
@@ -6272,17 +6661,15 @@ action:
}}
- if: '{{ is_number(outdoor_temp) }}'
then:
+ - variables:
+ outdoor_temp_color_rgb: !input 'home_outdoor_temp_label_color'
### LABEL Outdoor Temp Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: home.outdoor_temp
- message: >
- {{
- page_home.general.outdoor_temp.label.color_rgb
- if is_number(page_home.general.outdoor_temp.label.color_rgb)
- else ((page_home.general.outdoor_temp.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.outdoor_temp.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.outdoor_temp.label.color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ outdoor_temp_color_rgb ] if is_number(outdoor_temp_color_rgb) else outdoor_temp_color_rgb }}'
+ background: []
continue_on_error: true
### LABEL Outdoor Temp Font ###
- *delay-default
@@ -6293,41 +6680,44 @@ action:
continue_on_error: true
- &refresh-page_home-indoor_temp
- if: '{{ true }}'
+ if: '{{ not embedded_indoor_temperature }}'
then:
##### NSPanel Indoor Temp #####
- variables:
- indoor_temp_state: '{{ states(indoortemp) | default("unavailable") if indoortemp is string and indoortemp is match "sensor." else states(nspaneltemp) }}'
- indoor_temp_units: >
- {{
- state_attr(indoortemp, "unit_of_measurement") | default(temperature_units)
- if
- indoortemp is string and
- indoortemp is match "sensor." and
- state_attr(indoortemp, "unit_of_measurement") is string and
- state_attr(indoortemp, "unit_of_measurement") | length > 0
- else
- (
- state_attr(nspaneltemp, "unit_of_measurement") | default(temperature_units)
- if
- state_attr(nspaneltemp, "unit_of_measurement") is string and
- state_attr(nspaneltemp, "unit_of_measurement") | length > 0
- else temperature_units
- )
- }}
- - if: '{{ is_number(indoor_temp_state) }}'
+ indoor_temp:
+ state: '{{ states(indoor_temperature_sensor, rounded=true) | default("unavailable") if indoor_temperature_sensor is string and indoor_temperature_sensor is match "sensor." else states(nspaneltemp, rounded=true) }}'
+ units: >
+ {{
+ state_attr(indoor_temperature_sensor, "unit_of_measurement") | default(temperature_units)
+ if
+ indoor_temperature_sensor is string and
+ indoor_temperature_sensor is match "sensor." and
+ state_attr(indoor_temperature_sensor, "unit_of_measurement") is string and
+ state_attr(indoor_temperature_sensor, "unit_of_measurement") | length > 0
+ else
+ (
+ state_attr(nspaneltemp, "unit_of_measurement") | default(temperature_units)
+ if
+ state_attr(nspaneltemp, "unit_of_measurement") is string and
+ state_attr(nspaneltemp, "unit_of_measurement") | length > 0
+ else temperature_units
+ )
+ }}
+ icon:
+ icon: !input 'home_indoor_temp_icon' #E50E
+ color_rgb: !input 'home_indoor_temp_icon_color'
+ label:
+ color_rgb: !input 'home_indoor_temp_label_color'
+
+ - if: '{{ is_number(indoor_temp.state) }}'
then:
### ICON Indoor Temp Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: home.indoortempicon
- message: >
- {{
- page_home.general.indoor_temp.icon.color_rgb
- if is_number(page_home.general.indoor_temp.icon.color_rgb)
- else ((page_home.general.indoor_temp.icon.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.indoor_temp.icon.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.indoor_temp.icon.color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ indoor_temp.icon.color_rgb ] if is_number(indoor_temp.icon.color_rgb) else indoor_temp.icon.color_rgb }}'
+ background: []
continue_on_error: true
### ICON Indoor Temp Font ###
- *delay-default
@@ -6336,187 +6726,232 @@ action:
component: home.indoortempicon
message: >
{{
- all_icons[page_home.general.indoor_temp.icon.icon.split(":")[1]] | default(all_icons.unknown)
- if page_home.general.indoor_temp.icon.icon.split(":") | count > 0
+ all_icons[indoor_temp.icon.icon.split(":")[1]] | default(all_icons.unknown)
+ if indoor_temp.icon.icon.split(":") | count > 0
else
(
- page_home.general.indoor_temp.icon.icon
- if page_home.general.indoor_temp.icon.icon is string
+ indoor_temp.icon.icon
+ if indoor_temp.icon.icon is string
else all_icons.unknown
)
}}
continue_on_error: true
### LABEL Indoor Temp Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: home.current_temp
- message: >
- {{
- page_home.general.indoor_temp.label.color_rgb
- if is_number(page_home.general.indoor_temp.label.color_rgb)
- else ((page_home.general.indoor_temp.label.color_rgb[0] //(2**3)) *(2**11))+((page_home.general.indoor_temp.label.color_rgb[1] //(2**2)) *(2**5))+(page_home.general.indoor_temp.label.color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ indoor_temp.label.color_rgb ] if is_number(indoor_temp.label.color_rgb) else indoor_temp.label.color_rgb }}'
+ background: []
continue_on_error: true
### LABEL Indoor Temp Font ###
- *delay-default
- service: '{{ nextion.command.text_printf }}'
data:
component: home.current_temp
- message: '{{ indoor_temp_state | round(1) ~ indoor_temp_units }}'
+ message: '{{ indoor_temp.state | round(1) ~ indoor_temp.units }}'
continue_on_error: true
##### NSPanel Buttons #####
+ - *variables_hardware
- variables:
- left_button_state: '{{ states(page_home.hardware.buttons.left.entity) | default("unavailable") if page_home.hardware.buttons.left.entity is string else "unavailable" }}'
- right_button_state: '{{ states(page_home.hardware.buttons.right.entity) | default("unavailable") if page_home.hardware.buttons.right.entity is string else "unavailable" }}'
+ left_button_state: '{{ states(hardware.buttons.left.entity) | default("unavailable") if hardware.buttons.left.entity is string else "unavailable" }}'
+ right_button_state: '{{ states(hardware.buttons.right.entity) | default("unavailable") if hardware.buttons.right.entity is string else "unavailable" }}'
##### NSPanel Left Button Name #####
- - if: '{{ page_home.hardware.buttons.left.name | length > 0 }}'
+ - if: '{{ hardware.buttons.left.name | length > 0 }}'
then:
### LABEL Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: home.left_bt_text
- message: >
- {{
- page_home.hardware.buttons.left.color_rgb
- if is_number(page_home.hardware.buttons.left.color_rgb)
- else ((page_home.hardware.buttons.left.color_rgb[0] //(2**3)) *(2**11))+((page_home.hardware.buttons.left.color_rgb[1] //(2**2)) *(2**5))+(page_home.hardware.buttons.left.color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ hardware.buttons.left.color_rgb ] if is_number(hardware.buttons.left.color_rgb) else hardware.buttons.left.color_rgb }}'
+ background: []
continue_on_error: true
### LABEL Font ###
- *delay-default
- service: '{{ nextion.command.text_printf }}'
data:
component: home.left_bt_text
- message: '{{ page_home.hardware.buttons.left.name }}'
+ message: '{{ hardware.buttons.left.name }}'
continue_on_error: true
##### SET Left Hardware Button PIC on Home Page ####
- if: '{{ left_button_state not in ["unavailable", "unknown", "", None] }}'
then:
- - variables:
# Hardware Button PIC
- left_hardware_button_state: '{{ nextion.pic.hardware.button[left_button_state] | default(nextion.pic.hardware.button.off) }}'
- *delay-default
- service: '{{ nextion.command.printf }}'
data:
- cmd: home.left_bt_pic.pic={{ left_hardware_button_state }}
+ cmd: home.left_bt_pic.val={{ 1 if left_button_state in ["on", "open", "opened", "opening", "true", true, 1] else 0 }}
continue_on_error: true
##### NSPanel Right Button Name #####
- - if: '{{ page_home.hardware.buttons.right.name | length > 0 }}'
+ - if: '{{ hardware.buttons.right.name | length > 0 }}'
then:
### LABEL Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: home.right_bt_text
- message: >
- {{
- page_home.hardware.buttons.right.color_rgb
- if is_number(page_home.hardware.buttons.right.color_rgb)
- else ((page_home.hardware.buttons.right.color_rgb[0] //(2**3)) *(2**11))+((page_home.hardware.buttons.right.color_rgb[1] //(2**2)) *(2**5))+(page_home.hardware.buttons.right.color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ hardware.buttons.right.color_rgb ] if is_number(hardware.buttons.right.color_rgb) else hardware.buttons.right.color_rgb }}'
+ background: []
continue_on_error: true
### LABEL Font ###
- *delay-default
- service: '{{ nextion.command.text_printf }}'
data:
component: home.right_bt_text
- message: '{{ page_home.hardware.buttons.right.name }}'
+ message: '{{ hardware.buttons.right.name }}'
continue_on_error: true
##### SET Right Hardware Button PIC on Home Page #####
- if: '{{ right_button_state not in ["unavailable", "unknown", "", None] }}'
then:
- - variables:
# Hardware Button PIC
- right_hardware_button_state: '{{ nextion.pic.hardware.button[right_button_state] | default(nextion.pic.hardware.button.off) }}'
- *delay-default
- service: '{{ nextion.command.printf }}'
data:
- cmd: home.right_bt_pic.pic={{ right_hardware_button_state }}
+ cmd: home.right_bt_pic.val={{ 1 if right_button_state in ["on", "open", "opened", "opening", "true", true, 1] else 0 }}
continue_on_error: true
+ ###### Custom buttons ######
+ - &update-home_page-custom_buttons
+ if: '{{ true }}'
+ then:
+ - &variables-home_page-custom_buttons
+ variables:
+ home_page_custom_buttons:
+ - entity: !input home_custom_button01
+ icon: !input home_custom_button01_icon
+ component: button01
+ - entity: !input home_custom_button02
+ icon: !input home_custom_button02_icon
+ component: button02
+ - entity: !input home_custom_button03
+ icon: !input home_custom_button03_icon
+ component: button03
+ - repeat:
+ for_each: '{{ home_page_custom_buttons }}'
+ sequence: &display-home_page-custom_buttons
+ - if: '{{ repeat.item.entity is defined and repeat.item.entity is string and repeat.item.entity | length > 0 }}'
+ then:
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: '{{ repeat.item.component }}'
+ message: >
+ {% if repeat.item.icon | length > 0 %}
+ {{
+ all_icons[repeat.item.icon.split(":")[1]] | default(all_icons.unknown)
+ if repeat.item.icon.split(":") | count > 0
+ else repeat.item.icon
+ }}
+ {% elif repeat.item.entity and repeat.item.entity.split(".") | count > 1 %}
+ {{ nextion.icon.domain[repeat.item.entity.split(".")[0] if repeat.item.entity else "unknown"] }}
+ {% else %}{{ nextion.icon.domain.unknown }}
+ {% endif %}
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.show }}'
+ data:
+ component: '{{ repeat.item.component }}'
+ continue_on_error: true
+ else:
+ - service: '{{ nextion.command.hide }}'
+ data:
+ component: '{{ repeat.item.component }}'
+ continue_on_error: true
+ - *delay-default
+
+ ###### Climate chip ######
+ - &update-home_page-climate_chip
+ if: '{{ (not embedded_climate) and climate is string and climate is match "climate." }}'
+ then:
+ - if: '{{ has_value(climate) }}'
+ then:
+ - variables:
+ climate_state: '{{ states(climate) | default("unavailable") if climate is string else "unavailable" }}'
+ hvac_action: '{{ state_attr(climate, "hvac_action") | default("unavailable") if climate is string else "unavailable" }}'
+ climate_action: '{{ hvac_action if hvac_action not in ["unavailable", "unknown", "", None] else climate_state }}'
+ - *delay-default
+ - if: '{{ climate_action in ["off", "heating", "heat", "cooling", "cool", "dry", "fan", "fan_only", "heat_cool", "auto", "idle"] }}'
+ then:
+ ### ICON Font Color ###
+ - service: '{{ nextion.command.set_component_color }}'
+ data:
+ component: home.icon_top_03
+ foreground: >
+ {% if "off" in climate_action %}{{ nextion.color["off"] }}
+ {% elif "heating" in climate_action or "heat" in climate_action %}{{ nextion.color["deep-orange"]}}
+ {% elif "cooling" in climate_action or "cool" in climate_action %}{{ nextion.color["blue"] }}
+ {% elif "drying" in climate_action or "dry" in climate_action %}{{ nextion.color["orange"] }}
+ {% elif "fan" in climate_action or "fan_only" in climate_action %}{{ nextion.color["cyan"] }}
+ {% elif "heat_cool" in climate_action %}{{ nextion.color["amber"] }}
+ {% elif "auto" in climate_action %}{{ nextion.color["green"] }}
+ {% elif "idle" in climate_action %}{{ nextion.color["off"] }}
+ {% else %}{{ nextion.color["off"] }}
+ {% endif %}
+ background: []
+ continue_on_error: true
+ ### ICON Font ###
+ - *delay-default
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: home.icon_top_03
+ message: >
+ {% if "off" in climate_action %}{{ all_icons.blank }}
+ {% elif "heating" in climate_action or "heat" in climate_action %}{{ all_icons["thermometer-lines"] }}
+ {% elif "cooling" in climate_action or "cool" in climate_action %}{{ all_icons.snowflake }}
+ {% elif "drying" in climate_action or "dry" in climate_action %}{{ all_icons["water-percent"] }}
+ {% elif "fan" in climate_action or "fan_only" in climate_action %}{{ all_icons.fan }}
+ {% elif "heat_cool" in climate_action %}{{ all_icons.autorenew }}
+ {% elif "auto" in climate_action %}{{ all_icons["calendar-sync"] }}
+ {% elif "idle" in climate_action %}{{ all_icons.thermometer }}
+ {% else %}{{ all_icons.blank }}
+ {% endif %}
+ continue_on_error: true
+ else:
+ - &hide-home_page-climate_chip
+ service: '{{ nextion.command.text_printf }}'
+ data:
+ component: home.icon_top_03
+ message: '{{ all_icons.blank }}'
+ continue_on_error: true
+ else:
+ - *hide-home_page-climate_chip
+
###### Status bar ######
- &variables-home_page_status_bar
variables:
- climate_state: '{{ states(climate) | default("unavailable") if climate is string else "unavailable" }}'
- hvac_action: '{{ state_attr(climate, "hvac_action") | default("unavailable") if climate is string else "unavailable" }}'
- climate_action: '{{ hvac_action if hvac_action not in ["unavailable", "unknown", "", None] else climate_state }}'
home_page_status_bar:
- - entity: '{{ relay01_entity }}'
- icon: !input 'relay01_icon' #E3A5
- icon_color_rgb: !input 'relay01_icon_color'
- page: home
- component: icon_top_01
- - entity: '{{ relay02_entity }}'
- icon: !input 'relay02_icon' #E3A8
- icon_color_rgb: !input 'relay02_icon_color'
- page: home
- component: icon_top_02
- - entity: '{{ climate }}'
- icon: >
- {% if "off" in climate_action %}{{ all_icons.blank }}
- {% elif "heating" in climate_action or "heat" in climate_action %}{{ all_icons["thermometer-lines"] }}
- {% elif "cooling" in climate_action or "cool" in climate_action %}{{ all_icons.snowflake }}
- {% elif "drying" in climate_action or "dry" in climate_action %}{{ all_icons["water-percent"] }}
- {% elif "fan" in climate_action or "fan_only" in climate_action %}{{ all_icons.fan }}
- {% elif "heat_cool" in climate_action %}{{ all_icons.autorenew }}
- {% elif "auto" in climate_action %}{{ all_icons["calendar-sync"] }}
- {% elif "idle" in climate_action %}{{ all_icons.thermometer }}
- {% else %}{{ all_icons.blank }}
- {% endif %}
- icon_color_rgb: >
- {% if "off" in climate_action %}{{ nextion.color["off"] }}
- {% elif "heating" in climate_action or "heat" in climate_action %}{{ nextion.color["deep-orange"]}}
- {% elif "cooling" in climate_action or "cool" in climate_action %}{{ nextion.color["blue"] }}
- {% elif "drying" in climate_action or "dry" in climate_action %}{{ nextion.color["orange"] }}
- {% elif "fan" in climate_action or "fan_only" in climate_action %}{{ nextion.color["cyan"] }}
- {% elif "heat_cool" in climate_action %}{{ nextion.color["amber"] }}
- {% elif "auto" in climate_action %}{{ nextion.color["green"] }}
- {% elif "idle" in climate_action %}{{ nextion.color["off"] }}
- {% else %}{{ nextion.color["off"] }}
- {% endif %}
- page: home
- component: icon_top_03
- entity: !input 'chip01'
icon: !input 'chip01_icon'
icon_color_rgb: !input 'chip01_icon_color'
- page: home
component: icon_top_04
- entity: !input 'chip02'
icon: !input 'chip02_icon'
icon_color_rgb: !input 'chip02_icon_color'
- page: home
component: icon_top_05
- entity: !input 'chip03'
icon: !input 'chip03_icon'
icon_color_rgb: !input 'chip03_icon_color'
- page: home
component: icon_top_06
- entity: !input 'chip04'
icon: !input 'chip04_icon'
icon_color_rgb: !input 'chip04_icon_color'
- page: home
component: icon_top_07
- entity: !input 'chip05'
icon: !input 'chip05_icon'
icon_color_rgb: !input 'chip05_icon_color'
- page: home
component: icon_top_08
- entity: !input 'chip06'
icon: !input 'chip06_icon'
icon_color_rgb: !input 'chip06_icon_color'
- page: home
component: icon_top_09
- entity: !input 'chip07'
icon: !input 'chip07_icon'
icon_color_rgb: !input 'chip07_icon_color'
- page: home
component: icon_top_10
- repeat:
for_each: '{{ home_page_status_bar }}'
@@ -6528,7 +6963,6 @@ action:
repeat_item_state: '{{ states(repeat.item.entity) | default("unavailable") }}'
repeat_item_state_is_on: >
{{
- (repeat.item.component == "icon_top_03") or
(repeat_item_state is string and repeat_item_state in ["on", "open", "opening", "true", "True"]) or
(repeat_item_state is boolean and repeat_item_state)
}}
@@ -6538,33 +6972,34 @@ action:
{% elif repeat_item_state_is_on and state_attr(repeat.item.entity, "icon") | default("") not in ["unavailable", "unknown", "", None] %}
{{ all_icons[state_attr(repeat.item.entity, "icon").split(":")[1]] | default(all_icons.blank) }}
{% else %}
- {{ all_icons.blank }}
+ {{ all_icons.unknown }}
{% endif %}
+ - *delay-default
- if: '{{ repeat_item_state_is_on }}'
then:
### ICON Font Color ###
+ - service: '{{ nextion.command.set_component_color }}'
+ data:
+ component: 'home.{{ repeat.item.component }}'
+ foreground: '{{ [ repeat.item.icon_color_rgb ] if is_number(repeat.item.icon_color_rgb) else repeat.item.icon_color_rgb }}'
+ background: []
+ continue_on_error: true
+ ### ICON Font ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.text_printf }}'
data:
- component: '{{ repeat.item.page }}.{{ repeat.item.component }}'
- message: >
- {{
- repeat.item.icon_color_rgb
- if is_number(repeat.item.icon_color_rgb)
- else
- ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+
- (repeat.item.icon_color_rgb[2] //(2**3))
- }}
+ component: 'home.{{ repeat.item.component }}'
+ message: '{{ repeat_item_icon }}'
continue_on_error: true
- ### ICON Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: '{{ repeat.item.page }}.{{ repeat.item.component }}'
- message: '{{ repeat_item_icon }}'
- continue_on_error: true
- # {{ is_state(repeat.item.entity, "on") | default(False) if repeat.item.entity is string else "unavailable" }}
+ else:
+ - &hide-home_page-status_bar_chip
+ service: '{{ nextion.command.text_printf }}'
+ data:
+ component: 'home.{{ repeat.item.component }}'
+ message: '{{ all_icons.blank }}'
+ continue_on_error: true
+ else:
+ - *hide-home_page-status_bar_chip
##### HOME VALUE 01 - 03
- *delay-default
@@ -6593,24 +7028,17 @@ action:
for_each: '{{ home_page_values }}'
sequence:
- &display_value
- if: '{{ repeat.item.entity is string and repeat.item.entity is match "sensor." and states(repeat.item.entity) not in ["unavailable", "unknown", "", None] }}'
+ if: '{{ repeat.item.entity is string and repeat.item.entity is match "sensor." and has_value(repeat.item.entity) }}'
then:
- if: '{{ repeat.item.icon | length > 0 }}'
then:
### ICON Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: '{{ repeat.item.page }}.{{ repeat.item.component }}_icon'
- message: >
- {{
- repeat.item.icon_color_rgb
- if is_number(repeat.item.icon_color_rgb)
- else
- ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+
- (repeat.item.icon_color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ repeat.item.icon_color_rgb ] if is_number(repeat.item.icon_color_rgb) else repeat.item.icon_color_rgb }}'
+ background: []
continue_on_error: true
### ICON Font ###
- *delay-default
@@ -6618,33 +7046,28 @@ action:
data:
component: '{{ repeat.item.page }}.{{ repeat.item.component }}_icon'
message: >
- {% if repeat.item.icon is string %}
+ {% if repeat.item.icon is string and repeat.item.icon | length > 0 %}
{{
all_icons[repeat.item.icon.split(":")[1]] | default(all_icons.unknown)
if repeat.item.icon.split(":") | count > 0
else repeat.item.icon
}}
- {% else %}{{ all_icons.unknown }}
+ {% elif state_attr(repeat.item.entity, "icon") | default("") not in ["unavailable", "unknown", "", None] %}
+ {{ all_icons[state_attr(repeat.item.entity, "icon").split(":")[1]] | default(all_icons.unknown) }}
+ {% else %}{{ all_icons.blank }}
{% endif %}
continue_on_error: true
- variables:
- repeat_item_state: '{{ states(repeat.item.entity) | default("unavailable") }}'
+ repeat_item_state: '{{ states(repeat.item.entity, rounded=true) | default("unavailable") }}'
repeat_item_state_available: '{{ repeat_item_state not in ["unavailable", "unknown", "", None] }}'
- condition: '{{ repeat_item_state_available }}'
### LABEL Font Color ###
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: '{{ repeat.item.page }}.{{ repeat.item.component }}{{ "_state" if repeat.item.page == page.home }}'
- message: >
- {{
- repeat.item.label_color_rgb
- if is_number(repeat.item.label_color_rgb)
- else
- ((repeat.item.label_color_rgb[0] //(2**3)) *(2**11))+
- ((repeat.item.label_color_rgb[1] //(2**2)) *(2**5))+
- (repeat.item.label_color_rgb[2] //(2**3))
- }}
+ foreground: '{{ [ repeat.item.label_color_rgb ] if is_number(repeat.item.label_color_rgb) else repeat.item.label_color_rgb }}'
+ background: []
continue_on_error: true
### LABEL Font ###
- *delay-default
@@ -6653,137 +7076,20 @@ action:
component: '{{ repeat.item.page }}.{{ repeat.item.component }}{{ "_state" if repeat.item.page == page.home }}'
message: >
{{
- (repeat_item_state | round(1) ~ (state_attr(repeat.item.entity, "unit_of_measurement") | default("") if state_attr(repeat.item.entity, "unit_of_measurement") is string else ""))
+ (repeat_item_state ~ (state_attr(repeat.item.entity, "unit_of_measurement") | default("") if state_attr(repeat.item.entity, "unit_of_measurement") is string else ""))
if is_number(repeat_item_state)
else repeat_item_state
}}
continue_on_error: true
- ##### Set notify icon #####
- - &refresh-page_home-notifications_icon
- if: '{{ true }}'
- then:
- - variables:
- notification_unread_state: '{{ states(notification_unread) | default("unavailable") if notification_unread is string else "unavailable" }}'
- - condition: '{{ notification_unread_state in ["on", "off"] }}'
- - variables:
- notification_text_state: '{{ states(notification_text) | default(None) if notification_text is string else None }}'
- set_button04_icon: >
- {{
- all_icons[page_home.buttons[3].icon.split(":")[1]] | default(page_home.buttons[3].icon if page_home.buttons[3].icon is string else all_icons.unknown)
- if notification_unread_state == "on" and notification_text_state | length > 0
- else all_icons.blank
- }}
- set_button04_icon_font: >
- {{
- (
- page_home.buttons[3].color_rgb[notification_unread_state]
- if is_number(page_home.buttons[3].color_rgb[notification_unread_state])
- else
- ((page_home.buttons[3].color_rgb[notification_unread_state][0] //(2**3)) *(2**11))+
- ((page_home.buttons[3].color_rgb[notification_unread_state][1] //(2**2)) *(2**5))+
- (page_home.buttons[3].color_rgb[notification_unread_state][2] //(2**3))
- )
- if notification_unread_state in ["on", "off"] and notification_text_state | length > 0
- else nextion.color.grey_light
- }}
- ##### SET ICON Font - Notify #####
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.button04_icon
- message: '{{ set_button04_icon }}'
- continue_on_error: true
-
- ##### SET ICON Font Color - Notify #####
- - *delay-default
- - service: '{{ nextion.command.font_color }}'
- data:
- component: home.button04_icon
- message: '{{ set_button04_icon_font }}'
- continue_on_error: true
-
- ###### QR Code - Icon ######
- - *delay-default
- - if: '{{ qrcode_enabled == true }}'
- then: # Display QR code icon
- ### ICON Font Color ###
- - service: '{{ nextion.command.font_color }}'
- data:
- component: home.button05_icon
- message: >
- {{
- page_home.buttons[4].color_rgb.on
- if is_number(page_home.buttons[4].color_rgb.on)
- else
- ((page_home.buttons[4].color_rgb.on[0] //(2**3)) *(2**11))+
- ((page_home.buttons[4].color_rgb.on[1] //(2**2)) *(2**5))+
- (page_home.buttons[4].color_rgb.on[2] //(2**3))
- }}
- continue_on_error: true
- ### ICON Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.button05_icon
- message: >
- {{
- all_icons[page_home.buttons[4].icon.split(":")[1]] | default(page_home.buttons[4].icon
- if page_home.buttons[4].icon is string
- else all_icons.unknown)
- }}
- continue_on_error: true
- else: # Display blank icon
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.button05_icon
- message: '{{ all_icons.blank }}'
- continue_on_error: true
-
- ###### ENTITIES - Icon ######
- - *delay-default
- - if: '{{ entitypages_enabled }}'
- then: # Display entities icon
- ### ICON Font Color ###
- - service: '{{ nextion.command.font_color }}'
- data:
- component: home.button06_icon
- message: >
- {{
- page_home.buttons[5].color_rgb.on
- if is_number(page_home.buttons[5].color_rgb.on)
- else
- ((page_home.buttons[5].color_rgb.on[0] //(2**3)) *(2**11))+
- ((page_home.buttons[5].color_rgb.on[1] //(2**2)) *(2**5))+
- (page_home.buttons[5].color_rgb.on[2] //(2**3))
- }}
- continue_on_error: true
- ### ICON Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.button06_icon
- message: >
- {{
- all_icons[page_home.buttons[5].icon.split(":")[1]] | default(page_home.buttons[5].icon
- if page_home.buttons[5].icon is string
- else all_icons.unknown)
- }}
- continue_on_error: true
- else: # Display blank icon
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: home.button06_icon
- message: '{{ all_icons.blank }}'
- continue_on_error: true
-
## BUTTON PAGES 01 - 04 ##
- alias: Button pages
conditions: '{{ nspanel_event.page in page.buttonpages }}'
sequence: &refresh_page_buttonpage
- &variables-page_buttons
variables:
- button_page_index: '{{ (nspanel_event.page[-2:] | int(-1)) - 1 }}'
+ event_page: '{{ nspanel_event.page if nspanel_event is defined and nspanel_event.page is defined else page.current }}'
+ button_page_index: '{{ (event_page[-2:] | int(-1)) - 1 }}'
first_button: '{{ button_page_index * 8 }}'
last_button: '{{ first_button + 8 }}'
##### BUTTON Page Labels #####
@@ -7020,10 +7326,6 @@ action:
component: button08
- if: '{{ button_page_index >= 0 and button_page_index <= 3 }}'
then:
- - service: '{{ nextion.command.set_settings_entity }}'
- data:
- entity: '{{ nspanel_event }}'
- continue_on_error: true
##### Button Page Label #####
- if: '{{ button_pages_labels[button_page_index].label | length > 0 }}'
then:
@@ -7053,16 +7355,19 @@ action:
repeat.item.entity.split(".") | default([]) | count > 0
}}
then:
+ #- service: homeassistant.update_entity
+ # data:
+ # entity_id: '{{ repeat.item.entity }}'
+ # continue_on_error: true
- variables:
item_domain: '{{ repeat.item.entity.split(".")[0] | default("unknown") }}'
- # {{ states(entity_id) | default("unavailable") if entity_id is string else "unavailable" }}
current_entity_state: '{{ states(repeat.item.entity) | default("unavailable") }}'
current_entity_state_available: '{{ current_entity_state not in ["unavailable"] }}'
# Button PIC GRAY/WHITE
btn_pic: >
{{
nextion.pic.button.on
- if current_entity_state in ["on", "open", "opening", "home"]
+ if current_entity_state in ["on", "open", "opening", "home", "playing"]
or (item_domain == "climate" and current_entity_state != "off")
or (item_domain in ["button","input_button","scene"] and trigger.id is match "current_state_entity")
else nextion.pic.button.off
@@ -7071,35 +7376,23 @@ action:
btn_bg: >
{{
nextion.color.white
- if current_entity_state in ["on", "open", "opening", "home"]
+ if current_entity_state in ["on", "open", "opening", "home", "playing"]
or (item_domain == "climate" and current_entity_state != "off")
or (item_domain in ["button","input_button","scene"] and trigger.id is match "current_state_entity")
else nextion.color.grey_dark
}}
# ICON Font Color
btn_icon_font: >
- {% if not current_entity_state_available %}{{ nextion.color.red }}
+ {% if not current_entity_state_available %}
+ {{ nextion.color.red }}
{% elif current_entity_state in ["off", "closed", "closing"] or (item_domain == "person" and current_entity_state != "home") %}
{{ nextion.color.grey_light }}
{% elif item_domain in ["button", "input_button", "scene"] and trigger.id is match "current_state_entity" %}
- {{
- repeat.item.icon_color_rgb
- if is_number(repeat.item.icon_color_rgb)
- else
- ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+
- (repeat.item.icon_color_rgb[2] //(2**3))
- }}
- {% elif item_domain in ["button", "input_button", "scene"] %}{{ nextion.color.grey_light }}
+ {{ [ repeat.item.icon_color_rgb ] if is_number(repeat.item.icon_color_rgb) else repeat.item.icon_color_rgb }}
+ {% elif item_domain in ["button", "input_button", "scene"] %}
+ {{ nextion.color.grey_light }}
{% elif current_entity_state in ["on", "open", "opening", "home"] or (item_domain == "climate" and current_entity_state != "off") %}
- {{
- repeat.item.icon_color_rgb
- if is_number(repeat.item.icon_color_rgb)
- else
- ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+
- (repeat.item.icon_color_rgb[2] //(2**3))
- }}
+ {{ [ repeat.item.icon_color_rgb ] if is_number(repeat.item.icon_color_rgb) else repeat.item.icon_color_rgb }}
{% else %}{{ nextion.color.red }}
{% endif %}
# LABEL Font Color
@@ -7111,7 +7404,7 @@ action:
{{ nextion.color.grey_dark }}
{% elif item_domain in ["button", "input_button", "scene"] %}
{{ nextion.color.white }}
- {% elif current_entity_state in ["on", "open", "opening", "home"] or (item_domain == "climate" and current_entity_state != "off") %}
+ {% elif current_entity_state in ["on", "open", "opening", "home", "playing"] or (item_domain == "climate" and current_entity_state != "off") %}
{{ nextion.color.grey_dark }}
{% else %}
{{ nextion.color.white }}
@@ -7138,6 +7431,8 @@ action:
{% if not current_entity_state_available %} 0
{% elif item_domain == "light" and current_entity_state == "on" and state_attr(repeat.item.entity, "brightness") != None %}
{{ (state_attr(repeat.item.entity, "brightness") | int * 100 /255) | round(0) }}%
+ {% elif item_domain == "fan" and current_entity_state == "on" and state_attr(repeat.item.entity, "percentage") != None %}
+ {{ state_attr(repeat.item.entity, "percentage") | round(0, default=0) }}%
{% elif item_domain == "cover" and current_entity_state in ["open", "opening", "closing"] and state_attr(repeat.item.entity, "current_position") != None %}
{{ (state_attr(repeat.item.entity, "current_position") | int(100)) | round(0) }}%
{% elif item_domain == "climate" and current_entity_state != "off" and state_attr(repeat.item.entity, 'current_temperature') != None %}
@@ -7149,13 +7444,15 @@ action:
data:
btn_id: '{{ repeat.item.page }}.{{ repeat.item.component }}'
btn_pic: '{{ btn_pic }}'
- btn_bg: '{{ btn_bg }}'
- btn_icon_font: '{{ btn_icon_font }}'
- btn_txt_font: '{{ btn_txt_font }}'
- btn_bri_font: '{{ btn_bri_font }}'
+ btn_bg: '{{ [ btn_bg ] if is_number(btn_bg) else btn_bg }}'
+ btn_icon_font: '{{ [ btn_icon_font ] if is_number(btn_icon_font) else btn_icon_font }}'
+ btn_txt_font: '{{ [ btn_txt_font ] if is_number(btn_txt_font) else btn_txt_font }}'
+ btn_bri_font: '{{ [ btn_bri_font ] if is_number(btn_bri_font) else btn_bri_font }}'
btn_icon: '{{ btn_icon }}'
btn_label: '{{ btn_label }}'
btn_bri_txt: '{{ btn_bri_txt }}'
+ btn_confirm: '{{ repeat.item.confirm }}'
+ #entity: '{{ repeat.item.entity }}'
continue_on_error: true
- if: '{{ item_domain in ["button","input_button","scene"] and trigger.id is match "current_state_entity" }}'
then:
@@ -7166,20 +7463,14 @@ action:
btn_id: '{{ repeat.item.page }}.{{ repeat.item.component }}'
btn_pic: '{{ nextion.pic.button.off }}'
btn_bg: '{{ nextion.color.grey_dark }}'
- btn_icon_font: >
- {{
- repeat.item.icon_color_rgb
- if is_number(repeat.item.icon_color_rgb)
- else
- ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+
- (repeat.item.icon_color_rgb[2] //(2**3))
- }}
+ btn_icon_font: '{{ nextion.color.grey_light }}'
btn_txt_font: '{{ nextion.color.white }}'
- btn_bri_font: '{{ btn_bri_font }}'
+ btn_bri_font: '{{ [ btn_bri_font ] if is_number(btn_bri_font) else btn_bri_font }}'
btn_icon: '{{ btn_icon }}'
btn_label: '{{ btn_label }}'
btn_bri_txt: '{{ btn_bri_txt }}'
+ btn_confirm: '{{ repeat.item.confirm }}'
+ #entity: '{{ repeat.item.entity }}'
continue_on_error: true
###### SHOW All component when page loading done #####
- if: '{{ not show_while_loading }}'
@@ -7193,251 +7484,343 @@ action:
- service: '{{ nextion.command.show_all }}'
continue_on_error: true
- ## PAGE LIGHTSETTINGS ##
+ ## PAGE LIGHT ##
- alias: Light settings page
conditions: '{{ nspanel_event.page == page.light }}'
- sequence: &refresh_page_lightsettings
- - *variables-settings_entity
- - if: '{{ settings_entity_domain == "light" }}'
+ sequence: &refresh_page_light
+ - variables:
+ light_entity: '{{ nspanel_event.entity if nspanel_event is defined and nspanel_event.entity is defined else trigger.entity_id }}'
+ supported_color_modes: '{{ state_attr(light_entity, "supported_color_modes") | default("unknown") }}'
+ color_mode_color: >
+ {{
+ "hs" in supported_color_modes
+ or "xy" in supported_color_modes
+ or "rgb" in supported_color_modes
+ or "rgbw" in supported_color_modes
+ or "rgbww" in supported_color_modes
+ }}
+ color_mode_color_temp: '{{ "color_temp" in supported_color_modes }}'
+ #color_mode_brightness: >
+ # {{
+ # "brightness" in supported_color_modes
+ # or "white" in supported_color_modes
+ # or color_mode_color
+ # or color_mode_color_temp
+ # }}
+ ##### LIGHT State #####
+ - variables:
+ curr_brightness: '{{ (state_attr(light_entity, "brightness") | int(0) * 100 / 255) | round(0) }}'
+ - *delay-default
+ - service: '{{ nextion.command.value }}'
+ data:
+ component: light.lightslider
+ message: '{{ curr_brightness }}'
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: light.light_value
+ message: '{{ curr_brightness }}%'
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: light.light_value_2
+ message: '{{ curr_brightness }}%'
+ continue_on_error: true
+
+ ##### LIGHT Check Color_Temp Value is available when yes send some current Values #####
+ - if: '{{ color_mode_color_temp }}'
then:
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: lightsettings.light_name
- message: >
+ - variables:
+ curr_color_temp: '{{ state_attr(light_entity, "color_temp") | int(-1) }}'
+ min_mireds: '{{ state_attr(light_entity, "min_mireds") | int(153) }}'
+ max_mireds: '{{ state_attr(light_entity, "max_mireds") | int(500) }}'
+ - variables:
+ curr_color_temp: >
{{
- settings_entity_dict.name
- if settings_entity_dict.name is defined and settings_entity_dict.name is string and settings_entity_dict.name | length > 0
- else
- (
- state_attr(settings_entity_dict.entity, "friendly_name")
- if state_attr(settings_entity_dict.entity, "friendly_name") | length > 0
- else
- (
- "Light" ~ (": " ~ settings_entity_dict.component)
- if settings_entity_dict.component is string and settings_entity_dict.component | length > 0
- )
- )
+ curr_color_temp
+ if curr_color_temp >= min_mireds and curr_color_temp <= max_mireds
+ else ((min_mireds+max_mireds)/2) | int(327)
}}
- continue_on_error: true
- ##### LIGHT ICON - ON / OFF #####
+ - condition: '{{ is_number(curr_color_temp) }}'
- *delay-default
- service: '{{ nextion.command.text_printf }}'
data:
- component: lightsettings.icon_state
- message: >
- {{
- all_icons[settings_entity_dict.icon.split(":")[1]] | default(settings_entity_dict.icon if settings_entity_dict.icon is defined and settings_entity_dict.icon is string else nextion.icon.domain.light)
- if settings_entity_dict.icon not in ["unavailable", "unknown", "", None] and settings_entity_dict.icon | length > 0
- else nextion.icon.domain.light
- }}
+ component: light.temp_value
+ message: '{{ curr_color_temp }}'
continue_on_error: true
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.text_printf }}'
data:
- component: lightsettings.icon_state
- message: >
- {{
- (
- settings_entity_dict.icon_color_rgb
- if is_number(settings_entity_dict.icon_color_rgb)
- else
- ((settings_entity_dict.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((settings_entity_dict.icon_color_rgb[1] //(2**2)) *(2**5))+
- (settings_entity_dict.icon_color_rgb[2] //(2**3))
- )
- if is_state(settings_entity_dict.entity, "on")
- else nextion.color.grey_light
- }}
+ component: light.temp_value_2
+ message: '{{ curr_color_temp }}'
continue_on_error: true
- ##### LIGHT State #####
- - variables:
- curr_brightness: '{{ (state_attr(settings_entity_dict.entity, "brightness") | int(0) * 100 / 255) | round(0) }}'
- *delay-default
- service: '{{ nextion.command.value }}'
data:
- component: lightsettings.lightslider
- message: '{{ curr_brightness }}'
+ component: light.tempslider
+ message: '{{ curr_color_temp }}'
continue_on_error: true
- *delay-default
- - service: '{{ nextion.command.text_printf }}'
+ - service: '{{ nextion.command.printf }}'
data:
- component: lightsettings.light_value
- message: '{{ curr_brightness }}%'
+ cmd: tempslider.minval={{ min_mireds }}
continue_on_error: true
- *delay-default
- - service: '{{ nextion.command.text_printf }}'
+ - service: '{{ nextion.command.printf }}'
data:
- component: lightsettings.light_value_2
- message: '{{ curr_brightness }}%'
+ cmd: tempslider.maxval={{ max_mireds }}
continue_on_error: true
-
- ##### LIGHT Check Color_Temp Value is available when yes send some current Values #####
- - variables:
- curr_color_temp: '{{ state_attr(settings_entity_dict.entity, "color_temp") }}'
- - condition: '{{ is_number(curr_color_temp) }}'
- *delay-default
- - service: '{{ nextion.command.text_printf }}'
+ - service: '{{ nextion.command.show }}'
data:
- component: lightsettings.temp_value
- message: '{{ curr_color_temp | round(0) }}'
+ component: temp_button
continue_on_error: true
- *delay-default
- - service: '{{ nextion.command.text_printf }}'
+ - service: '{{ nextion.command.show }}'
data:
- component: lightsettings.temp_value_2
- message: '{{ curr_color_temp | round(0) }}'
+ component: temp_value_2
continue_on_error: true
- *delay-default
- - service: '{{ nextion.command.value }}'
+ - service: '{{ nextion.command.show }}'
data:
- component: lightsettings.tempslider
- message: '{{ curr_color_temp | round(0) }}'
+ component: temp_touch
continue_on_error: true
- ## PAGE COVERSETTINGS ##
- - alias: Cover settings page
- conditions: '{{ nspanel_event.page == page.cover }}'
- sequence: &refresh_page_coversettings
- ##### COVER - OPEN / CLOSE #####
- - *variables-settings_entity
- - if: '{{ settings_entity_domain == "cover" }}'
+ ##### Hide color button when not supported #####
+ - if: '{{ color_mode_color }}'
then:
- *delay-default
- - service: '{{ nextion.command.text_printf }}'
+ - service: '{{ nextion.command.show }}'
data:
- component: coversettings.icon_state
- message: >
- {{
- all_icons[settings_entity_dict.icon.split(":")[1]] | default(settings_entity_dict.icon if settings_entity_dict.icon is defined and settings_entity_dict.icon is string else nextion.icon.domain.cover)
- if settings_entity_dict.icon not in ["unavailable", "unknown", "", None] and settings_entity_dict.icon | length > 0
- else nextion.icon.domain.cover
- }}
+ component: color_button
continue_on_error: true
- *delay-default
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.show }}'
data:
- component: coversettings.icon_state
- message: >
- {{
- (
- settings_entity_dict.icon_color_rgb
- if is_number(settings_entity_dict.icon_color_rgb)
- else
- ((settings_entity_dict.icon_color_rgb[0] //(2**3)) *(2**11))+
- ((settings_entity_dict.icon_color_rgb[1] //(2**2)) *(2**5))+
- (settings_entity_dict.icon_color_rgb[2] //(2**3))
- )
- if states(settings_entity_dict.entity) in ["open", "opening"]
- else nextion.color.grey_light
- }}
+ component: color_touch
continue_on_error: true
+
+ ## PAGE COVER ##
+ - alias: Cover settings page
+ conditions: '{{ nspanel_event.page == page.cover }}'
+ sequence: &refresh_page_cover
+ - variables:
+ cover_entity: '{{ nspanel_event.entity if nspanel_event is defined and nspanel_event.entity is defined else trigger.entity_id }}'
+ ##### COVER State
+ - service: '{{ nextion.command.value }}'
+ data:
+ component: cover.coverslider
+ message: '{{ (state_attr(cover_entity, "current_position") | int ) | round(0) }}'
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: cover.cover_value
+ message: '{{ (state_attr(cover_entity, "current_position") | int ) | round(0) }} %'
+ continue_on_error: true
+
+ ##### COVER Battery ICON Yes / NO #####
+ - variables:
+ battery_level: >
+ {% if state_attr(cover_entity, "battery") | default("unavailable") not in ["unavailable", "unknown", "", None] %}
+ {{ state_attr(cover_entity, "battery") | default("unavailable") }}
+ {% elif expand(device_entities(device_id(cover_entity)))
+ | selectattr("attributes.device_class", "defined")
+ | selectattr("attributes.device_class", "eq", "battery")
+ | map(attribute="state")
+ | map("float")
+ | list
+ | count > 0 %}
+ {{
+ expand(device_entities(device_id(cover_entity)))
+ | selectattr("attributes.device_class", "defined")
+ | selectattr("attributes.device_class", "eq", "battery")
+ | map(attribute="state") | map("float")
+ | list
+ | first
+ | round(0)
+ }}
+ {% elif has_value(cover_entity | replace("cover.","sensor.") ~ "_battery") %}
+ {{ states(cover_entity | replace("cover.","sensor.") ~ "_battery", rounded=true) | default("unavailable") }}
+ {% elif has_value(cover_entity | replace("cover.","sensor.") | replace("cover", "battery")) %}
+ {{ states(cover_entity | replace("cover.","sensor.") | replace("cover", "battery"), rounded=true) | default("unavailable") }}
+ {% else %} unavailable
+ {% endif %}
+ - if: '{{ is_number(battery_level) }}'
+ then:
- *delay-default
- service: '{{ nextion.command.text_printf }}'
data:
- component: coversettings.cover_name
- message: >
- {{
- settings_entity_dict.name
- if
- settings_entity_dict.name is defined
- and settings_entity_dict.name is string
- and settings_entity_dict.name | length > 0
- else
- (
- state_attr(settings_entity_dict.entity, "friendly_name")
- if state_attr(settings_entity_dict.entity, "friendly_name") | length > 0
- else settings_entity_dict.entity
- )
- }}
+ component: cover.battery_value
+ message: '{{ battery_level }} %'
continue_on_error: true
-
- ##### COVER State
- - service: '{{ nextion.command.value }}'
+ ### ICON Battery Font Color ###
+ - *delay-default
+ - service: '{{ nextion.command.set_component_color }}'
data:
- component: coversettings.coverslider
- message: '{{ (state_attr(settings_entity_dict.entity, "current_position") | int ) | round(0) }}'
+ component: cover.battery_icon
+ foreground: '{{ nextion.color.grey_super_light }}'
+ background: []
continue_on_error: true
+ ### ICON Battery Font ###
- *delay-default
- service: '{{ nextion.command.text_printf }}'
data:
- component: coversettings.cover_value
- message: '{{ (state_attr(settings_entity_dict.entity, "current_position") | int ) | round(0) }} %'
+ component: cover.battery_icon
+ message: '{{ all_icons["battery-medium"] }}'
continue_on_error: true
- ##### COVER Battery ICON Yes / NO #####
- - variables:
- battery_level: >
- {% if state_attr(settings_entity_dict.entity, "battery") | default("unavailable") not in ["unavailable", "unknown", "", None] %}
- {{ state_attr(settings_entity_dict.entity, "battery") | default("unavailable") }}
- {% elif expand(device_entities(device_id(settings_entity_dict.entity)))
- | selectattr("attributes.device_class", "defined")
- | selectattr("attributes.device_class", "eq", "battery")
- | map(attribute="state")
- | map("float")
- | list
- | count > 0 %}
- {{
- expand(device_entities(device_id(settings_entity_dict.entity)))
- | selectattr("attributes.device_class", "defined")
- | selectattr("attributes.device_class", "eq", "battery")
- | map(attribute="state") | map("float")
- | list
- | first
- }}
- {% elif states(settings_entity_dict.entity | replace("cover.","sensor.") ~ "_battery") | default("unavailable") not in ["unavailable", "unknown", "", None] %}
- {{ states(settings_entity_dict.entity | replace("cover.","sensor.") ~ "_battery") | default("unavailable") }}
- {% elif states(settings_entity_dict.entity | replace("cover.","sensor.") | replace("cover", "battery")) | default("unavailable") not in ["unavailable", "unknown", "", None] %}
- {{ states(settings_entity_dict.entity | replace("cover.","sensor.") | replace("cover", "battery")) | default("unavailable") }}
- {% else %} unavailable
- {% endif %}
- - if: '{{ is_number(battery_level) }}'
- then:
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: coversettings.battery_value
- message: '{{ battery_level | round(0) }} %'
- continue_on_error: true
- ### ICON Battery Font Color ###
- - *delay-default
- - service: '{{ nextion.command.font_color }}'
- data:
- component: coversettings.battery_icon
- message: '{{ nextion.color.grey_super_light }}'
- continue_on_error: true
- ### ICON Battery Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: coversettings.battery_icon
- message: '{{ all_icons["battery-medium"] }}'
- continue_on_error: true
+ ## PAGE FAN ##
+ - alias: Fan settings page
+ conditions: '{{ nspanel_event.page == page.fan }}'
+ sequence: &refresh_page_fan
+ - variables:
+ fan_entity: '{{ nspanel_event.entity if nspanel_event is defined and nspanel_event.entity is defined else trigger.entity_id }}'
+ fan:
+ supported_features: '{{ state_attr(fan_entity, "supported_features") | int(0) }}'
+ percentage: >
+ {{
+ state_attr(fan_entity, "percentage") | int(0)
+ if is_state(fan_entity, 'on')
+ else 0
+ }}
+ steps: >
+ {% set percentage_step = state_attr(fan_entity, "percentage_step") | float(0) %}
+ {{
+ (100/percentage_step) | round(0) | int(0)
+ if percentage_step > 0
+ else 0
+ }}
+ - condition: '{{ fan.steps > 0 and fan.supported_features | bitwise_and(1) > 0 }}'
+ - service: '{{ nextion.command.value }}'
+ data:
+ component: fanslider
+ message: '{{ ((fan.percentage / 100) * fan.steps) | round(0) | int(0) }}'
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.printf }}'
+ data:
+ cmd: fanslider.maxval={{ fan.steps }}
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: fan_value
+ message: '{{ fan.percentage }}%'
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.set_component_color }}'
+ data:
+ component: fan.button_up
+ foreground: '{{ nextion.color.grey_white if fan.percentage < 100 else nextion.color.grey_dark }}'
+ background: []
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.set_component_color }}'
+ data:
+ component: fan.button_down
+ foreground: '{{ nextion.color.grey_white if fan.percentage > 0 else nextion.color.grey_dark }}'
+ background: []
+ continue_on_error: true
+ - *delay-default
+ - service: '{{ nextion.command.set_component_color }}'
+ data:
+ component: fan.button_off
+ foreground: '{{ nextion.color.grey_white if fan.percentage > 0 else nextion.color.grey_dark }}'
+ background: []
+ continue_on_error: true
+
+ ## PAGE MEDIA PLAYER ##
+ - alias: Media player settings page
+ conditions: '{{ nspanel_event.page == page.media_player }}'
+ sequence: &refresh_page_media_player
+ - variables:
+ media_player_entity: '{{ nspanel_event.entity if nspanel_event is defined and nspanel_event.entity is defined else trigger.entity_id }}'
+ wait_completed: false
+ - alias: Refresh page in a loop
+ repeat:
+ sequence:
+ - &update_entity
+ service: homeassistant.update_entity
+ data:
+ entity_id: '{{ nspanel_event.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 500
+ - variables:
+ media_player:
+ state: '{{ states(media_player_entity) }}'
+ is_volume_muted: '{{ state_attr(media_player_entity, "is_volume_muted") | default(false) }}'
+ friendly_name: '{{ state_attr(media_player_entity, "friendly_name") | default("Media player") }}'
+ volume_level: '{{ (state_attr(media_player_entity, "volume_level") | round(2, default=0) * 100) | int(0) }}'
+ media_title: '{{ state_attr(media_player_entity, "media_title") }}'
+ media_artist: '{{ state_attr(media_player_entity, "media_artist") }}'
+ media_duration: '{{ state_attr(media_player_entity, "media_duration") | int(0) }}'
+ media_position: '{{ state_attr(media_player_entity, "media_position") | int(0) }}'
+ #media_position_updated_at: '{{ state_attr(media_player_entity, "media_position_updated_at") }}'
+ supported_features: '{{ state_attr(media_player_entity, "supported_features") | int(0) }}'
+ - service: '{{ nextion.command.media_player }}'
+ data:
+ entity: '{{ media_player_entity }}'
+ state: '{{ media_player.state if media_player.state is string else "" }}'
+ is_volume_muted: '{{ media_player.is_volume_muted if media_player.is_volume_muted is boolean else false }}'
+ friendly_name: '{{ media_player.friendly_name if media_player.friendly_name is string else "" }}'
+ volume_level: '{{ media_player.volume_level }}'
+ media_title: '{{ media_player.media_title if media_player.media_title is string and media_player.media_title not in [null, None, "unknown", "unavailable"] else "" }}'
+ media_artist: '{{ media_player.media_artist if media_player.media_artist is string and media_player.media_artist not in [null, None, "unknown", "unavailable"] else "" }}'
+ media_duration: '{{ media_player.media_duration }}'
+ media_position: '{{ media_player.media_position }}'
+ supported_features: '{{ media_player.supported_features }}'
+ continue_on_error: true
+ - wait_template: '{{ states(currentpage) != page.media_player }}'
+ timeout:
+ seconds: 10
+ continue_on_timeout: true
+ - variables:
+ wait_completed: '{{ wait.completed }}'
+ until:
+ - or:
+ - '{{ wait_completed }}'
+ - '{{ states(currentpage) != page.media_player }}' # Don't replace this by page.current as this have to be evaluated all the time
+ - '{{ nspanel_event.type != "page_changed" }}'
+
+ ## PAGE ALARM ##
+ - alias: Alarm settings page
+ conditions: '{{ nspanel_event.page == page.alarm }}'
+ sequence: &refresh-page_alarm
+ - variables:
+ alarm_entity: !input alarm
+ - if: '{{ alarm_entity is string and alarm_entity is match "alarm_control_panel." }}'
+ then:
+ - variables: #https://github.com/home-assistant/core/blob/dev/homeassistant/components/alarm_control_panel/const.py
+ alarm:
+ state: '{{ states(alarm_entity) | default("unavailable") }}'
+ friendly_name: '{{ state_attr(alarm_entity, "friendly_name") }}'
+ supported_features: '{{ state_attr(alarm_entity, "supported_features") | int(0) }}'
+ code_format: '{{ state_attr(alarm_entity, "code_format") }}'
+ code_arm_required: '{{ state_attr(alarm_entity, "code_arm_required") }}'
+ - condition: '{{ alarm.supported_features > 0 }}'
+ - service: '{{ nextion.command.alarm_settings }}'
+ data:
+ page_title: '{{ alarm.friendly_name }}'
+ state: '{{ alarm.state }}'
+ supported_features: '{{ alarm.supported_features }}'
+ code_format: '{{ alarm.code_format if alarm.code_format else "none" }}'
+ code_arm_required: '{{ alarm.code_arm_required if alarm.code_arm_required else false }}'
+ entity: '{{ alarm_entity }}'
+ mui_alarm: '{{ dict.values(mui[language].alarm) | list }}'
+ continue_on_error: true
## PAGE CLIMATE ##
- alias: Climate page
conditions: '{{ nspanel_event.page == page.climate }}'
sequence: &refresh_page_climate
- - *variables-settings_entity
- &variables-climate_entity
variables:
- settings_entity_dict: >
- {% if settings_entity_dict.entity is not defined and settings_entity_dict.page == page.home and settings_entity_dict.component == 'climate' %}
- {
- 'page': '{{ settings_entity_dict.page }}',
- 'entity': '{{ climate }}',
- 'name': >
- {{
- state_attr(climate, "friendly_name") | default(mui[language].no_name)
- if
- climate is string and
- state_attr(climate, "friendly_name") is string and
- state_attr(climate, "friendly_name") | length > 0
- else climate
- }}
- }
- {% else %}{{ settings_entity_dict }}
- {% endif %}
- climate_entity: '{{ settings_entity_dict.entity if settings_entity_dict.entity is defined }}'
+ climate_entity_temp: '{{ nspanel_event.entity if nspanel_event is defined and nspanel_event.entity is defined else trigger.entity_id }}'
+ climate_entity: '{{ thermostat_embedded if climate_entity_temp == "embedded_climate" else climate_entity_temp }}'
settings_entity_domain: >
{{
climate_entity.split(".")[0]
@@ -7449,112 +7832,113 @@ action:
}}
hvac_modes: '{{ state_attr(climate_entity, "hvac_modes") if settings_entity_domain == "climate" }}'
- - if: '{{ settings_entity_domain == "climate" }}'
+ - condition: '{{ settings_entity_domain == "climate" }}'
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: page_label
+ message: '{{ state_attr(climate_entity, "friendly_name") }}'
+ continue_on_error: true
+
+ ##### Values #####
+ - &variables-climate_page
+ variables:
+ climate_page_entities:
+ - entity: !input 'climate_value01'
+ icon: !input 'climate_value01_icon'
+ icon_color_rgb: !input 'climate_value01_icon_color'
+ label_color_rgb: !input 'climate_value01_label_color'
+ page: climate
+ component: value01
+ - entity: !input 'climate_value02'
+ icon: !input 'climate_value02_icon'
+ icon_color_rgb: !input 'climate_value02_icon_color'
+ label_color_rgb: !input 'climate_value02_label_color'
+ page: climate
+ component: value02
+ - entity: !input 'climate_value03'
+ icon: !input 'climate_value03_icon'
+ icon_color_rgb: !input 'climate_value03_icon_color'
+ label_color_rgb: !input 'climate_value03_label_color'
+ page: climate
+ component: value03
+ - entity: !input 'climate_value04'
+ icon: !input 'climate_value04_icon'
+ icon_color_rgb: !input 'climate_value04_icon_color'
+ label_color_rgb: !input 'climate_value04_label_color'
+ page: climate
+ component: value04
+ - repeat:
+ for_each: '{{ climate_page_entities }}'
+ sequence: *display_value
+
+ ##### Slider & climate values #####
+ - &climate-update_slider
+ if: '{{ not (climate_entity == climate and embedded_climate) }}'
then:
- ##### Page title #####
- - service: '{{ nextion.command.text_printf }}'
+ - variables:
+ current_temp: '{{ state_attr(climate_entity, "current_temperature") | float(-999) | round(1) }}'
+ target_temp: >
+ {{
+ state_attr(climate_entity, "temperature") | float(-999) | round(1)
+ if has_value(climate_entity)
+ else -999
+ }}
+ temp_offset: '{{ (state_attr(climate_entity, "min_temp") | float(5) * 10) | round(0) | int }}'
+ max_temp: '{{ (state_attr(climate_entity, "max_temp") | float(25) * 10) | round(0) | int }}'
+ temp_step: >
+ {% set target_temp_step = state_attr(climate_entity, "target_temp_step") %}
+ {% if not is_number(target_temp_step) %}
+ {% set target_temp_step = state_attr(climate_entity, "target_temperature_step") %}
+ {% endif %}
+ {% set target_temp_step = target_temp_step | float(0.5) | abs %}
+ {{ ((10 * target_temp_step) | round(0) | int) if is_number(target_temp_step) and target_temp_step > 0 else 10 }}
+ total_steps: '{{ ((max_temp-temp_offset)/temp_step) | round(0) | int }}'
+ climate_state: '{{ states(climate_entity) | default("unavailable") if climate_entity is string else "unavailable" }}'
+ hvac_action: '{{ state_attr(climate_entity, "hvac_action") }}'
+ climate_action: '{{ hvac_action if hvac_action not in ["unavailable", "unknown", "", None] else climate_state }}'
+ climate_icon: >
+ {% if "off" in climate_action %}{{ all_icons.blank }}
+ {% elif "heating" in climate_action or "heat" in climate_action %}{{ all_icons["thermometer-lines"] }}
+ {% elif "cooling" in climate_action or "cool" in climate_action %}{{ all_icons.snowflake }}
+ {% elif "drying" in climate_action or "dry" in climate_action %}{{ all_icons["water-percent"] }}
+ {% elif "fan" in climate_action or "fan_only" in climate_action %}{{ all_icons.fan }}
+ {% elif "heat_cool" in climate_action %}{{ all_icons.autorenew }}
+ {% elif "auto" in climate_action %}{{ all_icons["calendar-sync"] }}
+ {% elif "idle" in climate_action %}{{ all_icons.thermometer }}
+ {% else %}{{ all_icons.blank }}
+ {% endif %}
+ - *delay-default
+ - service: '{{ nextion.command.set_climate }}'
data:
- component: climate.climate_label
- message: '{{ settings_entity_dict.name }}'
+ current_temp: '{{ current_temp }}'
+ target_temp: '{{ target_temp }}'
+ temp_step: '{{ temp_step }}'
+ total_steps: '{{ total_steps }}'
+ temp_offset: '{{ temp_offset }}'
+ climate_icon: '{{ climate_icon }}'
+ embedded_climate: '{{ embedded_climate }}'
continue_on_error: true
- ##### Values #####
- - &variables-climate_page
- variables:
- climate_page_entities:
- - entity: !input 'climate_value01'
- icon: !input 'climate_value01_icon'
- icon_color_rgb: !input 'climate_value01_icon_color'
- label_color_rgb: !input 'climate_value01_label_color'
- page: climate
- component: value01
- - entity: !input 'climate_value02'
- icon: !input 'climate_value02_icon'
- icon_color_rgb: !input 'climate_value02_icon_color'
- label_color_rgb: !input 'climate_value02_label_color'
- page: climate
- component: value02
- - entity: !input 'climate_value03'
- icon: !input 'climate_value03_icon'
- icon_color_rgb: !input 'climate_value03_icon_color'
- label_color_rgb: !input 'climate_value03_label_color'
- page: climate
- component: value03
- - entity: !input 'climate_value04'
- icon: !input 'climate_value04_icon'
- icon_color_rgb: !input 'climate_value04_icon_color'
- label_color_rgb: !input 'climate_value04_label_color'
- page: climate
- component: value04
+ ##### Climate buttons #####
+ - &climate-update_buttons
+ if: '{{ not (climate_entity == climate and embedded_climate) }}'
+ then:
- repeat:
- for_each: '{{ climate_page_entities }}'
- sequence: *display_value
-
- ##### Slider & climate values #####
- - &climate-update_slider
- if: '{{ true }}'
- then:
- - variables:
- current_temp: '{{ state_attr(climate_entity, "current_temperature") | float(-999) | round(1) }}'
- target_temp: >
- {{
- state_attr(climate_entity, "temperature") | float(-999) | round(1)
- if states(climate_entity) not in ["unavailable", "unknown", "", None, "off"]
- else -999
- }}
- temp_offset: '{{ (state_attr(climate_entity, "min_temp") | float(5) * 10) | round(0) | int }}'
- max_temp: '{{ (state_attr(climate_entity, "max_temp") | float(25) * 10) | round(0) | int }}'
- temp_step: >
- {% set target_temp_step = state_attr(climate_entity, "target_temp_step") %}
- {% if not is_number(target_temp_step) %}
- {% set target_temp_step = state_attr(climate_entity, "target_temperature_step") %}
- {% endif %}
- {% set target_temp_step = target_temp_step | float(0.5) | abs %}
- {{ ((10 * target_temp_step) | round(0) | int) if is_number(target_temp_step) and target_temp_step > 0 else 10 }}
- total_steps: '{{ ((max_temp-temp_offset)/temp_step) | round(0) | int }}'
- climate_state: '{{ states(climate_entity) | default("unavailable") if climate_entity is string else "unavailable" }}'
- hvac_action: '{{ state_attr(climate_entity, "hvac_action") }}'
- climate_action: '{{ hvac_action if hvac_action not in ["unavailable", "unknown", "", None] else climate_state }}'
- climate_icon: >
- {% if "off" in climate_action %}{{ all_icons.blank }}
- {% elif "heating" in climate_action or "heat" in climate_action %}{{ all_icons["thermometer-lines"] }}
- {% elif "cooling" in climate_action or "cool" in climate_action %}{{ all_icons.snowflake }}
- {% elif "drying" in climate_action or "dry" in climate_action %}{{ all_icons["water-percent"] }}
- {% elif "fan" in climate_action or "fan_only" in climate_action %}{{ all_icons.fan }}
- {% elif "heat_cool" in climate_action %}{{ all_icons.autorenew }}
- {% elif "auto" in climate_action %}{{ all_icons["calendar-sync"] }}
- {% elif "idle" in climate_action %}{{ all_icons.thermometer }}
- {% else %}{{ all_icons.blank }}
- {% endif %}
- - *delay-default
- - service: '{{ nextion.command.set_climate }}'
- data:
- current_temp: '{{ current_temp }}'
- target_temp: '{{ target_temp }}'
- temp_step: '{{ temp_step }}'
- total_steps: '{{ total_steps }}'
- slider_val: '{{ ((10*target_temp - temp_offset) / temp_step) | round(0) | int }}'
- temp_offset: '{{ temp_offset }}'
- climate_icon: '{{ climate_icon }}'
- continue_on_error: true
-
- ##### Climate buttons #####
- - &climate-update_buttons
- repeat:
for_each: '{{ page_climate.buttons.hvac_mode }}'
sequence:
- condition: '{{ repeat.item.mode in hvac_modes }}'
- *delay-default
### ICON Font Color ###
- - service: '{{ nextion.command.font_color }}'
+ - service: '{{ nextion.command.set_component_color }}'
data:
component: 'climate.{{ repeat.item.component }}_icon'
- message: >
+ foreground: >
{{
nextion.color[repeat.item.color]
if states(climate_entity) == repeat.item.mode
else nextion.color.disabled
}}
+ background: []
continue_on_error: true
### ICON Font ###
- *delay-default
@@ -7570,70 +7954,68 @@ action:
component: '{{ repeat.item.component }}'
continue_on_error: true
- ##### Climate custom buttons #####
- - &climate-update_custom_buttons
- if: '{{ true }}'
- then:
- - &climate-update_custom_buttons-variables
- variables:
- climate_custom_buttons:
- - entity: !input climate_button08
- icon: !input climate_button08_icon
- icon_color_rgb: !input climate_button08_icon_color
- component: button08
- - entity: !input climate_button09
- icon: !input climate_button09_icon
- icon_color_rgb: !input climate_button09_icon_color
- component: button09
- - &climate-update_custom_buttons-update
- repeat:
- for_each: '{{ climate_custom_buttons }}'
- sequence:
- - condition: '{{ repeat.item.entity is defined and repeat.item.entity is string and repeat.item.entity | length > 0 }}'
- - variables:
- entity_domain: >
- {{
- repeat.item.entity.split(".")[0]
- if
- repeat.item.entity is defined and
- repeat.item.entity is string and
- repeat.item.entity.split(".") | count > 0
- else "unknown"
- }}
- - condition: '{{ entity_domain != "unknown" }}'
- - *delay-default
- ### ICON Font Color ###
- - service: '{{ nextion.command.font_color }}'
- data:
- component: 'climate.{{ repeat.item.component }}_icon'
- message: >
- {{
- ((repeat.item.icon_color_rgb[0] //(2**3)) *(2**11))+((repeat.item.icon_color_rgb[1] //(2**2)) *(2**5))+(repeat.item.icon_color_rgb[2] //(2**3))
- if states(repeat.item.entity) in ["on", "true", true, "open", "opening"]
- else nextion.color.disabled
- }}
- continue_on_error: true
- ### ICON Font ###
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: 'climate.{{ repeat.item.component }}_icon'
- message: >
- {{
- all_icons[repeat.item.icon.split(":")[1]] | default(all_icons.unknown)
- if repeat.item.icon is defined and repeat.item.icon is string and ":" in repeat.item.icon and repeat.item.icon.split(":") | count > 0
- else nextion.icon.domain[entity_domain] | default(all_icons.unknown)
- }}
- continue_on_error: true
- ### Enable button click ###
- - *delay-default
- - service: '{{ nextion.command.show }}'
- data:
- component: '{{ repeat.item.component }}'
- continue_on_error: true
- else:
- ##### Return to Home page in case is not a climate entity #####
- - *jump_page_home
+ ##### Climate custom buttons #####
+ - &climate-update_custom_buttons
+ if: '{{ true }}'
+ then:
+ - &climate-update_custom_buttons-variables
+ variables:
+ climate_custom_buttons:
+ - entity: !input climate_button08
+ icon: !input climate_button08_icon
+ icon_color_rgb: !input climate_button08_icon_color
+ component: button08
+ - entity: !input climate_button09
+ icon: !input climate_button09_icon
+ icon_color_rgb: !input climate_button09_icon_color
+ component: button09
+ - &climate-update_custom_buttons-update
+ repeat:
+ for_each: '{{ climate_custom_buttons }}'
+ sequence:
+ - condition: '{{ repeat.item.entity is defined and repeat.item.entity is string and repeat.item.entity | length > 0 }}'
+ - variables:
+ entity_domain: >
+ {{
+ repeat.item.entity.split(".")[0]
+ if
+ repeat.item.entity is defined and
+ repeat.item.entity is string and
+ repeat.item.entity.split(".") | count > 0
+ else "unknown"
+ }}
+ - condition: '{{ entity_domain != "unknown" }}'
+ - *delay-default
+ ### ICON Font Color ###
+ - service: '{{ nextion.command.set_component_color }}'
+ data:
+ component: 'climate.{{ repeat.item.component }}_icon'
+ foreground: >
+ {{
+ repeat.item.icon_color_rgb
+ if states(repeat.item.entity) in ["on", "true", true, "open", "opening"]
+ else nextion.color.disabled
+ }}
+ background: []
+ continue_on_error: true
+ ### ICON Font ###
+ - *delay-default
+ - service: '{{ nextion.command.text_printf }}'
+ data:
+ component: 'climate.{{ repeat.item.component }}_icon'
+ message: >
+ {{
+ all_icons[repeat.item.icon.split(":")[1]] | default(all_icons.unknown)
+ if repeat.item.icon is defined and repeat.item.icon is string and ":" in repeat.item.icon and repeat.item.icon.split(":") | count > 0
+ else nextion.icon.domain[entity_domain] | default(all_icons.unknown)
+ }}
+ continue_on_error: true
+ ### Enable button click ###
+ - *delay-default
+ - service: '{{ nextion.command.show }}'
+ data:
+ component: '{{ repeat.item.component }}'
+ continue_on_error: true
## ENTITY PAGES 01 - 04 ##
- alias: Entity pages
@@ -7819,7 +8201,7 @@ action:
page: entitypage04
component: value08
- variables:
- entity_page_index: '{{ (nspanel_event.page[-2:] | int(-1)) - 1 }}'
+ entity_page_index: '{{ (page.current[-2:] | int(-1)) - 1 }}'
first_entity: '{{ entity_page_index * 8 }}'
last_entity: '{{ first_entity + 8 }}'
##### Entity page - Label #####
@@ -7838,7 +8220,7 @@ action:
- if: '{{ repeat.item.entity is string and repeat.item.entity | length > 0 }}'
then:
- variables:
- repeat_item_state: '{{ states(repeat.item.entity) | default("unavailable") }}'
+ repeat_item_state: '{{ states(repeat.item.entity, rounded=true) | default("unavailable") }}'
repeat_item_icon: >
{% if repeat.item.icon is string and repeat.item.icon | length > 0 %}
{{
@@ -7874,6 +8256,7 @@ action:
{% elif "OpenWeatherMap" in weather_attribution %} OpenWeather
{% elif "SMHI" in weather_attribution %} SMHI
{% elif "met.no" in weather_attribution %} Met.no
+ {% elif "MÊtÊo-France" in weather_attribution %} Meteo_France
{% else %} Other
{% endif %}
weather_units:
@@ -7918,18 +8301,103 @@ action:
##### Display weather data only when available #####
- variables:
+ datetime_is_string: '{{ state_attr(weather_entity, "forecast")[0] is defined and state_attr(weather_entity, "forecast")[0]["datetime"] is string }}'
forecast_day: >
- {{ state_attr(weather_entity, "forecast") | default([])
- | selectattr("datetime", "defined")
- | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | timestamp_local )
- | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | timestamp_local )
- | list
- }}
+ {% if datetime_is_string %}
+ {{
+ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | timestamp_local )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | timestamp_local )
+ | list
+ }}
+ {% else %}
+ [
+ {
+ 'datetime': '{{ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="datetime") | list | first | as_timestamp | timestamp_local
+ if state_attr(weather_entity, "forecast") | default([])
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="datetime") | list | count > 0
+ else "" }}',
+ 'condition': '{{ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("condition", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="condition") | list | first
+ if state_attr(weather_entity, "forecast") | default([])
+ | selectattr("condition", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="condition") | list | count > 0
+ else "" }}',
+ 'temperature': '{{ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("temperature", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="temperature") | list | first
+ if state_attr(weather_entity, "forecast") | default([])
+ | selectattr("temperature", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="temperature") | list | count > 0
+ else "" }}',
+ 'templow': '{{ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("templow", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="templow") | list | first
+ if state_attr(weather_entity, "forecast") | default([])
+ | selectattr("templow", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="templow") | list | count > 0
+ else "" }}',
+ 'precipitation': '{{ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("precipitation", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="precipitation") | list | first
+ if state_attr(weather_entity, "forecast") | default([])
+ | selectattr("precipitation", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="precipitation") | list | count > 0
+ else "" }}',
+ 'wind_speed': '{{ state_attr(weather_entity, "forecast") | default([])
+ | selectattr("wind_speed", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="wind_speed") | list | first
+ if state_attr(weather_entity, "forecast") | default([])
+ | selectattr("wind_speed", "defined")
+ | selectattr("datetime", "defined")
+ | selectattr("datetime", ">=", (today_at("00:00") + timedelta(days= page_index)) | as_timestamp | as_datetime )
+ | selectattr("datetime", "<", (today_at("00:00") + timedelta(days= (page_index+1))) | as_timestamp | as_datetime )
+ | map(attribute="wind_speed") | list | count > 0
+ else "" }}'
+ }
+ ]
+ {% endif %}
- if: '{{ forecast_day | count > 0 or page_index == 0 }}'
then: # Display forecast
- variables:
metnoweather: '{{ weather_type == "Met.no" }}'
- metnoweather_hourly_forecast: '{{ state_attr(weather_entity ~ "_hourly", "forecast") if metnoweather and states(weather_entity ~ "_hourly") not in ["unavailable", "unknown", "", None] }}'
+ metnoweather_hourly_forecast: '{{ state_attr(weather_entity ~ "_hourly", "forecast") if metnoweather and has_value(weather_entity ~ "_hourly") }}'
forecast_day: >
{% if forecast_day | count > 0 %}{{ forecast_day }}
{% elif metnoweather and metnoweather_hourly_forecast %}
@@ -7962,97 +8430,97 @@ action:
temp_min: >
{{ forecast_day | selectattr("templow", "defined") | map(attribute="templow") | map("float") | list | min
if forecast_day | selectattr("templow", "defined") | map(attribute="templow") | map("float") | list | count > 0
- else forecast_day | selectattr("temperature", "defined") | map(attribute="temperature") | map("float") | list | min | default("unknown")
+ else forecast_day | selectattr("temperature", "defined") | rejectattr("temperature", "eq", "") | map(attribute="temperature") | map("float") | list | min | default("unknown")
}}
temp_max: >
{{
- forecast_day | selectattr("temperature", "defined") | map(attribute="temperature") | map("float") | list | max
- if forecast_day | selectattr("temperature", "defined") | map(attribute="temperature") | map("float") | list | count > 0
+ forecast_day | selectattr("temperature", "defined") | rejectattr("temperature", "eq", "") | map(attribute="temperature") | map("float") | list | max
+ if forecast_day | selectattr("temperature", "defined") | rejectattr("temperature", "eq", "") | map(attribute="temperature") | map("float") | list | count > 0
}}
condition: >
{{
- forecast_day | selectattr("condition", "defined") | map(attribute="condition") | list | first
- if forecast_day | selectattr("condition", "defined") | map(attribute="condition") | list | count > 0
+ forecast_day | selectattr("condition", "defined") | rejectattr("condition", "eq", "") | map(attribute="condition") | list | first
+ if forecast_day | selectattr("condition", "defined") | rejectattr("condition", "eq", "") | map(attribute="condition") | list | count > 0
}}
precipitation: >
{{
- forecast_day | selectattr("precipitation", "defined") | map(attribute="precipitation") | map("float") | list | sum
- if forecast_day | selectattr("precipitation", "defined") | map(attribute="precipitation") | map("float") | list | count > 0
+ forecast_day | selectattr("precipitation", "defined") | rejectattr("precipitation", "eq", "") | map(attribute="precipitation") | map("float") | list | sum | round(0)
+ if forecast_day | selectattr("precipitation", "defined") | rejectattr("precipitation", "eq", "") | map(attribute="precipitation") | map("float") | list | count > 0
}}
precipitation_probability: >
{{
- forecast_day | selectattr("precipitation_probability", "defined") | map(attribute="precipitation_probability") | map("float") | list | max
- if forecast_day | selectattr("precipitation_probability", "defined") | map(attribute="precipitation_probability") | map("float") | list | count > 0
+ forecast_day | selectattr("precipitation_probability", "defined") | rejectattr("precipitation_probability", "eq", "") | map(attribute="precipitation_probability") | map("float") | list | max | round(0)
+ if forecast_day | selectattr("precipitation_probability", "defined") | rejectattr("precipitation_probability", "eq", "") | map(attribute="precipitation_probability") | map("float") | list | count > 0
}}
pressure: >
{{
- forecast_day | selectattr("pressure", "defined") | map(attribute="pressure") | map("float") | list | max
- if forecast_day | selectattr("pressure", "defined") | map(attribute="pressure") | map("float") | list | count > 0
+ forecast_day | selectattr("pressure", "defined") | rejectattr("pressure", "eq", "") | map(attribute="pressure") | map("float") | list | max | round(0)
+ if forecast_day | selectattr("pressure", "defined") | rejectattr("pressure", "eq", "") | map(attribute="pressure") | map("float") | list | count > 0
}}
wind_speed: >
{{
- forecast_day | selectattr("wind_speed", "defined") | map(attribute="wind_speed") | map("float") | list | max
- if forecast_day | selectattr("wind_speed", "defined") | map(attribute="wind_speed") | map("float") | list | count > 0
+ forecast_day | selectattr("wind_speed", "defined") | rejectattr("wind_speed", "eq", "") | map(attribute="wind_speed") | map("float") | list | max | round(0)
+ if forecast_day | selectattr("wind_speed", "defined") | rejectattr("wind_speed", "eq", "") | map(attribute="wind_speed") | map("float") | list | count > 0
}}
hours_of_sun: >
{{
- states(accuweather_sensor_prefix ~ "hours_of_sun" ~ accuweather_sensor_sufix) | default("unknown")
+ states(accuweather_sensor_prefix ~ "hours_of_sun" ~ accuweather_sensor_sufix, rounded=true) | default("unknown")
if accuweather
else
(
- forecast_day | selectattr("hours_of_sun", "defined") | map(attribute="hours_of_sun") | map("float") | list | sum
- if forecast_day | selectattr("hours_of_sun", "defined") | map(attribute="hours_of_sun") | map("float") | list | count > 0
+ forecast_day | selectattr("hours_of_sun", "defined") | rejectattr("hours_of_sun", "eq", "") | map(attribute="hours_of_sun") | map("float") | list | sum | round(0)
+ if forecast_day | selectattr("hours_of_sun", "defined") | rejectattr("hours_of_sun", "eq", "") | map(attribute="hours_of_sun") | map("float") | list | count > 0
)
}}
uv_index: >
{{
- states(accuweather_sensor_prefix ~ "uv_index" ~ accuweather_sensor_sufix) | default("unknown")
+ states(accuweather_sensor_prefix ~ "uv_index" ~ accuweather_sensor_sufix, rounded=true) | default("unknown")
if accuweather
else
(
- forecast_day | selectattr("uv_index", "defined") | map(attribute="uv_index") | map("float") | list | max
- if forecast_day | selectattr("uv_index", "defined") | map(attribute="uv_index") | map("float") | list | count > 0
+ forecast_day | selectattr("uv_index", "defined") | rejectattr("uv_index", "eq", "") | map(attribute="uv_index") | map("float") | list | max | round(0)
+ if forecast_day | selectattr("uv_index", "defined") | rejectattr("uv_index", "eq", "") | map(attribute="uv_index") | map("float") | list | count > 0
)
}}
thunderstorm_probability: >
{{
- states(accuweather_sensor_prefix ~ "thunderstorm_probability_day" ~ accuweather_sensor_sufix) | default("unknown")
+ states(accuweather_sensor_prefix ~ "thunderstorm_probability_day" ~ accuweather_sensor_sufix, rounded=true) | default("unknown")
if accuweather
else
(
- forecast_day | selectattr("thunderstorm_probability", "defined") | map(attribute="thunderstorm_probability") | map("float") | list | max
- if forecast_day | selectattr("thunderstorm_probability", "defined") | map(attribute="thunderstorm_probability") | map("float") | list | count > 0
+ forecast_day | selectattr("thunderstorm_probability", "defined") | rejectattr("thunderstorm_probability", "eq", "") | map(attribute="thunderstorm_probability") | map("float") | list | max | round(0)
+ if forecast_day | selectattr("thunderstorm_probability", "defined") | rejectattr("thunderstorm_probability", "eq", "") | map(attribute="thunderstorm_probability") | map("float") | list | count > 0
)
}}
parameters:
- name: hours_of_sun
visibility: '{{ is_number(hours_of_sun) }}'
- value: '{{ (hours_of_sun | round(0) ~ " " ~ weather_units.hours_of_sun) if is_number(hours_of_sun) }}'
+ value: '{{ (hours_of_sun ~ " " ~ weather_units.hours_of_sun) if is_number(hours_of_sun) }}'
icon: '{{ nextion.icon.weather.sun }}'
- name: thunderstorm_probability
visibility: '{{ is_number(thunderstorm_probability) }}'
- value: '{{ (thunderstorm_probability | round(0) ~ weather_units.thunderstorm_probability) if is_number(thunderstorm_probability) }}'
+ value: '{{ (thunderstorm_probability ~ weather_units.thunderstorm_probability) if is_number(thunderstorm_probability) }}'
icon: '{{ nextion.icon.weather.lightning }}'
- name: precipitation
visibility: '{{ is_number(precipitation) or is_number(precipitation_probability) }}'
value: >
- {{ (precipitation | round(0) ~ " " ~ weather_units.precipitation) if is_number(precipitation) }}
+ {{ (precipitation ~ " " ~ weather_units.precipitation) if is_number(precipitation) }}
{{ "-" if is_number(precipitation) and is_number(precipitation_probability) }}
- {{ (precipitation_probability | round(0) ~ weather_units.precipitation_probability) if is_number(precipitation_probability) }}
+ {{ (precipitation_probability ~ weather_units.precipitation_probability) if is_number(precipitation_probability) }}
icon: '{{ nextion.icon.weather.rain }}'
- name: uv_index
visibility: '{{ is_number(uv_index) }}'
value: >
{{ (state_attr(accuweather_sensor_prefix ~ "uv_index" ~ accuweather_sensor_sufix, "level") | default(None) ~ ": ") if weather_type == "AccuWeather" }}
- {{ (uv_index | round(0) ~ weather_units.uv_index) if is_number(uv_index) }}
+ {{ (uv_index ~ weather_units.uv_index) if is_number(uv_index) }}
icon: '{{ nextion.icon.weather.protect }}'
- name: wind_speed
visibility: '{{ is_number(wind_speed) }}'
- value: '{{ (wind_speed | round(0) ~ " " ~ weather_units.wind_speed) if is_number(wind_speed) }}'
+ value: '{{ (wind_speed ~ " " ~ weather_units.wind_speed) if is_number(wind_speed) }}'
icon: '{{ nextion.icon.weather.wind }}'
- name: pressure
visibility: '{{ is_number(pressure) }}'
- value: '{{ (pressure | round(0) ~ " " ~ weather_units.pressure) if is_number(pressure) }}'
+ value: '{{ (pressure ~ " " ~ weather_units.pressure) if is_number(pressure) }}'
icon: '{{ nextion.icon.weather.gauge }}'
##### Display weather PIC when available
@@ -8109,469 +8577,417 @@ action:
- *delay-default
else: *forecast_unavailable
- ## PAGE NOTIFICATION ##
- - alias: Notification page
- conditions: '{{ nspanel_event.page == page.notification }}'
+ ##### Button click #####
+ - alias: Button click
+ conditions:
+ - '{{ nspanel_event.type == "button_click" }}'
+ sequence:
+ - choose:
+ - alias: Hardware buttons
+ conditions:
+ - '{{ nspanel_event.component in ["hw_bt_left", "hw_bt_right"] }}'
sequence:
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: notification.notifi_text01
- message: '{{ states(notification_text) | default(mui[language].unavailable) if notification_text is string else mui[language].unavailable }}'
- continue_on_error: true
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: notification.notifi_label
- message: '{{ states(notification_label) | default(mui[language].unavailable) if notification_label is string else mui[language].unavailable }}'
- continue_on_error: true
+ - *variables_hardware
+ - variables:
+ button_context: '{{ hardware.buttons.left if nspanel_event.component == "hw_bt_left" else hardware.buttons.right }}'
+ button_domain: >
+ {{
+ button_context.entity.split(".")[0] | default("unknown")
+ if
+ button_context.entity is string and
+ button_context.entity | length > 0 and
+ button_context.entity.split(".") | count > 0
+ else "unknown"
+ }}
+ - choose:
+ - alias: Long click
+ conditions:
+ - '{{ nspanel_event.command == "long_click"}}'
+ sequence:
+ - choose:
+ - alias: Default
+ conditions:
+ - '{{ button_context.hold_select == "Default" and button_context.entity | length > 0 }}'
+ - '{{ button_domain in ["climate", "cover", "light", "fan", "media_player"] }}'
+ - '{{ button_domain != "cover" or state_attr(button_context.entity, "supported_features") | int(0) | bitwise_and(4) > 0 }}'
+ - '{{ button_domain != "fan" or state_attr(button_context.entity, "supported_features") | int(0) | bitwise_and(1) > 0 }}'
+ - '{{ button_domain != "light" or state_attr(button_context.entity, "supported_color_modes") | default("unknown") | string not in ["unknown", "onoff", enum.color_mode.unknown, enum.color_mode.onoff, "", none] }}'
+ sequence:
+ - service: '{{ nextion.command.open_entity_settings_page }}'
+ data:
+ page: '{{ button_domain }}'
+ page_label: '{{ button_context.name if button_context.name is string and button_context.name | length > 0 else state_attr(button_context.entity, "friendly_name") }}'
+ page_icon: '{{ nextion.icon.domain[button_domain] }}'
+ page_icon_color: [-1 ] #No color set
+ entity: '{{ "embedded_climate" if button_context.entity == thermostat_embedded else button_context.entity }}'
+ back_page: '{{ page.home }}'
+ continue_on_error: true
+ - alias: Custom action - Left
+ conditions: '{{ button_context.hold_select == "Custom Action" and nspanel_event.component == "hw_bt_left" }}'
+ sequence: !input left_button_hold_custom_action
+ - alias: Custom action - Right
+ conditions: '{{ button_context.hold_select == "Custom Action" and nspanel_event.component == "hw_bt_right" }}'
+ sequence: !input right_button_hold_custom_action
+ - alias: Short click
+ conditions:
+ - '{{ nspanel_event.command == "short_click"}}'
+ sequence:
+ - condition: '{{ button_context.entity | length > 0 }}'
+ - condition: '{{ nspanel_event.component != "hw_bt_left" or hardware.buttons.left.entity != relay01_entity }}' ### Prevents blueprint control when locally controlled
+ - condition: '{{ nspanel_event.component != "hw_bt_right" or hardware.buttons.right.entity != relay02_entity }}' ### Prevents blueprint control when locally controlled
+ - service: >
+ {% if button_domain in ["light", "switch", "cover", "input_boolean", "automation", "fan"] %}
+ {{ button_domain }}.toggle
+ {% elif button_domain in ["button", "input_button"] %}
+ {{ button_domain }}.press
+ {% elif button_domain in ["scene", "script"] %}
+ {{ button_domain }}.turn_on
+ {% elif entity_domain in ["media_player"] %}
+ {{ entity_domain }}.media_play_pause
+ {% else %}
+ homeassistant.update_entity
+ {% endif %}
+ data:
+ entity_id: '{{ button_context.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 500
+ - service: homeassistant.update_entity
+ data:
+ entity_id: '{{ button_context.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 1500
+ - service: homeassistant.update_entity
+ data:
+ entity_id: '{{ button_context.entity }}'
+ continue_on_error: true
- ## PAGE QR Code ##
- - alias: QRCode page
- conditions: '{{ nspanel_event.page == page.qrcode }}'
+ - alias: Buttons pages
+ conditions:
+ - '{{ nspanel_event.page in page.buttonpages }}'
+ sequence:
+ - *variables-page_buttons
+ - variables:
+ last_click_button: '{{ button_pages_buttons | selectattr("page", "defined") | selectattr("page", "eq", nspanel_event.page) | selectattr("component", "defined") | selectattr("component", "eq", nspanel_event.component) | list }}'
+ - condition: '{{ last_click_button | count >= 0 }}'
+ - variables:
+ last_click_button: '{{ last_click_button[0] }}'
+ entity_domain: >
+ {{
+ last_click_button.entity.split(".")[0] | default("unknown")
+ if
+ last_click_button.entity is string and
+ last_click_button.entity | length > 0 and
+ last_click_button.entity.split(".") | count > 0
+ else "unknown"
+ }}
+ - choose:
+ - alias: Long click
+ conditions:
+ - '{{ nspanel_event.command == "long_click" }}'
+ - '{{ entity_domain != "cover" or state_attr(last_click_button.entity, "supported_features") | int(0) | bitwise_and(4) > 0 }}'
+ - '{{ entity_domain != "fan" or state_attr(last_click_button.entity, "supported_features") | int(0) | bitwise_and(1) > 0 }}'
+ - '{{ entity_domain != "light" or state_attr(last_click_button.entity, "supported_color_modes") | default("unknown") | string not in ["unknown", "onoff", enum.color_mode.unknown, enum.color_mode.onoff, "", none] }}'
+ sequence:
+ - service: '{{ nextion.command.open_entity_settings_page }}'
+ data:
+ page: '{{ entity_domain }}'
+ page_label: '{{ last_click_button.name if last_click_button.name is string and last_click_button.name | length > 0 else state_attr(last_click_button.entity, "friendly_name") }}'
+ page_icon: >
+ {{
+ all_icons[last_click_button.icon.split(":")[1]] | default(last_click_button.icon if last_click_button.icon is defined and last_click_button.icon is string else nextion.icon.domain[entity_domain])
+ if last_click_button.icon not in ["unavailable", "unknown", "", None] and last_click_button.icon | length > 0
+ else nextion.icon.domain[entity_domain]
+ }}
+ page_icon_color: '{{ [ last_click_button.icon_color_rgb ] if is_number(last_click_button.icon_color_rgb) else last_click_button.icon_color_rgb }}'
+ entity: '{{ "embedded_climate" if last_click_button.entity == thermostat_embedded else last_click_button.entity }}'
+ back_page: '{{ nspanel_event.page }}'
+ continue_on_error: true
+ - alias: Short click
+ conditions:
+ - '{{ nspanel_event.command == "short_click" }}'
+ - '{{ entity_domain not in ["unknown", "person", "binary_sensor", "sensor"] }}'
+ sequence:
+ - &service-button_changed
+ if: '{{ true }}'
+ then:
+ - service: >-
+ {% if entity_domain in ["light", "switch", "cover", "input_boolean", "automation", "fan"] %}
+ {{ entity_domain }}.toggle
+ {% elif entity_domain in ["button", "input_button"] %}
+ {{ entity_domain }}.press
+ {% elif entity_domain in ["scene", "script"] %}
+ {{ entity_domain }}.turn_on
+ {% elif entity_domain in ["media_player"] %}
+ {{ entity_domain }}.media_play_pause
+ {% else %}
+ homeassistant.update_entity
+ {% endif %}
+ data:
+ entity_id: '{{ last_click_button.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 500
+ - service: homeassistant.update_entity
+ data:
+ entity_id: '{{ last_click_button.entity }}'
+ continue_on_error: true
+ - delay:
+ milliseconds: 1500
+ - service: homeassistant.update_entity
+ data:
+ entity_id: '{{ last_click_button.entity }}'
+ continue_on_error: true
+ - alias: Climate page
+ conditions:
+ - '{{ nspanel_event.page == page.climate }}'
+ sequence:
+ - *climate-update_custom_buttons-variables
+ - variables:
+ last_click_button: '{{ climate_custom_buttons | selectattr("component", "defined") | selectattr("component", "eq", nspanel_event.component) | list }}'
+ - condition: '{{ last_click_button | count >= 0 }}'
+ - variables:
+ last_click_button: '{{ last_click_button[0] }}'
+ entity_domain: >
+ {{
+ last_click_button.entity.split(".")[0] | default("unknown")
+ if
+ last_click_button.entity is string and
+ last_click_button.entity | length > 0 and
+ last_click_button.entity.split(".") | count > 0
+ else "unknown"
+ }}
+ - choose:
+ - alias: Long click
+ conditions:
+ - '{{ nspanel_event.command == "long_click" }}'
+ sequence:
+ - choose:
+ - conditions: '{{ nspanel_event.component == "button08" }}'
+ sequence: !input climate_button08_hold_custom_action
+ - conditions: '{{ nspanel_event.component == "button09" }}'
+ sequence: !input climate_button09_hold_custom_action
+ - alias: Short click
+ conditions:
+ - '{{ nspanel_event.command == "short_click" }}'
+ - '{{ entity_domain not in ["unknown", "person", "binary_sensor", "sensor"] }}'
+ sequence:
+ - *service-button_changed
+ - alias: Home page custom buttons
+ conditions:
+ - '{{ nspanel_event.page == page.home }}'
sequence:
+ - *variables-home_page-custom_buttons
- variables:
- qrcode_label: !input 'qrcode_label'
- qrcode_value: !input 'qrcode_value'
- - if: '{{ qrcode_label | length > 0 }}'
+ last_click_button: '{{ home_page_custom_buttons | selectattr("component", "defined") | selectattr("component", "eq", nspanel_event.component) | list }}'
+ - condition: '{{ last_click_button | count >= 0 }}'
+ - variables:
+ last_click_button: '{{ last_click_button[0] }}'
+ entity_domain: >
+ {{
+ last_click_button.entity.split(".")[0] | default("unknown")
+ if
+ last_click_button.entity is string and
+ last_click_button.entity | length > 0 and
+ last_click_button.entity.split(".") | count > 0
+ else "unknown"
+ }}
+ - if:
+ - '{{ entity_domain != "cover" or state_attr(last_click_button.entity, "supported_features") | int(0) | bitwise_and(4) > 0 }}'
+ - '{{ entity_domain != "fan" or state_attr(last_click_button.entity, "supported_features") | int(0) | bitwise_and(1) > 0 }}'
+ - '{{ entity_domain != "light" or state_attr(last_click_button.entity, "supported_color_modes") | default("unknown") | string not in ["unknown", "onoff", enum.color_mode.unknown, enum.color_mode.onoff, "", none] }}'
then:
- - service: '{{ nextion.command.text_printf }}'
+ - service: '{{ nextion.command.open_entity_settings_page }}'
data:
- component: 'qrcode_label'
- message: '{{ qrcode_label }}'
+ page: '{{ entity_domain }}'
+ page_label: '{{ last_click_button.name if last_click_button.name is string and last_click_button.name | length > 0 else state_attr(last_click_button.entity, "friendly_name") }}'
+ page_icon: >
+ {{
+ all_icons[last_click_button.icon.split(":")[1]] | default(last_click_button.icon if last_click_button.icon is defined and last_click_button.icon is string else nextion.icon.domain[entity_domain])
+ if last_click_button.icon not in ["unavailable", "unknown", "", None] and last_click_button.icon | length > 0
+ else nextion.icon.domain[entity_domain]
+ }}
+ page_icon_color: [-1 ] #No color set
+ entity: '{{ "embedded_climate" if last_click_button.entity == thermostat_embedded else last_click_button.entity }}'
+ back_page: '{{ page.home }}'
continue_on_error: true
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: 'qrcode_value'
- message: '{{ qrcode_value }}'
- continue_on_error: true
-
- ## PAGE SETTINGS ##
- #- alias: Settings page
- # conditions: '{{ nspanel_event.page == page.settings }}'
- # sequence:
-
- ## PAGE BOOT ##
- #- alias: Boot page
- # conditions: '{{ nspanel_event.page == page.boot }}'
- # sequence:
-
- ## PAGE SCREENSAVER ##
- #- alias: Screensaver page
- # conditions: '{{ nspanel_event.page == page.screensaver }}'
- # sequence:
-
- - alias: Page close # general
- conditions: '{{ nspanel_event.component == "close" and nspanel_event.value == "release" }}'
- sequence:
- - *variables-settings_entity
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ settings_entity_dict.page if settings_entity_dict.page is defined else page.home }}'
- continue_on_error: true
-
- - alias: lightsetting # rgb_color, brightness, color_temp
- conditions: '{{ nspanel_event.component in ["rgb_color", "brightness_pct", "color_temp"] }}'
- sequence:
- - *variables-settings_entity
- - condition: '{{ settings_entity_dict.entity is defined and settings_entity_dict.entity is string }}'
- - service: light.turn_on
- data:
- entity_id: '{{ settings_entity_dict.entity }}'
- '{{ nspanel_event.component }}': '{{ nspanel_event.value }}'
- continue_on_error: true
-
- - alias: coversetting position
- conditions: '{{ nspanel_event.component == "cover_position" }}'
- sequence:
- - *variables-settings_entity
- - service: 'cover.set_cover_position'
- data:
- entity_id: '{{ settings_entity_dict.entity }}'
- position: '{{ nspanel_event.value }}'
- continue_on_error: true
-
- - alias: coversetting open close stop
- conditions: '{{ nspanel_event.component in ["open_cover", "close_cover", "stop_cover"] }}'
- sequence:
- - *variables-settings_entity
- - service: 'cover.{{ nspanel_event.component }}'
- data:
- entity_id: '{{ settings_entity_dict.entity }}'
- continue_on_error: true
- - alias: climate climateslider
+ ##### Versions mismatch #####
+ - alias: Versions
conditions:
- - '{{ nspanel_event.page in [page.climate, "climatesettings"] }}'
- - '{{ nspanel_event.component == "climate_position" }}'
+ - '{{ nspanel_event.type == "version"}}'
sequence:
- - *variables-settings_entity
- - if: '{{ settings_entity_dict.entity is string and states(settings_entity_dict.entity) != "off" }}'
+ - if: '{{ nspanel_event.blueprint != blueprint_version }}'
then:
- - variables:
- new_setpoint: '{{ nspanel_event.value | int(-999) }}'
- - if: '{{ is_number(new_setpoint) and new_setpoint > -999 }}'
- then:
- - service: climate.set_temperature
- data:
- entity_id: '{{ settings_entity_dict.entity }}'
- temperature: '{{ new_setpoint / 10 }}'
- continue_on_error: true
+ - service: persistent_notification.create
+ data:
+ notification_id: 'NSPanel_HA_Blueprint_version_mismatch_{{ nspanel_name }}'
+ title: NSPanel invalid Blueprint version
+ message: >
+ ESPHome cannot provide a valid Blueprint version.
- - alias: climate button press
- conditions:
- - '{{ nspanel_event.page == page.climate }}'
- - '{{ nspanel_event.component in ["button01", "button02", "button03", "button04", "button05", "button06", "button07"] }}'
- - '{{ nspanel_event.value == "release" }}'
- sequence:
- - *variables-settings_entity
- - *variables-climate_entity
- - condition: '{{ settings_entity_domain == "climate" }}'
- - variables:
- new_hvac_mode: >
- {{
- page_climate.buttons.hvac_mode
- | selectattr("component", "defined")
- | selectattr("component", "eq", nspanel_event.component)
- | map(attribute="mode")
- | list
- | first
- }}
- - condition: '{{ new_hvac_mode in hvac_modes and new_hvac_mode in ["off", "heat", "cool", "heat_cool", "auto", "dry", "fan_only"] }}'
- - service: climate.set_hvac_mode
- data:
- hvac_mode: '{{ new_hvac_mode }}'
- target:
- entity_id: '{{ climate_entity }}'
- continue_on_error: true
- - *climate-update_buttons
+ - Panel: {{ nspanel_name }}
- - alias: climate custom button press
- conditions:
- - '{{ nspanel_event.page == page.climate }}'
- - '{{ nspanel_event.component in ["button08", "button09"] }}'
- - '{{ nspanel_event.value == "press" }}'
- sequence:
- - wait_template: >
- {% set button_wait = states(nspanelevent) %}
- {% set button_wait = button_wait | from_json if button_wait is string and button_wait not in ["unavailable", "unknown", "", None] else { "page": "unknown", "component": "unknown", "value": "unknown" } %}
- {{
- button_wait.page == nspanel_event.page and
- button_wait.component == nspanel_event.component and
- button_wait.value == "release"
- }}
- timeout:
- seconds: 1
- continue_on_timeout: true
- - *climate-update_custom_buttons-variables
- - variables:
- ##### Entity - Page Button - Toggle Entity #####
- button_wait: >
- {{
- states(nspanelevent)
- if nspanelevent is string and states(nspanelevent) not in ["unavailable", "unknown", "", None]
- else { "page": "unknown", "component": "unknown", "value": "unknown" }
- }}
- last_click_button: '{{ climate_custom_buttons | selectattr("component", "defined") | selectattr("component", "eq", nspanel_event.component) | list }}'
- - condition: '{{ last_click_button | count >= 0 and button_wait.page == nspanel_event.page }}'
- - if: '{{ not wait.completed }}'
- then: # Long press
- - choose:
- - conditions: '{{ button_wait.component == "button08" }}'
- sequence: !input climate_button08_hold_custom_action
- - conditions: '{{ button_wait.component == "button09" }}'
- sequence: !input climate_button09_hold_custom_action
- else: # Short press
- - variables:
- last_click_button: '{{ last_click_button[0] }}'
- entity_domain: >
- {{
- last_click_button.entity.split(".")[0] | default("unknown")
- if
- last_click_button.entity is string and
- last_click_button.entity | length > 0 and
- last_click_button.entity.split(".") | count > 0
- else "unknown"
- }}
- - condition: '{{ entity_domain not in ["unknown", "person", "binary_sensor", "sensor", "climate"] }}'
- - service: >-
- {% if entity_domain in ["light", "switch", "cover", "input_boolean", "automation", "fan"] %}
- {{ entity_domain }}.toggle
- {% elif entity_domain in ["button", "input_button"] %}
- {{ entity_domain }}.press
- {% elif entity_domain in ["scene", "script"] %}
- {{ entity_domain }}.turn_on
- {% else %}
- homeassistant.update_entity
- {% endif %}
- data:
- entity_id: '{{ last_click_button.entity }}'
- continue_on_error: true
+ - TFT: {{ nspanel_event.tft }}
- - alias: Button page - Button press
- conditions:
- - '{{ nspanel_event.page in page.buttonpages }}'
- - '{{ nspanel_event.value == "press" }}'
- sequence:
- - wait_template: >
- {% set button_wait = states(nspanelevent) %}
- {% set button_wait = button_wait | from_json if button_wait is string and button_wait not in ["unavailable", "unknown", "", None] else { "page": "unknown", "component": "unknown", "value": "unknown" } %}
- {{
- button_wait.page == nspanel_event.page and
- button_wait.component == nspanel_event.component and
- button_wait.value == "release"
- }}
- timeout:
- seconds: 1
- continue_on_timeout: true
- - *variables-page_buttons
- - variables:
- ##### Entity - Page Button - Toggle Entity #####
- button_wait: >
- {{
- states(nspanelevent)
- if nspanelevent is string and states(nspanelevent) not in ["unavailable", "unknown", "", None]
- else { "page": "unknown", "component": "unknown", "value": "unknown" }
- }}
- last_click_button: '{{ button_pages_buttons | selectattr("page", "defined") | selectattr("page", "eq", nspanel_event.page) | selectattr("component", "defined") | selectattr("component", "eq", nspanel_event.component) | list }}'
- - condition: '{{ last_click_button | count >= 0 and button_wait.page == nspanel_event.page }}'
- - if: '{{ not wait.completed }}'
- then: # Long press
- - service: '{{ nextion.command.set_settings_entity }}'
- data:
- entity: '{{ last_click_button[0] }}'
+ - ESPHome: {{ nspanel_event.esphome }}
+
+ - Blueprint (reported by ESPHome):{{ nspanel_event.blueprint }}
+
+ - Blueprint (expected): {{ blueprint_version }}
continue_on_error: true
- else: # Short press
- - variables:
- last_click_button: '{{ last_click_button[0] }}'
- entity_domain: >
- {{
- last_click_button.entity.split(".")[0] | default("unknown")
- if
- last_click_button.entity is string and
- last_click_button.entity | length > 0 and
- last_click_button.entity.split(".") | count > 0
- else "unknown"
- }}
- - condition: '{{ entity_domain not in ["unknown", "person", "binary_sensor", "sensor"] }}'
- - if: '{{ entity_domain == "climate" }}'
+ else:
+ - if:
+ - '{{ nspanel_event.blueprint == nspanel_event.esphome }}'
+ - '{{ nspanel_event.blueprint == nspanel_event.tft }}'
then:
- - service: '{{ nextion.command.set_settings_entity }}'
+ - service: persistent_notification.dismiss
data:
- entity: '{{ last_click_button }}'
+ notification_id: 'NSPanel_HA_Blueprint_version_mismatch_{{ nspanel_name }}'
continue_on_error: true
else:
- - if: '{{ last_click_button.confirm }}'
- then:
- - variables:
- btn_entity_name: >-
- {%- if state_attr(last_click_button.entity, "friendly_name") != None -%}
- {{ state_attr(last_click_button.entity, "friendly_name") }}
- {%- elif state_attr(last_click_button.entity, "name") != None -%}
- {{ state_attr(last_click_button.entity, "name") }}
- {%- else -%} "unknown"
- {%- endif -%}
- #### turn on switch confirmation_message
- - service: switch.turn_on
- data:
- entity_id: '{{ confirmation_message }}'
- continue_on_error: true
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.notification }}'
- continue_on_error: true
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: notification.notifi_text01
- message: '{{ btn_entity_name }}'
- continue_on_error: true
- - *delay-default
- - service: '{{ nextion.command.text_printf }}'
- data:
- component: notification.notifi_label
- message: '{{ mui[language].please_confirm }}'
- continue_on_error: true
- - wait_template: >
- {% set notification_answer = states(nspanelevent) %}
- {% set notification_answer =
- notification_answer | from_json
- if notification_answer is string and notification_answer not in ["unavailable", "unknown", "", None]
- else { "page": "unknown", "component": "unknown", "value": "unknown" } %}
- {{ notification_answer.component in ["accept", "clear", "homepage"] }}
- timeout:
- seconds: 10
- continue_on_timeout: true
- - variables:
- notification_answer: >
- {{
- states(nspanelevent)
- if nspanelevent is string and states(nspanelevent) not in ["unavailable", "unknown", "", None]
- else { "page": "unknown", "component": "unknown", "value": "unknown" }
- }}
- - choose:
- - conditions: '{{ notification_answer.component == "accept" }}'
- sequence:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ nspanel_event.page }}'
- continue_on_error: true
- - service: switch.turn_off
- data:
- entity_id: '{{ confirmation_message }}'
- continue_on_error: true
- - &service-button_changed
- service: >-
- {% if entity_domain in ["light", "switch", "cover", "input_boolean", "automation", "fan"] %}
- {{ entity_domain }}.toggle
- {% elif entity_domain in ["button", "input_button"] %}
- {{ entity_domain }}.press
- {% elif entity_domain in ["scene", "script"] %}
- {{ entity_domain }}.turn_on
- {% else %}
- homeassistant.update_entity
- {% endif %}
- data:
- entity_id: '{{ last_click_button.entity }}'
- continue_on_error: true
- - conditions: '{{ notification_answer.component == "clear" }}'
- sequence:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ nspanel_event.page }}'
- continue_on_error: true
- - service: switch.turn_off
- data:
- entity_id: '{{ confirmation_message }}'
- continue_on_error: true
- - conditions: '{{ notification_answer.component == "homepage" }}'
- sequence:
- - service: switch.turn_off
- data:
- entity_id: '{{ confirmation_message }}'
- continue_on_error: true
- default:
- - service: switch.turn_off
- data:
- entity_id: '{{ confirmation_message }}'
- continue_on_error: true
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.home }}'
- continue_on_error: true
- else:
- - *service-button_changed
+ - service: persistent_notification.create
+ data:
+ notification_id: 'NSPanel_HA_Blueprint_version_mismatch_{{ nspanel_name }}'
+ title: NSPanel component version mismatch
+ message: >
+ There's a version mismatch between NSPanel_HA_Blueprint components. Please update all the components to the same version.
- - alias: Jump to climate page
- conditions:
- - '{{ nspanel_event.page == page.home }} '
- - '{{ nspanel_event.component == "climate" }}'
- - '{{ nspanel_event.value == "release" }}'
- - '{{ climate | length > 0 }} '
- sequence:
- - service: '{{ nextion.command.set_settings_entity }}'
- data:
- entity: '{{ dict(nspanel_event.items(), entity=climate, name=state_attr(climate, "friendly_name")) }}'
- continue_on_error: true
+ - Panel: {{ nspanel_name }}
- - alias: Jump to weather page
- conditions:
- - '{{ nspanel_event.page == page.home }}'
- - '{{ nspanel_event.component == "weather" }}'
- sequence:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.weatherpages[0] }}'
- continue_on_error: true
+ - TFT: {{ nspanel_event.tft }}
- - alias: Jump to QR code page
- conditions:
- - '{{ qrcode_enabled == true }}'
- - '{{ nspanel_event.page == page.home }}'
- - '{{ nspanel_event.component == "button05" }}'
- sequence:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.qrcode }}'
- continue_on_error: true
+ - ESPHome: {{ nspanel_event.esphome }}
- - alias: Jump to entity page
- conditions:
- - '{{ entitypages_enabled == true }}'
- - '{{ nspanel_event.page == page.home }}'
- - '{{ nspanel_event.component == "button06" }}'
- sequence:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.entitypages[0] }}'
- continue_on_error: true
+ - Blueprint: {{ nspanel_event.blueprint }} (expected {{ blueprint_version }})
+ continue_on_error: true
- - alias: Jump to notification page
+ ##### Other events #####
+ - alias: Other events
conditions:
- - '{{ nspanel_event.page == page.home }}'
- - '{{ nspanel_event.component == "button04" }}'
- - '{{ notification_text is string and states(notification_text) | length > 0 }}'
+ - '{{ nspanel_event.type == "generic"}}'
sequence:
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.notification }}'
- continue_on_error: true
+ - choose:
+ - alias: light settings # rgb_color, brightness, color_temp - This was kept until we find a solution to call with rgb_color directly from ESPHome
+ conditions:
+ - '{{ nspanel_event.page == page.light }}'
+ - '{{ nspanel_event.component in ["rgb_color", "brightness_pct", "color_temp"] }}'
+ - '{{ nspanel_event.entity is defined and nspanel_event.entity is string and nspanel_event.entity | length > 0 }}'
+ sequence:
+ - service: light.turn_on
+ data:
+ entity_id: '{{ nspanel_event.entity }}'
+ '{{ nspanel_event.component }}': '{{ nspanel_event.value }}'
+ continue_on_error: true
- - alias: Show button - Notification clear
- conditions:
- - '{{ nspanel_event.page == page.notification }}'
- - '{{ nspanel_event.component == "clear" }}'
- - '{{ confirmation_message is string and states(confirmation_message) | default("unavailable") != "on" }}'
- sequence:
- - service: switch.turn_off
- data:
- entity_id: '{{ notification_unread }}'
- continue_on_error: true
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.home }}'
- continue_on_error: true
+ - alias: Jump to climate page
+ conditions:
+ - '{{ nspanel_event.page == page.home }} '
+ - '{{ nspanel_event.component == "climate" }}'
+ - '{{ nspanel_event.value == "release" }}'
+ - '{{ climate | length > 0 }} '
+ sequence:
+ - service: '{{ nextion.command.open_entity_settings_page }}'
+ data:
+ page: 'climate'
+ page_label: '{{ state_attr(climate, "friendly_name") }}'
+ page_icon: ''
+ page_icon_color: [ -1 ] #No color set
+ entity: '{{ "embedded_climate" if climate == thermostat_embedded else climate }}'
+ back_page: '{{ page.home }}'
+ continue_on_error: true
- - alias: Show button - Notification accept
- conditions:
- - '{{ nspanel_event.page == page.notification }}'
- - '{{ nspanel_event.component == "accept" }}'
- - '{{ confirmation_message is string and states(confirmation_message) | default("unavailable") != "on" }}'
- sequence:
- - service: switch.turn_off
- data:
- entity_id: '{{ notification_unread }}'
- continue_on_error: true
- - service: '{{ nextion.command.notification_clear }}'
- data: {}
- continue_on_error: true
- - service: '{{ nextion.command.printf }}'
- data:
- cmd: 'page {{ page.home }}'
- continue_on_error: true
+ - alias: Show button - Notification clear
+ conditions:
+ - '{{ nspanel_event.page == page.notification }}'
+ - '{{ nspanel_event.component == "clear" }}'
+ sequence:
+ - service: switch.turn_off
+ data:
+ entity_id: '{{ notification_unread }}'
+ continue_on_error: true
+ - service: '{{ nextion.command.printf }}'
+ data:
+ cmd: 'page {{ page.home }}'
+ continue_on_error: true
+
+ - alias: Show button - Notification accept
+ conditions:
+ - '{{ nspanel_event.page == page.notification }}'
+ - '{{ nspanel_event.component == "accept" }}'
+ sequence:
+ - service: switch.turn_off
+ data:
+ entity_id: '{{ notification_unread }}'
+ continue_on_error: true
+ - service: '{{ nextion.command.notification_clear }}'
+ data: {}
+ continue_on_error: true
+ - service: '{{ nextion.command.printf }}'
+ data:
+ cmd: 'page {{ page.home }}'
+ continue_on_error: true
##### BOOT NSPANEL - automation reload #####
- alias: Automation reloaded
conditions:
- condition: trigger
- id: automation_reloaded
+ id:
+ - automation_reloaded
+ - ha_started
sequence:
- ##### Update Date & Time before showing the pages (just in case display format changed) #####
- - *refresh-datetime
+ - if: '{{ has_value(currentpage) }}'
+ then:
+ - service: persistent_notification.dismiss
+ data:
+ notification_id: 'NSPanel_HA_Blueprint_current_page_missing_{{ nspanel_name }}'
+ continue_on_error: true
+ else:
+ - service: persistent_notification.create
+ data:
+ notification_id: 'NSPanel_HA_Blueprint_current_page_missing_{{ nspanel_name }}'
+ title: NSPanel sensor unavailable
+ message: >
+ The sensor "Current Page" (`{{ currentpage }}`) is unavailable.
+
+ - Panel: {{ nspanel_name }}
+
+ - Blueprint version: {{ blueprint_version }}
+
+ - Sensor's expected entity_id: {{ currentpage }}
+
+
+ How to fix this:
+
+ 1. Go to the [device page](/config/devices/device/{{ nspanel_deviceid }})
+
+ 2. Find the sensor "Current page" under the "Sensors" area (it might be in the "sensors not shown" group)
+
+ 3. Enable the sensor
+
+ 4. Wait a bit until the sensor starts providing a value (it shouldn't take more than half minute)
+
+ 5. Go to [Developer Tools](/developer-tools/yaml) and click the button "Automations" to reload your automations
+ continue_on_error: true
+
+ ##### Update global settings (as user may have changed something) #####
+ - *global_settings
- choose:
## PAGE HOME ##
- - conditions: '{{ nspanel_event.page == page.home }}'
+ - conditions: '{{ page.current == page.home }}'
sequence: *refresh_page_home
## PAGE BUTTON PAGES 01 - 04 ##
- - conditions: '{{ nspanel_event.page in page.buttonpages }}'
+ - conditions: '{{ page.current in page.buttonpages }}'
sequence: *refresh_page_buttonpage
## ENTITY PAGES ##
- - conditions: '{{ nspanel_event.page in page.entitypages }}'
+ - conditions: '{{ page.current in page.entitypages }}'
sequence: *refresh-entity_pages
- ##### UPDATE BUTTONS PAGES - button page / lightsettings page / coversettings page #####
+ ##### UPDATE BUTTONS PAGES - button page / light page / cover page #####
- alias: 'Buttons entity updated'
conditions:
- condition: trigger
@@ -8611,14 +9027,13 @@ action:
- '{{ trigger.to_state.state not in ["unavailable", "unknown", "", None] }}'
- condition: or
conditions:
- - '{{ nspanel_event.page in page.buttonpages }}'
- - '{{ nspanel_event.page in [page.light, page.cover, page.climate] }}'
-
+ - '{{ page.current in page.buttonpages }}'
+ - '{{ page.current in [page.light, page.cover, page.climate, page.fan, page.alarm] }}'
sequence:
- choose:
- alias: "Button pages"
conditions:
- - '{{ nspanel_event.page in page.buttonpages }}'
+ - '{{ page.current in page.buttonpages }}'
sequence: #*refresh_page_buttonpage
- *variables-page_buttons
- repeat:
@@ -8626,7 +9041,7 @@ action:
{{
button_pages_buttons
| selectattr("page", "defined")
- | selectattr("page", "eq", nspanel_event.page)
+ | selectattr("page", "eq", page.current)
| selectattr("entity", "defined")
| selectattr("entity", "eq", trigger.entity_id)
| list
@@ -8634,19 +9049,33 @@ action:
sequence: *display-button_page_button
- alias: 'Light settings page'
conditions:
- - '{{ nspanel_event.page == page.light }}'
+ - '{{ page.current == page.light }}'
- '{{ trigger.entity_id is match "light." }}'
- sequence: *refresh_page_lightsettings
+ sequence: *refresh_page_light
- alias: 'Cover settings page'
conditions:
- - '{{ nspanel_event.page == page.cover }}'
+ - '{{ page.current == page.cover }}'
- '{{ trigger.entity_id is match "cover." }}'
- sequence: *refresh_page_coversettings
+ sequence: *refresh_page_cover
- alias: 'Climate page'
conditions:
- - '{{ nspanel_event.page == page.climate }}'
+ - '{{ page.current == page.climate }}'
- '{{ trigger.entity_id is match "climate." }}'
sequence: *refresh_page_climate
+ - alias: 'Fan page'
+ conditions:
+ - '{{ page.current == page.fan }}'
+ - '{{ trigger.entity_id is match "fan." }}'
+ sequence: *refresh_page_fan
+ - alias: 'Media player page'
+ conditions:
+ - '{{ page.current == page.media_player }}'
+ - '{{ trigger.entity_id is match "media_player." }}'
+ sequence: *refresh_page_media_player
+ #- alias: 'Alarm page'
+ # conditions:
+ # - '{{ page.current == page.alarm }}'
+ # sequence: *refresh-page_alarm
##### UPDATE ENTITY PAGES #####
- alias: 'Update entity pages'
@@ -8657,7 +9086,7 @@ action:
- trigger_entitypage02
- trigger_entitypage03
- trigger_entitypage04
- - '{{ nspanel_event.page in page.entitypages }}'
+ - '{{ page.current in page.entitypages }}'
sequence:
- *variables-entity_pages
- repeat:
@@ -8665,7 +9094,7 @@ action:
{{
entity_pages_entities
| selectattr("page", "defined")
- | selectattr("page", "eq", nspanel_event.page)
+ | selectattr("page", "eq", page.current)
| selectattr("entity", "defined")
| selectattr("entity", "eq", trigger.entity_id)
| list
@@ -8681,7 +9110,7 @@ action:
- climate_value02_state
- climate_value03_state
- climate_value04_state
- - '{{ nspanel_event.page == page.climate }}'
+ - '{{ page.current == page.climate }}'
sequence:
- *variables-climate_page
- repeat:
@@ -8701,7 +9130,7 @@ action:
id:
- climate_button08_state
- climate_button09_state
- - '{{ nspanel_event.page == page.climate }}'
+ - '{{ page.current == page.climate }}'
sequence:
- *climate-update_custom_buttons
@@ -8710,14 +9139,26 @@ action:
conditions:
- condition: trigger
id: climate_state
- - '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
- - '{{ nspanel_event.page == page.climate }}'
sequence:
- - variables:
- climate_entity: '{{ trigger.event.data.entity_id }}'
- hvac_modes: '{{ state_attr(climate_entity, "hvac_modes") if settings_entity_domain == "climate" }}'
- - *climate-update_slider
- - *climate-update_buttons
+ - *update-home_page-climate_chip
+ - if:
+ - '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
+ - '{{ page.current == page.climate }}'
+ then:
+ - variables:
+ climate_entity: '{{ trigger.event.data.entity_id }}'
+ hvac_modes: '{{ state_attr(climate_entity, "hvac_modes") }}'
+ - *climate-update_slider
+ - *climate-update_buttons
+
+ ##### Sync Alarm #####
+ - alias: Alarm - Sync
+ conditions:
+ - condition: trigger
+ id: alarm_state
+ #- '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
+ #- '{{ page.current == page.alarm }}'
+ sequence: *refresh-page_alarm
########## TRIGGER - HOME PAGE ###########
@@ -8729,7 +9170,7 @@ action:
- home_value01_state
- home_value02_state
- home_value03_state
- - '{{ nspanel_event.page == page.home }}'
+ - '{{ page.current == page.home }}'
sequence:
- *variables-home_page_values
- repeat:
@@ -8742,9 +9183,6 @@ action:
conditions:
- condition: trigger
id:
- - relay01_state
- - relay02_state
- - climate_state
- chip01_state
- chip02_state
- chip03_state
@@ -8752,7 +9190,8 @@ action:
- chip05_state
- chip06_state
- chip07_state
- - '{{ nspanel_event.page == page.home and trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
+ #- '{{ page.current == page.home }}'
+ #- '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
sequence:
- *variables-home_page_status_bar
- repeat:
@@ -8766,84 +9205,27 @@ action:
sequence:
- *display-home_page_status_bar
- #### SHOW BUTTON - notification ####
- - alias: Show button - Notification
- conditions:
- - condition: trigger
- id:
- - notification_text_state
- - notification_unread_state
- - '{{ nspanel_event.page == page.home }}'
- - '{{ trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
- sequence:
- - *refresh-page_home-notifications_icon
-
- ##### HW BUTTON - press #####
- - alias: Hardware button - Press
- conditions:
- - condition: trigger
- id:
- - left_button_press
- - right_button_press
- sequence:
- - variables:
- button_context: '{{ page_home.hardware.buttons.left if trigger.id == "left_button_press" else page_home.hardware.buttons.right }}'
- - wait_template: '{{ is_state(left_button if trigger.id == "left_button_press" else right_button, "off") }}'
- timeout: !input hold_delay
- continue_on_timeout: true
- - if: '{{ not wait.completed }}'
- then: # Hold
- - choose:
- - conditions: '{{ button_context.hold_select == "Default" and button_context.entity | length > 0 }}'
- sequence:
- - service: '{{ nextion.command.set_settings_entity }}'
- data:
- entity: '{{ button_context }}'
- continue_on_error: true
- - conditions: '{{ button_context.hold_select == "Custom Action" and trigger.id == "left_button_press" }}'
- sequence: !input left_button_hold_custom_action
- - conditions: '{{ button_context.hold_select == "Custom Action" and trigger.id == "right_button_press" }}'
- sequence: !input right_button_hold_custom_action
- else: # Single Click
- - condition: template
- value_template: '{{ button_context.entity | length > 0 }}'
- - variables:
- button_domain: '{{ (button_context.entity.split(".")[0] | default("unknown")) if button_context.entity | length > 0 else "unknown" }}'
- - service: >
- {% if button_domain in ["light", "switch", "cover", "input_boolean", "automation", "fan"] %}
- {{ button_domain }}.toggle
- {% elif button_domain in ["button", "input_button"] %}
- {{ button_domain }}.press
- {% elif button_domain in ["scene", "script"] %}
- {{ button_domain }}.turn_on
- {% else %}
- homeassistant.update_entity
- {% endif %}
- data:
- entity_id: '{{ button_context.entity }}'
- continue_on_error: true
-
- ##### BUTTON - state #####
- - alias: Button - State
+ ##### HW BUTTON - state #####
+ - alias: Hardware button - State
conditions:
- condition: trigger
id:
- left_button_state
- right_button_state
- - '{{ nspanel_event.page == page.home }}'
+ - '{{ page.current == page.home }}'
- '{{ trigger.to_state.state not in ["unavailable", "unknown", "", None] }}'
sequence:
##### SET hardware Button PIC on Home Page ####
- service: '{{ nextion.command.printf }}'
data:
- cmd: 'home.{{ "left" if trigger.id == "left_button_state" else "right"}}_bt_pic.pic={{ nextion.pic.hardware.button.off if trigger.to_state.state in ["off", "closed", "closing"] else nextion.pic.hardware.button.on }}'
+ cmd: 'home.{{ "left" if trigger.id == "left_button_state" else "right"}}_bt_pic.val={{ 1 if trigger.to_state.state in ["on", "open", "opened", "opening", "true", true, 1] else 0 }}'
continue_on_error: true
- condition: '{{ trigger.to_state.state not in ["off", "closed", "closing", "on", "open", "closed"] }}'
- delay:
milliseconds: 800
- service: '{{ nextion.command.printf }}'
data:
- cmd: 'home.{{ "left" if trigger.id == "left_button_state" else "right"}}_bt_pic.pic={{ nextion.pic.hardware.button.off }}'
+ cmd: 'home.{{ "left" if trigger.id == "left_button_state" else "right"}}_bt_pic.val=0'
continue_on_error: true
##### OUTDOOR TEMP - entity #####
@@ -8851,7 +9233,7 @@ action:
conditions:
- condition: trigger
id: outdoortemp_state
- - '{{ nspanel_event.page == page.home and is_number(trigger.event.data.new_state.state) }}'
+ - '{{ page.current == page.home and is_number(trigger.event.data.new_state.state) }}'
sequence:
- *refresh-page_home-outdoor_temp
@@ -8862,7 +9244,7 @@ action:
id:
- indoortemp_state
- nspaneltemp_state
- - '{{ nspanel_event.page == page.home and is_number(trigger.event.data.new_state.state) }}'
+ - '{{ page.current == page.home and is_number(trigger.event.data.new_state.state) }}'
sequence:
- *refresh-page_home-indoor_temp
@@ -8871,7 +9253,7 @@ action:
conditions:
- condition: trigger
id: weather_state_change
- - '{{ nspanel_event.page == page.home and trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
+ - '{{ page.current == page.home and trigger.event.data.new_state.state not in ["unavailable", "unknown", "", None] }}'
sequence:
- *refresh-page_home-outdoor_temp
- *delay-default
@@ -8889,16 +9271,19 @@ action:
data: {}
continue_on_error: true
- ##### Wake-up when slee mode is disabled #####
+ ##### Wake-up when sleep mode is disabled #####
- alias: Sleep mode changed
conditions:
- condition: trigger
id: sleep_mode_state
- - "{{ nspanel_event.page == page.screensaver }}"
+ - "{{ page.current == page.screensaver }}"
- "{{ trigger.event.data.old_state.state == 'on' }}"
- "{{ trigger.event.data.new_state.state == 'off' }}"
sequence:
- - *jump_page_home
+ service: '{{ nextion.command.wake_up }}'
+ data:
+ reset_timer: true
+ continue_on_error: true
#############################################################
##### CLOSE - Action #####
diff --git a/nspanel_esphome.yaml b/nspanel_esphome.yaml
index 25070ef69..f577a7dc3 100644
--- a/nspanel_esphome.yaml
+++ b/nspanel_esphome.yaml
@@ -5,56 +5,19 @@
##### For normal use with the Blueprint, no changes are necessary. #####
#####################################################################################################
-
-##### ADVANCED CONFIGURATION - activate only when you know what you do ##############################
substitutions:
- baud_rate: "115200" # requires 115200 if tft is installed but can be changed to 9600 if tft upload fails and nextion switches to 9600
- # ## usage of secrets-file ## -> comment in ###### Change ME ######
- # device_name: "nspanel-name" # Wird im Blueprint benÃļtigt!
- # wifi_ssid: !secret nspanel_wifi_ssid # add in your esphome secrets file.
- # wifi_password: !secret nspanel_wifi_password # add in your esphome secrets file. -> per default this is also used for ota_password and web_password
- # ota_password: !secret nspanel_ota_password # add in your esphome secrets file. - manual change in code required to activate
- # web_password: !secret nspanel_web_password # add in your esphome secrets file. - manual change in code required to activate
- # api_password: !secret nspanel_api_password # add in your esphome secrets file. - manual change in code required to activate
- # nextion_update_url: !secret nspanel_update_url # add in your esphome secrets file. Example: "http://"HOME ASSISTANT IP":8123/local/nspanel/nspanel.tft"
-
- # ## static ip config ##
- # ip: "10.0.0.7"
- # gw: "10.0.0.138"
- # subnet: "255.255.255.0"
- # dns: "10.0.0.138"
- # domain: ".local"
-
-###### USE THIS ONLY FOR YOUR FIRST TFT UPLOAD
-###### AND IF EXIT-REPARSE BUTTON FAILS
-###### ONCE IT WORKED, REMOVE THESE LINES
-###### https://github.com/esphome/esphome/pull/2956
-# external_components:
-# - source: github://pr#2956
-# components: [nextion]
-# refresh: 1h
-##################################################
-
-##### if you rename this file to .nspanel_esphome.yaml then you can activate nested config
-##### use the ADVANCED CONFIG-Section as device configuration
-##### https://esphome.io/guides/configuration-types.html#yaml-insertion-operator
-# <<: !include .nspanel_esphome.yaml
-
-##### END OF ADVANCED CONFIGURATION ##############################################################
+
+ ##### DON'T CHANGE THIS #####
+ version: "4.0"
+ #############################
##### WIFI SETUP #####
wifi:
- ssid: ${wifi_ssid}
- password: ${wifi_password}
+ networks:
+ - id: wifi_default
+ ssid: ${wifi_ssid}
+ password: ${wifi_password}
power_save_mode: none
- ##### advanced config - uncomment to use static IP-Config #####
- # manual_ip:
- # static_ip: ${ip}
- # gateway: ${gw}
- # subnet: ${subnet}
- # dns1: ${dns}
- # domain: ${domain}
- ##### Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "${device_name}"
password: ${wifi_password}
@@ -62,7 +25,7 @@ wifi:
##### ESPHOME CONFIGURATION #####
esphome:
name: ${device_name}
- min_version: 2022.10.2
+ min_version: 2023.5.0
##### TYPE OF ESP BOARD #####
esp32:
@@ -71,53 +34,60 @@ esp32:
captive_portal:
web_server:
+ id: web_server_std
port: 80
auth:
username: admin
password: ${wifi_password}
- ##### advanced config - change to use web_password #####
- # password: ${web_password}
##### OTA PASSWORD #####
ota:
+ id: ota_std
password: ${wifi_password}
- ##### advanced config - change to use ota_password #####
- # password: ${ota_password}
safe_mode: true
reboot_timeout: 3min
num_attempts: 3
##### LOGGER #####
logger:
- baud_rate: 0
- # level: WARN
+ id: logger_std
+
+##### ENABLE RINGTONE MUSIC SUPPORT #####
+rtttl:
+ id: buzzer
+ output: buzzer_out
##### CONFIGURE INTERNAL BUZZER #####
output:
- ##### BUZZER FOR PLAYING RINGTONES #####
+ ##### BUZZER FOR PLAYING RINGTONES #####
- platform: ledc
id: buzzer_out
pin:
number: 21
-##### ENABLE RINGTONE MUSIC SUPPORT #####
-rtttl:
- id: buzzer
- output: buzzer_out
-
##### UART FOR NEXTION DISPLAY #####
uart:
+ id: tf_uart
tx_pin: 16
rx_pin: 17
- baud_rate: ${baud_rate}
- id: tf_uart
- # debug:
- # direction: BOTH
- # dummy_receiver: false
- # after:
- # delimiter: "\n"
- # sequence:
- # - lambda: UARTDebug::log_string(direction, bytes);
+ baud_rate: 115200
+
+##### Keeps time display updated #####
+time:
+ - id: time_provider
+ platform: homeassistant
+ on_time:
+ - seconds: 0
+ then:
+ - script.execute:
+ id: refresh_datetime
+ on_time_sync:
+ then:
+ - component.update: api_timestamp
+ - component.update: device_timestamp
+ - logger.log: "System clock synchronized"
+ - script.execute:
+ id: refresh_datetime
##### START - BUTTON CONFIGURATION #####
button:
@@ -133,6 +103,7 @@ button:
id: tft_update
entity_category: config
on_press:
+ - logger.log: "Button pressed: Update TFT display"
- binary_sensor.template.publish:
id: nextion_init
state: false
@@ -146,6 +117,7 @@ button:
id: tft_reparse_off
entity_category: config
on_press:
+ - logger.log: "Button pressed: Exit reparse"
- uart.write:
id: tf_uart
data: "DRAKJHSUYDGBNCJHGJKSHBDN"
@@ -155,13 +127,15 @@ button:
##### START - API CONFIGURATION #####
api:
- ##### advanced config - activate to use api_password #####
- # password: ${api_password}
+ id: api_server
+ reboot_timeout: 0s
+
services:
##### SERVICE TO UPDATE THE HMI FILE ##############
- service: upload_tft
then:
+ - logger.log: "Service: upload_tft"
- binary_sensor.template.publish:
id: nextion_init
state: false
@@ -172,6 +146,7 @@ api:
variables:
url: string
then:
+ - logger.log: "Service: upload_tft_url"
- binary_sensor.template.publish:
id: nextion_init
state: false
@@ -191,8 +166,6 @@ api:
component: string
message: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: 'id(disp1).set_component_text_printf(component.c_str(), "%s", message.c_str());'
##### Service to send a command "component_value (Dualstate Button)" directly to the display #####
@@ -201,8 +174,6 @@ api:
component: string
message: int
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: 'id(disp1).set_component_value(component.c_str(), message);'
##### Service to send a command "hide componente" directly to the display #####
@@ -210,8 +181,6 @@ api:
variables:
component: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: 'id(disp1).hide_component(component.c_str());'
##### Service to send a command "show componente" directly to the display #####
@@ -219,36 +188,21 @@ api:
variables:
component: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: 'id(disp1).show_component(component.c_str());'
##### Service to send a command "show ALL componente" directly to the display #####
- service: send_command_show_all ### unused ###
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- - lambda: 'id(disp1).show_component("255");'
+ - lambda: id(disp1).show_component("255");
##### Service to send a command "font color" directly to the display #####
- - service: send_command_font_color
+ - service: set_component_color
variables:
component: string
- message: int
- then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- - lambda: 'id(disp1).set_component_font_color(component.c_str(), message);'
-
- ##### Service to send a command "background color" directly to the display #####
- - service: send_command_background_color
- variables:
- component: string
- message: int
+ foreground: int[]
+ background: int[]
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- - lambda: 'id(disp1).set_component_background_color(component.c_str(), message);'
+ - lambda: id(set_component_color).execute(component, foreground, background);
##### Service to show a notification-message on the screen #####
- service: notification_show
@@ -256,40 +210,73 @@ api:
label: string
text: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: |-
+ ESP_LOGV("service.notification_show", "Starting");
+ ESP_LOGV("service.notification_show", "label: %s", label.c_str());
+ ESP_LOGV("service.notification_show", "text: %s", text.c_str());
+ ESP_LOGV("service.notification_show", "text length: %i", text.length());
+
+ id(disp1).send_command_printf("is_notification=1");
id(disp1).send_command_printf("page notification");
id(disp1).set_component_text_printf("notification.notifi_label", "%s", label.c_str());
- id(disp1).set_component_text_printf("notification.notifi_text01", "%s", text.c_str());
+
+ id(display_wrapped_text).execute("notification.notifi_text01", text.c_str(), id(display_mode) == 2 ? 23 : 32);
+
id(notification_label).publish_state(label.c_str());
id(notification_text).publish_state(text.c_str());
- switch.turn_on: notification_unread
- if:
condition:
- switch.is_on: notification_sound
+ - switch.is_on: notification_sound
then:
- rtttl.play: "two short:d=4,o=5,b=100:16e6,16e6"
##### Service to clear the notification #####
- service: notification_clear
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- - lambda: |-
+ - logger.log: "Service: notification_clear"
+ - ¬ification_clear
+ lambda: |-
+ id(disp1).send_command_printf("is_notification=0");
id(notification_label).publish_state("");
id(notification_text).publish_state("");
- switch.turn_off: notification_unread
- ##### Service to set entity-information for settings-page(s)
- - service: set_settings_entity
+ ##### Service to open information for settings-page(s)
+ - service: open_entity_settings_page
variables:
+ page: string
+ page_label: string
+ page_icon: string
+ page_icon_color: int[]
entity: string
+ back_page: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: |-
- id(settings_entity).publish_state(entity.c_str());
+ ESP_LOGV("api.service.open_entity_settings_page", "Starting");
+ ESP_LOGV("api.service.open_entity_settings_page", "page: %s", page.c_str());
+ ESP_LOGV("api.service.open_entity_settings_page", "page_label: %s", page_label.c_str());
+ ESP_LOGV("api.service.open_entity_settings_page", "page_icon: %s", page_icon.c_str());
+ ESP_LOGV("api.service.open_entity_settings_page", "page_icon_color: %i, %i, %i", page_icon_color[0], page_icon_color[1], page_icon_color[2] );
+ ESP_LOGV("api.service.open_entity_settings_page", "entity: %s", entity.c_str());
+ ESP_LOGV("api.service.open_entity_settings_page", "back_page: %s", back_page.c_str());
+ id(entity_id) = entity;
+ std::string cmd_page = std::string("page ") + page.c_str();
+ id(disp1).send_command_printf(cmd_page.c_str());
+ id(disp1).set_component_text_printf("page_label", "%s", page_label.c_str());
+ id(disp1).set_component_text_printf("back_page", "%s", back_page.c_str());
+ if (page == "climate")
+ {
+ if (entity == "embedded_climate") id(addon_climate_set_climate_friendly_name).execute(page_label.c_str());
+ id(disp1).set_component_value("embedded", (entity == "embedded_climate") ? 1 : 0);
+ }
+ else
+ {
+ if ((page_icon.c_str() != std::string()) and (page_icon.c_str() != ""))
+ id(disp1).set_component_text_printf("icon_state", "%s", page_icon.c_str());
+ id(set_component_color).execute("icon_state", page_icon_color, {});
+ }
+ ESP_LOGV("api.service.open_entity_settings_page", "Finished");
##### Service to play a rtttl tones #####
# Example tones : https://codebender.cc/sketch:109888#RTTTL%20Songs.ino
@@ -301,15 +288,16 @@ api:
rtttl: !lambda 'return song_str;'
# Service to show a QR code on the display (ex. for WiFi password)
- - service: qr_code
+ - service: qrcode
variables:
- qrdata: string
+ title: string
+ qrcode: string
+ show: bool
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: |-
- id(disp1).send_command_printf("page qrcode");
- id(disp1).set_component_text_printf("qrcode.qrcode_value", "%s", qrdata.c_str());
+ id(disp1).set_component_text_printf("qrcode.qrcode_label", "%s", title.c_str());
+ id(disp1).set_component_text_printf("qrcode.qrcode_value", "%s", qrcode.c_str());
+ if (show) id(disp1).send_command_printf("page qrcode");
#### Service to set climate state ####
- service: set_climate
@@ -318,106 +306,78 @@ api:
target_temp: float
temp_step: int
total_steps: int
- slider_val: int
temp_offset: int
climate_icon: string
+ embedded_climate: bool
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- - lambda: |-
- if (target_temp > -999)
- {
- id(disp1).set_component_value("climateslider", slider_val);
- id(disp1).set_component_text_printf("target_temp", "%.1f°", target_temp);
- id(disp1).set_component_text_printf("target_icon", "%s", climate_icon.c_str());
- id(disp1).show_component("target_icon");
- id(disp1).show_component("target_temp");
- id(disp1).show_component("climateslider");
- id(disp1).show_component("decrease_temp");
- id(disp1).show_component("increase_temp");
- }
- else
- {
- id(disp1).hide_component("target_icon");
- id(disp1).hide_component("target_temp");
- id(disp1).hide_component("climateslider");
- id(disp1).hide_component("decrease_temp");
- id(disp1).hide_component("increase_temp");
- }
- lambda: |-
- id(disp1).send_command_printf("climateslider.maxval=%i", total_steps);
- id(disp1).set_component_value("temp_offset", temp_offset);
- id(disp1).set_component_value("temp_step", temp_step);
- id(disp1).set_component_text_printf("current_temp", "%.1f°", current_temp);
- id(disp1).show_component("current_temp");
- id(disp1).show_component("current_icon");
+ ESP_LOGV("api.service.set_climate", "climateslider.maxval=%i", total_steps);
+ ESP_LOGV("api.service.set_climate", "temp_offset=%f", temp_offset);
+ ESP_LOGV("api.service.set_climate", "temp_step=%f", temp_step);
+ ESP_LOGV("api.service.set_climate", "current_temp=%f", current_temp);
+ ESP_LOGV("api.service.set_climate", "target_temp=%f", target_temp);
+ ESP_LOGV("api.service.set_climate", "target_icon=%s", climate_icon.c_str());
+ ESP_LOGV("api.service.set_climate", "embedded=%i", (embedded_climate) ? 1 : 0);
+
+ - script.execute:
+ id: set_climate
+ current_temp: !lambda "return current_temp;"
+ target_temp: !lambda "return target_temp;"
+ temp_step: !lambda "return temp_step;"
+ total_steps: !lambda "return total_steps;"
+ temp_offset: !lambda "return temp_offset;"
+ climate_icon: !lambda "return climate_icon;"
+ embedded_climate: !lambda "return embedded_climate;"
#### Service to set the buttons ####
- service: set_button
variables:
btn_id: string
btn_pic: int
- btn_bg: int
- btn_icon_font: int
- btn_txt_font: int
- btn_bri_font: int
+ btn_bg: int[]
+ btn_icon_font: int[]
+ btn_txt_font: int[]
+ btn_bri_font: int[]
btn_icon: string
btn_label: string
btn_bri_txt: string
+ btn_confirm: bool
+ #entity: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: |-
- // ESP_LOGD("nextion", "set button %s", btn_id.c_str());
+ // ESP_LOGV("nextion", "set button %s", btn_id.c_str());
std::string btnicon = btn_id.c_str() + std::string("icon");
std::string btntext = btn_id.c_str() + std::string("text");
std::string btnbri = btn_id.c_str() + std::string("bri");
+ std::string btnconf = btn_id.c_str() + std::string("conf");
+ //std::string btnentity = btn_id.c_str() + std::string("entity");
id(disp1).send_command_printf("%spic.pic=%i", btn_id.c_str(), btn_pic);
- id(disp1).set_component_background_color(btnicon.c_str(), btn_bg);
- id(disp1).set_component_background_color(btntext.c_str(), btn_bg);
- id(disp1).set_component_background_color(btnbri.c_str(), btn_bg);
- id(disp1).set_component_font_color(btnicon.c_str(), btn_icon_font);
- id(disp1).set_component_font_color(btntext.c_str(), btn_txt_font);
- id(disp1).set_component_font_color(btnbri.c_str(), btn_bri_font);
+ id(set_component_color).execute(btnicon.c_str(), btn_icon_font, btn_bg);
+ id(set_component_color).execute(btntext.c_str(), btn_txt_font, btn_bg);
+ id(set_component_color).execute(btnbri.c_str(), btn_bri_font, btn_bg);
id(disp1).set_component_text_printf(btnicon.c_str(), "%s", btn_icon.c_str());
- id(disp1).set_component_text_printf(btntext.c_str(), "%s", btn_label.c_str());
- // id(disp1).set_component_text_printf(btnbri.c_str(), "%s", btn_bri_txt.c_str());
- if (strcmp(btn_bri_txt.c_str(), "0") != 0) {
+ id(display_wrapped_text).execute(btntext.c_str(), btn_label.c_str(), 10);
+ if (strcmp(btn_bri_txt.c_str(), "0") != 0)
id(disp1).set_component_text_printf(btnbri.c_str(), "%s", btn_bri_txt.c_str());
- } else {
+ else
id(disp1).set_component_text_printf(btnbri.c_str(), " ");
- }
+ id(disp1).set_component_value(btnconf.c_str(), (btn_confirm) ? 1 : 0);
+ //id(disp1).set_component_text_printf(btnentity.c_str(), "%s", entity.c_str());
##### SERVICE TO WAKE UP THE DISPLAY #####
- - service: wake_up_display
+ - service: wake_up
variables:
- option: string
+ reset_timer: bool
then:
- lambda: |-
- DynamicJsonDocument doc(1024);
- deserializeJson(doc, id(disp1_nspanel_event).state);
- std::string page = doc["page"];
- if (page == "screensaver") {
- id(disp1).send_command_printf("page home");
- } else {
- if (page == "home"){
- id(disp1).send_command_printf("dim=brightness.val");
+ if (id(current_page).state == "home")
+ {
+ id(disp1).send_command_printf("home.dimtimer.en=1");
+ id(disp1).send_command_printf("home.sleeptimer.en=1");
}
- }
- - if:
- condition:
- - lambda: 'return option == "keep_wake";'
- then:
- - lambda: id(disp1).send_command_printf("home.dimtimer.en=1");
- - lambda: id(disp1).send_command_printf("home.sleeptimer.en=1");
- - if:
- condition:
- - lambda: 'return option == "keep_page";'
- then:
- - lambda: id(disp1).send_command_printf("home.dimtimer.en=1");
- - lambda: id(disp1).send_command_printf("home.sleeptimer.en=1");
- - lambda: |-
- id(page_timer)->execute(int(id(page_timeout).state));
+ else if (id(current_page).state == "screensaver") id(disp1).send_command_printf("page %s", id(wakeup_page_name).state.c_str());
+ id(disp1).send_command_printf("dim=brightness");
+ if (reset_timer) id(page_timer)->execute();
#### Service to set the entities ####
- service: set_entity
@@ -428,26 +388,480 @@ api:
ent_value: string
ent_value_xcen: string
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- lambda: |-
- // ESP_LOGD("nextion", "set entity %s", ent_id.c_str());
+ ESP_LOGV("service.set_entity", "entity: %s", ent_id.c_str());
std::string enticon = ent_id.c_str() + std::string("_pic");
std::string entlabel = ent_id.c_str() + std::string("_label");
std::string entxcen = ent_id.c_str() + std::string(".xcen=") + ent_value_xcen.c_str();
id(disp1).set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str());
- if (strcmp(ent_icon.c_str(), "0") != 0) {
- id(disp1).set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str());
- }
+ if (strcmp(ent_icon.c_str(), "0") != 0) id(disp1).set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str());
id(disp1).set_component_text_printf(entlabel.c_str(), "%s", ent_label.c_str());
+ //id(display_wrapped_text).execute(entlabel.c_str(), ent_label.c_str(), id(display_mode) == 2 ? 16 : 20);
id(disp1).set_component_text_printf(ent_id.c_str(), "%s", ent_value.c_str());
- if (strcmp(ent_value_xcen.c_str(), "0") != 0) {
- id(disp1).send_command_printf("%s", entxcen.c_str());
- }
+ if (strcmp(ent_value_xcen.c_str(), "0") != 0) id(disp1).send_command_printf("%s", entxcen.c_str());
+
+ ##### Service for transferring global settings from the blueprint to ESPHome #####
+ - service: global_settings
+ variables:
+ blueprint_version: string
+ relay1_local_control: bool
+ relay1_icon: string
+ relay1_icon_color: int
+ relay2_local_control: bool
+ relay2_icon: string
+ relay2_icon_color: int
+ date_color: int
+ time_format: string
+ time_color: int
+ embedded_climate: bool
+ embedded_indoor_temperature: bool
+ temperature_unit_is_fahrenheit: bool
+ mui_please_confirm: string
+ then:
+ - lambda: |-
+ // Logs - Begin
+ ESP_LOGV("service.global_settings", "Starting");
+ ESP_LOGD("service.global_settings", "Blueprint version: %s", blueprint_version.c_str());
+ ESP_LOGV("service.global_settings", "relay1_local_control: %i", (relay1_local_control) ? 1 : 0);
+ ESP_LOGV("service.global_settings", "relay1_icon: %s", relay1_icon.c_str());
+ ESP_LOGV("service.global_settings", "relay1_icon_color: %i", relay1_icon_color);
+ ESP_LOGV("service.global_settings", "relay2_local_control: %i", (relay2_local_control) ? 1 : 0);
+ ESP_LOGV("service.global_settings", "relay2_icon: %s", relay2_icon.c_str());
+ ESP_LOGV("service.global_settings", "relay2_icon_color: %i", relay2_icon_color);
+ ESP_LOGV("service.global_settings", "date_color: %i", date_color);
+ ESP_LOGV("service.global_settings", "time_format: %s", time_format.c_str());
+ ESP_LOGV("service.global_settings", "time_color: %i", time_color);
+ ESP_LOGV("service.global_settings", "embedded_climate: %i", (embedded_climate) ? 1 : 0);
+ ESP_LOGV("service.global_settings", "embedded_indoor_temperature: %i", (embedded_indoor_temperature) ? 1 : 0);
+ ESP_LOGV("service.global_settings", "temperature_unit_is_fahrenheit: %i", (temperature_unit_is_fahrenheit) ? 1 : 0);
+ ESP_LOGV("service.global_settings", "mui_please_confirm: %s", mui_please_confirm.c_str());
+
+ // Blueprint version
+ id(version_blueprint) = blueprint_version;
+ id(check_versions).execute();
+
+ // Relays
+ id(relay1_local).publish_state(relay1_local_control);
+ id(relay2_local).publish_state(relay2_local_control);
+ id(home_relay1_icon) = relay1_icon.c_str();
+ id(home_relay2_icon) = relay2_icon.c_str();
+ id(home_relay1_icon_color) = relay1_icon_color;
+ id(home_relay2_icon_color) = relay2_icon_color;
+
+ // Localization
+ id(mui_time_format) = time_format;
+
+ // Date/Time colors
+ id(home_date_color) = date_color;
+ id(home_time_color) = time_color;
+
+ // Embedded thermostat
+ id(is_embedded_thermostat) = embedded_climate;
+
+ // Indoor temperature
+ id(embedded_indoor_temp) = embedded_indoor_temperature;
+ id(temp_unit_fahrenheit) = temperature_unit_is_fahrenheit;
+ id(display_embedded_temp)->execute();
+
+ // Confirm page
+ ESP_LOGV("service.global_settings", "Confirm page - Start");
+ id(display_wrapped_text).execute("confirm.title", mui_please_confirm.c_str(), 15);
+
+ // Refresh colors of global components
+ ESP_LOGV("service.global_settings", "Refresh colors of global components");
+ id(disp1).set_component_font_color("home.date", id(home_date_color));
+ id(disp1).set_component_font_color("home.time", id(home_time_color));
+ id(disp1).set_component_font_color("home.icon_top_01", id(home_relay1_icon_color));
+ id(disp1).set_component_font_color("home.icon_top_02", id(home_relay2_icon_color));
+
+ // Update home page
+ ESP_LOGV("service.global_settings", "Update home page");
+ id(update_page_home).execute();
+
+ - if:
+ condition:
+ - text_sensor.state: # Is boot page visible?
+ id: current_page
+ state: 'boot'
+ then:
+ - lambda: |-
+ ESP_LOGV("service.global_settings", "Boot page is visible");
+ id(disp1).set_component_text_printf("boot.bluep_version", "%s", blueprint_version.c_str());
+ ESP_LOGV("service.global_settings", "Wait a bit");
+ - wait_until:
+ condition:
+ - not:
+ - text_sensor.state: # Is boot page visible?
+ id: current_page
+ state: 'boot'
+ timeout: 2s
+ - if:
+ condition:
+ - text_sensor.state: # Avoid this being called twice by multiple boot triggers
+ id: current_page
+ state: 'boot'
+ then:
+ - if:
+ condition:
+ switch.is_on: notification_sound
+ then:
+ - lambda: ESP_LOGV("service.global_settings", "Play boot sound");
+ - rtttl.play:
+ rtttl: 'two short:d=4,o=5,b=100:16e6,16e6'
+ - lambda: |-
+ ESP_LOGV("service.global_settings", "Jump to wake-up page: %s", id(wakeup_page_name).state.c_str());
+ id(disp1).send_command_printf("page %s", id(wakeup_page_name).state.c_str());
+
+ - lambda: ESP_LOGV("service.global_settings", "Finished");
+
+ #### Service to populate the page Home #####
+ - service: page_home
+ variables:
+ notification_icon: string
+ notification_icon_color_normal: int[]
+ notification_icon_color_unread: int[]
+ qrcode: bool
+ qrcode_icon: string
+ qrcode_icon_color: int[]
+ entities_pages: bool
+ entities_pages_icon: string
+ entities_pages_icon_color: int[]
+ alarm_state: string
+ then:
+ - lambda: |-
+ // Logs - Begin
+ ESP_LOGV("service.page_home_settings", "Starting");
+ ESP_LOGV("service.page_home_settings", "notification_icon: %s", notification_icon.c_str());
+ ESP_LOGV("service.page_home_settings", "qrcode: %i", (qrcode) ? 1 : 0);
+ ESP_LOGV("service.page_home_settings", "qrcode_icon: %s", qrcode_icon.c_str());
+ ESP_LOGV("service.page_home_settings", "entities_pages: %i", (entities_pages) ? 1 : 0);
+ ESP_LOGV("service.page_home_settings", "entities_pages_icon: %s", entities_pages_icon.c_str());
+ ESP_LOGV("service.page_home_settings", "alarm_state: %s", alarm_state.c_str());
+
+ // Notification button
+ ESP_LOGV("service.page_home_settings", "Notification button - Start");
+ id(disp1).send_command_printf("is_notification=%i", (id(notification_text).state.empty() and id(notification_label).state.empty()) ? 0 : 1);
+ id(disp1).set_component_text_printf("home.bt_notific", "%s", notification_icon.c_str());
+ id(set_component_color).execute("home.bt_notific", id(notification_unread).state ? notification_icon_color_unread : notification_icon_color_normal, {});
+ id(home_notify_icon_color_normal) = notification_icon_color_normal;
+ id(home_notify_icon_color_unread) = notification_icon_color_unread;
+
+ // QRCode button
+ ESP_LOGV("service.page_home_settings", "QRcode button - Start");
+ id(disp1).send_command_printf("is_qrcode=%i", (qrcode) ? 1 : 0);
+ id(disp1).set_component_text_printf("home.bt_qrcode", "%s", qrcode_icon.c_str());
+ id(set_component_color).execute("home.bt_qrcode", qrcode_icon_color, {});
+
+ // Entities pages button
+ ESP_LOGV("service.page_home_settings", "Entities pages button - Start");
+ id(disp1).send_command_printf("is_entities=%i", (entities_pages) ? 1 : 0);
+ id(disp1).set_component_text_printf("home.bt_entities", "%s", entities_pages_icon.c_str());
+ id(set_component_color).execute("home.bt_entities", entities_pages_icon_color, {});
+
+ // Alarm button
+ ESP_LOGV("service.page_home_settings", "Alarm button - Start");
+ id(disp1).send_command_printf("is_alarm=%i", (alarm_state=="" or alarm_state.empty()) ? 0 : 1);
+ id(update_alarm_icon)->execute("home.bt_alarm", alarm_state.c_str());
+
+ // Logs - End
+ ESP_LOGV("service.page_home_settings", "Finished");
+
+ #### Service to populate the page Settings #####
+ - service: page_settings
+ variables:
+ reboot: string
+ sleep_mode: string
+ brightness: string
+ bright: string
+ dim: string
+ then:
+ - lambda: |-
+ ESP_LOGV("service.page_settings", "Starting");
+ ESP_LOGV("service.page_settings", "reboot: %s", reboot.c_str());
+ ESP_LOGV("service.page_settings", "sleep_mode: %s", sleep_mode.c_str());
+ ESP_LOGV("service.page_settings", "brightness: %s", brightness.c_str());
+ ESP_LOGV("service.page_settings", "bright: %s", bright.c_str());
+ ESP_LOGV("service.page_settings", "dim: %s", dim.c_str());
+ if (not reboot.empty()) id(disp1).set_component_text_printf("settings.lbl_reboot", " %s", reboot.c_str());
+ if (not sleep_mode.empty()) id(disp1).set_component_text_printf("settings.lbl_sleep", " %s", sleep_mode.c_str());
+ id(display_wrapped_text).execute("settings.lbl_brightness", brightness.c_str(), id(display_mode) == 2 ? 25 : 10);
+ id(display_wrapped_text).execute("settings.lbl_bright", bright.c_str(), id(display_mode) == 2 ? 25 : 10);
+ id(display_wrapped_text).execute("settings.lbl_dim", dim.c_str(), id(display_mode) == 2 ? 25 : 10);
+
+ #### Service to populate the alarm settings page #####
+ - service: alarm_settings
+ variables:
+ page_title: string
+ state: string
+ supported_features: int
+ code_format: string
+ code_arm_required: bool
+ entity: string
+ mui_alarm: string[] #std::vector #std::map
+ then:
+ - lambda: |-
+ // Logs - Begin
+ ESP_LOGV("service.alarm_settings", "Starting");
+ ESP_LOGV("service.alarm_settings", "page_title: %s", page_title.c_str());
+ ESP_LOGV("service.alarm_settings", "state: %s", state.c_str());
+ ESP_LOGV("service.alarm_settings", "supported_features: %i", supported_features);
+ ESP_LOGV("service.alarm_settings", "code_format: %s", code_format.c_str());
+ ESP_LOGV("service.alarm_settings", "code_arm_required: %i", (code_arm_required) ? 1 : 0);
+ ESP_LOGV("service.alarm_settings", "entity: %s", entity.c_str());
+
+ // set alarm icon on home page
+ ESP_LOGV("service.alarm_settings", "Updating home page icon");
+ id(disp1).send_command_printf("is_alarm=%i", (state=="" or state.empty()) ? 0 : 1);
+ id(update_alarm_icon)->execute("home.bt_alarm", state.c_str());
+
+ // Is page Alarm visible?
+ if (id(current_page).state=="alarm")
+ { // Update alarm page
+ ESP_LOGV("service.alarm_settings", "Updating alarm page");
+ id(entity_id) = entity;
+
+ // Alarm page - Header
+ id(update_alarm_icon)->execute("icon_state", state.c_str());
+ id(disp1).set_component_text_printf("page_label", "%s", page_title.c_str());
+ id(disp1).set_component_text_printf("code_format", "%s", code_format.c_str());
+ if (code_arm_required) id(disp1).set_component_text_printf("code_arm_req", "1"); else id(disp1).set_component_text_printf("code_arm_req", "0");
+
+ // Alarm page - Button's icons
+ id(disp1).set_component_text_printf("bt_home_icon", "\uE689"); //mdi:shield-home
+ id(disp1).set_component_text_printf("bt_away_icon", "\uE99C"); //mdi:shield-lock
+ id(disp1).set_component_text_printf("bt_night_icon", "\uF827"); //mdi:shield-moon
+ id(disp1).set_component_text_printf("bt_vacat_icon", "\uE6BA"); //mdi:shield-airplane
+ id(disp1).set_component_text_printf("bt_bypass_icon", "\uE77F"); //mdi:shield-half-full
+ id(disp1).set_component_text_printf("bt_disarm_icon", "\uE99D"); //mdi:shield-off
+
+ // Alarm page - Button's text
+ id(display_wrapped_text).execute("bt_home_text", mui_alarm[0].c_str(), 10);
+ id(display_wrapped_text).execute("bt_away_text", mui_alarm[1].c_str(), 10);
+ id(display_wrapped_text).execute("bt_night_text", mui_alarm[2].c_str(), 10);
+ id(display_wrapped_text).execute("bt_vacat_text", mui_alarm[3].c_str(), 10);
+ id(display_wrapped_text).execute("bt_bypass_text", mui_alarm[4].c_str(), 10);
+ id(display_wrapped_text).execute("bt_disarm_text", mui_alarm[5].c_str(), 10);
+
+ // Alarm page - Buttons
+ if (supported_features & 1) // Alarm - Button - Home
+ {
+ id(disp1).send_command_printf("bt_home_pic.pic=%i", (state=="armed_home") ? 43 : 42);
+ id(disp1).set_component_background_color("bt_home_text", (state=="armed_home") ? 19818 : 52857);
+ id(disp1).set_component_background_color("bt_home_icon", (state=="armed_home") ? 19818 : 52857);
+ id(disp1).set_component_font_color("bt_home_text", (state=="armed_home") ? 65535 : 0);
+ id(disp1).set_component_font_color("bt_home_icon", (state=="armed_home") ? 65535 : 0);
+ if (state=="armed_home") id(disp1).hide_component("bt_home"); else id(disp1).show_component("bt_home");
+ }
+ if (supported_features & 2) // Alarm - Button - Away
+ {
+ id(disp1).send_command_printf("bt_away_pic.pic=%i", (state=="armed_away") ? 43 : 42);
+ id(disp1).set_component_background_color("bt_away_text", (state=="armed_away") ? 19818 : 52857);
+ id(disp1).set_component_background_color("bt_away_icon", (state=="armed_away") ? 19818 : 52857);
+ id(disp1).set_component_font_color("bt_away_text", (state=="armed_away") ? 65535 : 0);
+ id(disp1).set_component_font_color("bt_away_icon", (state=="armed_away") ? 65535 : 0);
+ if (state=="armed_away") id(disp1).hide_component("bt_away"); else id(disp1).show_component("bt_away");
+ }
+ if (supported_features & 4) // Alarm - Button - Night
+ {
+ id(disp1).send_command_printf("bt_night_pic.pic=%i", (state=="armed_night") ? 43 : 42);
+ id(disp1).set_component_background_color("bt_night_text", (state=="armed_night") ? 19818 : 52857);
+ id(disp1).set_component_background_color("bt_night_icon", (state=="armed_night") ? 19818 : 52857);
+ id(disp1).set_component_font_color("bt_night_text", (state=="armed_night") ? 65535 : 0);
+ id(disp1).set_component_font_color("bt_night_icon", (state=="armed_night") ? 65535 : 0);
+ if (state=="armed_night") id(disp1).hide_component("bt_night"); else id(disp1).show_component("bt_night");
+ }
+ if (supported_features & 32) // Alarm - Button - Vacation
+ {
+ id(disp1).send_command_printf("bt_vacat_pic.pic=%i", (state=="armed_vacation") ? 43 : 42);
+ id(disp1).set_component_background_color("bt_vacat_text", (state=="armed_vacation") ? 19818 : 52857);
+ id(disp1).set_component_background_color("bt_vacat_icon", (state=="armed_vacation") ? 19818 : 52857);
+ id(disp1).set_component_font_color("bt_vacat_text", (state=="armed_vacation") ? 65535 : 0);
+ id(disp1).set_component_font_color("bt_vacat_icon", (state=="armed_vacation") ? 65535 : 0);
+ if (state=="armed_vacation") id(disp1).hide_component("bt_vacat"); else id(disp1).show_component("bt_vacat");
+ }
+ if (supported_features & 16) // Alarm - Button - Custom bypass
+ {
+ id(disp1).send_command_printf("bt_bypass_pic.pic=%i", (state=="armed_bypass") ? 43 : 42);
+ id(disp1).set_component_background_color("bt_bypass_text", (state=="armed_bypass") ? 19818 : 52857);
+ id(disp1).set_component_background_color("bt_bypass_icon", (state=="armed_bypass") ? 19818 : 52857);
+ id(disp1).set_component_font_color("bt_bypass_text", (state=="armed_bypass") ? 65535 : 0);
+ id(disp1).set_component_font_color("bt_bypass_icon", (state=="armed_bypass") ? 65535 : 0);
+ if (state=="armed_bypass") id(disp1).hide_component("bt_bypass"); else id(disp1).show_component("bt_bypass");
+ }
+ if ( true ) // Alarm - Button - Disarm
+ {
+ id(disp1).send_command_printf("bt_disarm_pic.pic=%i", (state=="disarmed") ? 43 : 42);
+ id(disp1).set_component_background_color("bt_disarm_text", (state=="disarmed") ? 19818 : 52857);
+ id(disp1).set_component_background_color("bt_disarm_icon", (state=="disarmed") ? 19818 : 52857);
+ id(disp1).set_component_font_color("bt_disarm_text", (state=="disarmed") ? 65535 : 0);
+ id(disp1).set_component_font_color("bt_disarm_icon", (state=="disarmed") ? 65535 : 0);
+ if (state=="disarmed") id(disp1).hide_component("bt_disarm"); else id(disp1).show_component("bt_disarm");
+ }
+ }
+
+ // Logs - End
+ ESP_LOGV("service.alarm_settings", "Finished");
+
+ #### Service to populate the media player page #####
+ - service: media_player
+ variables:
+ entity: string
+ state: string
+ is_volume_muted: bool
+ friendly_name: string
+ volume_level: int
+ media_title: string
+ media_artist: string
+ media_duration: int
+ media_position: int
+ supported_features: int
+ then:
+ - lambda: |-
+ ESP_LOGV("service.media_player", "Starting");
+ if (id(current_page).state == "media_player")
+ {
+ //id(disp1).set_component_text_printf("entity", "%s", entity.c_str());
+ id(entity_id) = entity;
+ id(disp1).set_component_text_printf("page_label", "%s", friendly_name.c_str());
+ id(display_wrapped_text).execute("track", media_title.c_str(), id(display_mode) == 2 ? 16 : 27);
+ id(display_wrapped_text).execute("artist", media_artist.c_str(), id(display_mode) == 2 ? 26 : 40);
+ // states:
+ // OFF: Entity is turned off and is not accepting commands until turned on.
+ // ON: Entity is turned on, but no details on its state is currently known.
+ // IDLE: Entity is turned on and accepting commands, but currently not playing any media. Possibly at some idle home screen.
+ // PLAYING: Entity is currently playing media.
+ // PAUSED: Entity has an active media and is currently paused
+ // STANDBY: Entity is in a low power state, accepting commands.
+ // BUFFERING: Entity is preparing to start playback of some media
+ // feature:
+ // PAUSE: 1
+ // SEEK: 2
+ // VOLUME_SET: 4
+ // VOLUME_MUTE: 8
+ // PREVIOUS_TRACK: 16
+ // NEXT_TRACK: 32
+ // reserved: 64
+ // TURN_ON: 128
+ // TURN_OFF: 256
+ // PLAY_MEDIA: 512
+ // VOLUME_STEP: 1024
+ // SELECT_SOURCE: 2048
+ // STOP: 4096
+ // CLEAR_PLAYLIST: 8192
+ // PLAY: 16384
+ // SHUFFLE_SET: 32768
+ // SELECT_SOUND_MODE: 65536
+ // BROWSE_MEDIA: 131072
+ // REPEAT_SET: 262144
+ // GROUPING: 524288
+ // MEDIA_ANNOUNCE: 1048576
+ // MEDIA_ENQUEUE: 2097152
+
+ // on/off button
+ if (supported_features & 128 and state == "off") //TURN_ON
+ {
+ id(set_component_color).execute("bt_on_off", { 65535 }, {} );
+ id(disp1).show_component("bt_on_off");
+ }
+ else if (supported_features & 256 and state != "off") //TURN_OFF
+ {
+ id(set_component_color).execute("bt_on_off", { 10597 }, {} );
+ id(disp1).show_component("bt_on_off");
+ }
+ else id(disp1).hide_component("bt_on_off");
+
+ // play/pause button
+ if ((supported_features & 512 or supported_features & 16384) and state != "playing" and state != "off") //PLAY_MEDIA+PLAY
+ {
+ id(disp1).set_component_text_printf("bt_play_pause", "%s", "\uE409"); // mdi:play
+ id(disp1).show_component("bt_play_pause");
+ }
+ else if (supported_features & 1 and state == "playing" ) //PAUSE
+ {
+ id(disp1).set_component_text_printf("bt_play_pause", "%s", "\uE3E3"); // mdi:pause
+ id(disp1).show_component("bt_play_pause");
+ }
+ else id(disp1).hide_component("bt_play_pause");
+
+ // bt_prev button - PREVIOUS_TRACK
+ if (supported_features & 16 and state != "off") id(disp1).show_component("bt_prev"); else id(disp1).hide_component("bt_prev");
+ // bt_next button - NEXT_TRACK
+ if (supported_features & 32 and state != "off") id(disp1).show_component("bt_next"); else id(disp1).hide_component("bt_next");
+
+ // Stop button - STOP
+ if (supported_features & 4096 and (state == "playing" or state == "paused")) id(disp1).show_component("bt_stop"); else id(disp1).hide_component("bt_stop");
+
+ // mute/unmute button - VOLUME_MUTE
+ id(disp1).set_component_value("is_muted", (is_volume_muted) ? 1 : 0);
+ if (supported_features & 8 and is_volume_muted) // unmute
+ {
+ id(disp1).set_component_text_printf("bt_mute", "%s", "\uE57E"); // mdi:volume-low
+ id(disp1).show_component("bt_mute");
+ }
+ else if (supported_features & 8) // mute
+ {
+ id(disp1).set_component_text_printf("bt_mute", "%s", "\uEE07"); // mdi:volume-variant-off
+ id(disp1).show_component("bt_mute");
+ }
+ else id(disp1).hide_component("bt_mute");
+
+ // VOLUME_SET
+ if (supported_features & 4)
+ {
+ id(disp1).set_component_text_printf("vol_text", "%i%%", volume_level);
+ id(disp1).set_component_value("vol_slider", volume_level);
+ id(disp1).show_component("vol_slider");
+ id(disp1).show_component("bt_vol_down");
+ id(disp1).show_component("bt_vol_up");
+ id(disp1).show_component("vol_text");
+ }
+ else
+ {
+ id(disp1).hide_component("vol_slider");
+ id(disp1).hide_component("bt_vol_down");
+ id(disp1).hide_component("bt_vol_up");
+ id(disp1).hide_component("vol_text");
+ }
+
+ if (media_duration > 0)
+ {
+ id(disp1).set_component_value("prg_current", media_position);
+ id(disp1).set_component_value("prg_total", media_duration);
+ id(disp1).send_command_printf("prg_timer.en=%i", (state == "playing") ? 1 : 0);
+ id(disp1).show_component("time_current");
+ id(disp1).show_component("time_total");
+ id(disp1).show_component("time_progress");
+ }
+ else
+ {
+ id(disp1).send_command_printf("prg_timer.en=0");
+ id(disp1).hide_component("time_current");
+ id(disp1).hide_component("time_total");
+ id(disp1).hide_component("time_progress");
+ }
+ }
##### START - GLOBALS CONFIGURATION #####
globals:
+ ##### Display mode (1 = EU, 2 = US, 3 = US Landscape)
+ - id: display_mode
+ type: int
+ restore_value: true
+ initial_value: '0'
+
+ ##### Entity Id of the entity displayed on the detailed pages
+ - id: entity_id
+ type: std::string
+ restore_value: no
+ initial_value: ''
+
+ ##### Is embedded thermostat set as main climate entity? #####
+ - id: is_embedded_thermostat
+ type: bool
+ restore_value: true
+ initial_value: 'false'
+
##### Save Display Brightness for NSPanel reboot #####
- id: display_brightness_global
type: int
@@ -460,11 +874,77 @@ globals:
restore_value: true
initial_value: '10'
- ##### Temperature Correction #####
- - id: temperature_correction_global
- type: float
+ ##### Temperature unit #####
+ ##### Is embedded sensor used for indoor temperature? #####
+ - id: embedded_indoor_temp
+ type: bool
+ restore_value: true
+ initial_value: 'true'
+ - id: temp_unit_fahrenheit
+ type: bool
+ restore_value: true
+ initial_value: 'false'
+
+ ##### Date/time formats #####
+ #- id: mui_date_format
+ # type: std::string
+ # restore_value: no
+ # initial_value: '"%A, %d.%m"'
+ - id: home_date_color
+ type: int
+ restore_value: true
+ initial_value: '65535'
+
+ - id: mui_time_format
+ type: std::string
+ restore_value: no
+ initial_value: '"%H:%M"'
+
+ - id: home_time_color
+ type: int
+ restore_value: true
+ initial_value: '65535'
+
+ ##### Relay icons #####
+ - id: home_relay1_icon
+ type: std::string
+ restore_value: false
+ initial_value: ''
+
+ - id: home_relay1_icon_color
+ type: int
+ restore_value: true
+ initial_value: '65535'
+
+ - id: home_relay2_icon
+ type: std::string
+ restore_value: false
+ initial_value: ''
+
+ - id: home_relay2_icon_color
+ type: int
restore_value: true
- initial_value: '0.0'
+ initial_value: '65535'
+
+ - id: home_notify_icon_color_normal
+ type: std::vector
+ restore_value: false
+ #initial_value: '52857'
+
+ - id: home_notify_icon_color_unread
+ type: std::vector
+ restore_value: false
+ #initial_value: '63488'
+
+ ##### Versions #####
+ - id: version_blueprint
+ type: std::string
+ restore_value: false
+ initial_value: ''
+ - id: version_tft
+ type: std::string
+ restore_value: false
+ initial_value: ''
##### START - BINARY SENSOR CONFIGURATION #####
binary_sensor:
@@ -476,25 +956,31 @@ binary_sensor:
pin:
number: 14
inverted: true
- on_click:
- then:
- - if:
- condition:
- and:
- - switch.is_on: relay1_fallback
- - not:
- api.connected:
- then:
- - switch.toggle: relay_1
- - if:
- condition:
- switch.is_on: relay_1
- then:
- - lambda: id(disp1).send_command_printf("home.left_bt_pic.pic=78");
- - lambda: id(disp1).send_command_printf("home.icon_top_01","\U0000E3A5");
- else:
- - lambda: id(disp1).send_command_printf("home.left_bt_pic.pic=77");
- - lambda: id(disp1).send_command_printf("home.icon_top_01","\U0000FFFF");
+ on_multi_click:
+ - timing: &long_click-timing
+ - ON for at least 0.8s
+ then:
+ - logger.log: "Left button - Long click"
+ - script.execute:
+ id: ha_button
+ page: !lambda return id(current_page).state;
+ component: "hw_bt_left"
+ command: "long_click"
+ - timing: &short_click-timing
+ - ON for at most 0.8s
+ then:
+ - logger.log: "Left button - Short click"
+ - if:
+ condition:
+ - switch.is_on: relay1_local
+ then:
+ - switch.toggle: relay_1
+ - script.execute: refresh_relays
+ - script.execute:
+ id: ha_button
+ page: !lambda return id(current_page).state;
+ component: "hw_bt_left"
+ command: "short_click"
##### RIGHT BUTTON BELOW DISPLAY TO TOGGLE RELAY #####
- name: ${device_name} Right Button
@@ -503,43 +989,35 @@ binary_sensor:
pin:
number: 27
inverted: true
- on_click:
- then:
- - if:
- condition:
- and:
- - switch.is_on: relay2_fallback
- - not:
- api.connected:
- then:
- - switch.toggle: relay_2
- - if:
- condition:
- switch.is_on: relay_2
- then:
- - lambda: id(disp1).send_command_printf("home.right_bt_pic.pic=78");
- - lambda: id(disp1).send_command_printf("home.icon_top_02","\U0000E3A8");
- else:
- - lambda: id(disp1).send_command_printf("home.right_bt_pic.pic=77");
- - lambda: id(disp1).send_command_printf("home.icon_top_02","\U0000FFFF");
-
- ##### JUMP PAGE TO SETTING PAGE #####
- - name: $device_name setting page
- platform: nextion
- page_id: 0
- component_id: 52
- internal: true
on_multi_click:
- - timing:
- - ON for at least 1s #LONG Press
+ - timing: *long_click-timing
+ then:
+ - logger.log: "Right button - Long click"
+ - script.execute:
+ id: ha_button
+ page: !lambda return id(current_page).state;
+ component: "hw_bt_right"
+ command: "long_click"
+ - timing: *short_click-timing
then:
- - lambda: 'id(disp1).send_command_printf("page settings");'
+ - logger.log: "Right button - Short click"
+ - if:
+ condition:
+ - switch.is_on: relay2_local
+ then:
+ - switch.toggle: relay_2
+ - script.execute: refresh_relays
+ - script.execute:
+ id: ha_button
+ page: !lambda return id(current_page).state;
+ component: "hw_bt_right"
+ command: "short_click"
##### Restart NSPanel Button - Setting Page #####
- name: ${device_name} Restart
platform: nextion
page_id: 7
- component_id: 13
+ component_id: 9
internal: true
on_click:
- button.press: restart_nspanel
@@ -557,7 +1035,7 @@ binary_sensor:
- name: ${device_name} Sleep mode
platform: nextion
page_id: 7
- component_id: 14
+ component_id: 10
internal: true
on_click:
- logger.log: "Sleep mode - Nextion toggle"
@@ -574,29 +1052,70 @@ binary_sensor:
icon: mdi:tablet-dashboard
##### API connection status
- - platform: status
- name: ${device_name} Status
+ - name: ${device_name} Status
+ platform: status
+ id: api_status
+ on_state:
+ then:
+ - script.execute:
+ id: refresh_wifi_icon
##### START - SENSOR CONFIGURATION #####
sensor:
- ##### Uptime #####
- - name: ${device_name} uptime
+ ##### touchevent sensor, Reset the page timeout #####
+ - id: touchevent
+ platform: nextion
+ nextion_id: disp1
+ component_name: touchevent
+ internal: true
+ on_value:
+ then:
+ - lambda: |-
+ id(page_timer)->execute();
+
+ ##### Send current brightness info to Home Assistant
+ - name: ${device_name} Brightness
+ id: brightness
+ platform: nextion
+ variable_name: dim
+ #update_interval: 1s
+ internal: false
+ precision: 0
+
+ ##### Uptime Sensors #####
+ - name: ${device_name} Uptime seconds
+ id: uptime_sec
platform: uptime
- disabled_by_default: true
+ internal: true
+
+ - name: ${device_name} API uptime
+ id: api_timestamp
+ platform: template
+ lambda: 'return id(time_provider).now().timestamp;'
+ internal: false
+ device_class: timestamp
+ entity_category: diagnostic
+ accuracy_decimals: 0
+ update_interval: never
+
+ - name: ${device_name} Device uptime
+ id: device_timestamp
+ platform: template
+ lambda: 'return (id(time_provider).now().timestamp - id(uptime_sec).state);'
+ internal: false
+ device_class: timestamp
+ entity_category: diagnostic
+ accuracy_decimals: 0
+ update_interval: never
##### WIFI Signal stregth
- name: ${device_name} RSSI
platform: wifi_signal
update_interval: 60s
on_value:
- - if:
- condition:
- wifi.connected:
- then:
- - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\U0000E5A8");
- else:
- - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\U0000FFFF");
+ - script.execute:
+ id: refresh_wifi_icon
##### INTERNAL TEMPERATURE SENSOR, ADC VALUE #####
- id: ntc_source
@@ -622,13 +1141,11 @@ sensor:
reference_temperature: 25°C
reference_resistance: 10kOhm
filters:
- - lambda: return x + id(temperature_correction_global);
- #on_value:
- # then:
- # - wait_until:
- # binary_sensor.is_on: nextion_init
- # - lambda: id(disp1).set_component_text_printf("home.current_temp", "%.1f°", id(temp_nspanel).state); # onboard temp (thermostat temp) to home page.
- # - lambda: id(disp1).set_component_text_printf("climate.current_temp", "%.1f", id(temp_nspanel).state);
+ - lambda: return x + id(temperature_correction).state;
+ on_value:
+ then:
+ # Show panel's temperature if API or Wi-Fi are out
+ - lambda: id(display_embedded_temp)->execute();
###### Display Brightness GET VALUE FROM NSPanel SLIDER #####
- name: ${device_name} brightness Slider
@@ -638,13 +1155,9 @@ sensor:
internal: true
on_value:
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- number.set:
id: display_brightness
value: !lambda 'return int(x);'
- # send text field percentage of current_lightslider_val
- - lambda: id(disp1).set_component_text_printf("settings.a03", "%i", id(display_brightness_global));
###### Display DIM Brightness GET VALUE FROM NSPanel SLIDER #####
- name: ${device_name} dim brightness slider
@@ -654,20 +1167,29 @@ sensor:
internal: true
on_value:
then:
- - wait_until:
- binary_sensor.is_on: nextion_init
- number.set:
id: display_dim_brightness
value: !lambda 'return int(x);'
- # send text field percentage of current_lightslider_val
- - lambda: id(disp1).set_component_text_printf("settings.a04", "%i", id(display_dim_brightness_global));
##### START - TEXT SENSOR CONFIGURATION #####
text_sensor:
+ ##### Current page name #####
+ - name: ${device_name} current page
+ platform: template
+ id: current_page
+ internal: false
+ disabled_by_default: false
+ on_value:
+ then:
+ - lambda: |-
+ if (x != "climate" and x != "cover" and x != "fan" and x != "light" and x != "media_player" ) id(entity_id) = "";
+ ESP_LOGD("text_sensor.current_page", "New page: %s", x.c_str());
+ if (!id(entity_id).empty()) ESP_LOGD("text_sensor.current_page", "Entity shown: %s", id(entity_id).c_str());
+
##### ESPhome version used to compile the app #####
- - platform: version
- name: ${device_name} ESPhome Version
+ - name: ${device_name} ESPhome Version
+ platform: version
disabled_by_default: true
- platform: wifi_info
@@ -690,17 +1212,13 @@ text_sensor:
platform: template
id: notification_text
- - name: ${device_name} Settings Entity
- platform: template
- id: settings_entity
-
##### NSPanel event sensor, the main action sensor - push to HA #####
- name: ${device_name} NSPanel event
platform: nextion
nextion_id: disp1
id: disp1_nspanel_event
component_name: nspanelevent
- internal: false
+ internal: true
filters:
- lambda: |-
x = x.c_str();
@@ -709,14 +1227,135 @@ text_sensor:
on_value:
then:
- lambda: |-
- id(page_timer)->execute(int(id(page_timeout).state));
+ ESP_LOGV("text_sensor.nspanelevent", "Starting");
+ id(page_timer)->execute();
+ DynamicJsonDocument doc(1024);
+ deserializeJson(doc, x);
+ std::string page = doc["page"];
+ std::string component = doc["component"];
+ std::string value = doc["value"];
+ std::string entity = id(entity_id); //doc["entity"];
+ ESP_LOGV("text_sensor.nspanelevent", "page: %s", page.c_str());
+ ESP_LOGV("text_sensor.nspanelevent", "component: %s", component.c_str());
+ ESP_LOGV("text_sensor.nspanelevent", "value: %s", value.c_str());
+ ESP_LOGV("text_sensor.nspanelevent", "entity: %s", entity.c_str());
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "generic"},
+ {"page", page},
+ {"component", component},
+ {"value", value},
+ {"entity", entity}
+ });
+ if (component=="currentpage")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "New page: %s", page.c_str());
+ ESP_LOGV("text_sensor.nspanelevent", "Trigger HA event");
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "page_changed"},
+ {"page", page},
+ {"entity", entity}
+ });
+ ESP_LOGV("text_sensor.nspanelevent", "Call add-ons scripts for new page");
+ id(addon_climate_set_climate).execute(page=="climate" and entity=="embedded_climate");
+ ESP_LOGV("text_sensor.nspanelevent", "Publish current_page sensor");
+ id(current_page).publish_state(page);
+ ESP_LOGV("text_sensor.nspanelevent", "Construct new page");
+ if (page=="home")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct home page");
+ id(update_page_home).execute();
+ }
+ else if (page=="screensaver")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct screensaver page");
+ int wakeup_page_id = 0;
+ if (id(wakeup_page_name).state == "buttonpage01") wakeup_page_id = 12;
+ else if (id(wakeup_page_name).state == "buttonpage02") wakeup_page_id = 13;
+ else if (id(wakeup_page_name).state == "buttonpage03") wakeup_page_id = 14;
+ else if (id(wakeup_page_name).state == "buttonpage04") wakeup_page_id = 15;
+ else if (id(wakeup_page_name).state == "entitypage01") wakeup_page_id = 18;
+ else if (id(wakeup_page_name).state == "entitypage02") wakeup_page_id = 19;
+ else if (id(wakeup_page_name).state == "entitypage03") wakeup_page_id = 20;
+ else if (id(wakeup_page_name).state == "entitypage04") wakeup_page_id = 21;
+ else if (id(wakeup_page_name).state == "qrcode") wakeup_page_id = 17;
+ else if (id(wakeup_page_name).state == "alarm") wakeup_page_id = 23;
+ ESP_LOGV("text_sensor.nspanelevent", "Wake-up page id: %i", wakeup_page_id);
+ id(disp1).set_component_value("orign", wakeup_page_id);
+ }
+ else if (page=="climate")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct climate page");
+ id(disp1).set_component_text_printf("climate.button01_icon", "%s", "\uEE8D"); //mdi:calendar-sync
+ id(disp1).set_component_text_printf("climate.button02_icon", "%s", "\uE069"); //mdi:autorenew
+ id(disp1).set_component_text_printf("climate.button03_icon", "%s", "\uE237"); //mdi:fire
+ id(disp1).set_component_text_printf("climate.button04_icon", "%s", "\uE716"); //mdi:snowflake
+ id(disp1).set_component_text_printf("climate.button05_icon", "%s", "\uE58D"); //mdi:water-percent
+ id(disp1).set_component_text_printf("climate.button06_icon", "%s", "\uE20F"); //mdi:fan
+ id(disp1).set_component_text_printf("climate.button07_icon", "%s", "\uE424"); //mdi:power
+ id(addon_climate_update_page_climate)->execute();
+ }
+ else if (page=="cover")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct cover page");
+ id(disp1).set_component_text_printf("cover.cover_stop", "%s", "\uE666"); //mdi:stop-circle-outline
+ // In the future this will be dynamically contructed based on the device_class
+ id(disp1).set_component_text_printf("cover.cover_open", "%s", "\uF11D"); //mdi:window-shutter-open
+ id(disp1).set_component_text_printf("cover.cover_close", "%s", "\uF11B"); //mdi:window-shutter
+ }
+ else if (page=="fan")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct fan page");
+ id(disp1).set_component_text_printf("fan.button_on", "%s", "\uE20F"); //mdi:fan
+ id(disp1).set_component_text_printf("fan.button_off", "%s", "\uE81C"); //mdi:fan-off
+ id(disp1).set_component_text_printf("fan.button_up", "%s", "\uF46D"); //mdi:fan-chevron-up
+ id(disp1).set_component_text_printf("fan.button_down", "%s", "\uF46C"); //mdi:fan-chevron-down
+ }
+ else if (page=="keyb_num")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct keyb_num page");
+ id(disp1).set_component_text_printf("keyb_num.bview", "%s", "\uE207"); //mdi:eye
+ id(disp1).set_component_text_printf("keyb_num.bclose", "%s", "\uE158"); //mdi:close-circle
+ id(disp1).set_component_text_printf("keyb_num.bclear", "%s", "\uE641"); //mdi:eraser-variant
+ id(disp1).set_component_text_printf("keyb_num.benter", "%s", "\uE12B"); //mdi:check
+ }
+ else if (page=="weather01") id(disp1).set_component_text_printf("page_index", "%s", "\uE764\uE765\uE765\uE765\uE765"); // 1/5
+ else if (page=="weather02") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE764\uE765\uE765\uE765"); // 2/5
+ else if (page=="weather03") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE765\uE764\uE765\uE765"); // 3/5
+ else if (page=="weather04") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE765\uE765\uE764\uE765"); // 4/5
+ else if (page=="weather05") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE765\uE765\uE765\uE764"); // 5/5
+ else if (page=="buttonpage01" or page=="entitypage01") id(disp1).set_component_text_printf("page_index", "%s", "\uE764\uE765\uE765\uE765"); // 1/4
+ else if (page=="buttonpage02" or page=="entitypage02") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE764\uE765\uE765"); // 2/4
+ else if (page=="buttonpage03" or page=="entitypage03") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE765\uE764\uE765"); // 3/4
+ else if (page=="buttonpage04" or page=="entitypage04") id(disp1).set_component_text_printf("page_index", "%s", "\uE765\uE765\uE765\uE764"); // 4/4
+ else if (page=="settings") id(disp1).set_component_text_printf("bt_sleep", "%s", (id(sleep_mode).state) ? "\uEA19" : "\uEA18"); //mdi:toggle-switch-outline or mdi:toggle-switch-off-outline
+ else if (page=="notification")
+ {
+ id(disp1).set_component_text_printf("notification.notifi_label", "%s", id(notification_label).state.c_str());
+ id(display_wrapped_text).execute("notification.notifi_text01", id(notification_text).state.c_str(), id(display_mode) == 2 ? 23 : 32);
+ }
+ else if (page=="media_player")
+ {
+ ESP_LOGV("text_sensor.nspanelevent", "Construct media_player page");
+ id(disp1).set_component_text_printf("bt_on_off", "%s", "\uE424"); //mdi:power
+ id(disp1).set_component_text_printf("bt_prev", "%s", "\uE4AD"); //mdi:skip-previous
+ id(disp1).set_component_text_printf("bt_next", "%s", "\uE4AC"); //mdi:skip-next
+ id(disp1).set_component_text_printf("bt_play_pause", "%s", "\uE40D"); //mdi:play-pause
+ id(disp1).set_component_text_printf("bt_stop", "%s", "\uE4DA"); //mdi:stop
+ id(disp1).set_component_text_printf("bt_mute", "%s", "\uE75E"); //mdi:volume-mute
+ id(disp1).set_component_text_printf("bt_vol_down", "%s", "\uE75D"); //mdi:volume-minus
+ id(disp1).set_component_text_printf("bt_vol_up", "%s", "\uE75C"); //mdi:volume-plus
+ }
+ }
- ##### touchevent sensor, Reset the page timeout #####
- - id: disp1_touchevent
+ ##### NSPanel event - Execute actions from ESPHome - NO push to HA #####
+ - name: ${device_name} NSPanel local event
platform: nextion
nextion_id: disp1
- #name: ${device_name} touchevent
- component_name: touchevent
+ id: disp1_local_event
+ component_name: localevent
internal: true
filters:
- lambda: |-
@@ -726,7 +1365,143 @@ text_sensor:
on_value:
then:
- lambda: |-
- id(page_timer)->execute(int(id(page_timeout).state));
+ ESP_LOGV("text_sensor.localevent", "Starting");
+ id(page_timer)->execute();
+ DynamicJsonDocument doc(1024);
+ deserializeJson(doc, x);
+ std::string page = doc["page"];
+ ESP_LOGV("text_sensor.localevent", "page: %s", page.c_str());
+ std::string event = doc["event"];
+ ESP_LOGV("text_sensor.localevent", "event: %s", event.c_str());
+ std::string component = doc["component"];
+ ESP_LOGV("text_sensor.localevent", "component: %s", component.c_str());
+ std::string key = doc["key"];
+ ESP_LOGV("text_sensor.localevent", "key: %s", key.c_str());
+ std::string value = doc["value"];
+ ESP_LOGV("text_sensor.localevent", "value: %s", value.c_str());
+ std::string entity = id(entity_id); //doc["entity"];
+ ESP_LOGV("text_sensor.localevent", "entity: %s", entity.c_str());
+ int embedded = doc["embedded"];
+ ESP_LOGV("text_sensor.localevent", "embedded: %i", embedded);
+ std::string service = "";
+
+ // send event to Home Assistant
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ if (event=="pagechanged")
+ {
+ ESP_LOGV("text_sensor.localevent", "New page: %s", page.c_str());
+ ESP_LOGV("text_sensor.localevent", "Trigger HA event");
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "page_changed"},
+ {"page", page},
+ {"entity", entity}
+ });
+ ESP_LOGV("text_sensor.localevent", "Call add-ons scripts for new page");
+ id(addon_climate_set_climate).execute(page=="climate" and id(entity_id) == "embedded_climate");
+ ESP_LOGV("text_sensor.localevent", "Publish current_page sensor");
+ id(current_page).publish_state(page);
+ ESP_LOGV("text_sensor.localevent", "Construct new page");
+ }
+ else if (event=="short_click" or event=="long_click") id(ha_button)->execute(page.c_str(), component.c_str(), event.c_str());
+ else if (page == "light" or page == "climate" or page == "notification")// Generic event
+ {
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "generic"},
+ {"page", page},
+ {"event", event},
+ {"value", value},
+ {"entity", entity}
+ });
+ }
+
+ // page based actions
+ if (page == "alarm")
+ {
+ std::string code_format = doc["code_format"];
+ std::string code_arm_req = doc["code_arm_req"];
+ std::string title = doc["mui"];
+ if (code_format=="number" and (key=="disarm" or code_arm_req=="1"))
+ {
+ id(disp1).send_command_printf("page keyb_num");
+ id(disp1).set_component_value("keyb_num.page_id", 23); //Calling from Alarm page
+ id(disp1).set_component_text_printf("keyb_num.domain", "%s", page.c_str());
+ id(disp1).set_component_text_printf("keyb_num.key", "%s", key.c_str());
+ id(disp1).set_component_text_printf("keyb_num.value", "%s", value.c_str());
+ id(disp1).set_component_text_printf("keyb_num.entity", "%s", entity.c_str());
+ id(disp1).set_component_text_printf("keyb_num.title", "%s", title.c_str());
+ }
+ else id(service_call_alarm_control_panel)->execute(entity.c_str(), key.c_str(), code_format.c_str(), "");
+ }
+ else if (page=="boot")
+ {
+ // Detect display mode - Need review
+ if (doc.containsKey("display_mode"))
+ {
+ std::string display_mode_str = doc["display_mode"];
+ ESP_LOGV("text_sensor.localevent", "display_mode: %s", display_mode_str.c_str());
+ float display_mode_float = stof(display_mode_str);
+ if (display_mode_float > 0) id(display_mode) = int(display_mode_float);
+ }
+
+ // Detect TFT version
+ if (doc.containsKey("version"))
+ {
+ std::string version_tmp = doc["version"];
+ id(version_tft) = version_tmp;
+ }
+ id(check_versions).execute();
+
+ // Detect timeout
+ if (event=="timeout")
+ {
+ ESP_LOGV("text_sensor.localevent", "Trigger boot timeout event");
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "boot"},
+ {"step", "timeout"},
+ {"value", value}
+ });
+ if (stof(value) >= 5)
+ {
+ ESP_LOGV("text_sensor.localevent", "Jump to wakeup page: %s", id(wakeup_page_name).state.c_str());
+ id(disp1).send_command_printf("page %s", id(wakeup_page_name).state.c_str());
+ }
+ }
+ }
+ else if (page == "climate") id(service_call_climate)->execute(entity.c_str(), key.c_str(), value.c_str(), (embedded==1));
+ else if (page == "cover")
+ {
+ if (key == "position") id(ha_call_service)->execute("cover.set_cover_position", key.c_str(), value.c_str(), entity.c_str());
+ else id(ha_call_service)->execute((std::string("cover.") + key.c_str()), "", "", entity.c_str());
+ }
+ else if (page == "fan")
+ {
+ if (key == "stop" or value == "0") id(ha_call_service)->execute("fan.turn_off", "", "", entity.c_str());
+ else id(ha_call_service)->execute("fan.turn_on", key.c_str(), value.c_str(), entity.c_str());
+ }
+ else if (page == "keyb_num")
+ {
+ std::string base_domain = doc["base_domain"];
+ if (base_domain == "alarm")
+ {
+ std::string code_format = doc["code_format"];
+ std::string pin = doc["pin"];
+ id(service_call_alarm_control_panel)->execute(entity.c_str(), key.c_str(), code_format.c_str(), pin.c_str());
+ }
+ else if (base_domain == "" or base_domain.empty()) base_domain = "home";
+ id(disp1).send_command_printf("page %s", base_domain.c_str());
+ }
+ else if (page == "light") id(ha_call_service)->execute("light.turn_on", key.c_str(), value.c_str(), entity.c_str());
+ else if (page == "media_player")
+ {
+ if (key == "volume_mute") id(ha_call_service)->execute("media_player.volume_mute", "is_volume_muted", value.c_str(), entity.c_str());
+ else if (key == "volume_set") id(ha_call_service)->execute("media_player.volume_set", "volume_level", to_string(stof(value) / 100), entity.c_str());
+ else if (not key.empty()) id(ha_call_service)->execute((std::string("media_player.") + key.c_str()), "", "", entity.c_str());
+ }
+
+ ESP_LOGV("text_sensor.localevent", "Finished");
##### START - SWITCH CONFIGURATION #####
switch:
@@ -736,8 +1511,12 @@ switch:
platform: template
id: notification_unread
entity_category: config
- restore_mode: RESTORE_DEFAULT_OFF
optimistic: true
+ restore_mode: ALWAYS_OFF
+ on_turn_on:
+ - lambda: id(set_component_color).execute("home.bt_notific", id(home_notify_icon_color_unread), {});
+ on_turn_off:
+ - lambda: id(set_component_color).execute("home.bt_notific", id(home_notify_icon_color_normal), {});
##### Notification sound #####
- name: ${device_name} Notification sound
@@ -747,14 +1526,6 @@ switch:
optimistic: true
restore_mode: RESTORE_DEFAULT_OFF
- ##### Confirmation Message #####
- - name: ${device_name} Confirmation Message
- platform: template
- id: confirmation_message
- entity_category: config
- restore_mode: RESTORE_DEFAULT_OFF
- optimistic: true
-
##### PHYSICAL SWITCH 1 #####
- name: ${device_name} Relay 1
platform: gpio
@@ -762,7 +1533,14 @@ switch:
pin:
number: 22
restore_mode: RESTORE_DEFAULT_OFF
-
+ on_turn_on:
+ then:
+ - script.execute:
+ id: refresh_relays
+ on_turn_off:
+ then:
+ - script.execute:
+ id: refresh_relays
##### PHYSICAL SWITCH 2 ######
- name: ${device_name} Relay 2
platform: gpio
@@ -770,6 +1548,14 @@ switch:
pin:
number: 19
restore_mode: RESTORE_DEFAULT_OFF
+ on_turn_on:
+ then:
+ - script.execute:
+ id: refresh_relays
+ on_turn_off:
+ then:
+ - script.execute:
+ id: refresh_relays
##### DISPLAY ALWAYS ON #####
- name: ${device_name} Screen Power
@@ -791,34 +1577,43 @@ switch:
restore_mode: RESTORE_DEFAULT_OFF
optimistic: false
turn_on_action: &sleep_mode-turn_on
- - logger.log: "Sleep mode - Turn on"
- - lambda: id(disp1).send_command_printf("home.sleepmodus.val=1");
- - lambda: id(disp1).set_component_value("settings.bt1",1);
- - switch.template.publish:
- id: sleep_mode
- state: ON
+ - lambda: |-
+ ESP_LOGV("switch.sleep_mode", "Turn on");
+ id(disp1).send_command_printf("sleep_mode=1");
+ id(disp1).set_component_value("settings.bt_sleep",1);
+ id(disp1).set_component_text_printf("settings.bt_sleep", "%s", "\uEA19");
+ id(sleep_mode).publish_state(true);
turn_off_action: &sleep_mode-turn_off
- - logger.log: "Sleep mode - Turn off"
- - lambda: id(disp1).send_command_printf("home.sleepmodus.val=0");
- - lambda: id(disp1).set_component_value("settings.bt1",0);
- - switch.template.publish:
- id: sleep_mode
- state: OFF
-
- ##### Relay Local control Fallback #####
- - name: ${device_name} Relay 1 Local Fallback
+ - lambda: |-
+ ESP_LOGV("switch.sleep_mode", "Turn off");
+ id(disp1).send_command_printf("sleep_mode=0");
+ id(disp1).set_component_value("settings.bt_sleep",0);
+ id(disp1).set_component_text_printf("settings.bt_sleep", "%s", "\uEA18");
+ id(sleep_mode).publish_state(false);
+
+ ##### Relay Local control #####
+ - name: ${device_name} Relay 1 Local
platform: template
- id: relay1_fallback
+ id: relay1_local
entity_category: config
optimistic: true
restore_mode: RESTORE_DEFAULT_OFF
-
- - name: ${device_name} Relay 2 Local Fallback
+ internal: true
+ on_turn_on:
+ - logger.log: "Relay 1 Local turned On!"
+ on_turn_off:
+ - logger.log: "Relay 1 Local turned Off!"
+ - name: ${device_name} Relay 2 Local
platform: template
- id: relay2_fallback
+ id: relay2_local
entity_category: config
optimistic: true
restore_mode: RESTORE_DEFAULT_OFF
+ internal: true
+ on_turn_on:
+ - logger.log: "Relay 2 Local turned On!"
+ on_turn_off:
+ - logger.log: "Relay 2 Local turned Off!"
##### START - NUMBER CONFIGURATION #####
number:
@@ -836,11 +1631,19 @@ number:
optimistic: true
set_action:
then:
- - lambda: 'id(disp1).set_backlight_brightness(x/100);'
- - lambda: 'id(disp1).send_command_printf("home.brightness.val=%i", int(x));'
- - globals.set:
- id: display_brightness_global
- value: !lambda 'return int(x);'
+ - lambda: |-
+ id(display_brightness_global) = int(x);
+ id(disp1).send_command_printf("brightness=%i", int(x));
+ id(disp1).send_command_printf("settings.brightslider.val=%i", int(x));
+ if (id(current_page).state != "screensaver")
+ {
+ id(disp1).set_backlight_brightness(x/100);
+ id(disp1).send_command_printf("home.dimtimer.en=1");
+ }
+ if (id(current_page).state == "settings")
+ {
+ id(disp1).set_component_text_printf("bright_text", "%i%%", int(x));
+ }
##### SCREEN BRIGHTNESS DIMMED DOWN #####
- platform: template
@@ -855,99 +1658,694 @@ number:
optimistic: true
set_action:
then:
- - lambda: 'id(disp1).send_command_printf("home.brightdd.val=%i", int(x));'
- - globals.set:
- id: display_dim_brightness_global
- value: !lambda 'return int(x);'
+ - lambda: |-
+ id(display_dim_brightness_global) = int(x);
+ id(disp1).send_command_printf("brightness_dim=%i", int(x));
+ id(disp1).send_command_printf("settings.dimslider.val=%i", int(x));
+ if (id(current_page).state == "settings") id(disp1).set_component_text_printf("dim_text", "%i%%", int(x));
##### Temperature Correction #####
- - platform: template
- name: ${device_name} Temperature Correction
+ - name: ${device_name} Temperature Correction
+ platform: template
id: temperature_correction
entity_category: config
unit_of_measurement: '°C'
+ initial_value: 0
min_value: -10
max_value: 10
- step: 0.5
+ step: 0.1
restore_value: true
+ internal: false
optimistic: true
set_action:
- then:
- - globals.set:
- id: temperature_correction_global
- value: !lambda 'return x;'
+ - logger.log: Temperature correction changed.
+ - delay: 1s
+ - lambda: id(temp_nspanel).publish_state(id(temp_nspanel).raw_state);
##### page-timeout #####
- platform: template
- name: ${device_name} Page Timeout
+ name: ${device_name} Page timeout
id: page_timeout
entity_category: config
min_value: 0
max_value: 60
- initial_value: 10
+ initial_value: 5
step: 1
restore_value: true
optimistic: true
+ ##### dimming-timeout #####
+ #- platform: template
+ # name: ${device_name} Dimming timeout
+ # id: dimming_timeout
+ # entity_category: config
+ # min_value: 0
+ # max_value: 60
+ # initial_value: 15
+ # step: 1
+ # restore_value: true
+ # optimistic: true
+
+select:
+ - id: wakeup_page_name
+ name: ${device_name} Wake-up page
+ platform: template
+ options:
+ - home
+ - buttonpage01
+ - buttonpage02
+ - buttonpage03
+ - buttonpage04
+ - entitypage01
+ - entitypage02
+ - entitypage03
+ - entitypage04
+ - qrcode
+ - alarm
+ initial_option: home
+ optimistic: true
+ restore_value: true
+ internal: false
+ entity_category: config
+ icon: mdi:page-next-outline
+ #set_action:
+ # - logger.log:
+ # format: "Wake-up page set: %s"
+ # args: ["x.c_str()"]
+
##### START - DISPLAY START CONFIGURATION #####
display:
- id: disp1
platform: nextion
uart_id: tf_uart
tft_url: ${nextion_update_url}
+ on_page: # I couldn't make this trigger to work, so used text_sensor nspanelevent and localevent instead
+ - lambda: ESP_LOGW("display.disp1", "NEXTION PAGE CHANGED");
on_setup:
then:
- - logger.log: "Nextion start - Jump to page 8"
- - lambda: id(disp1).send_command_printf("page 8");
- - logger.log: "Nextion start - Publish ESPHome version"
- - lambda: id(disp1).set_component_text_printf("boot.esph_version", "%s", "3.4.1"); ### esphome-version ###
- - logger.log: "Nextion start - Wait for Home Assistant API"
+ - lambda: |-
+ ESP_LOGV("display.disp1", "Starting");
+ id(disp1).send_command_printf("page 8");
+ id(disp1).set_component_text_printf("boot.esph_version", "%s", "${version}"); // ### esphome-version ###
+ id(disp1).show_component("bt_reboot");
- wait_until:
api.connected
- - logger.log: "Nextion start - Publish IP address"
- - lambda: id(disp1).set_component_text_printf("boot.ip_addr", "%s", id(ip_address).state.c_str());
+ - lambda: |-
+ id(disp1).set_component_text_printf("boot.ip_addr", "%s", id(ip_address).state.c_str());
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "boot"},
+ {"step", "start"}
+ });
- delay: 1s
- - logger.log: "Nextion start - Set display brigntess"
- - number.set:
- id: display_brightness
- value: !lambda 'return id(display_brightness_global);'
- - logger.log: "Nextion start - Set display dim brightness"
- - number.set:
- id: display_dim_brightness
- value: !lambda 'return id(display_dim_brightness_global);'
- - logger.log: "Nextion start - Update settings page"
- - lambda: id(disp1).set_component_text_printf("settings.a03", "%i", id(display_brightness_global));
- - lambda: id(disp1).set_component_text_printf("settings.a04", "%i", id(display_dim_brightness_global));
- - lambda: id(disp1).send_command_printf("settings.brightslider.val=%i", id(display_brightness_global));
- - lambda: id(disp1).send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global));
- if:
condition:
switch.is_off: sleep_mode
then: *sleep_mode-turn_off
else: *sleep_mode-turn_on
- - delay: 1s
- - logger.log: "Nextion start - Inform Home Assistant display is ready"
- - binary_sensor.template.publish:
- id: nextion_init
- state: true
+ - lambda: |-
+ // Set dimming values
+ id(display_brightness).publish_state(id(display_brightness_global));
+ id(display_dim_brightness).publish_state(id(display_dim_brightness_global));
+ id(disp1).send_command_printf("brightness=%i", id(display_brightness_global));
+ id(disp1).send_command_printf("settings.brightslider.val=%i", id(display_brightness_global));
+ id(disp1).send_command_printf("brightness_dim=%i", id(display_dim_brightness_global));
+ id(disp1).send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global));
+
+ id(nextion_init).publish_state(true);
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "boot"},
+ {"step", "nextion_init"}
+ });
+ id(home_relay1_icon) = "\uE3A5";
+ id(home_relay1_icon) = "\uE3A8";
+ - *notification_clear
+ - switch.turn_off: notification_unread
- logger.log: "Nextion start - Done!"
### Script for page_timer
script:
- id: page_timer
+ mode: restart
+ then:
+ - lambda: ESP_LOGV("script.page_timer", "start page-timer delay %i", delay);
+ - delay: !lambda return int(id(page_timeout).state *1000);
+ - lambda: |-
+ if (id(current_page).state == "home" or id(current_page).state == "screensaver" or id(current_page).state == "boot" or int(id(page_timeout).state) == 0)
+ ESP_LOGD("script.page_timer", "no page-jump");
+ else
+ {
+ ESP_LOGD("script.page_timer", "timer->home");
+ id(disp1).send_command_printf("page 0");
+ }
+
+ - id: set_climate
+ mode: restart
+ parameters:
+ current_temp: float
+ target_temp: float
+ temp_step: int
+ total_steps: int
+ temp_offset: int
+ climate_icon: string
+ embedded_climate: bool
+ then:
+ - lambda: ESP_LOGV("script.set_climate", "Starting");
+ - if:
+ condition:
+ - text_sensor.state: # Is climate page visible?
+ id: current_page
+ state: 'climate'
+ then:
+ - lambda: |-
+ ESP_LOGV("script.set_climate", "climateslider.maxval=%i", total_steps);
+ ESP_LOGV("script.set_climate", "temp_offset=%i", temp_offset);
+ ESP_LOGV("script.set_climate", "temp_step=%i", temp_step);
+ ESP_LOGV("script.set_climate", "current_temp=%f", current_temp);
+ ESP_LOGV("script.set_climate", "target_temp=%f", target_temp);
+ ESP_LOGV("script.set_climate", "target_icon=%s", climate_icon.c_str());
+ ESP_LOGV("script.set_climate", "embedded=%i", (embedded_climate) ? 1 : 0);
+ id(addon_climate_set_climate).execute(embedded_climate);
+ id(disp1).send_command_printf("climateslider.maxval=%i", total_steps);
+ id(disp1).set_component_value("temp_offset", temp_offset);
+ id(disp1).set_component_value("temp_step", temp_step);
+ id(disp1).set_component_text_printf("current_temp", "%.1f°", current_temp);
+ id(disp1).show_component("current_temp");
+ id(disp1).show_component("current_icon");
+ if (target_temp > -999)
+ {
+ float slider_val = round(((10*target_temp) - temp_offset) / temp_step);
+ ESP_LOGV("script.set_climate", "climateslider=%f", slider_val);
+ id(disp1).set_component_value("climateslider", slider_val);
+ id(disp1).set_component_text_printf("target_temp", "%.1f°", target_temp);
+ id(disp1).set_component_text_printf("target_icon", "%s", climate_icon.c_str());
+ id(disp1).show_component("target_icon");
+ id(disp1).show_component("target_temp");
+ id(disp1).show_component("climateslider");
+ id(disp1).show_component("decrease_temp");
+ id(disp1).show_component("increase_temp");
+ }
+ else
+ {
+ id(disp1).hide_component("target_icon");
+ id(disp1).hide_component("target_temp");
+ id(disp1).hide_component("climateslider");
+ id(disp1).hide_component("decrease_temp");
+ id(disp1).hide_component("increase_temp");
+ }
+ id(disp1).set_component_value("embedded", (embedded_climate) ? 1 : 0);
+ - lambda: ESP_LOGV("script.set_climate", "Finished");
+
+ - id: refresh_datetime
+ mode: restart
+ then:
+ - lambda: |-
+ ESP_LOGV("script.refresh_datetime", "Starting");
+ std::string time_format_str = id(mui_time_format);
+ if (time_format_str.find("%p") != std::string::npos)
+ {
+ std::string meridiem_text = id(time_provider).now().strftime("%p");
+ id(disp1).set_component_text_printf("home.meridiem", "%s", meridiem_text.c_str());
+ }
+ else { id(disp1).set_component_text_printf("home.meridiem", " "); }
+ if (time_format_str.find("%-H") != std::string::npos) { time_format_str = time_format_str.replace(time_format_str.find("%-H"), sizeof("%-H")-1, to_string((int)(id(time_provider).now().hour))); }
+ if (time_format_str.find("%-I") != std::string::npos)
+ {
+ if (id(time_provider).now().hour>12)
+ {
+ time_format_str = time_format_str.replace(time_format_str.find("%-I"), sizeof("%-I")-1, to_string((int)(id(time_provider).now().hour-12)));
+ }
+ else if (id(time_provider).now().hour==0)
+ {
+ time_format_str = time_format_str.replace(time_format_str.find("%-I"), sizeof("%-I")-1, "12");
+ }
+ else
+ {
+ time_format_str = time_format_str.replace(time_format_str.find("%-I"), sizeof("%-I")-1, to_string((int)(id(time_provider).now().hour)));
+ }
+ }
+ std::string time_text = id(time_provider).now().strftime(time_format_str);
+ id(disp1).set_component_text_printf("home.time", "%s", time_text.c_str());
+ ESP_LOGV("script.refresh_datetime", "Finished");
+
+ - id: refresh_relays
+ mode: restart
+ then:
+ - lambda: |-
+ ESP_LOGV("script.refresh_relays", "Starting");
+ // Chips - Relays
+ if (id(relay_1).state) id(disp1).set_component_text_printf("home.icon_top_01", "%s", id(home_relay1_icon).c_str());
+ else id(disp1).set_component_text_printf("icon_top_01", "\uFFFF");
+ if (id(relay_2).state) id(disp1).set_component_text_printf("home.icon_top_02", "%s", id(home_relay2_icon).c_str());
+ else id(disp1).set_component_text_printf("home.icon_top_02", "\uFFFF");
+ // Hardware buttons - Fallback mode
+ if (id(relay_1).state and id(relay1_local).state) id(disp1).send_command_printf("home.left_bt_pic.val=%i", (id(relay_1).state) ? 1 : 0);
+ if (id(relay_2).state and id(relay2_local).state) id(disp1).send_command_printf("home.right_bt_pic.val=%i", (id(relay_2).state) ? 1 : 0);
+ ESP_LOGV("script.refresh_relays", "Finished");
+
+ - id: refresh_wifi_icon
+ mode: restart
+ then:
+ - lambda: ESP_LOGV("script.refresh_wifi_icon", "Starting");
+ - if:
+ condition:
+ - binary_sensor.is_on: nextion_init
+ then:
+ # Update Wi-Fi icon
+ - if:
+ condition:
+ wifi.connected:
+ then:
+ - if:
+ condition:
+ api.connected:
+ then:
+ - lambda: id(disp1).send_command_printf("api=1");
+ - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\uE5A8");
+ - lambda: id(disp1).set_component_font_color("home.wifi_icon", 33808);
+ else:
+ - lambda: id(disp1).send_command_printf("api=0");
+ - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\uF256");
+ - lambda: id(disp1).set_component_font_color("home.wifi_icon", 63488);
+ else:
+ - lambda: id(disp1).send_command_printf("api=0");
+ - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\uE5A9");
+ - lambda: id(disp1).set_component_font_color("home.wifi_icon", 63488);
+ - lambda: ESP_LOGV("script.refresh_wifi_icon", "Finished");
+
+ - id: update_page_home
+ mode: restart
+ then:
+ - lambda: ESP_LOGV("script.update_page_home", "Starting");
+ - if:
+ condition:
+ - text_sensor.state: # Is home page visible?
+ id: current_page
+ state: 'home'
+ then:
+ - script.execute: refresh_relays
+ - script.execute: refresh_wifi_icon
+ - lambda: |-
+ ESP_LOGV("script.update_page_home", "is_notification=%i", (id(notification_text).state.empty() and id(notification_label).state.empty()) ? 0 : 1);
+ id(disp1).send_command_printf("is_notification=%i", (id(notification_text).state.empty() and id(notification_label).state.empty()) ? 0 : 1);
+ id(set_component_color).execute("home.bt_notific", id(notification_unread).state ? id(home_notify_icon_color_unread) : id(home_notify_icon_color_normal), {});
+ - script.execute: refresh_datetime
+ - script.execute: addon_climate_update_page_home
+
+ - lambda: ESP_LOGV("script.update_page_home", "Finished");
+
+ - id: service_call_alarm_control_panel
+ mode: restart
+ parameters:
+ entity: string
+ key: string
+ code_format: string
+ pin: string
+ then:
+ - lambda: |-
+ ESP_LOGV("service_call_alarm_control_panel", "ESPHome remote service call");
+ ESP_LOGV("service_call_alarm_control_panel", "entity=%s", entity.c_str());
+ ESP_LOGV("service_call_alarm_control_panel", "key=%s", key.c_str());
+ ESP_LOGV("service_call_alarm_control_panel", "code_format=%s", code_format.c_str());
+ ESP_LOGV("service_call_alarm_control_panel", "pin=%s", entity.c_str());
+ std::string service = "";
+ if (key=="home") service = "alarm_control_panel.alarm_arm_home";
+ else if (key=="away") service = "alarm_control_panel.alarm_arm_away";
+ else if (key=="night") service = "alarm_control_panel.alarm_arm_night";
+ else if (key=="vacation") service = "alarm_control_panel.alarm_arm_vacation";
+ else if (key=="bypass") service = "alarm_control_panel.alarm_arm_custom_bypass";
+ else if (key=="disarm") service = "alarm_control_panel.alarm_disarm";
+ ESP_LOGV("service_call_alarm_control_panel", "service=%s", service.c_str());
+ if (service != "" and not service.empty())
+ {
+ ESP_LOGV("service_call_alarm_control_panel", "ESPHome remote service call");
+ HomeassistantServiceResponse resp;
+ HomeassistantServiceMap resp_kv;
+ resp.service = service.c_str();
+ resp_kv.key = "entity_id";
+ resp_kv.value = entity.c_str();
+ resp.data.push_back(resp_kv);
+ if (pin != "" and not pin.empty())
+ {
+ resp_kv.key = "code";
+ resp_kv.value = pin.c_str();
+ resp.data.push_back(resp_kv);
+ }
+ id(api_server).send_homeassistant_service_call(resp);
+ }
+
+ - id: service_call_climate
+ mode: restart
+ parameters:
+ entity: string
+ key: string
+ value: string
+ embedded: bool
+ then:
+ - lambda: |-
+ if (embedded)
+ id(addon_climate_service_call)->execute(key.c_str(), value.c_str());
+ else if (key == "set_temperature")
+ id(ha_call_service)->execute("climate.set_temperature", "temperature", to_string(stof(value) / 10), entity.c_str());
+ else if (key == "hvac_mode")
+ id(ha_call_service)->execute("climate.set_hvac_mode", key.c_str(), value.c_str(), entity.c_str());
+
+ - id: ha_call_service
+ mode: restart
+ parameters:
+ service: string
+ key: string
+ value: string
+ entity: string
+ then:
+ - lambda: |-
+ if (service != "" and not service.empty())
+ {
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "service_call"},
+ {"service", service},
+ {"entity", entity},
+ {"key", key},
+ {"value", value}
+ });
+ }
+
+ - id: ha_button
+ mode: parallel
+ parameters:
+ page: string
+ component: string
+ command: string
+ then:
+ - lambda: |-
+ ESP_LOGV("script.ha_button", "Starting");
+ ESP_LOGV("script.ha_button", "page: %s", page.c_str());
+ ESP_LOGV("script.ha_button", "component: %s", component.c_str());
+ ESP_LOGV("script.ha_button", "command: %s", command.c_str());
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "button_click"},
+ {"page", page},
+ {"component", component},
+ {"command", command}
+ });
+ ESP_LOGV("script.ha_button", "Finished");
+
+ - id: update_alarm_icon
+ mode: restart
+ parameters:
+ component: string
+ state: string
+ then:
+ - lambda: |-
+ ESP_LOGV("script.update_alarm_icon", "Starting");
+ std::string alarm_icon = "\uEECC"; //mdi:shield-alert-outline
+ int alarm_color = 65535;
+ // Standard colors:
+ // blue: '1055' # rgb(0, 128, 248)
+ // grey_dark: '10597' # rgb(40, 44, 40)
+ // grey_light: '33808' # rgb(128, 128, 128)
+ // grey_super_light: '52857' # rgb(200, 204, 200)
+ // grey_white: '59164' # rgb(225, 225, 225)
+ // red: '63488' # rgb(248, 0, 0)
+ // white: '65535' # rgb(255, 255, 255)
+ // yellow: '65472' # rgb(248, 248, 0)
+ // #### Colors from HA Style:
+ // green: '19818' # rgb(76, 175, 80)
+ // orange: '64704' # rgb(255, 152, 0)
+ // cyan: '1530' # rgb(0, 188, 212)
+ // deep-orange: '64164' # rgb(255, 87, 34)
+ // amber: '65024' # rgb(255, 193, 7)
+ // "off": '35921' #8a8a8a
+ // disabled: '48631' # rgb(189, 189, 189)
+ if (state == "disarmed")
+ {
+ alarm_icon = "\uE99B"; //mdi:shield-off-outline
+ alarm_color = 65535;
+ }
+ else if (state == "armed_home")
+ {
+ alarm_icon = "\uECCA"; //mdi:shield-home-outline
+ alarm_color = 19818;
+ }
+ else if (state == "armed_away")
+ {
+ alarm_icon = "\uECCB"; //mdi:shield-lock-outline
+ alarm_color = 19818;
+ }
+ else if (state == "armed_night")
+ {
+ alarm_icon = "\uF828"; //mdi:shield-moon-outline
+ alarm_color = 19818;
+ }
+ else if (state == "armed_vacation")
+ {
+ alarm_icon = "\uECC6"; //mdi:shield-airplane-outline
+ alarm_color = 19818;
+ }
+ else if (state == "armed_custom_bypass")
+ {
+ alarm_icon = "\uE77F"; //mdi:shield-half-full
+ alarm_color = 19818;
+ }
+ else if (state == "pending" or state == "arming")
+ {
+ alarm_icon = "\uE498"; //mdi:shield-outline
+ alarm_color = 65024;
+ }
+ else if (state == "disarming")
+ {
+ alarm_icon = "\uE99B"; //mdi:shield-off-outline
+ alarm_color = 65024;
+ }
+ else if (state == "triggered")
+ {
+ alarm_icon = "\uEECC"; //mdi:shield-alert-outline
+ alarm_color = 63488;
+ }
+ id(disp1).set_component_text_printf(component.c_str(), alarm_icon.c_str());
+ id(disp1).set_component_font_color(component.c_str(), alarm_color);
+ ESP_LOGV("script.update_alarm_icon", "Finished");
+
+ - id: update_climate_icon
mode: restart
parameters:
- delay: int
+ component: string
+ action: int
+ mode: int
then:
- - lambda: ESP_LOGD("nspanel", "start page-timer delay %i", int(id(page_timeout).state));
- - delay: !lambda return delay *1000;
- lambda: |-
- DynamicJsonDocument doc(1024);
- deserializeJson(doc, id(disp1_nspanel_event).state);
- std::string page = doc["page"];
- if (page == "home" or page == "screensaver" or page == "boot" or int(id(page_timeout).state) == 0) {
- ESP_LOGD("nspanel", "no page-jump");
- } else {
- ESP_LOGD("nspanel", "timer->home");
- id(disp1).send_command_printf("page 0");
+ ESP_LOGV("script.update_climate_icon", "Starting");
+ ESP_LOGV("script.update_climate_icon", "component: %s", component.c_str());
+ ESP_LOGV("script.update_climate_icon", "action: %i", action);
+ ESP_LOGV("script.update_climate_icon", "mode: %i", mode);
+ switch (action) // CLIMATE_ACTION_OFF = 0, CLIMATE_ACTION_COOLING = 2, CLIMATE_ACTION_HEATING = 3, CLIMATE_ACTION_IDLE = 4, CLIMATE_ACTION_DRYING = 5, CLIMATE_ACTION_FAN = 6
+ {
+ case 0: //CLIMATE_ACTION_OFF
+ ESP_LOGV("script.update_climate_icon", "Climate 'action' is off. Using 'mode' instead");
+ switch (mode) // CLIMATE_MODE_OFF = 0, CLIMATE_MODE_HEAT_COOL = 1, CLIMATE_MODE_COOL = 2, CLIMATE_MODE_HEAT = 3, CLIMATE_MODE_FAN_ONLY = 4, CLIMATE_MODE_DRY = 5, CLIMATE_MODE_AUTO = 6
+ {
+ case 0: //CLIMATE_MODE_OFF
+ ESP_LOGV("script.update_climate_icon", "Icon: none");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uFFFF"); // (E424) Don't show icon when off
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 1: //CLIMATE_MODE_HEAT_COOL
+ ESP_LOGV("script.update_climate_icon", "Icon: autorenew");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE069"); // mdi:autorenew
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 2: //CLIMATE_MODE_COOL
+ ESP_LOGV("script.update_climate_icon", "Icon: snowflake");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE716"); // mdi:snowflake
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 3: //CLIMATE_MODE_HEAT
+ ESP_LOGV("script.update_climate_icon", "Icon: fire");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE237"); // mdi:fire
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 4: //CLIMATE_MODE_FAN_ONLY
+ ESP_LOGV("script.update_climate_icon", "Icon: fan");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE20F"); // mdi:fan
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 5: //CLIMATE_MODE_DRY
+ ESP_LOGV("script.update_climate_icon", "Icon: water-percent");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE58D"); // mdi:water-percent
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 6: //CLIMATE_MODE_AUTO
+ ESP_LOGV("script.update_climate_icon", "Icon: calendar-sync");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uEE8D"); // mdi:calendar-sync
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ }
+ break;
+ case 2: //CLIMATE_ACTION_COOLING
+ ESP_LOGV("script.update_climate_icon", "Icon: snowflake");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE716"); // mdi:snowflake
+ id(disp1).set_component_font_color(component.c_str(), 1055); // blue
+ break;
+ case 3: //CLIMATE_ACTION_HEATING
+ ESP_LOGV("script.update_climate_icon", "Icon: fire");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE237"); // mdi:fire
+ id(disp1).set_component_font_color(component.c_str(), 64164); // deep-orange
+ break;
+ case 4: //CLIMATE_ACTION_IDLE
+ ESP_LOGV("script.update_climate_icon", "Icon: thermometer");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE50E"); // mdi:thermometer
+ id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off)
+ break;
+ case 5: //CLIMATE_ACTION_DRYING
+ ESP_LOGV("script.update_climate_icon", "Icon: water-percent");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE58D"); // mdi:water-percent
+ id(disp1).set_component_font_color(component.c_str(), 64704); // orange
+ break;
+ case 6: //CLIMATE_ACTION_FAN
+ ESP_LOGV("script.update_climate_icon", "Icon: fan");
+ id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE20F"); // mdi:fan
+ id(disp1).set_component_font_color(component.c_str(), 1530); // cyan
+ break;
+ }
+ ESP_LOGV("script.update_climate_icon", "Finished");
+
+ - id: set_component_color
+ mode: queued
+ parameters:
+ component: string
+ foreground: int[]
+ background: int[]
+ then:
+ - lambda: |-
+ ESP_LOGV("script.set_component_color", "Starting");
+ ESP_LOGV("script.set_component_color", "Component: %s", component.c_str());
+ int fg565 = -1;
+ int bg565 = -1;
+
+ // Foreground
+ if (foreground.size() == 3) fg565 = ((foreground[0] & 0b11111000) << 8) | ((foreground[1] & 0b11111100) << 3) | (foreground[2] >> 3);
+ else if (foreground.size() == 1) fg565 = foreground[0];
+ if (fg565 >= 0) id(disp1).set_component_font_color(component.c_str(), fg565);
+
+ // Background
+ if (background.size() == 3) bg565 = ((background[0] & 0b11111000) << 8) | ((background[1] & 0b11111100) << 3) | (background[2] >> 3);
+ else if (background.size() == 1) bg565 = background[0];
+ if (bg565 >= 0) id(disp1).set_component_background_color(component.c_str(), bg565);
+
+ ESP_LOGV("script.set_component_color", "Finished");
+
+ - id: display_wrapped_text
+ mode: queued
+ parameters:
+ component: string
+ text: string
+ line_length_limit: int
+ then:
+ - lambda: |-
+ int startPos = 0;
+ int endPos = 0;
+ std::string wrappedText = "";
+ while (startPos < text.length()) {
+ while (text[startPos] == ' ' and startPos < text.length()) { startPos++; }
+ int endPos = startPos + line_length_limit;
+ if (endPos >= text.length()) endPos = text.length();
+ else
+ {
+ while (endPos > startPos && text[endPos] != ' ') { endPos--; }
+ if (endPos == startPos) endPos = startPos + line_length_limit; // Handle case of long word
+ }
+ wrappedText += text.substr(startPos, endPos-startPos);
+ if (endPos < text.length())
+ {
+ while (text[endPos] == ' ') { endPos--; }
+ if (endPos >= startPos) wrappedText += "\\r";
+ }
+ startPos = endPos + 1; // Skip the space
+ while (text[startPos] == ' ' and startPos < text.length()) { startPos++; }
}
+ ESP_LOGV("script.display_wrapped_text", "text (new): %s", wrappedText.c_str());
+ id(disp1).set_component_text_printf(component.c_str(), "%s", wrappedText.c_str());
+
+ - id: display_embedded_temp
+ mode: restart
+ then:
+ - if:
+ condition:
+ - or:
+ - lambda: return id(embedded_indoor_temp);
+ - not:
+ - api.connected:
+ - not:
+ - wifi.connected:
+ then:
+ - lambda: |-
+ if (id(temp_unit_fahrenheit)) id(disp1).set_component_text_printf("home.current_temp", "%.0f°F", ((id(temp_nspanel).state * 9.0 / 5.0) + 32.0)); // °F = (°C à 9/5) + 32
+ else id(disp1).set_component_text_printf("home.current_temp", "%.1f°C", id(temp_nspanel).state);
+
+ - id: check_versions
+ mode: restart
+ then:
+ - delay: 60s
+ - lambda: |-
+ ESP_LOGD("script.check_versions", "ESPHome version: ${version}");
+ ESP_LOGD("script.check_versions", "TFT version: %s", id(version_tft).c_str());
+ if (id(version_tft) != "${version}") ESP_LOGE("script.check_versions", "TFT version mismatch!");
+ ESP_LOGD("script.check_versions", "Blueprint version: %s", id(version_blueprint).c_str());
+ if (id(version_blueprint) != "${version}") ESP_LOGE("script.check_versions", "Blueprint version mismatch!");
+ auto ha_event = new esphome::api::CustomAPIDevice();
+ ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint",
+ {
+ {"type", "version"},
+ {"tft", id(version_tft).c_str()},
+ {"esphome", "${version}"},
+ {"blueprint", id(version_blueprint).c_str()}
+ });
+
+ ##### ADD-ONS ############################################################
+ ##### Add-on - Climate #####
+ - id: addon_climate_service_call
+ mode: restart
+ parameters:
+ key: string
+ value: string
+ then:
+ # Reserved for Add-on Climate
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_service_call", "Check for addon_climate");
+ - id: addon_climate_update_page_home
+ mode: restart
+ then:
+ # Reserved for Add-on Climate
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_update_page_home", "Check for addon_climate");
+ - id: addon_climate_set_climate
+ mode: restart
+ parameters:
+ embedded_climate: bool
+ then:
+ # Reserved for Add-on Climate
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_set_climate", "Check for addon_climate");
+ ESP_LOGV("script.addon_climate_set_climate", "embedded_climate: %i", (embedded_climate) ? 1 : 0);
+ - id: addon_climate_update_page_climate
+ mode: restart
+ then:
+ # Reserved for Add-on Climate
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_update_page_climate", "Check for addon_climate");
+ - id: addon_climate_set_climate_friendly_name
+ mode: restart
+ parameters:
+ friendly_name: string
+ then:
+ # Reserved for Add-on Climate
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "Check for addon_climate");
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "friendly_name: %s", friendly_name.c_str());
diff --git a/nspanel_esphome_addon_climate_cool.yaml b/nspanel_esphome_addon_climate_cool.yaml
new file mode 100644
index 000000000..7c0b09614
--- /dev/null
+++ b/nspanel_esphome_addon_climate_cool.yaml
@@ -0,0 +1,176 @@
+####################################################################################################
+##### NSPanel ESPHome Add-on for Climate control - Cool #####
+##### Add-on for https://github.com/Blackymas/NSPanel_HA_Blueprint #####
+####################################################################################################
+
+substitutions:
+ ### Local thermostat defaults ###
+ # https://esphome.io/components/climate/thermostat.html
+ temp_units: "°C"
+ cooler_relay: "0" # Select 1 for "Relay 1", 2 for "Relay 2" or "0" to a dummy switch/disabled
+ min_off_time: "300"
+ min_run_time: "300"
+ min_idle_time: "30"
+ # https://esphome.io/components/climate/index.html#base-climate-configuration
+ temp_min: "15"
+ temp_max: "45"
+ temp_step: "0.5"
+
+ ##### DO NOT CHANGE THIS #####
+ addon_climate_cool: "true"
+ addon_climate_heat: "false"
+ ##############################
+
+climate:
+ - platform: thermostat
+ name: ${device_name} Thermostat
+ id: thermostat_embedded
+ sensor: temp_nspanel
+ min_cooling_off_time: ${min_off_time}s
+ min_cooling_run_time: ${min_run_time}s
+ min_idle_time: ${min_idle_time}s
+ visual:
+ min_temperature: ${temp_min} ${temp_units}
+ max_temperature: ${temp_max} ${temp_units}
+ temperature_step: ${temp_step} ${temp_units}
+ cool_action:
+ - switch.turn_on: relay_${cooler_relay}
+ idle_action:
+ - switch.turn_off: relay_${cooler_relay}
+ default_preset: "Off"
+ on_boot_restore_from: memory
+ preset:
+ - name: "Off"
+ default_target_temperature_high: ${temp_min} ${temp_units}
+ mode: "off"
+ - name: Home
+ default_target_temperature_high: 21 ${temp_units}
+ internal: false
+ on_state:
+ - logger.log: Climate state changed - Start
+ - script.execute: addon_climate_update_page_climate
+ - script.execute: addon_climate_update_page_home
+ - logger.log: Climate state changed - End
+
+###### All the code bellow this point is shared between addon_climate_cool and addon_climate_heat #####
+
+globals:
+ ##### Is embedded thermostat visible on climate page? #####
+ - id: is_addon_climate_visible
+ type: bool
+ restore_value: false
+ initial_value: 'false'
+ ##### Embeded climate friendly name #####
+ - id: addon_climate_friendly_name
+ type: std::string
+ restore_value: false
+ initial_value: '"${device_name} Thermostat"'
+
+script:
+ - id: !extend addon_climate_update_page_home
+ mode: restart
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_update_page_home", "Starting");
+ // Update home.climate_entity variable
+ ESP_LOGV("script.addon_climate_update_page_home", "Update home.climate_entity variable: %s", (id(is_embedded_thermostat)) ? "embedded_climate" : "");
+ id(disp1).set_component_text_printf("home.climate_entity", (id(is_embedded_thermostat)) ? "embedded_climate" : "");
+ // Update chips
+ if (id(is_embedded_thermostat))
+ {
+ ESP_LOGV("script.addon_climate_update_page_home", "Update chips");
+ id(update_climate_icon).execute("home.icon_top_03", int(id(thermostat_embedded).action), int(id(thermostat_embedded).mode));
+ }
+ ESP_LOGV("script.addon_climate_update_page_home", "Finished");
+
+ - id: !extend addon_climate_service_call
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_service_call", "Starting");
+ id(is_addon_climate_visible) = true;
+ auto call = id(thermostat_embedded).make_call();
+ if (key == "set_temperature")
+ {
+ call.set_target_temperature(stof(value) / 10);
+ }
+ else if (key == "hvac_mode")
+ {
+ call.set_mode(value);
+ }
+ call.perform();
+ ESP_LOGV("script.addon_climate_service_call", "Finished");
+
+ - id: !extend addon_climate_set_climate
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_set_climate", "Starting");
+ ESP_LOGV("script.addon_climate_set_climate", "embedded_climate: %i", (embedded_climate) ? 1 : 0);
+ id(is_addon_climate_visible) = embedded_climate;
+ ESP_LOGV("script.addon_climate_set_climate", "Finished");
+
+ - id: !extend addon_climate_update_page_climate
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_update_page_climate", "Starting");
+ ESP_LOGV("script.addon_climate_update_page_climate", "nextion_init: %i", (id(nextion_init)) ? 1 : 0);
+ ESP_LOGV("script.addon_climate_update_page_climate", "current_page: %s", id(current_page).state.c_str());
+ ESP_LOGV("script.addon_climate_update_page_climate", "is_addon_climate_visible: %i", (id(is_addon_climate_visible)) ? 1 : 0);
+ if (id(current_page).state == "climate" and id(is_addon_climate_visible))
+ {
+ id(disp1).set_component_text_printf("page_label", id(addon_climate_friendly_name).c_str());
+ float temp_step = ${temp_step};
+ float temp_offset = ${temp_min};
+ float temp_max = ${temp_max};
+ float total_steps = (temp_max-temp_offset)/temp_step;
+ id(set_climate)->execute
+ (
+ id(thermostat_embedded).current_temperature, // current_temp
+ id(thermostat_embedded).target_temperature, // target_temp
+ int(round(${temp_step}*10)), // temp_step
+ int(round(total_steps)), // total_steps //int(round((10*id(thermostat_embedded).target_temperature-temp_offset)/temp_step)), // slider_val
+ int(round(${temp_min}*10)), // temp_offset
+ "", // climate_icon
+ true // embedded_climate
+ );
+
+ // Update target temp icon
+ ESP_LOGV("script.addon_climate_update_page_climate", "thermostat_embedded.action=%i", int(id(thermostat_embedded).action));
+ id(update_climate_icon).execute("climate.target_icon", int(id(thermostat_embedded).action), int(id(thermostat_embedded).mode));
+
+ // Update buttons bar
+ ESP_LOGV("script.addon_climate_update_page_climate", "Updating buttons bar");
+ // Hide not supported hotspots
+ id(disp1).hide_component("button01");
+ id(disp1).hide_component("button02");
+ if (${addon_climate_heat}) id(disp1).show_component("button03"); else id(disp1).hide_component("button03"); //Heat
+ if (${addon_climate_cool}) id(disp1).show_component("button04"); else id(disp1).hide_component("button04"); //Cool
+ id(disp1).hide_component("button05");
+ id(disp1).hide_component("button06");
+ id(disp1).show_component("button07"); //Off
+ // Set buttons colors
+ id(disp1).set_component_font_color("climate.button01_icon", 6339);
+ id(disp1).set_component_font_color("climate.button02_icon", 6339);
+ id(disp1).set_component_font_color("climate.button03_icon", (id(thermostat_embedded).mode==climate::CLIMATE_MODE_HEAT) ? 64164 : ((${addon_climate_heat}) ? 48631 : 6339));
+ id(disp1).set_component_font_color("climate.button04_icon", (id(thermostat_embedded).mode==climate::CLIMATE_MODE_COOL) ? 1055 : ((${addon_climate_cool}) ? 48631 : 6339));
+ id(disp1).set_component_font_color("climate.button05_icon", 6339);
+ id(disp1).set_component_font_color("climate.button06_icon", 6339);
+ id(disp1).set_component_font_color("climate.button07_icon", (id(thermostat_embedded).mode==climate::CLIMATE_MODE_OFF) ? 10597 : 35921);
+ }
+ ESP_LOGV("script.addon_climate_update_page_climate", "Finished");
+
+ - id: !extend addon_climate_set_climate_friendly_name
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "Starting");
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "friendly_name: %s", friendly_name.c_str());
+ id(addon_climate_friendly_name) = friendly_name;
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "Finished");
+
+switch:
+ ##### PHYSICAL SWITCH 0 (Dummy) - Used when relay is not set #####
+ - name: ${device_name} Relay 0 (dummy)
+ platform: template
+ id: relay_0
+ lambda: !lambda return false;
+ internal: true
+ optimistic: true
diff --git a/nspanel_esphome_addon_climate_heat.yaml b/nspanel_esphome_addon_climate_heat.yaml
new file mode 100644
index 000000000..52a274069
--- /dev/null
+++ b/nspanel_esphome_addon_climate_heat.yaml
@@ -0,0 +1,176 @@
+####################################################################################################
+##### NSPanel ESPHome Add-on for Climate control - Heat #####
+##### Add-on for https://github.com/Blackymas/NSPanel_HA_Blueprint #####
+####################################################################################################
+
+substitutions:
+ ### Local thermostat defaults ###
+ # https://esphome.io/components/climate/thermostat.html
+ temp_units: "°C"
+ heater_relay: "0" # Select 1 for "Relay 1", 2 for "Relay 2" or "0" to a dummy switch/disabled
+ min_off_time: "300"
+ min_run_time: "300"
+ min_idle_time: "30"
+ # https://esphome.io/components/climate/index.html#base-climate-configuration
+ temp_min: "5"
+ temp_max: "25"
+ temp_step: "0.5"
+
+ ##### DO NOT CHANGE THIS #####
+ addon_climate_cool: "false"
+ addon_climate_heat: "true"
+ ##############################
+
+climate:
+ - platform: thermostat
+ name: ${device_name} Thermostat
+ id: thermostat_embedded
+ sensor: temp_nspanel
+ min_heating_off_time: ${min_off_time}s
+ min_heating_run_time: ${min_run_time}s
+ min_idle_time: ${min_idle_time}s
+ visual:
+ min_temperature: ${temp_min} ${temp_units}
+ max_temperature: ${temp_max} ${temp_units}
+ temperature_step: ${temp_step} ${temp_units}
+ heat_action:
+ - switch.turn_on: relay_${heater_relay}
+ idle_action:
+ - switch.turn_off: relay_${heater_relay}
+ default_preset: "Off"
+ on_boot_restore_from: memory
+ preset:
+ - name: "Off"
+ default_target_temperature_low: ${temp_min} ${temp_units}
+ mode: "off"
+ - name: Home
+ default_target_temperature_low: 21 ${temp_units}
+ internal: false
+ on_state:
+ - logger.log: Climate state changed - Start
+ - script.execute: addon_climate_update_page_climate
+ - script.execute: addon_climate_update_page_home
+ - logger.log: Climate state changed - End
+
+###### All the code bellow this point is shared between addon_climate_cool and addon_climate_heat #####
+
+globals:
+ ##### Is embedded thermostat visible on climate page? #####
+ - id: is_addon_climate_visible
+ type: bool
+ restore_value: false
+ initial_value: 'false'
+ ##### Embeded climate friendly name #####
+ - id: addon_climate_friendly_name
+ type: std::string
+ restore_value: false
+ initial_value: '"${device_name} Thermostat"'
+
+script:
+ - id: !extend addon_climate_update_page_home
+ mode: restart
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_update_page_home", "Starting");
+ // Update home.climate_entity variable
+ ESP_LOGV("script.addon_climate_update_page_home", "Update home.climate_entity variable: %s", (id(is_embedded_thermostat)) ? "embedded_climate" : "");
+ id(disp1).set_component_text_printf("home.climate_entity", (id(is_embedded_thermostat)) ? "embedded_climate" : "");
+ // Update chips
+ if (id(is_embedded_thermostat))
+ {
+ ESP_LOGV("script.addon_climate_update_page_home", "Update chips");
+ id(update_climate_icon).execute("home.icon_top_03", int(id(thermostat_embedded).action), int(id(thermostat_embedded).mode));
+ }
+ ESP_LOGV("script.addon_climate_update_page_home", "Finished");
+
+ - id: !extend addon_climate_service_call
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_service_call", "Starting");
+ id(is_addon_climate_visible) = true;
+ auto call = id(thermostat_embedded).make_call();
+ if (key == "set_temperature")
+ {
+ call.set_target_temperature(stof(value) / 10);
+ }
+ else if (key == "hvac_mode")
+ {
+ call.set_mode(value);
+ }
+ call.perform();
+ ESP_LOGV("script.addon_climate_service_call", "Finished");
+
+ - id: !extend addon_climate_set_climate
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_set_climate", "Starting");
+ ESP_LOGV("script.addon_climate_set_climate", "embedded_climate: %i", (embedded_climate) ? 1 : 0);
+ id(is_addon_climate_visible) = embedded_climate;
+ ESP_LOGV("script.addon_climate_set_climate", "Finished");
+
+ - id: !extend addon_climate_update_page_climate
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_update_page_climate", "Starting");
+ ESP_LOGV("script.addon_climate_update_page_climate", "nextion_init: %i", (id(nextion_init)) ? 1 : 0);
+ ESP_LOGV("script.addon_climate_update_page_climate", "current_page: %s", id(current_page).state.c_str());
+ ESP_LOGV("script.addon_climate_update_page_climate", "is_addon_climate_visible: %i", (id(is_addon_climate_visible)) ? 1 : 0);
+ if (id(current_page).state == "climate" and id(is_addon_climate_visible))
+ {
+ id(disp1).set_component_text_printf("page_label", id(addon_climate_friendly_name).c_str());
+ float temp_step = ${temp_step};
+ float temp_offset = ${temp_min};
+ float temp_max = ${temp_max};
+ float total_steps = (temp_max-temp_offset)/temp_step;
+ id(set_climate)->execute
+ (
+ id(thermostat_embedded).current_temperature, // current_temp
+ id(thermostat_embedded).target_temperature, // target_temp
+ int(round(${temp_step}*10)), // temp_step
+ int(round(total_steps)), // total_steps //int(round((10*id(thermostat_embedded).target_temperature-temp_offset)/temp_step)), // slider_val
+ int(round(${temp_min}*10)), // temp_offset
+ "", // climate_icon
+ true // embedded_climate
+ );
+
+ // Update target temp icon
+ ESP_LOGV("script.addon_climate_update_page_climate", "thermostat_embedded.action=%i", int(id(thermostat_embedded).action));
+ id(update_climate_icon).execute("climate.target_icon", int(id(thermostat_embedded).action), int(id(thermostat_embedded).mode));
+
+ // Update buttons bar
+ ESP_LOGV("script.addon_climate_update_page_climate", "Updating buttons bar");
+ // Hide not supported hotspots
+ id(disp1).hide_component("button01");
+ id(disp1).hide_component("button02");
+ if (${addon_climate_heat}) id(disp1).show_component("button03"); else id(disp1).hide_component("button03"); //Heat
+ if (${addon_climate_cool}) id(disp1).show_component("button04"); else id(disp1).hide_component("button04"); //Cool
+ id(disp1).hide_component("button05");
+ id(disp1).hide_component("button06");
+ id(disp1).show_component("button07"); //Off
+ // Set buttons colors
+ id(disp1).set_component_font_color("climate.button01_icon", 6339);
+ id(disp1).set_component_font_color("climate.button02_icon", 6339);
+ id(disp1).set_component_font_color("climate.button03_icon", (id(thermostat_embedded).mode==climate::CLIMATE_MODE_HEAT) ? 64164 : ((${addon_climate_heat}) ? 48631 : 6339));
+ id(disp1).set_component_font_color("climate.button04_icon", (id(thermostat_embedded).mode==climate::CLIMATE_MODE_COOL) ? 1055 : ((${addon_climate_cool}) ? 48631 : 6339));
+ id(disp1).set_component_font_color("climate.button05_icon", 6339);
+ id(disp1).set_component_font_color("climate.button06_icon", 6339);
+ id(disp1).set_component_font_color("climate.button07_icon", (id(thermostat_embedded).mode==climate::CLIMATE_MODE_OFF) ? 10597 : 35921);
+ }
+ ESP_LOGV("script.addon_climate_update_page_climate", "Finished");
+
+ - id: !extend addon_climate_set_climate_friendly_name
+ then:
+ - lambda: |-
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "Starting");
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "friendly_name: %s", friendly_name.c_str());
+ id(addon_climate_friendly_name) = friendly_name;
+ ESP_LOGV("script.addon_climate_set_climate_friendly_name", "Finished");
+
+switch:
+ ##### PHYSICAL SWITCH 0 (Dummy) - Used when relay is not set #####
+ - name: ${device_name} Relay 0 (dummy)
+ platform: template
+ id: relay_0
+ lambda: !lambda return false;
+ internal: true
+ optimistic: true
diff --git a/nspanel_eu.HMI b/nspanel_eu.HMI
index a93787a4c..cfde29771 100644
Binary files a/nspanel_eu.HMI and b/nspanel_eu.HMI differ
diff --git a/nspanel_eu.tft b/nspanel_eu.tft
index 266010a73..89c90868b 100644
Binary files a/nspanel_eu.tft and b/nspanel_eu.tft differ
diff --git a/nspanel_eu_code/Program.s.txt b/nspanel_eu_code/Program.s.txt
index c76d01fcd..627811f39 100644
--- a/nspanel_eu_code/Program.s.txt
+++ b/nspanel_eu_code/Program.s.txt
@@ -4,10 +4,20 @@ Program.s
int r=0,g=0,b=0
int h=0,s=0,v=0
int p=0,q=0,t=0,f=0
- bauds=115200//Configure baudrat
- recmod=0//Serial data parsing mode:0-Passive mode;1-Active mod
- printh 00 00 00 ff ff ff 88 ff ff ff//Output power on information to serial pore
- lcd_dev fffb 0002 0000 0020// Fix touch offset for EU Version
+ int dimdelta=0
+ int api=0 // 0 = disconnected from HA, 1 = connected to HA
+ int sleep_mode=0
+ int is_alarm=0,is_entities=0,is_qrcode=0,is_notification=0
+ int brightness=100,brightness_dim=40
+ int display_mode=1 // 1 = EU, 2 = US, 3 = US landscape
+ bauds=115200//Configure baudrate
+ recmod=0//Serial data parsing mode:0-Passive mode;1-Active mode
+ randset 0,65535//used for touchevent sensor
+ printh 00 00 00 ff ff ff 88 ff ff ff//Output power on information to serial port
+ if(display_mode==1)
+ {
+ lcd_dev fffb 0002 0000 0020// Fix touch offset for EU Version
+ }
printh 92
prints "nspanelevent",0
printh 00
diff --git a/nspanel_eu_code/alarm.txt b/nspanel_eu_code/alarm.txt
new file mode 100644
index 000000000..da7b5388f
--- /dev/null
+++ b/nspanel_eu_code/alarm.txt
@@ -0,0 +1,452 @@
+Page alarm
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"alarm\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ vis bt_home,0
+ vis bt_away,0
+ vis bt_night,0
+ vis bt_vacat,0
+ vis bt_bypass,0
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) lastclick
+ Attributes
+ ID : 3
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) back_page
+ Attributes
+ ID : 4
+ Scope : local
+ Text : home
+ Max. Text Size: 15
+
+Variable (string) code_format
+ Attributes
+ ID : 29
+ Scope : local
+ Text :
+ Max. Text Size: 15
+
+Variable (string) code_arm_req
+ Attributes
+ ID : 30
+ Scope : local
+ Text :
+ Max. Text Size: 1
+
+Text page_label
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Alarm Control Panel
+ Max. Text Size : 25
+
+Text icon_state
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : î
+ Max. Text Size : 10
+
+Text bt_home_text
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Home
+ Max. Text Size : 22
+
+Text bt_away_text
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Away
+ Max. Text Size : 22
+
+Text bt_night_text
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Night
+ Max. Text Size : 22
+
+Text bt_vacat_text
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Vacation
+ Max. Text Size : 22
+
+Text bt_bypass_text
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Bypass
+ Max. Text Size : 22
+
+Text bt_disarm_text
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Disarm
+ Max. Text Size : 22
+
+Text bt_home_icon
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text bt_away_icon
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text bt_night_icon
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text bt_vacat_icon
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text bt_bypass_icon
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text bt_disarm_icon
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Picture bt_home_pic
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture bt_away_pic
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture bt_night_pic
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture bt_vacat_pic
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture bt_bypass_pic
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture bt_disarm_pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 31
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Hotspot bt_home
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ bt_home_pic.pic=44
+ bt_home_text.bco=65024
+ bt_home_text.pco=0
+ bt_home_icon.bco=65024
+ bt_home_icon.pco=0
+
+ Touch Release Event
+ lastclick.txt="{\"page\": \"alarm\", \"key\": \"home\", \"value\": \"click\", \"mui\": \""+bt_home_text.txt+"\", \"code_format\": \""+code_format.txt+"\", \"code_arm_req\": \""+code_arm_req.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Hotspot bt_away
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ bt_away_pic.pic=44
+ bt_away_text.bco=65024
+ bt_away_text.pco=0
+ bt_away_icon.bco=65024
+ bt_away_icon.pco=0
+
+ Touch Release Event
+ lastclick.txt="{\"page\": \"alarm\", \"key\": \"away\", \"value\": \"click\", \"mui\": \""+bt_away_text.txt+"\", \"code_format\": \""+code_format.txt+"\", \"code_arm_req\": \""+code_arm_req.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Hotspot bt_night
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ bt_night_pic.pic=44
+ bt_night_text.bco=65024
+ bt_night_text.pco=0
+ bt_night_icon.bco=65024
+ bt_night_icon.pco=0
+
+ Touch Release Event
+ lastclick.txt="{\"page\": \"alarm\", \"key\": \"night\", \"value\": \"click\", \"mui\": \""+bt_night_text.txt+"\", \"code_format\": \""+code_format.txt+"\", \"code_arm_req\": \""+code_arm_req.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Hotspot bt_vacat
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ bt_vacat_pic.pic=44
+ bt_vacat_text.bco=65024
+ bt_vacat_text.pco=0
+ bt_vacat_icon.bco=65024
+ bt_vacat_icon.pco=0
+
+ Touch Release Event
+ lastclick.txt="{\"page\": \"alarm\", \"key\": \"vacation\", \"value\": \"click\", \"mui\": \""+bt_vacat_text.txt+"\", \"code_format\": \""+code_format.txt+"\", \"code_arm_req\": \""+code_arm_req.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Hotspot bt_bypass
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ bt_bypass_pic.pic=44
+ bt_bypass_text.bco=65024
+ bt_bypass_text.pco=0
+ bt_bypass_icon.bco=65024
+ bt_bypass_icon.pco=0
+
+ Touch Release Event
+ lastclick.txt="{\"page\": \"alarm\", \"key\": \"bypass\", \"value\": \"click\", \"mui\": \""+bt_bypass_text.txt+"\", \"code_format\": \""+code_format.txt+"\", \"code_arm_req\": \""+code_arm_req.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Hotspot bt_disarm
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ bt_disarm_pic.pic=44
+ bt_disarm_text.bco=65024
+ bt_disarm_text.pco=0
+ bt_disarm_icon.bco=65024
+ bt_disarm_icon.pco=0
+
+ Touch Release Event
+ lastclick.txt="{\"page\": \"alarm\", \"key\": \"disarm\", \"value\": \"click\", \"mui\": \""+bt_disarm_text.txt+"\", \"code_format\": \""+code_format.txt+"\", \"code_arm_req\": \""+code_arm_req.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Timer wakeup_timer
+ Attributes
+ ID : 32
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ climateslider.val--
+ temp_number.val=climateslider.val*temp_step.val
+ temp_number.val+=temp_offset.val
+ va0.val=temp_number.val/10
+ covx va0.val,target_temp.txt,0,0
+ va0.val=temp_number.val%10
+ covx va0.val,va1.txt,0,0
+ target_temp.txt+="."+va1.txt
+ }
+
+ Touch Release Event
+ timer01.en=1
+
+Hotspot increase_temp
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ if(climateslider.valswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_eu_code/confirm.txt b/nspanel_eu_code/confirm.txt
new file mode 100644
index 000000000..a6a1dcd13
--- /dev/null
+++ b/nspanel_eu_code/confirm.txt
@@ -0,0 +1,170 @@
+Page confirm
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"confirm\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) page_id
+ Attributes
+ ID : 3
+ Scope: global
+ Value: 0
+
+Variable (string) aux
+ Attributes
+ ID : 5
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) page_name
+ Attributes
+ ID : 9
+ Scope : global
+ Text :
+ Max. Text Size: 12
+
+Variable (string) component
+ Attributes
+ ID : 10
+ Scope : global
+ Text :
+ Max. Text Size: 10
+
+Text t0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text title
+ Attributes
+ ID : 4
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Please confirm
+ Max. Text Size : 30
+
+Text body
+ Attributes
+ ID : 8
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Please confirm
+ Max. Text Size : 22
+
+Button bclose
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Button bt_accept
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ aux.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+component.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints aux.txt,0
+ printh 00
+ printh FF FF FF
+ page page_id.val
+
+Button bt_clear
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Timer wakeup_timer
+ Attributes
+ ID : 11
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.val=5)
+ {
+ fanslider.val++
+ }
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ fanslider.val--
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ }
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_eu_code/home.txt b/nspanel_eu_code/home.txt
index d821007c8..e1678e15e 100644
--- a/nspanel_eu_code/home.txt
+++ b/nspanel_eu_code/home.txt
@@ -12,7 +12,6 @@ Page home
Events
Preinitialize Event
- dim=brightness.val
dimtimer.en=1
sleeptimer.en=1
printh 92
@@ -21,41 +20,60 @@ Page home
prints "{\"page\": \"home\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
printh 00
printh FF FF FF
+ vis bt_notific,is_notification
+ vis bt_qrcode,is_qrcode
+ vis bt_entities,is_entities
+ vis bt_alarm,is_alarm
+ if(display_mode==3)
+ {
+ vis left_bt_text,0
+ vis right_bt_text,0
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
-Variable (int32) brightness
+Variable (int32) disdim
Attributes
ID : 2
Scope: global
- Value: 100
-
-Variable (int32) brightdd
- Attributes
- ID : 3
- Scope: global
- Value: 40
+ Value: 0
-Variable (int32) disdim
+Variable (string) lastclick
Attributes
- ID : 4
- Scope: global
- Value: 0
+ ID : 39
+ Scope : local
+ Text :
+ Max. Text Size: 100
-Variable (int32) sleepmodus
+Variable (string) climate_entity
Attributes
- ID : 16
- Scope: global
- Value: 0
+ ID : 40
+ Scope : global
+ Text :
+ Max. Text Size: 100
-Variable (string) lastclick
+Variable (string) click_comp
Attributes
- ID : 54
+ ID : 48
Scope : local
Text :
- Max. Text Size: 100
+ Max. Text Size: 8
Text time
Attributes
- ID : 7
+ ID : 5
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -65,7 +83,7 @@ Text time
Text current_temp
Attributes
- ID : 8
+ ID : 6
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -75,7 +93,7 @@ Text current_temp
Text outdoor_temp
Attributes
- ID : 9
+ ID : 7
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -85,7 +103,7 @@ Text outdoor_temp
Text date
Attributes
- ID : 10
+ ID : 8
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -95,7 +113,7 @@ Text date
Text value01_state
Attributes
- ID : 12
+ ID : 10
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -105,7 +123,7 @@ Text value01_state
Text left_bt_text
Attributes
- ID : 17
+ ID : 14
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -115,7 +133,7 @@ Text left_bt_text
Text right_bt_text
Attributes
- ID : 18
+ ID : 15
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -125,117 +143,117 @@ Text right_bt_text
Text icon_top_01
Attributes
- ID : 21
+ ID : 16
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_02
Attributes
- ID : 22
+ ID : 17
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_03
Attributes
- ID : 23
+ ID : 18
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_04
Attributes
- ID : 24
+ ID : 19
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_05
Attributes
- ID : 25
+ ID : 20
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_06
Attributes
- ID : 26
+ ID : 21
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_07
Attributes
- ID : 27
+ ID : 22
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_08
Attributes
- ID : 28
+ ID : 23
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_09
Attributes
- ID : 29
+ ID : 24
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_10
Attributes
- ID : 30
+ ID : 25
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value01_icon
Attributes
- ID : 31
+ ID : 26
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value03_state
Attributes
- ID : 32
+ ID : 27
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -245,27 +263,27 @@ Text value03_state
Text value03_icon
Attributes
- ID : 33
+ ID : 28
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value02_icon
Attributes
- ID : 34
+ ID : 29
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value02_state
Attributes
- ID : 35
+ ID : 30
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -275,7 +293,7 @@ Text value02_state
Text wifi_icon
Attributes
- ID : 36
+ ID : 31
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -285,57 +303,82 @@ Text wifi_icon
Text indoortempicon
Attributes
- ID : 37
+ ID : 32
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button01_icon
+Text bt_notific
Attributes
- ID : 38
- Scope : local
+ ID : 33
+ Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button02_icon
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page notification
+ }
+
+Text bt_qrcode
Attributes
- ID : 39
+ ID : 34
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button03_icon
+ Events
+ Touch Release Event
+ page qrcode
+
+Text bt_entities
Attributes
- ID : 40
+ ID : 35
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button04_icon
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page entitypage01
+ }
+
+Text bt_alarm
Attributes
- ID : 41
+ ID : 36
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button05_icon
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page alarm
+ }
+
+Text meridiem
Attributes
- ID : 42
+ ID : 38
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -343,235 +386,183 @@ Text button05_icon
Text :
Max. Text Size : 10
-Text button06_icon
+Text button01
Attributes
- ID : 43
+ ID : 45
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button07_icon
+ Events
+ Touch Press Event
+ click_comp.txt="button01"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Text button02
Attributes
- ID : 44
+ ID : 46
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text meridiem
+ Events
+ Touch Press Event
+ click_comp.txt="button02"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Text button03
Attributes
- ID : 53
+ ID : 47
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
+ Events
+ Touch Press Event
+ click_comp.txt="button03"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
Picture weather
Attributes
- ID : 11
+ ID : 9
Scope : global
Dragging : 0
Send Component ID: disabled
-Picture left_bt_pic
+Dual-state Button left_bt_pic
Attributes
- ID : 19
+ ID : 42
Scope : global
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text :
+ Max. Text Size : 0
-Picture right_bt_pic
+Dual-state Button right_bt_pic
Attributes
- ID : 20
+ ID : 43
Scope : global
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text :
+ Max. Text Size : 0
Hotspot fc_weather
Attributes
- ID : 13
+ ID : 11
Scope : global
Dragging : 0
Send Component ID: on press and release
Events
Touch Press Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"weather\", \"value\": \"press\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"weather\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ if(api==1)
+ {
+ page weather01
+ }
Hotspot jump_climate
Attributes
- ID : 14
+ ID : 12
Scope : local
Dragging : 0
Send Component ID: on press and release
Events
Touch Press Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"press\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button01
- Attributes
- ID : 45
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button01\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button02
- Attributes
- ID : 46
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button02\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button03
- Attributes
- ID : 47
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button03\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ if(climate_entity.txt=="")
+ {
+ lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"press\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }else
+ {
+ page climate
+ }
-Hotspot button04
- Attributes
- ID : 48
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button04\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button05
- Attributes
- ID : 49
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button05\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ if(climate_entity.txt=="")
+ {
+ lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"release\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }else
+ {
+ page climate
+ }
-Hotspot button06
+Hotspot settings_click
Attributes
- ID : 50
+ ID : 37
Scope : local
Dragging : 0
Send Component ID: disabled
Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button06\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ Touch Press Event
+ settings_timer.en=1
-Hotspot button07
- Attributes
- ID : 51
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button07\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ settings_timer.en=0
-Hotspot settings_click
- Attributes
- ID : 52
- Scope : local
- Dragging : 0
- Send Component ID: on press and release
-
Timer dimtimer
Attributes
ID : 1
@@ -583,12 +574,12 @@ Timer dimtimer
Timer Event
if(disdim.val==0)
{
- dim=brightdd.val // Dim down screen to val set from HA
+ dims=brightness_dim // Dim down screen to val set from HA
}
Timer swipestore
Attributes
- ID : 6
+ ID : 4
Scope : local
Period (ms): 50
Enabled : no
@@ -600,30 +591,82 @@ Timer swipestore
Timer sleeptimer
Attributes
- ID : 15
+ ID : 13
Scope : local
Period (ms): 65000
Enabled : no
Events
Timer Event
- if(sleepmodus.val==1)
+ if(sleep_mode==1)
{
screensaver.orign.val=0
// Go to screensaver page
page screensaver
}
+Timer settings_timer
+ Attributes
+ ID : 41
+ Scope : local
+ Period (ms): 1000
+ Enabled : no
+
+ Events
+ Timer Event
+ page settings
+
+Timer wakeup_timer
+ Attributes
+ ID : 44
+ Scope : local
+ Period (ms): 50
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ if(swipec>swipedx&&api==1)
{
page buttonpage04
}
// Right to Left
swipec2=0-swipedx
- if(swipec100)
+ if(swipec>100&&api==1)
{
page buttonpage02
}
// Down to Up
swipec2=0-swipedy
- if(swipec<-100)
+ if(swipec<-100&&api==1)
{
page buttonpage03
}
diff --git a/nspanel_eu_code/keyb_num.txt b/nspanel_eu_code/keyb_num.txt
new file mode 100644
index 000000000..b9bf1902a
--- /dev/null
+++ b/nspanel_eu_code/keyb_num.txt
@@ -0,0 +1,398 @@
+Page keyb_num
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page page_id.val
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"keyb_num\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) page_id
+ Attributes
+ ID : 17
+ Scope: local
+ Value: 0
+
+Variable (string) key
+ Attributes
+ ID : 19
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (string) entity
+ Attributes
+ ID : 20
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) domain
+ Attributes
+ ID : 21
+ Scope : local
+ Text : alarm
+ Max. Text Size: 10
+
+Variable (string) aux
+ Attributes
+ ID : 22
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) value
+ Attributes
+ ID : 23
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Text t0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text pin
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text title
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Alarm
+ Max. Text Size : 10
+
+Button b1
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 1
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b1.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button bclose
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Button b2
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 2
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b2.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b3
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 3
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b3.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b4
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 4
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b4.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b5
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 5
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b5.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b6
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 6
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b6.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b7
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 7
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b7.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b8
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 8
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b8.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b9
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 9
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b9.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button bclear
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : <
+ Max. Text Size : 5
+
+ Events
+ Touch Release Event
+ pin.txt=""
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b0
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 0
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b0.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button benter
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : OK
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ aux.txt="{\"page\": \"keyb_num\", \"key\": \""+key.txt+"\", \"value\": \""+value.txt+"\", \"entity\": \""+entity.txt+"\", \"pin\": \""+pin.txt+"\", \"base_domain\": \""+domain.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints aux.txt,0
+ printh 00
+ printh FF FF FF
+
+Button bview
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : O
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(pin.pw==1)
+ {
+ pin.pw=0
+ }else
+ {
+ pin.pw=1
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 24
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim=156)
+ {
+ ring.val++
+ }
+ if(sys0>=625)
+ {
+ ring.val++
+ }
+ if(sys0>=1406)
+ {
+ ring.val++
+ }
+ if(sys0>=2500)
+ {
+ ring.val++
+ }
+ if(sys0>=3906)
+ {
+ ring.val++
+ }
+ if(sys0>=5625)
+ {
+ ring.val++
+ }
+ if(sys0>=7656)
+ {
+ ring.val++
+ }
+ //
+ // Determine quadrant (0-3). Note: pixel y coords are inverted
+ // compared to mathematical y coords. But we want math. quadrants.
+ sya1*=-1
+ sys2=0
+ if(sya1<0)
+ {
+ sys2+=2
+ }
+ sys0=sya0*sya1
+ if(sys0<0)
+ {
+ sys2+=1
+ // In this case we also want to swap x and y otherwise the
+ // atan(abs(x/y)) (calculated below) gives values running
+ // "the wrong way" (cw instead of ccw).
+ sys1=sya1
+ sya1=sya0
+ sya0=sys1
+ }
+ //
+ field.val=sys2*6
+ //
+ // x,y sign is not required anymore
+ if(sya0<0)
+ {
+ sya0*=-1
+ }
+ if(sya1<0)
+ {
+ sya1*=-1
+ }
+ //
+ // Determine field in ring quadrant
+ // Factor 100000 chosen more or less arbitrarily.
+ // sys0 = 100000 * tan_a = 100000 * y / x
+ sys0=100000*sya1
+ sys0/=sya0
+ // repeat for all fields
+ if(sys0>=26794)
+ {
+ field.val++
+ }
+ if(sys0>=57735)
+ {
+ field.val++
+ }
+ if(sys0>=99999)
+ {
+ field.val++
+ }
+ if(sys0>=173205)
+ {
+ field.val++
+ }
+ if(sys0>=373205)
+ {
+ field.val++
+ }
+ covx r,va1.txt,0,0
+ covx g,va2.txt,0,0
+ covx b,va3.txt,0,0
+ va1.txt=""
+ va2.txt=""
+ va3.txt=""
+
+ Touch Release Event
+ // Adjust field.val "orientation" and offset to match the h value of the colors in the wheel
+ h=23-field.val// 0 <= field.val <= 23
+ // h is expected to be 0-6*256 (see hsv2rgb)
+ h*=6*256
+ h/=24// Number of fields
+ //
+ // s is expected to be 0-256 (see hsv2rgb)
+ s=ring.val*256
+ s/=8// Number of rings
+ // no "value" selectable; fix it to the maximum (matching the colors in the wheels shown.
+ v=255
+ click hsv2rgb,0
+ click rgb888to565,0
+ //colPreview.bco=rgb565.val
+ covx r,va1.txt,0,0
+ covx g,va2.txt,0,0
+ covx b,va3.txt,0,0
+ lightsetting.txt="{\"page\": \"light\", \"component\": \"rgb_color\", \"value\": ["+va1.txt+", "+va2.txt+", "+va3.txt+"]}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+ va1.txt=""
+ va2.txt=""
+ va3.txt=""
+
+Slider lightslider
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ covx lightslider.val,va1.txt,0,0
+ light_value.txt=va1.txt+"%"
+ light_value_2.txt=va1.txt+"%"
+ lightsetting.txt="{\"page\": \"light\", \"key\": \"brightness_pct\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+
+Slider tempslider
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 500
+ Lower range limit: 153
+
+ Events
+ Touch Release Event
+ covx tempslider.val,va1.txt,0,0
+ temp_value.txt=va1.txt
+ temp_value_2.txt=va1.txt
+ lightsetting.txt="{\"page\": \"light\", \"key\": \"color_temp\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 32
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Hotspot hsv2rgb
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ // https://de.wikipedia.org/wiki/HSV-Farbraum#Umrechnung_HSV_in_RGB
+ // The values range from 0..255 instead of 0..1
+ // h ranges from 0..(6*256)
+ if(s>=256)
+ {
+ s=255
+ }else if(s<0)
+ {
+ s=0
+ }
+ if(v>=256)
+ {
+ v=255
+ }else if(v<0)
+ {
+ v=0
+ }
+ f=h&0xff
+ p=256-s
+ p*=v
+ p=p>>8// / 256
+ q=s*f// 0-256*256 = 0-65536
+ q=65536-q
+ q*=v
+ q=q>>16
+ t=256-f
+ t*=s
+ t=65536-t
+ t*=v
+ t=t>>16
+ //
+ f=h>>8
+ if(f==1)
+ {
+ r=q
+ g=v
+ b=p
+ }else if(f==2)
+ {
+ r=p
+ g=v
+ b=t
+ }else if(f==3)
+ {
+ r=p
+ g=q
+ b=v
+ }else if(f==4)
+ {
+ r=t
+ g=p
+ b=v
+ }else if(f==5)
+ {
+ r=v
+ g=p
+ b=q
+ }else
+ {
+ r=v
+ g=t
+ b=p
+ }
+
+Hotspot rgb888to565
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ r=r&0xff
+ g=g&0xff
+ b=b&0xff
+ sys1=r>>3
+ sys2=sys1<<6
+ sys1=g>>2
+ sys2+=sys1
+ sys2=sys2<<5
+ sys1=b>>3
+ sys2+=sys1
+ rgb565.val=sys2
+
+Hotspot light_touch
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis light_b_press,1
+ vis lightslider,1
+ vis light_value,1
+ vis temp_value_2,1
+ // #### OFF Button #####
+ vis temp_b_press,0
+ vis color_b_pres,0
+ // #### OFF Value #####
+ vis temp_value,0
+ vis light_value_2,0
+ // #### OFF Slider #####
+ vis tempslider,0
+ vis colorwheel,0
+
+Hotspot temp_touch
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis temp_b_press,1
+ vis tempslider,1
+ vis temp_value,1
+ vis light_value_2,1
+ // #### OFF Button #####
+ vis light_b_press,0
+ vis color_b_pres,0
+ // #### OFF Value #####
+ vis light_value,0
+ vis temp_value_2,0
+ // #### OFF Slider #####
+ vis lightslider,0
+ vis colorwheel,0
+
+Hotspot color_touch
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis color_b_pres,1
+ vis colorwheel,1
+ vis light_value_2,1
+ // #### OFF Button #####
+ vis light_b_press,0
+ vis temp_b_press,0
+ // #### OFF Value #####
+ vis light_value,0
+ vis temp_value,0
+ vis temp_value_2,0
+ // #### OFF Slider #####
+ vis lightslider,0
+ vis tempslider,0
+ // #### OFF Color #####
+
+Timer swipestore
+ Attributes
+ ID : 21
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 33
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_eu_code/media_player.txt b/nspanel_eu_code/media_player.txt
new file mode 100644
index 000000000..f731dac2f
--- /dev/null
+++ b/nspanel_eu_code/media_player.txt
@@ -0,0 +1,488 @@
+Page media_player
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) back_page
+ Attributes
+ ID : 3
+ Scope : local
+ Text : home
+ Max. Text Size: 15
+
+Variable (string) lastclick
+ Attributes
+ ID : 20
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) va0
+ Attributes
+ ID : 23
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (int32) is_muted
+ Attributes
+ ID : 24
+ Scope: local
+ Value: 0
+
+Variable (int32) prg_current
+ Attributes
+ ID : 26
+ Scope: local
+ Value: 0
+
+Variable (int32) prg_total
+ Attributes
+ ID : 27
+ Scope: local
+ Value: 0
+
+Text page_label
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Media Player
+ Max. Text Size : 25
+
+Text icon_state
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : î
+ Max. Text Size : 10
+
+Text vol_text
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text bt_vol_down
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(vol_slider.val>0)
+ {
+ vol_slider.val--
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ }
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text bt_vol_up
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(vol_slider.val<100)
+ {
+ vol_slider.val++
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ }
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text bt_mute
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(is_muted.val==1)
+ {
+ va0.txt="true"
+ }else
+ {
+ va0.txt="false"
+ }
+ lastclick.txt="{\"page\": \"media_player\", \"key\": \"volume_mute\", \"value\": \""+va0.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text time_current
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text time_total
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text track
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 50
+
+Text artist
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 50
+
+Text bt_prev
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_previous_track\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_previous_track\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_play_pause
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_play_pause\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_stop
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_stop\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_next
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_next_track\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_on_off
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"toggle\"}",0
+ printh 00
+ printh FF FF FF
+
+Progress Bar time_progress
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Value : 0
+
+Slider vol_slider
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 21
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ prg_current.val++
+ time_progress.val=100*prg_current.val/prg_total.val
+ covx prg_current.val,time_current.txt,0,0
+ }
+ // Progress - Total
+ sys0=prg_total.val/3600 //hours
+ sys2=prg_total.val%3600 //remainder
+ sys1=sys2/60 //minutes
+ sys2%=60 //seconds
+ time_total.txt=""
+ if(sys0>0)
+ {
+ covx sys0,time_total.txt,0,0
+ time_total.txt+=":"
+ if(sys1<10)
+ {
+ time_total.txt+="0"
+ }
+ }
+ covx sys1,va0.txt,0,0
+ time_total.txt+=va0.txt+":"
+ if(sys2<10)
+ {
+ time_total.txt+="0"
+ }
+ covx sys2,va0.txt,0,0
+ time_total.txt+=va0.txt
+ // Progress - Current
+ sys0=prg_current.val/3600 //hours
+ sys2=prg_current.val%3600 //remainder
+ sys1=sys2/60 //minutes
+ sys2%=60 //seconds
+ time_current.txt=""
+ if(sys0>0)
+ {
+ covx sys0,time_current.txt,0,0
+ time_current.txt+=":"
+ if(sys1<10)
+ {
+ time_current.txt+="0"
+ }
+ }
+ covx sys1,va0.txt,0,0
+ time_current.txt+=va0.txt+":"
+ if(sys2<10)
+ {
+ time_current.txt+="0"
+ }
+ covx sys2,va0.txt,0,0
+ time_current.txt+=va0.txt
+
diff --git a/nspanel_eu_code/notification.txt b/nspanel_eu_code/notification.txt
index 8ce367b66..341bf5352 100644
--- a/nspanel_eu_code/notification.txt
+++ b/nspanel_eu_code/notification.txt
@@ -12,50 +12,53 @@ Page notification
Events
Preinitialize Event
- dim=home.brightness.val
- printh 92
- prints "nspanelevent",0
- printh 00
- prints "{\"page\": \"notification\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
- printh 00
- printh FF FF FF
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"notification\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
Touch Press Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"notification\", \"component\": \"touchevent\", \"value\": \"press\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Touch Release Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"notification\", \"component\": \"touchevent\", \"value\": \"release\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Variable (string) lastclick
Attributes
- ID : 10
+ ID : 5
Scope : local
Text :
Max. Text Size: 100
Text notifi_text01
Attributes
- ID : 2
+ ID : 1
Scope : local
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 100
+ Max. Text Size : 250
Text notifi_label
Attributes
- ID : 3
+ ID : 2
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -63,37 +66,29 @@ Text notifi_label
Text :
Max. Text Size : 30
-Picture accept_pic
- Attributes
- ID : 4
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
-Picture clear_pic
+Button button_back
Attributes
- ID : 5
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
-Hotspot notifi_back
- Attributes
- ID : 1
+ ID : 6
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Press Event
page home
-Hotspot accept
+Button bt_accept
Attributes
- ID : 6
+ ID : 7
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Release Event
@@ -105,12 +100,15 @@ Hotspot accept
printh 00
printh FF FF FF
-Hotspot clear
+Button bt_clear
Attributes
- ID : 7
+ ID : 8
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
Events
Touch Release Event
@@ -124,7 +122,7 @@ Hotspot clear
Timer swipestore
Attributes
- ID : 9
+ ID : 4
Scope : local
Period (ms): 50
Enabled : no
@@ -134,9 +132,32 @@ Timer swipestore
swipex=tch0
swipey=tch1
+Timer wakeup_timer
+ Attributes
+ ID : 9
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ brightslider.val--
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
-Timer swipestore
+Hotspot bt_bright_up
Attributes
- ID : 2
- Scope : local
- Period (ms): 50
- Enabled : no
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
Events
- Timer Event
- swipex=tch0
- swipey=tch1
+ Touch Release Event
+ if(brightslider.val<100)
+ {
+ brightslider.val++
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
-TouchCap swipe
+Hotspot bt_dim_down
Attributes
- ID : 1
- Scope: local
- Value: 0
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
Events
- Touch Press Event
- swipestore.en=1 // Start swipestore timer
+ Touch Release Event
+ if(dimslider.val>0)
+ {
+ dimslider.val--
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 91
+ prints "dimslider",0
+ printh 00
+ prints dimslider.val,0
+ printh FF FF FF
+ }
+Hotspot bt_dim_up
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
Touch Release Event
- swipestore.en=0
- // Touch has ended, x
- if(tch0==0)
+ if(dimslider.val<100)
{
- swipec=swipex-tch2
- // From Left to Right
- if(swipec>swipedx)
- {
- //page
- }
- // Right to Left
- swipec2=0-swipedx
- if(swipec100)
+ dimdelta=brightness-dim
+ dimdelta/=10
+ if(dimdelta<1)
{
- //page
- }
- // Down to Up
- swipec2=0-swipedy
- if(swipec<-100)
- {
- //page
+ dimdelta=1
}
+ dim+=dimdelta
+ }else
+ {
+ wakeup_timer.en=0
}
diff --git a/nspanel_eu_code/weather01.txt b/nspanel_eu_code/weather01.txt
index b3c876c32..d40e61290 100644
--- a/nspanel_eu_code/weather01.txt
+++ b/nspanel_eu_code/weather01.txt
@@ -12,27 +12,31 @@ Page weather01
Events
Preinitialize Event
- printh 92
- prints "nspanelevent",0
- printh 00
- prints "{\"page\": \"weather01\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
- printh 00
- printh FF FF FF
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"weather01\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
Touch Press Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"weather01\", \"component\": \"touchevent\", \"value\": \"press\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Touch Release Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"weather01\", \"component\": \"touchevent\", \"value\": \"release\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Text day
@@ -67,7 +71,7 @@ Text temperature
Text loading
Attributes
- ID : 8
+ ID : 7
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -77,7 +81,7 @@ Text loading
Text value01
Attributes
- ID : 9
+ ID : 8
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -87,7 +91,7 @@ Text value01
Text value05
Attributes
- ID : 10
+ ID : 9
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -97,7 +101,7 @@ Text value05
Text value04
Attributes
- ID : 11
+ ID : 10
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -107,7 +111,7 @@ Text value04
Text value02
Attributes
- ID : 12
+ ID : 11
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -117,7 +121,7 @@ Text value02
Text value03
Attributes
- ID : 13
+ ID : 12
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -127,7 +131,7 @@ Text value03
Text value01_icon
Attributes
- ID : 14
+ ID : 13
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -137,7 +141,7 @@ Text value01_icon
Text value02_icon
Attributes
- ID : 15
+ ID : 14
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -147,7 +151,7 @@ Text value02_icon
Text value03_icon
Attributes
- ID : 16
+ ID : 15
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -157,7 +161,7 @@ Text value03_icon
Text value04_icon
Attributes
- ID : 17
+ ID : 16
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -167,7 +171,7 @@ Text value04_icon
Text value05_icon
Attributes
- ID : 18
+ ID : 17
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -175,6 +179,16 @@ Text value05_icon
Text :
Max. Text Size : 10
+Text page_index
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
Picture weather_icon
Attributes
ID : 3
@@ -182,12 +196,15 @@ Picture weather_icon
Dragging : 0
Send Component ID: disabled
-Hotspot weather_back
+Button button_back
Attributes
- ID : 7
+ ID : 18
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Press Event
@@ -205,6 +222,29 @@ Timer swipestore
swipex=tch0
swipey=tch1
+Timer wakeup_timer
+ Attributes
+ ID : 20
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ climateslider.val--
+ temp_number.val=climateslider.val*temp_step.val
+ temp_number.val+=temp_offset.val
+ va0.val=temp_number.val/10
+ covx va0.val,target_temp.txt,0,0
+ va0.val=temp_number.val%10
+ covx va0.val,va1.txt,0,0
+ target_temp.txt+="."+va1.txt
+ }
+
+ Touch Release Event
+ timer01.en=1
+
+Hotspot increase_temp
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ if(climateslider.valswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_code/confirm.txt b/nspanel_us_code/confirm.txt
new file mode 100644
index 000000000..a6a1dcd13
--- /dev/null
+++ b/nspanel_us_code/confirm.txt
@@ -0,0 +1,170 @@
+Page confirm
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"confirm\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) page_id
+ Attributes
+ ID : 3
+ Scope: global
+ Value: 0
+
+Variable (string) aux
+ Attributes
+ ID : 5
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) page_name
+ Attributes
+ ID : 9
+ Scope : global
+ Text :
+ Max. Text Size: 12
+
+Variable (string) component
+ Attributes
+ ID : 10
+ Scope : global
+ Text :
+ Max. Text Size: 10
+
+Text t0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text title
+ Attributes
+ ID : 4
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Please confirm
+ Max. Text Size : 30
+
+Text body
+ Attributes
+ ID : 8
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Please confirm
+ Max. Text Size : 22
+
+Button bclose
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Button bt_accept
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ aux.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+component.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints aux.txt,0
+ printh 00
+ printh FF FF FF
+ page page_id.val
+
+Button bt_clear
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Timer wakeup_timer
+ Attributes
+ ID : 11
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.val=5)
+ {
+ fanslider.val++
+ }
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ fanslider.val--
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ }
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_code/home.txt b/nspanel_us_code/home.txt
index e1f0777fb..293d3b4b9 100644
--- a/nspanel_us_code/home.txt
+++ b/nspanel_us_code/home.txt
@@ -12,7 +12,6 @@ Page home
Events
Preinitialize Event
- dim=brightness.val
dimtimer.en=1
sleeptimer.en=1
printh 92
@@ -21,43 +20,60 @@ Page home
prints "{\"page\": \"home\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
printh 00
printh FF FF FF
- vis 255,0
- vis settings_click,1
+ vis bt_notific,is_notification
+ vis bt_qrcode,is_qrcode
+ vis bt_entities,is_entities
+ vis bt_alarm,is_alarm
+ if(display_mode==3)
+ {
+ vis left_bt_text,0
+ vis right_bt_text,0
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
-Variable (int32) brightness
+Variable (int32) disdim
Attributes
ID : 2
Scope: global
- Value: 100
-
-Variable (int32) brightdd
- Attributes
- ID : 3
- Scope: global
- Value: 40
+ Value: 0
-Variable (int32) disdim
+Variable (string) lastclick
Attributes
- ID : 4
- Scope: global
- Value: 0
+ ID : 39
+ Scope : local
+ Text :
+ Max. Text Size: 100
-Variable (int32) sleepmodus
+Variable (string) climate_entity
Attributes
- ID : 16
- Scope: global
- Value: 0
+ ID : 40
+ Scope : global
+ Text :
+ Max. Text Size: 100
-Variable (string) lastclick
+Variable (string) click_comp
Attributes
- ID : 54
+ ID : 48
Scope : local
Text :
- Max. Text Size: 100
+ Max. Text Size: 8
Text time
Attributes
- ID : 7
+ ID : 5
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -67,7 +83,7 @@ Text time
Text current_temp
Attributes
- ID : 8
+ ID : 6
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -77,7 +93,7 @@ Text current_temp
Text outdoor_temp
Attributes
- ID : 9
+ ID : 7
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -87,7 +103,7 @@ Text outdoor_temp
Text date
Attributes
- ID : 10
+ ID : 8
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -97,7 +113,7 @@ Text date
Text value01_state
Attributes
- ID : 12
+ ID : 10
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -107,7 +123,7 @@ Text value01_state
Text left_bt_text
Attributes
- ID : 17
+ ID : 14
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -117,7 +133,7 @@ Text left_bt_text
Text right_bt_text
Attributes
- ID : 18
+ ID : 15
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -127,117 +143,117 @@ Text right_bt_text
Text icon_top_01
Attributes
- ID : 21
+ ID : 16
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_02
Attributes
- ID : 22
+ ID : 17
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_03
Attributes
- ID : 23
+ ID : 18
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_04
Attributes
- ID : 24
+ ID : 19
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_05
Attributes
- ID : 25
+ ID : 20
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_06
Attributes
- ID : 26
+ ID : 21
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_07
Attributes
- ID : 27
+ ID : 22
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_08
Attributes
- ID : 28
+ ID : 23
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_09
Attributes
- ID : 29
+ ID : 24
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text icon_top_10
Attributes
- ID : 30
+ ID : 25
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value01_icon
Attributes
- ID : 31
+ ID : 26
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value03_state
Attributes
- ID : 32
+ ID : 27
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -247,27 +263,27 @@ Text value03_state
Text value03_icon
Attributes
- ID : 33
+ ID : 28
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value02_icon
Attributes
- ID : 34
+ ID : 29
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
Text value02_state
Attributes
- ID : 35
+ ID : 30
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -277,7 +293,7 @@ Text value02_state
Text wifi_icon
Attributes
- ID : 36
+ ID : 31
Scope : global
Dragging : 0
Send Component ID : disabled
@@ -287,293 +303,265 @@ Text wifi_icon
Text indoortempicon
Attributes
- ID : 37
+ ID : 32
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button01_icon
+Text bt_notific
Attributes
- ID : 38
+ ID : 33
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button02_icon
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page notification
+ }
+
+Text bt_qrcode
Attributes
- ID : 39
+ ID : 34
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button03_icon
+ Events
+ Touch Release Event
+ page qrcode
+
+Text bt_entities
Attributes
- ID : 40
+ ID : 35
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button04_icon
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page entitypage01
+ }
+
+Text bt_alarm
Attributes
- ID : 41
+ ID : 36
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button05_icon
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page alarm
+ }
+
+Text meridiem
Attributes
- ID : 42
+ ID : 38
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 2
-Text button06_icon
+Text button01
Attributes
- ID : 43
+ ID : 45
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text button07_icon
+ Events
+ Touch Press Event
+ click_comp.txt="button01"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Text button02
Attributes
- ID : 44
+ ID : 46
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 10
+ Max. Text Size : 3
-Text meridiem
+ Events
+ Touch Press Event
+ click_comp.txt="button02"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Text button03
Attributes
- ID : 53
+ ID : 47
Scope : global
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 2
+ Max. Text Size : 3
+ Events
+ Touch Press Event
+ click_comp.txt="button03"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
Picture weather
Attributes
- ID : 11
+ ID : 9
Scope : global
Dragging : 0
Send Component ID: disabled
-Picture left_bt_pic
+Dual-state Button left_bt_pic
Attributes
- ID : 19
+ ID : 42
Scope : global
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text :
+ Max. Text Size : 0
-Picture right_bt_pic
+Dual-state Button right_bt_pic
Attributes
- ID : 20
+ ID : 43
Scope : global
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text :
+ Max. Text Size : 0
Hotspot fc_weather
Attributes
- ID : 13
+ ID : 11
Scope : global
Dragging : 0
Send Component ID: on press and release
Events
Touch Press Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"weather\", \"value\": \"press\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"weather\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ if(api==1)
+ {
+ page weather01
+ }
Hotspot jump_climate
Attributes
- ID : 14
+ ID : 12
Scope : local
Dragging : 0
Send Component ID: on press and release
Events
Touch Press Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"press\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button01
- Attributes
- ID : 45
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button01\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button02
- Attributes
- ID : 46
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button02\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button03
- Attributes
- ID : 47
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button03\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ if(climate_entity.txt=="")
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"home\", \"component\": \"climate\", \"value\": \"press\"}",0
+ printh 00
+ printh FF FF FF
+ }else
+ {
+ page climate
+ }
-Hotspot button04
- Attributes
- ID : 48
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button04\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
-
-Hotspot button05
- Attributes
- ID : 49
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button05\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ if(climate_entity.txt=="")
+ {
+ lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"release\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }else
+ {
+ page climate
+ }
-Hotspot button06
+Hotspot settings_click
Attributes
- ID : 50
+ ID : 37
Scope : local
Dragging : 0
Send Component ID: disabled
Events
- Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button06\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ Touch Press Event
+ settings_timer.en=1
-Hotspot button07
- Attributes
- ID : 51
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
- Events
Touch Release Event
- lastclick.txt="{\"page\": \"home\", \"component\": \"button07\", \"value\": \"release\"}"
- printh 92
- prints "nspanelevent",0
- printh 00
- prints lastclick.txt,0
- printh 00
- printh FF FF FF
+ settings_timer.en=0
-Hotspot settings_click
- Attributes
- ID : 52
- Scope : local
- Dragging : 0
- Send Component ID: on press and release
-
Timer dimtimer
Attributes
ID : 1
@@ -585,12 +573,12 @@ Timer dimtimer
Timer Event
if(disdim.val==0)
{
- dim=brightdd.val // Dim down screen to val set from HA
+ dims=brightness_dim // Dim down screen to val set from HA
}
Timer swipestore
Attributes
- ID : 6
+ ID : 4
Scope : local
Period (ms): 50
Enabled : no
@@ -602,30 +590,82 @@ Timer swipestore
Timer sleeptimer
Attributes
- ID : 15
+ ID : 13
Scope : local
Period (ms): 65000
Enabled : no
Events
Timer Event
- if(sleepmodus.val==1)
+ if(sleep_mode==1)
{
screensaver.orign.val=0
// Go to screensaver page
page screensaver
}
+Timer settings_timer
+ Attributes
+ ID : 41
+ Scope : local
+ Period (ms): 1000
+ Enabled : no
+
+ Events
+ Timer Event
+ page settings
+
+Timer wakeup_timer
+ Attributes
+ ID : 44
+ Scope : local
+ Period (ms): 50
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ if(swipec>swipedx&&api==1)
{
page buttonpage04
}
// Right to Left
swipec2=0-swipedx
- if(swipec100)
+ if(swipec>100&&api==1)
{
page buttonpage02
}
// Down to Up
swipec2=0-swipedy
- if(swipec<-100)
+ if(swipec<-100&&api==1)
{
page buttonpage03
}
diff --git a/nspanel_us_code/keyb_num.txt b/nspanel_us_code/keyb_num.txt
new file mode 100644
index 000000000..6fd22399f
--- /dev/null
+++ b/nspanel_us_code/keyb_num.txt
@@ -0,0 +1,398 @@
+Page keyb_num
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page page_id.val
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"keyb_num\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) page_id
+ Attributes
+ ID : 17
+ Scope: local
+ Value: 0
+
+Variable (string) key
+ Attributes
+ ID : 19
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (string) entity
+ Attributes
+ ID : 20
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) domain
+ Attributes
+ ID : 21
+ Scope : local
+ Text : alarm
+ Max. Text Size: 10
+
+Variable (string) aux
+ Attributes
+ ID : 22
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) value
+ Attributes
+ ID : 23
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Text t0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text pin
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text title
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Alarm
+ Max. Text Size : 10
+
+Button b1
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 1
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b1.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button bclose
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Button b2
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 2
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b2.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b3
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 3
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b3.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b4
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 4
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b4.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b5
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 5
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b5.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b6
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 6
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b6.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b7
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 7
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b7.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b8
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 8
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b8.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b9
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 9
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b9.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button bclear
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : <
+ Max. Text Size : 5
+
+ Events
+ Touch Release Event
+ pin.txt=""
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b0
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 0
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b0.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button benter
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : OK
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ aux.txt="{\"page\": \"keyb_num\", \"key\": \""+key.txt+"\", \"value\": \""+value.txt+"\", \"entity\": \""+entity.txt+"\", \"pin\": \""+pin.txt+"\", \"base_domain\": \""+domain.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints aux.txt,0
+ printh 00
+ printh FF FF FF
+
+Button bview
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : O
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(pin.pw==1)
+ {
+ pin.pw=0
+ }else
+ {
+ pin.pw=1
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 24
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim=156)
+ {
+ ring.val++
+ }
+ if(sys0>=625)
+ {
+ ring.val++
+ }
+ if(sys0>=1406)
+ {
+ ring.val++
+ }
+ if(sys0>=2500)
+ {
+ ring.val++
+ }
+ if(sys0>=3906)
+ {
+ ring.val++
+ }
+ if(sys0>=5625)
+ {
+ ring.val++
+ }
+ if(sys0>=7656)
+ {
+ ring.val++
+ }
+ //
+ // Determine quadrant (0-3). Note: pixel y coords are inverted
+ // compared to mathematical y coords. But we want math. quadrants.
+ sya1*=-1
+ sys2=0
+ if(sya1<0)
+ {
+ sys2+=2
+ }
+ sys0=sya0*sya1
+ if(sys0<0)
+ {
+ sys2+=1
+ // In this case we also want to swap x and y otherwise the
+ // atan(abs(x/y)) (calculated below) gives values running
+ // "the wrong way" (cw instead of ccw).
+ sys1=sya1
+ sya1=sya0
+ sya0=sys1
+ }
+ //
+ field.val=sys2*6
+ //
+ // x,y sign is not required anymore
+ if(sya0<0)
+ {
+ sya0*=-1
+ }
+ if(sya1<0)
+ {
+ sya1*=-1
+ }
+ //
+ // Determine field in ring quadrant
+ // Factor 100000 chosen more or less arbitrarily.
+ // sys0 = 100000 * tan_a = 100000 * y / x
+ sys0=100000*sya1
+ sys0/=sya0
+ // repeat for all fields
+ if(sys0>=26794)
+ {
+ field.val++
+ }
+ if(sys0>=57735)
+ {
+ field.val++
+ }
+ if(sys0>=99999)
+ {
+ field.val++
+ }
+ if(sys0>=173205)
+ {
+ field.val++
+ }
+ if(sys0>=373205)
+ {
+ field.val++
+ }
+ covx r,va1.txt,0,0
+ covx g,va2.txt,0,0
+ covx b,va3.txt,0,0
+ va1.txt=""
+ va2.txt=""
+ va3.txt=""
+
+ Touch Release Event
+ // Adjust field.val "orientation" and offset to match the h value of the colors in the wheel
+ h=23-field.val// 0 <= field.val <= 23
+ // h is expected to be 0-6*256 (see hsv2rgb)
+ h*=6*256
+ h/=24// Number of fields
+ //
+ // s is expected to be 0-256 (see hsv2rgb)
+ s=ring.val*256
+ s/=8// Number of rings
+ // no "value" selectable; fix it to the maximum (matching the colors in the wheels shown.
+ v=255
+ click hsv2rgb,0
+ click rgb888to565,0
+ //colPreview.bco=rgb565.val
+ covx r,va1.txt,0,0
+ covx g,va2.txt,0,0
+ covx b,va3.txt,0,0
+ lightsetting.txt="{\"page\": \"light\", \"component\": \"rgb_color\", \"value\": ["+va1.txt+", "+va2.txt+", "+va3.txt+"]}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+ va1.txt=""
+ va2.txt=""
+ va3.txt=""
+
+Slider lightslider
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ covx lightslider.val,va1.txt,0,0
+ light_value.txt=va1.txt+"%"
+ light_value_2.txt=va1.txt+"%"
+ lightsetting.txt="{\"page\": \"light\", \"key\": \"brightness_pct\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+
+Slider tempslider
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 500
+ Lower range limit: 153
+
+ Events
+ Touch Release Event
+ covx tempslider.val,va1.txt,0,0
+ temp_value.txt=va1.txt
+ temp_value_2.txt=va1.txt
+ lightsetting.txt="{\"page\": \"light\", \"key\": \"color_temp\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 32
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Hotspot hsv2rgb
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ // https://de.wikipedia.org/wiki/HSV-Farbraum#Umrechnung_HSV_in_RGB
+ // The values range from 0..255 instead of 0..1
+ // h ranges from 0..(6*256)
+ if(s>=256)
+ {
+ s=255
+ }else if(s<0)
+ {
+ s=0
+ }
+ if(v>=256)
+ {
+ v=255
+ }else if(v<0)
+ {
+ v=0
+ }
+ f=h&0xff
+ p=256-s
+ p*=v
+ p=p>>8// / 256
+ q=s*f// 0-256*256 = 0-65536
+ q=65536-q
+ q*=v
+ q=q>>16
+ t=256-f
+ t*=s
+ t=65536-t
+ t*=v
+ t=t>>16
+ //
+ f=h>>8
+ if(f==1)
+ {
+ r=q
+ g=v
+ b=p
+ }else if(f==2)
+ {
+ r=p
+ g=v
+ b=t
+ }else if(f==3)
+ {
+ r=p
+ g=q
+ b=v
+ }else if(f==4)
+ {
+ r=t
+ g=p
+ b=v
+ }else if(f==5)
+ {
+ r=v
+ g=p
+ b=q
+ }else
+ {
+ r=v
+ g=t
+ b=p
+ }
+
+Hotspot rgb888to565
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ r=r&0xff
+ g=g&0xff
+ b=b&0xff
+ sys1=r>>3
+ sys2=sys1<<6
+ sys1=g>>2
+ sys2+=sys1
+ sys2=sys2<<5
+ sys1=b>>3
+ sys2+=sys1
+ rgb565.val=sys2
+
+Hotspot light_touch
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis light_b_press,1
+ vis lightslider,1
+ vis light_value,1
+ vis temp_value_2,1
+ // #### OFF Button #####
+ vis temp_b_press,0
+ vis color_b_pres,0
+ // #### OFF Value #####
+ vis temp_value,0
+ vis light_value_2,0
+ // #### OFF Slider #####
+ vis tempslider,0
+ vis colorwheel,0
+
+Hotspot temp_touch
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis temp_b_press,1
+ vis tempslider,1
+ vis temp_value,1
+ vis light_value_2,1
+ // #### OFF Button #####
+ vis light_b_press,0
+ vis color_b_pres,0
+ // #### OFF Value #####
+ vis light_value,0
+ vis temp_value_2,0
+ // #### OFF Slider #####
+ vis lightslider,0
+ vis colorwheel,0
+
+Hotspot color_touch
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis color_b_pres,1
+ vis colorwheel,1
+ vis light_value_2,1
+ // #### OFF Button #####
+ vis light_b_press,0
+ vis temp_b_press,0
+ // #### OFF Value #####
+ vis light_value,0
+ vis temp_value,0
+ vis temp_value_2,0
+ // #### OFF Slider #####
+ vis lightslider,0
+ vis tempslider,0
+ // #### OFF Color #####
+
+Timer swipestore
+ Attributes
+ ID : 21
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 33
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_code/media_player.txt b/nspanel_us_code/media_player.txt
new file mode 100644
index 000000000..c43bf878a
--- /dev/null
+++ b/nspanel_us_code/media_player.txt
@@ -0,0 +1,487 @@
+Page media_player
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) back_page
+ Attributes
+ ID : 3
+ Scope : local
+ Text : home
+ Max. Text Size: 15
+
+Variable (string) lastclick
+ Attributes
+ ID : 20
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) va0
+ Attributes
+ ID : 23
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (int32) is_muted
+ Attributes
+ ID : 24
+ Scope: local
+ Value: 0
+
+Variable (int32) prg_current
+ Attributes
+ ID : 26
+ Scope: local
+ Value: 0
+
+Variable (int32) prg_total
+ Attributes
+ ID : 27
+ Scope: local
+ Value: 0
+
+Text page_label
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Media Player
+ Max. Text Size : 25
+
+Text icon_state
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : î
+ Max. Text Size : 10
+
+Text vol_text
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text bt_vol_down
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(vol_slider.val>0)
+ {
+ vol_slider.val--
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ }
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text bt_vol_up
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(vol_slider.val<100)
+ {
+ vol_slider.val++
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ }
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text bt_mute
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(is_muted.val==1)
+ {
+ va0.txt="true"
+ }else
+ {
+ va0.txt="false"
+ }
+ lastclick.txt="{\"page\": \"media_player\", \"key\": \"volume_mute\", \"value\": \""+va0.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text time_current
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text time_total
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text track
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 50
+
+Text artist
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 50
+
+Text bt_prev
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_previous_track\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_play_pause
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_play_pause\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_stop
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_stop\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_next
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_next_track\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_on_off
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"toggle\"}",0
+ printh 00
+ printh FF FF FF
+
+Progress Bar time_progress
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Value : 0
+
+Slider vol_slider
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 21
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ prg_current.val++
+ time_progress.val=100*prg_current.val/prg_total.val
+ covx prg_current.val,time_current.txt,0,0
+ }
+ // Progress - Total
+ sys0=prg_total.val/3600 //hours
+ sys2=prg_total.val%3600 //remainder
+ sys1=sys2/60 //minutes
+ sys2%=60 //seconds
+ time_total.txt=""
+ if(sys0>0)
+ {
+ covx sys0,time_total.txt,0,0
+ time_total.txt+=":"
+ if(sys1<10)
+ {
+ time_total.txt+="0"
+ }
+ }
+ covx sys1,va0.txt,0,0
+ time_total.txt+=va0.txt+":"
+ if(sys2<10)
+ {
+ time_total.txt+="0"
+ }
+ covx sys2,va0.txt,0,0
+ time_total.txt+=va0.txt
+ // Progress - Current
+ sys0=prg_current.val/3600 //hours
+ sys2=prg_current.val%3600 //remainder
+ sys1=sys2/60 //minutes
+ sys2%=60 //seconds
+ time_current.txt=""
+ if(sys0>0)
+ {
+ covx sys0,time_current.txt,0,0
+ time_current.txt+=":"
+ if(sys1<10)
+ {
+ time_current.txt+="0"
+ }
+ }
+ covx sys1,va0.txt,0,0
+ time_current.txt+=va0.txt+":"
+ if(sys2<10)
+ {
+ time_current.txt+="0"
+ }
+ covx sys2,va0.txt,0,0
+ time_current.txt+=va0.txt
+
diff --git a/nspanel_us_code/notification.txt b/nspanel_us_code/notification.txt
index 8cf3e6b55..99cb4b898 100644
--- a/nspanel_us_code/notification.txt
+++ b/nspanel_us_code/notification.txt
@@ -12,50 +12,53 @@ Page notification
Events
Preinitialize Event
- dim=home.brightness.val
- printh 92
- prints "nspanelevent",0
- printh 00
- prints "{\"page\": \"notification\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
- printh 00
- printh FF FF FF
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"notification\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
Touch Press Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"notification\", \"component\": \"touchevent\", \"value\": \"press\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Touch Release Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"notification\", \"component\": \"touchevent\", \"value\": \"release\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Variable (string) lastclick
Attributes
- ID : 11
+ ID : 6
Scope : local
Text :
Max. Text Size: 100
Text notifi_text01
Attributes
- ID : 2
+ ID : 1
Scope : local
Dragging : 0
Send Component ID : disabled
Associated Keyboard: none
Text :
- Max. Text Size : 100
+ Max. Text Size : 250
Text notifi_label
Attributes
- ID : 3
+ ID : 2
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -65,7 +68,7 @@ Text notifi_label
Text loading
Attributes
- ID : 10
+ ID : 5
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -73,37 +76,29 @@ Text loading
Text :
Max. Text Size : 1
-Picture accept_pic
- Attributes
- ID : 4
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
-Picture clear_pic
+Button button_back
Attributes
- ID : 5
- Scope : local
- Dragging : 0
- Send Component ID: disabled
-
-Hotspot notifi_back
- Attributes
- ID : 1
+ ID : 7
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Press Event
page home
-Hotspot accept
+Button bt_accept
Attributes
- ID : 6
+ ID : 8
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Release Event
@@ -115,12 +110,15 @@ Hotspot accept
printh 00
printh FF FF FF
-Hotspot clear
+Button bt_clear
Attributes
- ID : 7
+ ID : 9
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Release Event
@@ -134,7 +132,7 @@ Hotspot clear
Timer swipestore
Attributes
- ID : 9
+ ID : 4
Scope : local
Period (ms): 50
Enabled : no
@@ -144,9 +142,32 @@ Timer swipestore
swipex=tch0
swipey=tch1
+Timer wakeup_timer
+ Attributes
+ ID : 10
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ dimslider.val--
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 91
+ prints "dimslider",0
+ printh 00
+ prints dimslider.val,0
+ printh FF FF FF
+ }
+
+Text t3
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : î§
+ Max. Text Size : 10
+ Events
+ Touch Release Event
+ if(brightslider.val>0)
+ {
+ brightslider.val--
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
+
Slider brightslider
Attributes
ID : 1
@@ -113,12 +214,27 @@ Slider brightslider
Lower range limit: 0
Events
+ Touch Press Event
+ printh 92
+ prints "touchevent",0
+ printh 00
+ prints "{\"page\": \"settings\", \"component\": \"touchevent\", \"value\": \"press\"}",0
+ printh 00
+ printh FF FF FF
+
Touch Release Event
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
printh 91
prints "brightslider",0
printh 00
prints brightslider.val,0
printh FF FF FF
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
Slider dimslider
Attributes
@@ -131,98 +247,166 @@ Slider dimslider
Lower range limit: 0
Events
+ Touch Press Event
+ printh 92
+ prints "touchevent",0
+ printh 00
+ prints "{\"page\": \"settings\", \"component\": \"touchevent\", \"value\": \"press\"}",0
+ printh 00
+ printh FF FF FF
+
Touch Release Event
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
printh 91
prints "dimslider",0
printh 00
prints dimslider.val,0
printh FF FF FF
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
-Dual-state Button bt0
+Button button_back
Attributes
- ID : 13
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Dual-state Button bt_reboot
+ Attributes
+ ID : 9
Scope : local
Dragging : 0
Send Component ID: on press and release
State : unpressed
- Text :
- Max. Text Size : 0
+ Text : î
+ Max. Text Size : 3
-Dual-state Button bt1
+Dual-state Button bt_sleep
Attributes
- ID : 14
+ ID : 10
Scope : global
Dragging : 0
Send Component ID: on press and release
State : unpressed
- Text :
- Max. Text Size : 0
+ Text : î¨
+ Max. Text Size : 3
-Hotspot setings_back
+Hotspot bt_bright_down
Attributes
- ID : 10
+ ID : 12
Scope : local
Dragging : 0
Send Component ID: disabled
Events
- Touch Press Event
- page home
+ Touch Release Event
+ if(brightslider.val>0)
+ {
+ brightslider.val--
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
-Timer swipestore
+Hotspot bt_bright_up
Attributes
- ID : 11
- Scope : local
- Period (ms): 50
- Enabled : no
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
Events
- Timer Event
- swipex=tch0
- swipey=tch1
+ Touch Release Event
+ if(brightslider.val<100)
+ {
+ brightslider.val++
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
-TouchCap swipe
+Hotspot bt_dim_down
Attributes
- ID : 12
- Scope: local
- Value: 0
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
Events
- Touch Press Event
- swipestore.en=1 // Start swipestore timer
+ Touch Release Event
+ if(dimslider.val>0)
+ {
+ dimslider.val--
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 91
+ prints "dimslider",0
+ printh 00
+ prints dimslider.val,0
+ printh FF FF FF
+ }
+Hotspot bt_dim_up
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
Touch Release Event
- swipestore.en=0
- // Touch has ended, x
- if(tch0==0)
+ if(dimslider.val<100)
{
- swipec=swipex-tch2
- // From Left to Right
- if(swipec>swipedx)
- {
- //page
- }
- // Right to Left
- swipec2=0-swipedx
- if(swipec100)
- {
- //page
- }
- // Down to Up
- swipec2=0-swipedy
- if(swipec<-100)
+ dimdelta=brightness-dim
+ dimdelta/=10
+ if(dimdelta<1)
{
- //page
+ dimdelta=1
}
+ dim+=dimdelta
+ }else
+ {
+ wakeup_timer.en=0
}
diff --git a/nspanel_us_code/weather01.txt b/nspanel_us_code/weather01.txt
index d72d1a841..6e8bb8366 100644
--- a/nspanel_us_code/weather01.txt
+++ b/nspanel_us_code/weather01.txt
@@ -12,27 +12,31 @@ Page weather01
Events
Preinitialize Event
- printh 92
- prints "nspanelevent",0
- printh 00
- prints "{\"page\": \"weather01\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
- printh 00
- printh FF FF FF
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"weather01\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
Touch Press Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"weather01\", \"component\": \"touchevent\", \"value\": \"press\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Touch Release Event
- printh 92
+ printh 91
prints "touchevent",0
printh 00
- prints "{\"page\": \"weather01\", \"component\": \"touchevent\", \"value\": \"release\"}",0
- printh 00
+ prints rand,0
printh FF FF FF
Text day
@@ -117,7 +121,7 @@ Text value03
Text value01_icon
Attributes
- ID : 13
+ ID : 12
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -127,7 +131,7 @@ Text value01_icon
Text value02_icon
Attributes
- ID : 14
+ ID : 13
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -137,7 +141,7 @@ Text value02_icon
Text value03_icon
Attributes
- ID : 15
+ ID : 14
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -147,7 +151,7 @@ Text value03_icon
Text value04_icon
Attributes
- ID : 16
+ ID : 15
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -157,7 +161,7 @@ Text value04_icon
Text value05_icon
Attributes
- ID : 17
+ ID : 16
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -167,7 +171,7 @@ Text value05_icon
Text loading
Attributes
- ID : 18
+ ID : 17
Scope : local
Dragging : 0
Send Component ID : disabled
@@ -175,6 +179,16 @@ Text loading
Text :
Max. Text Size : 1
+Text page_index
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
Picture weather_icon
Attributes
ID : 3
@@ -182,12 +196,15 @@ Picture weather_icon
Dragging : 0
Send Component ID: disabled
-Hotspot weather_back
+Button button_back
Attributes
- ID : 12
+ ID : 18
Scope : local
Dragging : 0
Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
Events
Touch Press Event
@@ -205,6 +222,29 @@ Timer swipestore
swipex=tch0
swipey=tch1
+Timer wakeup_timer
+ Attributes
+ ID : 20
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page home
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/buttonpage02.txt b/nspanel_us_land_code/buttonpage02.txt
new file mode 100644
index 000000000..d23037b8f
--- /dev/null
+++ b/nspanel_us_land_code/buttonpage02.txt
@@ -0,0 +1,821 @@
+Page buttonpage02
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"buttonpage02\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ vis 255,0
+ vis button_back,1
+ vis page_index,1
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) lastclick
+ Attributes
+ ID : 44
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) click_comp
+ Attributes
+ ID : 47
+ Scope : local
+ Text :
+ Max. Text Size: 8
+
+Variable (string) page_name
+ Attributes
+ ID : 49
+ Scope : local
+ Text : buttonpage02
+ Max. Text Size: 12
+
+Variable (int32) button01conf
+ Attributes
+ ID : 50
+ Scope: local
+ Value: 0
+
+Variable (int32) button02conf
+ Attributes
+ ID : 51
+ Scope: local
+ Value: 0
+
+Variable (int32) button03conf
+ Attributes
+ ID : 52
+ Scope: local
+ Value: 0
+
+Variable (int32) button04conf
+ Attributes
+ ID : 53
+ Scope: local
+ Value: 0
+
+Variable (int32) button05conf
+ Attributes
+ ID : 54
+ Scope: local
+ Value: 0
+
+Variable (int32) button06conf
+ Attributes
+ ID : 55
+ Scope: local
+ Value: 0
+
+Variable (int32) button07conf
+ Attributes
+ ID : 56
+ Scope: local
+ Value: 0
+
+Variable (int32) button08conf
+ Attributes
+ ID : 57
+ Scope: local
+ Value: 0
+
+Text button01text
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button01bri
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button02text
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button02bri
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button03text
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button03bri
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button04text
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button04bri
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button05text
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button05bri
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button06text
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button06bri
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button07text
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button07bri
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button08text
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button08bri
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text bpage02_label
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Text button01icon
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button02icon
+ Attributes
+ ID : 29
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button03icon
+ Attributes
+ ID : 30
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button04icon
+ Attributes
+ ID : 31
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button05icon
+ Attributes
+ ID : 32
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button06icon
+ Attributes
+ ID : 33
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button07icon
+ Attributes
+ ID : 34
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button08icon
+ Attributes
+ ID : 35
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 46
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture button01pic
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button02pic
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button03pic
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button04pic
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button05pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button06pic
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button07pic
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button08pic
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 45
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Hotspot button01
+ Attributes
+ ID : 36
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button01"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button01conf.val==1)
+ {
+ confirm.body.txt=button01text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button02
+ Attributes
+ ID : 37
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button02"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button02conf.val==1)
+ {
+ confirm.body.txt=button02text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button03
+ Attributes
+ ID : 38
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button03"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button03conf.val==1)
+ {
+ confirm.body.txt=button03text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button04
+ Attributes
+ ID : 39
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button04"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button04conf.val==1)
+ {
+ confirm.body.txt=button04text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button05
+ Attributes
+ ID : 40
+ Scope : local
+ Dragging : 0
+ Send Component ID: on press
+
+ Events
+ Touch Press Event
+ click_comp.txt="button05"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button05conf.val==1)
+ {
+ confirm.body.txt=button05text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button06
+ Attributes
+ ID : 41
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button06"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button06conf.val==1)
+ {
+ confirm.body.txt=button06text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button07
+ Attributes
+ ID : 42
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button07"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button07conf.val==1)
+ {
+ confirm.body.txt=button07text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button08
+ Attributes
+ ID : 43
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button08"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button08conf.val==1)
+ {
+ confirm.body.txt=button08text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer click_timer
+ Attributes
+ ID : 48
+ Scope : local
+ Period (ms): 800
+ Enabled : no
+
+ Events
+ Timer Event
+ lastclick.txt="{\"page\": \"buttonpage02\", \"event\": \"long_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ click_timer.en=0
+
+Timer wakeup_timer
+ Attributes
+ ID : 58
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page buttonpage01
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ page home
+ }
+ }
+
diff --git a/nspanel_us_land_code/buttonpage03.txt b/nspanel_us_land_code/buttonpage03.txt
new file mode 100644
index 000000000..84f65eb61
--- /dev/null
+++ b/nspanel_us_land_code/buttonpage03.txt
@@ -0,0 +1,821 @@
+Page buttonpage03
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"buttonpage03\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ vis 255,0
+ vis button_back,1
+ vis page_index,1
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) lastclick
+ Attributes
+ ID : 44
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) click_comp
+ Attributes
+ ID : 47
+ Scope : local
+ Text :
+ Max. Text Size: 8
+
+Variable (string) page_name
+ Attributes
+ ID : 49
+ Scope : local
+ Text : buttonpage03
+ Max. Text Size: 12
+
+Variable (int32) button01conf
+ Attributes
+ ID : 50
+ Scope: local
+ Value: 0
+
+Variable (int32) button02conf
+ Attributes
+ ID : 51
+ Scope: local
+ Value: 0
+
+Variable (int32) button03conf
+ Attributes
+ ID : 52
+ Scope: local
+ Value: 0
+
+Variable (int32) button04conf
+ Attributes
+ ID : 53
+ Scope: local
+ Value: 0
+
+Variable (int32) button05conf
+ Attributes
+ ID : 54
+ Scope: local
+ Value: 0
+
+Variable (int32) button06conf
+ Attributes
+ ID : 55
+ Scope: local
+ Value: 0
+
+Variable (int32) button07conf
+ Attributes
+ ID : 56
+ Scope: local
+ Value: 0
+
+Variable (int32) button08conf
+ Attributes
+ ID : 57
+ Scope: local
+ Value: 0
+
+Text button01text
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button01bri
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button02text
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button02bri
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button03text
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button03bri
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button04text
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button04bri
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button05text
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button05bri
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button06text
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button06bri
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button07text
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button07bri
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button08text
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button08bri
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text bpage03_label
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Text button01icon
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button02icon
+ Attributes
+ ID : 29
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button03icon
+ Attributes
+ ID : 30
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button04icon
+ Attributes
+ ID : 31
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button05icon
+ Attributes
+ ID : 32
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button06icon
+ Attributes
+ ID : 33
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button07icon
+ Attributes
+ ID : 34
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button08icon
+ Attributes
+ ID : 35
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 46
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture button01pic
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button02pic
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button03pic
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button04pic
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button05pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button06pic
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button07pic
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button08pic
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 45
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Hotspot button01
+ Attributes
+ ID : 36
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button01"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button01conf.val==1)
+ {
+ confirm.body.txt=button01text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button02
+ Attributes
+ ID : 37
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button02"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button02conf.val==1)
+ {
+ confirm.body.txt=button02text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button03
+ Attributes
+ ID : 38
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button03"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button03conf.val==1)
+ {
+ confirm.body.txt=button03text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button04
+ Attributes
+ ID : 39
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button04"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button04conf.val==1)
+ {
+ confirm.body.txt=button04text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button05
+ Attributes
+ ID : 40
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button05"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button05conf.val==1)
+ {
+ confirm.body.txt=button05text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button06
+ Attributes
+ ID : 41
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button06"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button06conf.val==1)
+ {
+ confirm.body.txt=button06text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button07
+ Attributes
+ ID : 42
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button07"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button07conf.val==1)
+ {
+ confirm.body.txt=button07text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button08
+ Attributes
+ ID : 43
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button08"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button08conf.val==1)
+ {
+ confirm.body.txt=button08text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer click_timer
+ Attributes
+ ID : 48
+ Scope : local
+ Period (ms): 800
+ Enabled : no
+
+ Events
+ Timer Event
+ lastclick.txt="{\"page\": \"buttonpage03\", \"event\": \"long_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ click_timer.en=0
+
+Timer wakeup_timer
+ Attributes
+ ID : 58
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page buttonpage02
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ page home
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/buttonpage04.txt b/nspanel_us_land_code/buttonpage04.txt
new file mode 100644
index 000000000..138400ac4
--- /dev/null
+++ b/nspanel_us_land_code/buttonpage04.txt
@@ -0,0 +1,821 @@
+Page buttonpage04
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"buttonpage04\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ vis 255,0
+ vis button_back,1
+ vis page_index,1
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) lastclick
+ Attributes
+ ID : 44
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) click_comp
+ Attributes
+ ID : 47
+ Scope : local
+ Text :
+ Max. Text Size: 8
+
+Variable (string) page_name
+ Attributes
+ ID : 49
+ Scope : local
+ Text : buttonpage04
+ Max. Text Size: 12
+
+Variable (int32) button01conf
+ Attributes
+ ID : 50
+ Scope: local
+ Value: 0
+
+Variable (int32) button02conf
+ Attributes
+ ID : 51
+ Scope: local
+ Value: 0
+
+Variable (int32) button03conf
+ Attributes
+ ID : 52
+ Scope: local
+ Value: 0
+
+Variable (int32) button04conf
+ Attributes
+ ID : 53
+ Scope: local
+ Value: 0
+
+Variable (int32) button05conf
+ Attributes
+ ID : 54
+ Scope: local
+ Value: 0
+
+Variable (int32) button06conf
+ Attributes
+ ID : 55
+ Scope: local
+ Value: 0
+
+Variable (int32) button07conf
+ Attributes
+ ID : 56
+ Scope: local
+ Value: 0
+
+Variable (int32) button08conf
+ Attributes
+ ID : 57
+ Scope: local
+ Value: 0
+
+Text button01text
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button01bri
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button02text
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button02bri
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button03text
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button03bri
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button04text
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button04bri
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button05text
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button05bri
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button06text
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button06bri
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button07text
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button07bri
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text button08text
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 22
+
+Text button08bri
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 4
+
+Text bpage04_label
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Text button01icon
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button02icon
+ Attributes
+ ID : 29
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button03icon
+ Attributes
+ ID : 30
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button04icon
+ Attributes
+ ID : 31
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button05icon
+ Attributes
+ ID : 32
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button06icon
+ Attributes
+ ID : 33
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button07icon
+ Attributes
+ ID : 34
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button08icon
+ Attributes
+ ID : 35
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 46
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture button01pic
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button02pic
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button03pic
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button04pic
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button05pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button06pic
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button07pic
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Picture button08pic
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 45
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Hotspot button01
+ Attributes
+ ID : 36
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button01"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button01conf.val==1)
+ {
+ confirm.body.txt=button01text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button02
+ Attributes
+ ID : 37
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button02"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button02conf.val==1)
+ {
+ confirm.body.txt=button02text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button03
+ Attributes
+ ID : 38
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button03"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button03conf.val==1)
+ {
+ confirm.body.txt=button03text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button04
+ Attributes
+ ID : 39
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button04"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button04conf.val==1)
+ {
+ confirm.body.txt=button04text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button05
+ Attributes
+ ID : 40
+ Scope : local
+ Dragging : 0
+ Send Component ID: on press
+
+ Events
+ Touch Press Event
+ click_comp.txt="button05"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button05conf.val==1)
+ {
+ confirm.body.txt=button05text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button06
+ Attributes
+ ID : 41
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button06"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button06conf.val==1)
+ {
+ confirm.body.txt=button06text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button07
+ Attributes
+ ID : 42
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button07"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button07conf.val==1)
+ {
+ confirm.body.txt=button07text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Hotspot button08
+ Attributes
+ ID : 43
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ click_comp.txt="button08"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ if(button08conf.val==1)
+ {
+ confirm.body.txt=button08text.txt
+ confirm.page_id.val=dp
+ confirm.page_name.txt=page_name.txt
+ confirm.component.txt=click_comp.txt
+ page confirm
+ }else
+ {
+ lastclick.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+ }
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer click_timer
+ Attributes
+ ID : 48
+ Scope : local
+ Period (ms): 800
+ Enabled : no
+
+ Events
+ Timer Event
+ lastclick.txt="{\"page\": \"buttonpage04\", \"event\": \"long_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ click_timer.en=0
+
+Timer wakeup_timer
+ Attributes
+ ID : 58
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page buttonpage03
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/climate.txt b/nspanel_us_land_code/climate.txt
new file mode 100644
index 000000000..62920875a
--- /dev/null
+++ b/nspanel_us_land_code/climate.txt
@@ -0,0 +1,763 @@
+Page climate
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==1||embedded.val==1)
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"climate\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ vis target_icon,0
+ vis target_temp,0
+ vis current_temp,0
+ vis current_icon,0
+ vis climateslider,0
+ vis button01,0
+ vis button02,0
+ vis button03,0
+ vis button04,0
+ vis button05,0
+ vis button06,0
+ vis button07,0
+ }else
+ {
+ page home
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Page Exit Event
+ if(timer01.en==1)
+ {
+ timer01.en=0
+ covx temp_number.val,va1.txt,0,0
+ climatesetting.txt="{\"page\": \"climate\", \"component\": \"climate_position\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints climatesetting.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Variable (string) va1
+ Attributes
+ ID : 25
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (string) climatesetting
+ Attributes
+ ID : 26
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) lastclick
+ Attributes
+ ID : 34
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (int32) temp_offset
+ Attributes
+ ID : 36
+ Scope: local
+ Value: 0
+
+Variable (int32) temp_step
+ Attributes
+ ID : 37
+ Scope: local
+ Value: 0
+
+Variable (int32) temp_number
+ Attributes
+ ID : 43
+ Scope: local
+ Value: 0
+
+Variable (int32) va0
+ Attributes
+ ID : 44
+ Scope: local
+ Value: 0
+
+Variable (string) back_page
+ Attributes
+ ID : 45
+ Scope : local
+ Text : home
+ Max. Text Size: 15
+
+Variable (int32) embedded
+ Attributes
+ ID : 46
+ Scope: local
+ Value: 0
+
+Variable (string) va2
+ Attributes
+ ID : 47
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (string) click_comp
+ Attributes
+ ID : 49
+ Scope : local
+ Text :
+ Max. Text Size: 8
+
+Text current_temp
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_label
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 100
+
+Text current_icon
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text target_icon
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value01_icon
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value01
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 6
+
+Text value02_icon
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 6
+
+Text value03_icon
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 6
+
+Text value04_icon
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 6
+
+Text button01_icon
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button02_icon
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button03_icon
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button04_icon
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button05_icon
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button06_icon
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button07_icon
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button08_icon
+ Attributes
+ ID : 38
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button09_icon
+ Attributes
+ ID : 40
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text target_temp
+ Attributes
+ ID : 42
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Slider climateslider
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 20
+ Upper range limit: 40
+ Lower range limit: 0
+
+ Events
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ temp_number.val=climateslider.val*temp_step.val
+ temp_number.val+=temp_offset.val
+ va0.val=temp_number.val/10
+ covx va0.val,target_temp.txt,0,0
+ va0.val=temp_number.val%10
+ covx va0.val,va1.txt,0,0
+ target_temp.txt+="."+va1.txt
+ timer01.en=1
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 48
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Hotspot decrease_temp
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ if(climateslider.val>0)
+ {
+ climateslider.val--
+ temp_number.val=climateslider.val*temp_step.val
+ temp_number.val+=temp_offset.val
+ va0.val=temp_number.val/10
+ covx va0.val,target_temp.txt,0,0
+ va0.val=temp_number.val%10
+ covx va0.val,va1.txt,0,0
+ target_temp.txt+="."+va1.txt
+ }
+
+ Touch Release Event
+ timer01.en=1
+
+Hotspot increase_temp
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ if(climateslider.valswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/confirm.txt b/nspanel_us_land_code/confirm.txt
new file mode 100644
index 000000000..a6a1dcd13
--- /dev/null
+++ b/nspanel_us_land_code/confirm.txt
@@ -0,0 +1,170 @@
+Page confirm
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"confirm\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) page_id
+ Attributes
+ ID : 3
+ Scope: global
+ Value: 0
+
+Variable (string) aux
+ Attributes
+ ID : 5
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) page_name
+ Attributes
+ ID : 9
+ Scope : global
+ Text :
+ Max. Text Size: 12
+
+Variable (string) component
+ Attributes
+ ID : 10
+ Scope : global
+ Text :
+ Max. Text Size: 10
+
+Text t0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text title
+ Attributes
+ ID : 4
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Please confirm
+ Max. Text Size : 30
+
+Text body
+ Attributes
+ ID : 8
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Please confirm
+ Max. Text Size : 22
+
+Button bclose
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Button bt_accept
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ aux.txt="{\"page\": \""+page_name.txt+"\", \"event\": \"short_click\", \"component\": \""+component.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints aux.txt,0
+ printh 00
+ printh FF FF FF
+ page page_id.val
+
+Button bt_clear
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Timer wakeup_timer
+ Attributes
+ ID : 11
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page entitypage04
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ page entitypage03
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ page entitypage04
+ }
+ }
+
diff --git a/nspanel_us_land_code/entitypage02.txt b/nspanel_us_land_code/entitypage02.txt
new file mode 100644
index 000000000..ead4a4272
--- /dev/null
+++ b/nspanel_us_land_code/entitypage02.txt
@@ -0,0 +1,396 @@
+Page entitypage02
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ dim=brightness
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"entitypage02\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text value01_label
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value05_label
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value04_label
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value02_label
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value03_label
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text entity02_label
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Text value06_label
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value07_label
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value08_label
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value01_pic
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value02_pic
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value03_pic
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value04_pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value05_pic
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value06_pic
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value07_pic
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value08_pic
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value01
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value06
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value07
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value08
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 29
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Button button_back
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 30
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page entitypage01
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/entitypage03.txt b/nspanel_us_land_code/entitypage03.txt
new file mode 100644
index 000000000..3657f110e
--- /dev/null
+++ b/nspanel_us_land_code/entitypage03.txt
@@ -0,0 +1,395 @@
+Page entitypage03
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"entitypage03\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text value01_label
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value05_label
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value04_label
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value02_label
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value03_label
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text entity03_label
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Text value06_label
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value07_label
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value08_label
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value01_pic
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value02_pic
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value03_pic
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value04_pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value05_pic
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value06_pic
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value07_pic
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value08_pic
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value01
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value06
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value07
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value08
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Button button_back
+ Attributes
+ ID : 29
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 30
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page entitypage02
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ page entitypage01
+ }
+ }
+
diff --git a/nspanel_us_land_code/entitypage04.txt b/nspanel_us_land_code/entitypage04.txt
new file mode 100644
index 000000000..1efbf72f9
--- /dev/null
+++ b/nspanel_us_land_code/entitypage04.txt
@@ -0,0 +1,395 @@
+Page entitypage04
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"entitypage04\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text value01_label
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value05_label
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value04_label
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value02_label
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value03_label
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text entity04_label
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Text value06_label
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value07_label
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value08_label
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text value01_pic
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value02_pic
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value03_pic
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value04_pic
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value05_pic
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value06_pic
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value07_pic
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value08_pic
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text value01
+ Attributes
+ ID : 20
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02
+ Attributes
+ ID : 21
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03
+ Attributes
+ ID : 22
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04
+ Attributes
+ ID : 23
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05
+ Attributes
+ ID : 24
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value06
+ Attributes
+ ID : 25
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value07
+ Attributes
+ ID : 26
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value08
+ Attributes
+ ID : 27
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 29
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Button button_back
+ Attributes
+ ID : 28
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 30
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page entitypage03
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ page entitypage01
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/fan.txt b/nspanel_us_land_code/fan.txt
new file mode 100644
index 000000000..36734ab9c
--- /dev/null
+++ b/nspanel_us_land_code/fan.txt
@@ -0,0 +1,423 @@
+Page fan
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"fan\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) fansetting
+ Attributes
+ ID : 7
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) back_page
+ Attributes
+ ID : 8
+ Scope : local
+ Text : home
+ Max. Text Size: 15
+
+Variable (string) va0
+ Attributes
+ ID : 9
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Text fan_value
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_label
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text icon_state
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Slider fanslider
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 4
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.val=5)
+ {
+ fanslider.val++
+ }
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ fanslider.val--
+ sys0=100*fanslider.val/fanslider.maxval
+ covx sys0,va0.txt,0,0
+ fan_value.txt=va0.txt+"%"
+ }
+ if(fanslider.val>fanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valfanslider.minval)
+ {
+ button_off.pco=59164
+ button_down.pco=59164
+ }else
+ {
+ button_off.pco=10597
+ button_down.pco=10597
+ }
+ if(fanslider.valswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/home.txt b/nspanel_us_land_code/home.txt
new file mode 100644
index 000000000..5c4523998
--- /dev/null
+++ b/nspanel_us_land_code/home.txt
@@ -0,0 +1,707 @@
+Page home
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ dimtimer.en=1
+ sleeptimer.en=1
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"home\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ vis bt_notific,is_notification
+ vis bt_qrcode,is_qrcode
+ vis bt_entities,is_entities
+ vis bt_alarm,is_alarm
+ if(display_mode==3)
+ {
+ vis left_bt_text,0
+ vis right_bt_text,0
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) disdim
+ Attributes
+ ID : 2
+ Scope: global
+ Value: 0
+
+Variable (string) lastclick
+ Attributes
+ ID : 39
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) climate_entity
+ Attributes
+ ID : 40
+ Scope : global
+ Text :
+ Max. Text Size: 100
+
+Variable (string) click_comp
+ Attributes
+ ID : 48
+ Scope : local
+ Text :
+ Max. Text Size: 8
+
+Text time
+ Attributes
+ ID : 5
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text current_temp
+ Attributes
+ ID : 6
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 8
+
+Text outdoor_temp
+ Attributes
+ ID : 7
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 8
+
+Text date
+ Attributes
+ ID : 8
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text value01_state
+ Attributes
+ ID : 10
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text left_bt_text
+ Attributes
+ ID : 14
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text right_bt_text
+ Attributes
+ ID : 15
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text icon_top_01
+ Attributes
+ ID : 16
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_02
+ Attributes
+ ID : 17
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_03
+ Attributes
+ ID : 18
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_04
+ Attributes
+ ID : 19
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_05
+ Attributes
+ ID : 20
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_06
+ Attributes
+ ID : 21
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_07
+ Attributes
+ ID : 22
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_08
+ Attributes
+ ID : 23
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_09
+ Attributes
+ ID : 24
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text icon_top_10
+ Attributes
+ ID : 25
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text value01_icon
+ Attributes
+ ID : 26
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text value03_state
+ Attributes
+ ID : 27
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03_icon
+ Attributes
+ ID : 28
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text value02_icon
+ Attributes
+ ID : 29
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text value02_state
+ Attributes
+ ID : 30
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text wifi_icon
+ Attributes
+ ID : 31
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text indoortempicon
+ Attributes
+ ID : 32
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+Text bt_notific
+ Attributes
+ ID : 33
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page notification
+ }
+
+Text bt_qrcode
+ Attributes
+ ID : 34
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ page qrcode
+
+Text bt_entities
+ Attributes
+ ID : 35
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page entitypage01
+ }
+
+Text bt_alarm
+ Attributes
+ ID : 36
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(api==1)
+ {
+ page alarm
+ }
+
+Text meridiem
+ Attributes
+ ID : 38
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text button01
+ Attributes
+ ID : 45
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ click_comp.txt="button01"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Text button02
+ Attributes
+ ID : 46
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ click_comp.txt="button02"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Text button03
+ Attributes
+ ID : 47
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ click_comp.txt="button03"
+ click_timer.en=1
+
+ Touch Release Event
+ if(click_timer.en==1)
+ {
+ click_timer.en=0
+ lastclick.txt="{\"page\": \"home\", \"event\": \"short_click\", \"component\": \""+click_comp.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }
+
+Picture weather
+ Attributes
+ ID : 9
+ Scope : global
+ Dragging : 0
+ Send Component ID: disabled
+
+Dual-state Button left_bt_pic
+ Attributes
+ ID : 42
+ Scope : global
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text :
+ Max. Text Size : 0
+
+Dual-state Button right_bt_pic
+ Attributes
+ ID : 43
+ Scope : global
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text :
+ Max. Text Size : 0
+
+Hotspot fc_weather
+ Attributes
+ ID : 11
+ Scope : global
+ Dragging : 0
+ Send Component ID: on press and release
+
+ Events
+ Touch Press Event
+ if(api==1)
+ {
+ page weather01
+ }
+
+Hotspot jump_climate
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: on press and release
+
+ Events
+ Touch Press Event
+ if(climate_entity.txt=="")
+ {
+ lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"press\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }else
+ {
+ page climate
+ }
+
+ Touch Release Event
+ if(climate_entity.txt=="")
+ {
+ lastclick.txt="{\"page\": \"home\", \"component\": \"climate\", \"value\": \"release\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+ }else
+ {
+ page climate
+ }
+
+Hotspot settings_click
+ Attributes
+ ID : 37
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ settings_timer.en=1
+
+ Touch Release Event
+ settings_timer.en=0
+
+Timer dimtimer
+ Attributes
+ ID : 1
+ Scope : global
+ Period (ms): 50000
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(disdim.val==0)
+ {
+ dims=brightness_dim // Dim down screen to val set from HA
+ }
+
+Timer swipestore
+ Attributes
+ ID : 4
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer sleeptimer
+ Attributes
+ ID : 13
+ Scope : local
+ Period (ms): 65000
+ Enabled : no
+
+ Events
+ Timer Event
+ if(sleep_mode==1)
+ {
+ screensaver.orign.val=0
+ // Go to screensaver page
+ page screensaver
+ }
+
+Timer settings_timer
+ Attributes
+ ID : 41
+ Scope : local
+ Period (ms): 1000
+ Enabled : no
+
+ Events
+ Timer Event
+ page settings
+
+Timer wakeup_timer
+ Attributes
+ ID : 44
+ Scope : local
+ Period (ms): 50
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx&&api==1)
+ {
+ page buttonpage04
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100&&api==1)
+ {
+ page buttonpage02
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100&&api==1)
+ {
+ page buttonpage03
+ }
+ }
+
diff --git a/nspanel_us_land_code/instructions.md b/nspanel_us_land_code/instructions.md
new file mode 100644
index 000000000..932d01773
--- /dev/null
+++ b/nspanel_us_land_code/instructions.md
@@ -0,0 +1,9 @@
+# Creating `nspanel_us_land.HMI` from `nspanel_eu.HMI`:
+
+## Program.s:
+Change to `display_mode=3`
+
+## Page `home`:
+1. Change left_bt_pic (x,y,w,h) from ( 47,307,120,3) to (467,173,3,120)
+2. Change right_bt_pic(x,y,w,h) from (288,307,120,3) to (467, 27,3,120)
+3. Rotate pictures 30 & 31 by 90degrees - You will find the rotated pics under pics folder where this instruction file is.
diff --git a/nspanel_us_land_code/keyb_num.txt b/nspanel_us_land_code/keyb_num.txt
new file mode 100644
index 000000000..b9bf1902a
--- /dev/null
+++ b/nspanel_us_land_code/keyb_num.txt
@@ -0,0 +1,398 @@
+Page keyb_num
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page page_id.val
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"keyb_num\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (int32) page_id
+ Attributes
+ ID : 17
+ Scope: local
+ Value: 0
+
+Variable (string) key
+ Attributes
+ ID : 19
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (string) entity
+ Attributes
+ ID : 20
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Variable (string) domain
+ Attributes
+ ID : 21
+ Scope : local
+ Text : alarm
+ Max. Text Size: 10
+
+Variable (string) aux
+ Attributes
+ ID : 22
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) value
+ Attributes
+ ID : 23
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Text t0
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text pin
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text title
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Alarm
+ Max. Text Size : 10
+
+Button b1
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 1
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b1.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button bclose
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ page page_id.val
+
+Button b2
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 2
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b2.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b3
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 3
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b3.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b4
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 4
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b4.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b5
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 5
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b5.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b6
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 6
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b6.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b7
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 7
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b7.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b8
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 8
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b8.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b9
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 9
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b9.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button bclear
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : <
+ Max. Text Size : 5
+
+ Events
+ Touch Release Event
+ pin.txt=""
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button b0
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : 0
+ Max. Text Size : 1
+
+ Events
+ Touch Release Event
+ pin.txt+=b0.txt
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button benter
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : OK
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ aux.txt="{\"page\": \"keyb_num\", \"key\": \""+key.txt+"\", \"value\": \""+value.txt+"\", \"entity\": \""+entity.txt+"\", \"pin\": \""+pin.txt+"\", \"base_domain\": \""+domain.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints aux.txt,0
+ printh 00
+ printh FF FF FF
+
+Button bview
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : O
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(pin.pw==1)
+ {
+ pin.pw=0
+ }else
+ {
+ pin.pw=1
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 24
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim=156)
+ {
+ ring.val++
+ }
+ if(sys0>=625)
+ {
+ ring.val++
+ }
+ if(sys0>=1406)
+ {
+ ring.val++
+ }
+ if(sys0>=2500)
+ {
+ ring.val++
+ }
+ if(sys0>=3906)
+ {
+ ring.val++
+ }
+ if(sys0>=5625)
+ {
+ ring.val++
+ }
+ if(sys0>=7656)
+ {
+ ring.val++
+ }
+ //
+ // Determine quadrant (0-3). Note: pixel y coords are inverted
+ // compared to mathematical y coords. But we want math. quadrants.
+ sya1*=-1
+ sys2=0
+ if(sya1<0)
+ {
+ sys2+=2
+ }
+ sys0=sya0*sya1
+ if(sys0<0)
+ {
+ sys2+=1
+ // In this case we also want to swap x and y otherwise the
+ // atan(abs(x/y)) (calculated below) gives values running
+ // "the wrong way" (cw instead of ccw).
+ sys1=sya1
+ sya1=sya0
+ sya0=sys1
+ }
+ //
+ field.val=sys2*6
+ //
+ // x,y sign is not required anymore
+ if(sya0<0)
+ {
+ sya0*=-1
+ }
+ if(sya1<0)
+ {
+ sya1*=-1
+ }
+ //
+ // Determine field in ring quadrant
+ // Factor 100000 chosen more or less arbitrarily.
+ // sys0 = 100000 * tan_a = 100000 * y / x
+ sys0=100000*sya1
+ sys0/=sya0
+ // repeat for all fields
+ if(sys0>=26794)
+ {
+ field.val++
+ }
+ if(sys0>=57735)
+ {
+ field.val++
+ }
+ if(sys0>=99999)
+ {
+ field.val++
+ }
+ if(sys0>=173205)
+ {
+ field.val++
+ }
+ if(sys0>=373205)
+ {
+ field.val++
+ }
+ covx r,va1.txt,0,0
+ covx g,va2.txt,0,0
+ covx b,va3.txt,0,0
+ va1.txt=""
+ va2.txt=""
+ va3.txt=""
+
+ Touch Release Event
+ // Adjust field.val "orientation" and offset to match the h value of the colors in the wheel
+ h=23-field.val// 0 <= field.val <= 23
+ // h is expected to be 0-6*256 (see hsv2rgb)
+ h*=6*256
+ h/=24// Number of fields
+ //
+ // s is expected to be 0-256 (see hsv2rgb)
+ s=ring.val*256
+ s/=8// Number of rings
+ // no "value" selectable; fix it to the maximum (matching the colors in the wheels shown.
+ v=255
+ click hsv2rgb,0
+ click rgb888to565,0
+ //colPreview.bco=rgb565.val
+ covx r,va1.txt,0,0
+ covx g,va2.txt,0,0
+ covx b,va3.txt,0,0
+ lightsetting.txt="{\"page\": \"light\", \"component\": \"rgb_color\", \"value\": ["+va1.txt+", "+va2.txt+", "+va3.txt+"]}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+ va1.txt=""
+ va2.txt=""
+ va3.txt=""
+
+Slider lightslider
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ covx lightslider.val,va1.txt,0,0
+ light_value.txt=va1.txt+"%"
+ light_value_2.txt=va1.txt+"%"
+ lightsetting.txt="{\"page\": \"light\", \"key\": \"brightness_pct\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+
+Slider tempslider
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 500
+ Lower range limit: 153
+
+ Events
+ Touch Release Event
+ covx tempslider.val,va1.txt,0,0
+ temp_value.txt=va1.txt
+ temp_value_2.txt=va1.txt
+ lightsetting.txt="{\"page\": \"light\", \"key\": \"color_temp\", \"value\": "+va1.txt+"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lightsetting.txt,0
+ printh 00
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 32
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Hotspot hsv2rgb
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ // https://de.wikipedia.org/wiki/HSV-Farbraum#Umrechnung_HSV_in_RGB
+ // The values range from 0..255 instead of 0..1
+ // h ranges from 0..(6*256)
+ if(s>=256)
+ {
+ s=255
+ }else if(s<0)
+ {
+ s=0
+ }
+ if(v>=256)
+ {
+ v=255
+ }else if(v<0)
+ {
+ v=0
+ }
+ f=h&0xff
+ p=256-s
+ p*=v
+ p=p>>8// / 256
+ q=s*f// 0-256*256 = 0-65536
+ q=65536-q
+ q*=v
+ q=q>>16
+ t=256-f
+ t*=s
+ t=65536-t
+ t*=v
+ t=t>>16
+ //
+ f=h>>8
+ if(f==1)
+ {
+ r=q
+ g=v
+ b=p
+ }else if(f==2)
+ {
+ r=p
+ g=v
+ b=t
+ }else if(f==3)
+ {
+ r=p
+ g=q
+ b=v
+ }else if(f==4)
+ {
+ r=t
+ g=p
+ b=v
+ }else if(f==5)
+ {
+ r=v
+ g=p
+ b=q
+ }else
+ {
+ r=v
+ g=t
+ b=p
+ }
+
+Hotspot rgb888to565
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ r=r&0xff
+ g=g&0xff
+ b=b&0xff
+ sys1=r>>3
+ sys2=sys1<<6
+ sys1=g>>2
+ sys2+=sys1
+ sys2=sys2<<5
+ sys1=b>>3
+ sys2+=sys1
+ rgb565.val=sys2
+
+Hotspot light_touch
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis light_b_press,1
+ vis lightslider,1
+ vis light_value,1
+ vis temp_value_2,1
+ // #### OFF Button #####
+ vis temp_b_press,0
+ vis color_b_pres,0
+ // #### OFF Value #####
+ vis temp_value,0
+ vis light_value_2,0
+ // #### OFF Slider #####
+ vis tempslider,0
+ vis colorwheel,0
+
+Hotspot temp_touch
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis temp_b_press,1
+ vis tempslider,1
+ vis temp_value,1
+ vis light_value_2,1
+ // #### OFF Button #####
+ vis light_b_press,0
+ vis color_b_pres,0
+ // #### OFF Value #####
+ vis light_value,0
+ vis temp_value_2,0
+ // #### OFF Slider #####
+ vis lightslider,0
+ vis colorwheel,0
+
+Hotspot color_touch
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Press Event
+ vis color_b_pres,1
+ vis colorwheel,1
+ vis light_value_2,1
+ // #### OFF Button #####
+ vis light_b_press,0
+ vis temp_b_press,0
+ // #### OFF Value #####
+ vis light_value,0
+ vis temp_value,0
+ vis temp_value_2,0
+ // #### OFF Slider #####
+ vis lightslider,0
+ vis tempslider,0
+ // #### OFF Color #####
+
+Timer swipestore
+ Attributes
+ ID : 21
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 33
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/media_player.txt b/nspanel_us_land_code/media_player.txt
new file mode 100644
index 000000000..f731dac2f
--- /dev/null
+++ b/nspanel_us_land_code/media_player.txt
@@ -0,0 +1,488 @@
+Page media_player
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) back_page
+ Attributes
+ ID : 3
+ Scope : local
+ Text : home
+ Max. Text Size: 15
+
+Variable (string) lastclick
+ Attributes
+ ID : 20
+ Scope : local
+ Text :
+ Max. Text Size: 255
+
+Variable (string) va0
+ Attributes
+ ID : 23
+ Scope : local
+ Text :
+ Max. Text Size: 10
+
+Variable (int32) is_muted
+ Attributes
+ ID : 24
+ Scope: local
+ Value: 0
+
+Variable (int32) prg_current
+ Attributes
+ ID : 26
+ Scope: local
+ Value: 0
+
+Variable (int32) prg_total
+ Attributes
+ ID : 27
+ Scope: local
+ Value: 0
+
+Text page_label
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Media Player
+ Max. Text Size : 25
+
+Text icon_state
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : î
+ Max. Text Size : 10
+
+Text vol_text
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 5
+
+Text bt_vol_down
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(vol_slider.val>0)
+ {
+ vol_slider.val--
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ }
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text bt_vol_up
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(vol_slider.val<100)
+ {
+ vol_slider.val++
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ }
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text bt_mute
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ if(is_muted.val==1)
+ {
+ va0.txt="true"
+ }else
+ {
+ va0.txt="false"
+ }
+ lastclick.txt="{\"page\": \"media_player\", \"key\": \"volume_mute\", \"value\": \""+va0.txt+"\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Text time_current
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text time_total
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text track
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 50
+
+Text artist
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 50
+
+Text bt_prev
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ lastclick.txt="{\"page\": \"media_player\", \"key\": \"media_previous_track\"}"
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_previous_track\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_play_pause
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_play_pause\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_stop
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_stop\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_next
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"media_next_track\"}",0
+ printh 00
+ printh FF FF FF
+
+Text bt_on_off
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ printh 92
+ prints "localevent",0
+ printh 00
+ prints "{\"page\": \"media_player\", \"key\": \"toggle\"}",0
+ printh 00
+ printh FF FF FF
+
+Progress Bar time_progress
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Value : 0
+
+Slider vol_slider
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ Position : 0
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Release Event
+ covx vol_slider.val,va0.txt,0,0
+ vol_text.txt=va0.txt+"%"
+ timer0.en=1
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ if(back_page.txt=="buttonpage01")
+ {
+ page buttonpage01
+ }else if(back_page.txt=="buttonpage02")
+ {
+ page buttonpage02
+ }else if(back_page.txt=="buttonpage03")
+ {
+ page buttonpage03
+ }else if(back_page.txt=="buttonpage04")
+ {
+ page buttonpage04
+ }else
+ {
+ page home
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 21
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dim0)
+ {
+ prg_current.val++
+ time_progress.val=100*prg_current.val/prg_total.val
+ covx prg_current.val,time_current.txt,0,0
+ }
+ // Progress - Total
+ sys0=prg_total.val/3600 //hours
+ sys2=prg_total.val%3600 //remainder
+ sys1=sys2/60 //minutes
+ sys2%=60 //seconds
+ time_total.txt=""
+ if(sys0>0)
+ {
+ covx sys0,time_total.txt,0,0
+ time_total.txt+=":"
+ if(sys1<10)
+ {
+ time_total.txt+="0"
+ }
+ }
+ covx sys1,va0.txt,0,0
+ time_total.txt+=va0.txt+":"
+ if(sys2<10)
+ {
+ time_total.txt+="0"
+ }
+ covx sys2,va0.txt,0,0
+ time_total.txt+=va0.txt
+ // Progress - Current
+ sys0=prg_current.val/3600 //hours
+ sys2=prg_current.val%3600 //remainder
+ sys1=sys2/60 //minutes
+ sys2%=60 //seconds
+ time_current.txt=""
+ if(sys0>0)
+ {
+ covx sys0,time_current.txt,0,0
+ time_current.txt+=":"
+ if(sys1<10)
+ {
+ time_current.txt+="0"
+ }
+ }
+ covx sys1,va0.txt,0,0
+ time_current.txt+=va0.txt+":"
+ if(sys2<10)
+ {
+ time_current.txt+="0"
+ }
+ covx sys2,va0.txt,0,0
+ time_current.txt+=va0.txt
+
diff --git a/nspanel_us_land_code/notification.txt b/nspanel_us_land_code/notification.txt
new file mode 100644
index 000000000..341bf5352
--- /dev/null
+++ b/nspanel_us_land_code/notification.txt
@@ -0,0 +1,202 @@
+Page notification
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"notification\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Variable (string) lastclick
+ Attributes
+ ID : 5
+ Scope : local
+ Text :
+ Max. Text Size: 100
+
+Text notifi_text01
+ Attributes
+ ID : 1
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 250
+
+Text notifi_label
+ Attributes
+ ID : 2
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+Button button_back
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Button bt_accept
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Release Event
+ lastclick.txt="{\"page\": \"notification\", \"component\": \"accept\", \"value\": \"release\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Button bt_clear
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 10
+
+ Events
+ Touch Release Event
+ lastclick.txt="{\"page\": \"notification\", \"component\": \"clear\", \"value\": \"release\"}"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints lastclick.txt,0
+ printh 00
+ printh FF FF FF
+
+Timer swipestore
+ Attributes
+ ID : 4
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 9
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/pics/30_vertical.png b/nspanel_us_land_code/pics/30_vertical.png
new file mode 100644
index 000000000..415a7f354
Binary files /dev/null and b/nspanel_us_land_code/pics/30_vertical.png differ
diff --git a/nspanel_us_land_code/pics/31_vertical.png b/nspanel_us_land_code/pics/31_vertical.png
new file mode 100644
index 000000000..e530e71b9
Binary files /dev/null and b/nspanel_us_land_code/pics/31_vertical.png differ
diff --git a/nspanel_us_land_code/qrcode.txt b/nspanel_us_land_code/qrcode.txt
new file mode 100644
index 000000000..b5ccbea47
--- /dev/null
+++ b/nspanel_us_land_code/qrcode.txt
@@ -0,0 +1,148 @@
+Page qrcode
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"qrcode\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text qrcode_label
+ Attributes
+ ID : 3
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 30
+
+QR Code qrcode_value
+ Attributes
+ ID : 4
+ Scope : global
+ Dragging : 0
+ Send Component ID: disabled
+ Text :
+ Max. Text Size : 50
+
+Button button_back
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 6
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ //page
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/screensaver.txt b/nspanel_us_land_code/screensaver.txt
new file mode 100644
index 000000000..d53450df7
--- /dev/null
+++ b/nspanel_us_land_code/screensaver.txt
@@ -0,0 +1,41 @@
+Page screensaver
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ dim=0
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"screensaver\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+
+ Touch Release Event
+ page orign.val
+
+Variable (int32) orign
+ Attributes
+ ID : 2
+ Scope: global
+ Value: 0
+
+TouchCap wakeup
+ Attributes
+ ID : 1
+ Scope: local
+ Value: 0
+
+ Events
+ Touch Press Event
+ page orign.val
+
diff --git a/nspanel_us_land_code/settings.txt b/nspanel_us_land_code/settings.txt
new file mode 100644
index 000000000..b7b32415c
--- /dev/null
+++ b/nspanel_us_land_code/settings.txt
@@ -0,0 +1,306 @@
+Page settings
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"settings\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text bright_text
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : 80%
+ Max. Text Size : 4
+
+Text dim_text
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : 20%
+ Max. Text Size : 4
+
+Text lbl_reboot
+ Attributes
+ ID : 5
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Reboot
+ Max. Text Size : 25
+
+Text lbl_sleep
+ Attributes
+ ID : 6
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Sleep mode
+ Max. Text Size : 25
+
+Text lbl_bright
+ Attributes
+ ID : 7
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Bright
+ Max. Text Size : 25
+
+Text lbl_dim
+ Attributes
+ ID : 8
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Dim
+ Max. Text Size : 25
+
+Text lbl_brightness
+ Attributes
+ ID : 16
+ Scope : global
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text : Brightness
+ Max. Text Size : 25
+
+Slider brightslider
+ Attributes
+ ID : 1
+ Scope : global
+ Dragging : 0
+ Send Component ID: on press and release
+ Position : 80
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Press Event
+ printh 92
+ prints "touchevent",0
+ printh 00
+ prints "{\"page\": \"settings\", \"component\": \"touchevent\", \"value\": \"press\"}",0
+ printh 00
+ printh FF FF FF
+
+ Touch Release Event
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+
+Slider dimslider
+ Attributes
+ ID : 2
+ Scope : global
+ Dragging : 0
+ Send Component ID: on press and release
+ Position : 20
+ Upper range limit: 100
+ Lower range limit: 0
+
+ Events
+ Touch Press Event
+ printh 92
+ prints "touchevent",0
+ printh 00
+ prints "{\"page\": \"settings\", \"component\": \"touchevent\", \"value\": \"press\"}",0
+ printh 00
+ printh FF FF FF
+
+ Touch Release Event
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 91
+ prints "dimslider",0
+ printh 00
+ prints dimslider.val,0
+ printh FF FF FF
+
+Button button_back
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Dual-state Button bt_reboot
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID: on press and release
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+Dual-state Button bt_sleep
+ Attributes
+ ID : 10
+ Scope : global
+ Dragging : 0
+ Send Component ID: on press and release
+ State : unpressed
+ Text : î¨
+ Max. Text Size : 3
+
+Hotspot bt_bright_down
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ if(brightslider.val>0)
+ {
+ brightslider.val--
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
+
+Hotspot bt_bright_up
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ if(brightslider.val<100)
+ {
+ brightslider.val++
+ covx brightslider.val,bright_text.txt,0,0
+ bright_text.txt+="%"
+ printh 91
+ prints "brightslider",0
+ printh 00
+ prints brightslider.val,0
+ printh FF FF FF
+ }
+
+Hotspot bt_dim_down
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ if(dimslider.val>0)
+ {
+ dimslider.val--
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 91
+ prints "dimslider",0
+ printh 00
+ prints dimslider.val,0
+ printh FF FF FF
+ }
+
+Hotspot bt_dim_up
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+ Events
+ Touch Release Event
+ if(dimslider.val<100)
+ {
+ dimslider.val++
+ covx dimslider.val,dim_text.txt,0,0
+ dim_text.txt+="%"
+ printh 91
+ prints "dimslider",0
+ printh 00
+ prints dimslider.val,0
+ printh FF FF FF
+ }
+
+Timer wakeup_timer
+ Attributes
+ ID : 17
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page weather05
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/weather02.txt b/nspanel_us_land_code/weather02.txt
new file mode 100644
index 000000000..cd8f9fe42
--- /dev/null
+++ b/nspanel_us_land_code/weather02.txt
@@ -0,0 +1,292 @@
+Page weather02
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"weather02\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text day
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text loading
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 1
+
+Text date
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text temperature
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value05
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value04
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value02
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value03
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01_icon
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02_icon
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03_icon
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04_icon
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05_icon
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture weather_icon
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 20
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page weather01
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/weather03.txt b/nspanel_us_land_code/weather03.txt
new file mode 100644
index 000000000..99a33d8f5
--- /dev/null
+++ b/nspanel_us_land_code/weather03.txt
@@ -0,0 +1,292 @@
+Page weather03
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"weather03\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text day
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text loading
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 1
+
+Text date
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text temperature
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value05
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value04
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value02
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value03
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01_icon
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02_icon
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03_icon
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04_icon
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05_icon
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture weather_icon
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 20
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page weather02
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/weather04.txt b/nspanel_us_land_code/weather04.txt
new file mode 100644
index 000000000..c5348f05c
--- /dev/null
+++ b/nspanel_us_land_code/weather04.txt
@@ -0,0 +1,292 @@
+Page weather04
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"weather04\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text day
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text loading
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 1
+
+Text date
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text temperature
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value05
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value04
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value02
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value03
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01_icon
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02_icon
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03_icon
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04_icon
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05_icon
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture weather_icon
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 20
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page weather03
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+
diff --git a/nspanel_us_land_code/weather05.txt b/nspanel_us_land_code/weather05.txt
new file mode 100644
index 000000000..05c93d814
--- /dev/null
+++ b/nspanel_us_land_code/weather05.txt
@@ -0,0 +1,292 @@
+Page weather05
+ Attributes
+ ID : 0
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Locked : no
+ Swide up page ID : disabled
+ Swide down page ID : disabled
+ Swide left page ID : disabled
+ Swide right page ID: disabled
+
+ Events
+ Preinitialize Event
+ if(api==0)
+ {
+ page home
+ }else
+ {
+ printh 92
+ prints "nspanelevent",0
+ printh 00
+ prints "{\"page\": \"weather05\", \"component\": \"currentpage\", \"value\": \"pagechange\"}",0
+ printh 00
+ printh FF FF FF
+ }
+
+ Touch Press Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+ Touch Release Event
+ printh 91
+ prints "touchevent",0
+ printh 00
+ prints rand,0
+ printh FF FF FF
+
+Text day
+ Attributes
+ ID : 4
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Text loading
+ Attributes
+ ID : 5
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 1
+
+Text date
+ Attributes
+ ID : 6
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 25
+
+Text temperature
+ Attributes
+ ID : 7
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01
+ Attributes
+ ID : 8
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value05
+ Attributes
+ ID : 9
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value04
+ Attributes
+ ID : 10
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value02
+ Attributes
+ ID : 11
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value03
+ Attributes
+ ID : 12
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 15
+
+Text value01_icon
+ Attributes
+ ID : 13
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value02_icon
+ Attributes
+ ID : 14
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value03_icon
+ Attributes
+ ID : 15
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value04_icon
+ Attributes
+ ID : 16
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text value05_icon
+ Attributes
+ ID : 17
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 10
+
+Text page_index
+ Attributes
+ ID : 18
+ Scope : local
+ Dragging : 0
+ Send Component ID : disabled
+ Associated Keyboard: none
+ Text :
+ Max. Text Size : 20
+
+Picture weather_icon
+ Attributes
+ ID : 3
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+
+Button button_back
+ Attributes
+ ID : 19
+ Scope : local
+ Dragging : 0
+ Send Component ID: disabled
+ State : unpressed
+ Text : î
+ Max. Text Size : 3
+
+ Events
+ Touch Press Event
+ page home
+
+Timer swipestore
+ Attributes
+ ID : 2
+ Scope : local
+ Period (ms): 50
+ Enabled : no
+
+ Events
+ Timer Event
+ swipex=tch0
+ swipey=tch1
+
+Timer wakeup_timer
+ Attributes
+ ID : 20
+ Scope : local
+ Period (ms): 100
+ Enabled : yes
+
+ Events
+ Timer Event
+ if(dimswipedx)
+ {
+ page weather04
+ }
+ // Right to Left
+ swipec2=0-swipedx
+ if(swipec100)
+ {
+ //page
+ }
+ // Down to Up
+ swipec2=0-swipedy
+ if(swipec<-100)
+ {
+ //page
+ }
+ }
+