diff --git a/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml b/custom_components/ui_lovelace_minimalist/lovelace/translations/default.yaml index 92c3a9711..a99f59898 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(); @@ -81,7 +82,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 } @@ -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(); @@ -135,7 +140,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 } @@ -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; } ]]] 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: 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 a5ae36a15..1da7638e4 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 @@ -44,24 +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) { - areas = areas.slice(0, 2); - return "\"" + areas.join(" ") + "\""; + 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 (ver_area.length < 1) { + return "\"" + hor_area.join(" ") + "\" "; + } else { + return "\"" + hor_area.join(" ") + "\" " + "\"" + ver_area.join("\" \"") + "\""; + } + } else { + var areas = []; + areas.push("item1"); + + 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"); + } + + return "\"" + areas.join("\" \"") + "\""; } - return "\"" + areas.join("\" \"") + "\""; ]]] - grid-template-columns: > [[[ @@ -72,9 +103,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 +114,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 +140,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 +149,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 +316,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 +521,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" 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_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" ``` diff --git a/docs/usage/cards/card_welcome_scenes.md b/docs/usage/cards/card_welcome_scenes.md index d44f4eb17..196683236 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. Useful for running scripts with custom fields/parameters ## Requirement Collapse Function