🌱 GrowBox Dashboard: Comprehensive Climate Control

Home Assistant Lovelace dashboard for a growbox: plant flower cards, zonal sensors and cameras, VPD history, phase controls, light, fan and pump controls.

Category
🏠 Home Assistant
Requirements
Described in the guide
Code blocks
1

This is the complete Home Assistant Lovelace YAML configuration for your GrowBox, designed for optimal indoor cultivation monitoring and control. It utilizes custom components like custom:flower-card and custom:button-card for a high-density, modern interface.

1. 🌿 Plant Monitoring Section (Flower Cards)

This section is designed to monitor the individual health of each plant using the custom:flower-card. This card offers a compact, visual representation of crucial microclimate parameters specific to the plant's root zone and immediate environment.

  • Strains Monitored: Lemon Cherry Gelato (Plants 1–3) and Strawberry Pop Rocks (Plants 4–6).
  • Key Metrics Displayed (show_bars): Illuminance (light), Air Humidity, Soil Moisture, Temperature, and DLI (Daily Light Integral).
  • Battery Status: Dedicated battery sensors (e.g., sensor.feuchtesensor_1_batterie) are tracked to ensure continuous data collection from the soil probes.

2. 🌡️ Zonal Sensors and Cameras

This card group aggregates all environmental sensors and live camera feeds. Measuring temperature and humidity at multiple points is critical for identifying potential air stratification (layering) or hot spots that can harm the plants.

  • Top Zone (Canopy): Primary climate metrics (sensor.temperatur, sensor.luftfeuchtigkeit).
  • Middle Zone: Checks for air homogeneity (sensor.growbox_temp_mitte_temperatur, sensor.growbox_temp_mitte_luftfeuchtigkeit).
  • Bottom/Exhaust Zone: Critical for fan control logic (sensor.growbox_abluft_temperature_sensor_celsius_239980).
  • Lighting Sensors: Measures light intensity (Illuminance) at different heights.
  • Cameras: Displays live feeds from the ceiling (camera.growbox_cam_decke_klar) and a detailed close-up stream (camera.albanigger_hd_stream).

3. 📈 History and VPD Management

This section is crucial for long-term optimization, focusing on historical data and Vapor Pressure Deficit (VPD), the most important environmental metric for plant transpiration and nutrient uptake.

  • VPD Gauge: The live VPD value (sensor.vpd) is displayed in a gauge that automatically adjusts its optimal (green) range based on the selected **Growth Phase** (Seedling, Vegetative, Flowering).
  • History Graphs: Provides a 24-hour visualization of all vital environmental metrics: VPD, Temperature, Humidity, Light Brightness, Exhaust Fan Speed, and Circulation Fan Power.

4. 📝 Status Report & Phase Control

The core of the control interface is the dynamic **Status Report** (custom:button-card). This card uses advanced JavaScript templating to consolidate complex monitoring logic into an easy-to-read summary.

  • Phase Selection: Manually set the current growth phase via input_select.growbox_phase.
  • Dynamic Logic: The report calculates average T/H, compares live values (T, H, VPD, Light) against phase-specific target ranges, and displays a quick status icon (🟢/🟠/🔴).
  • **Automation Check:** Verifies that the automated **Sunrise** and **Sunset** routines for the currently selected phase were triggered correctly today/yesterday (e.g., automation.growbox_sonnenaufgang_blutephase_30min).
  • **Phase Recommendations:** Displays the recommended PPF range and optimal lamp distance for the current stage.

5. 💡 Light, Fan, and Pump Controls

Direct control and detailed power monitoring for all major GrowBox systems. All metrics are sourced from smart outlets to track power consumption.

  • Lighting System: Includes the main light outlet switch (light.growbox_lampe_outlet) and a dedicated **Light Dimmer Controller** (light.growbox_licht_dimmer) for precise intensity management.
  • Exhaust Fan: Separate switch for the outlet (switch.grow_box_abluft_outlet) and a **Percentage Controller** (fan.growbox_abluft_fan_239980) for proportional climate control.
  • Circulation Fan: Simple on/off toggle (fan.growbox_umluft_outlet) with power consumption monitoring.
  • Pumps: Dedicated switches for two separate water or nutrient pumps (switch.10014d2a22_1 and switch.10014d2a22_2).

6. ⚙️ Controls

