From 3d4d7c6cabc7a651be5eaf81bc89c0491ccc7b1a Mon Sep 17 00:00:00 2001 From: Ben Burwood Date: Thu, 6 Apr 2023 22:18:23 +0100 Subject: [PATCH 1/9] Favorite Button and Horizontal Fix --- .../card_templates/cards/card_cover.yaml | 82 ++++++++++++++++--- 1 file changed, 70 insertions(+), 12 deletions(-) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml index 2ee02034a..8ad41ce46 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml @@ -14,6 +14,7 @@ card_cover: ulm_card_cover_garage_large: false ulm_card_cover_gate: false ulm_card_cover_enable_controls: false + ulm_card_cover_favorite_percentage: null ulm_card_cover_enable_slider: false ulm_card_cover_slider_min: 0 ulm_card_cover_slider_max: 100 @@ -58,8 +59,18 @@ card_cover: } if (variables.ulm_card_cover_enable_horizontal) { - areas = areas.slice(0, 2); - return "\"" + areas.join(" ") + "\""; + var hor_areas = areas.slice(0, 2); + + if (areas.length < 3) { + return "\"" + hor_areas.join(" ") + "\" "; + } + + var ver_areas = [] + ver_areas.push(areas.slice(2, 3) + " " + areas.slice(2,3)); + if (areas.length == 4) { + ver_areas.push(areas.slice(3, 4) + " " + areas.slice(3,4)); + } + return "\"" + hor_areas.join(" ") + "\" " + "\"" + ver_areas.join("\" \"") + "\""; } return "\"" + areas.join("\" \"") + "\""; ]]] @@ -72,9 +83,6 @@ card_cover: ]]] - grid-template-rows: > [[[ - if (variables.ulm_card_cover_enable_horizontal) { - return "min-content"; - } var rows = []; rows.push("min-content"); if (variables.ulm_card_cover_enable_controls) { @@ -86,6 +94,11 @@ card_cover: if (variables.ulm_card_cover_enable_tilt) { rows.push("min-content"); } + if (variables.ulm_card_cover_enable_horizontal) { + if (rows.length > 1) { + rows.pop() + } + } return rows.join(" "); ]]] - row-gap: "12px" @@ -107,9 +120,6 @@ card_cover: - display: > [[[ if (variables.ulm_card_cover_enable_slider) { - if (variables.ulm_card_cover_enable_horizontal && variables.ulm_card_cover_enable_controls) { - return "none"; - } return "block"; } else { return "none"; @@ -119,9 +129,6 @@ card_cover: - display: > [[[ if (variables.ulm_card_cover_enable_tilt) { - if (variables.ulm_card_cover_enable_horizontal && (variables.ulm_card_cover_enable_controls || variables.ulm_card_cover_enable_slider)) { - return "none"; - } return "block"; } else { return "none"; @@ -289,10 +296,20 @@ card_cover: item2: card: type: "custom:button-card" - template: "list_3_items" + template: "[[[ return (variables.ulm_card_cover_favorite_percentage) ? 'list_4_items' : 'list_3_items' ]]]" styles: card: - background: "none" + custom_fields: + item4: + - display: > + [[[ + if (variables.ulm_card_cover_favorite_percentage) { + return "block"; + } else { + return "none"; + } + ]]] custom_fields: item1: card: @@ -484,6 +501,47 @@ card_cover: } return "mdi:arrow-up"; ]]] + item4: + card: + type: "custom:button-card" + template: "widget_icon" + entity: "[[[ return entity.entity_id ]]]" + styles: + card: + - background-color: > + [[[ + if(!hass.themes.darkMode && variables.ulm_card_cover_force_background_color){ + if (variables.ulm_active_state){ + return 'rgb(250,250,250)' + } + } + return 'rgba(var(--color-theme),0.05)' + ]]] + img_cell: + - background-color: > + [[[ + if (variables.ulm_card_cover_force_background_color && variables.ulm_active_state) { + var color = variables.ulm_card_cover_color; + return 'rgba(var(--color-' + color + '),0.2)'; + } + return 'rgba(var(--color-theme),0.05)'; + ]]] + icon: + - color: > + [[[ + if (variables.ulm_card_cover_force_background_color && variables.ulm_active_state) { + var color = variables.ulm_card_cover_color; + return 'rgba(var(--color-' + color + '),1)'; + } + return 'rgba(var(--color-theme),0.9)'; + ]]] + tap_action: + action: "call-service" + service: "cover.set_cover_position" + service_data: + entity_id: "[[[ return entity.entity_id ]]]" + position: "[[[ return variables.ulm_card_cover_favorite_percentage ]]]" + icon: "mdi:star" item3: card: type: "custom:my-slider" From baa836eb28c2021944d962d5452d718ac5985579 Mon Sep 17 00:00:00 2001 From: Ben Burwood Date: Thu, 6 Apr 2023 22:24:53 +0100 Subject: [PATCH 2/9] Update Docs with Favorite --- docs/usage/cards/card_cover.md | 39 ++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/docs/usage/cards/card_cover.md b/docs/usage/cards/card_cover.md index bf6d1065f..c88877aab 100644 --- a/docs/usage/cards/card_cover.md +++ b/docs/usage/cards/card_cover.md @@ -3,6 +3,7 @@ title: Cover Card hide: - toc --- + ## Description @@ -14,27 +15,28 @@ hide: With the `cover-card` you have the state of your cover. Optionally, on the second line, OPEN / PAUSE / CLOSE to control it and/or a slider to control position. !!! warning - This card has backward compatibility with older template except custom name. It means variable `ulm_card_cover_buttons_name` must be replaced by `ulm_card_cover_name`. +This card has backward compatibility with older template except custom name. It means variable `ulm_card_cover_buttons_name` must be replaced by `ulm_card_cover_name`. ## Variables -| Variable/Entity | Default | Required | Notes | Requirement | -|----------------------------------------|-----------------|------------------|----------------------------------------|-------------| -| entity | | :material-check: | Your HA entity | | -| ulm_card_cover_name | `friendly_name` | :material-close: | Customize name | | -| ulm_card_cover_icon | | :material-close: | Customize icon | | -| ulm_card_invert_percent | `false` | :material-close: | Invert the Percentage (100% = Closed) | | -| ulm_card_cover_display_left_right | `false` | :material-close: | Display left right control button | | -| ulm_card_cover_garage_large | `false` | :material-close: | Display variant garage icon for garage cover | Only if `device_class = 'garage` | -| ulm_card_cover_enable_controls | `false` | :material-close: | Enable control buttons | | -| ulm_card_cover_enable_slider | `false` | :material-close: | Enable slider | | -| ulm_card_cover_enable_horizontal | `false` | :material-close: | Enable horizontal card | Need `ulm_card_cover_enable_controls: true` or `ulm_card_cover_enable_slider: true` | -| ulm_card_cover_enable_tilt | `false` | :material-close: | Display angled buttons for Venetian blind tilt | | -| ulm_card_cover_enable_popup | `false` | :material-close: | Enable `popup_cover` | | -| ulm_card_cover_slider_min | `0` | :material-close: | Set Minimum Slider Value | | -| ulm_card_cover_slider_max | `100` | :material-close: | Set Maximum Slider Value | | -| ulm_card_cover_color | `blue` | :material-close: | Set Custom Color | | -| ulm_card_cover_force_background_color | `false` | :material-close: | Set `ulm_card_cover_color` as background color in active state ` | | +| Variable/Entity | Default | Required | Notes | Requirement | +| ------------------------------------- | --------------- | ---------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| entity | | :material-check: | Your HA entity | | +| ulm_card_cover_name | `friendly_name` | :material-close: | Customize name | | +| ulm_card_cover_icon | | :material-close: | Customize icon | | +| ulm_card_invert_percent | `false` | :material-close: | Invert the Percentage (100% = Closed) | | +| ulm_card_cover_display_left_right | `false` | :material-close: | Display left right control button | | +| ulm_card_cover_garage_large | `false` | :material-close: | Display variant garage icon for garage cover | Only if `device_class = 'garage` | +| ulm_card_cover_enable_controls | `false` | :material-close: | Enable control buttons | | +| ulm_card_cover_enable_slider | `false` | :material-close: | Enable slider | | +| ulm_card_cover_enable_horizontal | `false` | :material-close: | Enable horizontal card | Need `ulm_card_cover_enable_controls: true` or `ulm_card_cover_enable_slider: true` | +| ulm_card_cover_favorite_percentage | `false` | :material-close: | Display favorite button to jump to preset position | enter number | +| ulm_card_cover_enable_tilt | `false` | :material-close: | Display angled buttons for Venetian blind tilt | | +| ulm_card_cover_enable_popup | `false` | :material-close: | Enable `popup_cover` | | +| ulm_card_cover_slider_min | `0` | :material-close: | Set Minimum Slider Value | | +| ulm_card_cover_slider_max | `100` | :material-close: | Set Maximum Slider Value | | +| ulm_card_cover_color | `blue` | :material-close: | Set Custom Color | | +| ulm_card_cover_force_background_color | `false` | :material-close: | Set `ulm_card_cover_color` as background color in active state ` | | ## Usage @@ -45,6 +47,7 @@ With the `cover-card` you have the state of your cover. Optionally, on the secon variables: ulm_card_cover_enable_controls: true ulm_card_cover_enable_slider: true + ulm_card_cver_favorite_percentage: 45 ulm_card_cover_color: "green" ``` From a43d2158d2c108fe39111456a5797d3d7e0c5524 Mon Sep 17 00:00:00 2001 From: shogun160 <63370033+shogun160@users.noreply.github.com> Date: Fri, 21 Apr 2023 10:26:10 +0200 Subject: [PATCH 3/9] [card_binary_sensor] bugfix force_background_color Remove template "blue" to make ulm_card_binary_sensor_force_background_color work --- .../ulm_templates/card_templates/cards/card_binary_sensor.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_binary_sensor.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_binary_sensor.yaml index 6e5e65277..14faff885 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_binary_sensor.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_binary_sensor.yaml @@ -3,7 +3,6 @@ card_binary_sensor: template: - "icon_more_info_new" - - "blue" - "ulm_translation_engine" show_last_changed: false variables: From 0adb50d0813e73627bb12139c63dba967fa41f2a Mon Sep 17 00:00:00 2001 From: Joe Neuman Date: Thu, 27 Apr 2023 13:12:26 -0700 Subject: [PATCH 4/9] Allow scripts with custom service_date fields to work on scenes pills --- .../card_templates/cards/card_welcome_scenes.yaml | 12 ++++++++++++ docs/usage/cards/card_welcome_scenes.md | 1 + 2 files changed, 13 insertions(+) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_welcome_scenes.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_welcome_scenes.yaml index cc390a58c..0b6bbbdd4 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_welcome_scenes.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_welcome_scenes.yaml @@ -297,6 +297,9 @@ card_scenes_pill_welcome: } else if(entity.entity_id.startsWith("input_select.")){ return "input_select.select_option" + } + else if(entity.entity_id.startsWith("script.")){ + return entity.entity_id } else { return "homeassistant.toggle" } @@ -304,6 +307,9 @@ card_scenes_pill_welcome: navigation_path: "[[[ return variables?.nav_path; ]]]" service_data: | [[[ + if (variables.service_data){ + return variables.service_data + } var obj; if( entity.entity_id.startsWith("input_select.") ) obj = { entity_id: entity.entity_id, option: variables.state }; @@ -379,12 +385,18 @@ card_scenes_pill_welcome: } else if(entity.entity_id.startsWith("input_select.")){ return "input_select.select_option" + } + else if(entity.entity_id.startsWith("script.")){ + return entity.entity_id } else { return "homeassistant.toggle" } ]]] service_data: | [[[ + if (variables.service_data){ + return variables.service_data + } var obj; if( entity.entity_id.startsWith("input_select.") ) obj = { entity_id: entity.entity_id, option: variables.state }; diff --git a/docs/usage/cards/card_welcome_scenes.md b/docs/usage/cards/card_welcome_scenes.md index d44f4eb17..ea9e24a25 100644 --- a/docs/usage/cards/card_welcome_scenes.md +++ b/docs/usage/cards/card_welcome_scenes.md @@ -36,6 +36,7 @@ This is a card which shows the basic needs for your dashboard. This card can gen | _color | Random | :material-close: | Color of the icon
Can choose between: `blue`, `red`, `green`, `yellow`, `pink`, `purple`
If not specified, it will take a random color | | _state | `on` or `playing` | :material-close: | Define `input_select` state or give manual state for pill to be full | | _nav_path | | :material-close: | Navigate to another view
*Overrides other types of actions* +| _service_data | | :material-close: | Data to be passed through to data_service. Userful for running scripts with custom fields/parameters ## Requirement Collapse Function From 36c0f869e331ae0a0d9848769748cc54ecb52fde Mon Sep 17 00:00:00 2001 From: Joe Neuman Date: Thu, 27 Apr 2023 13:18:52 -0700 Subject: [PATCH 5/9] remove unintended change --- .../themefiles/minimalist-mobile/minimalist-mobile.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/themefiles/minimalist-mobile/minimalist-mobile.yaml b/custom_components/ui_lovelace_minimalist/lovelace/themefiles/minimalist-mobile/minimalist-mobile.yaml index 2d1abd6b8..7fea9b68b 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/themefiles/minimalist-mobile/minimalist-mobile.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/themefiles/minimalist-mobile/minimalist-mobile.yaml @@ -20,7 +20,7 @@ minimalist-mobile: } #view { margin: 0 !important; - height: 100vh !important; + height: 100% !important; } card-mod-view-yaml: | "*:first-child$": | From 3706ef76e6e6d8a7e87ecfdb67f65d6358f066f0 Mon Sep 17 00:00:00 2001 From: Joe Neuman Date: Thu, 27 Apr 2023 13:21:42 -0700 Subject: [PATCH 6/9] fix typo --- docs/usage/cards/card_welcome_scenes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage/cards/card_welcome_scenes.md b/docs/usage/cards/card_welcome_scenes.md index ea9e24a25..196683236 100644 --- a/docs/usage/cards/card_welcome_scenes.md +++ b/docs/usage/cards/card_welcome_scenes.md @@ -36,7 +36,7 @@ This is a card which shows the basic needs for your dashboard. This card can gen | _color | Random | :material-close: | Color of the icon
Can choose between: `blue`, `red`, `green`, `yellow`, `pink`, `purple`
If not specified, it will take a random color | | _state | `on` or `playing` | :material-close: | Define `input_select` state or give manual state for pill to be full | | _nav_path | | :material-close: | Navigate to another view
*Overrides other types of actions* -| _service_data | | :material-close: | Data to be passed through to data_service. Userful for running scripts with custom fields/parameters +| _service_data | | :material-close: | Data to be passed through to data_service. Useful for running scripts with custom fields/parameters ## Requirement Collapse Function From c17217d988cca1fdd736e1d6bd434c799aa99d52 Mon Sep 17 00:00:00 2001 From: Ben Burwood Date: Tue, 9 May 2023 20:34:44 +0100 Subject: [PATCH 7/9] Favorite priority option added --- .../card_templates/cards/card_cover.yaml | 62 ++++++++++++------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml index 8ad41ce46..7293420d0 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_cover.yaml @@ -45,34 +45,54 @@ card_cover: grid: - grid-template-areas: > [[[ - var areas = []; - areas.push("item1"); + if (variables.ulm_card_cover_enable_horizontal) { - if (variables.ulm_card_cover_enable_controls) { - areas.push("item2"); - } - if (variables.ulm_card_cover_enable_slider) { - areas.push("item3"); - } - if (variables.ulm_card_cover_enable_tilt) { - areas.push("item4"); - } + var hor_area = ["item1"]; + var ver_area = []; - if (variables.ulm_card_cover_enable_horizontal) { - var hor_areas = areas.slice(0, 2); + if (variables.ulm_card_cover_enable_controls) { + if (variables.ulm_card_cover_enable_horizontal == "controls" || variables.ulm_card_cover_enable_horizontal == true) { + hor_area.push("item2"); + } else { + ver_area.push("item2" + " " + "item2"); + } + } + if (variables.ulm_card_cover_enable_slider) { + if (variables.ulm_card_cover_enable_horizontal == "slider") { + hor_area.push("item3"); + } else { + ver_area.push("item3" + " " + "item3"); + } + } + if (variables.ulm_card_cover_enable_tilt) { + if (variables.ulm_card_cover_enable_horizontal == "tilt") { + hor_area.push("item4"); + } else { + ver_area.push("item4" + " " + "item4"); + } + } - if (areas.length < 3) { - return "\"" + hor_areas.join(" ") + "\" "; + if (ver_area.length < 1) { + return "\"" + hor_area.join(" ") + "\" "; + } else { + return "\"" + hor_area.join(" ") + "\" " + "\"" + ver_area.join("\" \"") + "\""; } + } else { + var areas = []; + areas.push("item1"); - var ver_areas = [] - ver_areas.push(areas.slice(2, 3) + " " + areas.slice(2,3)); - if (areas.length == 4) { - ver_areas.push(areas.slice(3, 4) + " " + areas.slice(3,4)); + if (variables.ulm_card_cover_enable_controls) { + areas.push("item2"); + } + if (variables.ulm_card_cover_enable_slider) { + areas.push("item3"); } - return "\"" + hor_areas.join(" ") + "\" " + "\"" + ver_areas.join("\" \"") + "\""; + if (variables.ulm_card_cover_enable_tilt) { + areas.push("item4"); + } + + return "\"" + areas.join("\" \"") + "\""; } - return "\"" + areas.join("\" \"") + "\""; ]]] - grid-template-columns: > [[[ From cb1f3e38a9f2dbc43f20d37bcc3e6bf2f08ea949 Mon Sep 17 00:00:00 2001 From: BasBruss <68892092+basbruss@users.noreply.github.com> Date: Fri, 19 May 2023 14:58:53 +0200 Subject: [PATCH 8/9] Remove relative timestamp bug --- .../ui_lovelace_minimalist/lovelace/translations/default.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml b/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml index 92c3a9711..d2916e025 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml @@ -81,7 +81,7 @@ ulm_translation_engine: const secondsDiff = Math.round(microSecondsDiff / (1000)); const formatter = new Intl.RelativeTimeFormat(lang, { numeric: 'auto' }); var scale = 'day' - var diff = 'daysDiff' + var diff = daysDiff if (Math.abs(secondsDiff) < 60){ scale = 'second'; diff = secondsDiff } else if (Math.abs(minutesDiff) < 60){ scale = 'minute'; diff = minutesDiff } else if (Math.abs(hoursDiff) < 24){ scale = 'hour'; diff = hoursDiff } @@ -135,7 +135,7 @@ ulm_translation_engine: const formatter = new Intl.RelativeTimeFormat(lang, { numeric: 'auto' }); var scale = 'day' - var diff = 'daysDiff' + var diff = daysDiff if (Math.abs(secondsDiff) < 60){ scale = 'second'; diff = secondsDiff } else if (Math.abs(minutesDiff) < 60){ scale = 'minute'; diff = minutesDiff } else if (Math.abs(hoursDiff) < 24){ scale = 'hour'; diff = hoursDiff } From 42d60246ebdb6459d402217cbb6617ab07d5aba6 Mon Sep 17 00:00:00 2001 From: basbruss <68892092+basbruss@users.noreply.github.com> Date: Wed, 7 Jun 2023 11:05:49 +0200 Subject: [PATCH 9/9] Add display precision based on HA settings --- .../lovelace/translations/default.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml b/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml index 92c3a9711..20704489f 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml @@ -71,6 +71,7 @@ ulm_translation_engine: let lang = hass["language"]; let domain = entity.entity_id.substr(0, entity.entity_id.indexOf(".")); var translation = hass.resources[lang]["component." + domain + ".entity_component._.state." + state] + let display_precision = hass.entities[entity.entity_id]?.display_precision const now = new Date(); const timestamp = (new Date(state)).getTime(); const nowTimeStamp = now.getTime(); @@ -95,6 +96,9 @@ ulm_translation_engine: else if (d_class == 'timestamp'){ var translation = formatter.format(diff, scale) } + else if (parseFloat(display_precision) >=0){ + var translation = parseFloat(entity.state).toFixed(display_precision?.toString()) + } return translation ? translation.charAt(0).toUpperCase() + translation.slice(1) : state; } ]]] @@ -124,6 +128,7 @@ ulm_translation_engine: let lang = hass["language"]; let domain = entity.entity_id.substr(0, entity.entity_id.indexOf(".")); let unit = entity.attributes.unit_of_measurement != null ? " " + entity.attributes.unit_of_measurement : ""; + let display_precision = hass.entities[entity.entity_id]?.display_precision const now = new Date(); const timestamp = (new Date(state)).getTime(); const nowTimeStamp = now.getTime(); @@ -161,6 +166,9 @@ ulm_translation_engine: else if (d_class == 'timestamp'){ var translation = formatter.format(diff, scale); } + else if (parseFloat(display_precision) >=0){ + var translation = parseFloat(entity.state).toFixed(display_precision?.toString()) + unit + } return translation ? translation.charAt(0).toUpperCase() + translation.slice(1) : state; } ]]]