diff --git a/docs/addon_climate.md b/docs/addon_climate.md
index 67b230d4..886ba500 100644
--- a/docs/addon_climate.md
+++ b/docs/addon_climate.md
@@ -34,6 +34,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
@@ -68,23 +69,23 @@ packages:
The following keys are available to be used in your `substitutions`:
-Key|Required|Supported values|Default|Description
-:-|:-:|:-:|:-:|:-
-cooler_relay|Mandatory for *cool* and *dual*|`1` or `2`|`0` (disabled)|Relay used to control the cooler. Use `1` for "Relay 1" or `2` for "Relay 2".
-heater_relay|Mandatory for *heat* and *dual*|`1` or `2`|`0` (disabled)|Relay used to control the heater. Use `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.
-target_low|Optional|Number representing a temperature in the selected unit|`18` (°C) or `64` (°F)|The initial lower threshold for the target temperature.
-target_high|Optional|Number representing a temperature in the selected unit|`24` (°C) or `75` (°F)|The initial higher threshold for the target temperature.
-temp_min|Optional|Number representing a temperature in the selected unit|*cool: `15` (°C) or `60` (°F)*
*heat: `7` (°C) or `45` (°F)*
*dual: `7` (°C) or `45` (°F)* |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|*cool: `45` (°C) or `113` (°F)*
*heat: `35` (°C) or `95` (°F)*
*dual: `45` (°C) or `113` (°F)* |The maximum temperature the climate device can reach. Used to set the range of the frontend gauge.
-~temp_step~|Deprecated|~Number representing a temperature in the selected unit~|~`0.5`~
`0.5` (°C) or `1` (°F)|~The granularity with which the target temperature can be controlled.~
-cool_deadband|Optional|Number representing a temperature hysteresis in the selected unit|`0.5` (°C) or `1` (°F)|The minimum temperature differential (temperature above the set point) before engaging cooling.
-cool_overrun|Optional|Number representing a temperature hysteresis in the selected unit|`0.5` (°C) or `1` (°F)|The minimum temperature differential (cooling beyond the set point) before disengaging cooling.
-heat_deadband|Optional|Number representing a temperature hysteresis in the selected unit|`0.5` (°C) or `1` (°F)|The minimum temperature differential (temperature below the set point) before engaging heat.
-heat_overrun|Optional|Number representing a temperature hysteresis in the selected unit|`0.5` (°C) or `1` (°F)|The minimum temperature differential (heating beyond the set point) before disengaging heat.
+| Key | Required | Supported values | Default | Description |
+| :- | :-: | :-: | :-: | :- |
+| cooler_relay | Mandatory for *cool* and *dual* | `1` or `2` | `0` (disabled) | Relay used to control the cooler. Use `1` for "Relay 1" or `2` for "Relay 2". |
+| heater_relay | Mandatory for *heat* and *dual* | `1` or `2` | `0` (disabled) | Relay used to control the heater. Use `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. |
+| target_low | Optional | Number representing a temperature in the selected unit | `18` (°C) or `64` (°F) | The initial lower threshold for the target temperature. |
+| target_high | Optional | Number representing a temperature in the selected unit | `24` (°C) or `75` (°F) | The initial higher threshold for the target temperature. |
+| temp_min | Optional | Number representing a temperature in the selected unit | *cool: `15` (°C) or `60` (°F)*
*heat: `7` (°C) or `45` (°F)*
*dual: `7` (°C) or `45` (°F)* | 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 | *cool: `45` (°C) or `113` (°F)*
*heat: `35` (°C) or `95` (°F)*
*dual: `45` (°C) or `113` (°F)* | The maximum temperature the climate device can reach. Used to set the range of the frontend gauge. |
+| ~temp_step~ | Deprecated | ~Number representing a temperature in the selected unit~ | ~`0.5`~
`0.5` (°C) or `1` (°F) | ~The granularity with which the target temperature can be controlled.~ |
+| cool_deadband | Optional | Number representing a temperature hysteresis in the selected unit | `0.5` (°C) or `1` (°F) | The minimum temperature differential (temperature above the set point) before engaging cooling. |
+| cool_overrun | Optional | Number representing a temperature hysteresis in the selected unit | `0.5` (°C) or `1` (°F) | The minimum temperature differential (cooling beyond the set point) before disengaging cooling. |
+| heat_deadband | Optional | Number representing a temperature hysteresis in the selected unit | `0.5` (°C) or `1` (°F) | The minimum temperature differential (temperature below the set point) before engaging heat. |
+| heat_overrun | Optional | Number representing a temperature hysteresis in the selected unit | `0.5` (°C) or `1` (°F) | The minimum temperature differential (heating beyond the set point) before disengaging heat. |
@@ -104,6 +105,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
@@ -146,6 +148,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
@@ -188,6 +191,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
diff --git a/docs/addon_upload_tft.md b/docs/addon_upload_tft.md
index 29ac1387..2a5ac079 100644
--- a/docs/addon_upload_tft.md
+++ b/docs/addon_upload_tft.md
@@ -46,6 +46,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
@@ -108,6 +109,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Upload TFT configuration
upload_tft_automatically: true
@@ -131,6 +133,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Disable automatic TFT upload
upload_tft_automatically: false
@@ -153,6 +156,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Use a locally hosted TFT file
nextion_update_url: "http://homeassistant.local:8123/local/nspanel_eu.tft"
diff --git a/docs/api.md b/docs/api.md
index d871d2d7..a614f6ad 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -60,7 +60,7 @@ You can look up the action names available on your Home Assistant instance under
### Table of Contents
| Action ID | Action Name | Description |
-|------------|--------------|-------------|
+| --------- | ----------- | ----------- |
| [`button`](#button-action-button) | [Button Action](#button-action-button) | Configures properties and state of buttons on a specified button page. |
| [`command`](#command-action-command) | [Command Action](#command-action-command) | Sends a custom command directly to the display. |
| [`component_color`](#component-color-action-component_color) | [Component Color Action](#component-color-action-component_color) | Changes the foreground color of a specified component on the display. |
@@ -503,7 +503,6 @@ The bitmask values are aligned with the
- `code_format` (string): Specifies the code format required for arming/disarming the alarm system, such as numeric or alphanumeric.
- `code_arm_required` (bool): Indicates whether a code is required to arm the system.
- `entity` (string): The entity ID of the alarm system, used for state updates and control actions.
-- `mui_alarm` (string[]): An array of localized text strings for the alarm control buttons, supporting various alarm states and actions.
**Home Assistant Example:**
@@ -516,13 +515,6 @@ data:
code_format: "number"
code_arm_required: true
entity: "alarm_control_panel.home_alarm"
- mui_alarm:
- - "Zuhause"
- - "Abwesend"
- - "Nacht"
- - "Urlaub"
- - "Umgehen"
- - "Entwaffnen"
```
> [!NOTE]
@@ -729,7 +721,7 @@ RTTTL is a compact format for storing melody sequences in a text-based format, m
This string must conform to the RTTTL format, which includes the melody's name, default settings, and a sequence of notes.
**Example Tones:**
-For example tones and further inspiration, you can visit examples of RTTTL songs [here](https://esphome.io/components/rtttl/#common-beeps).
+For example tones and further inspiration, you can visit this list with [examples of RTTTL songs](https://esphome.io/components/rtttl/#common-beeps).
**Home Assistant Example:**
diff --git a/docs/blueprint.md b/docs/blueprint.md
index 0c249f51..f48f5524 100644
--- a/docs/blueprint.md
+++ b/docs/blueprint.md
@@ -9,7 +9,9 @@ The individual elements of the Blueprint are described below.
It is possible to change both the color of the labels and the icons for most of the elements on each screen.
-On the blueprint settings, you will be able to select any of the MDI icons supported by Home Assistant, however, your panel will only support the icons available on the [HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
+On the blueprint settings, you will be able to select any of the MDI icons supported by Home Assistant,
+however, your panel will only support the icons available on the
+[HASwitchPlate Material Design Icons](https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html).
For an easier overview, the menu items "Icon Color" and "Label Color" will not be described separately in the following documentation.
@@ -26,10 +28,18 @@ This is technically the only required field, as basic functionality will be avai
### Language for NSPanel
-The language can be selected via the drop-down menu.
+Language is no longer configured in the Blueprint. It is now set directly in your ESPHome YAML
+as a substitution, which means only your chosen language's strings are compiled into the firmware —
+saving memory and allowing the panel to display correct date and UI strings even when offline.
-Currently around 30 languages are supported, but if you cannot find your language there,
-please create a [new feature request](https://github.com/edwardtfn/NSPanel-Easy/issues/new) and we will be happy to help.
+To set your language, add the `language` substitution to your ESPHome YAML:
+
+```yaml
+substitutions:
+ language: pt # Portuguese - see docs/localization.md for all supported codes
+```
+
+For the full list of supported language codes, see [Localization](localization.md).
### Date format
@@ -63,7 +73,7 @@ If the value of the sensor needs to be corrected, this can be done via the tempe
## Home page - Entities States
| Entity | Description | Example |
-| --- | --- | --- |
+| --- | --- | --- |
| Home page - Entity State 01-04 (Optional) | Up to four HA entities can be displayed on the home screen. |  |
| Home page - Chips 01-07 (optional) | Used to display icons of HA binary entities on the home screen. The icon is displayed when the entity is on/open/true/active. Otherwise, no icon is displayed. |  |
| Custom button 01-06 (Optional) | 7 custom buttons that can be assigned to different entities from your Home Assistant. The behavior of these buttons will depend on the entity's domain, such as light, media player, etc. |  |
diff --git a/docs/customization.md b/docs/customization.md
index 62454c3e..b41f0884 100644
--- a/docs/customization.md
+++ b/docs/customization.md
@@ -75,6 +75,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
diff --git a/docs/install.md b/docs/install.md
index 455c07df..01e66a2a 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -116,6 +116,7 @@ Follow these steps to add a new device in the ESPHome Dashboard:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
@@ -226,8 +227,8 @@ The use of a non-conductive tool, like the blue plastic one shown in the picture
| Panel's Board | TTL USB-to-Serial |
| :--: | :--: |
| `3V3` | `VCC`, `3V3`, or `3.3V` |
- | `TX` | `RX` |
- | `RX` | `TX` |
+ | `TX` | `RX` |
+ | `RX` | `TX` |
| `GND` | `GND` |
| `IO0` | `GND`
This can be connected to a `GND` pin on the panel's board. |
@@ -506,6 +507,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
@@ -563,6 +565,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
@@ -607,6 +610,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
@@ -670,6 +674,7 @@ Here's a complete workflow for integrating Bluetooth Proxy while managing memory
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
@@ -700,6 +705,7 @@ Here's a complete workflow for integrating Bluetooth Proxy while managing memory
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
@@ -749,6 +755,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: "" # Optional: set OTA password, or use ${wifi_password} for backward compatibility (see migration guide)
+ language: en # Language code - see docs/localization.md for all supported codes
boot_sound: false
# Add-on configuration (if needed)
## Upload TFT
diff --git a/docs/localization.md b/docs/localization.md
new file mode 100644
index 00000000..0822f626
--- /dev/null
+++ b/docs/localization.md
@@ -0,0 +1,93 @@
+# Localization
+
+NSPanel Easy supports displaying dates, weekdays, and UI strings in your local language.
+Language selection is configured at compile time in your ESPHome YAML, so only the strings for your chosen language
+are loaded onto the device — saving memory and allowing the panel to display correct strings even when offline.
+
+## Setting Your Language
+
+Add the `language` substitution to your ESPHome YAML configuration:
+
+```yaml
+substitutions:
+ device_name: "your_nspanel_name"
+ friendly_name: "Your Panel Name"
+ wifi_ssid: !secret wifi_ssid
+ wifi_password: !secret wifi_password
+ language: pt # Set your language code here
+```
+
+The default language is `en` (English). If no `language` substitution is set, or if an unsupported code is provided,
+English will be used as a fallback.
+
+After changing the language, you must recompile and flash your panel for the change to take effect.
+
+## Supported Languages
+
+| Code | Language |
+| :--- | :------- |
+| `af` | Afrikaans |
+| `ar` | Arabic |
+| `bg` | Bulgarian |
+| `bn` | Bengali |
+| `bs` | Bosnian |
+| `ca` | Catalan |
+| `cs` | Czech |
+| `cy` | Welsh |
+| `da` | Danish |
+| `de` | German |
+| `el` | Greek |
+| `en` | English *(default)* |
+| `es` | Spanish |
+| `et` | Estonian |
+| `eu` | Basque |
+| `fa` | Persian (Farsi) |
+| `fi` | Finnish |
+| `fr` | French |
+| `gl` | Galician |
+| `he` | Hebrew |
+| `hi` | Hindi |
+| `hr` | Croatian |
+| `hu` | Hungarian |
+| `id` | Indonesian |
+| `is` | Icelandic |
+| `it` | Italian |
+| `ja` | Japanese |
+| `jv` | Javanese |
+| `ko` | Korean |
+| `lt` | Lithuanian |
+| `lv` | Latvian |
+| `mk` | Macedonian |
+| `ms` | Malay |
+| `nb` | Norwegian Bokmål |
+| `nl` | Dutch |
+| `pa` | Punjabi (Gurmukhi) |
+| `pl` | Polish |
+| `pt` | Portuguese |
+| `ro` | Romanian |
+| `ru` | Russian |
+| `sk` | Slovak |
+| `sl` | Slovenian |
+| `sq` | Albanian |
+| `sr` | Serbian |
+| `sv` | Swedish |
+| `sw` | Swahili |
+| `ta` | Tamil |
+| `th` | Thai |
+| `tr` | Turkish |
+| `uk` | Ukrainian |
+| `ur` | Urdu |
+| `vi` | Vietnamese |
+| `zh-cn` | Chinese (Simplified) |
+| `zh-tw` | Chinese (Traditional) |
+
+> [!NOTE]
+> Languages using non-Latin scripts (Arabic, Bengali, Chinese, Cyrillic, Devanagari, Greek, Gurmukhi,
+> Hebrew, Japanese, Korean, Persian, Tamil, Thai, Urdu) require a Nextion TFT font that supports the
+> relevant character set. If your panel displays boxes or question marks instead of characters,
+> your TFT file may not include the required font glyphs.
+
+## Missing Your Language?
+
+If your language is not listed, please [open a feature request](https://github.com/edwardtfn/NSPanel-Easy/issues/new)
+and it will be added in a future release.
diff --git a/docs/migration_from_blackymas.md b/docs/migration_from_blackymas.md
index 3137f6d2..21756255 100644
--- a/docs/migration_from_blackymas.md
+++ b/docs/migration_from_blackymas.md
@@ -61,11 +61,28 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: ${wifi_password} # IMPORTANT! For backward compatibility
+ language: en # Language code - see docs/localization.md for all supported codes
```
> [!NOTE] Setting OTA to use WiFi is only necessary if you are migrating wirelessly.
> When migrating via USB/TTL you can freely select your OTA password or leave without one.
+#### Language
+
+Language is no longer selected in the Blueprint. You must now set it as a substitution
+in your ESPHome YAML. Find your `substitutions` block and add:
+
+```yaml
+substitutions:
+ language: en # Replace with your language code
+```
+
+For the full list of supported language codes, see [Localization](localization.md).
+
+> [!IMPORTANT]
+> If you skip this step your panel will fall back to English after migration,
+> regardless of what language you had selected in the old Blueprint.
+
#### Remote package reference
Find your `remote_package` block. It currently looks something like this:
@@ -106,9 +123,10 @@ packages:
| Setting | Before (Blackymas) | After (NSPanel Easy) |
| :------ | :------------------ | :------------------- |
-| `ota_password` | It was set on the remote package to use your WiFi password | You have to add the substitution `ota_password: ${wifi_password}` for backward compatibility |
-| `url` | `https://github.com/Blackymas/NSPanel_HA_Blueprint` | `https://github.com/edwardtfn/NSPanel-Easy` |
-| `ref` | A version tag (e.g. `v4.3.30`) | `main` |
+| `ota_password` | It was set on the remote package to use your WiFi password | You have to add the substitution `ota_password: ${wifi_password}` for backward compatibility |
+| `language` | Selected via Blueprint dropdown | Set as `language: xx` substitution in ESPHome YAML - see [Localization](localization.md) |
+| `url` | `https://github.com/Blackymas/NSPanel_HA_Blueprint` | `https://github.com/edwardtfn/NSPanel-Easy` |
+| `ref` | A version tag (e.g. `v4.3.30`) | `main` |
| Add-on file paths | Root level (e.g. `nspanel_esphome_addon_climate_heat.yaml`) | Inside `esphome/` folder (e.g. `esphome/nspanel_esphome_addon_climate_heat.yaml`) |
| Base package | `nspanel_esphome.yaml` | `nspanel_esphome.yaml` *(no change)* |
@@ -127,6 +145,7 @@ substitutions:
wifi_ssid: !secret wifi_ssid
wifi_password: !secret wifi_password
ota_password: ${wifi_password} # IMPORTANT! For backward compatibility
+ language: en # Language code - see docs/localization.md for all supported codes
# Add-on configuration (if needed)
## Upload TFT
@@ -353,3 +372,7 @@ and switch your automation's Blueprint path back to the old one.
**Q: Do I need to update all my panels at once?**
A: No. You can migrate one panel at a time. Each panel is independent.
+
+**Q: My panel is now showing English instead of my language after migration.**
+A: Language is no longer configured in the Blueprint. Add `language: xx` to your
+ESPHome `substitutions` block and reflash. See [Localization](localization.md) for supported codes.
diff --git a/esphome/nspanel_esphome_api.yaml b/esphome/nspanel_esphome_api.yaml
index 25089665..92be393c 100644
--- a/esphome/nspanel_esphome_api.yaml
+++ b/esphome/nspanel_esphome_api.yaml
@@ -14,7 +14,6 @@ substitutions:
BOOT_STEP_API: 30
TAG_API: nspanel.api
EVENT_NAME: esphome.nspanel_easy
- mui_unavailable: Unavailable
api:
id: api_server
@@ -73,10 +72,14 @@ api:
txt: string # New text content to be displayed. Supports both static and dynamic content.
then:
- lambda: |-
+ std::string txt_str = std::string(txt);
+ if (txt_str == "${SENTINEL_UNAVAILABLE}") txt_str = "${LOCALIZATION[LANG].unavailable}";
+ else if (txt_str == "${SENTINEL_UNKNOWN}") txt_str = "${LOCALIZATION[LANG].unknown}";
+ else if (txt_str == "${SENTINEL_NO_NAME}") txt_str = "${LOCALIZATION[LANG].no_name}";
action_component_text->execute(
page.c_str(),
id.c_str(),
- txt.c_str()
+ txt_str.c_str()
);
# Updates the value of a specified component on the display.
@@ -196,13 +199,6 @@ esphome:
build_flags:
- -D NSPANEL_EASY_API
-globals:
- - id: mui_unavailable
- type: std::string
- restore_value: true
- initial_value: '"${mui_unavailable}"'
- max_restore_data_length: 25
-
script:
- id: action_component_color
mode: single
@@ -251,9 +247,6 @@ script:
disp1->send_command_printf("%s.%s.txt=\"%s\"", page.c_str(), component.c_str(), escaped.c_str());
return;
}
- if (component == "mui_unavailable") {
- id(mui_unavailable) = txt;
- }
- id: action_component_val
mode: single
diff --git a/esphome/nspanel_esphome_boot.yaml b/esphome/nspanel_esphome_boot.yaml
index 17077a8d..22547d63 100644
--- a/esphome/nspanel_esphome_boot.yaml
+++ b/esphome/nspanel_esphome_boot.yaml
@@ -38,17 +38,19 @@ script:
boot_preparation->execute();
boot_critical_components->execute();
- script.wait: boot_critical_components
- - lambda: boot_early_routines->execute();
+ - script.execute: boot_early_routines
- script.wait: boot_early_routines
- - lambda: boot_nextion->execute();
+ - script.execute: boot_nextion
+ - script.wait: boot_nextion
- delay: 1s
# This should be moved somewhere else
+ - lambda: boot_progress->execute(0);
- lambda: |-
boot_log->execute("Boot", "Starting sequence");
- boot_progress->execute(0);
boot_log->execute("Boot", "Waiting for Wi-Fi");
wait_for_wifi->execute();
- script.wait: wait_for_wifi
+ - lambda: boot_progress->execute(1);
- delay: ${DELAY_DEFAULT}ms
- if:
@@ -61,13 +63,13 @@ script:
else: # Wi-Fi connected
- lambda: |-
boot_log->execute("Boot", "Wi-Fi connected");
- boot_progress->execute(3);
page_boot_show_ip->execute();
+ - lambda: boot_progress->execute(2);
- lambda: wait_for_api->execute();
- script.wait: wait_for_api
- lambda: |-
- boot_progress->execute(4);
+ boot_progress->execute(3);
if (system_flags.api_ready) {
boot_log->execute("Boot", "API connected");
} else {
@@ -77,11 +79,10 @@ script:
// Publish Nextion state
boot_log->execute("Boot", "Publish Nextion state");
nextion_init->publish_state(disp1->is_setup());
- feed_wdt_delay(${DELAY_DEFAULT});
- boot_progress->execute(6);
# Wait for a response from the blueprint
- delay: ${DELAY_DEFAULT}ms
+ - lambda: boot_progress->execute(4);
- if:
condition:
- lambda: return not system_flags.blueprint_ready;
@@ -91,14 +92,20 @@ script:
wait_for_blueprint->execute();
- script.wait: wait_for_blueprint
- lambda: |-
+ boot_progress->execute(5);
if (not system_flags.blueprint_ready) {
boot_log->execute("Boot", "Blueprint not available");
}
- boot_progress->execute(7);
feed_wdt_delay(${DELAY_DEFAULT});
+ // Display settings
+ boot_log->execute("Boot", "Sending display settings");
+ disp1->send_command_printf("brightness=%i", int(display_brightness->state));
+ disp1->send_command_printf("brightness_dim=%i", int(display_dim_brightness->state));
+ disp1->send_command_printf("brightness_sleep=%i", int(display_sleep_brightness->state));
+ disp1->send_command_printf("wakeup_page_id=%" PRIu8, get_page_id(wakeup_page_name->current_option()));
+
// Wrap-up
- boot_progress->execute(8);
feed_wdt_delay(${DELAY_DEFAULT});
boot_log->execute("Boot", "Wait to finish");
feed_wdt_delay(${DELAY_DEFAULT});
@@ -109,9 +116,13 @@ script:
wait_for_blueprint->execute();
feed_wdt_delay(${DELAY_DEFAULT});
- script.wait: wait_for_wifi
+ - lambda: boot_progress->execute(6);
- script.wait: wait_for_api
+ - lambda: boot_progress->execute(7);
- script.wait: wait_for_blueprint
+ - lambda: boot_progress->execute(8);
- script.wait: wait_for_version_tft
+ - lambda: boot_progress->execute(9);
- script.execute: boot_wrap_up
- script.wait: boot_wrap_up
diff --git a/esphome/nspanel_esphome_datetime.yaml b/esphome/nspanel_esphome_datetime.yaml
index 68f449d9..8a869049 100644
--- a/esphome/nspanel_esphome_datetime.yaml
+++ b/esphome/nspanel_esphome_datetime.yaml
@@ -14,27 +14,39 @@ substitutions:
##############################
BOOT_STEP_DATETIME: '2'
TAG_DATETIME: nspanel.datetime
+ DATE_FORMAT_DEFAULT: "%A, %d.%m"
+ TIME_FORMAT_DEFAULT: "%H:%M"
+
esphome:
platformio_options:
build_flags:
- -D NSPANEL_EASY_DATETIME
+globals:
+ - id: mui_date_format
+ type: std::string
+ restore_value: true
+ max_restore_data_length: 30
+ initial_value: '"${DATE_FORMAT_DEFAULT}"'
+ - id: mui_time_format
+ type: std::string
+ restore_value: true
+ max_restore_data_length: 15
+ initial_value: '"${TIME_FORMAT_DEFAULT}"'
+
script:
- id: !extend action_component_text
then:
- lambda: |-
- if (page == "mem") {
- if (component == "time_format") {
- id(mui_time_format) = txt;
- return;
- } else if (component == "meridiem_am") {
- id(mui_meridiem_am) = txt;
- return;
- } else if (component == "meridiem_pm") {
- id(mui_meridiem_pm) = txt;
- return;
- }
+ if (page != "mem") return;
+ if (component == "date_format") {
+ id(mui_date_format) = txt;
+ return;
+ }
+ if (component == "time_format") {
+ id(mui_time_format) = txt;
+ return;
}
- id: new_minute
@@ -56,53 +68,126 @@ script:
if (system_flags.tft_upload_active) // Do not refresh if uploading TFT
return;
+ // Time
+ ESPTime now = id(time_provider).now();
std::string time_format_str = id(mui_time_format);
- 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)));
+ // Looped token replacer — handles repeated tokens in the same format string
+ auto replace_token = [](std::string& str, const char* token, const char* value) {
+ size_t pos = 0;
+ const size_t token_len = strlen(token);
+ const size_t value_len = strlen(value);
+ while ((pos = str.find(token, pos)) != std::string::npos) {
+ str.replace(pos, token_len, value);
+ pos += value_len;
}
- }
+ };
+
+ // Resolve %-H (no-padding 24h hour)
+ replace_token(time_format_str, "%-H", to_string(static_cast(now.hour)).c_str());
- const std::string& meridiem_text = (id(time_provider).now().hour<12) ?
- id(mui_meridiem_am) :
- id(mui_meridiem_pm);
+ // Resolve %-I (no-padding 12h hour)
+ const int hour12 = (now.hour == 0) ? 12 : (now.hour > 12) ? (now.hour - 12) : now.hour;
+ replace_token(time_format_str, "%-I", to_string(hour12).c_str());
+
+ const char* const meridiem_text = (now.hour < 12) ?
+ "${LOCALIZATION[LANG].meridiem.am}" :
+ "${LOCALIZATION[LANG].meridiem.pm}";
+ const bool has_meridiem = (time_format_str.find("%p") != std::string::npos);
if (current_page->state == "screensaver" and id(screensaver_display_time)) {
std::string time_format_str_sleep = time_format_str;
- const size_t p_pos = time_format_str_sleep.find("%p");
- if (p_pos != std::string::npos)
- time_format_str_sleep.replace(p_pos, sizeof("%p")-1, meridiem_text.c_str());
- disp1->set_component_text("text", id(time_provider).now().strftime(time_format_str_sleep).c_str());
+ replace_token(time_format_str_sleep, "%p", meridiem_text);
+ disp1->set_component_text("text", now.strftime(time_format_str_sleep).c_str());
}
- std::string time_format_str_home = time_format_str;
- const size_t p_pos_home = time_format_str_home.find("%p");
- if (p_pos_home != std::string::npos) {
- time_format_str_home.replace(p_pos_home, sizeof("%p")-1, "");
- while (!time_format_str_home.empty() && time_format_str_home.back() == ' ')
- time_format_str_home.pop_back();
- }
+ // Resolve %p for home page — strip from time string, set meridiem component separately
+ // Trim both ends after replacement to avoid leading/trailing whitespace
+ replace_token(time_format_str, "%p", "");
+ while (!time_format_str.empty() && time_format_str.front() == ' ')
+ time_format_str.erase(time_format_str.begin());
+ while (!time_format_str.empty() && time_format_str.back() == ' ')
+ time_format_str.pop_back();
+
+ disp1->set_component_text("home.meridiem", has_meridiem ? meridiem_text : " ");
+ disp1->set_component_text("home.time", now.strftime(time_format_str).c_str());
+
+ // Date
+ render_date->execute("home.date", 0);
+
+ - id: render_date
+ mode: restart
+ parameters:
+ component: string
+ timestamp: uint32_t
+ then:
+ - lambda: |-
+ static const char* const weekdays[7] = {
+ "${LOCALIZATION[LANG].weekdays.mon}",
+ "${LOCALIZATION[LANG].weekdays.tue}",
+ "${LOCALIZATION[LANG].weekdays.wed}",
+ "${LOCALIZATION[LANG].weekdays.thu}",
+ "${LOCALIZATION[LANG].weekdays.fri}",
+ "${LOCALIZATION[LANG].weekdays.sat}",
+ "${LOCALIZATION[LANG].weekdays.sun}"
+ };
+ static const char* const weekdays_short[7] = {
+ "${LOCALIZATION[LANG].weekdays_short.mon}",
+ "${LOCALIZATION[LANG].weekdays_short.tue}",
+ "${LOCALIZATION[LANG].weekdays_short.wed}",
+ "${LOCALIZATION[LANG].weekdays_short.thu}",
+ "${LOCALIZATION[LANG].weekdays_short.fri}",
+ "${LOCALIZATION[LANG].weekdays_short.sat}",
+ "${LOCALIZATION[LANG].weekdays_short.sun}"
+ };
+ static const char* const months[12] = {
+ "${LOCALIZATION[LANG].months.jan}", "${LOCALIZATION[LANG].months.feb}",
+ "${LOCALIZATION[LANG].months.mar}", "${LOCALIZATION[LANG].months.apr}",
+ "${LOCALIZATION[LANG].months.may}", "${LOCALIZATION[LANG].months.jun}",
+ "${LOCALIZATION[LANG].months.jul}", "${LOCALIZATION[LANG].months.aug}",
+ "${LOCALIZATION[LANG].months.sep}", "${LOCALIZATION[LANG].months.oct}",
+ "${LOCALIZATION[LANG].months.nov}", "${LOCALIZATION[LANG].months.dec}"
+ };
+ static const char* const months_short[12] = {
+ "${LOCALIZATION[LANG].months_short.jan}", "${LOCALIZATION[LANG].months_short.feb}",
+ "${LOCALIZATION[LANG].months_short.mar}", "${LOCALIZATION[LANG].months_short.apr}",
+ "${LOCALIZATION[LANG].months_short.may}", "${LOCALIZATION[LANG].months_short.jun}",
+ "${LOCALIZATION[LANG].months_short.jul}", "${LOCALIZATION[LANG].months_short.aug}",
+ "${LOCALIZATION[LANG].months_short.sep}", "${LOCALIZATION[LANG].months_short.oct}",
+ "${LOCALIZATION[LANG].months_short.nov}", "${LOCALIZATION[LANG].months_short.dec}"
+ };
+
+ if (component.empty()) return;
+
+ ESPTime dt = id(time_provider).now();
+ if (timestamp > 0)
+ dt = ESPTime::from_epoch_local(timestamp);
+
+ const int dow = (dt.day_of_week + 5) % 7;
+ const int mon = dt.month - 1;
+
+ std::string date_str = id(mui_date_format);
+ auto replace_token = [](std::string& str, const char* token, const char* value) {
+ size_t pos = 0;
+ const size_t token_len = strlen(token);
+ const size_t value_len = strlen(value);
+ while ((pos = str.find(token, pos)) != std::string::npos) {
+ str.replace(pos, token_len, value);
+ pos += value_len;
+ }
+ };
+ replace_token(date_str, "%A", weekdays[dow]);
+ replace_token(date_str, "%a", weekdays_short[dow]);
+ replace_token(date_str, "%B", months[mon]);
+ replace_token(date_str, "%b", months_short[mon]);
- disp1->set_component_text("home.meridiem", (time_format_str.find("%p") != std::string::npos) ?
- meridiem_text.c_str() : " ");
- disp1->set_component_text("home.time", id(time_provider).now().strftime(time_format_str_home).c_str());
+ disp1->set_component_text(component.c_str(), dt.strftime(date_str).c_str());
- id: !extend stop_all
then:
- lambda: |-
refresh_datetime->stop();
+ render_date->stop();
time: # Keeps time display updated
- id: time_provider
diff --git a/esphome/nspanel_esphome_hw_display.yaml b/esphome/nspanel_esphome_hw_display.yaml
index 46b88884..dda17e66 100644
--- a/esphome/nspanel_esphome_hw_display.yaml
+++ b/esphome/nspanel_esphome_hw_display.yaml
@@ -23,7 +23,6 @@ substitutions:
THEME_LIGHT_COLOR_PCO_UNSUPPORTED: ${COLOR_GRAY_LIGHT} # Light gray - visually "faded"
BAUD_RATE: '115200'
BOOT_STEP_HW_DISPLAY: '5'
- bytes_per_char: "1"
button_back_font: "8"
COLOR_BLACK: '0' # Colors::BLACK
COLOR_BLUE_INDIGO: '10597' # Colors::BLUE_INDIGO
@@ -108,11 +107,6 @@ globals:
restore_value: true
initial_value: ${button_back_font}
- - id: mui_bytes_per_char
- type: uint8_t
- restore_value: true
- initial_value: ${bytes_per_char}
-
- id: theme_pending_apply
type: bool
restore_value: false
@@ -171,10 +165,6 @@ script:
then:
- lambda: |-
if (page != "mem") return;
- if (component == "bytes_per_char") {
- id(mui_bytes_per_char) = static_cast(val);
- return;
- }
if (component == "button_back_font") {
id(button_back_font) = static_cast(val);
disp1->send_command_printf("button_back_font=%i", id(button_back_font));
diff --git a/esphome/nspanel_esphome_localization.yaml b/esphome/nspanel_esphome_localization.yaml
index 4486a173..138728a7 100644
--- a/esphome/nspanel_esphome_localization.yaml
+++ b/esphome/nspanel_esphome_localization.yaml
@@ -13,7 +13,7 @@ substitutions:
##############################
TAG_LOCALIZATION: nspanel.localization
- language: ''
+ language: en
SUPPORTED_LANGUAGES: ["af", "ar", "bg", "bn", "bs", "ca", "cs", "cy", "da", "de", "el", "en",
"es", "et", "eu", "fa", "fi", "fr", "gl", "he", "hi", "hr", "hu", "id",
"is", "it", "ja", "jv", "ko", "lt", "lv", "mk", "ms", "nb", "nl", "pa",
@@ -4126,6 +4126,16 @@ substitutions:
meridiem:
am: 上午
pm: 下午
+ LANG_BYTES_PER_CHAR: "${LOCALIZATION[LANG].bytes_per_char}"
+ LANG_ALARM_HOME: "${LOCALIZATION[LANG].alarm.home}"
+ LANG_ALARM_AWAY: "${LOCALIZATION[LANG].alarm.away}"
+ LANG_ALARM_NIGHT: "${LOCALIZATION[LANG].alarm.night}"
+ LANG_ALARM_VACATION: "${LOCALIZATION[LANG].alarm.vacation}"
+ LANG_ALARM_BYPASS: "${LOCALIZATION[LANG].alarm.bypass}"
+ LANG_ALARM_DISARM: "${LOCALIZATION[LANG].alarm.disarm}"
+ SENTINEL_NO_NAME: "__no_name__"
+ SENTINEL_UNAVAILABLE: "__unavailable__"
+ SENTINEL_UNKNOWN: "__unknown__"
esphome:
platformio_options:
diff --git a/esphome/nspanel_esphome_page_alarm.yaml b/esphome/nspanel_esphome_page_alarm.yaml
index f10238b0..7ac59fe4 100644
--- a/esphome/nspanel_esphome_page_alarm.yaml
+++ b/esphome/nspanel_esphome_page_alarm.yaml
@@ -28,7 +28,6 @@ api:
code_format: string # Format required for the alarm code (numeric, alphanumeric).
code_arm_required: bool # Indicates if a code is needed to arm the system.
entity: string # Entity ID for the alarm system, enabling state updates and control.
- mui_alarm: string[] # Localized text for alarm control buttons (e.g., Arm, Disarm), allowing for a multilingual interface.
then:
# To do: This page constructor should be moved to Blueprint
- lambda: |-
@@ -118,12 +117,18 @@ api:
// Buttons - Text
ESP_LOGV("${TAG_PAGE_ALARM}", "Buttons - Text");
- disp1->set_component_text("bt_home_text", wrapText(mui_alarm[0].c_str(), 10, id(mui_bytes_per_char)).c_str());
- disp1->set_component_text("bt_away_text", wrapText(mui_alarm[1].c_str(), 10, id(mui_bytes_per_char)).c_str());
- disp1->set_component_text("bt_night_text", wrapText(mui_alarm[2].c_str(), 10, id(mui_bytes_per_char)).c_str());
- disp1->set_component_text("bt_vacat_text", wrapText(mui_alarm[3].c_str(), 10, id(mui_bytes_per_char)).c_str());
- disp1->set_component_text("bt_bypass_text", wrapText(mui_alarm[4].c_str(), 10, id(mui_bytes_per_char)).c_str());
- disp1->set_component_text("bt_disarm_text", wrapText(mui_alarm[5].c_str(), 10, id(mui_bytes_per_char)).c_str());
+ disp1->set_component_text("bt_home_text", wrapText("${LANG_ALARM_HOME}",
+ 10, ${LANG_BYTES_PER_CHAR}).c_str());
+ disp1->set_component_text("bt_away_text", wrapText("${LANG_ALARM_AWAY}",
+ 10, ${LANG_BYTES_PER_CHAR}).c_str());
+ disp1->set_component_text("bt_night_text", wrapText("${LANG_ALARM_NIGHT}",
+ 10, ${LANG_BYTES_PER_CHAR}).c_str());
+ disp1->set_component_text("bt_vacat_text", wrapText("${LANG_ALARM_VACATION}",
+ 10, ${LANG_BYTES_PER_CHAR}).c_str());
+ disp1->set_component_text("bt_bypass_text", wrapText("${LANG_ALARM_BYPASS}",
+ 10, ${LANG_BYTES_PER_CHAR}).c_str());
+ disp1->set_component_text("bt_disarm_text", wrapText("${LANG_ALARM_DISARM}",
+ 10, ${LANG_BYTES_PER_CHAR}).c_str());
feed_wdt_delay(${PAGE_ALARM_DELAY_SHORT});
// Page header
diff --git a/esphome/nspanel_esphome_page_buttons.yaml b/esphome/nspanel_esphome_page_buttons.yaml
index d96ab68e..44048951 100644
--- a/esphome/nspanel_esphome_page_buttons.yaml
+++ b/esphome/nspanel_esphome_page_buttons.yaml
@@ -74,7 +74,7 @@ api:
feed_wdt_delay(${DELAY_SHORT});
disp1->set_component_text((id + "text").c_str(),
- wrapText(label.c_str(), 10, id(mui_bytes_per_char)).c_str());
+ wrapText(label.c_str(), 10, ${LANG_BYTES_PER_CHAR}).c_str());
disp1->set_component_text((id + "bri").c_str(), (strcmp(bri.c_str(), "0") == 0) ? " " : bri.c_str());
disp1->send_command_printf("vis %s,1", (id + "pic").c_str());
diff --git a/esphome/nspanel_esphome_page_climate.yaml b/esphome/nspanel_esphome_page_climate.yaml
index df52e139..8e9fc375 100644
--- a/esphome/nspanel_esphome_page_climate.yaml
+++ b/esphome/nspanel_esphome_page_climate.yaml
@@ -200,7 +200,7 @@ script:
disp1->set_component_text("current_temp", adjustDecimalSeparator(buffer, dec_sep).c_str());
} else {
ESP_LOGV("${TAG_PAGE_CLIMATE}", "Show current temperature 'unavailable'");
- disp1->set_component_text("current_temp", id(mui_unavailable).c_str());
+ disp1->set_component_text("current_temp", "${LOCALIZATION[LANG].unavailable}");
}
feed_wdt_delay(${DELAY_SHORT});
if (current_page_id != ${PAGE_CLIMATE_ID}) return;
diff --git a/esphome/nspanel_esphome_page_confirm.yaml b/esphome/nspanel_esphome_page_confirm.yaml
index 326f4f5d..029cbe61 100644
--- a/esphome/nspanel_esphome_page_confirm.yaml
+++ b/esphome/nspanel_esphome_page_confirm.yaml
@@ -8,7 +8,6 @@
---
substitutions:
- mui_please_confirm: "Please confirm"
BOOT_STEP_PAGE_CONFIRM: 13
PAGE_CONFIRM_ID: 26
TAG_PAGE_CONFIRM: nspanel.page.confirm
@@ -18,22 +17,7 @@ esphome:
build_flags:
- -D NSPANEL_EASY_PAGE_CONFIRM
-globals:
- #### Localization (MUI) ####
- - id: mui_please_confirm
- type: std::string
- restore_value: true
- initial_value: '"${mui_please_confirm}"'
- max_restore_data_length: 25
-
script:
- - id: !extend action_component_text
- then:
- - lambda: |-
- if (page == "mem" and component == "mui_please_confirm") {
- id(mui_please_confirm) = txt.substr(0, 25);
- }
-
- id: !extend page_change
then:
- lambda: |-
@@ -44,11 +28,14 @@ script:
mode: single
then:
- lambda: |-
- if (current_page_id == ${PAGE_CONFIRM_ID} and is_device_ready_for_tasks())
- disp1->set_component_text("confirm.title",
- wrapText(id(mui_please_confirm).c_str(),
- 15,
- id(mui_bytes_per_char)).c_str());
+ if (current_page_id != ${PAGE_CONFIRM_ID}) return;
+ if (!is_device_ready_for_tasks()) return;
+ disp1->set_component_text("confirm.title", wrapText(
+ "${LOCALIZATION[LANG].please_confirm}",
+ 15,
+ ${LANG_BYTES_PER_CHAR}
+ ).c_str()
+ );
- id: !extend stop_page_constructors
then:
diff --git a/esphome/nspanel_esphome_page_cover.yaml b/esphome/nspanel_esphome_page_cover.yaml
index 0ab61f0d..86c3f6a4 100644
--- a/esphome/nspanel_esphome_page_cover.yaml
+++ b/esphome/nspanel_esphome_page_cover.yaml
@@ -63,16 +63,4 @@ script:
});
} // endif key == "position"
} // endif page == "cover"
-
- - id: !extend page_change
- then:
- - lambda: if (new_page_id == ${PAGE_COVER_ID}) page_cover->execute();
-
- - id: page_cover
- mode: single
- then: # There's nothing here so far
-
- - id: !extend stop_page_constructors
- then:
- - lambda: page_cover->stop();
...
diff --git a/esphome/nspanel_esphome_page_home.yaml b/esphome/nspanel_esphome_page_home.yaml
index d38528e9..ca357c26 100644
--- a/esphome/nspanel_esphome_page_home.yaml
+++ b/esphome/nspanel_esphome_page_home.yaml
@@ -35,25 +35,10 @@ globals:
type: uint16_t
restore_value: true
initial_value: '65535'
- - id: mui_time_format
- type: std::string
- restore_value: true
- max_restore_data_length: 15
- initial_value: '"%H:%M"'
- id: home_time_color
type: uint16_t
restore_value: true
initial_value: '65535'
- - id: mui_meridiem_am
- type: std::string
- restore_value: true
- max_restore_data_length: 5
- initial_value: '"AM"'
- - id: mui_meridiem_pm
- type: std::string
- restore_value: true
- max_restore_data_length: 5
- initial_value: '"PM"'
##### Chips #####
- id: home_chip_font_id
diff --git a/esphome/nspanel_esphome_page_media_player.yaml b/esphome/nspanel_esphome_page_media_player.yaml
index 3c2d2820..4699abaa 100644
--- a/esphome/nspanel_esphome_page_media_player.yaml
+++ b/esphome/nspanel_esphome_page_media_player.yaml
@@ -91,13 +91,13 @@ api:
ESP_LOGV("${TAG_PAGE_MEDIA_PLAYER}", "Media title");
disp1->set_component_text("track", wrapText(media_title.c_str(),
display_mode == 2 ? 16 : 27,
- id(mui_bytes_per_char)).c_str());
+ ${LANG_BYTES_PER_CHAR}).c_str());
// Media artist
ESP_LOGV("${TAG_PAGE_MEDIA_PLAYER}", "Media artist");
disp1->set_component_text("artist", wrapText(media_artist.c_str(),
display_mode == 2 ? 26 : 40,
- id(mui_bytes_per_char)).c_str());
+ ${LANG_BYTES_PER_CHAR}).c_str());
feed_wdt_delay(${DELAY_SHORT});
// Button - ON/OFF
diff --git a/esphome/nspanel_esphome_page_notification.yaml b/esphome/nspanel_esphome_page_notification.yaml
index b9aad887..e0ffd490 100644
--- a/esphome/nspanel_esphome_page_notification.yaml
+++ b/esphome/nspanel_esphome_page_notification.yaml
@@ -113,7 +113,7 @@ script:
disp1->set_component_text("notifi_label", notification_label.c_str());
disp1->set_component_text("notifi_text01", wrapText(notification_text.c_str(),
display_mode == 2 ? 23 : 32,
- id(mui_bytes_per_char)).c_str());
+ ${LANG_BYTES_PER_CHAR}).c_str());
}
- id: !extend page_home
diff --git a/esphome/nspanel_esphome_page_settings.yaml b/esphome/nspanel_esphome_page_settings.yaml
index 0427a746..e18cb6b3 100644
--- a/esphome/nspanel_esphome_page_settings.yaml
+++ b/esphome/nspanel_esphome_page_settings.yaml
@@ -49,26 +49,6 @@ number:
disp1->set_component_text_printf("dim_text", "%i%%", int(x));
script:
- - id: !extend boot_nextion
- then:
- - lambda: |-
- // Display settings
- boot_log->execute("Boot", "Sending display settings");
- disp1->send_command_printf("brightness=%i", int(display_brightness->state));
- disp1->set_component_value("settings.brightslider", int(display_brightness->state));
- feed_wdt_delay(${DELAY_DEFAULT});
- disp1->send_command_printf("brightness_dim=%i", int(display_dim_brightness->state));
- disp1->set_component_value("settings.dimslider", int(display_dim_brightness->state));
- feed_wdt_delay(${DELAY_DEFAULT});
- disp1->send_command_printf("brightness_sleep=%i", int(display_sleep_brightness->state));
- #if ESPHOME_VERSION_CODE >= VERSION_CODE(2025, 11, 0) // Code for ESPHome newer than v2025.11.0
- disp1->send_command_printf("wakeup_page_id=%" PRIu8, get_page_id(wakeup_page_name->current_option()));
- #else
- disp1->send_command_printf("wakeup_page_id=%" PRIu8, get_page_id(wakeup_page_name->state.c_str()));
- #endif
- boot_progress->execute(5);
- feed_wdt_delay(${DELAY_DEFAULT});
-
- id: !extend event_from_display
then:
- lambda: |-
@@ -108,10 +88,11 @@ script:
mode: single
then:
- lambda: |-
- if (current_page_id == ${PAGE_SETTINGS_ID}) {
- disp1->hide_component("lbl_sleep");
- disp1->hide_component("bt_sleep");
- }
+ if (current_page_id != ${PAGE_SETTINGS_ID}) return;
+ disp1->set_component_text("lbl_reboot", "${LOCALIZATION[LANG].settings.reboot}");
+ disp1->set_component_text("lbl_brightness", "${LOCALIZATION[LANG].settings.brightness}");
+ disp1->set_component_text("lbl_bright", "${LOCALIZATION[LANG].settings.bright}");
+ disp1->set_component_text("lbl_dim", "${LOCALIZATION[LANG].settings.dim}");
- id: !extend stop_page_constructors
then:
diff --git a/esphome/nspanel_esphome_page_weather.yaml b/esphome/nspanel_esphome_page_weather.yaml
index 4c4a724b..db8b3088 100644
--- a/esphome/nspanel_esphome_page_weather.yaml
+++ b/esphome/nspanel_esphome_page_weather.yaml
@@ -13,6 +13,7 @@ substitutions:
PAGE_WEATHER04_ID: 5
PAGE_WEATHER05_ID: 6
TAG_PAGE_WEATHER: nspanel.page.weather
+ SECONDS_PER_DAY: 86400
display:
- id: !extend disp1
@@ -49,6 +50,43 @@ script:
theme_update_all_weather_icon->execute();
}
+ - id: !extend page_change
+ then:
+ - lambda: |-
+ if (new_page_id >= ${PAGE_WEATHER01_ID} and new_page_id <= ${PAGE_WEATHER05_ID})
+ page_weather->execute();
+
+ - id: page_weather
+ mode: restart
+ then:
+ - lambda: |-
+ const uint8_t page_index = current_page_id - ${PAGE_WEATHER01_ID};
+ if (page_index >= 5) {
+ ESP_LOGW("${TAG_PAGE_WEATHER}", "Unexpected page_index: %" PRIu8, page_index);
+ return;
+ }
+ const ESPTime now = id(time_provider).now();
+ // Anchor to local noon to avoid DST boundary edge cases where
+ // adding 86400s could resolve to the wrong calendar date
+ const int32_t seconds_to_noon = (12 - static_cast(now.hour)) * 3600;
+ const uint32_t timestamp = static_cast(
+ static_cast(now.timestamp) + seconds_to_noon + (page_index * ${SECONDS_PER_DAY}));
+
+ static const char* const relative_days[5] = {
+ "${LOCALIZATION[LANG].relative_day.today}",
+ "${LOCALIZATION[LANG].relative_day.tomorrow}",
+ "${LOCALIZATION[LANG].relative_day.in_2_days}",
+ "${LOCALIZATION[LANG].relative_day.in_3_days}",
+ "${LOCALIZATION[LANG].relative_day.in_4_days}"
+ };
+
+ disp1->set_component_text("day", relative_days[page_index]);
+ render_date->execute("date", timestamp);
+
+ - id: !extend stop_page_constructors
+ then:
+ - lambda: page_weather->stop();
+
- id: !extend stop_all
then:
- lambda: theme_update_all_weather_icon->stop();
diff --git a/esphome/nspanel_esphome_version.yaml b/esphome/nspanel_esphome_version.yaml
index c933bf4a..f3ba6565 100644
--- a/esphome/nspanel_esphome_version.yaml
+++ b/esphome/nspanel_esphome_version.yaml
@@ -11,8 +11,8 @@ substitutions:
# Value is imported from versioning/version.yaml
<<: !include ../versioning/version.yaml
# Minimum required versions for compatibility
- min_blueprint_version: 9
- min_tft_version: 10
+ min_blueprint_version: 10
+ min_tft_version: 11
min_esphome_compiler_version: 2026.1.0
TAG_VERSIONING: nspanel.versioning
diff --git a/hmi/dev/nspanel_CJK_eu_code/boot.txt b/hmi/dev/nspanel_CJK_eu_code/boot.txt
index 1e33db5c..6654a4a0 100644
--- a/hmi/dev/nspanel_CJK_eu_code/boot.txt
+++ b/hmi/dev/nspanel_CJK_eu_code/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_CJK_eu_code/qrcode.txt b/hmi/dev/nspanel_CJK_eu_code/qrcode.txt
index 6b71f0c6..4c628b3c 100644
--- a/hmi/dev/nspanel_CJK_eu_code/qrcode.txt
+++ b/hmi/dev/nspanel_CJK_eu_code/qrcode.txt
@@ -72,7 +72,7 @@ QR Code qr
Effect Time : 300
Logo overlay : no
Text :
- Max. Text Size : 70
+ Max. Text Size : 78
Button button_back
Attributes
diff --git a/hmi/dev/nspanel_CJK_eu_code/settings.txt b/hmi/dev/nspanel_CJK_eu_code/settings.txt
index 07c23e36..89e1809f 100644
--- a/hmi/dev/nspanel_CJK_eu_code/settings.txt
+++ b/hmi/dev/nspanel_CJK_eu_code/settings.txt
@@ -124,7 +124,7 @@ Text dim_text
Text lbl_reboot
Attributes
ID : 5
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -158,7 +158,7 @@ Text lbl_reboot
Text lbl_sleep
Attributes
ID : 6
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -187,7 +187,7 @@ Text lbl_sleep
Text lbl_bright
Attributes
ID : 7
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -214,7 +214,7 @@ Text lbl_bright
Text lbl_dim
Attributes
ID : 8
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -241,7 +241,7 @@ Text lbl_dim
Text lbl_brightness
Attributes
ID : 16
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
diff --git a/hmi/dev/nspanel_CJK_us_code/boot.txt b/hmi/dev/nspanel_CJK_us_code/boot.txt
index 85af70ea..886bf1b7 100644
--- a/hmi/dev/nspanel_CJK_us_code/boot.txt
+++ b/hmi/dev/nspanel_CJK_us_code/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_CJK_us_code/qrcode.txt b/hmi/dev/nspanel_CJK_us_code/qrcode.txt
index 8ae5f6fd..36a81c21 100644
--- a/hmi/dev/nspanel_CJK_us_code/qrcode.txt
+++ b/hmi/dev/nspanel_CJK_us_code/qrcode.txt
@@ -72,7 +72,7 @@ QR Code qr
Effect Time : 300
Logo overlay : no
Text :
- Max. Text Size : 70
+ Max. Text Size : 78
Button button_back
Attributes
diff --git a/hmi/dev/nspanel_CJK_us_code/settings.txt b/hmi/dev/nspanel_CJK_us_code/settings.txt
index 9ff35e90..1b8ce8b2 100644
--- a/hmi/dev/nspanel_CJK_us_code/settings.txt
+++ b/hmi/dev/nspanel_CJK_us_code/settings.txt
@@ -124,7 +124,7 @@ Text dim_text
Text lbl_reboot
Attributes
ID : 5
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -160,7 +160,7 @@ Text lbl_reboot
Text lbl_sleep
Attributes
ID : 6
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -189,7 +189,7 @@ Text lbl_sleep
Text lbl_bright
Attributes
ID : 7
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -216,7 +216,7 @@ Text lbl_bright
Text lbl_dim
Attributes
ID : 8
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -243,7 +243,7 @@ Text lbl_dim
Text lbl_brightness
Attributes
ID : 16
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
diff --git a/hmi/dev/nspanel_CJK_us_land_code/boot.txt b/hmi/dev/nspanel_CJK_us_land_code/boot.txt
index 1e33db5c..6654a4a0 100644
--- a/hmi/dev/nspanel_CJK_us_land_code/boot.txt
+++ b/hmi/dev/nspanel_CJK_us_land_code/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_CJK_us_land_code/qrcode.txt b/hmi/dev/nspanel_CJK_us_land_code/qrcode.txt
index 6b71f0c6..4c628b3c 100644
--- a/hmi/dev/nspanel_CJK_us_land_code/qrcode.txt
+++ b/hmi/dev/nspanel_CJK_us_land_code/qrcode.txt
@@ -72,7 +72,7 @@ QR Code qr
Effect Time : 300
Logo overlay : no
Text :
- Max. Text Size : 70
+ Max. Text Size : 78
Button button_back
Attributes
diff --git a/hmi/dev/nspanel_CJK_us_land_code/settings.txt b/hmi/dev/nspanel_CJK_us_land_code/settings.txt
index 07c23e36..89e1809f 100644
--- a/hmi/dev/nspanel_CJK_us_land_code/settings.txt
+++ b/hmi/dev/nspanel_CJK_us_land_code/settings.txt
@@ -124,7 +124,7 @@ Text dim_text
Text lbl_reboot
Attributes
ID : 5
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -158,7 +158,7 @@ Text lbl_reboot
Text lbl_sleep
Attributes
ID : 6
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -187,7 +187,7 @@ Text lbl_sleep
Text lbl_bright
Attributes
ID : 7
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -214,7 +214,7 @@ Text lbl_bright
Text lbl_dim
Attributes
ID : 8
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -241,7 +241,7 @@ Text lbl_dim
Text lbl_brightness
Attributes
ID : 16
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
diff --git a/hmi/dev/nspanel_easy_landscape/boot.txt b/hmi/dev/nspanel_easy_landscape/boot.txt
index 2d279e7e..8ac10c14 100644
--- a/hmi/dev/nspanel_easy_landscape/boot.txt
+++ b/hmi/dev/nspanel_easy_landscape/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_eu_code/boot.txt b/hmi/dev/nspanel_eu_code/boot.txt
index 1e33db5c..6654a4a0 100644
--- a/hmi/dev/nspanel_eu_code/boot.txt
+++ b/hmi/dev/nspanel_eu_code/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_eu_code/qrcode.txt b/hmi/dev/nspanel_eu_code/qrcode.txt
index 6b71f0c6..4c628b3c 100644
--- a/hmi/dev/nspanel_eu_code/qrcode.txt
+++ b/hmi/dev/nspanel_eu_code/qrcode.txt
@@ -72,7 +72,7 @@ QR Code qr
Effect Time : 300
Logo overlay : no
Text :
- Max. Text Size : 70
+ Max. Text Size : 78
Button button_back
Attributes
diff --git a/hmi/dev/nspanel_eu_code/settings.txt b/hmi/dev/nspanel_eu_code/settings.txt
index 07c23e36..89e1809f 100644
--- a/hmi/dev/nspanel_eu_code/settings.txt
+++ b/hmi/dev/nspanel_eu_code/settings.txt
@@ -124,7 +124,7 @@ Text dim_text
Text lbl_reboot
Attributes
ID : 5
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -158,7 +158,7 @@ Text lbl_reboot
Text lbl_sleep
Attributes
ID : 6
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -187,7 +187,7 @@ Text lbl_sleep
Text lbl_bright
Attributes
ID : 7
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -214,7 +214,7 @@ Text lbl_bright
Text lbl_dim
Attributes
ID : 8
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -241,7 +241,7 @@ Text lbl_dim
Text lbl_brightness
Attributes
ID : 16
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
diff --git a/hmi/dev/nspanel_us_code/boot.txt b/hmi/dev/nspanel_us_code/boot.txt
index 85af70ea..886bf1b7 100644
--- a/hmi/dev/nspanel_us_code/boot.txt
+++ b/hmi/dev/nspanel_us_code/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_us_code/qrcode.txt b/hmi/dev/nspanel_us_code/qrcode.txt
index 8ae5f6fd..36a81c21 100644
--- a/hmi/dev/nspanel_us_code/qrcode.txt
+++ b/hmi/dev/nspanel_us_code/qrcode.txt
@@ -72,7 +72,7 @@ QR Code qr
Effect Time : 300
Logo overlay : no
Text :
- Max. Text Size : 70
+ Max. Text Size : 78
Button button_back
Attributes
diff --git a/hmi/dev/nspanel_us_code/settings.txt b/hmi/dev/nspanel_us_code/settings.txt
index 9ff35e90..1b8ce8b2 100644
--- a/hmi/dev/nspanel_us_code/settings.txt
+++ b/hmi/dev/nspanel_us_code/settings.txt
@@ -124,7 +124,7 @@ Text dim_text
Text lbl_reboot
Attributes
ID : 5
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -160,7 +160,7 @@ Text lbl_reboot
Text lbl_sleep
Attributes
ID : 6
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -189,7 +189,7 @@ Text lbl_sleep
Text lbl_bright
Attributes
ID : 7
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -216,7 +216,7 @@ Text lbl_bright
Text lbl_dim
Attributes
ID : 8
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -243,7 +243,7 @@ Text lbl_dim
Text lbl_brightness
Attributes
ID : 16
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
diff --git a/hmi/dev/nspanel_us_land_code/boot.txt b/hmi/dev/nspanel_us_land_code/boot.txt
index 1e33db5c..6654a4a0 100644
--- a/hmi/dev/nspanel_us_land_code/boot.txt
+++ b/hmi/dev/nspanel_us_land_code/boot.txt
@@ -60,7 +60,7 @@ Variable (string) version
Attributes
ID : 6
Scope : global
- Text : 10
+ Text : 11
Max. Text Size: 3
Variable (int32) log_len
diff --git a/hmi/dev/nspanel_us_land_code/qrcode.txt b/hmi/dev/nspanel_us_land_code/qrcode.txt
index 6b71f0c6..4c628b3c 100644
--- a/hmi/dev/nspanel_us_land_code/qrcode.txt
+++ b/hmi/dev/nspanel_us_land_code/qrcode.txt
@@ -72,7 +72,7 @@ QR Code qr
Effect Time : 300
Logo overlay : no
Text :
- Max. Text Size : 70
+ Max. Text Size : 78
Button button_back
Attributes
diff --git a/hmi/dev/nspanel_us_land_code/settings.txt b/hmi/dev/nspanel_us_land_code/settings.txt
index 07c23e36..89e1809f 100644
--- a/hmi/dev/nspanel_us_land_code/settings.txt
+++ b/hmi/dev/nspanel_us_land_code/settings.txt
@@ -124,7 +124,7 @@ Text dim_text
Text lbl_reboot
Attributes
ID : 5
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -158,7 +158,7 @@ Text lbl_reboot
Text lbl_sleep
Attributes
ID : 6
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -187,7 +187,7 @@ Text lbl_sleep
Text lbl_bright
Attributes
ID : 7
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -214,7 +214,7 @@ Text lbl_bright
Text lbl_dim
Attributes
ID : 8
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
@@ -241,7 +241,7 @@ Text lbl_dim
Text lbl_brightness
Attributes
ID : 16
- Scope : global
+ Scope : local
Dragging : 0
Send Component ID : on press and release
Opacity : 127
diff --git a/hmi/nspanel_CJK_eu.HMI b/hmi/nspanel_CJK_eu.HMI
index ed287099..56810407 100644
Binary files a/hmi/nspanel_CJK_eu.HMI and b/hmi/nspanel_CJK_eu.HMI differ
diff --git a/hmi/nspanel_CJK_eu.tft b/hmi/nspanel_CJK_eu.tft
index 13afaed5..0c074d86 100644
Binary files a/hmi/nspanel_CJK_eu.tft and b/hmi/nspanel_CJK_eu.tft differ
diff --git a/hmi/nspanel_CJK_us.HMI b/hmi/nspanel_CJK_us.HMI
index dcac7d2d..eb551faf 100644
Binary files a/hmi/nspanel_CJK_us.HMI and b/hmi/nspanel_CJK_us.HMI differ
diff --git a/hmi/nspanel_CJK_us.tft b/hmi/nspanel_CJK_us.tft
index 8a0eef36..55110322 100644
Binary files a/hmi/nspanel_CJK_us.tft and b/hmi/nspanel_CJK_us.tft differ
diff --git a/hmi/nspanel_CJK_us_land.HMI b/hmi/nspanel_CJK_us_land.HMI
index d7b8a0dc..daa64a5a 100644
Binary files a/hmi/nspanel_CJK_us_land.HMI and b/hmi/nspanel_CJK_us_land.HMI differ
diff --git a/hmi/nspanel_CJK_us_land.tft b/hmi/nspanel_CJK_us_land.tft
index 3203e20b..5b6d996e 100644
Binary files a/hmi/nspanel_CJK_us_land.tft and b/hmi/nspanel_CJK_us_land.tft differ
diff --git a/hmi/nspanel_easy_landscape.hmi b/hmi/nspanel_easy_landscape.hmi
index 8a9e7bab..4c97163f 100644
Binary files a/hmi/nspanel_easy_landscape.hmi and b/hmi/nspanel_easy_landscape.hmi differ
diff --git a/hmi/nspanel_easy_landscape.tft b/hmi/nspanel_easy_landscape.tft
index 41e4c7f6..77763f19 100644
Binary files a/hmi/nspanel_easy_landscape.tft and b/hmi/nspanel_easy_landscape.tft differ
diff --git a/hmi/nspanel_eu.HMI b/hmi/nspanel_eu.HMI
index f52cbe14..052a0f9a 100644
Binary files a/hmi/nspanel_eu.HMI and b/hmi/nspanel_eu.HMI differ
diff --git a/hmi/nspanel_eu.tft b/hmi/nspanel_eu.tft
index e1d64419..3045dc68 100644
Binary files a/hmi/nspanel_eu.tft and b/hmi/nspanel_eu.tft differ
diff --git a/hmi/nspanel_us.HMI b/hmi/nspanel_us.HMI
index c24c81cb..b7a8de79 100644
Binary files a/hmi/nspanel_us.HMI and b/hmi/nspanel_us.HMI differ
diff --git a/hmi/nspanel_us.tft b/hmi/nspanel_us.tft
index 75f6c50a..05ade7b2 100644
Binary files a/hmi/nspanel_us.tft and b/hmi/nspanel_us.tft differ
diff --git a/hmi/nspanel_us_land.HMI b/hmi/nspanel_us_land.HMI
index 69fdec9e..633b3e87 100644
Binary files a/hmi/nspanel_us_land.HMI and b/hmi/nspanel_us_land.HMI differ
diff --git a/hmi/nspanel_us_land.tft b/hmi/nspanel_us_land.tft
index 65d6dea9..66a01d60 100644
Binary files a/hmi/nspanel_us_land.tft and b/hmi/nspanel_us_land.tft differ
diff --git a/nspanel_easy_blueprint.yaml b/nspanel_easy_blueprint.yaml
index dd0ded3d..3ecc0ac3 100644
--- a/nspanel_easy_blueprint.yaml
+++ b/nspanel_easy_blueprint.yaml
@@ -11,7 +11,7 @@ blueprint:
description: >
# NSPanel Easy Configuration via Blueprint
- **Blueprint release**: 9
+ **Blueprint release**: 10
This project enables comprehensive configuration of your NSPanel through a Blueprint featuring a user interface.
@@ -44,13 +44,6 @@ blueprint:
description: Select the language and date/time formats to be displayed in your panel.
collapsed: true
input:
- language:
- name: Language
- description: "Select the language for your NSPanel."
- default: en
- selector:
- language:
- languages: [en, bg, hr, ca, cs, da, nl, et, fi, fr, de, el, he, hu, id, it, ja, ko, lv, lt, nb, pl, pt, ro, ru, sk, sl, es, sv, th, tr, uk, zh-tw]
date_format:
name: Date Format
description: "Select the format for date to display."
@@ -60,26 +53,110 @@ blueprint:
multiple: false
custom_value: true
options:
- - label: 'Weekday, DD MMMM YYYY (ex. "Friday, 22 March 2024")'
+ # ── Full weekday · Full month name ──────────────────────────────────────
+ - label: 'Weekday, DD MMMM YYYY (ex. "Friday, 22 March 2024")'
value: '%A, %d %B %Y'
- - label: 'Weekday, DD.MM (ex. "Friday, 22.03")'
- value: '%A, %d.%m'
- - label: 'Weekday, DD.MM. (ex. "Friday, 22.03.")'
+ - label: 'Weekday, DD MMMM (ex. "Friday, 22 March")'
+ value: '%A, %d %B'
+ # ── Full weekday · Short month name ─────────────────────────────────────
+ - label: 'Weekday, DD MMM YYYY (ex. "Friday, 22 Mar 2024")'
+ value: '%A, %d %b %Y'
+ - label: 'Weekday, DD MMM (ex. "Friday, 22 Mar")'
+ value: '%A, %d %b'
+ - label: 'Weekday DD MMM (ex. "Friday 22 Mar")'
+ value: '%A %d %b'
+ # ── Full weekday · Numeric dot ───────────────────────────────────────────
+ - label: 'Weekday, DD.MM.YYYY (ex. "Friday, 22.03.2024")'
+ value: '%A, %d.%m.%Y'
+ - label: 'Weekday, DD.MM. (ex. "Friday, 22.03.")'
value: '%A, %d.%m.'
- - label: 'Weekday, DD/MM (ex. "Friday, 22/03")'
+ - label: 'Weekday, DD.MM (ex. "Friday, 22.03")'
+ value: '%A, %d.%m'
+ - label: 'Weekday D.M. (ex. "Friday 22.3.")'
+ value: '%A %-d.%-m.'
+ - label: 'Weekday D.M (ex. "Friday 22.3")'
+ value: '%A %-d.%-m'
+ # ── Full weekday · Numeric slash ─────────────────────────────────────────
+ - label: 'Weekday, DD/MM (ex. "Friday, 22/03")'
value: '%A, %d/%m'
- - label: 'Weekday, D/M (ex. "Friday, 22/3")'
+ - label: 'Weekday, D/M (ex. "Friday, 22/3")'
value: '%A, %-d/%-m'
- - label: 'Weekday, M/D (ex. "Friday, 3/22")'
+ - label: 'Weekday, M/D (ex. "Friday, 3/22")'
value: '%A, %-m/%-d'
- - label: 'Weekday D.M (ex. "Friday 22.3")'
- value: '%A %-d.%-m'
- - label: 'Weekday D.M. (ex. "Friday 22.3.")'
- value: '%A %-d.%-m.'
- - label: Weekday D-M (ex. "Friday 22-3")
+ # ── Full weekday · Numeric dash ──────────────────────────────────────────
+ - label: 'Weekday D-M (ex. "Friday 22-3")'
value: '%A %-d-%-m'
- - label: Weekday M-D (ex. "Friday 3-22")
+ - label: 'Weekday M-D (ex. "Friday 3-22")'
value: '%A %-m-%-d'
+ # ── Short weekday · Full month name ─────────────────────────────────────
+ - label: 'Wkd, DD MMMM YYYY (ex. "Fri, 22 March 2024")'
+ value: '%a, %d %B %Y'
+ - label: 'Wkd, DD MMMM (ex. "Fri, 22 March")'
+ value: '%a, %d %B'
+ # ── Short weekday · Short month name ────────────────────────────────────
+ - label: 'Wkd, DD MMM YYYY (ex. "Fri, 22 Mar 2024")'
+ value: '%a, %d %b %Y'
+ - label: 'Wkd, DD MMM (ex. "Fri, 22 Mar")'
+ value: '%a, %d %b'
+ - label: 'Wkd DD MMM (ex. "Fri 22 Mar")'
+ value: '%a %d %b'
+ # ── Short weekday · Numeric dot ──────────────────────────────────────────
+ - label: 'Wkd, DD.MM.YYYY (ex. "Fri, 22.03.2024")'
+ value: '%a, %d.%m.%Y'
+ - label: 'Wkd, DD.MM. (ex. "Fri, 22.03.")'
+ value: '%a, %d.%m.'
+ - label: 'Wkd, DD.MM (ex. "Fri, 22.03")'
+ value: '%a, %d.%m'
+ - label: 'Wkd D.M. (ex. "Fri 22.3.")'
+ value: '%a %-d.%-m.'
+ - label: 'Wkd D.M (ex. "Fri 22.3")'
+ value: '%a %-d.%-m'
+ # ── Short weekday · Numeric slash ────────────────────────────────────────
+ - label: 'Wkd, DD/MM (ex. "Fri, 22/03")'
+ value: '%a, %d/%m'
+ - label: 'Wkd, D/M (ex. "Fri, 22/3")'
+ value: '%a, %-d/%-m'
+ - label: 'Wkd, M/D (ex. "Fri, 3/22")'
+ value: '%a, %-m/%-d'
+ # ── Short weekday · Numeric dash ─────────────────────────────────────────
+ - label: 'Wkd D-M (ex. "Fri 22-3")'
+ value: '%a %-d-%-m'
+ - label: 'Wkd M-D (ex. "Fri 3-22")'
+ value: '%a %-m-%-d'
+ # ── No weekday · Full month name ─────────────────────────────────────────
+ - label: 'DD MMMM YYYY (ex. "22 March 2024")'
+ value: '%d %B %Y'
+ - label: 'DD MMMM (ex. "22 March")'
+ value: '%d %B'
+ - label: 'MMMM DD, YYYY (ex. "March 22, 2024")'
+ value: '%B %d, %Y'
+ # ── No weekday · Numeric dot ──────────────────────────────────────────────
+ - label: 'DD.MM.YYYY (ex. "22.03.2024")'
+ value: '%d.%m.%Y'
+ - label: 'DD.MM. (ex. "22.03.")'
+ value: '%d.%m.'
+ - label: 'DD.MM (ex. "22.03")'
+ value: '%d.%m'
+ - label: 'D.M (ex. "22.3")'
+ value: '%-d.%-m'
+ # ── No weekday · Numeric slash ────────────────────────────────────────────
+ - label: 'DD/MM/YYYY (ex. "22/03/2024")'
+ value: '%d/%m/%Y'
+ - label: 'DD/MM (ex. "22/03")'
+ value: '%d/%m'
+ - label: 'D/M (ex. "22/3")'
+ value: '%-d/%-m'
+ - label: 'MM/DD/YYYY (ex. "03/22/2024")'
+ value: '%m/%d/%Y'
+ - label: 'M/D (ex. "3/22")'
+ value: '%-m/%-d'
+ # ── No weekday · Numeric dash ─────────────────────────────────────────────
+ - label: 'DD-MM-YYYY (ex. "22-03-2024")'
+ value: '%d-%m-%Y'
+ - label: 'DD-MM (ex. "22-03")'
+ value: '%d-%m'
+ - label: 'YYYY-MM-DD (ex. "2024-03-22") [ISO 8601]'
+ value: '%Y-%m-%d'
time_format:
name: Time Format
description: "Choose how time should be displayed."
@@ -89,14 +166,34 @@ blueprint:
multiple: false
custom_value: true
options:
- - label: 'HH:MM (ex. 08:30 and 20:30)'
+ # ── 24h · Colon · Padded ─────────────────────────────────────────────────
+ # Common in most of the world as the standard digital clock format
+ - 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 %p'
- - label: 'H:MM 24H (ex. 8:30 and 20:30)'
+ # ── 24h · Colon · No leading zero ────────────────────────────────────────
+ # Common in German-speaking countries (de, at, ch) and Netherlands (nl)
+ - label: 'H:MM (ex. "8:30" and "20:30")'
value: '%-H:%M'
- - label: 'H.MM 24H (ex. 8.30 and 20.30)'
+ # ── 24h · Dot · Padded ───────────────────────────────────────────────────
+ # Conventional in Finland (fi), historically Germany (de), Poland (pl), Netherlands (nl)
+ - label: 'HH.MM (ex. "08.30" and "20.30")'
+ value: '%H.%M'
+ # ── 24h · Dot · No leading zero ──────────────────────────────────────────
+ # German informal (de): "8.30 Uhr", Dutch informal (nl): "8.30 uur"
+ - label: 'H.MM (ex. "8.30" and "20.30")'
value: '%-H.%M'
+ # ── 12h · Colon · Padded · AM/PM suffix ──────────────────────────────────
+ # Standard in English-speaking countries (en, af, cy, ms, sw)
+ - label: 'HH:MM AM/PM (ex. "08:30 AM" and "08:30 PM")'
+ value: '%I:%M %p'
+ # ── 12h · Colon · No leading zero · AM/PM suffix ─────────────────────────
+ # Most common 12h informal usage (en, hi, bn, ar, ur, pa)
+ - label: 'H:MM AM/PM (ex. "8:30 AM" and "8:30 PM")'
+ value: '%-I:%M %p'
+ # ── 12h · AM/PM prefix · Colon ───────────────────────────────────────────
+ # Conventional in Korean (ko) and sometimes Chinese (zh-cn, zh-tw)
+ - label: 'AM/PM H:MM (ex. "AM 8:30" and "PM 8:30")'
+ value: '%p %-I:%M'
temperature_unit:
name: Temperature Unit
description: "Select the temperature unit to display."
@@ -4114,7 +4211,7 @@ trigger_variables:
}}
variables:
- blueprint_version: 9
+ blueprint_version: 10
pages:
current: '{{ states(currentpage) }}'
alarm: "alarm"
@@ -4184,12 +4281,6 @@ triggers:
event_data:
device_id: !input nspanel_name
- - alias: Time pattern # Triggers every minute to update the date
- id: time_state
- trigger: time_pattern
- minutes: 0
- seconds: 0
-
- alias: Automation reloaded
id: automation_reloaded
trigger: event
@@ -5122,10 +5213,6 @@ actions:
)
}}
- date_format_temp: !input 'date_format'
- # Avoid breaking change for existing users with legacy type format
- date_format: '{{ date_format_temp if date_format_temp not in ["%d.%m", "%d/%m", "%-d/%-m", "%-m/%-d"] else "%A, " ~ date_format_temp }}'
-
# yamllint disable rule:line-length rule:braces
device_class_icons:
cover: { "awning-closed": "window-closed", "awning-closing": "arrow-down-box", "awning-open": "window-open", "awning-opening": "arrow-up-box", "blind-closed": "blinds-horizontal-closed", "blind-closing": "arrow-down-box", "blind-open": "blinds-horizontal", "blind-opening": "arrow-up-box", "curtain-closed": "curtains-closed", "curtains-closing": "arrow-collapse-horizontal", "curtains-open": "curtains-open", "arrow-split-vertical": "curtains-open", "damper-closed": "circle-slice-8", "damper-closing": "circle", "damper-open": "circle", "damper-opening": "circle", "door-closed": "door-closed", "door-closing": "door-open", "door-open": "door-open", "door-opening": "door-open", "garage-closed": "garage", "garage-closing": "arrow-down-box", "garage-open": "garage-open", "garage-opening": "arrow-up-box", "gate-closed": "gate", "gate-closing": "gate-arrow-right", "gate-open": "gate-open", "gate-opening": "gate-arrow-left", "shade-closed": "roller-shade-closed", "shade-closing": "arrow-down-box", "shade-open": "roller-shade", "shade-opening": "arrow-up-box", "shutter-closed": "window-shutter", "shutter-closing": "arrow-down-box", "shutter-open": "window-shutter-open", "shutter-opening": "arrow-up-box", "window-closed": "window-closed", "window-closing": "arrow-down-box", "window-open": "window-open", "window-opening": "arrow-up-box" }
@@ -5260,2603 +5347,6 @@ actions:
unknown: 1
unavailable: 1
- ##### MUI Multilingual User Interface #####
- language_tmp: !input 'language'
- language: >
- {{
- language_tmp
- if language_tmp is string
- and language_tmp in ["ar", "bg", "hr", "ca", "cs", "da", "nl", "et", "fi", "fr", "de", "el", "he", "hu", "id", "it",
- "ja","ko", "lv", "lt", "nb", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr", "uk", "zh-tw"]
- else "en"
- }}
-
- mui:
- ar: # Arabic
- bytes_per_char: 2
- 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: بعد يومين
- in_3_days: بعد ثلاثة أيام
- in_4_days: بعد أربعة أيام
- climate:
- states:
- "on": مشغل
- "off": مطفأ
- heat: تدفئة
- please_confirm: يرجى التأكيد
- unavailable: غير متاح
- unknown: مجهول
- no_name: بدون اسم
- alarm:
- home: في المنزل
- away: بعيد
- night: ليل
- vacation: إجازة
- bypass: تجاوز
- disarm: نزع السلاح
- settings:
- reboot: إعادة تشغيل
- sleep: وضع النوم
- brightness: سطوع
- bright: مشرق
- dimming: تعتيم
- dim: خافت
- meridiem:
- am: صباحاً
- pm: مساءً
- bg: # Bulgarian
- bytes_per_char: 1
- 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: Недостъпен
- unknown: Неизвестен
- no_name: Няма име
- alarm:
- home: Вкъщи
- away: Навън
- night: Нощ
- vacation: Ваканция
- bypass: Заобикаляне
- disarm: Разоръжаване
- settings:
- reboot: Рестартиране
- sleep: Сън
- brightness: Яркост
- bright: Ярък
- dimming: Затъмняване
- dim: Тъмен
- meridiem:
- am: AM
- pm: PM
- ca: # Catalan
- bytes_per_char: 1
- weekdays:
- mon: Dilluns
- tue: Dimarts
- wed: Dimecres
- thu: Dijous
- fri: Divendres
- sat: Dissabte
- sun: Diumenge
- weekdays_short:
- mon: Dl
- tue: Dt
- wed: Dc
- thu: Dj
- fri: Dv
- sat: Ds
- sun: Dg
- months:
- jan: Gener
- feb: Febrer
- mar: Març
- apr: Abril
- may: Maig
- jun: Juny
- jul: Juliol
- aug: Agost
- sep: Setembre
- oct: Octubre
- nov: Novembre
- dec: Desembre
- months_short:
- jan: Gen
- feb: Feb
- mar: Mar
- apr: Abr
- may: Mai
- jun: Jun
- jul: Jul
- aug: Ago
- sep: Set
- oct: Oct
- nov: Nov
- dec: Des
- relative_day:
- today: Avui
- tomorrow: Demà
- in_2_days: En 2 dies
- in_3_days: En 3 dies
- in_4_days: En 4 dies
- climate:
- states:
- 'on': Encès
- 'off': Apagat
- heat: Escalfar
- please_confirm: Si us plau, confirmi
- unavailable: No disponible
- unknown: Desconegut
- no_name: Sense nom
- alarm:
- home: Casa
- away: Fora
- night: Nit
- vacation: Vacances
- bypass: Bypass
- disarm: Desactivar
- settings:
- reboot: Reiniciar
- sleep: Dormir
- brightness: Brillantor
- bright: Brillant
- dimming: Atenuació
- dim: Fosc
- meridiem:
- am: a.m.
- pm: p.m.
- cs: # Czech
- bytes_per_char: 1
- weekdays:
- mon: Pondělí
- tue: Úterý
- wed: Středa
- thu: Čtvrtek
- fri: Pátek
- sat: Sobota
- sun: Neděle
- weekdays_short:
- mon: Po
- tue: Út
- wed: St
- thu: Čt
- fri: Pá
- sat: So
- sun: Ne
- months:
- jan: Leden
- feb: Únor
- mar: Březen
- apr: Duben
- may: Květen
- jun: Červen
- jul: Červenec
- aug: Srpen
- sep: Září
- oct: Říjen
- nov: Listopad
- dec: Prosinec
- months_short:
- jan: Led
- feb: Úno
- mar: Bře
- apr: Dub
- may: Kvě
- jun: Čvn
- jul: Čvc
- aug: Srp
- sep: Zář
- oct: Říj
- nov: Lis
- dec: Pro
- relative_day:
- today: Dnes
- tomorrow: Zítra
- in_2_days: Za 2 dny
- in_3_days: Za 3 dny
- in_4_days: Za 4 dny
- climate:
- states:
- "on": Zapnuto
- "off": Vypnuto
- heat: Topení
- please_confirm: Prosím, potvrďte
- unavailable: Nedostupné
- unknown: Neznámý
- no_name: Bez názvu
- alarm:
- home: Doma
- away: Pryč
- night: Noc
- vacation: Dovolená
- bypass: Obcházet
- disarm: Odjistit
- settings:
- reboot: Restart
- sleep: Spánek
- brightness: Jas
- bright: Světlý
- dimming: Ztmavení
- dim: Tmavý
- meridiem:
- am: dop.
- pm: odp.
- da: # Danish
- bytes_per_char: 1
- weekdays:
- mon: Mandag
- tue: Tirsdag
- wed: Onsdag
- thu: Torsdag
- fri: Fredag
- sat: Lørdag
- sun: Søndag
- weekdays_short:
- mon: Man
- tue: Tir
- wed: Ons
- thu: Tor
- fri: Fre
- sat: Lør
- sun: Søn
- months:
- jan: Januar
- feb: Februar
- mar: Marts
- apr: April
- may: Maj
- jun: Juni
- jul: Juli
- aug: August
- sep: September
- oct: Oktober
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Maj
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Okt
- 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": Tændt
- "off": Slukket
- heat: Varme
- please_confirm: Bekræft venligst
- unavailable: Utilgængelig
- unknown: Ukendt
- no_name: Intet navn
- alarm:
- home: Hjemme
- away: Væk
- night: Nat
- vacation: Ferie
- bypass: Omkørsel
- disarm: Afvæbne
- settings:
- reboot: Genstart
- sleep: Sove
- brightness: Lysstyrke
- bright: Lys
- dimming: Dæmpning
- dim: Dæmpet
- meridiem:
- am: FM
- pm: EM
- de: # German
- bytes_per_char: 1
- weekdays:
- mon: Montag
- tue: Dienstag
- wed: Mittwoch
- thu: Donnerstag
- fri: Freitag
- sat: Samstag
- sun: Sonntag
- weekdays_short:
- mon: Mo
- tue: Di
- wed: Mi
- thu: Do
- fri: Fr
- sat: Sa
- sun: So
- months:
- jan: Januar
- feb: Februar
- mar: März
- apr: April
- may: Mai
- jun: Juni
- jul: Juli
- aug: August
- sep: September
- oct: Oktober
- nov: November
- dec: Dezember
- months_short:
- jan: Jan
- feb: Feb
- mar: Mär
- apr: Apr
- may: Mai
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Dez
- relative_day:
- today: Heute
- tomorrow: Morgen
- in_2_days: In 2 Tagen
- in_3_days: In 3 Tagen
- in_4_days: In 4 Tagen
- climate:
- states:
- "on": Ein
- "off": Aus
- heat: Heizen
- please_confirm: Bitte bestätigen
- unavailable: Nicht verfügbar
- unknown: Unbekannt
- no_name: Kein Name
- alarm:
- home: Zuhause
- away: Abwesend
- night: Nacht
- vacation: Urlaub
- bypass: Umgehen
- disarm: Aus
- settings:
- reboot: Neustart
- sleep: Schlafmodus
- brightness: Helligkeit
- bright: Hell
- dimming: Dimmen
- dim: Gedimmt
- meridiem:
- am: vorm.
- pm: nachm.
- el: # Greek
- bytes_per_char: 2
- 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: Μη διαθέσιμο
- unknown: Άγνωστο
- no_name: Χωρίς όνομα
- alarm:
- home: Σπίτι
- away: Μακριά
- night: Νύχτα
- vacation: Διακοπές
- bypass: Παράκαμψη
- disarm: Αφοπλισμός
- settings:
- reboot: Επανεκκίνηση
- sleep: Ύπνος
- brightness: Φωτεινότητα
- bright: Φωτεινό
- dimming: Σκίαση
- dim: Σκοτεινό
- meridiem:
- am: πμ
- pm: μμ
- en: # English
- bytes_per_char: 1
- 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
- unknown: Unknown
- no_name: No name
- 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
- meridiem:
- am: AM
- pm: PM
- es: # Spanish
- bytes_per_char: 1
- weekdays:
- mon: Lunes
- tue: Martes
- wed: Miércoles
- thu: Jueves
- fri: Viernes
- sat: Sábado
- sun: Domingo
- weekdays_short:
- mon: Lun
- tue: Mar
- wed: Mié
- thu: Jue
- fri: Vie
- sat: Sáb
- sun: Dom
- months:
- jan: Enero
- feb: Febrero
- mar: Marzo
- apr: Abril
- may: Mayo
- jun: Junio
- jul: Julio
- aug: Agosto
- sep: Septiembre
- oct: Octubre
- nov: Noviembre
- dec: Diciembre
- months_short:
- jan: Ene
- feb: Feb
- mar: Mar
- apr: Abr
- may: May
- jun: Jun
- jul: Jul
- aug: Ago
- sep: Sep
- oct: Oct
- nov: Nov
- dec: Dic
- relative_day:
- today: Hoy
- tomorrow: Mañana
- in_2_days: En 2 días
- in_3_days: En 3 días
- in_4_days: En 4 días
- climate:
- states:
- "on": Encendido
- "off": Apagado
- heat: Calentar
- please_confirm: Por favor, confirme
- unavailable: No disponible
- unknown: Desconocido
- no_name: Sin nombre
- 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
- meridiem:
- am: a.m.
- pm: p.m.
- et: # Estonian
- bytes_per_char: 1
- weekdays:
- mon: Esmaspäev
- tue: Teisipäev
- wed: Kolmapäev
- thu: Neljapäev
- fri: Reede
- sat: Laupäev
- sun: Pühapäev
- weekdays_short:
- mon: E
- tue: T
- wed: K
- thu: N
- fri: R
- sat: L
- sun: P
- months:
- jan: Jaanuar
- feb: Veebruar
- mar: Märts
- apr: Aprill
- may: Mai
- jun: Juuni
- jul: Juuli
- aug: August
- sep: September
- oct: Oktoober
- nov: November
- dec: Detsember
- months_short:
- jan: Jan
- feb: Veb
- mar: Mär
- apr: Apr
- may: Mai
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Dets
- relative_day:
- today: Täna
- tomorrow: Homme
- in_2_days: 2 päeva pärast
- in_3_days: 3 päeva pärast
- in_4_days: 4 päeva pärast
- climate:
- states:
- "on": sees
- "off": väljas
- heat: kütte
- please_confirm: Palun kinnitage
- unavailable: Pole saadaval
- unknown: Tundmatu
- no_name: Nime pole
- alarm:
- home: Kodus
- away: Ära
- night: Öö
- vacation: Puhkus
- bypass: Möödaviik
- disarm: Desarmeerima
- settings:
- reboot: Taaskäivita
- sleep: Uni
- brightness: Heledus
- bright: Ere
- dimming: Hämardamine
- dim: Hämar
- meridiem:
- am: e.l.
- pm: p.l.
- fi: # Finnish
- bytes_per_char: 1
- weekdays:
- mon: maanantai
- tue: tiistai
- wed: keskiviikko
- thu: torstai
- fri: perjantai
- sat: lauantai
- sun: sunnuntai
- weekdays_short:
- mon: ma
- tue: ti
- wed: ke
- thu: to
- fri: pe
- sat: la
- sun: su
- months:
- jan: tammikuu
- feb: helmikuu
- mar: maaliskuu
- apr: huhtikuu
- may: toukokuu
- jun: kesäkuu
- jul: heinäkuu
- aug: elokuu
- sep: syyskuu
- oct: lokakuu
- nov: marraskuu
- dec: joulukuu
- months_short:
- jan: tammi
- feb: helmi
- mar: maalis
- apr: huhti
- may: touko
- jun: kesä
- jul: heinä
- aug: elo
- sep: syys
- oct: loka
- nov: marras
- dec: joulu
- relative_day:
- today: Tänään
- tomorrow: Huomenna
- in_2_days: 2 päivän päästä
- in_3_days: 3 päivän päästä
- in_4_days: 4 päivän päästä
- climate:
- states:
- "on": päällä
- "off": pois päältä
- heat: lämpö
- please_confirm: Vahvista
- unavailable: Ei saatavilla
- unknown: Tuntematon
- no_name: Nimeämätön
- alarm:
- home: Kotona
- away: Poissa
- night: Yö
- vacation: Loma
- bypass: Ohitus
- disarm: Pois päältä
- settings:
- reboot: Käynnistä uudelleen
- sleep: Lepotila
- brightness: Kirkkaus
- bright: Kirkas
- dimming: Himmennys
- dim: Himmeä
- meridiem:
- am: aamupäivä
- pm: iltapäivä
- fr: # French
- bytes_per_char: 1
- weekdays:
- mon: Lundi
- tue: Mardi
- wed: Mercredi
- thu: Jeudi
- fri: Vendredi
- sat: Samedi
- sun: Dimanche
- weekdays_short:
- mon: Lun
- tue: Mar
- wed: Mer
- thu: Jeu
- fri: Ven
- sat: Sam
- sun: Dim
- months:
- jan: Janvier
- feb: Février
- mar: Mars
- apr: Avril
- may: Mai
- jun: Juin
- jul: Juillet
- aug: Août
- sep: Septembre
- oct: Octobre
- nov: Novembre
- dec: Décembre
- months_short:
- jan: Jan
- feb: Fév
- mar: Mar
- apr: Avr
- may: Mai
- jun: Jun
- jul: Jul
- aug: Aoû
- sep: Sep
- oct: Oct
- nov: Nov
- dec: Déc
- relative_day:
- today: Aujourd'hui
- tomorrow: Demain
- in_2_days: Dans 2 jours
- in_3_days: Dans 3 jours
- in_4_days: Dans 4 jours
- climate:
- states:
- "on": Activé
- "off": Désactivé
- heat: Chauffage
- please_confirm: Veuillez confirmer
- unavailable: Indisponible
- unknown: Inconnu
- no_name: Sans nom
- alarm:
- home: À la maison
- away: Absent
- night: Nuit
- vacation: Vacances
- bypass: Contournement
- disarm: Désarmer
- settings:
- reboot: Redémarrer
- sleep: Veille
- brightness: Luminosité
- bright: Lumineux
- dimming: Atténuation
- dim: Sombre
- meridiem:
- am: AM
- pm: PM
- he: # Hebrew
- bytes_per_char: 2
- 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: םיימוי דוע
- in_3_days: םימי 3 דוע
- in_4_days: םימי 4 דוע
- climate:
- states:
- "on": ליעפ
- "off": יובכ
- heat: םומיח
- please_confirm: רשא אנא
- unavailable: ןימז אל
- unknown: עודי אל
- no_name: םש אלל
- alarm:
- home: תיבב
- away: הצוחה
- night: הליל
- vacation: השפוח
- bypass: הפיקע
- disarm: לורטנ
- settings:
- reboot: שדחמ הלעפה
- sleep: הניש
- brightness: תוריהב
- bright: ריהב
- dimming: הכשחה
- dim: ההכ
- meridiem:
- am: צ"הנפל
- pm: צ"החא
- hr: # Croatian
- bytes_per_char: 1
- weekdays:
- mon: Ponedjeljak
- tue: Utorak
- wed: Srijeda
- thu: Četvrtak
- fri: Petak
- sat: Subota
- sun: Nedjelja
- weekdays_short:
- mon: Pon
- tue: Uto
- wed: Sri
- thu: Čet
- fri: Pet
- sat: Sub
- sun: Ned
- months:
- jan: Siječanj
- feb: Veljača
- mar: Ožujak
- apr: Travanj
- may: Svibanj
- jun: Lipanj
- jul: Srpanj
- aug: Kolovoz
- sep: Rujan
- oct: Listopad
- nov: Studeni
- dec: Prosinac
- months_short:
- jan: Sij
- feb: Velj
- mar: Ožu
- apr: Tra
- may: Svi
- jun: Lip
- jul: Srp
- aug: Kol
- sep: Ruj
- oct: Lis
- nov: Stu
- dec: Pro
- relative_day:
- today: Danas
- tomorrow: Sutra
- in_2_days: Za 2 dana
- in_3_days: Za 3 dana
- in_4_days: Za 4 dana
- climate:
- states:
- "on": Uključeno
- "off": Isključeno
- heat: Grijanje
- please_confirm: Molimo potvrdite
- unavailable: Nedostupno
- unknown: Nepoznato
- no_name: Bez imena
- alarm:
- home: Kod kuće
- away: Odsutan
- night: Noć
- vacation: Odmor
- bypass: Zaobići
- disarm: Razoružati
- settings:
- reboot: Ponovno pokretanje
- sleep: Spavanje
- brightness: Svjetlina
- bright: Svijetlo
- dimming: Zatamnjenje
- dim: Tamno
- meridiem:
- am: AM
- pm: PM
- hu: # Hungarian
- bytes_per_char: 1
- weekdays:
- mon: Hétfő
- tue: Kedd
- wed: Szerda
- thu: Csütörtök
- fri: Péntek
- sat: Szombat
- sun: Vasárnap
- weekdays_short:
- mon: H
- tue: K
- wed: Sze
- thu: Cs
- fri: P
- sat: Szo
- sun: V
- months:
- jan: Január
- feb: Február
- mar: Március
- apr: Április
- may: Május
- jun: Június
- jul: Július
- aug: Augusztus
- sep: Szeptember
- oct: Október
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Márc
- apr: Ápr
- may: Máj
- jun: Jún
- jul: Júl
- aug: Aug
- sep: Szep
- oct: Okt
- nov: Nov
- dec: Dec
- relative_day:
- today: Ma
- tomorrow: Holnap
- in_2_days: 2 nap múlva
- in_3_days: 3 nap múlva
- in_4_days: 4 nap múlva
- climate:
- states:
- "on": Bekapcsolva
- "off": Kikapcsolva
- heat: Fűtés
- please_confirm: Kérjük, erősítse meg
- unavailable: Nem elérhető
- unknown: Ismeretlen
- no_name: Névtelen
- alarm:
- home: Otthon
- away: Távol
- night: Éjszaka
- vacation: Szabadság
- bypass: Kerülő
- disarm: Hatástalanítás
- settings:
- reboot: Újraindítás
- sleep: Alvás
- brightness: Fényerő
- bright: Világos
- dimming: Sötétítés
- dim: Sötét
- meridiem:
- am: DE
- pm: DU
- id: # Indonesian
- bytes_per_char: 1
- weekdays:
- mon: Senin
- tue: Selasa
- wed: Rabu
- thu: Kamis
- fri: Jumat
- sat: Sabtu
- sun: Minggu
- weekdays_short:
- mon: Sen
- tue: Sel
- wed: Rab
- thu: Kam
- fri: Jum
- sat: Sab
- sun: Min
- months:
- jan: Januari
- feb: Februari
- mar: Maret
- apr: April
- may: Mei
- jun: Juni
- jul: Juli
- aug: Agustus
- sep: September
- oct: Oktober
- nov: November
- dec: Desember
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Mei
- jun: Jun
- jul: Jul
- aug: Agu
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Des
- relative_day:
- today: Hari ini
- tomorrow: Besok
- in_2_days: Dalam 2 hari
- in_3_days: Dalam 3 hari
- in_4_days: Dalam 4 hari
- climate:
- states:
- "on": Menyala
- "off": Mati
- heat: Pemanas
- please_confirm: Mohon konfirmasi
- unavailable: Tidak tersedia
- unknown: Tidak diketahui
- no_name: Tanpa nama
- alarm:
- home: Di rumah
- away: Jauh
- night: Malam
- vacation: Liburan
- bypass: Bypass
- disarm: Menonaktifkan
- settings:
- reboot: Mulai ulang
- sleep: Tidur
- brightness: Kecerahan
- bright: Terang
- dimming: Redup
- dim: Redup
- meridiem:
- am: AM
- pm: PM
- it: # Italian
- bytes_per_char: 1
- weekdays:
- mon: Lunedì
- tue: Martedì
- wed: Mercoledì
- thu: Giovedì
- fri: Venerdì
- sat: Sabato
- sun: Domenica
- weekdays_short:
- mon: Lun
- tue: Mar
- wed: Mer
- thu: Gio
- fri: Ven
- sat: Sab
- sun: Dom
- months:
- jan: Gennaio
- feb: Febbraio
- mar: Marzo
- apr: Aprile
- may: Maggio
- jun: Giugno
- jul: Luglio
- aug: Agosto
- sep: Settembre
- oct: Ottobre
- nov: Novembre
- dec: Dicembre
- months_short:
- jan: Gen
- feb: Feb
- mar: Mar
- apr: Apr
- may: Mag
- jun: Giu
- jul: Lug
- aug: Ago
- sep: Set
- oct: Ott
- nov: Nov
- dec: Dic
- relative_day:
- today: Oggi
- tomorrow: Domani
- in_2_days: Dopodomani
- in_3_days: In 3 giorni
- in_4_days: In 4 giorni
- climate:
- states:
- "on": Acceso
- "off": Spento
- heat: Riscaldamento
- please_confirm: Confermare
- unavailable: Non disponibile
- unknown: Sconosciuto
- no_name: Senza nome
- alarm:
- home: Casa
- away: Fuori casa
- night: Notte
- vacation: Vacanza
- bypass: Bypass
- disarm: Disarmato
- settings:
- reboot: Riavvio
- sleep: Modalità ECO
- brightness: Luminosità
- bright: Luminoso
- dimming: Diminuzione
- dim: Diminuito
- meridiem:
- am: AM
- pm: PM
- ja: # Japanese
- bytes_per_char: 3
- weekdays:
- mon: 月曜日
- tue: 火曜日
- wed: 水曜日
- thu: 木曜日
- fri: 金曜日
- sat: 土曜日
- sun: 日曜日
- weekdays_short:
- mon: 月
- tue: 火
- wed: 水
- thu: 木
- fri: 金
- sat: 土
- sun: 日
- months:
- jan: 1月
- feb: 2月
- mar: 3月
- apr: 4月
- may: 5月
- jun: 6月
- jul: 7月
- aug: 8月
- sep: 9月
- oct: 10月
- nov: 11月
- dec: 12月
- months_short:
- jan: 1月
- feb: 2月
- mar: 3月
- apr: 4月
- may: 5月
- jun: 6月
- jul: 7月
- aug: 8月
- sep: 9月
- oct: 10月
- nov: 11月
- dec: 12月
- relative_day:
- today: 今日
- tomorrow: 明日
- in_2_days: 明後日
- in_3_days: 3日後
- in_4_days: 4日後
- climate:
- states:
- "on": オン
- "off": オフ
- heat: 暖房
- please_confirm: 確認してください
- unavailable: 利用不可
- unknown: 不明
- no_name: 名前なし
- alarm:
- home: 自宅
- away: 外出
- night: 夜間
- vacation: 休暇
- bypass: バイパス
- disarm: 解除
- settings:
- reboot: 再起動
- sleep: スリープモード
- brightness: 明るさ
- bright: 明るい
- dimming: 調光
- dim: 低輝度
- meridiem:
- am: 午前
- pm: 午後
- ko: # Korean
- bytes_per_char: 3
- weekdays:
- mon: 월요일
- tue: 화요일
- wed: 수요일
- thu: 목요일
- fri: 금요일
- sat: 토요일
- sun: 일요일
- weekdays_short:
- mon: 월
- tue: 화
- wed: 수
- thu: 목
- fri: 금
- sat: 토
- sun: 일
- months:
- jan: 1월
- feb: 2월
- mar: 3월
- apr: 4월
- may: 5월
- jun: 6월
- jul: 7월
- aug: 8월
- sep: 9월
- oct: 10월
- nov: 11월
- dec: 12월
- months_short:
- jan: 1월
- feb: 2월
- mar: 3월
- apr: 4월
- may: 5월
- jun: 6월
- jul: 7월
- aug: 8월
- sep: 9월
- oct: 10월
- nov: 11월
- dec: 12월
- relative_day:
- today: 오늘
- tomorrow: 내일
- in_2_days: 이틀 후
- in_3_days: 사흘 후
- in_4_days: 나흘 후
- climate:
- states:
- "on": 켜짐
- "off": 꺼짐
- heat: 난방
- please_confirm: 확인해 주세요
- unavailable: 사용 불가
- unknown: 알 수 없음
- no_name: 이름 없음
- alarm:
- home: 집
- away: 외출
- night: 밤
- vacation: 휴가
- bypass: 우회
- disarm: 해제
- settings:
- reboot: 재부팅
- sleep: 슬립 모드
- brightness: 밝기
- bright: 밝은
- dimming: 조광
- dim: 어두운
- meridiem:
- am: 오전
- pm: 오후
- lt: # Lithuanian
- bytes_per_char: 1
- weekdays:
- mon: Pirmadienis
- tue: Antradienis
- wed: Trečiadienis
- thu: Ketvirtadienis
- fri: Penktadienis
- sat: Šeštadienis
- sun: Sekmadienis
- weekdays_short:
- mon: Pir
- tue: Ant
- wed: Tre
- thu: Ket
- fri: Pen
- sat: Šeš
- sun: Sek
- months:
- jan: Sausis
- feb: Vasaris
- mar: Kovas
- apr: Balandis
- may: Gegužė
- jun: Birželis
- jul: Liepa
- aug: Rugpjūtis
- sep: Rugsėjis
- oct: Spalis
- nov: Lapkritis
- dec: Gruodis
- months_short:
- jan: Sau
- feb: Vas
- mar: Kov
- apr: Bal
- may: Geg
- jun: Bir
- jul: Lie
- aug: Rgp
- sep: Rgs
- oct: Spa
- nov: Lap
- dec: Gru
- relative_day:
- today: Šiandien
- tomorrow: Rytoj
- in_2_days: Po 2 dienų
- in_3_days: Po 3 dienų
- in_4_days: Po 4 dienų
- climate:
- states:
- "on": Įjungta
- "off": Išjungta
- heat: Šildymas
- please_confirm: Prašome patvirtinti
- unavailable: Nepasiekiamas
- unknown: Nežinomas
- no_name: Be pavadinimo
- alarm:
- home: Namuose
- away: Išvykęs
- night: Naktis
- vacation: Atostogos
- bypass: Apeiti
- disarm: Išjungti
- settings:
- reboot: Perkrauti
- sleep: Miego režimas
- brightness: Ryškumas
- bright: Ryškus
- dimming: Tamsinimas
- dim: Tamsus
- meridiem:
- am: AM
- pm: PM
- lv: # Latvian
- bytes_per_char: 1
- weekdays:
- mon: Pirmdiena
- tue: Otrdiena
- wed: Trešdiena
- thu: Ceturtdiena
- fri: Piektdiena
- sat: Sestdiena
- sun: Svētdiena
- weekdays_short:
- mon: Pir
- tue: Otr
- wed: Tre
- thu: Cet
- fri: Pie
- sat: Ses
- sun: Sve
- months:
- jan: Janvāris
- feb: Februāris
- mar: Marts
- apr: Aprīlis
- may: Maijs
- jun: Jūnijs
- jul: Jūlijs
- aug: Augusts
- sep: Septembris
- oct: Oktobris
- nov: Novembris
- dec: Decembris
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Mai
- jun: Jūn
- jul: Jūl
- aug: Aug
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Dec
- relative_day:
- today: Šodien
- tomorrow: Rīt
- in_2_days: Pēc 2 dienām
- in_3_days: Pēc 3 dienām
- in_4_days: Pēc 4 dienām
- climate:
- states:
- "on": Ieslēgts
- "off": Izslēgts
- heat: Apkure
- please_confirm: Lūdzu, apstipriniet
- unavailable: Nav pieejams
- unknown: Nezināms
- no_name: Bez nosaukuma
- alarm:
- home: Mājās
- away: Projām
- night: Nakts
- vacation: Atvaļinājums
- bypass: Aplūkošana
- disarm: Atbruņošana
- settings:
- reboot: Restartēt
- sleep: Miega režīms
- brightness: Spilgtums
- bright: Spilgts
- dimming: Tumšošana
- dim: Tumšs
- meridiem:
- am: AM
- pm: PM
- nb: # Norwegian Bokmål
- bytes_per_char: 1
- weekdays:
- mon: Mandag
- tue: Tirsdag
- wed: Onsdag
- thu: Torsdag
- fri: Fredag
- sat: Lørdag
- sun: Søndag
- weekdays_short:
- mon: Man
- tue: Tir
- wed: Ons
- thu: Tor
- fri: Fre
- sat: Lør
- sun: Søn
- months:
- jan: Januar
- feb: Februar
- mar: Mars
- apr: April
- may: Mai
- jun: Juni
- jul: Juli
- aug: August
- sep: September
- oct: Oktober
- nov: November
- dec: Desember
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Mai
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Des
- relative_day:
- today: I dag
- tomorrow: I morgen
- in_2_days: Om 2 dager
- in_3_days: Om 3 dager
- in_4_days: Om 4 dager
- climate:
- states:
- "on": På
- "off": Av
- heat: Varme
- please_confirm: Vennligst bekreft
- unavailable: Utilgjengelig
- unknown: Ukjent
- no_name: Ingen navn
- alarm:
- home: Hjemme
- away: Borte
- night: Natt
- vacation: Ferie
- bypass: Omkjøring
- disarm: Avvæpne
- settings:
- reboot: Start på nytt
- sleep: Søvnmodus
- brightness: Lysstyrke
- bright: Lys
- dimming: Demping
- dim: Dimmet
- meridiem:
- am: AM
- pm: PM
- nl: # Dutch
- bytes_per_char: 1
- 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: Mrt
- 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: Verwarming
- please_confirm: Bevestig alstublieft
- unavailable: Niet beschikbaar
- unknown: Onbekend
- no_name: Geen naam
- alarm:
- home: Thuis
- away: Weg
- night: Nacht
- vacation: Vakantie
- bypass: Omzeilen
- disarm: Uit
- settings:
- reboot: Herstarten
- sleep: Slaapstand
- brightness: Helderheid
- bright: Helder
- dimming: Dimmen
- dim: Gedimd
- meridiem:
- am: AM
- pm: PM
- pl: # Polish
- bytes_per_char: 1
- weekdays:
- mon: Poniedziałek
- tue: Wtorek
- wed: Środa
- thu: Czwartek
- fri: Piątek
- sat: Sobota
- sun: Niedziela
- weekdays_short:
- mon: Pon
- tue: Wt
- wed: Śr
- thu: Czw
- fri: Pt
- sat: Sob
- sun: Ndz
- months:
- jan: Styczeń
- feb: Luty
- mar: Marzec
- apr: Kwiecień
- may: Maj
- jun: Czerwiec
- jul: Lipiec
- aug: Sierpień
- sep: Wrzesień
- oct: Październik
- nov: Listopad
- dec: Grudzień
- months_short:
- jan: Sty
- feb: Lut
- mar: Mar
- apr: Kwi
- may: Maj
- jun: Cze
- jul: Lip
- aug: Sie
- sep: Wrz
- oct: Paź
- nov: Lis
- dec: Gru
- relative_day:
- today: Dzisiaj
- tomorrow: Jutro
- in_2_days: Za 2 dni
- in_3_days: Za 3 dni
- in_4_days: Za 4 dni
- climate:
- states:
- "on": Włączony
- "off": Wyłączony
- heat: Ogrzewanie
- please_confirm: Proszę potwierdzić
- unavailable: Niedostępny
- unknown: Nieznany
- no_name: Bez nazwy
- alarm:
- home: W domu
- away: Poza domem
- night: Noc
- vacation: Wakacje
- bypass: Obejście
- disarm: Rozbroić
- settings:
- reboot: Restart
- sleep: Tryb uśpienia
- brightness: Jasność
- bright: Jasny
- dimming: Ściemnianie
- dim: Ciemny
- meridiem:
- am: AM
- pm: PM
- pt: # Portuguese
- bytes_per_char: 1
- weekdays:
- mon: Segunda-feira
- tue: Terça-feira
- wed: Quarta-feira
- thu: Quinta-feira
- fri: Sexta-feira
- sat: Sábado
- sun: Domingo
- weekdays_short:
- mon: Seg
- tue: Ter
- wed: Qua
- thu: Qui
- fri: Sex
- sat: Sáb
- sun: Dom
- months:
- jan: Janeiro
- feb: Fevereiro
- mar: Março
- apr: Abril
- may: Maio
- jun: Junho
- jul: Julho
- aug: Agosto
- sep: Setembro
- oct: Outubro
- nov: Novembro
- dec: Dezembro
- months_short:
- jan: Jan
- feb: Fev
- mar: Mar
- apr: Abr
- may: Mai
- jun: Jun
- jul: Jul
- aug: Ago
- sep: Set
- oct: Out
- nov: Nov
- dec: Dez
- relative_day:
- today: Hoje
- tomorrow: Amanhã
- in_2_days: Em 2 dias
- in_3_days: Em 3 dias
- in_4_days: Em 4 dias
- climate:
- states:
- "on": Ligado
- "off": Desligado
- heat: Aquecimento
- please_confirm: Por favor, confirme
- unavailable: Indisponível
- unknown: Desconhecido
- no_name: Sem nome
- alarm:
- home: Em casa
- away: Ausente
- night: Noturno
- vacation: Férias
- bypass: Desvio
- disarm: Desarmar
- settings:
- reboot: Reiniciar
- sleep: Dormir
- brightness: Brilho
- bright: Claro
- dimming: Escurecimento
- dim: Escuro
- meridiem:
- am: AM
- pm: PM
- ro: # Romanian
- bytes_per_char: 1
- weekdays:
- mon: Luni
- tue: Marți
- wed: Miercuri
- thu: Joi
- fri: Vineri
- sat: Sâmbătă
- sun: Duminică
- weekdays_short:
- mon: Lun
- tue: Mar
- wed: Mie
- thu: Joi
- fri: Vin
- sat: Sâm
- sun: Dum
- months:
- jan: Ianuarie
- feb: Februarie
- mar: Martie
- apr: Aprilie
- may: Mai
- jun: Iunie
- jul: Iulie
- aug: August
- sep: Septembrie
- oct: Octombrie
- nov: Noiembrie
- dec: Decembrie
- months_short:
- jan: Ian
- feb: Feb
- mar: Mar
- apr: Apr
- may: Mai
- jun: Iun
- jul: Iul
- aug: Aug
- sep: Sep
- oct: Oct
- nov: Nov
- dec: Dec
- relative_day:
- today: Astăzi
- tomorrow: Mâine
- in_2_days: În 2 zile
- in_3_days: În 3 zile
- in_4_days: În 4 zile
- climate:
- states:
- "on": Pornit
- "off": Oprit
- heat: Încălzire
- please_confirm: Vă rugăm să confirmați
- unavailable: Indisponibil
- unknown: Necunoscut
- no_name: Fără nume
- alarm:
- home: Acasă
- away: Plecat
- night: Noapte
- vacation: Vacanță
- bypass: Ocolire
- disarm: Dezarmare
- settings:
- reboot: Repornire
- sleep: Somn
- brightness: Luminozitate
- bright: Luminos
- dimming: Diminuare
- dim: Întunecat
- meridiem:
- am: AM
- pm: PM
- ru: # Russian
- bytes_per_char: 2
- 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: Недоступно
- unknown: Неизвестно
- no_name: Без названия
- alarm:
- home: Охрана (Дома)
- away: Охрана (Не дома)
- night: Охрана (Ночь)
- vacation: Охрана (Отпуск)
- bypass: Охрана (С исключениями)
- disarm: Без охраны
- settings:
- reboot: Перезагрузка
- sleep: Сон
- brightness: Яркость
- bright: Яркий
- dimming: Затемнение
- dim: Тусклый
- meridiem:
- am: ДП
- pm: ПП
- sk: # Slovak
- bytes_per_char: 1
- weekdays:
- mon: Pondelok
- tue: Utorok
- wed: Streda
- thu: Štvrtok
- fri: Piatok
- sat: Sobota
- sun: Nedeľa
- weekdays_short:
- mon: Po
- tue: Ut
- wed: St
- thu: Št
- fri: Pi
- sat: So
- sun: Ne
- months:
- jan: Január
- feb: Február
- mar: Marec
- apr: Apríl
- may: Máj
- jun: Jún
- jul: Júl
- aug: August
- sep: September
- oct: Október
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Máj
- jun: Jún
- jul: Júl
- aug: Aug
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Dec
- relative_day:
- today: Dnes
- tomorrow: Zajtra
- in_2_days: O 2 dni
- in_3_days: O 3 dni
- in_4_days: O 4 dni
- climate:
- states:
- "on": Zapnuté
- "off": Vypnuté
- heat: Kúrenie
- please_confirm: Potvrďte, prosím
- unavailable: Nedostupné
- unknown: Neznámy
- no_name: Bez mena
- alarm:
- home: Doma
- away: Preč
- night: Noc
- vacation: Dovolenka
- bypass: Obísť
- disarm: Zneškodniť
- settings:
- reboot: Reštartovať
- sleep: Spánok
- brightness: Jas
- bright: Svetlý
- dimming: Stmavovanie
- dim: Tmavý
- meridiem:
- am: AM
- pm: PM
- sl: # Slovenian
- bytes_per_char: 1
- weekdays:
- mon: Ponedeljek
- tue: Torek
- wed: Sreda
- thu: Četrtek
- fri: Petek
- sat: Sobota
- sun: Nedelja
- weekdays_short:
- mon: Pon
- tue: Tor
- wed: Sre
- thu: Čet
- fri: Pet
- sat: Sob
- sun: Ned
- months:
- jan: Januar
- feb: Februar
- mar: Marec
- apr: April
- may: Maj
- jun: Junij
- jul: Julij
- aug: Avgust
- sep: September
- oct: Oktober
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Maj
- jun: Jun
- jul: Jul
- aug: Avg
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Dec
- relative_day:
- today: Danes
- tomorrow: Jutri
- in_2_days: Čez 2 dni
- in_3_days: Čez 3 dni
- in_4_days: Čez 4 dni
- climate:
- states:
- "on": Vklopljeno
- "off": Izklopljeno
- heat: Ogrevanje
- please_confirm: Prosimo, potrdite
- unavailable: Nedosegljivo
- unknown: Neznano
- no_name: Brez imena
- alarm:
- home: Doma
- away: Odsoten
- night: Noč
- vacation: Dopust
- bypass: Obvoz
- disarm: Razorožitev
- settings:
- reboot: Ponovni zagon
- sleep: Spanje
- brightness: Svetlost
- bright: Svetlo
- dimming: Zatemnitev
- dim: Temno
- meridiem:
- am: dop.
- pm: pop.
- sv: # Swedish
- bytes_per_char: 1
- weekdays:
- mon: Måndag
- tue: Tisdag
- wed: Onsdag
- thu: Torsdag
- fri: Fredag
- sat: Lördag
- sun: Söndag
- weekdays_short:
- mon: Mån
- tue: Tis
- wed: Ons
- thu: Tors
- fri: Fre
- sat: Lör
- sun: Sön
- months:
- jan: Januari
- feb: Februari
- mar: Mars
- apr: April
- may: Maj
- jun: Juni
- jul: Juli
- aug: Augusti
- sep: September
- oct: Oktober
- nov: November
- dec: December
- months_short:
- jan: Jan
- feb: Feb
- mar: Mar
- apr: Apr
- may: Maj
- jun: Jun
- jul: Jul
- aug: Aug
- sep: Sep
- oct: Okt
- nov: Nov
- dec: Dec
- relative_day:
- today: Idag
- tomorrow: Imorgon
- in_2_days: Om 2 dagar
- in_3_days: Om 3 dagar
- in_4_days: Om 4 dagar
- climate:
- states:
- "on": På
- "off": Av
- heat: Värme
- please_confirm: Vänligen bekräfta
- unavailable: Otillgänglig
- unknown: Okänd
- no_name: Inget namn
- alarm:
- home: Hemma
- away: Borta
- night: Natt
- vacation: Semester
- bypass: Förbigå
- disarm: Avaktivera
- settings:
- reboot: Starta om
- sleep: Vila
- brightness: Ljusstyrka
- bright: Ljust
- dimming: Dimmning
- dim: Dimma
- meridiem:
- am: FM
- pm: EM
- th: # Thai
- bytes_per_char: 3
- 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: มะรืนนี้
- in_3_days: ในอีก 3 วัน
- in_4_days: ในอีก 4 วัน
- climate:
- states:
- "on": "เปิด"
- "off": "ปิด"
- heat: ความร้อน
- please_confirm: กรุณายืนยัน
- unavailable: ไม่ปรากฏ
- unknown: ไม่ทราบสถานะ
- no_name: ไม่มีชื่อ
- alarm:
- home: อยู่บ้าน
- away: ไม่อยู่บ้าน
- night: เข้านอน
- vacation: วันหยุด
- bypass: ข้อยกเว้น
- disarm: ปิดระบบ
- settings:
- reboot: รีบูธ
- sleep: โหมดพักหน้าจอ
- brightness: ความสว่าง
- bright: แสง
- dimming: ลดแสง
- dim: หรี่
- meridiem:
- am: AM
- pm: PM
- tr: # Turkish
- bytes_per_char: 1
- weekdays:
- mon: Pazartesi
- tue: Salı
- wed: Çarşamba
- thu: Perşembe
- fri: Cuma
- sat: Cumartesi
- sun: Pazar
- weekdays_short:
- mon: Pzt
- tue: Sal
- wed: Çar
- thu: Per
- fri: Cum
- sat: Cmt
- sun: Paz
- months:
- jan: Ocak
- feb: Şubat
- mar: Mart
- apr: Nisan
- may: Mayıs
- jun: Haziran
- jul: Temmuz
- aug: Ağustos
- sep: Eylül
- oct: Ekim
- nov: Kasım
- dec: Aralık
- months_short:
- jan: Oca
- feb: Şub
- mar: Mar
- apr: Nis
- may: May
- jun: Haz
- jul: Tem
- aug: Ağu
- sep: Eyl
- oct: Eki
- nov: Kas
- dec: Ara
- relative_day:
- today: Bugün
- tomorrow: Yarın
- in_2_days: 2 gün içinde
- in_3_days: 3 gün içinde
- in_4_days: 4 gün içinde
- climate:
- states:
- "on": Açık
- "off": Kapalı
- heat: Isıtma
- please_confirm: Lütfen onaylayın
- unavailable: Kullanılamaz
- unknown: Bilinmeyen
- no_name: İsimsiz
- alarm:
- home: Evde
- away: Dışarıda
- night: Gece
- vacation: Tatil
- bypass: Bypass
- disarm: Devre dışı bırak
- settings:
- reboot: Yeniden başlat
- sleep: Uyku modu
- brightness: Parlaklık
- bright: Parlak
- dimming: Karartma
- dim: Karanlık
- meridiem:
- am: ÖÖ
- pm: ÖS
- uk: # Ukrainian
- bytes_per_char: 2
- 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: Недоступно
- unknown: Невідомо
- no_name: Без імені
- alarm:
- home: Вдома
- away: Відсутній
- night: Ніч
- vacation: Відпустка
- bypass: Обхід
- disarm: Роззброєння
- settings:
- reboot: Перезавантаження
- sleep: Сон
- brightness: Яскравість
- bright: Яскравий
- dimming: Затемнення
- dim: Темний
- meridiem:
- am: ДП
- pm: ПП
- zh-tw: # Traditional Chinese
- bytes_per_char: 3
- weekdays:
- mon: 星期一
- tue: 星期二
- wed: 星期三
- thu: 星期四
- fri: 星期五
- sat: 星期六
- sun: 星期日
- weekdays_short:
- mon: 一
- tue: 二
- wed: 三
- thu: 四
- fri: 五
- sat: 六
- sun: 日
- months:
- jan: 1月
- feb: 2月
- mar: 3月
- apr: 4月
- may: 5月
- jun: 6月
- jul: 7月
- aug: 8月
- sep: 9月
- oct: 10月
- nov: 11月
- dec: 12月
- months_short:
- jan: 1月
- feb: 2月
- mar: 3月
- apr: 4月
- may: 5月
- jun: 6月
- jul: 7月
- aug: 8月
- sep: 9月
- oct: 10月
- nov: 11月
- dec: 12月
- relative_day:
- today: 今天
- tomorrow: 明天
- in_2_days: 後天
- in_3_days: 大後天
- in_4_days: 四天後
- climate:
- states:
- 'on': 開啟
- 'off': 關閉
- heat: 暖氣
- please_confirm: 請確認
- unavailable: 無法使用
- unknown: 未知
- no_name: 未命名
- alarm:
- home: 在家
- away: 離家
- night: 夜間
- vacation: 假期
- bypass: 忽略
- disarm: 解除
- settings:
- reboot: 重啟
- sleep: 睡眠
- brightness: 亮度
- bright: 正常
- dimming: 調光
- dim: 待機
- meridiem:
- am: 上午
- pm: 下午
-
##### Home page #####
home_page:
chips:
@@ -8568,6 +6058,9 @@ actions:
- alias: Global anchor repository
if: '{{ false }}' # It should never execute directly
then:
+ - &delay_default
+ delay:
+ milliseconds: !input delay
- variables:
entity_id: '{{ None }}'
overlap:
@@ -8822,36 +6315,6 @@ actions:
- alias: Main choices
choose:
- ##### DATE #####
- - alias: 'Date'
- conditions: # time_state
- - condition: trigger
- id: time_state
- sequence:
- ##### NSPanel Date #####
- - &delay_default
- delay:
- milliseconds: !input delay
- - &refresh-date
- action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: home
- id: date
- txt: >
- {{
- 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])
- )
- }}
- continue_on_error: true
-
- ##### NSPanel event #####
- alias: NSPanel event
conditions:
- condition: trigger
@@ -8943,28 +6406,20 @@ actions:
color: !input time_label_color
continue_on_error: true
- *delay_boot
- - alias: time_format
+ - alias: date_format
action: 'esphome.{{ nspanel_name }}_component_text'
data:
page: mem
- id: time_format
- txt: !input time_format
+ id: date_format
+ txt: !input date_format
continue_on_error: true
- *delay_boot
- - alias: meridiem_am
- action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: mem
- id: meridiem_am
- txt: '{{ dict.values(mui[language].meridiem) | list | first }}'
- continue_on_error: true
- - *delay_boot
- - alias: meridiem_pm
+ - alias: time_format
action: 'esphome.{{ nspanel_name }}_component_text'
data:
page: mem
- id: meridiem_pm
- txt: '{{ dict.values(mui[language].meridiem) | list | last }}'
+ id: time_format
+ txt: !input time_format
continue_on_error: true
- alias: Home page
@@ -9330,40 +6785,6 @@ actions:
val: '{{ 1 if qrcode_enabled else 0 }}'
continue_on_error: true
- - alias: Page settings labels
- sequence:
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: settings
- id: lbl_reboot
- txt: '{{ mui[language].settings.reboot }}'
- continue_on_error: true
-
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: settings
- id: lbl_brightness
- txt: '{{ mui[language].settings.brightness }}'
- continue_on_error: true
-
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: settings
- id: lbl_bright
- txt: '{{ mui[language].settings.bright }}'
- continue_on_error: true
-
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: settings
- id: lbl_dim
- txt: '{{ mui[language].settings.dim }}'
- continue_on_error: true
-
- alias: Relay settings
sequence:
- variables:
@@ -9614,32 +7035,6 @@ actions:
val: '{{ int(entitypages_value_alignment) if is_number(entitypages_value_alignment) else 0 }}'
continue_on_error: true
- - alias: mui texts (localization)
- sequence:
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: mem
- id: mui_please_confirm
- txt: '{{ mui[language].please_confirm }}'
- continue_on_error: true
-
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: mem
- id: mui_unavailable
- txt: '{{ mui[language].unavailable }}'
- continue_on_error: true
-
- - *delay_boot
- - action: 'esphome.{{ nspanel_name }}_component_val'
- data:
- page: mem
- id: bytes_per_char
- val: '{{ mui[language].bytes_per_char }}'
- continue_on_error: true
-
- alias: Screensaver settings
sequence:
- variables:
@@ -9736,8 +7131,6 @@ actions:
}}
continue_on_error: true
- - *refresh-date # Update Date & Time before showing the Home page
-
##### Action call #####
- alias: NSPanel action call
conditions:
@@ -10194,7 +7587,8 @@ actions:
continue_on_error: true
- *delay_default
- - action: 'esphome.{{ nspanel_name }}_component_text'
+ - alias: value_with_unit_and_translations
+ action: 'esphome.{{ nspanel_name }}_component_text'
data:
page: '{{ repeat.item.page }}'
id: '{{ repeat.item.component }}'
@@ -10206,7 +7600,7 @@ actions:
else state_translated(entity_id)
)
if entity_id_valid and entity_has_value
- else mui[language].unavailable
+ else "_{_unavailable_}_"
}}
continue_on_error: true
@@ -10855,7 +8249,6 @@ actions:
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: '{{ entity_id }}'
- mui_alarm: '{{ dict.values(mui[language].alarm) | list }}'
continue_on_error: true
## PAGE CLIMATE ##
@@ -11081,11 +8474,10 @@ actions:
visible: true
continue_on_error: true
- ##### Climate custom buttons #####
- - &climate-update_custom_buttons
- if: '{{ true }}'
- then:
- - &climate-update_custom_buttons-variables
+ - &climate_custom_buttons
+ alias: Climate custom buttons
+ sequence:
+ - &climate_custom_buttons_variables
variables:
climate_custom_buttons:
- entity: !input climate_button08
@@ -11096,7 +8488,7 @@ actions:
icon: !input climate_button09_icon
icon_color_rgb: !input climate_button09_icon_color
component: button09
- - &climate-update_custom_buttons-update
+ - &climate_custom_buttons_update
repeat:
for_each: '{{ climate_custom_buttons | selectattr("entity", "defined") | rejectattr("entity", "eq", []) | list }}'
sequence:
@@ -11309,7 +8701,7 @@ actions:
{%- if current_temp > -999 -%}
{{ (("%.1f" | format(current_temp)) if use_decimal else ("%.0f" | format(current_temp))) }}
{%- else -%}
- {{ mui_unavailable }}
+ {{ "_{_unavailable_}_" }}
{%- endif -%}
target_temp_text: >
{%- if is_target_temperature -%}
@@ -11550,35 +8942,6 @@ actions:
page_name: '{{ nspanel_event.page }}'
page_index: '{{ (page_name[-2:] | int(0)) - 1 }}'
- ##### Display relative day #####
- - *delay_default
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: '{{ page_name }}'
- id: day
- txt: '{{ (dict.values(mui[language].relative_day) | list)[page_index] }}'
- continue_on_error: true
-
- ##### Display date (long) #####
- - *delay_default
- - action: 'esphome.{{ nspanel_name }}_component_text'
- data:
- page: '{{ page_name }}'
- id: date
- txt: >
- {{
- as_timestamp(now() + timedelta(days= (page_index)))
- | timestamp_custom
- (
- date_format
- | replace("%A", (dict.values(mui[language].weekdays) | list)[(now() + timedelta(days= (page_index))).weekday()])
- | replace("%a", (dict.values(mui[language].weekdays_short) | list)[(now() + timedelta(days= (page_index))).weekday()])
- | replace("%B", (dict.values(mui[language].months) | list)[(now() + timedelta(days= (page_index))).month-1])
- | replace("%b", (dict.values(mui[language].months_short) | list)[(now() + timedelta(days= (page_index))).month-1])
- )
- }}
- continue_on_error: true
-
##### Display weather data only when available #####
- variables:
weather_entity_supported_features: '{{ state_attr(weather_entity, "supported_features") | int(0) }}'
@@ -12062,7 +9425,7 @@ actions:
data:
page: '{{ page_name }}'
id: 'value01'
- txt: '{{ mui[language].unavailable }}'
+ txt: '_{_unavailable_}_'
continue_on_error: true
else: *forecast_unavailable
@@ -12471,7 +9834,7 @@ actions:
- '{{ nspanel_event.page is defined }}'
- '{{ nspanel_event.page == pages.climate }}'
sequence:
- - *climate-update_custom_buttons-variables
+ - *climate_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 }}'
@@ -12801,7 +10164,6 @@ actions:
- *variable_entity
- *entity_details_show
- ##### BOOT NSPANEL - automation reload #####
- alias: Automation reloaded
conditions:
- condition: trigger
@@ -12864,8 +10226,7 @@ actions:
- conditions: '{{ pages.current in pages.entitypages }}'
sequence: *refresh_entity_pages
- ##### UPDATE BUTTONS PAGES - button page / light page / cover page #####
- - alias: 'Buttons entity updated'
+ - alias: Buttons entity updated
conditions:
- condition: trigger
id: trigger_buttonpage_state
@@ -12938,8 +10299,7 @@ actions:
- '{{ trigger.entity_id == detailed_entity_state }}'
sequence: *refresh_page_water_heater
- ##### UPDATE ENTITY PAGES #####
- - alias: 'Update entity pages'
+ - alias: Update entity pages
conditions:
- condition: trigger
id: trigger_entitypage_state
@@ -12958,8 +10318,7 @@ actions:
}}
sequence: *update_entity_page_entity
- ##### UPDATE CLIMATE PAGE VALUES #####
- - alias: 'Update climate page values'
+ - alias: Update climate page values
conditions:
- condition: trigger
id: trigger_climatepage_value_state
@@ -12976,7 +10335,6 @@ actions:
}}
sequence: *display_value
- ##### UPDATE CLIMATE PAGE CUSTOM BUTTONS STATE #####
- alias: Update climate page custom buttons
conditions:
- condition: trigger
@@ -12985,9 +10343,8 @@ actions:
- climate_button09_state
- '{{ pages.current == pages.climate }}'
sequence:
- - *climate-update_custom_buttons
+ - *climate_custom_buttons
- ##### Sync Climate #####
- alias: Climate - Sync
conditions:
- condition: trigger
@@ -13006,7 +10363,6 @@ actions:
- *climate-update_slider
- *climate-update_buttons
- ##### UPDATE WATER HEATER PAGE VALUES #####
- alias: Update water heater page values
conditions:
- condition: trigger
@@ -13024,8 +10380,7 @@ actions:
}}
sequence: *display_value
- ##### UPDATE UTILITIES PAGES #####
- - alias: 'Update utilities pages'
+ - alias: Update utilities pages
conditions:
- condition: trigger
id: utilities_page
@@ -13041,7 +10396,6 @@ actions:
for_each: '{{ pages_utilities.groups | selectattr("name", "in", groups) | list }}'
sequence: *refresh_page_utilities_group
- ##### QRCODE VALUES #####
- alias: Update QRCode
conditions:
- condition: trigger
@@ -13050,9 +10404,6 @@ actions:
sequence:
- *qrcode_update
- ########## TRIGGER - HOME PAGE ###########
-
- ##### HOME PAGE - Custom buttons #####
- alias: Home page - Custom buttons
conditions:
- condition: trigger
@@ -13107,7 +10458,6 @@ actions:
- '{{ trigger_entity_id == detailed_entity_state }}'
sequence: *refresh_page_alarm
- ##### Home page - Entity States #####
- alias: Home page - Entity States
conditions:
- condition: trigger
@@ -13118,7 +10468,6 @@ actions:
sequence:
- *display_value
- ##### HOME PAGE - Status bar #####
- alias: Home page - status bar
conditions:
- condition: trigger
@@ -13126,7 +10475,6 @@ actions:
sequence:
- *update_home_page_status_bar
- ##### HW BUTTON - state #####
- alias: Hardware button - State
conditions:
- condition: trigger
@@ -13183,7 +10531,6 @@ actions:
val: '{{ 1 if button_state_new else 0 }}'
continue_on_error: true
- ##### OUTDOOR TEMP - entity #####
- alias: Outdoor temp - Entity
conditions:
- condition: trigger
@@ -13192,7 +10539,6 @@ actions:
sequence:
- *refresh-page_home-outdoor_temp
- ##### INDOOR TEMP #####
- alias: Indoor temp - Entity
conditions:
- condition: trigger
@@ -13202,7 +10548,6 @@ actions:
sequence:
- *refresh_page_home_indoor_temp
- ##### WEATHER STATE - change update #####
- alias: Weather - State changed
conditions:
- '{{ pages.current == pages.home }}'
@@ -13215,7 +10560,6 @@ actions:
- *refresh-page_home-outdoor_temp
- *refresh-page_home-weather_pic
- #### TFT Wake-up Automation #####
- alias: Wake-up
conditions:
- condition: trigger