🖼️ WallPanel Addon - Wall panel mode for your Home Assistant Dashboards

Not sure if its my fire tablets(wall Mounted) all the HA updates or what but i cant even run dashboard for more then a few hours and it kicks out to tablet OS. I am assuming its a fire tablet issue with some update but have been fighting this for weeks now. anyone else having this issue?

With Wall Panel 4.29.1 on HA 2024.10.0 (frontend 20241002.2), I’m trying to produce a grid layout like

badges (centered)
card 1 card 2

But I can’t figure out how to target the div.badges with grid style. I see from the docs that I can target individual badges with wp_style but for the above I need to target their container.

Overall wall panel style: seems to only allow targeting a set of known element IDs. wp_style (or card mod) can style cards. But there doesn’t seem to be a way to target the badges container.

Any ideas? Am I missing something?

This became easier with the latest wallpanel version 4.30.0. You can now use:

wallpanel:
  enabled: false
  device.<browser-id>:
    enabled: true
1 Like

I had also posted this as a github issue, and they added support for targeting badges in the latest version, 4.30.0. Hooray!

To answer to myself: the problem was, I used the login name as the username. Reading the documentation helped a lot. Now using the value from {{user}} the profiles section works perfectly.

I love this add-on, there is one function which I think is missing – if someone knows how to accomplish it, please let me know:

I have Fully Kiosk Browser running which will turn off my screen completely if I leave the room (Wallpanel screensaver is active); when I come back, the screen wakes up, but it still shows the Wallpanel screensaver and I have to tap the screen. I would LOVE IT if FKB could somehow bypass the screensaver on tablet wake-up… does anyone know how to accomplish this??

TIA!!

I received this error on log.

Uncaught error from Chrome WebView IP on Android 12 TypeError: this.createCardElement is not a function

I’m not si sure, but maybe a problem with reference on the WallPanel Lib?

Why is the quality of the unsplash image_url so low?

I am trying to get this to work. I put this code in, but I get nothing. If I just put “image_url: /family/” it works great, but I’d like to be able to choose which images are being shown in the slideshow.

  image_url: >-
    {% if states('input_select.slideshowtheme') == 'ai' %}
      /ai/
    {% else %}
      /family/
    {% endif %}

Also if I put this code under the template builder, it returns with the expected /ai/ or /family/

Does anyone else have an issue with the wall panel screen saver not working every few days? I have it setup on a wall dashboard in my kitchen alongside the google photos integration but every few days, it stops going into screensaver mode and so I never see the slides of my photos. For the life of me I can figure one why. Here is the yaml I have if anyone has any clues?


Random question, but is it possible to randomly move the card on the screensaver over time? I only as as the screen I am using does suffer screen burn but I would like the weather on there somewhere.

I can’t seem to find anything in the docs about it

@hiddevanbrussel How do I put on this watch? It looks very stylish. Can you give me the code?

