NSPanel Pro UI Design with Lovelace

sonoff Medium

I wanted to create a suitable custom design for my NSPanel Pro, that is not just regular Lovelace squished into a square shape.

Also something in common style for the regular NSPanel.
Mixing original Sonoff styles, some Lovelace, and some personal preferences from experience of years being a designer.

I am currently in process of converting it into Lovelace (and in the future, also Nextion). If you would like to participate, I can share the Figma edit access and create a Github. Here is the design file on Figma.

demo Medium

Main design elements are sharp SVG emoji, which change based on weather, time of day, and moon phase at night.

Every element, their colors and positions change based on conditions like time of day, temperature, and animate - so itโ€™s always different, never boring.

Some screenshots of what I currently have running already, taken at random times:

25 Likes

Tervitused!

Love the UI design, itโ€™s modern, sleek and minimalistic, I havenโ€™t seen any other designs that great.
To be honest, lack of a (in my mind) good custom design has been holding me off from purchasing a NSPanel Pro and integrating it to my home. So this might change if you get this UI released.
Like especially the designs in the first pictures, with the minimalistic icons and blue/black backgrounds.

Sadly not capable of helping with the technical parts :frowning:

Jรตudu ning hoia edusammudega kursis.

1 Like

Aitรคh! :slight_smile: Itโ€™s not the most useful of comfortable gadget due to itโ€™s small size and view angle being wall mounted, but still fun to play with. For usefulness Iโ€™d recommend any Android tablet :stuck_out_tongue:

The icon grid is actually the easiest part, also ready:

type: custom:auto-entities
card:
  type: custom:layout-card
  layout_type: custom:grid-layout
  layout:
    grid-template-columns: repeat(auto-fit,minmax(clamp(100%/(3 + 1) + 0.1%, 100px,100%),1fr))
    grid-template-rows: repeat(auto-fit,1fr)
    align-items: stretch
    margin: 0
    padding: 0
    grid-gap: 0.5rem
    width: 100%
    height: 100%
card_param: cards
filter:
  include:
    - area: kitchen
      options:
        type: custom:button-card
        color: auto-no-temperature
        entity_id: this.entity_id
        template: nspanel
  exclude:
    - domain: /automation|script|scene|camera|select/
    - state: /unavailable|unknown/
    - attributes:
        device_class: battery
    - entity_category: /diagnostic|config/
    - hidden_by: /user|integration/
    - integration: /group/
sort:
  method: friendly_name
  numeric: false
  reverse: false
  ignore_case: true
card_mod:
  style: |
    :root{
      height:100%;
    }
    ha-card{
      height:480px;
      width:480px;
    }

with custom:button-card

add this to the top of the Raw Configuration Editor on your dashboard

button_card_templates:
  nspanel:
    show_state: true
    show_name: true
    use_state_color: true
    compact: false
    color: auto
    layout: vertical
    color_type: card
    show_entity_picture: false
    size: 25%
    hold_action:
      action: more-info
    state:
      - value: 'off'
        styles:
          icon:
            - color: var(--primary-color)
      - value: 'on'
        styles:
          card:
            - background-image: >-
                linear-gradient(var(--primary-color) 0%,
                var(--button-card-light-color) 50%)
          icon:
            - color: var(--primary-background-color)
          name:
            - color: var(--primary-background-color)
            - font: var(--h4-font)
          state:
            - display: none
    styles:
      card:
        - background: var(--primary-background-color)
      icon:
        - color: var(--primary-color)
      name:
        - color: var(--primary-text-color)
        - font: var(--h4-font)
      state:
        - color: var(--primary-text-color)
        - opacity: 0.5
        - font: var(--h5-font)
    card_mod:
      style: |
        ha-card{
          border-radius:8px;
          height: 100%;
        }       
4 Likes

Impressive, jaw-dropping and sleek design!!!
keep up, I really like your work and Iโ€™m waiting for your code
thanks!

1 Like

Itโ€™s a work in progress since I want to cover all my entity needs and keep it broad enough so everyone can use it. I hope nobody minds if I use this thread as a live blog :stuck_out_tongue:

I am heavily relying on:

Here are some more views:

Climate

climate

