Schoettli HomeLab

Wissensdatenbank

github.com/DBuit/sidebar-card

 

Weiter unten findet Ihr die genauen Erklärungen wie Ihr was anpasst.

 

sidebar:
  width:
    mobile: 0
    tablet: 25
    desktop: 18
  title: null
  date: true
  digitalClock: true
  digitalClockWithSeconds: true
  dateFormat: dddd DD.MM.YYYY
  sidebarMenu:
    - action: navigate
      navigation_path: /dashboard-haus/haus
      name: Start
      active: true
      icon: mdi:home
    - action: navigate
      navigation_path: /dashboard-haus/radio
      name: Radio
      active: true
      icon: mdi:radio
    - action: navigate
      navigation_path: /dashboard-haus/licht
      name: Licht
      active: true
      icon: mdi:lightbulb-multiple
    - action: navigate
      navigation_path: /dashboard-haus/kamera
      name: Kamera
      active: true
      icon: mdi:cctv
    - action: navigate
      navigation_path: /dashboard-haus/fenster-turen
      name: Fenster + Türen
      active: true
      icon: mdi:door-closed
    - action: navigate
      navigation_path: /dashboard-haus/batterie
      name: Batterie
      active: true
      icon: mdi:battery-high
  bottomCard:
    type: custom:vertical-stack-in-card
    card_mod:
      style: |
        ha-card {
          border: none; /* Entfernt den Rahmen der Karte */
          box-shadow: none;
          border-radius: 0px;
          background: transparent; 
          --stack-card-gap: 12px;
          width: 100% !important;
          max-width: none !important;
        }
    cardOptions:
      cards:
        - type: custom:mushroom-entity-card
          entity: lock.aqara_smart_lock_u200
          fill_container: true
          primary_info: state
          secondary_info: name
          layout: horizontal
          double_tap_action:
            action: none
          hold_action:
            action: none
          tap_action:
            action: toggle
          name: Haustür
          icon_color: white
          card_mod:
            style:
              mushroom-shape-icon$: |
                .shape {
                  {# ========== USER CONFIG ========== #}
                  {% set state_entity = 'lock.aqara_smart_lock_u200' %}
                  {# ========== END USER CONFIG ====== #}

                  {% if is_state(state_entity, 'locked') %}
                    {# ABGESCHLOSSEN = TÜRKIS #}
                    --shape-color: rgb(0, 161, 136) !important;
                    --icon-color: white !important;
                    --shape-animation: none;
                    opacity: 1;
                    --glow-1: 0 0 25px 8px rgba(0, 161, 136, 1);
                    --glow-2: 0 0 55px 18px rgba(0, 161, 136, 0.7);
                    --glow-3: 0 0 95px 35px rgba(0, 161, 136, 0.45);
                  {% elif is_state(state_entity, 'unlocked') %}
                    {# AUFGESCHLOSSEN = DUNKELROT #660000 + ANIMATION #}
                    --shape-color: rgb(102, 0, 0) !important;
                    --icon-color: white !important;
                    --shape-animation: lock-open 1.6s ease-in-out infinite;
                    opacity: 1;
                    --glow-1: 0 0 25px 8px rgba(102, 0, 0, 1);
                    --glow-2: 0 0 55px 18px rgba(102, 0, 0, 0.7);
                    --glow-3: 0 0 95px 35px rgba(102, 0, 0, 0.45);
                    --glow-anim: lock-ultraglow 2.2s ease-in-out infinite;
                  {% elif is_state(state_entity, 'unlocking') or is_state(state_entity, 'locking') %}
                    {# AKTION = ORANGE #}
                    --shape-color: rgb(255, 165, 0) !important;
                    --icon-color: white !important;
                    --shape-animation: lock-action 0.7s ease-in-out infinite;
                    opacity: 1;
                    --glow-1: 0 0 25px 8px rgba(255, 165, 0, 1);
                    --glow-2: 0 0 55px 18px rgba(255, 165, 0, 0.7);
                    --glow-3: 0 0 95px 35px rgba(255, 165, 0, 0.45);
                    --glow-anim: lock-ultraglow 2.2s ease-in-out infinite;
                  {% else %}
                    --shape-animation: none;
                    --glow-1: none;
                    --glow-2: none;
                    --glow-3: none;
                    --glow-anim: none;
                    opacity: 0.6;
                  {% endif %}

                  transform-origin: 50% 50%;
                  position: relative;
                }

                /* Glow layers */
                .shape::before,
                .shape::after {
                  content: '';
                  position: absolute;
                  inset: -8px;
                  border-radius: inherit;
                  pointer-events: none;
                }

                .shape::before {
                  box-shadow: var(--glow-1), var(--glow-2), var(--glow-3);
                  animation: var(--glow-anim);
                }

                .shape::after {
                  inset: -18px;
                  box-shadow: var(--glow-1);
                  opacity: 0.9;
                  animation: var(--glow-anim);
                }

                @keyframes lock-ultraglow {
                  0% {
                    opacity: 0.9;
                    filter: brightness(1);
                  }
                  50% {
                    opacity: 1;
                    filter: brightness(1.4);
                  }
                  100% {
                    opacity: 0.9;
                    filter: brightness(1);
                  }
                }

                @keyframes lock-action {
                  0%   { transform: rotate(-25deg) scale(0.96); }
                  50%  { transform: rotate(25deg) scale(1.04); }
                  100% { transform: rotate(-25deg) scale(0.96); }
                }

                @keyframes lock-open {
                  0%   { transform: rotate(10deg); }
                  50%  { transform: rotate(18deg); }
                  100% { transform: rotate(10deg); }
                }
              mushroom-state-info$: |
                .container {
                  --card-primary-font-size: 18px;
                  --card-primary-font-weight: 300;
                  --card-secondary-font-size: 15px;
                  --card-secondary-font-weight: 500;
                  margin-top: -45px; 
                  margin-left: 5px;
                  text-align: right;
                }
                .secondary {
                  font-size: var(--card-primary-font-size) !important;
                  font-weight: var(--card-primary-font-weight) !important;
                  color: white !important;
                  position: absolute;
                  bottom: 5px;
                  right: 10px;
                }
                .primary {
                  font-size: var(--card-secondary-font-size) !important;
                  font-weight: var(--card-secondary-font-weight) !important;
                  {% if is_state('lock.aqara_smart_lock_u200', 'locked') %}
                    color: rgb(0, 161, 136) !important;
                  {% elif is_state('lock.aqara_smart_lock_u200', 'unlocked') %}
                    color: rgb(176, 16, 16) !important;
                  {% else %}
                    color: rgb(255, 165, 0) !important;
                  {% endif %}
                  text-align: right;
                  position: absolute;
                  top: 5px;
                  right: 10px;
                  
                }
              .: |
                mushroom-shape-icon {
                  --icon-size: 40px;
                  display: flex;
                  margin: -45px -10px -11px -9px !important;
                  padding-right: 80px;
                }
                ha-card {
                  clip-path: inset(0 0 0 0 round var(--ha-card-border-radius, 12px));
                  border: none;
                  margin-bottom: 12px;
                  min-height: 90px !important;
                  max-height: 90px !important;
                  height: 90px !important;
                  padding: 10px 0 !important;
                }
        - type: custom:mushroom-entity-card
          entity: lock.haustur_offner
          fill_container: true
          primary_info: name
          secondary_info: none
          layout: horizontal
          double_tap_action:
            action: none
          hold_action:
            action: none
          tap_action:
            action: toggle
          name: Tür öffnen
          icon_color: white
          card_mod:
            style:
              mushroom-shape-icon$: |
                .shape {
                  {# ========== USER CONFIG ========== #}
                  {% set state_entity = 'lock.haustur_offner' %}
                  {# ========== END USER CONFIG ====== #}

                  {% if is_state(state_entity, 'locked') %}
                    {# ABGESCHLOSSEN = TÜRKIS #}
                    --shape-color: rgb(0, 161, 136) !important;
                    --icon-color: white !important;
                    --shape-animation: none;
                    opacity: 1;
                    --glow-1: 0 0 25px 8px rgba(0, 161, 136, 1);
                    --glow-2: 0 0 55px 18px rgba(0, 161, 136, 0.7);
                    --glow-3: 0 0 95px 35px rgba(0, 161, 136, 0.45);
                  {% elif is_state(state_entity, 'unlocked') %}
                    {# AUFGESCHLOSSEN = DUNKELROT #660000 + ANIMATION #}
                    --shape-color: rgb(102, 0, 0) !important;
                    --icon-color: white !important;
                    --shape-animation: lock-open 1.6s ease-in-out infinite;
                    opacity: 1;
                    --glow-1: 0 0 25px 8px rgba(102, 0, 0, 1);
                    --glow-2: 0 0 55px 18px rgba(102, 0, 0, 0.7);
                    --glow-3: 0 0 95px 35px rgba(102, 0, 0, 0.45);
                    --glow-anim: lock-ultraglow 2.2s ease-in-out infinite;
                  {% elif is_state(state_entity, 'unlocking') or is_state(state_entity, 'locking') %}
                    {# AKTION = ORANGE #}
                    --shape-color: rgb(255, 165, 0) !important;
                    --icon-color: white !important;
                    --shape-animation: lock-action 0.7s ease-in-out infinite;
                    opacity: 1;
                    --glow-1: 0 0 25px 8px rgba(255, 165, 0, 1);
                    --glow-2: 0 0 55px 18px rgba(255, 165, 0, 0.7);
                    --glow-3: 0 0 95px 35px rgba(255, 165, 0, 0.45);
                    --glow-anim: lock-ultraglow 2.2s ease-in-out infinite;
                  {% else %}
                    --shape-animation: none;
                    --glow-1: none;
                    --glow-2: none;
                    --glow-3: none;
                    --glow-anim: none;
                    opacity: 0.6;
                  {% endif %}

                  transform-origin: 50% 50%;
                  position: relative;
                }

                /* Glow layers */
                .shape::before,
                .shape::after {
                  content: '';
                  position: absolute;
                  inset: -8px;
                  border-radius: inherit;
                  pointer-events: none;
                }

                .shape::before {
                  box-shadow: var(--glow-1), var(--glow-2), var(--glow-3);
                  animation: var(--glow-anim);
                }

                .shape::after {
                  inset: -18px;
                  box-shadow: var(--glow-1);
                  opacity: 0.9;
                  animation: var(--glow-anim);
                }

                @keyframes lock-ultraglow {
                  0% {
                    opacity: 0.9;
                    filter: brightness(1);
                  }
                  50% {
                    opacity: 1;
                    filter: brightness(1.4);
                  }
                  100% {
                    opacity: 0.9;
                    filter: brightness(1);
                  }
                }

                @keyframes lock-action {
                  0%   { transform: rotate(-25deg) scale(0.96); }
                  50%  { transform: rotate(25deg) scale(1.04); }
                  100% { transform: rotate(-25deg) scale(0.96); }
                }

                @keyframes lock-open {
                  0%   { transform: rotate(10deg); }
                  50%  { transform: rotate(18deg); }
                  100% { transform: rotate(10deg); }
                }
              mushroom-state-info$: |
                .container {
                  --card-primary-font-size: 18px;
                  --card-primary-font-weight: 300;
                  --card-secondary-font-size: 15px;
                  --card-secondary-font-weight: 500;
                  margin-top: 50px; 
                  margin-left: 5px;
                  text-align: right;
                }
                .primary {
                  font-size: var(--card-primary-font-size) !important;
                  font-weight: var(--card-primary-font-weight) !important;
                  color: white !important;
                  bottom: 5px;
                  right: 10px;
                }
                .secondary {
                  font-size: var(--card-secondary-font-size) !important;
                  font-weight: var(--card-secondary-font-weight) !important;
                  {% if is_state('lock.haustur_offner', 'locked') %}
                    color: rgb(0, 161, 136) !important;
                  {% elif is_state('lock.haustur_offner', 'unlocked') %}
                    color: rgb(102, 0, 0) !important;
                  {% else %}
                    color: rgb(255, 165, 0) !important;
                  {% endif %}
                  top: 5px;
                  right: 10px;
                }
              .: |
                mushroom-shape-icon {
                  --icon-size: 40px;
                  display: flex;
                  margin: -45px -10px -11px -9px !important;
                  padding-right: 80px;
                }
                ha-card {
                  clip-path: inset(0 0 0 0 round var(--ha-card-border-radius, 12px));
                  border: none;
                  margin-bottom: 12px;
                  min-height: 90px !important;
                  max-height: 90px !important;
                  height: 90px !important;
                  padding: 10px 0 !important;
                }
        - type: custom:clock-weather-card
          entity: weather.weather_at_8215
          forecast_rows: 2
          hide_clock: true
          hide_date: true
          hide_forecast_section: true
          card_mod:
            style: |
              ha-card {
               border: none;
               box-shadow: none;
               border-radius: 0px;
               background: transparent; 
              }
        - type: custom:button-card
          entity: input_boolean.fullscreen
          show_state: false
          show_icon: true
          show_name: false
          icon: mdi:arrow-expand
          layout: icon_name
          size: 15%
          card_mod:
            style: |
              ha-card {
                border: none;
                box-shadow: none;
                border-radius: 0px;
                background: transparent; 
              }
    cardStyle: |
      :host {
        width: 100%; 
      }
      ha-card {
        border: none; /* Entfernt den Rahmen der Karte */
        background: transparent; 
      }        
  style: |
    :host
      {
        --sidebar-background: #242424;
        --sidebar-text-color: #fff;
        --face-color: #FFF;
        --face-border-color: #FFF;
        --clock-hands-color: #000;
        --clock-seconds-hand-color: #FF4B3E;
        --clock-middle-background: #FFF;
        --clock-middle-border: #000;
        --state-input_boolean-on-color: #00A188;
        --state-input_boolean-active-color: #00A188;
        --state-active-color: #00A188;
        --sidebar-selected-text-color: white;
    }
      .date {
        margin-bottom: 0px;
        color: #00A188; 
        opacity: 1; 
        font-size: 25px; 
        font-weight: 300; 
        text-align: center; 
        letter-spacing: -0.05vw; 
    }
      h1.digitalClock.with-seconds {
       margin-top: 0px;
       margin-bottom: 5px;
       font-size: 60px;
       text-align: center;
       line-height: 40px;
       font-weight: 400;
       color: white;
       cursor: default;
    }
     .sidebarMenu {
       font-size: 25px;
       line-height: 24px;
       font-weight: 400;
    }
      .sidebarMenu li.active::before {
        background-color: #00A188!important;
    }
      .sidebarMenu li.active ha-icon {
        color: white!important;;
    }
      :host ::slotted(.card-content) {
       padding: var(--ha-space-4);
       margin-bottom: 50px
    }
    }

 

Sidebar Anpassungs-Guide

Alle Einstellungen erklärt

Grundeinstellungen

Breite der Sidebar

Ganz oben findest du die Breiteneinstellungen:

sidebar:
  width:
    mobile: 0      # ← Mobile (0 = ausgeblendet)
    tablet: 25     # ← Tablet (25% der Bildschirmbreite)
    desktop: 18    # ← Desktop (18% der Bildschirmbreite)

Werte in Prozent (%):

  • 0 = Sidebar versteckt
  • 15-20 = Schmal (gut für Desktop)
  • 25-30 = Mittel (gut für Tablets)
  • 35-40 = Breit (viel Platz)

Titel und Datum

  title: null              # ← Sidebar-Titel (null = kein Titel)
  date: true               # ← Datum anzeigen (true/false)
  digitalClock: true       # ← Digitale Uhr anzeigen
  digitalClockWithSeconds: true  # ← Mit Sekunden
  dateFormat: dddd DD.MM.YYYY    # ← Format: "Montag 04.01.2025"

Titel hinzufügen:

  title: "Mein Smart Home"  # ← Statt null

Datumsformat ändern:

  • DD.MM.YYYY = 04.01.2025
  • DD/MM/YYYY = 04/01/2025
  • YYYY-MM-DD = 2025-01-04
  • dddd DD.MM.YYYY = Montag 04.01.2025 (mit Wochentag)

Menü-Einträge anpassen

Im Bereich sidebarMenu: findest du alle Menüpunkte:

  sidebarMenu:
    - action: navigate
      navigation_path: /dashboard-haus/haus
      name: Start              # ← Name im Menü
      active: true             # ← true = anklickbar, false = deaktiviert
      icon: mdi:home           # ← Icon (Material Design Icons)

Neuen Menüpunkt hinzufügen

Kopiere einen Block und ändere ihn:

    - action: navigate
      navigation_path: /dashboard-haus/DEINE-SEITE
      name: Dein Name
      active: true
      icon: mdi:DEIN-ICON

Icons ändern

Suche Icons auf: https://materialdesignicons.com/

Beispiele:

  • mdi:home = Haus
  • mdi:lightbulb = Glühbirne
  • mdi:thermometer = Thermometer
  • mdi:weather-cloudy = Wetter
  • mdi:chart-line = Diagramm

Menüpunkt entfernen

Lösche den kompletten Block (von - action: bis vor dem nächsten -).

Farben anpassen

Im Bereich style: | ganz unten findest du alle Farb-Definitionen:

Hintergrundfarbe der Sidebar

--sidebar-background: #242424;  # ← Dunkelgrau (Hex-Code)

Farben ändern:

  • #000000 = Schwarz
  • #FFFFFF = Weiß
  • #242424 = Dunkelgrau (aktuell)
  • #1a1a1a = Noch dunkler
  • #2C3E50 = Blaugrau
  • #34495E = Grau-Blau

Textfarbe

--sidebar-text-color: #fff;  # ← Weiß (#fff = Kurzform für #FFFFFF)

Akzent-Farbe (Türkis)

Die Akzentfarbe siehst du beim Datum und aktiven Menüpunkten:

--state-active-color: #00A188;  # ← Türkis (Akzentfarbe)

Alle Stellen mit Akzentfarbe:

--state-input_boolean-on-color: #00A188;
--state-input_boolean-active-color: #00A188;
--state-active-color: #00A188;

Andere Farben ausprobieren:

  • #FF4B3E = Rot
  • #3498DB = Blau
  • #2ECC71 = Grün
  • #9B59B6 = Lila
  • #F39C12 = Orange

Ändere alle drei Zeilen auf die gleiche Farbe!

Datums-Farbe

.date {
  color: #00A188;  # ← Farbe des Datums

Uhrzeit-Farbe

h1.digitalClock.with-seconds {
  color: white;  # ← Farbe der Uhrzeit

Aktiver Menüpunkt

.sidebarMenu li.active::before {
  background-color: #00A188!important;  # ← Balken links vom aktiven Punkt
}

.sidebarMenu li.active ha-icon {
  color: white!important;  # ← Icon-Farbe wenn aktiv
}

Schriftgrößen ändern

Datum

.date {
  font-size: 25px;      # ← Größe des Datums
  font-weight: 300;     # ← Dicke (100-900, 300=dünn)

Uhrzeit

h1.digitalClock.with-seconds {
  font-size: 60px;      # ← Größe der Uhrzeit
  font-weight: 400;     # ← Dicke
  line-height: 40px;    # ← Zeilenabstand

Menü-Text

.sidebarMenu {
  font-size: 25px;      # ← Größe der Menüpunkte
  line-height: 24px;    # ← Zeilenabstand
  font-weight: 400;     # ← Dicke

Empfohlene Werte:

Kleiner:

.sidebarMenu {
  font-size: 20px;
  line-height: 20px;

Größer:

.sidebarMenu {
  font-size: 30px;
  line-height: 28px;

Abstände anpassen

Abstand Datum zu Uhr

.date {
  margin-bottom: 0px;  # ← Abstand unten (größer = mehr Abstand zur Uhr)

Abstand Uhr zu Menü

h1.digitalClock.with-seconds {
  margin-top: 0px;      # ← Abstand oben
  margin-bottom: 5px;   # ← Abstand unten (zu Menü)

Abstand am Ende der Sidebar

:host ::slotted(.card-content) {
  padding: var(--ha-space-4);
  margin-bottom: 50px  # ← Abstand unten bei Bottom-Cards

Uhr-Design anpassen

Falls du eine analoge Uhr nutzen würdest (aktuell digital):

--face-color: #FFF;                    # ← Zifferblatt-Farbe
--face-border-color: #FFF;             # ← Rahmen-Farbe
--clock-hands-color: #000;             # ← Zeiger-Farbe
--clock-seconds-hand-color: #FF4B3E;   # ← Sekundenzeiger (Rot)
--clock-middle-background: #FFF;       # ← Mitte
--clock-middle-border: #000;           # ← Mitte-Rahmen

Text-Ausrichtung

Datum zentrieren/links/rechts

.date {
  text-align: center;  # ← center/left/right

Uhr zentrieren/links/rechts

h1.digitalClock.with-seconds {
  text-align: center;  # ← center/left/right

Bottom Cards (Karten unten)

Die Karten am unteren Ende der Sidebar findest du unter bottomCard:.

Transparenz der Container-Karte

bottomCard:
  card_mod:
    style: |
      ha-card {
        background: transparent;  # ← Transparent
        border: none;             # ← Kein Rahmen
        box-shadow: none;         # ← Kein Schatten

Hintergrund hinzufügen:

        background: rgba(255, 255, 255, 0.1);  # ← Leicht weiß transparent

Abstand zwischen Bottom Cards

ha-card {
  --stack-card-gap: 12px;  # ← Abstand zwischen den Karten

Mehr Abstand:

  --stack-card-gap: 20px;


Weitere Anpassungen

Sidebar nur auf Desktop anzeigen

width:
  mobile: 0     # ← Versteckt auf Handy
  tablet: 0     # ← Versteckt auf Tablet
  desktop: 20   # ← Nur Desktop

Datum ohne Wochentag

dateFormat: DD.MM.YYYY  # ← Ohne "Montag"

Uhr ohne Sekunden

digitalClockWithSeconds: false  # ← Keine Sekunden

Menü deaktivieren (nur Anzeige)

Bei jedem Menüpunkt:

- action: navigate
  navigation_path: /dashboard-haus/haus
  name: Start
  active: false  # ← false = ausgegraut, nicht klickbar
  icon: mdi:home