Enhance dashboard configurations by updating card styles to use `var(--divider-color)` for borders, improving consistency across various YAML files. Remove deprecated Pi-hole card section and streamline infrastructure views by including top chip sections for better organization. Update README to clarify Lovelace resource loading and migration notes.
parent
ebe7c6f091
commit
a9f1314026
@ -0,0 +1,58 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Motion-activated Light
|
||||||
|
description: Turn on a light when motion is detected.
|
||||||
|
domain: automation
|
||||||
|
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/motion_light.yaml
|
||||||
|
author: Home Assistant
|
||||||
|
input:
|
||||||
|
motion_entity:
|
||||||
|
name: Motion Sensor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
filter:
|
||||||
|
- device_class: occupancy
|
||||||
|
domain: binary_sensor
|
||||||
|
- device_class: motion
|
||||||
|
domain: binary_sensor
|
||||||
|
light_target:
|
||||||
|
name: Light
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain: light
|
||||||
|
no_motion_wait:
|
||||||
|
name: Wait time
|
||||||
|
description: Time to leave the light on after last motion is detected.
|
||||||
|
default: 120
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 0
|
||||||
|
max: 3600
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
|
||||||
|
# If motion is detected within the delay,
|
||||||
|
# we restart the script.
|
||||||
|
mode: restart
|
||||||
|
max_exceeded: silent
|
||||||
|
|
||||||
|
triggers:
|
||||||
|
trigger: state
|
||||||
|
entity_id: !input motion_entity
|
||||||
|
from: "off"
|
||||||
|
to: "on"
|
||||||
|
|
||||||
|
actions:
|
||||||
|
- alias: "Turn on the light"
|
||||||
|
action: light.turn_on
|
||||||
|
target: !input light_target
|
||||||
|
- alias: "Wait until there is no motion from device"
|
||||||
|
wait_for_trigger:
|
||||||
|
trigger: state
|
||||||
|
entity_id: !input motion_entity
|
||||||
|
from: "on"
|
||||||
|
to: "off"
|
||||||
|
- alias: "Wait the number of seconds that has been set"
|
||||||
|
delay: !input no_motion_wait
|
||||||
|
- alias: "Turn off the light"
|
||||||
|
action: light.turn_off
|
||||||
|
target: !input light_target
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Zone Notification
|
||||||
|
description: Send a notification to a device when a person leaves a specific zone.
|
||||||
|
domain: automation
|
||||||
|
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/notify_leaving_zone.yaml
|
||||||
|
author: Home Assistant
|
||||||
|
input:
|
||||||
|
person_entity:
|
||||||
|
name: Person
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
filter:
|
||||||
|
domain: person
|
||||||
|
zone_entity:
|
||||||
|
name: Zone
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
filter:
|
||||||
|
domain: zone
|
||||||
|
notify_device:
|
||||||
|
name: Device to notify
|
||||||
|
description: Device needs to run the official Home Assistant app to receive notifications.
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
filter:
|
||||||
|
integration: mobile_app
|
||||||
|
|
||||||
|
triggers:
|
||||||
|
trigger: state
|
||||||
|
entity_id: !input person_entity
|
||||||
|
|
||||||
|
variables:
|
||||||
|
zone_entity: !input zone_entity
|
||||||
|
# This is the state of the person when it's in this zone.
|
||||||
|
zone_state: "{{ states[zone_entity].name }}"
|
||||||
|
person_entity: !input person_entity
|
||||||
|
person_name: "{{ states[person_entity].name }}"
|
||||||
|
|
||||||
|
conditions:
|
||||||
|
condition: template
|
||||||
|
# The first case handles leaving the Home zone which has a special state when zoning called 'home'.
|
||||||
|
# The second case handles leaving all other zones.
|
||||||
|
value_template: "{{ zone_entity == 'zone.home' and trigger.from_state.state == 'home' and trigger.to_state.state != 'home' or trigger.from_state.state == zone_state and trigger.to_state.state != zone_state }}"
|
||||||
|
|
||||||
|
actions:
|
||||||
|
- alias: "Notify that a person has left the zone"
|
||||||
|
domain: mobile_app
|
||||||
|
type: notify
|
||||||
|
device_id: !input notify_device
|
||||||
|
message: "{{ person_name }} has left {{ zone_state }}"
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
blueprint:
|
||||||
|
name: Confirmable Notification
|
||||||
|
description: >-
|
||||||
|
A script that sends an actionable notification with a confirmation before
|
||||||
|
running the specified action.
|
||||||
|
domain: script
|
||||||
|
source_url: https://github.com/home-assistant/core/blob/master/homeassistant/components/script/blueprints/confirmable_notification.yaml
|
||||||
|
author: Home Assistant
|
||||||
|
input:
|
||||||
|
notify_device:
|
||||||
|
name: Device to notify
|
||||||
|
description: Device needs to run the official Home Assistant app to receive notifications.
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
filter:
|
||||||
|
integration: mobile_app
|
||||||
|
title:
|
||||||
|
name: "Title"
|
||||||
|
description: "The title of the button shown in the notification."
|
||||||
|
default: ""
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
message:
|
||||||
|
name: "Message"
|
||||||
|
description: "The message body"
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
confirm_text:
|
||||||
|
name: "Confirmation Text"
|
||||||
|
description: "Text to show on the confirmation button"
|
||||||
|
default: "Confirm"
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
confirm_action:
|
||||||
|
name: "Confirmation Action"
|
||||||
|
description: "Action to run when notification is confirmed"
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
action:
|
||||||
|
dismiss_text:
|
||||||
|
name: "Dismiss Text"
|
||||||
|
description: "Text to show on the dismiss button"
|
||||||
|
default: "Dismiss"
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
dismiss_action:
|
||||||
|
name: "Dismiss Action"
|
||||||
|
description: "Action to run when notification is dismissed"
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
action:
|
||||||
|
|
||||||
|
mode: restart
|
||||||
|
|
||||||
|
sequence:
|
||||||
|
- alias: "Set up variables"
|
||||||
|
variables:
|
||||||
|
action_confirm: "{{ 'CONFIRM_' ~ context.id }}"
|
||||||
|
action_dismiss: "{{ 'DISMISS_' ~ context.id }}"
|
||||||
|
- alias: "Send notification"
|
||||||
|
domain: mobile_app
|
||||||
|
type: notify
|
||||||
|
device_id: !input notify_device
|
||||||
|
title: !input title
|
||||||
|
message: !input message
|
||||||
|
data:
|
||||||
|
actions:
|
||||||
|
- action: "{{ action_confirm }}"
|
||||||
|
title: !input confirm_text
|
||||||
|
- action: "{{ action_dismiss }}"
|
||||||
|
title: !input dismiss_text
|
||||||
|
- alias: "Awaiting response"
|
||||||
|
wait_for_trigger:
|
||||||
|
- trigger: event
|
||||||
|
event_type: mobile_app_notification_action
|
||||||
|
event_data:
|
||||||
|
action: "{{ action_confirm }}"
|
||||||
|
- trigger: event
|
||||||
|
event_type: mobile_app_notification_action
|
||||||
|
event_data:
|
||||||
|
action: "{{ action_dismiss }}"
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ wait.trigger.event.data.action == action_confirm }}"
|
||||||
|
sequence: !input confirm_action
|
||||||
|
- conditions: "{{ wait.trigger.event.data.action == action_dismiss }}"
|
||||||
|
sequence: !input dismiss_action
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
######################################################################
|
||||||
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Infrastructure Partial - Activity sections
|
||||||
|
# Activity feed wrapped in the standard Infrastructure layout.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Notes: Uses Logbook card targeted at `sensor.activity_feed`.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
- !include /config/dashboards/infrastructure/partials/infra_top_chips_section.yaml
|
||||||
|
|
||||||
|
- type: grid
|
||||||
|
column_span: 4
|
||||||
|
columns: 1
|
||||||
|
square: false
|
||||||
|
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: Activity Feed
|
||||||
|
- type: logbook
|
||||||
|
target:
|
||||||
|
entity_id:
|
||||||
|
- sensor.activity_feed
|
||||||
|
grid_options:
|
||||||
|
columns: full
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
######################################################################
|
||||||
|
# @CCOSTAN - Follow Me on X
|
||||||
|
# For more info visit https://www.vcloudinfo.com/click-here
|
||||||
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Infrastructure Partial - Top status chips (shared)
|
||||||
|
# Common "chips row" used across Infrastructure views.
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# Notes: Keep this lightweight; it should render fast on every view.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
type: grid
|
||||||
|
column_span: 4
|
||||||
|
columns: 4
|
||||||
|
square: false
|
||||||
|
cards:
|
||||||
|
- type: custom:button-card
|
||||||
|
template: bearstone_infra_chip
|
||||||
|
entity: binary_sensor.node_proxmox1_updates_packages
|
||||||
|
name: Proxmox01
|
||||||
|
icon: mdi:server
|
||||||
|
state_display: >
|
||||||
|
[[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
|
||||||
|
- type: custom:button-card
|
||||||
|
template: bearstone_infra_chip
|
||||||
|
entity: binary_sensor.node_proxmox02_updates_packages
|
||||||
|
name: Proxmox02
|
||||||
|
icon: mdi:server
|
||||||
|
state_display: >
|
||||||
|
[[[ return entity.state === 'on' ? 'Updates pending' : 'Up to date'; ]]]
|
||||||
|
- type: custom:button-card
|
||||||
|
template: bearstone_infra_chip
|
||||||
|
entity: sensor.garage_ups_status
|
||||||
|
name: Garage UPS
|
||||||
|
icon: mdi:transmission-tower
|
||||||
|
- type: custom:button-card
|
||||||
|
template: bearstone_infra_chip
|
||||||
|
entity: sensor.vcloudinfo_com
|
||||||
|
name: vCloudinfo
|
||||||
|
icon: mdi:microsoft-internet-explorer
|
||||||
|
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
param(
|
||||||
|
[string]$BaseUrl = $env:HASS_PLAYWRIGHT_BASE_URL
|
||||||
|
)
|
||||||
|
|
||||||
|
Set-StrictMode -Version Latest
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
if ([string]::IsNullOrWhiteSpace($BaseUrl)) {
|
||||||
|
# Canonical LAN URL for agent automation (trusted_networks bypass).
|
||||||
|
$BaseUrl = 'http://192.168.10.10:8123'
|
||||||
|
}
|
||||||
|
|
||||||
|
$BaseUrl = $BaseUrl.TrimEnd('/')
|
||||||
|
|
||||||
|
function Get-EffectiveUrlAndStatus {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$Url
|
||||||
|
)
|
||||||
|
|
||||||
|
# Use curl.exe (not Invoke-WebRequest alias) so we can reliably see redirects.
|
||||||
|
$curl = (Get-Command curl.exe -ErrorAction Stop).Source
|
||||||
|
|
||||||
|
# Follow redirects; return final URL + status code.
|
||||||
|
$out = & $curl -sS -L -o NUL -w "%{url_effective} %{http_code}" $Url 2>$null
|
||||||
|
if (-not $out) { throw "curl produced no output for $Url" }
|
||||||
|
$parts = $out -split ' '
|
||||||
|
if ($parts.Count -lt 2) { throw "Unexpected curl output: $out" }
|
||||||
|
|
||||||
|
[pscustomobject]@{
|
||||||
|
EffectiveUrl = $parts[0]
|
||||||
|
StatusCode = [int]$parts[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$targets = @(
|
||||||
|
'/',
|
||||||
|
'/profile',
|
||||||
|
'/dashboard-infrastructure',
|
||||||
|
'/dashboard-infrastructure/docker',
|
||||||
|
'/dashboard-infrastructure/mariadb',
|
||||||
|
'/dashboard-kiosk'
|
||||||
|
)
|
||||||
|
|
||||||
|
$failed = $false
|
||||||
|
foreach ($path in $targets) {
|
||||||
|
$url = "$BaseUrl$path"
|
||||||
|
$r = Get-EffectiveUrlAndStatus -Url $url
|
||||||
|
|
||||||
|
$isLogin = $r.EffectiveUrl -match '/(login|auth/authorize)\b'
|
||||||
|
$statusOk = $r.StatusCode -ge 200 -and $r.StatusCode -lt 400
|
||||||
|
|
||||||
|
if ($isLogin -or -not $statusOk) {
|
||||||
|
$failed = $true
|
||||||
|
Write-Host ("FAIL {0} -> {1} ({2})" -f $url, $r.EffectiveUrl, $r.StatusCode)
|
||||||
|
} else {
|
||||||
|
Write-Host ("OK {0} -> {1} ({2})" -f $url, $r.EffectiveUrl, $r.StatusCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($failed) {
|
||||||
|
Write-Host ''
|
||||||
|
Write-Host 'Likely causes:'
|
||||||
|
Write-Host '- Base URL is external (Cloudflared/Nabu Casa) instead of LAN.'
|
||||||
|
Write-Host '- Home Assistant does not see the request IP as trusted; check `homeassistant.auth_providers.trusted_networks`.'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0
|
||||||
Loading…
Reference in new issue