type: custom:layout-card
layout_type: custom:grid-layout
cards:
  - type: custom:more-info-card
    entity: climate.livingroom
    card_mod:
      style:
        $: |
          .card-header {
            display:none !important;
          }
        .: |
          .card-content {
            padding: 1rem;
            margin: 0;
            display:flex;
            flex-direction: column;
            box-sizing:border-box;
            justify-content: center;
            height: 100%;
            --mdc-select-ink-color: var(--accent-color);
            --mdc-select-label-ink-color: var(--secondary-text-color);
            --mdc-select-dropdown-icon-color: var(--primary-color);
            --mdc-select-idle-line-color: var(--secondary-background-color);
          }
          ha-card{
            box-sizing:border-box;
            height: 100%;
            background: transparent;
          } 
          ha-card state-card-content{
            flex: 0;
          }
          ha-card state-card-climate{
            display:flex;
            flex-direction: column;
            justify-content: center;
            box-sizing:border-box;
            height: 100%;
            border-radius: var(--ha-card-border-radius);
            --mdc-icon-size: 3rem;
          } 
          ha-card more-info-content{
            flex: 4;
            display:flex;
            flex-direction: column;
            justify-content: center;
            box-sizing:border-box;
            height: 100%;
          } 
          ha-card more-info-climate{
            display:flex;
            flex-direction: column;
            justify-content: center;
            box-sizing:border-box;
            height: 100%;
          } 
        state-card-climate:
          $: |
            ha-climate-state{
              overflow:hidden;
              position:relative;
              font:var(--card-title-font);
              flex:1;
            } 
            state-info{
              font:var(--card-title-font);
              flex:2;
              color:red;
            } 
          .: |
            div.name{
              background: blue;
            } 
        state-card-climate$state-info:
          $: |
            div.name{
              color:var(--secondary-text-color);
            } 
        state-card-climate$ha-climate-state:
          $: |
            div.target{
              display:none;
            } 
            div.current{
              color:var(--secondary-text-color);
              margin-left:100%;
            } 
            div.unit{
              position: absolute;
              right: 0;
            } 
        more-info-climate:
          $: |
            div.container-temperature > div > div:first-child{
              display:none;
            } 
            div:first-child:not(.autos){
              display:flex;
              flex-direction: column;
              justify-content: center;
              box-sizing:border-box;
              height: 100%;
              width: 100%;
              display:grid;
              grid-template-columns: repeat(auto-fit,minmax(clamp(100%/(2 + 1) + 0.1%,125px,100%),1fr));
              grid-template-rows: repeat(auto-fit,1fr);
              grid-column-gap: 1rem;
              margin: 0;
              padding: 0;
            } 
            div:not(.autos){
              display: flex;
              align-items: flex-end;
              justify-content: center;
            } 
            ha-climate-control, .container-temperature{
              grid-column: span 2;
              display: flex;
              align-items: center;
              box-sizing:border-box;
            } 
            .container-temperature ha-climate-control{
              --mdc-theme-on-primary: red !important;
              --mdc-theme-text-disabled-on-light: red !important;
              --mdc-icon-size: 3rem !important;
            }
        more-info-climate$ha-climate-control:
          $: |
            div#target_temperature{
              font:var(--h1-font);
              flex: 2;
              text-align:center;
            }
            div.control-buttons{
              flex: 1;
              display:flex;
              flex-direction: column;
              color:var(--primary-color);
            }
            div.control-buttons div{
              flex: 1;
            }
          .: |
            div#target_temperature{
              background:green;
            }
            ha-card .header__icon {
                color:
                  {% set mode = states('climate.livingroom') %} {% if mode == 'off' %} grey {% elif mode =='auto' %} green {% elif mode == 'heat' %} red{% else %} grey {% endif %};
            }
  - type: custom:more-info-card
    entity: climate.bedroom
    card_mod:
      style:
        $: |
          .card-header {
            display:none !important;
          }
        .: |
          .card-content {
            padding: 1rem;
            margin: 0;
            display:flex;
            flex-direction: column;
            box-sizing:border-box;
            justify-content: center;
            height: 100%;
            --mdc-select-ink-color: var(--accent-color);
            --mdc-select-label-ink-color: var(--secondary-text-color);
            --mdc-select-dropdown-icon-color: var(--primary-color);
            --mdc-select-idle-line-color: var(--secondary-background-color);
          }
          ha-card{
            box-sizing:border-box;
            height: 100%;
            background: transparent;
          } 
          ha-card state-card-content{
            flex: 0;
          }
          ha-card state-card-climate{
            display:flex;
            flex-direction: column;
            justify-content: center;
            box-sizing:border-box;
            height: 100%;
            border-radius: var(--ha-card-border-radius);
            --mdc-icon-size: 3rem;
          } 
          ha-card more-info-content{
            flex: 4;
            display:flex;
            flex-direction: column;
            justify-content: center;
            box-sizing:border-box;
            height: 100%;
          } 
          ha-card more-info-climate{
            display:flex;
            flex-direction: column;
            justify-content: center;
            box-sizing:border-box;
            height: 100%;
          } 
        state-card-climate:
          $: |
            ha-climate-state{
              overflow:hidden;
              position:relative;
              font:var(--card-title-font);
              flex:1;
            } 
            state-info{
              font:var(--card-title-font);
              flex:2;
              color:red;
            } 
          .: |
            div.name{
              background: blue;
            } 
        state-card-climate$state-info:
          $: |
            div.name{
              color:var(--secondary-text-color);
            } 
        state-card-climate$ha-climate-state:
          $: |
            div.target{
              display:none;
            } 
            div.current{
              color:var(--secondary-text-color);
              margin-left:100%;
            } 
            div.unit{
              position: absolute;
              right: 0;
            } 
        more-info-climate:
          $: |
            div.container-temperature > div > div:first-child{
              display:none;
            } 
            div:first-child:not(.autos){
              display:flex;
              flex-direction: column;
              justify-content: center;
              box-sizing:border-box;
              height: 100%;
              width: 100%;
              display:grid;
              grid-template-columns: repeat(auto-fit,minmax(clamp(100%/(2 + 1) + 0.1%,125px,100%),1fr));
              grid-template-rows: repeat(auto-fit,1fr);
              grid-column-gap: 1rem;
              margin: 0;
              padding: 0;
            } 
            div:not(.autos){
              display: flex;
              align-items: flex-end;
              justify-content: center;
            } 
            ha-climate-control, .container-temperature{
              grid-column: span 2;
              display: flex;
              align-items: center;
              box-sizing:border-box;
            } 
            .container-temperature ha-climate-control{
              --mdc-theme-on-primary: red !important;
              --mdc-theme-text-disabled-on-light: red !important;
              --mdc-icon-size: 3rem !important;
            }
        more-info-climate$ha-climate-control:
          $: |
            div#target_temperature{
              font:var(--h1-font);
              flex: 2;
              text-align:center;
            }
            div.control-buttons{
              flex: 1;
              display:flex;
              flex-direction: column;
              color:var(--primary-color);
            }
            div.control-buttons div{
              flex: 1;
            }
          .: |
            div#target_temperature{
              background:green;
            }
layout:
  grid-template-columns: repeat(auto-fit,minmax(clamp(100%/(1 + 1) + 0.1%, 400px,100%),1fr))
  grid-template-rows: auto
  align-items: stretch
  margin: 0
  height: 100%
  grid-gap: 1rem
  box-sizing: border-box

Lights

Ignore the missing padding in screenshots, it is added by the NSPanels outside frame anyway

type: custom:auto-entities
card:
  type: custom:layout-card
  layout_type: custom:grid-layout
  layout:
    grid-template-columns: repeat(auto-fit,minmax(clamp(100%/(8 + 1) + 0.1%, 3rem,50%),1fr))
    grid-template-rows: repeat(auto-fit,1fr)
    align-items: stretch
    padding: 0
    margin: 0
    grid-gap: 2rem
    box-sizing: border-box
    height: 100%
    width: 100%
