@ -3,16 +3,15 @@
# For more info visit https://www.vcloudinfo.com/click-here
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# -------------------------------------------------------------------
# Infrastructure Partial - Home sections
# Infrastructure Partial - operations summary
# Desktop-first infra overview: full-width hero, exceptions-first alert s.
# Exception-first health strip, active issues, datacenter, and network trend s.
# -------------------------------------------------------------------
# -------------------------------------------------------------------
# Notes: Default/light theme only; no dark-mode specific styling.
# Notes: Six category tiles replace the mostly empty production status panel.
# Notes: Keep the first section full-width to avoid whitespace on desktop.
# Notes: All overview trends use a 24-hour window with visible series labels.
# Notes: Excludes transient codex_appliance Portainer run containers from generic exception lists.
######################################################################
######################################################################
# -------------------------------------------------------------------
# -------------------------------------------------------------------
# Home hero (mandatory first full-width contain er)
# Category health strip (mandatory first full-width wrapp er)
# -------------------------------------------------------------------
# -------------------------------------------------------------------
- type : grid
- type : grid
column_span : 4
column_span : 4
@ -24,423 +23,302 @@
columns : full
columns : full
layout_type : custom:grid-layout
layout_type : custom:grid-layout
layout:
layout:
grid-template-columns : repeat( 2 , minmax(0, 1fr))
grid-template-columns : repeat( 6 , minmax(0, 1fr))
grid-auto-flow : row
grid-auto-flow : row
grid-auto-rows : min-content
grid-auto-rows : min-content
grid-gap : 12px
grid-gap : 12px
margin : 0
margin : 0
mediaquery:
mediaquery:
"(max-width: 900px)" :
"(max-width: 900px)" :
grid-template-columns : repeat(1, minmax(0, 1fr))
grid-template-columns : repeat(2, minmax(0, 1fr))
cards:
- type : custom:vertical-stack-in-card
grid_options:
columns : full
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
cards:
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_panel_header
template : bearstone_infra_status_kpi
name : Infrastructure Status
entity : sensor.infra_dashboard_active_issue_count
name : Overall
icon : mdi:shield-check-outline
variables:
ok_state : '0'
healthy_text : ALL CLEAR
raw_suffix : ACTIVE
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_list_row
template : bearstone_infra_status_kpi
entity : sensor.joanna_ha_dispatches_24h
entity : binary_sensor.infra_wan_quality_degraded
name : Joanna Dispatch
name : Network
icon : mdi:robot
icon : mdi:wan
variables:
ok_state : 'off'
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/joanna
navigation_path : /dashboard-infrastructure/network
state_display : >
[ [ [
const ha24 = states['sensor.joanna_ha_dispatches_24h']?.state ?? '0';
const all24 = states['sensor.joanna_all_dispatches_24h']?.state ?? '0';
const queue = states['sensor.joanna_queue_pending']?.state ?? '0';
return `HA ${ha24} | All ${all24} | Q ${queue}`;
] ] ]
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_list_row
template : bearstone_infra_status_kpi
name : Network
entity : binary_sensor.infra_dns_pihole_degraded
icon : mdi:access-point-network
name : DNS
show_state : false
icon : mdi:dns-outline
variables:
ok_state : 'off'
tap_action:
tap_action:
action : none
action : navigate
navigation_path : /dashboard-infrastructure/network
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_ alert_row
template : bearstone_infra_ status_kpi
entity : sensor.unifi_ap_office_clients
entity : binary_sensor.infra_compute_degraded
name : Office AP has 0 clients
name : Compute
icon : mdi:wifi-alert
icon : mdi:server-network
variables:
variables:
alert_kind : ap_zero
ok_state : 'off'
min_age_s : 300
tap_action:
action : navigate
navigation_path : /dashboard-infrastructure/proxmox
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_ alert_row
template : bearstone_infra_ status_kpi
entity : sensor.unifi_ap_study_clients
entity : binary_sensor.infra_storage_degraded
name : Study AP has 0 clients
name : Storage
icon : mdi:wifi-alert
icon : mdi:database-check-outline
variables:
variables:
alert_kind : ap_zero
ok_state : 'off'
min_age_s : 300
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_ alert_row
template : bearstone_infra_ status_kpi
entity : sensor.unifi_ap_garage_clients
entity : binary_sensor.infra_external_monitoring_degraded
name : Garage AP has 0 clients
name : External
icon : mdi:wifi-alert
icon : mdi:web-check
variables:
variables:
alert_kind : ap_zero
ok_state : 'off'
min_age_s : 300
tap_action:
action : navigate
navigation_path : /dashboard-infrastructure/network
# -------------------------------------------------------------------
# Active exceptions and datacenter
# -------------------------------------------------------------------
- type : grid
column_span : 4
columns : 1
square : false
cards:
- type : custom:layout-card
grid_options:
columns : full
layout_type : custom:grid-layout
layout:
grid-template-columns : repeat(2, minmax(0, 1fr))
grid-auto-flow : row
grid-auto-rows : min-content
grid-gap : 12px
margin : 0
mediaquery:
"(max-width: 900px)" :
grid-template-columns : repeat(1, minmax(0, 1fr))
cards:
- type : custom:vertical-stack-in-card
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- type : custom:button-card
template : bearstone_infra_panel_header
name : Active Exceptions
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_list_row
entity : sensor.speedtest_download
entity : sensor.infra_dashboard_active_issue_count
name : Internet speed is slow
name : Operations Summary
icon : mdi:speedometer-slow
icon : mdi:shield-search
variables:
alert_kind : speedtest_slow
threshold : 300
state_display : >
state_display : >
[ [ [
[ [ [
const dl = parseFloat(states['sensor.speedtest_download']?.state);
const count = Number(entity?.state);
const ul = parseFloat(states['sensor.speedtest_upload']?.state);
if (!Number.isFinite(count)) return 'NO DATA';
const dlText = Number.isFinite(dl) ? (dl.toFixed(0) + ' Mbps') : 'n/a' ;
return count === 0 ? 'NO ACTIVE EXCEPTIONS' : `${count} CATEGORIES NEED ATTENTION`;
const ulText = Number.isFinite(ul) ? (ul.toFixed(0) + ' Mbps') : 'n/a' ;
return `DL ${dlText} | UL ${ulText}`;
] ] ]
] ] ]
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : sensor.speedtest_ping
entity : binary_sensor.infra_wan_quality_degraded
name : WAN latency high
name : WAN quality degraded
icon : mdi:wan
icon : mdi:wan
variables:
variables:
alert_kind : disk_high
alert_kind : binary_on
threshold : 80
tap_action:
state_display : >
action : navigate
[ [ [ return `${entity.state} ms`; ]]]
navigation_path : /dashboard-infrastructure/network
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : switch.pi_hole
entity : binary_sensor.infra_dns_pihole_degraded
name : DNS Pi-hole disabl ed
name : Pi-hole DNS degrad ed
icon : mdi:dns-outline
icon : mdi:dns-outline
variables:
variables:
alert_kind : binary_o ff
alert_kind : binary_o n
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/pihole
navigation_path : /dashboard-infrastructure/network
state_display : >
[ [ [ return `Switch ${entity.state}`; ]]]
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : binary_sensor.p ihole_status
entity : binary_sensor.p roxmox1_runtime_healthy
name : DNS Pi-hole service down
name : Proxmox01 runtime unavailable
icon : mdi: dn s
icon : mdi: server-off
variables:
variables:
alert_kind : binary_off
alert_kind : binary_off
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/p ihole
navigation_path : /dashboard-infrastructure/p roxmox
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : binary_sensor. vcloudinfo_com
entity : binary_sensor. proxmox02_runtime_healthy
name : vcloudinfo.com is down
name : Proxmox02 runtime unavailable
icon : mdi: web-cancel
icon : mdi: server-off
variables:
variables:
alert_kind : binary_off
alert_kind : binary_off
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/ website-health
navigation_path : /dashboard-infrastructure/ proxmox
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : binary_sensor. www_kingcrafthomes_com
entity : binary_sensor. node_proxmox1_updates_packages
name : kingcrafthomes.com is down
name : Proxmox01 updates pending
icon : mdi: web-cancel
icon : mdi: package-up
variables:
variables:
alert_kind : binary_o ff
alert_kind : binary_o n
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/ website-health
navigation_path : /dashboard-infrastructure/ proxmox
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : binary_sensor. bear_stone
entity : binary_sensor. node_proxmox02_updates_packages
name : Bear Stone is down
name : Proxmox02 updates pending
icon : mdi: web-cancel
icon : mdi: package-up
variables:
variables:
alert_kind : binary_off
alert_kind : binary_on
tap_action:
action : navigate
navigation_path : /dashboard-infrastructure/website-health
- type : custom:button-card
template : bearstone_infra_list_row
name : Domain expiration critical
icon : mdi:domain-off
tap_action:
action : navigate
navigation_path : /dashboard-infrastructure/website-health
state_display : >
[ [ [
const ids = [
'sensor.vcloudinfo_com_days_until_expiration' ,
'sensor.kingcrafthomes_com_days_until_expiration'
] ;
let min = null;
ids.forEach((id) => {
const raw = states[id]?.state;
const n = Number(raw);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min === null) ? 'No data' : `${Math.round(min)} days remaining`;
] ] ]
styles:
card:
- display : >
[ [ [
const ids = [
'sensor.vcloudinfo_com_days_until_expiration' ,
'sensor.kingcrafthomes_com_days_until_expiration'
] ;
let min = null;
ids.forEach((id) => {
const n = Number(states[id]?.state);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min !== null && min < 14) ? 'block' : 'none' ;
] ] ]
- type : custom:button-card
template : bearstone_infra_list_row
name : Domain expiration warning
icon : mdi:domain
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/website-health
navigation_path : /dashboard-infrastructure/proxmox
state_display : >
[ [ [
const ids = [
'sensor.vcloudinfo_com_days_until_expiration' ,
'sensor.kingcrafthomes_com_days_until_expiration'
] ;
let min = null;
ids.forEach((id) => {
const raw = states[id]?.state;
const n = Number(raw);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min === null) ? 'No data' : `${Math.round(min)} days remaining`;
] ] ]
styles:
card:
- display : >
[ [ [
const ids = [
'sensor.vcloudinfo_com_days_until_expiration' ,
'sensor.kingcrafthomes_com_days_until_expiration'
] ;
let min = null;
ids.forEach((id) => {
const n = Number(states[id]?.state);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min !== null && min >= 14 && min < 30) ? 'block' : 'none' ;
] ] ]
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_ lis t_row
template : bearstone_infra_alert_row
name: Certificate expiration critical
entity : binary_sensor.docker_container_telemetry_degraded
icon: mdi:certificate-outline
name : Docker telemetry degraded
tap_action:
icon : mdi:docker
action : navigate
variables:
navigation_path: /dashboard-infrastructure/website-health
alert_kind : binary_on
state_display : >
state_display : >
[ [ [
[ [ [
const keys = Object.keys(states).filter((k) =>
const unavailable = states['sensor.docker_monitored_unavailable_count']?.state ?? '0';
k.startsWith('sensor.') &&
const total = states['sensor.docker_monitored_container_count']?.state ?? '0';
/(vcloudinfo|kingcrafthomes)/.test(k) &&
return `${unavailable}/${total} unavailable`;
/(cert|ssl|tls)/.test(k)
);
let min = null;
keys.forEach((k) => {
const n = Number(states[k]?.state);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min === null) ? 'Not available' : `${Math.round(min)} days remaining`;
] ] ]
styles:
card:
- display : >
[ [ [
const keys = Object.keys(states).filter((k) =>
k.startsWith('sensor.') &&
/(vcloudinfo|kingcrafthomes)/.test(k) &&
/(cert|ssl|tls)/.test(k)
);
let min = null;
keys.forEach((k) => {
const n = Number(states[k]?.state);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min !== null && min < 14) ? 'block' : 'none' ;
] ] ]
] ] ]
- type : custom:button-card
template : bearstone_infra_list_row
name : Certificate expiration warning
icon : mdi:certificate
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/website-health
navigation_path : /dashboard-infrastructure/docker
state_display : >
[ [ [
const keys = Object.keys(states).filter((k) =>
k.startsWith('sensor.') &&
/(vcloudinfo|kingcrafthomes)/.test(k) &&
/(cert|ssl|tls)/.test(k)
);
let min = null;
keys.forEach((k) => {
const n = Number(states[k]?.state);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min === null) ? 'Not available' : `${Math.round(min)} days remaining`;
] ] ]
styles:
card:
- display : >
[ [ [
const keys = Object.keys(states).filter((k) =>
k.startsWith('sensor.') &&
/(vcloudinfo|kingcrafthomes)/.test(k) &&
/(cert|ssl|tls)/.test(k)
);
let min = null;
keys.forEach((k) => {
const n = Number(states[k]?.state);
if (Number.isFinite(n)) min = (min === null) ? n : Math.min(min, n);
});
return (min !== null && min >= 14 && min < 30) ? 'block' : 'none' ;
] ] ]
- type : custom:button-card
template : bearstone_infra_list_row
name : System
icon : mdi:alert-circle-outline
show_state : false
tap_action:
action : none
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : binary_sensor. node_proxmox1_updates_packages
entity : binary_sensor.infra_storage_degraded
name : Proxmox01 updates pending
name : Storage threshold or telemetry problem
icon : mdi: package-up
icon : mdi:database-alert-outline
variables:
variables:
alert_kind : binary_on
alert_kind : binary_on
tap_action:
action : navigate
navigation_path : /dashboard-infrastructure/proxmox
state_display : >
[ [ [ return 'UPDATES'; ]]]
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : binary_sensor. node_proxmox02_updates_packages
entity : binary_sensor.infra_website_degraded
name : Proxmox02 updates pending
name : Website availability degraded
icon : mdi: package-up
icon : mdi:web-off
variables:
variables:
alert_kind : binary_on
alert_kind : binary_on
tap_action:
tap_action:
action : navigate
action : navigate
navigation_path : /dashboard-infrastructure/proxmox
navigation_path : /dashboard-infrastructure/network
state_display : >
[ [ [ return 'UPDATES'; ]]]
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_alert_row
entity : sensor. disk_use_percent
entity : sensor.proxmox_garage_average_temperature
name : Home Assistant disk usag e high
name : Garage compute temperature high
icon : mdi: harddisk
icon : mdi:thermometer-alert
variables:
variables:
alert_kind : disk _high
alert_kind : numeric_high
threshold : 80
threshold : 145
state_display : >
state_display : >
[ [ [ return `${entity.state}% used`; ]]]
[ [ [ return `${entity.state} °F`; ]]]
- type : custom:button-card
template : bearstone_infra_list_row
name : Services
icon : mdi:docker
show_state : false
tap_action:
tap_action:
action : none
action : navigate
navigation_path : /dashboard-infrastructure/proxmox
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_alert_row
template : bearstone_infra_panel_header
entity : binary_sensor.docker_container_telemetry_degraded
name : Network Trends
name : Docker telemetry degraded
icon : mdi:lan-disconnect
variables:
alert_kind : binary_on
tap_action:
action : navigate
navigation_path : /dashboard-infrastructure/docker
state_display : >-
[ [ [
const unavailable = states['sensor.docker_monitored_unavailable_count']?.state ?? '0';
const total = states['sensor.docker_monitored_container_count']?.state ?? '0';
return `${unavailable}/${total} unavailable`;
] ] ]
- type : custom:auto-entities
- type : custom:mini-graph-card
show_empty : false
name : Wi-Fi Clients
card:
icon : mdi:wifi
type : custom:layout-card
hours_to_show : 24
layout_type : custom:grid-layout
points_per_hour : 1
layout:
line_width : 2
grid-template-columns : repeat(2, minmax(0, 1fr))
smoothing : true
grid-auto-flow : row
show:
grid-auto-rows : min-content
legend : true
grid-gap : 12px
labels : false
margin : 0
name : true
mediaquery:
icon : true
"(max-width: 900px)" :
state : true
grid-template-columns : repeat(1, minmax(0, 1fr))
entities:
card_param : cards
- entity : sensor.total_wifi_clients
filter:
name : Total
include:
show_graph : false
- entity_id : "/^switch\\..*_container(_2)?$/"
- entity : sensor.unifi_ap_office_clients
options:
name : Office
type : custom:button-card
- entity : sensor.unifi_ap_study_clients
template : bearstone_infra_container_row
name : Study
icon : mdi:docker
- entity : sensor.unifi_ap_garage_clients
exclude:
name : Garage
- entity_id : "/^switch\\.[0-9a-f]{12}_codex_appliance_container$/"
card_mod:
- entity_id : "/^switch\\.docker_files_codex_appliance_run_[0-9a-f]+_container$/"
style : !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- state : 'on'
- state : unavailable
- type : custom:mini-graph-card
- state : unknown
name : Internet Throughput
icon : mdi:speedometer
hours_to_show : 24
points_per_hour : 1
line_width : 2
smoothing : true
show:
fill : false
legend : true
labels : false
name : true
icon : true
state : false
entities:
- entity : sensor.speedtest_download
name : Download
show_legend_state : true
- entity : sensor.speedtest_upload
name : Upload
show_legend_state : true
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type : custom:vertical-stack-in-card
- type : custom:vertical-stack-in-card
grid_options:
columns : full
card_mod:
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
style : !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
cards:
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_panel_header
template : bearstone_infra_panel_header
name : Datacenter
name : Datacenter
- type : custom:mini-graph-card
- type : custom:mini-graph-card
name : Garage Temp
name : Garage Compute Temperature
icon : mdi:thermometer
icon : mdi:thermometer
hours_to_show : 96
hours_to_show : 24
points_per_hour : 1
points_per_hour : 2
line_width : 2
line_width : 2
smoothing : true
smoothing : true
show:
show:
@ -450,10 +328,10 @@
icon : true
icon : true
state : true
state : true
color_thresholds:
color_thresholds:
- value : 50
- value : 80
color : '#43a047'
- value : 135
color : '#f39c12'
color : '#f39c12'
- value : 120
color : '#d35400'
- value : 145
- value : 145
color : '#c0392b'
color : '#c0392b'
entities:
entities:
@ -462,20 +340,8 @@
card_mod:
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
style : !include /config/dashboards/infrastructure/card_mod/infra_card.yaml
- type : custom:layout-card
layout_type : custom:grid-layout
layout:
grid-template-columns : repeat(2, minmax(0, 1fr))
grid-auto-flow : row
grid-auto-rows : min-content
grid-gap : 12px
margin : 0
mediaquery:
"(max-width: 900px)" :
grid-template-columns : repeat(1, minmax(0, 1fr))
cards:
- type : custom:button-card
- type : custom:button-card
template : bearstone_infra_list_row
template : bearstone_infra_list_row_running
entity : sensor.garage_ups_status
entity : sensor.garage_ups_status
name : UPS Status
name : UPS Status
icon : mdi:battery-heart-variant
icon : mdi:battery-heart-variant
@ -487,8 +353,8 @@
icon : mdi:battery-70
icon : mdi:battery-70
state_display : >
state_display : >
[ [ [
[ [ [
const v = Number(entity?.state);
const v alue = Number(entity?.state);
return Number.isFinite(v) ? `${v.toFixed(0)}%` : (entity?.state ?? 'unknown') ;
return Number.isFinite(value) ? `${value.toFixed(0)}%` : 'NO DATA' ;
] ] ]
] ] ]
- type : custom:button-card
- type : custom:button-card
@ -498,11 +364,11 @@
icon : mdi:timer-outline
icon : mdi:timer-outline
state_display : >
state_display : >
[ [ [
[ [ [
const secs = parseInt(entity?.state, 10 );
const seconds = Number(entity?.state );
if (!Number.isFinite(secs)) return entity?.state ?? 'unknown ';
if (!Number.isFinite(seconds)) return 'NO DATA ';
const hours = Math.floor(sec s / 3600);
const hours = Math.floor(sec ond s / 3600);
const min s = Math.floor((secs % 3600) / 60);
const min ute s = Math.floor((second s % 3600) / 60);
return hours > 0 ? `${hours}h ${min s}m` : `${mins}m`;
return hours > 0 ? `${hours}h ${min ute s}m` : `${minute s}m`;
] ] ]
] ] ]
- type : custom:button-card
- type : custom:button-card
@ -512,95 +378,6 @@
icon : mdi:battery-alert-variant-outline
icon : mdi:battery-alert-variant-outline
state_display : >
state_display : >
[ [ [
[ [ [
const s = String(entity?.state || '').toUpperCase();
const status = String(entity?.state ?? '').toUpperCase();
return s.includes('OB') ? 'Yes' : 'No ';
return status ? (status.includes('OB') ? 'YES' : 'NO') : 'NO DATA ';
] ] ]
] ] ]
# -------------------------------------------------------------------
# Overviews (desktop: 2 columns, mobile: stack)
# -------------------------------------------------------------------
- type : grid
column_span : 4
columns : 1
square : false
cards:
- type : custom:layout-card
grid_options:
columns : full
layout_type : custom:grid-layout
layout:
grid-template-columns : repeat(2, minmax(0, 1fr))
grid-auto-flow : row
grid-auto-rows : min-content
grid-gap : 12px
margin : 0
mediaquery:
"(max-width: 900px)" :
grid-template-columns : repeat(1, minmax(0, 1fr))
cards:
- type : custom:vertical-stack-in-card
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- type : custom:button-card
template : bearstone_infra_panel_header
name : Wi-Fi Overview
- type : custom:mini-graph-card
name : Clients
icon : mdi:wifi
hours_to_show : 24
line_width : 2
points_per_hour : 1
smoothing : true
show:
graph : line
legend : false
labels : false
name : true
icon : true
state : true
entities:
- entity : sensor.total_wifi_clients
name : Total
show_state : true
show_graph : false
show_line : false
show_points : false
show_fill : false
show_legend : false
- entity : sensor.unifi_ap_office_clients
name : Office AP
show_state : true
- entity : sensor.unifi_ap_study_clients
name : Study AP
show_state : true
- entity : sensor.unifi_ap_garage_clients
name : Garage AP
show_state : true
- type : custom:vertical-stack-in-card
card_mod:
style : !include /config/dashboards/infrastructure/card_mod/infra_panel.yaml
cards:
- type : custom:button-card
template : bearstone_infra_panel_header
name : Internet Trend
- type : custom:mini-graph-card
name : Speedtest
icon : mdi:speedometer
hours_to_show : 24
points_per_hour : 1
line_width : 2
smoothing : true
show:
fill : false
legend : false
labels : false
name : true
icon : true
state : true
entities:
- entity : sensor.speedtest_download
name : Download
- entity : sensor.speedtest_upload
name : Upload