wallpanel:
  enabled: true
  debug: false
  hide_toolbar: true
  show_progress_bar: false
  show_image_info: false
  image_animation_ken_burns: false
  hide_toolbar_action_icons: false
  stop_screensaver_on_mouse_move: false
  card_interaction: true
  hide_sidebar: false
  fullscreen: false
  idle_time: 130
  display_time: 15
  fade_in_time: 5
  crossfade_time: 2
  screensaver_stop_navigation_path: /dashboard-tablet/home
  image_url: https://api.unsplash.com/photos/random?$3840x$2160&client_id={api}&query=wallpaper
  image_fit: cover
  image_list_update_interval: 30
  image_order: sorted
  cards:
    - type: custom:atomic-calendar-revive
      enableModeChange: true
      entities:
        - entity: update.atomic_calendar_revive_update
          icon: ''
        - entity: calendar.name
          name: name
          maxDaysToShow: 12
      showDate: false
      showLoader: false
      eventDateFormat: dddd D MMMM
      name: Schoolagenda
      hoursOnSameLine: false
      showAllDayHours: false
      showDatePerEvent: true
      showTimeRemaining: true
      showWeekNumber: true
      showRelativeTime: false
      card_mod:
        style: |
          ha-card { 
            background: none;
            border: 0px;
            font-size: 14px;
            font-weight: 300;
            left: 10px;
            top: 10px;
            position: absolute;
            color: #ffffff;
            display: none;
            }
          .header-name {
            font-weight: 900!important;
            color: #FFFFFF!important;
            }
          .daywrap {
             border-top: 0px!important;
             color: #FFFFFF;
             }
          .event-date-day, .event-date-month, .event-date-week-day {
             width: 150px;
             font-weight: 300;
             color: #FFFFFF;
             }
          .event-title{
            color: #FFFFFF!important;
          }
          .week-number {
            color: #FFF!important;
            background-color: #133E87;
            border: 0px!important;
            margin-bottom: 10px!important;
            padding: 2px;
            }
    - type: custom:mini-media-player
      entity: media_player.keuken_2
      icon: lucide:music
      artwork: cover
      hide:
        volume: true
        source: true
        power_state: true
        controls: true
        power: true
        progress: true
      visibility:
        - condition: state
          entity: media_player.keuken_2
          state: playing
      card_mod:
        style: |
          ha-card {
            left: 340px;
            top: 250px;
            font-weight: 300!important;
            font-size: 16px;
            width: 350px;
            opacity: 0.5;
            }
    - type: custom:mini-media-player
      entity: media_player.kantoor
      icon: lucide:music
      artwork: cover
      hide:
        volume: true
        source: true
        power_state: true
        controls: true
        power: true
        progress: true
      visibility:
        - condition: state
          entity: media_player.kantoor
          state: playing
      card_mod:
        style: |
          ha-card {
            left: 350px;
            top: 250px;
            font-weight: 300!important;
            font-size: 16px;
            z-index: 100000000000000;
            width: 350px;
            opacity: 0.8;
            }
    - type: custom:digital-clock
      dateFormat:
        weekday: long
        day: 2-digit
        month: long
      timeFormat:
        hour: 2-digit
        minute: 2-digit
      card_mod:
        style: |
          ha-card {
           text-align: right!important;
           font-weight: 300!important;
           padding: 8px 0px;
           background: transparent;
           border: 0px;
           color: rgb(255, 255, 255);
           position: absolute;
           right: 90px;
           bottom: 70px;
          }
          .first-line {
            font-size: 7em!important;
            font-weight: 900;
            }
          .second-line {
            font-size: 1.1em!important;
            }
    - show_current: true
      show_forecast: false
      type: weather-forecast
      entity: weather.forecast_thuis
      forecast_type: daily
      name: ' '
      card_mod:
        style: |
          ha-card {
           top: 390px!important;
           background-color: transparent;
           position: fixed;
           color: #FFFFFF;
           font-weight: 300;
           height: 150px!important;
           right: 40px;
           border: 0px;
           columns: 2;
           width: auto;
           float: right;
          }
          .attribute {
            color: #FFFFFF!important;
            display: none;
          }
          .state {
            overflow: visible!important;
            }
          .temp-attribute {
            text-align: left;
            -webkit-background-clip: text;
            -moz-background-clip: text;
            background-clip: text;
            font-weight: 900;
          }
    - type: custom:mushroom-chips-card
      chips:
        - type: entity
          entity: person.person1
          content_info: none
          use_entity_picture: true
          card_mod:
            style: |
              /* Color border around avatar to show person status */
              ha-card {
                --chip-background:
                {% if is_state(config.entity, ['home', 'not_home', 'unknown']) %}
                  rgb(var(--rgb-state-person-{{ states(config.entity) | replace('_', '-') }} ))
                {% else %}
                  rgb(var(--rgb-state-person-zone))
                {% endif %};
              } 
              /* Slightly enlarge & bring to front on hover */
              ha-card:hover {
                transform: scale(1.2);
                transform-origin: top center;
                z-index: 1;
                transition: all 1s;
              }
        - type: entity
          entity: person.person2
          use_entity_picture: true
          content_info: none
          card_mod:
            style: |
              /* Color border around avatar to show person status */
              ha-card {
                --chip-background:
                {% if is_state(config.entity, ['home', 'not_home', 'unknown']) %}
                  rgb(var(--rgb-state-person-{{ states(config.entity) | replace('_', '-') }} ))
                {% else %}
                  rgb(var(--rgb-state-person-zone))
                {% endif %};
              } 
              /* Slightly enlarge & bring to front on hover */
              ha-card:hover {
                transform: scale(1.2);
                transform-origin: top center;
                z-index: 1;
                transition: all 1s;
              }    
        - type: template
          entity: sensor.afvalwijzer_next_type
          tap_action:
            action: navigate
            navigation_path: '#afval'
          card_mod:
            style: |
              /* Color border around avatar to show person status */
              ha-card {
                --chip-background:
                 {% set state=states('sensor.afvalwijzer_next_type') %}
                 {% if state=='pmd' %}
                 orange
                 {% elif state=='restafval' %}
                 grey
                 {% else %}
                 #A5B68D
                 {% endif %}
                } 
              ha-card:after {
                content: "{{states("sensor.afvalwijzer_next_in_days") | capitalize}}";         
                position: absolute;
                display: flex;
                justify-content: center;
                align-items: center;
                background: rgb(var(--rgb-orange));
                color: var(--card-background-color);
                border-radius: 100%;
                top: -5px;
                width: 50%;
                height: 50%;
                font-size: 0.3em; 
                right: -5px;
              }
          icon: |
            {% set state=states('sensor.afvalwijzer_next_type') %}
            {% if state=='pmd' %}
            fas:bottle-water
            {% elif state=='restafval' %}
            mdi:trash-can
            {% else %}
            lucide:banana
            {% endif %}
          icon_color: |-
            {% set state=states('sensor.afvalwijzer_next_type') %}
            {% if state=='pmd' %}
            white
            {% elif state=='restafval' %}
            white
            {% else %}
            white
            {% endif %}
        - type: conditional
          conditions:
            - condition: numeric_state
              entity: sensor.postnl_delivery
              above: 0
          chip:
            type: template
            icon: lucide:package
            icon_color: white
            tap_action:
              action: navigate
              navigation_path: '#post'
            card_mod:
              style: |
                ha-card {
                  --chip-background:
                   {% set state=states('sensor.postnl_delivery') %}
                   {% if state=='1' %}
                   orange
                   {% else %}
                   #A5B68D;
                   {% endif %}
                  }      
                ha-card:after {
                  {% if states('sensor.postnl_delivery') | float(0) > 0 %}
                    content: "{{ states('sensor.postnl_delivery') | string }}";         
                    position: absolute;
                    display: flex;
                    justify-content: center;
                    align-items: center;
                    background: rgb(var(--rgb-orange));
                    color: #FFF!important;
                    font-weight: 900;
                    border-radius: 100%;
                    top: -5px;
                    width: 50%;
                    height: 50%;
                    font-size: 0.3em; 
                    right: -5px;
                  {% else %}
                    display: none;
                  {% endif %}
                }  
      card_mod:
        style: |
          ha-card {
            bottom: 18px!important;
            position: fixed;
            color: #FFFFFF;
            left: 25px;
          }
  style:
    wallpanel-screensaver-info-box:
      font-size: 3vh
      font-weight: 600
      color: '#eeeeee'

Changed it a little bit in time

1 Like

Maybe i think i have a solution for this. You can make a automation for this one. Use the screen switch for this solution

Schermafbeelding 2024-11-19 192932

alias: "Pagina: Open Page"
description: ""
triggers:
  - type: turned_on
    device_id: 72116c454a6f065c2e00a8336f3b6281
    entity_id: 0de3cc0e73e1750c2011fe98c1f8d369
    domain: switch
    trigger: device
conditions: []
actions:
  - action: browser_mod.navigate
    metadata: {}
    data:
      path: /dashboard-tablet/home
mode: single

this works for me. After the screen turned on i’ll get to my dashboard right away

Naais!
Cold over there…