card_param: cards
filter:
  include:
    - domain: light
      group: light.kitchen
      options:
        entity_id: this.entity_id
        type: custom:more-info-card
        card_mod:
          style:
            $: |
              .card-header {
                display:none !important;
              }
            .: |
              .card-content {
                height: 100%;
                padding: 0;
                margin: 0;
              }
              ha-card{
                background: transparent;
                height: 100%;
              } 
              ha-card state-card-content{
                display:none;
              }
              ha-card more-info-content{
                height: 100%;
              }              
              ha-card more-info-light{
                height: 100%;
              }                            
              ha-card ha-attributes{
                display:none;              
              } 
            more-info-light:
              $: |
                ha-attributes{
                  display:none;
                }             
                .controls{
                  flex: 4;
                  height: 100%;
                  margin: 0;
                }            
                ha-more-info-light-brightness, ha-more-info-toggle{
                  flex: 5;
                  width: 100%;
                  margin: 0 !important;
                }                
                .buttons{
                  flex:0 1 1rem;
                  padding: 0 !important;
                  margin: 0 !important;
                }
                .buttons > *{
                  margin: 0 !important;
                  --md-sys-color-outline: var(--primary-background-color);
                  --md-sys-color-on-surface-variant: var(--primary-color);
                }                
                .buttons ha-button-menu md-outlined-icon-button{
                  --md-sys-color-outline: var(--primary-background-color);
                  --md-sys-color-on-surface-variant: var(--state-light-inactive-color);
                }
                 
                .buttons > md-outlined-icon-button:nth-child(2){
                  display:none;
                }                
              .: |
                ha-attributes{
                  background: blue;
                } 
                .controls{
                  background: red !important;
                }
            mwc-list:
              $: |
                mwc-list-item {
                  background: red !important;
                }
            more-info-light-brightness$ha-control-slider:
              $: |
                .slider .slider-track-background{
                  background: var(--control-slider-color)
                }                                 
            more-info-light$md-outlined-icon-button:
              $: |
                md-outlined-icon-button{
                  background: red !important;
                }                 
            md-outlined-icon-button$ha-button-menu:
              $: |
                md-outlined-icon-button{
                  background: red !important;
                }                                 
            more-info-light$ha-more-info-light-brightness:
              $: |
                ha-control-slider{
                  --control-slider-border-radius:1rem !important;              
                  width:100% !important;
                  height: 100% !important;
                  max-height: none !important;
                } 
            more-info-light$ha-more-info-toggle:
              $: |
                ha-control-switch{
                  height: 100% !important;
                  width: 100% !important;
                  max-height: none !important;
                }                          
            more-info-light$ha-more-info-state-header:
              $: |
                .name{
                  font:var(--h5-font) !important;
                  text-overflow:ellipsis;
                  overflow:hidden;
                  white-space: nowrap;
                  padding: 0 0 1rem 0;
                  margin: 0 !important;
                } 
                .state{
                  display:none;
                }                   
            ha-more-info-toggle:
              $: |
                ha-control-switch{
                  height: 100%;
                  width: 100%;
                }
              .: |
                ha-control-switch{
                  height: 100%;
                }              
            ha-more-info-toggle$ha-control-switch:
              $: |
                :root{
                  background: red;
                }
  exclude:
    - hidden_by: /user|integration/
    - state: /unknown|unavailable/
sort:
  method: name
  numeric: true
  reverse: true
card_mod:
  style: |
    :root{
      min-height:100%;
      --control-slider-border-radius: 20rem;
    }

3 Likes

Media player

  • show playing only
  • swipe through all playing media_player entities

media

type: custom:auto-entities
card:
  type: custom:swipe-card
  parameters:
    loop: false
    preloadImages: true
    cssMode: true
    resistance: true
    pagination:
      type: bullets
      clickable: false
      hideOnClick: true
      dynamicBullets: false
  card_mod:
    style: |
      swipe-card{
        background: transparent;
        height: 100%;
        width: 100%;
      }
  layout_type: custom:grid-layout
  layout:
    grid-template-columns: repeat(3, minmax(100%, 1fr));
    grid-template-rows: repeat(3, minmax(100vh, 1fr));
    grid-gap: 0
    margin: 0
    padding: 0
    height: 100%
    width: 100%
card_param: cards
filter:
  include:
    - domain: media_player
      options:
        type: custom:mini-media-player
        card_mod:
          style: |
            ha-card{
              background: transparent;
              height: 100vh;
              width: 100%;
            }
        artwork: cover
        group: false
        volume_stateless: false
        toggle_power: true
        source: icon
        sound_mode: full
        hide:
          volume: false
          source: false
          power_state: false
          info: false
          runtime: false
          icon_state: false
          prev: true
          next: false
          jump: true
          progress: false
          name: false
        entity: this.entity_id
  exclude:
    - state: /unavailable|unknown|off/
    - hidden_by: /user|integration/
sort:
  method: state
  reverse: true
card_mod:
  style: |
    :host{
      height: 100vh !important;
    }
    ha-card, swipe-card, auto-entities{
      height: 100vh !important;
    }
    :host .swiper-pagination-bullets{
      bottom:2rem !important;
    }

2 Likes

Entity grid

For quick toggling on/off lights, covers, locks, etc.

grid

type: custom:auto-entities
card:
  type: custom:layout-card
  layout_type: custom:grid-layout
  layout:
    grid-template-columns: repeat(auto-fit,minmax(clamp(100%/(3 + 1) + 0.1%, 100px,100%),1fr))
    grid-template-rows: auto
    align-items: stretch
    box-sizing: border-box
    margin: 0
    padding: 0
    grid-gap: 0.5rem
    width: 100vw
    height: 100vh
  card_mod:
    style: |
      :root{
        height:100%;
      }
      ha-card{
        height:100%;
      }    
card_param: cards
filter:
  include:
    - domain: light
      group: light.areas
      options:
        type: custom:button-card
        color: auto-no-temperature
        entity_id: this.entity_id
        template: nspanel
        show_state: false
    - domain: cover
      area: bedroom
      options:
        type: custom:button-card
        color: auto-no-temperature
        entity_id: this.entity_id
        template: nspanel
    - entity_id: lock.gate
      options:
        type: custom:button-card
        color: auto-no-temperature
        entity_id: this.entity_id
        template: nspanel
  exclude:
    - state: /unavailable|unknown/
    - hidden_by: /user|integration/
sort:
  method: domain
  numeric: false
  reverse: false
  ignore_case: true