Growbox phase control buttons in the Home Assistant dashboard

📄 Home Assistant YAML Configuration

The complete YAML configuration for the Lovelace Dashboard. You can copy this code and paste it directly into your Home Assistant Raw Configuration Editor.

YAML
views:
  - type: sections
    title: GrowBox
    cards: []
    visible:
      - user: 8b635b46e5d24f65a6d42c8b7042ec9b
      - user: 56da46ac1857418ca77186480990ff6c
      - user: 45c76ae46b3e47f2a92ea03600940170
    badges: []
    icon: mdi:flower
    sections:
      - type: grid
        cards:
          - type: custom:flower-card
            entity: plant.lemon_cherry_gelato_1
            show_bars:
              - illuminance
              - humidity
              - moisture
              - temperature
              - dli
            battery_sensor: sensor.feuchtesensor_1_batterie
          - type: custom:flower-card
            entity: plant.lemon_cherry_gelato_2
            show_bars:
              - illuminance
              - humidity
              - moisture
              - temperature
              - dli
            battery_sensor: sensor.feuchtesensor_2_batterie
          - type: custom:flower-card
            entity: plant.lemon_cherry_gelato_3
            show_bars:
              - illuminance
              - humidity
              - moisture
              - temperature
              - dli
            battery_sensor: sensor.feuchtesensor_3_batterie
          - type: custom:flower-card
            entity: plant.strawberry_pop_rocks_4
            show_bars:
              - illuminance
              - humidity
              - moisture
              - temperature
              - dli
            battery_sensor: sensor.feuchtesensor_4_batterie
          - type: custom:flower-card
            entity: plant.strawberry_pop_rocks_5
            show_bars:
              - illuminance
              - humidity
              - moisture
              - temperature
              - dli
            battery_sensor: sensor.feuchtesensor_5_batterie
          - type: custom:flower-card
            entity: plant.strawberry_pop_rocks_6
            show_bars:
              - illuminance
              - humidity
              - moisture
              - temperature
              - dli
            battery_sensor: sensor.feuchtesensor_6_batterie
      - type: grid
        cards:
          - type: heading
            heading: Cameras
            heading_style: title
            icon: mdi:camera
          - type: grid
            square: false
            columns: 1
            cards:
              - type: picture-entity
                entity: camera.growbox_cam_decke_klar
                camera_view: auto
                fit_mode: cover
                show_state: false
                show_name: false
          - type: grid
            square: false
            columns: 1
            cards:
              - type: picture-entity
                entity: camera.albanigger_hd_stream
                camera_view: auto
                fit_mode: cover
                show_name: false
                show_state: false
          - type: vertical-stack
            cards:
              - type: horizontal-stack
                cards:
                  - type: custom:button-card
                    entity: sensor.temperatur
                    name: Temperature
                    icon: mdi:thermometer
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.luftfeuchtigkeit
                    name: Humidity
                    icon: mdi:water-percent
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                title: GrowBox Top
              - type: horizontal-stack
                cards:
                  - type: custom:button-card
                    entity: sensor.growbox_abluft_temperature_sensor_celsius_239980
                    name: Temp Bottom
                    icon: mdi:thermometer
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_abluft_humidity_sensor_239980
                    name: Humidity Bottom
                    icon: mdi:water-percent
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_temp_mitte_temperatur
                    name: Temp Middle
                    icon: mdi:thermometer
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_temp_mitte_luftfeuchtigkeit
                    name: Humidity Middle
                    icon: mdi:water-percent
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                title: GrowBox Middle
              - type: horizontal-stack
                cards:
                  - type: custom:button-card
                    entity: sensor.growbox_thermometer_unten_temperatur
                    name: Temp Bottom
                    icon: mdi:thermometer
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_thermometer_unten_luftfeuchtigkeit
                    name: Humidity Bottom
                    icon: mdi:water-percent
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px]
                title: GrowBox Bottom
              - type: horizontal-stack
                cards:
                  - type: custom:button-card
                    entity: sensor.gw2000a_indoor_temperature
                    name: Temp Outside
                    icon: mdi:thermometer
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.gw2000a_indoor_humidity
                    name: Humidity Outside
                    icon: mdi:water-percent
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                title: Outside Temperature
              - type: horizontal-stack
                cards:
                  - type: custom:button-card
                    entity: sensor.growbox_lichtsensor
                    name: Illuminance Top
                    icon: mdi:weather-sunny
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_thermometer_unten_beleuchtungsstarke
                    name: Illuminance Bottom
                    icon: mdi:weather-sunny
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                title: Light Sensor
              - type: horizontal-stack
                cards:
                  - type: custom:button-card
                    entity: sensor.growbox_anzucht_temperatur
                    name: Temperature
                    icon: mdi:thermometer
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_anzucht_luftfeuchtigkeit
                    name: Humidity
                    icon: mdi:water-percent
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                  - type: custom:button-card
                    entity: sensor.growbox_anzucht_batterie
                    name: Battery
                    icon: mdi:battery
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px
                        - box-shadow: var(--ha-card-box-shadow)
                      name:
                        - font-weight: bold
                        - font-size: 14px
                title: Seedling/Cloning Area
          - type: heading
            icon: mdi:water-pump
            heading: Pumps
            heading_style: title
          - type: entities
            entities:
              - entity: switch.10014d2a22_1
              - entity: switch.10014d2a22_2
            show_header_toggle: true
            title: Water Pumps
      - type: grid
        cards:
          - type: heading
            icon: mdi:clock
            heading: GrowBox - History
            heading_style: title
          - type: vertical-stack
            cards:
              - type: conditional
                conditions:
                  - entity: input_select.growbox_phase
                    state: Keimling
                card:
                  type: gauge
                  entity: sensor.vpd
                  name: 🌱 Seedling Phase
                  min: 0
                  max: 2
                  needle: true
                  unit: kPa
                  severity:
                    green: 0.4
                    yellow: 0.75
                    red: 1
              - type: conditional
                conditions:
                  - entity: input_select.growbox_phase
                    state: Wachstum
                card:
                  type: gauge
                  entity: sensor.vpd
                  name: 🌿 Vegetative Phase
                  min: 0
                  max: 3
                  needle: true
                  unit: kPa
                  severity:
                    green: 0.8
                    yellow: 1.2
                    red: 1.8
              - type: conditional
                conditions:
                  - entity: input_select.growbox_phase
                    state: Blüte
                card:
                  type: gauge
                  entity: sensor.vpd
                  name: 🌸 Flowering Phase
                  min: 0
                  max: 3
                  needle: true
                  unit: kPa
                  severity:
                    green: 1
                    yellow: 1.5
                    red: 2
          - type: vertical-stack
            cards:
              - type: history-graph
                title: 🌿 VPD History (24h)
                hours_to_show: 24
                refresh_interval: 60
                entities:
                  - entity: sensor.vpd
                    name: VPD (kPa)
              - type: history-graph
                title: 🌡️ Temperature History (24h)
                hours_to_show: 24
                refresh_interval: 60
                entities:
                  - entity: sensor.temperatur
              - type: history-graph
                title: 💧 Humidity History (24h)
                hours_to_show: 24
                refresh_interval: 60
                entities:
                  - entity: sensor.luftfeuchtigkeit
              - type: history-graph
                title: 💡 Light History (24h)
                hours_to_show: 24
                refresh_interval: 60
                entities:
                  - entity: sensor.growbox_licht_dimmer_helligkeit
                    name: ''
              - type: history-graph
                title: 🌬️ Exhaust History (24h)
                hours_to_show: 24
                refresh_interval: 60
                entities:
                  - entity: sensor.growbox_abluft_speed_sensor_239980
                    name: Speed
              - type: history-graph
                title: 🔄 Circulation History (24h)
                hours_to_show: 24
                refresh_interval: 60
                entities:
                  - entity: sensor.growbox_umluft_power
                    name: Power (W)
      - type: grid
        cards:
          - type: heading
            icon: mdi:flower-tulip-outline
            heading: GrowBox - Phase Management
            heading_style: title
          - type: vertical-stack
            cards:
              - type: entities
                title: 🌱 Select GrowBox Phase
                show_header_toggle: false
                entities:
                  - entity: input_select.growbox_phase
                    name: 🌿 Current Selection
              - type: custom:button-card
                name: 🧾 GrowBox Status Report
                show_name: true
                show_label: true
                unsafe_html: true
                tap_action:
                  action: more-info
                entity: input_select.growbox_phase
                label: |
                  [[[
                    const p = states['input_select.growbox_phase'].state;
                    const c = states['input_datetime.growbox_phase_last_changed']?.state ?? "Unknown";
                    
                    // Phase translation for display
                    const phase_map = {
                        "Keimling": "Seedling",
                        "Wachstum": "Vegetative",
                        "Blüte": "Flowering"
                    };
                    const p_en = phase_map[p] || p;

                    // Temperature: top, middle, bottom
                    const t1 = parseFloat(states['sensor.growbox_temp_mitte_temperatur']?.state);
                    const t2 = parseFloat(states['sensor.growbox_temperatursensor_oben_temperatur']?.state);
                    const t3 = parseFloat(states['sensor.growbox_thermometer_unten_temperatur']?.state);

                    // Humidity: top, middle, bottom
                    const h1 = parseFloat(states['sensor.growbox_temp_mitte_luftfeuchtigkeit']?.state);
                    const h2 = parseFloat(states['sensor.growbox_temperatursensor_oben_luftfeuchtigkeit']?.state);
                    const h3 = parseFloat(states['sensor.growbox_thermometer_unten_luftfeuchtigkeit']?.state);

                    // Average of only valid values
                    const temps = [t1, t2, t3].filter(v => !isNaN(v));
                    const hums  = [h1, h2, h3].filter(v => !isNaN(v));

                    const T = temps.length > 0 ?
                      temps.reduce((a,b) => a+b,0)/temps.length : undefined;
                    const H = hums.length > 0 ? hums.reduce((a,b) => a+b,0)/hums.length : undefined;
                    const V = parseFloat(states['sensor.vpd']?.state);
                    const L = states['light.growbox_licht_dimmer']?.attributes?.brightness ?? 0;
                    const Lp = Math.round(L / 2.55);
                    const Ls = parseFloat(states['input_number.growbox_soll_lichtwert']?.state ?? "NaN");
                    const Li = icon(Lp, Ls - 5, Ls + 5);
                    /* Exhaust */
                    const F = states['fan.growbox_abluft_fan_239980']?.attributes?.percentage ??
                      "❔";
                    const AbluftState = states['switch.growbox_abluft_switch_239980']?.state ?? "unknown";
                    const AbluftIcon = AbluftState === "on" ? "🟢" : AbluftState === "off" ?
                      "🔴" : "⚪";

                    const UmluftState = states['fan.growbox_umluft_outlet']?.state ?? "unknown";
                    const UmluftIcon = UmluftState === "on" ?
                      "🟢" : UmluftState === "off" ? "🔴" : "⚪";

                    const phase_ids = {
                      "Keimling": {
                        sunrise: "automation.growbox_sonnenaufgang_keimlingsphase",
                        sunset:  "automation.growbox_sonnenuntergang_keimlingsphase"
                      },
                      "Wachstum": {
                        sunrise: "automation.growbox_sonnenaufgang_wachstumsphase_30min",
                        sunset:  "automation.growbox_sonnenuntergang_wachstumsphase_30min"
                      },
                      "Blüte": {
                        sunrise: "automation.growbox_sonnenaufgang_blutephase_30min",
                        sunset:  "automation.growbox_sonnenuntergang_blutephase_30min"
                      }
                    };
                    const sunrise_id = phase_ids[p]?.sunrise ?? null;
                    const sunset_id = phase_ids[p]?.sunset ?? null;
                    function isTriggeredToday(automation) {
                      if (!automation || automation.state !== "on") return false;
                      const lt = automation.attributes.last_triggered;
                      if (!lt) return false;
                      const last = new Date(lt);
                      const now = new Date();
                      return last.getFullYear() === now.getFullYear() &&
                             last.getMonth() === now.getMonth() &&
                             last.getDate() === now.getDate();
                    }

                    function isTriggeredYesterday(automation) {
                      if (!automation || automation.state !== "on") return false;
                      const lt = automation.attributes.last_triggered;
                      if (!lt) return false;
                      const last = new Date(lt);
                      const yesterday = new Date();
                      yesterday.setDate(yesterday.getDate() - 1);
                      return last.getFullYear() === yesterday.getFullYear() &&
                             last.getMonth() === yesterday.getMonth() &&
                             last.getDate() === yesterday.getDate();
                    }

                    const suAutomation = states[sunrise_id];
                    const sdAutomation = states[sunset_id];

                    const su = isTriggeredToday(suAutomation) ? "✅" : "⚠️";
                    const sd = isTriggeredYesterday(sdAutomation) ? "✅" : "⚠️";
                    const formatTime = (dt) => {
                      if (!dt) return "Never";
                      const d = new Date(dt);
                      return d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
                    };

                    const suLast = suAutomation?.attributes?.last_triggered ? formatTime(suAutomation.attributes.last_triggered) : "Never";
                    const sdLast = sdAutomation?.attributes?.last_triggered ? formatTime(sdAutomation.attributes.last_triggered) : "Never";

                    let daysSinceChange = "Unknown";
                    if(c !== "Unknown"){
                      const now = new Date();
                      const changed = new Date(c);
                      daysSinceChange = Math.floor((now - changed) / (1000*60*60*24)) + 1;
                    }

                    // Target settings based on phase (English values)
                    let Tmin=20, Tmax=24, Hmin=50, Hmax=70, Vmin=0.8, Vmax=1.2, A="35–50 cm", PPF="300–600 µmol/m²/s";
                    if (p==="Keimling") {
                      [Tmin,Tmax] = [22,26];
                      [Hmin,Hmax] = [70,80];
                      [Vmin,Vmax] = [0.4,0.8];
                      A = "40–60 cm";
                      PPF = "100–300 µmol/m²/s";
                    } else if(p==="Blüte") {
                      [Tmin,Tmax] = [18,22];
                      [Hmin,Hmax] = [40,50];
                      [Vmin,Vmax] = [1.0,1.5];
                      A = "30–40 cm";
                      PPF = "600–1000 µmol/m²/s";
                    }

                    function colorGradient(value, min, max) {
                      if (value === undefined || isNaN(value)) return "#AAA";
                      let percent = (value - min) / (max - min);
                      percent = Math.min(1, Math.max(0, percent));
                      let hue = percent < 0.5 ? 120 : 120 - (percent - 0.5) * 2 * 120;
                      return `hsl(${hue}, 80%, 50%)`;
                    }

                    function bar(value, min, max, width=100) {
                      if(value === undefined || isNaN(value)) return "";
                      let percent = (value - min) / (max - min);
                      percent = Math.min(1, Math.max(0, percent));
                      const color = colorGradient(value, min, max);
                      return `<div style="background:#ddd; border-radius:5px; width:${width}px; height:12px;">
                                <div style="width:${percent*100}%; background:${color}; height:12px; border-radius:5px;"></div>
                              </div>`;
                    }

                    function icon(v, min, max){
                      if (v === undefined || isNaN(v)) return "⚪";
                      if (v < min) return "🟠";
                      if (v > max) return "🔴";
                      return "🟢";
                    }

                    const Ti = icon(T, Tmin, Tmax);
                    const Hi = icon(H, Hmin, Hmax);
                    const Vi = icon(V, Vmin, Vmax);

                    const d = c !== "Unknown" ?
                      `${c.slice(8,10)}.${c.slice(5,7)}.${c.slice(0,4)}` : "Unknown";

                    return `
                      <style>
                        .growbox-label { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
                        }
                        .growbox-title { font-weight: 700;
                          font-size: 16px; color: #4CAF50; margin-bottom: 6px; }
                        .growbox-subtitle { font-weight: 600;
                          font-size: 13px; margin-bottom: 10px; color: #666; }
                        .growbox-hr { border: none;
                          height: 1px; background: #ddd; margin: 10px 0; }
                        .growbox-row { margin-bottom: 8px;
                        }
                        .growbox-icon { font-size: 18px;
                          width: 22px; display: inline-block; }
                        .growbox-bar-container { display: inline-block;
                          vertical-align: middle; margin-left: 6px; }
                        .growbox-small { font-size: 12px;
                          color: #888; }
                      </style>
                      
                      <div class="growbox-label">
                        <div class="growbox-title">🧬 Phase: <span>${p_en}</span></div>
                        <div class="growbox-subtitle">📅 Changed: ${d} (Day ${daysSinceChange})</div>
                        <hr class="growbox-hr">
                        
                        <div class="growbox-row">
                          <span class="growbox-icon">${Ti}</span>
                          <b>Temperature:</b> ${T !== undefined ?
                            T.toFixed(1) : "❔"} °C (Target ${Tmin}–${Tmax})
                          <span class="growbox-bar-container">${bar(T, Tmin, Tmax)}</span>
                        </div>
                        
                        <div class="growbox-row">
                          <span class="growbox-icon">${Hi}</span>
                          <b>Humidity:</b> ${H !== undefined ?
                            H.toFixed(1) : "❔"} % (Target ${Hmin}–${Hmax})
                          <span class="growbox-bar-container">${bar(H, Hmin, Hmax)}</span>
                        </div>
                        
                        <div class="growbox-row">
                          <span class="growbox-icon">${Vi}</span>
                          <b>VPD:</b> ${V !== undefined ?
                            V.toFixed(2) : "❔"} (Target ${Vmin}–${Vmax})
                          <span class="growbox-bar-container">${bar(V, Vmin, Vmax)}</span>
                        </div>
                        
                        <hr class="growbox-hr">
                        
                        <div class="growbox-row">
                          <span class="growbox-icon">${Li}</span>
                          <b>💡 Light:</b> ${Lp}% (Target ${isNaN(Ls) ? "❔" : Ls + "%" })
                          <span class="growbox-bar-container">${isNaN(Ls) ?
                            "" : bar(Lp, Ls - 10, Ls + 10)}</span>
                        </div>
                        
                        <div class="growbox-row">
                          <b>🌬️ Exhaust Fan:</b>
                          <span style="font-size:18px;">${AbluftIcon}</span>
                          ${F}%
                        </div>
                        
                        <div class="growbox-row">
                          <b>🔄 Circulation Fan:</b>
                          <span style="font-size: 18px;">${UmluftIcon}</span>
                        </div>
                        
                        <div class="growbox-row" title="Last Triggered: ${suLast}">
                          <b>🌅 Sunrise Automation:</b>
                          <span style="color:${su === "✅" ? "#4CAF50" : "#FFC107"}">${su}</span>
                        </div>
                        
                        <div class="growbox-row" title="Last Triggered: ${sdLast}">
                          <b>🌇 Sunset Automation:</b>
                          <span style="color:${sd === "✅" ?
                            "#4CAF50" : "#FFC107"}">${sd}</span>
                        </div>
                        
                        <hr class="growbox-hr">
                        
                        <div class="growbox-row">
                          <b>📏 Lamp Distance:</b> ${A}
                        </div>
                        
                        <div class="growbox-row">
                          <b>💡 PPF:</b> ${PPF}
                        </div>
                      </div>
                    `;
                  ]]]
                styles:
                  card:
                    - border-radius: 16px
                    - padding: 18px
                    - box-shadow: var(--ha-card-box-shadow)
                    - background: var(--card-background-color)
                  name:
                    - font-weight: bold
                    - font-size: 16px
                    - padding-bottom: 4px
                  label:
                    - white-space: normal
                    - text-align: left
                    - font-size: 14px
                  icon:
                    - display: none
          - type: heading
            heading: Light / Fans
            heading_style: title
            icon: mdi:ceiling-light
          - type: vertical-stack
            cards:
              - type: custom:button-card
                entity: light.growbox_lampe_outlet
                name: Light Outlet Switch
                icon: mdi:power-plug
                show_state: true
                tap_action:
                  action: toggle
                styles:
                  card:
                    - border-radius: 12px
                    - padding: 24px 32px
                    - font-weight: bold
                    - box-shadow: var(--ha-card-box-shadow)
                  icon:
                    - size: 48px
                  name:
                    - font-size: 22px
                  state:
                    - font-size: 18px
                    - font-style: italic
                state:
                  - value: 'on'
                    color: green
                  - value: 'off'
                    color: gray
              - type: grid
                columns: 3
                square: false
                cards:
                  - type: custom:button-card
                    entity: sensor.grow_box_lampe_voltage
                    name: Voltage
                    icon: mdi:flash
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_lampe_signal_strength
                    name: Signal Strength
                    icon: mdi:wifi-strength-3
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_lampe_power
                    name: Power
                    icon: mdi:power
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
              - type: grid
                columns: 3
                square: false
                cards:
                  - type: custom:button-card
                    entity: sensor.grow_box_lampe_energy
                    name: Energy
                    icon: mdi:lightning-bolt
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_lampe_current
                    name: Current
                    icon: mdi:current-ac
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_lampe_consumption
                    name: Consumption
                    icon: mdi:chart-line
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
              - type: custom:mushroom-light-card
                entity: light.growbox_licht_dimmer
                name: Light Dimmer
                show_brightness_control: true
                show_color_control: false
                collapsible_controls: false
                style: |
                  ha-card {
                    border-radius: 15px;
                    box-shadow: var(--ha-card-box-shadow);
                    padding: 10px;
                    margin-top: 12px;
                  }
          - type: vertical-stack
            cards:
              - type: custom:button-card
                entity: switch.grow_box_abluft_outlet
                name: Exhaust Outlet Switch
                icon: mdi:power-plug
                show_state: true
                tap_action:
                  action: toggle
                styles:
                  card:
                    - border-radius: 12px
                    - padding: 24px 32px
                    - font-weight: bold
                    - box-shadow: var(--ha-card-box-shadow)
                  icon:
                    - size: 48px
                  name:
                    - font-size: 22px
                  state:
                    - font-size: 18px
                    - font-style: italic
                state:
                  - value: 'on'
                    color: green
                  - value: 'off'
                    color: gray
              - type: grid
                columns: 5
                square: false
                cards:
                  - type: custom:button-card
                    entity: sensor.grow_box_abluft_voltage
                    name: Voltage
                    icon: mdi:flash
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_abluft_power
                    name: Power
                    icon: mdi:power
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_abluft_current
                    name: Current
                    icon: mdi:current-ac
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_abluft_consumption
                    name: Consumption
                    icon: mdi:chart-line
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.grow_box_abluft_energy
                    name: Energy
                    icon: mdi:lightning-bolt
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
              - type: grid
                columns: 2
                square: false
                cards:
                  - type: custom:button-card
                    entity: switch.growbox_abluft_switch_239980
                    name: Exhaust Fan Switch
                    icon: mdi:toggle-switch
                    show_state: true
                    tap_action:
                      action: toggle
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 16px 20px
                        - font-weight: bold
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 36px
                      name:
                        - font-size: 18px
                      state:
                        - font-size: 16px
                        - font-style: italic
                    state:
                      - value: 'on'
                        color: green
                      - value: 'off'
                        color: gray
                  - type: custom:button-card
                    entity: sensor.growbox_abluft_speed_sensor_239980
                    name: Fan Speed
                    icon: mdi:fan
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 16px 20px
                        - font-weight: bold
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 36px
                      name:
                        - font-size: 18px
                      state:
                        - font-size: 16px
                        - font-style: italic
              - type: custom:mushroom-fan-card
                entity: fan.growbox_abluft_fan_239980
                name: Exhaust Controller
                show_percentage_control: true
                show_oscillate_control: false
                show_direction_control: false
                collapsible_controls: true
                icon_animation: true
                fill_container: false
                primary_info: none
          - type: vertical-stack
            cards:
              - type: custom:button-card
                entity: fan.growbox_umluft_outlet
                name: Circulation Fan
                icon: mdi:fan
                show_state: true
                tap_action:
                  action: toggle
                styles:
                  card:
                    - border-radius: 12px
                    - padding: 16px 20px
                    - font-weight: bold
                    - box-shadow: var(--ha-card-box-shadow)
                  icon:
                    - size: 36px
                  name:
                    - font-size: 18px
                  state:
                    - font-size: 16px
                    - font-style: italic
                state:
                  - value: 'on'
                    color: green
                  - value: 'off'
                    color: gray
              - type: grid
                columns: 5
                square: false
                cards:
                  - type: custom:button-card
                    entity: sensor.growbox_umluft_consumption
                    name: Consumption
                    icon: mdi:chart-line
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.growbox_umluft_current
                    name: Current
                    icon: mdi:current-ac
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.growbox_umluft_energy
                    name: Energy
                    icon: mdi:lightning-bolt
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.growbox_umluft_power
                    name: Power
                    icon: mdi:power
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic
                  - type: custom:button-card
                    entity: sensor.growbox_umluft_voltage
                    name: Voltage
                    icon: mdi:flash
                    show_state: true
                    styles:
                      card:
                        - border-radius: 12px
                        - padding: 12px 16px
                        - box-shadow: var(--ha-card-box-shadow)
                      icon:
                        - size: 28px
                      name:
                        - font-weight: bold
                        - font-size: 14px
                      state:
                        - font-size: 13px
                        - font-style: italic

← Back to all scripts