From fddf8d69464769301d17a45d84b51edb43499959 Mon Sep 17 00:00:00 2001 From: Bavo Mees Date: Wed, 26 Jan 2022 17:20:12 +0100 Subject: [PATCH 1/5] Rewrite of the room card --- .../card_templates/cards/card_room.yaml | 273 ++++++++++++++++++ docs/assets/img/room-card.png | Bin 0 -> 22704 bytes docs/usage/cards/card_room.md | 82 ++++++ 3 files changed, 355 insertions(+) create mode 100644 custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml create mode 100644 docs/assets/img/room-card.png create mode 100644 docs/usage/cards/card_room.md diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml new file mode 100644 index 000000000..d328091a1 --- /dev/null +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml @@ -0,0 +1,273 @@ +--- +card_room: + template: + - "ulm_language_variables" + variables: + label_use_temperature: true + label_use_brightness: false + color: "var(--google-grey-500)" + show_icon: true + show_name: true + show_label: true + size: "45%" + aspect_ratio: "1/1" + label: |- + [[[ + if (variables.label_use_temperature) { + return (entity.attributes.current_temperature || entity.attributes.temperature || entity.state || '-') + '°C'; + } else if (variables.label_use_brightness) { + if (entity.state){ + if (entity.state == "off"){ + return variables.ulm_off; + } else if (entity.state == "on"){ + if (entity.attributes.brightness != null){ + var bri = Math.round(entity.attributes.brightness / 2.55); + return (bri ? bri : "0") + "%"; + } else { + return variables.ulm_on + } + } + } else { + return variables.ulm_unavailable; + } + } + ]]] + state: + - styles: + custom_fields: + notification: + - border-radius: "50%" + - border: "2px solid var(--card-background-color)" + - width: "24.5px" + - height: "24.5px" + - position: "absolute" + - left: "50%" + - top: "50%" + - transform: "translate(-50%,-50%)" + - margin-top: "35%" + - margin-left: "-35%" + - line-height: 0 + - display: "grid" + - background-color: > + [[[ + return "rgba(var(--color-red),1)"; + ]]] + value: "unavailable" + styles: + card: + - border-radius: "20px" + - box-shadow: "var(--box-shadow)" + - padding: "5px" + grid: + - grid-template-areas: "'n n n i1' 'l l l i2' 'i i . i3' 'i i . i4'" + - grid-template-columns: "1fr 1fr 1fr 1fr" + - grid-template-rows: "1fr 1fr 1fr 1fr" + - justify-items: "center" + icon: + - color: "rgba(var(--color-theme),0.2)" + img_cell: + - background-color: "rgba(var(--color-theme),0.05)" + - border-radius: "50%" + - width: "75%" + - height: "75%" + - max-width: "none" + - max-height: "none" + - position: "absolute" + - left: "50%" + - top: "50%" + - transform: "translate(-50%,-50%)" + - margin-top: "25%" + - margin-left: "-25%" + name: + - justify-self: "start" + - align-self: "end" + - font-weight: "bold" + - font-size: "14px" + - margin-left: "12px" + - margin-bottom: "10%" + label: + - justify-self: "start" + - align-self: "start" + - font-weight: "bold" + - font-size: "12px" + - filter: "opacity(40%)" + - margin-left: "12px" + - margin-top: "-10%" + state: + - justify-self: "start" + - font-weight: "bold" + - font-size: "12px" + - filter: "opacity(40%)" + - margin-left: "6px" + custom_fields: + i1: + - border-radius: "50%" + - width: "80%" + - height: "80%" + - line-height: 0 + - display: "grid" + i2: + - border-radius: "50%" + - width: "80%" + - height: "80%" + - line-height: 0 + - display: "grid" + i3: + - border-radius: "50%" + - width: "80%" + - height: "80%" + - line-height: 0 + - display: "grid" + i4: + - border-radius: "50%" + - width: "80%" + - height: "80%" + - line-height: 0 + - display: "grid" + custom_fields: + notification: > + [[[ + if (entity.state =='unavailable'){ + return `` + } + ]]] + i1: + card: + type: "custom:button-card" + template: > + [[[ + var templates = ['widget_icon_room']; + if (variables?.entity_1?.templates?.length) { + return ['widget_icon_room'].concat(variables.entity_1.templates); + } + return templates; + ]]] + variables: "[[[ return variables.entity_1; ]]]" + entity: > + [[[ + if (variables.entity_1.entity_id) { + return variables.entity_1.entity_id; + } + ]]] + state: + - operator: "template" + value: "[[[ return !variables.entity_1; ]]]" + styles: + card: + - display: "none" + + i2: + card: + type: "custom:button-card" + template: > + [[[ + var templates = ['widget_icon_room']; + if (variables?.entity_2?.templates?.length) { + return ['widget_icon_room'].concat(variables.entity_2.templates); + } + return templates; + ]]] + variables: "[[[ return variables.entity_2; ]]]" + entity: > + [[[ + if (variables?.entity_2?.entity_id) { + return variables.entity_2.entity_id; + } + ]]] + state: + - operator: "template" + value: "[[[ return !variables.entity_2; ]]]" + styles: + card: + - display: "none" + + i3: + card: + type: "custom:button-card" + template: > + [[[ + var templates = ['widget_icon_room']; + if (variables?.entity_3?.templates?.length) { + return ['widget_icon_room'].concat(variables.entity_3.templates); + } + return templates; + ]]] + variables: "[[[ return variables.entity_3; ]]]" + entity: > + [[[ + if (variables?.entity_3?.entity_id) { + return variables.entity_3.entity_id; + } + ]]] + state: + - operator: "template" + value: "[[[ return !variables.entity_3; ]]]" + styles: + card: + - display: "none" + i4: + card: + type: "custom:button-card" + template: > + [[[ + var templates = ['widget_icon_room']; + if (variables?.entity_4?.templates?.length) { + return ['widget_icon_room'].concat(variables.entity_4.templates); + } + return templates; + ]]] + variables: "[[[ return variables.entity_4; ]]]" + entity: > + [[[ + if (variables?.entity_4?.entity_id) { + return variables.entity_4.entity_id; + } + ]]] + state: + - operator: "template" + value: "[[[ return !variables.entity_4; ]]]" + styles: + card: + - display: "none" + +widget_icon_room: + variables: + tap_action: + action: toggle + hold_action: + action: none + tap_action: + action: > + [[[ if (variables?.tap_action?.action) return variables.tap_action.action; else return 'none'; ]]] + entity: "[[[ return variables.tap_action.entity; ]]]" + navigation_path: "[[[ return variables.tap_action.navigation_path; ]]]" + url_path: "[[[ return variables.tap_action.url_path; ]]]" + service: "[[[ return variables.tap_action.service; ]]]" + service_data: "[[[ return variables.tap_action.service_data; ]]]" + hold_action: + action: > + [[[ if (variables?.hold_action?.action) return variables.hold_action.action; else return 'none'; ]]] + entity: "[[[ return variables.hold_action.entity; ]]]" + navigation_path: "[[[ return variables.hold_action.navigation_path; ]]]" + url_path: "[[[ return variables.hold_action.url_path; ]]]" + service: "[[[ return variables.hold_action.service; ]]]" + service_data: "[[[ return variables.hold_action.service_data; ]]]" + show_icon: true + show_name: false + styles: + grid: + - grid-template-areas: "'i'" + card: + - height: "100%" + - box-shadow: "none" + - padding: "0px" + icon: + - width: "50%" + - height: "50%" + - line-height: "0" + - color: "rgba(var(--color-theme),0.2)" + img_cell: + - border-radius: "50%" + - background-color: "rgba(var(--color-theme),0.05)" + size: "15px" + color: "var(--google-grey)" \ No newline at end of file diff --git a/docs/assets/img/room-card.png b/docs/assets/img/room-card.png new file mode 100644 index 0000000000000000000000000000000000000000..39cdcf18fe183b5b4ddbdebdde2be1e8c3453055 GIT binary patch literal 22704 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 literal 0 HcmV?d00001 diff --git a/docs/usage/cards/card_room.md b/docs/usage/cards/card_room.md new file mode 100644 index 000000000..a325c5942 --- /dev/null +++ b/docs/usage/cards/card_room.md @@ -0,0 +1,82 @@ +--- +title: card_room +hide: + - toc +--- + + +## Description + +![Image title](../../assets/img/ulm_cards/card_room.png){ width="500" } + +This is the `room-card`, used to show the state of single room in a quick glance. +The card has support for 4 subicons at the right side of the card. These can be configured using custom colors and tap actions. + +## Variables + +| Variable | Default | Required | Notes | Requirement | +|----------------------------------------|-----------------|------------------|----------------|-------------| +| label_use_temperature | `true` | :material-close: | Define whether the label should show the current room temperature | The temperature should be provide by either a `temperature` or `current_temperature` attribute or by the entity state | +| label_use_brightness | `false` | :material-close: | Define whether the label should show the current room brightness of the lights| requires `label_use_temperature` to be false | +| entity_1 | | :material-close: | a `room_entity` object (see below) | | +| entity_2 | | :material-close: | a `room_entity` object (see below) | | +| entity_3 | | :material-close: | a `room_entity` object (see below) | | +| entity_4 | | :material-close: | a `room_entity` object (see below) | | + +## Room entity + +| Variable | Default | Required | Notes | Requirement | +|----------------------------------------|-----------------|------------------|----------------|-------------| +| entity_id | | :material-check: | The entity_id of the status icon | | +| templates | | :material-close: | List of the additional button card templates to apply to this icon | | +| tap_action | | :material-close: | tap_action for the icon (see button card documentation for options) | | +| hold_action | | :material-close: | tap_action for the icon (see button card documentation for options) | | + +## Usage + +```yaml + - type: 'custom:button-card' + template: + - card_room + - red + name: Bathroom + entity: light.bathroom + icon: mdi:shower-head + tap_action: + action: navigate + navigation_path: '/ui-lovelace-minimalist/bathroom' + variables: + label_use_temperature: false + label_use_brightness: true + entity_1: + entity_id: light.bathroom + templates: + - yellow_on + tap_action: + action: toggle + entity_2: + entity_id: binary_sensor.badkamer_motion_sensor + templates: + - blue_on + tap_action: + action: none + entity_3: + entity_id: input_boolean.badkamer_motionsensor_enabled + templates: + - green_on + - red_off + tap_action: + action: toggle + entity_4: + entity_id: input_boolean.bath_mode + templates: + - pink_on + tap_action: + action: toggle +``` + +??? note "Template Code" + + ```yaml title="card_room.yaml" + --8<-- "custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml" + ``` From d46a932a5910db6b275e4f8ff77b1b1062020b7b Mon Sep 17 00:00:00 2001 From: Bavo Mees Date: Wed, 26 Jan 2022 19:26:32 +0100 Subject: [PATCH 2/5] Improved Room card documentation --- docs/usage/cards/card_room.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/usage/cards/card_room.md b/docs/usage/cards/card_room.md index a325c5942..f5b438d85 100644 --- a/docs/usage/cards/card_room.md +++ b/docs/usage/cards/card_room.md @@ -32,6 +32,19 @@ The card has support for 4 subicons at the right side of the card. These can be | tap_action | | :material-close: | tap_action for the icon (see button card documentation for options) | | | hold_action | | :material-close: | tap_action for the icon (see button card documentation for options) | | +# Default card options +All the options from the button card are still available for the large room card. +If you want to tweak this card a little bit more, below are some examples. The full list can be found here: [link](https://github.com/custom-cards/button-card#main-options) + +| Options | Default | Required | Notes | Requirement | +|----------------------------------------|-----------------|------------------|----------------|-------------| +| entity | | :material-close: | The entity_id for the large card | | +| icon | | :material-close: | Icon to display. Defaults to the entity icon | | +| tap_action | | :material-close: | Define the type of action on click, if undefined, toggle will be used.| see [Action](https://github.com/custom-cards/button-card#Action)| +| hold_action | | :material-close: | Define the type of action on hold, if undefined, nothing happens | see [Action](https://github.com/custom-cards/button-card#Action)| +| label | | :material-close: | Change the label text | | +| title | | :material-close: | Change the title text | | + ## Usage ```yaml From 241d3ee2f373d13d1cbdca960644752d9dd274d3 Mon Sep 17 00:00:00 2001 From: Bavo Mees Date: Fri, 28 Jan 2022 16:40:32 +0100 Subject: [PATCH 3/5] Fix trailing whitespaces --- .../card_templates/cards/card_room.yaml | 10 ++--- docs/usage/cards/card_room.md | 37 +++++++++++++------ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml index d328091a1..c8592f4ce 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml @@ -92,7 +92,7 @@ card_room: - font-size: "12px" - filter: "opacity(40%)" - margin-left: "12px" - - margin-top: "-10%" + - margin-top: "-10%" state: - justify-self: "start" - font-weight: "bold" @@ -233,9 +233,9 @@ card_room: widget_icon_room: variables: tap_action: - action: toggle + action: "toggle" hold_action: - action: none + action: "none" tap_action: action: > [[[ if (variables?.tap_action?.action) return variables.tap_action.action; else return 'none'; ]]] @@ -245,7 +245,7 @@ widget_icon_room: service: "[[[ return variables.tap_action.service; ]]]" service_data: "[[[ return variables.tap_action.service_data; ]]]" hold_action: - action: > + action: > [[[ if (variables?.hold_action?.action) return variables.hold_action.action; else return 'none'; ]]] entity: "[[[ return variables.hold_action.entity; ]]]" navigation_path: "[[[ return variables.hold_action.navigation_path; ]]]" @@ -270,4 +270,4 @@ widget_icon_room: - border-radius: "50%" - background-color: "rgba(var(--color-theme),0.05)" size: "15px" - color: "var(--google-grey)" \ No newline at end of file + color: "var(--google-grey)" diff --git a/docs/usage/cards/card_room.md b/docs/usage/cards/card_room.md index f5b438d85..272774a5b 100644 --- a/docs/usage/cards/card_room.md +++ b/docs/usage/cards/card_room.md @@ -9,15 +9,21 @@ hide: ![Image title](../../assets/img/ulm_cards/card_room.png){ width="500" } -This is the `room-card`, used to show the state of single room in a quick glance. +This is the `room-card`, used to show the state of single room in a quick glance. The card has support for 4 subicons at the right side of the card. These can be configured using custom colors and tap actions. ## Variables | Variable | Default | Required | Notes | Requirement | |----------------------------------------|-----------------|------------------|----------------|-------------| -| label_use_temperature | `true` | :material-close: | Define whether the label should show the current room temperature | The temperature should be provide by either a `temperature` or `current_temperature` attribute or by the entity state | -| label_use_brightness | `false` | :material-close: | Define whether the label should show the current room brightness of the lights| requires `label_use_temperature` to be false | +| label_use_temperature | `true` | :material-close: +| Define whether the label should show the current room temperature +| The temperature should be provide by either a `temperature` or `current_temperature` attribute or by the entity state +| +| label_use_brightness | `false` | :material-close: +| Define whether the label should show the current room brightness of the lights +| requires `label_use_temperature` to be false +| | entity_1 | | :material-close: | a `room_entity` object (see below) | | | entity_2 | | :material-close: | a `room_entity` object (see below) | | | entity_3 | | :material-close: | a `room_entity` object (see below) | | @@ -32,16 +38,23 @@ The card has support for 4 subicons at the right side of the card. These can be | tap_action | | :material-close: | tap_action for the icon (see button card documentation for options) | | | hold_action | | :material-close: | tap_action for the icon (see button card documentation for options) | | -# Default card options -All the options from the button card are still available for the large room card. +## Default card options + +All the options from the button card are still available for the large room card. If you want to tweak this card a little bit more, below are some examples. The full list can be found here: [link](https://github.com/custom-cards/button-card#main-options) | Options | Default | Required | Notes | Requirement | |----------------------------------------|-----------------|------------------|----------------|-------------| | entity | | :material-close: | The entity_id for the large card | | | icon | | :material-close: | Icon to display. Defaults to the entity icon | | -| tap_action | | :material-close: | Define the type of action on click, if undefined, toggle will be used.| see [Action](https://github.com/custom-cards/button-card#Action)| -| hold_action | | :material-close: | Define the type of action on hold, if undefined, nothing happens | see [Action](https://github.com/custom-cards/button-card#Action)| +| tap_action | | :material-close: +| Define the type of action on click, if undefined, toggle will be used. +| see [Action](https://github.com/custom-cards/button-card#Action) +| +| hold_action | | :material-close: +| Define the type of action on hold, if undefined, nothing happens +| see [Action](https://github.com/custom-cards/button-card#Action) +| | label | | :material-close: | Change the label text | | | title | | :material-close: | Change the title text | | @@ -49,7 +62,7 @@ If you want to tweak this card a little bit more, below are some examples. The f ```yaml - type: 'custom:button-card' - template: + template: - card_room - red name: Bathroom @@ -65,26 +78,26 @@ If you want to tweak this card a little bit more, below are some examples. The f entity_id: light.bathroom templates: - yellow_on - tap_action: + tap_action: action: toggle entity_2: entity_id: binary_sensor.badkamer_motion_sensor templates: - blue_on - tap_action: + tap_action: action: none entity_3: entity_id: input_boolean.badkamer_motionsensor_enabled templates: - green_on - red_off - tap_action: + tap_action: action: toggle entity_4: entity_id: input_boolean.bath_mode templates: - pink_on - tap_action: + tap_action: action: toggle ``` From 5d682d98185fa0b19b16ca96c7cccf394a5a2304 Mon Sep 17 00:00:00 2001 From: Bavo Mees Date: Fri, 28 Jan 2022 17:05:01 +0100 Subject: [PATCH 4/5] added basic support for on/off translations to the room card --- .../ulm_templates/card_templates/cards/card_room.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml index c8592f4ce..a31c47024 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml @@ -30,6 +30,12 @@ card_room: } else { return variables.ulm_unavailable; } + } else if (entity.state == "on") { + return variables.ulm_on + } else if (entity.state == "off") { + return variables.ulm_off + } else { + return entity.state } ]]] state: From e215e8dd7687348e479ff886ec763aa6f5b29a8f Mon Sep 17 00:00:00 2001 From: Bavo Mees Date: Mon, 31 Jan 2022 13:30:41 +0100 Subject: [PATCH 5/5] Fix small bug in room card --- .../lovelace/ulm_templates/card_templates/cards/card_room.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml index a31c47024..bc63458a8 100644 --- a/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml +++ b/custom_components/ui_lovelace_minimalist/lovelace/ulm_templates/card_templates/cards/card_room.yaml @@ -267,6 +267,7 @@ widget_icon_room: - height: "100%" - box-shadow: "none" - padding: "0px" + - border-radius: "50%" icon: - width: "50%" - height: "50%"