card_mod:
  style: |
    :root{
      height:100%;
    }
    ha-card{
      height:100%;
    }

5 Likes

This is awesome! Iโ€™m also eagerly waiting for Nextion version, Iโ€™ve already started using ESPHome with my non-pro NSPanel, and something like in your first post is exactly what I would like to have :slight_smile:

Unfortunately there is no Nextion Editor for Mac, and it sucks donkey balls anyway to create anything nice looking. So it will be postponedโ€ฆ I personally currently use the stock NSPanel UI / TFT with ESPHome to control it.

If someone is more familiar with the app, I can export assets to the generator.

Very nice design indeed. Iโ€™m using the Lovelace integration but the result I have is not as nice as this one.

I really like the look and feel.

1 Like

Sorry for my ignorance but how can I use your great looking UI?

Until now Iโ€™ve been using HA just for integrating all my devices into one portal and then link it to Homekit. Since a few days I have a NSPanel Pro and now I feel the need to create an appropriate dashboard.

  1. Create a new dashboard
  2. Paste YAML from from the views youโ€™d like to have into your dashboard.
  3. โ€ฆ Itโ€™s a work in progress, not all is ready, will continue to update if more time

edit:
I use Fully Kiosk Browser, to show my Home Assistant Lovelace dashboard. You have to get developer options for the NSPro, explained here:

2 Likes

Do you have that nice weather / time of day animated screen available as well?

edit: almost forgot, it also has slight animations built in :blush: gif is jagged but the animations are smooth and unobtrusive.

video

Moon

  1. Add moon integration and create sensor
    1.1 - integrations/moon
    1.2 - create template sensor for emoji and picture. Rename it to โ€œsensor.moon_phaseโ€
template:
- sensor:
    - unique_id: moon_moon
      name: >-
        {{ state_attr('sensor.moon','friendly_name') }}
      icon: >-
        {{ state_attr('sensor.moon','icon') }}
      state: >-
        {{ states('sensor.moon') | replace('_',' ') | capitalize }}
      attributes:
        entity_picture: >-
          {% set moon = states('sensor.moon') %}
          {% set face = '_face' if moon in ['first_quarter','last_quarter','full_moon','new_moon'] else '' %}
            /local/emoji/moon/{{moon}}{{face}}.svg
        emoji: >-
          {% set values = {'first_quarter':'๐ŸŒ“','last_quarter':'๐ŸŒ—','full_moon':'๐ŸŒ•','new_moon':'๐ŸŒ‘','waxing_crescent':'๐ŸŒ’','waning_gibbous':'๐ŸŒ–','waxing_gibbous':'๐ŸŒ”','waning_crescent':'๐ŸŒ˜'} %}
          {% if moon in ['first_quarter','last_quarter','full_moon','new_moon'] %}
            {% set values = {'first_quarter':'๐ŸŒ›','last_quarter':'๐ŸŒœ','full_moon':'๐ŸŒ','new_moon':'๐ŸŒš'} 
            %}
          {% endif %}            
          {% set value = states('sensor.moon') %}  
          {{ values[value] if value in values.keys() else 'off' }}

Weather

Create a template sensor Weather. Rename your weather entity_id! Rename the sensor to โ€œsensor.weatherโ€

template:
- sensor:
    - unique_id: weather_forecast
      name: Weather Forecast
      icon: >-
        mdi:weather-{{ states('weather.hernes') }}
      state: >-
        {{ states('weather.hernes') | replace('_',' ') | capitalize }}
      attributes:
        forecast_high: >-
          {{ state_attr('weather.hernes','forecast')[0].temperature | int(0) | default(0) }}
        forecast_low: >-
          {{ state_attr('weather.hernes','forecast')[0].templow | int(0) | default(0) }}
        entity_picture: >-
          {%- set elevation = state_attr('sun.sun', 'elevation') | int -%}
          {%- set rising = state_attr('sun.sun', 'rising') -%}
          {%- set azimuth = state_attr('sun.sun', 'azimuth') | int -%}          
          {% set weather = states('weather.hernes') %}
          {% if weather == 'sunny' and elevation <= -12 %}
            {{ state_attr('sensor.moon_phase','entity_picture') }}
          {% else %}      
            {% if weather in ['unknown','unavailable'] %}
              /local/emoji/weather/{{ ['unicorn','sparkles','rainbow'] | random }}.svg
            {% else %}
              /local/emoji/weather/{{weather}}.svg
            {% endif %}   
          {% endif %}
        emoji: >-
          {%- set elevation = state_attr('sun.sun', 'elevation') | int -%}
          {%- set rising = state_attr('sun.sun', 'rising') -%}
          {%- set azimuth = state_attr('sun.sun', 'azimuth') | int -%}
          {% set values = {'cloudy':'โ˜๏ธ','fog':'๐ŸŒ','lightning-rainy':'โ›ˆ๏ธ','lightning':'๐ŸŒฉ๏ธ','partlycloudy':'โ›…','rainy':'๐ŸŒง๏ธ','snowy':'โ„๏ธ','snowy-rainy':'๐ŸŒจ๏ธ','sunny':'โ˜€๏ธ','windy':'๐ŸŒฌ๏ธ'} %}
          {% set value = states('weather.hernes') %}  
          {% if values[value] == 'โ˜€๏ธ' and elevation <= -12 %}
          {{ state_attr('sensor.moon_phase','emoji') }}
          {% else %}      
          {{ values[value] if value in values.keys() else '๐Ÿ’ฏ' }}       
          {% endif %}

Solar

Create sensor solar.
This get pictures based on states of weather, moon position, etc.
Rename it to โ€œsensor.solarโ€

template:
- sensor:
    - unique_id: solar
      name: >-
        {%- set elevation = state_attr('sun.sun', 'elevation') | int -%}
        {%- set rising = state_attr('sun.sun', 'rising') -%}
        {%- set azimuth = state_attr('sun.sun', 'azimuth') | int -%}
        {%- if elevation <= -12 -%}
          {%- if (0 <= azimuth <= 10) or (350 <= azimuth <= 360) -%}
            Midnight 
          {%- else -%}
            Night 
          {%- endif -%}
        {%- elif -6 < elevation <= 0 -%}
          {{- 'Sunrise' if rising else 'Sunset' -}}
        {%- elif -12 < elevation <= -6 -%}
          {{- 'Dawn' if rising else 'Dusk' -}}
        {%- else -%}
          {%- if 160 <= azimuth <= 200 -%}
            Noon
          {%- else -%}
            Day
          {%- endif -%}
        {%- endif -%}
      icon: >-
        {%- set elevation = state_attr('sun.sun', 'elevation') | int -%}
        {%- set rising = state_attr('sun.sun', 'rising') -%}
        {%- set azimuth = state_attr('sun.sun', 'azimuth') -%}
        {%- if elevation <= -12 -%}
          {%- if (0 <= azimuth <= 10) or (350 <= azimuth <= 360) -%}
            mdi:moon-waning-crescent 
          {%- else -%}
            mdi:weather-night 
          {%- endif -%}
        {%- elif -6 < elevation <= 0 -%}
          {{- 'mdi:theme-light-dark' if rising else 'mdi:weather-sunset' -}}
        {%- elif -12 < elevation <= -6 -%}
          {{- 'mdi:weather-sunset-up' if rising else 'mdi:weather-sunset-down' -}}
        {%- else -%}
          {%- if 160 <= azimuth <= 200 -%}
            mdi:white-balance-sunny
          {%- else -%}
            mdi:weather-sunny
          {%- endif -%}
        {%- endif -%}
      state: >-
        {%- set elevation = state_attr('sun.sun', 'elevation') -%}
        {%- set rising = state_attr('sun.sun', 'rising') -%}
        {%- set azimuth = state_attr('sun.sun', 'azimuth') -%}
        {%- if elevation <= -12 -%}
          {%- if (0 <= azimuth <= 10) or (350 <= azimuth <= 360) -%}
            ๐ŸŒš 
          {%- else -%}
            ๐ŸŒƒ 
          {%- endif -%}
        {%- elif -6 < elevation <= 0 -%}
          {{- '๐ŸŒ…' if rising else '๐ŸŒ‡' -}}
        {%- elif -12 < elevation <= -6 -%}
          {{- '๐ŸŒ„' if rising else '๐ŸŒ†' -}}
        {%- else -%}
          {%- if 160 < azimuth < 200 -%}
            ๐ŸŒž
          {%- else -%}
            ๐Ÿ™๏ธ
          {%- endif -%}
        {%- endif -%}
      attributes:
        entity_picture: >-
          {% set weather = states('weather.hernes') %}
          {% set solar = state_attr('sensor.solar','friendly_name') %}
          {% if solar in ['Midnight','Night'] %}
            {{ state_attr('sensor.moon_phase','entity_picture') }}
          {% elif solar in ['Sunrise','Sunset','Dawn','Dusk'] %}
            /local/emoji/solar/{{solar}}.svg
          {% else %}
            {% if weather == 'sunny' %}
              {% if state_attr('weather.hernes','temperature') >= 0 %}
                /local/emoji/weather/{{weather}}.svg
              {%else%}
                /local/emoji/weather/snowy.svg
              {% endif %}                
            {% else %}
              /local/emoji/weather/{{weather}}.svg
            {% endif %}
          {% endif %}
        weather_picture: >-
          {{ state_attr('sensor.weather','entity_picture') }}
        weather_emoji: >-
          {{ state_attr('sensor.weather','emoji') }}
        solar_picture: >-
          {% set solar = state_attr('sensor.solar','friendly_name') %}
              /local/emoji/solar/{{solar}}.svg
        solar_emoji: >-
          {{ states('sensor.solar') }}
        moon_picture: >-
          {{ state_attr('sensor.moon_phase','entity_picture') }}
        moon_emoji: >-
          {{ state_attr('sensor.moon_phase','emoji') }}
        solar_moon_picture: >-
          {% set solar = state_attr('sensor.solar','friendly_name') %}
          {% if solar in ['Midnight','Night'] %}
            {{ state_attr('sensor.moon_phase','entity_picture') }}
          {% else %}
            /local/emoji/solar/{{solar}}.svg
          {% endif %}

Icons

Download the icons:

  1. Get Microsoft Fluent UI Emoji and add to your config/www folder
  2. :sparkles: [easier version] Export them from Figma, which style you like:
    2.1 - 3D emoji
    2.2 - Flat emoji

It now exports SVG icons with correct names, and puts them in appropriate folders, eg. /emoji/solar/noon.svg

Select the menu icon โ†’ file โ†’ export and all get saved with correct naming the sensor uses:

Layout

Create a new view, add this code and change sensor names:

type: custom:layout-card
layout_type: custom:grid-layout
cards:
  - type: custom:layout-card
    layout_type: custom:grid-layout
    cards:
      - type: markdown
        content: >-
          <img id="main_shadow" src="{{state_attr('sensor.solar','moon_picture') }}" height="48" width="48">
        card_mod:
          style: |
            ha-card{
              background: transparent;
              display:flex;
              align-items: center;
              justify-content: center;
            }
            ha-card>ha-markdown{
              border-radius: 100%;
              background:transparent;
              padding: 0 !important;
              line-height:0;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
              {% set time = now().hour %}
              {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float %}
              opacity:{{brightness}};
              {% set time = now().hour %}
              {% set top = ( (time - 12)*1 ) %}
              transform:scale(5) translateY({{top}}px) translateX(-48px);
              {% set blur = ((((((time/24))-0.5)|abs)*5)|round(0)|int)+5  %}      
              filter:blur({{blur}}px);
            }
        view_layout:
          grid-column: 1
          grid-row: 1
      - type: markdown
        content: >-
          <img id="main" src="{{ state_attr('sensor.solar','solar_moon_picture')}}" height="48" width="48">
        card_mod:
          style: |
            ha-card{
              background: transparent;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
              {% set time = now().hour %} 
              {% set sun = states.sensor.sun_elevation.state | int %}
              {% set sunpos = ((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) * 24 / 100)  | round(0) %}
              {% set left = ((5 - ((time/24*10) | round(0) -5 ) | abs) * 24 ) | int - 240 %}
              {% set top = ( (time - 12)*2 ) %}
              transform: scale(5) translateX(-48px) translateY({{top}}px);

            }
            ha-card>ha-markdown
              background:transparent;
              padding: 0 !important;
              line-height:0;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
            }
        view_layout:
          grid-column: 1
          grid-row: 1
      - type: markdown
        content: >-
          <img id="weatherblur" src="{{ state_attr('sensor.solar','weather_picture')  }}" height="48" width="48">
        card_mod:
          style: |
            :host {
              overflow:hidden;
            }
            ha-card{
              background: transparent;
              display:flex;
              align-items: center;
              justify-content: center;

              {% set sun = states.sensor.sun_elevation.state %}
              transform:scale(2.5) translateY({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0) }}px) translateX({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0)  }}px);
              {% set time = now().hour %}
              {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float %}

            }
            ha-card>ha-markdown{
              transform:scale(0.5) translateY(150%) translateX(-100%);
              background:transparent;
              padding: 0 !important;
              line-height:0;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
            }
        view_layout:
          grid-column: 1
          grid-row: 1
    layout:
      grid-gap: 0
      margin: 0
      padding: 0
      height: 100%
      width: 100%
    card_mod:
      style: |
        ha-card{
         height:100%;
         background:red;
        }
        :root{
         overflow:hidden;
         height:100%;
        }
        layout-card, grid-layout{
          overflow: hidden;
          height:100%;
          transform:scale(3);
        }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
  - type: markdown
    content: ' '
    card_mod:
      style: |
        :host{
         overflow:hidden;
         width:100%;
         height: 100%;
          padding:0;
          margin:0
        }
        ha-card{
          box-sizing:border-box;
          {% set time = now().hour %}
          {% set hue = (time/24*360 | round(2) ) | int %}
          {% set hue2 = ((time/24*360 | round(2) ) | int) - 45 %}
          {% set hue3 = ((time/24*360 | round(2) ) | int) - 30 %}
          background: radial-gradient( transparent, hsla({{hue3}},100%,50%,0.0), hsla({{hue2}},100%,50%,0.0), hsla({{hue}},100%,50%,0), hsla({{hue}},100%,50%,0));
          background-size: 100% 100%;
          background-repeat: no-repeat;
          background-position: top center;
          backdrop-filter: blur(10px);
          display: flex;
          align-items: end;
          justify-content: left;
          font:var(--h3-font);
          color: var(--accent-text-color);
          border-radius: 100%;
          {% set time = now().hour %} 
          {% set left = ((5 - ((time/24*10) | round(0) -5 ) | abs) * 24 ) | int - 120 %}
          {% set top = ((5 - ((time/24*10) | round(0) -5 ) ) * -24 ) | int + 240 %}
          /*transform: translateX({{ left }}px) translateY({{top}}px);*/
          transform: translateX(-50%) translateY(50%);
          position:relative;
        }
        ha-card .card-header{
            font-size:1rem;
        }
        ha-card > ha-markdown{
         padding:0 !important;
        }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
  - type: custom:layout-card
    layout_type: custom:grid-layout
    cards:
      - type: markdown
        content: >-
          <img id="weather1" src="{{ state_attr('sensor.solar','weather_picture')  }}" height="48" width="48">
        card_mod:
          style: |
            :host {
              overflow:hidden;
            }
            ha-card{
              background: transparent;
              display:flex;
              align-items: center;
              justify-content: center;

              {% set sun = states.sensor.sun_elevation.state %}
              transform:scale(1.5) translateY({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0) }}px) translateX({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0)  }}px);
              {% set time = now().hour %}
              {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float %}

            }
            ha-card>ha-markdown{
              transform:scale(0.5) translateX(-200%);
              background:transparent;
              padding: 0 !important;
              line-height:0;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
            }
        view_layout:
          grid-column: 1
          grid-row: 1
      - type: markdown
        content: >-
          <img id="weather2" src="{{ state_attr('sensor.solar','weather_picture')  }}" height="48" width="48">
        card_mod:
          style: |
            :host {
              overflow:hidden;
            }
            ha-card{
              background: transparent;
              display:flex;
              align-items: center;
              justify-content: center;

              {% set sun = states.sensor.sun_elevation.state %}
              transform:scale(2.5) translateY({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0) }}px) translateX({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0)  }}px);
              {% set time = now().hour %}
              {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float %}

            }
            ha-card>ha-markdown{
              transform:scale(0.5) translateY(150%) translateX(-100%);
              background:transparent;
              padding: 0 !important;
              line-height:0;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
            }
        view_layout:
          grid-column: 1
          grid-row: 1
      - type: markdown
        content: >-
          <img id="weatherpic" src="{{ state_attr('sensor.solar','weather_picture')  }}" height="48" width="48">
        card_mod:
          style: |
            :host {
              overflow:hidden;
            }
            @keyframes float{
              0%   {transform:translateY(-0.5em)}
              50%  {transform:translateY(0.5em)}
              100% {transform:translateY(-0.5em)}
            }
            ha-card{
              background: transparent;

              display:flex;
              align-items: center;
              justify-content: center;

              {% set sun = states.sensor.sun_elevation.state %}
              transform:scale(2.5) translateY({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0) }}px) translateX({{ ((-((((( -16 - (sun | int ) - 8)) / 32 * 100) | round(0)  ) *24 / 100) ) * 2) | round(0)  }}px);
              {% set time = now().hour %}
              {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float %}

            }
            ha-card>ha-markdown{
              animation: 5s ease-out infinite alternate float;

              background:transparent;
              padding: 0 !important;
              line-height:0;
              display:flex;
              align-items: center;
              justify-content: center;
              overflow:hidden;
            }
            ha-markdown>ha-markdown-element{

            }
        view_layout:
          grid-column: 1
          grid-row: 1
    layout:
      grid-gap: 0
      margin: 0
      padding: 0
      height: 100%
      width: 100%
    card_mod:
      style: |
        ha-card{
         height:100%;
         background:red;
        }
        :root{
         overflow:hidden;
         height:100%;
        }
        layout-card, grid-layout{
          overflow: hidden;
          height:100%;
          transform:scale(3);
        }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
  - type: markdown
    content: >-
      {% set clock = as_timestamp(now()) %} {{- clock | timestamp_custom("%H")
      }}<span class="minutes">:{{ clock | timestamp_custom("%M") }}</span>
    card_mod:
      style: |
        ha-markdown span{
          color:green !important;
          background:red;
        }
        ha-card > span {
          border: 3px dotted magenta;
          padding: 0px;
          display: unset;
        }
        ha-card{
          background:transparent;
          display: flex;
          align-items: center;
          justify-content: right;
          font: var(--h1-font);
          font-weight: 500;
          letter-spacing:-0.05em;
          {% set time = now().hour %}
          {% set int = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float %}
          font-size: calc(var(--h1-font-size)*3*{{int}} );
          transform: translateX({{ -((((( -16 - (states.sensor.sun_elevation.state | int ) - 8)) / 32 * 100) | round(0)  ) * 24 / 100)  | round(0)}}px);
          mix-blend-mode:difference;
        }
        ha-card > ha-markdown{
          padding:0 !important;
          margin:0 !important;

          {% set hue = (now().hour*15 + ((now().minute/60*100)/100) | round(2)*15 ) | int | abs %}
          {% set hue2 = (((now().hour*15 + ((now().minute/60*100)/100) | round(2)*15 ) | int) - 45) | abs %}
          {% set hue3 = ((now().hour*15 + ((now().minute/60*100)/100) | round(2)*15 ) | int) - 90 | abs %}
          {% set time = now().hour %}
          {% set br1 = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float  %}
          {% set br2 = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 ) | float %}
          {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs) * 10 ) | int + 25 %}
          background: linear-gradient(45deg, hsl({{hue}},100%,{{brightness}}%), hsl({{hue2}},100%,{{brightness}}%));


          -webkit-background-clip: text;
          -webkit-text-fill-color: transparent;
          /*mix-blend-mode:difference;*/
          /*color:hsla({{hue}},100%,50%,{{brightness}});*/
          /*text-shadow: 0 3px 3px hsla({{hue }},100%,50%,0.5), 0 3px 10px hsla({{hue }},100%,50%,1);*/

        }
        ha-card > .card-header, .card-header {
          background-color: var(--background-color-off);
          color: var(--text-color-off);
          font-size:10px;
        }
    view_layout:
      grid-column: 1 / span 5
      grid-row: 2 / 4
  - type: markdown
    content: '{{ (( states(''sensor.calendar_event'') ) ) }}'
    card_mod:
      style: |
        ha-card{
          background: transparent;
          display: flex;
          align-items: flex-end;
          justify-content: right;
          text-align:right;
          font: var(--{{ "h1" if state_attr('sensor.calendar_event','number_days') <= 1 else "card-title" }}-font);
          line-height: 0.8em;
          color: var(--primary-color);
          mix-blend-mode:difference;
        }
        ha-card > ha-markdown{
         padding:0 1rem !important;
        }
    view_layout:
      grid-row: 4 / 5
      grid-column: 4 / 7
  - type: markdown
    content: ' {{ (( states(''sensor.thermal_home_heatindex'') | float ) ) | round(0) }}ยฐC'
    card_mod:
      style: |
        ha-card{
          background: transparent;
          display: flex;
          align-items: center;
          justify-content: right;
          font:var(--h3-font);
          color:var(--accent-text-color);
          mix-blend-mode: lighten;

          {% set hue = (25/(states.sensor.thermal_home_heatindex.state | int)*360) | int %}
          {% set time = now().hour %}
          {% set br1 = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float  %}
          {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs) * 10 ) | int + 25 %}
          color: hsl({{hue}},100%,{{brightness}}%);


          /*mix-blend-mode:difference;*/
          /*color:hsla({{hue}},100%,50%,{{brightness}});*/
          /*text-shadow: 0 3px 3px hsla({{hue }},100%,50%,0.5), 0 3px 10px hsla({{hue }},100%,50%,1);*/

        }
        ha-card > ha-markdown{
         padding:0 1rem !important;
        }
    view_layout:
      grid-row: 1
      grid-column: 3 / 7
  - type: markdown
    content: >-
      {%- macro suffix(d) %}
      {%- set sfx = {1:'st',2:'nd',3:'rd'} %}
      {{- 'th' if 11 <= d <= 13 else sfx.get(d%10, 'th') }}
      {%- endmacro %}
      {% set day = as_timestamp(now()) | timestamp_custom("%d") | int %}
      {{ as_timestamp(now()) | timestamp_custom("%a") }} {{ day }}{{ suffix(day) }}  
    card_mod:
      style: |
        ha-card{
          background:transparent;
          display: flex;
          align-items: center;
          justify-content: left;
          font: var(--h3-font);
          color: var(--accent-color); 
          mix-blend-mode: difference;
        }
        ha-card > ha-markdown{
         padding:0 1rem !important;
        }
    view_layout:
      grid-column: 1 / span 4
      grid-row: 1
  - type: markdown
    content: '{{ (( state_attr(''sensor.calendar_event'',''friendly_name'') ) ) }}'
    card_mod:
      style: |
        ha-card{
          background: transparent;
          display: flex;
          align-items: center;
          justify-content: right;
          text-align:right;
          font: var(--body-font);
          color: var(--accent-text-color);
          mix-blend-mode: difference;
          font-size: calc( 2*{{ "1" if state_attr('sensor.calendar_event','number_days') <= 1 else 1 }}rem);
        }
        ha-card > ha-markdown{
         padding:0 1rem !important;
        }
    view_layout:
      grid-row: 4
      grid-column: 2 / 7
  - type: markdown
    content: >
      {%- set weather = states('weather.hernes') -%}
      {%- if weather in ['unknown','unavailable'] -%}
      {{- ['idks','??'] | random -}}
      {%- else -%}
      {{- (( state_attr('weather.hernes','temperature') | float +
      states('sensor.temperature_balcony') | float ) / 2) | round(0) }}ยฐC  
      {%- endif %} 
    card_mod:
      style: |
        ha-card{
          box-sizing:border-box;
          background: transparent; 
          display: flex;
          align-items: center;
          justify-content: left;
          font:var(--h3-font);
          color: var(--accent-text-color);
          mix-blend-mode: screen;

          {% set wefer = states('sensor.temperature_balcony') | int %} 
          {% set hue = 180-((((wefer)*10)) | int) %} 
          {% if hue <= 0 %}
          {% set hue = 0 %}
          {% elif hue >=360 %}
          {% set hue = 360 - hue %}
          {% else %}
          {% endif %}

          {% set time = now().hour %}
          {% set br1 = ((5 - ((time/24*10) | round(0) -5 ) | abs)/10 + 0.5) | float  %}
          {% set brightness = ((5 - ((time/24*10) | round(0) -5 ) | abs) * 10 ) | int + 25 %}
          color: hsl({{hue}},100%,{{brightness}}%);
        }
        ha-card > ha-markdown{
         padding:0 1rem !important;
        }
    view_layout:
      grid-column: 1 / span 3
      grid-row: 6
  - show_name: true
    show_icon: true
    type: button
    entity: sensor.solar
    tap_action:
      action: navigate
      navigation_path: /dashboard-nspanel/menu
    hold_action:
      action: navigate
      navigation_path: /dashboard-nspanel/screensaver
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
    card_mod:
      style: ha-card{opacity:0}
layout:
  grid-template-columns: repeat(6, minmax(60px, 1fr))
  grid-template-rows: repeat(6, minmax(60px, 1fr))
  grid-gap: 0.5em
  margin: 0
  padding: 0
  height: 100vh
  min-height: 480px
  overflow: hidden
card_mod:
  style: |
    :host{
      --card-header-font-size:1px;     
    }
    :host > ha-card > .card-header{
     display:none;
    }
    ha-card{
     width:100%;
     height:100vh;
    }
    :root{
     overflow:hidden;
     height:100vh;
    }
    layout-card{
      overflow: hidden;
      height:100vh;
    }

Profit

Enjoy an always dynamic screensaver :tada:

  1. main image based on solar status (day, sunset, sunrise, etc)
    1.1 if night, get actual moon phase
  2. weather conditions as illustrations
  3. time, date and temperature colored based on the state
  4. everything positioned based on time, state, etc, so you never get the same image :slight_smile:

1 Like

And a simpler, bigger screensaver with just images:

2023-04-22_02-35.34

2023-04-22_02-43.21

type: custom:layout-card
layout_type: custom:grid-layout
cards:
  - type: markdown
    content: >-
      <img src="{{state_attr('sensor.solar','moon_picture')}}" width="240px"
      height="240px">
    card_mod:
      style:
        .: |
          ha-card {
          padding:0;
          background: transparent;
          display:flex;
          align-items: center;
          justify-content: center;
          }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
  - type: markdown
    content: >-
      <img src="{{state_attr('sensor.solar','solar_picture')}}" width="480px"
      height="480px">
    card_mod:
      style:
        .: |
          ha-card {
          padding:0;
          background: transparent;
          display:flex;
          align-items: center;
          justify-content: center;
          }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
  - type: markdown
    content: >-
      <img src="{{state_attr('sensor.solar','weather_picture')}}" width="480px"
      height="480px">
    card_mod:
      style:
        .: |
          ha-card {
          padding:0;
          background: transparent;
          display:flex;
          align-items: center;
          justify-content: center;
          }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
  - type: markdown
    content: ' '
    card_mod:
      style: |
        :host{
         overflow:hidden;
         width:100%;
         height: 100%;
          padding:0;
          margin:0
        }
        ha-card{
          box-sizing:border-box;
          {% set time = now().hour %}
          {% set hue = (time/24*360 | round(2) ) | int %}
          {% set hue2 = ((time/24*360 | round(2) ) | int) - 45 %}
          {% set hue3 = ((time/24*360 | round(2) ) | int) - 30 %}
          background: hsla({{hue}},100%,50%,0);
          background-repeat: no-repeat;
          background-position: top center;
          backdrop-filter: blur(30px);
          display: flex;
          align-items: end;
          justify-content: left;
          font:var(--h3-font);
          color: var(--accent-text-color);
          border-radius: 100%;
          {% set time = now().hour %} 
          {% set left = ((5 - ((time/24*10) | round(0) -5 ) | abs) * 24 ) | int - 120 %}
          {% set top = ((5 - ((time/24*10) | round(0) -5 ) ) * -24 ) | int + 240 %}
          /*transform: translateX({{ left }}px) translateY({{top}}px);*/
          transform: translateX(-50%) translateY(50%);
          position:relative;
        }
        ha-card .card-header{
            font-size:1rem;
        }
        ha-card > ha-markdown{
         padding:0 !important;
        }
    view_layout:
      grid-column: 1 / span 6
      grid-row: 1 / span 6
layout:
  grid-template-columns: repeat(6, minmax(60px, 1fr))
  grid-template-rows: repeat(6, minmax(60px, 1fr))
  grid-gap: 0.5em
  margin: 0
  padding: 0
  height: 100vh
  min-height: 480px
  overflow: hidden
card_mod:
  style: |
    :host{
      --card-header-font-size:1px;     
    }
    :host > ha-card > .card-header{
     display:none;
    }
    ha-card{
     width:100%;
     height:100vh;
    }
    :root{
     overflow:hidden;
     height:100vh;
    }
    layout-card{
      overflow: hidden;
      height:100vh;
    }

2 Likes

Awesome! Have to try this immediately!

1 Like

I think these are not included in icons? Iโ€™ve to check also that other pictures solar svgs etc match, since I assume it is not the same folder structure as with this icon package?

EDIT: I can probably backtrack the icons and rename them under weather/solar etc. names for states and filenames to match. However, if you have those as list or smthing already available, Iโ€™d be grateful :slight_smile:

You can export the solar/weather/moon images from Figma as you like - SVG or PNG, either style:

Select the menu icon โ†’ file โ†’ export and all get saved with correct naming the sensor uses:

And yeah, delete the line :smiley: I use them as placeholders, since my home nickname is โ€œPeaโ€ ๐Ÿซ›โ€ฆ

1 Like

Thanks! I think I got the icons now as they should, having still some problems for setting sensor.solar. No errors or anything on the log, but have to figure out why sensor.solar is still non-existant.

Did you add it to template: ? It might have different name and entity_id at first, since it changes name based on state as well. I use it all over my dashboards as a regular sensor to display the emoji or name: