Update documentation and YAML configurations for infrastructure doc sync. Added `docs/agent_ops_baselines.md` to .gitignore, refined SKILL.md description for clarity, and improved YAML templates for Docker container management. Removed deprecated dashboard configurations and streamlined entity references for better maintainability.

pull/1590/head
Carlo Costanzo 1 month ago
parent b697ab1685
commit c90ccde86d

1
.gitignore vendored

@ -56,6 +56,7 @@ service_account.json
*.cookies *.cookies
AGENTS.md AGENTS.md
AGENTS.override.md AGENTS.override.md
docs/agent_ops_baselines.md
# Directories # Directories
llmvision llmvision

@ -1,11 +1,12 @@
--- ---
name: infrastructure-doc-sync name: infrastructure-doc-sync
description: "Use when infra or container placement changes were made in a session and documentation must be synchronized across AGENTS.md, README(s), and Infra Info snapshot (`overview.json`). Covers host maps, role notes, and safe high-level summary updates." description: "Use when infra/container placement changes require synchronized AGENTS, docs, and Infra Info updates while keeping AGENTS concise, scoped, and non-runbook."
--- ---
# Infrastructure Doc Sync # Infrastructure Doc Sync
Keep infrastructure documentation aligned after operational changes. Keep infrastructure documentation aligned after operational changes.
Keep `AGENTS.md` short and task-scoped; move long runbooks to dedicated docs.
## When to Use ## When to Use
@ -15,29 +16,46 @@ Keep infrastructure documentation aligned after operational changes.
- Any update to an `AGENTS.md` file that affects infra context. - Any update to an `AGENTS.md` file that affects infra context.
- Any user-facing shortcut URL changed (Dashy). - Any user-facing shortcut URL changed (Dashy).
## Required Update Targets ## Required Update Targets (As Applicable)
1. `../AGENTS.md` (workspace-level infra truth in `h:\hass\docker_files\AGENTS.md`) 1. Workspace infra truth:
2. Relevant repo README(s), usually: - `../AGENTS.md` (workspace-level host/topology source)
2. Repo-scoped `AGENTS.md` files touched by the change:
- Keep only hard constraints and applicability gates.
- Remove/move long runbooks into dedicated docs.
3. Relevant repo docs:
- `README.md` - `README.md`
- `codex_skills/README.md` (if adding/updating skills) - `codex_skills/README.md` (if adding/updating skills)
3. Dashy shortcuts (if any service URL/host changed): 4. Ops/runbook doc (if AGENTS runbook content is reduced):
- Example: `docs/agent_ops_baselines.md` (repo-local operational baseline)
5. Dashy shortcuts (if any service URL/host changed):
- `h:\hass\docker_files\dashy/conf.yml` - `h:\hass\docker_files\dashy/conf.yml`
- Reload Dashy on docker_17 after edits: `ssh hass@192.168.10.17 "cd ~/docker_files && docker compose up -d dashy"` - Reload Dashy on docker_17 after edits: `ssh hass@192.168.10.17 "cd ~/docker_files && docker compose up -d dashy"`
4. Infra Info snapshot JSON: 6. Infra Info snapshot JSON:
- `docker_69:/home/hass/docker_files/infra_info/data/overview.json` - `docker_69:/home/hass/docker_files/infra_info/data/overview.json`
## Workflow ## Workflow
1. Collect current runtime truth from hosts (containers, network mode, ports, and workload role). 1. Collect current runtime truth from hosts (containers, network mode, ports, and workload role).
2. Update AGENTS host maps and operational notes first. 2. Update workspace `AGENTS.md` first for host/topology truth.
3. If end-user entry points changed, update Dashy shortcuts (`dashy/conf.yml`) to match the new reality. 3. Update repo-level `AGENTS.md` with concise, scoped constraints only.
4. Update README sections impacted by the change (short, factual, no drift). 4. Move long operational/runbook details out of `AGENTS.md` into a dedicated doc when needed.
5. Update `overview.json` to mirror the same outcome at a high level. 5. If end-user entry points changed, update Dashy shortcuts (`dashy/conf.yml`) to match reality.
6. Validate: 6. Update README/skill docs impacted by the change (short, factual, no drift).
7. Update `overview.json` to mirror the same outcome at a high level.
8. Validate:
- JSON is valid (`python -m json.tool` equivalent). - JSON is valid (`python -m json.tool` equivalent).
- Dashy `conf.yml` references the intended hostname(s)/ports (no stale LAN IPs unless intentionally required). - Dashy `conf.yml` references the intended hostname(s)/ports (no stale LAN IPs unless intentionally required).
- AGENTS and README statements do not conflict with runtime. - AGENTS and README statements do not conflict with runtime.
- Repo-level AGENTS do not contain long runbooks duplicated from dedicated docs.
## AGENTS Quality Rules
- Prefer short checklists over narrative paragraphs.
- Keep only non-discoverable, high-impact constraints in AGENTS.
- Add explicit applicability gates where a file has mixed-scope guidance.
- Keep specialized/deeper-scoped AGENTS concise and task-specific.
- De-duplicate repeated policy lines across global/workspace/repo scopes.
## Infra Info Content Rules ## Infra Info Content Rules
@ -60,5 +78,6 @@ Always report:
- What changed (files + purpose). - What changed (files + purpose).
- Final intended topology/placement. - Final intended topology/placement.
- Any Dashy shortcuts touched (or explicitly state "no Dashy updates needed"). - Any Dashy shortcuts touched (or explicitly state "no Dashy updates needed").
- Whether runbook content was moved from AGENTS into a dedicated ops doc.
- Any unresolved follow-up items. - Any unresolved follow-up items.

@ -1,4 +1,4 @@
interface: interface:
display_name: "Infrastructure Doc Sync" display_name: "Infrastructure Doc Sync"
short_description: "Sync AGENTS/README/overview after infra changes" short_description: "Sync infra docs with concise AGENTS"
default_prompt: "Use $infrastructure-doc-sync to update AGENTS.md, Dashy shortcuts (if any URLs changed), README notes, and infra_info overview.json after Docker/host topology changes." default_prompt: "Use $infrastructure-doc-sync to keep AGENTS concise and scoped, move runbook content into dedicated docs when needed, and sync README/Dashy/infra_info overview.json after infra changes."

@ -1,441 +0,0 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Infrastructure Include - Docker container restart buttons
# Auto-entities include list for Portainer container restart buttons (button.*_restart_container).
# -------------------------------------------------------------------
# Notes: Generated from core.entity_registry (platform: portainer).
######################################################################
- entity_id: button.cloudflared_kch_restart_container
options:
type: tile
name: cloudflared_kch
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.cloudflared_kch_restart_container
- entity_id: button.cloudflared_wp_restart_container
options:
type: tile
name: cloudflared_wp
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.cloudflared_wp_restart_container
- entity_id: button.codex_appliance_restart_container
options:
type: tile
name: codex_appliance
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.codex_appliance_restart_container
- entity_id: button.college_budget_app_restart_container
options:
type: tile
name: college_budget_app
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.college_budget_app_restart_container
- entity_id: button.cruise_tracker_restart_container
options:
type: tile
name: cruise_tracker
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.cruise_tracker_restart_container
- entity_id: button.dashy_restart_container
options:
type: tile
name: dashy
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.dashy_restart_container
- entity_id: button.dozzle_agent_10_restart_container
options:
type: tile
name: dozzle_agent_10
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.dozzle_agent_10_restart_container
- entity_id: button.dozzle_agent_14_restart_container
options:
type: tile
name: dozzle_agent_14
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.dozzle_agent_14_restart_container
- entity_id: button.dozzle_restart_container
options:
type: tile
name: dozzle
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.dozzle_restart_container
- entity_id: button.duplicati_restart_container
options:
type: tile
name: duplicati
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.duplicati_restart_container
- entity_id: button.esphome_restart_container
options:
type: tile
name: esphome
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.esphome_restart_container
- entity_id: button.foodie_tracker_restart_container
options:
type: tile
name: foodie_tracker
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.foodie_tracker_restart_container
- entity_id: button.frigate_restart_container
options:
type: tile
name: frigate
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.frigate_restart_container
- entity_id: button.games_hub_restart_container
options:
type: tile
name: games_hub
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.games_hub_restart_container
- entity_id: button.home_assistant_restart_container
options:
type: tile
name: home-assistant
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.home_assistant_restart_container
- entity_id: button.imposter_restart_container
options:
type: tile
name: imposter
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.imposter_restart_container
- entity_id: button.infra_info_restart_container
options:
type: tile
name: infra_info
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.infra_info_restart_container
- entity_id: button.kingcrafthomes_restart_container
options:
type: tile
name: kingcrafthomes
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.kingcrafthomes_restart_container
- entity_id: button.mariadb_backup_restart_container
options:
type: tile
name: mariadb-backup
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.mariadb_backup_restart_container
- entity_id: button.mariadb_restart_container
options:
type: tile
name: mariadb
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.mariadb_restart_container
- entity_id: button.matter_server_restart_container
options:
type: tile
name: matter-server
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.matter_server_restart_container
- entity_id: button.mqtt_restart_container
options:
type: tile
name: mqtt
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.mqtt_restart_container
- entity_id: button.nebula_sync_restart_container
options:
type: tile
name: nebula_sync
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.nebula_sync_restart_container
- entity_id: button.panel_notes_restart_container
options:
type: tile
name: panel_notes
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.panel_notes_restart_container
- entity_id: button.pihole_restart_container
options:
type: tile
name: pihole
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.pihole_restart_container
- entity_id: button.pihole_secondary_restart_container
options:
type: tile
name: pihole_secondary
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.pihole_secondary_restart_container
- entity_id: button.poker_tracker_restart_container
options:
type: tile
name: poker_tracker
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.poker_tracker_restart_container
- entity_id: button.portainer_agent_restart_container
options:
type: tile
name: portainer_agent
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.portainer_agent_restart_container
- entity_id: button.portainer_restart_container
options:
type: tile
name: portainer
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.portainer_restart_container
- entity_id: button.postgres_webhooks_engine_restart_container
options:
type: tile
name: postgres_webhooks_engine
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.postgres_webhooks_engine_restart_container
- entity_id: button.rc_price_checker_restart_container
options:
type: tile
name: rc_price_checker
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.rc_price_checker_restart_container
- entity_id: button.redis_webhooks_engine_restart_container
options:
type: tile
name: redis_webhooks_engine
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.redis_webhooks_engine_restart_container
- entity_id: button.rvtools_ppt_web_restart_container
options:
type: tile
name: rvtools_ppt_web
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.rvtools_ppt_web_restart_container
- entity_id: button.steelesharing_home_restart_container
options:
type: tile
name: steelesharing_home
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.steelesharing_home_restart_container
- entity_id: button.tapple_restart_container
options:
type: tile
name: tapple
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.tapple_restart_container
- entity_id: button.tugtainer_agent_restart_container
options:
type: tile
name: tugtainer-agent
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.tugtainer_agent_restart_container
- entity_id: button.tugtainer_restart_container
options:
type: tile
name: tugtainer
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.tugtainer_restart_container
- entity_id: button.tugtainer_socket_proxy_restart_container
options:
type: tile
name: tugtainer_socket_proxy
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.tugtainer_socket_proxy_restart_container
- entity_id: button.unifi_restart_container
options:
type: tile
name: unifi
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.unifi_restart_container
- entity_id: button.webhooks_engine_restart_container
options:
type: tile
name: webhooks_engine
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.webhooks_engine_restart_container
- entity_id: button.wordpress_db_restart_container
options:
type: tile
name: wordpress_db
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.wordpress_db_restart_container
- entity_id: button.wordpress_wp_restart_container
options:
type: tile
name: wordpress_wp
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.wordpress_wp_restart_container
- entity_id: button.wyze_bridge_restart_container
options:
type: tile
name: wyze-bridge
hide_state: true
tap_action:
action: call-service
service: button.press
service_data:
entity_id: button.wyze_bridge_restart_container

@ -1,416 +0,0 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Infrastructure Include - Docker container rows
# Auto-entities include list mapping Portainer status -> restart button.
# -------------------------------------------------------------------
# Notes: Generated from core.entity_registry + button restart entities.
######################################################################
- entity_id: binary_sensor.cloudflared_kch_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: cloudflared_kch
icon: mdi:docker
variables:
restart_button: button.cloudflared_kch_restart_container
name: cloudflared_kch
- entity_id: binary_sensor.cloudflared_wp_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: cloudflared_wp
icon: mdi:docker
variables:
restart_button: button.cloudflared_wp_restart_container
name: cloudflared_wp
- entity_id: binary_sensor.codex_appliance_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: codex_appliance
icon: mdi:docker
variables:
restart_button: button.codex_appliance_restart_container
name: codex_appliance
- entity_id: binary_sensor.college_budget_app_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: college_budget_app
icon: mdi:docker
variables:
restart_button: button.college_budget_app_restart_container
name: college_budget_app
- entity_id: binary_sensor.cruise_tracker_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: cruise_tracker
icon: mdi:docker
variables:
restart_button: button.cruise_tracker_restart_container
name: cruise_tracker
- entity_id: binary_sensor.dashy_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: dashy
icon: mdi:docker
variables:
restart_button: button.dashy_restart_container
name: dashy
- entity_id: binary_sensor.dozzle_agent_10_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: dozzle_agent_10
icon: mdi:docker
variables:
restart_button: button.dozzle_agent_10_restart_container
name: dozzle_agent_10
- entity_id: binary_sensor.dozzle_agent_14_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: dozzle_agent_14
icon: mdi:docker
variables:
restart_button: button.dozzle_agent_14_restart_container
name: dozzle_agent_14
- entity_id: binary_sensor.dozzle_agent_17_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: dozzle_agent_17
icon: mdi:docker
variables:
restart_button: button.dozzle_agent_17_restart_container
name: dozzle_agent_17
- entity_id: binary_sensor.dozzle_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: dozzle
icon: mdi:docker
variables:
restart_button: button.dozzle_restart_container
name: dozzle
- entity_id: binary_sensor.duplicati_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: duplicati
icon: mdi:docker
variables:
restart_button: button.duplicati_restart_container
name: duplicati
- entity_id: binary_sensor.esphome_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: esphome
icon: mdi:docker
variables:
restart_button: button.esphome_restart_container
name: esphome
- entity_id: binary_sensor.fed437a0f191_tugtainer_socket_proxy_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: fed437a0f191_tugtainer_socket_proxy
icon: mdi:docker
variables:
restart_button: button.fed437a0f191_tugtainer_socket_proxy_restart_container
name: fed437a0f191_tugtainer_socket_proxy
- entity_id: binary_sensor.foodie_tracker_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: foodie_tracker
icon: mdi:docker
variables:
restart_button: button.foodie_tracker_restart_container
name: foodie_tracker
- entity_id: binary_sensor.frigate_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: frigate
icon: mdi:docker
variables:
restart_button: button.frigate_restart_container
name: frigate
- entity_id: binary_sensor.games_hub_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: games_hub
icon: mdi:docker
variables:
restart_button: button.games_hub_restart_container
name: games_hub
- entity_id: binary_sensor.home_assistant_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: home-assistant
icon: mdi:docker
variables:
restart_button: button.home_assistant_restart_container
name: home-assistant
- entity_id: binary_sensor.imposter_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: imposter
icon: mdi:docker
variables:
restart_button: button.imposter_restart_container
name: imposter
- entity_id: binary_sensor.infra_info_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: infra_info
icon: mdi:docker
variables:
restart_button: button.infra_info_restart_container
name: infra_info
- entity_id: binary_sensor.kingcrafthomes_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: kingcrafthomes
icon: mdi:docker
variables:
restart_button: button.kingcrafthomes_restart_container
name: kingcrafthomes
- entity_id: binary_sensor.mariadb_backup_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: mariadb-backup
icon: mdi:docker
variables:
restart_button: button.mariadb_backup_restart_container
name: mariadb-backup
- entity_id: binary_sensor.mariadb_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: mariadb
icon: mdi:docker
variables:
restart_button: button.mariadb_restart_container
name: mariadb
- entity_id: binary_sensor.matter_server_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: matter-server
icon: mdi:docker
variables:
restart_button: button.matter_server_restart_container
name: matter-server
- entity_id: binary_sensor.mqtt_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: mqtt
icon: mdi:docker
variables:
restart_button: button.mqtt_restart_container
name: mqtt
- entity_id: binary_sensor.nebula_sync_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: nebula_sync
icon: mdi:docker
variables:
restart_button: button.nebula_sync_restart_container
name: nebula_sync
- entity_id: binary_sensor.panel_notes_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: panel_notes
icon: mdi:docker
variables:
restart_button: button.panel_notes_restart_container
name: panel_notes
- entity_id: binary_sensor.pihole_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: pihole
icon: mdi:docker
variables:
restart_button: button.pihole_restart_container
name: pihole
- entity_id: binary_sensor.pihole_secondary_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: pihole_secondary
icon: mdi:docker
variables:
restart_button: button.pihole_secondary_restart_container
name: pihole_secondary
- entity_id: binary_sensor.poker_tracker_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: poker_tracker
icon: mdi:docker
variables:
restart_button: button.poker_tracker_restart_container
name: poker_tracker
- entity_id: binary_sensor.portainer_agent_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: portainer_agent
icon: mdi:docker
variables:
restart_button: button.portainer_agent_restart_container
name: portainer_agent
- entity_id: binary_sensor.portainer_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: portainer
icon: mdi:docker
variables:
restart_button: button.portainer_restart_container
name: portainer
- entity_id: binary_sensor.postgres_webhooks_engine_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: postgres_webhooks_engine
icon: mdi:docker
variables:
restart_button: button.postgres_webhooks_engine_restart_container
name: postgres_webhooks_engine
- entity_id: binary_sensor.rc_price_checker_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: rc_price_checker
icon: mdi:docker
variables:
restart_button: button.rc_price_checker_restart_container
name: rc_price_checker
- entity_id: binary_sensor.redis_webhooks_engine_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: redis_webhooks_engine
icon: mdi:docker
variables:
restart_button: button.redis_webhooks_engine_restart_container
name: redis_webhooks_engine
- entity_id: binary_sensor.rvtools_ppt_web_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: rvtools_ppt_web
icon: mdi:docker
variables:
restart_button: button.rvtools_ppt_web_restart_container
name: rvtools_ppt_web
- entity_id: binary_sensor.steelesharing_home_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: steelesharing_home
icon: mdi:docker
variables:
restart_button: button.steelesharing_home_restart_container
name: steelesharing_home
- entity_id: binary_sensor.tapple_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: tapple
icon: mdi:docker
variables:
restart_button: button.tapple_restart_container
name: tapple
- entity_id: binary_sensor.tugtainer_agent_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: tugtainer-agent
icon: mdi:docker
variables:
restart_button: button.tugtainer_agent_restart_container
name: tugtainer-agent
- entity_id: binary_sensor.tugtainer_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: tugtainer
icon: mdi:docker
variables:
restart_button: button.tugtainer_restart_container
name: tugtainer
- entity_id: binary_sensor.tugtainer_socket_proxy_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: tugtainer_socket_proxy
icon: mdi:docker
variables:
restart_button: button.tugtainer_socket_proxy_restart_container
name: tugtainer_socket_proxy
- entity_id: binary_sensor.unifi_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: unifi
icon: mdi:docker
variables:
restart_button: button.unifi_restart_container
name: unifi
- entity_id: binary_sensor.webhooks_engine_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: webhooks_engine
icon: mdi:docker
variables:
restart_button: button.webhooks_engine_restart_container
name: webhooks_engine
- entity_id: binary_sensor.wordpress_db_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: wordpress_db
icon: mdi:docker
variables:
restart_button: button.wordpress_db_restart_container
name: wordpress_db
- entity_id: binary_sensor.wordpress_wp_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: wordpress_wp
icon: mdi:docker
variables:
restart_button: button.wordpress_wp_restart_container
name: wordpress_wp
- entity_id: binary_sensor.wyze_bridge_status
options:
type: custom:button-card
template: bearstone_infra_container_row
name: wyze-bridge
icon: mdi:docker
variables:
restart_button: button.wyze_bridge_restart_container
name: wyze-bridge

@ -7,7 +7,7 @@
# Related Issue: 1560 # Related Issue: 1560
# Sections layout for the Docker containers view. # Sections layout for the Docker containers view.
# ------------------------------------------------------------------- # -------------------------------------------------------------------
# Notes: Uses Portainer entities (`binary_sensor.*_status`, `button.*_restart_container`). # Notes: Auto-discovers Portainer container entities from `switch.*_container`.
###################################################################### ######################################################################
- type: grid - type: grid
@ -98,7 +98,12 @@
grid-template-columns: repeat(2, minmax(0, 1fr)) grid-template-columns: repeat(2, minmax(0, 1fr))
card_param: cards card_param: cards
filter: filter:
include: !include /config/dashboards/infrastructure/partials/docker_container_rows_include.yaml include:
- group: group.docker_monitored_containers
options:
type: custom:button-card
template: bearstone_infra_container_row
icon: mdi:docker
exclude: exclude:
- state: unavailable - state: unavailable
sort: sort:

@ -416,7 +416,12 @@
grid-template-columns: repeat(1, minmax(0, 1fr)) grid-template-columns: repeat(1, minmax(0, 1fr))
card_param: cards card_param: cards
filter: filter:
include: !include /config/dashboards/infrastructure/partials/docker_container_rows_include.yaml include:
- group: group.docker_monitored_containers
options:
type: custom:button-card
template: bearstone_infra_container_row
icon: mdi:docker
exclude: exclude:
- state: 'on' - state: 'on'

@ -179,16 +179,52 @@ bearstone_infra_container_row:
action: call-service action: call-service
service: button.press service: button.press
service_data: service_data:
entity_id: '[[[ return variables.restart_button ]]]' entity_id: >
[[[
if (variables && variables.restart_button) return variables.restart_button;
const ent = (entity && entity.entity_id) ? String(entity.entity_id) : '';
let key = '';
if (ent.startsWith('binary_sensor.') && ent.endsWith('_status')) {
key = ent.replace('binary_sensor.', '').replace(/_status$/, '');
} else if (ent.startsWith('switch.') && ent.endsWith('_container')) {
key = ent.replace('switch.', '').replace(/_container$/, '');
}
return key ? `button.${key}_restart_container` : '';
]]]
confirmation: confirmation:
text: '[[[ return "Restart container " + entity.attributes.friendly_name + "?" ]]]' text: '[[[ return "Restart container " + entity.attributes.friendly_name + "?" ]]]'
icon: mdi:docker icon: mdi:docker
name: >
[[[
if (variables && variables.name) return variables.name;
const ent = (entity && entity.entity_id) ? String(entity.entity_id) : '';
const friendly = (entity && entity.attributes && entity.attributes.friendly_name)
? String(entity.attributes.friendly_name)
: '';
let key = '';
if (ent.startsWith('binary_sensor.') && ent.endsWith('_status')) {
key = ent.replace('binary_sensor.', '').replace(/_status$/, '');
} else if (ent.startsWith('switch.') && ent.endsWith('_container')) {
key = ent.replace('switch.', '').replace(/_container$/, '');
}
if (friendly && friendly !== 'Container') {
return friendly.replace(/\s+Container$/, '');
}
return key || friendly || ent;
]]]
custom_fields: custom_fields:
image: > image: >
[[[ [[[
const ent = (entity && entity.entity_id) ? String(entity.entity_id) : '';
let key = '';
if (ent.startsWith('binary_sensor.') && ent.endsWith('_status')) {
key = ent.replace('binary_sensor.', '').replace(/_status$/, '');
} else if (ent.startsWith('switch.') && ent.endsWith('_container')) {
key = ent.replace('switch.', '').replace(/_container$/, '');
}
const imageEntity = variables.image_sensor const imageEntity = variables.image_sensor
? variables.image_sensor ? variables.image_sensor
: entity.entity_id.replace('binary_sensor.', 'sensor.').replace(/_status$/, '_image'); : (key ? `sensor.${key}_image` : '');
const imageValue = states[imageEntity]?.state; const imageValue = states[imageEntity]?.state;
if (!imageValue || ['unknown', 'unavailable', 'none', ''].includes(String(imageValue).toLowerCase())) { if (!imageValue || ['unknown', 'unavailable', 'none', ''].includes(String(imageValue).toLowerCase())) {
return 'image: n/a'; return 'image: n/a';
@ -238,7 +274,21 @@ bearstone_infra_container_row:
- border-radius: 999px - border-radius: 999px
- background: rgba(0,0,0,0.06) - background: rgba(0,0,0,0.06)
- color: var(--secondary-text-color) - color: var(--secondary-text-color)
- line-height: 1.1 card:
- display: >
[[[
const ent = (entity && entity.entity_id) ? String(entity.entity_id) : '';
let key = '';
if (ent.startsWith('binary_sensor.') && ent.endsWith('_status')) {
key = ent.replace('binary_sensor.', '').replace(/_status$/, '');
} else if (ent.startsWith('switch.') && ent.endsWith('_container')) {
key = ent.replace('switch.', '').replace(/_container$/, '');
}
const switchEntity = key ? `switch.${key}_container` : '';
const monitored = states['group.docker_monitored_containers']?.attributes?.entity_id || [];
const restart = key ? `button.${key}_restart_container` : '';
return (restart && states[restart] && monitored.includes(switchEntity)) ? 'block' : 'none';
]]]
state: state:
- value: 'on' - value: 'on'
styles: styles:

@ -1,7 +1,18 @@
######################################################################
# @CCOSTAN - Follow Me on X
# For more info visit https://www.vcloudinfo.com/click-here
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
# -------------------------------------------------------------------
# Media Players Group - Multi-room media control
# Keep entries aligned with active media_player IDs.
# -------------------------------------------------------------------
# Related Issue: n/a
# Notes: Removed stale media_player.* refs that triggered Spook warnings.
######################################################################
media_players: media_players:
entities: entities:
- media_player.livingroomcc - media_player.livingroomcc
- media_player.living_room_tv
- media_player.living_room_ultra - media_player.living_room_ultra
- media_player.bedroom_tablet - media_player.bedroom_tablet
- media_player.living_room - media_player.living_room
@ -9,7 +20,6 @@ media_players:
- media_player.garage - media_player.garage
- media_player.office - media_player.office
- media_player.kitchen - media_player.kitchen
- media_player.justin_room
- media_player.upstairs - media_player.upstairs
- media_player.stacey_bedroom - media_player.stacey_bedroom
- media_player.carlo_bedroom - media_player.carlo_bedroom
@ -24,4 +34,3 @@ tvs:
- media_player.roku_living_room - media_player.roku_living_room
- media_player.tv_samsung_q70_series_65 - media_player.tv_samsung_q70_series_65

@ -9,7 +9,7 @@
# Notes: Hosts run weekly Wed 12:00 APT job and POST JSON to webhooks. # Notes: Hosts run weekly Wed 12:00 APT job and POST JSON to webhooks.
# Notes: Reboots are handled directly on each host by apt_weekly.sh. # Notes: Reboots are handled directly on each host by apt_weekly.sh.
# Notes: Reboot staggering: docker_14 first, docker_69 second, docker_10 third. # Notes: Reboot staggering: docker_14 first, docker_69 second, docker_10 third.
# Notes: Container watchlist is explicit; extend entity list as needed. # Notes: Container monitoring is dynamic with binary_sensor status preferred over switch state.
###################################################################### ######################################################################
input_datetime: input_datetime:
@ -45,6 +45,10 @@ input_datetime:
name: "docker_69 APT last update" name: "docker_69 APT last update"
has_date: true has_date: true
has_time: true has_time: true
docker_container_alerts_snooze_until:
name: "Docker container alerts snooze until"
has_date: true
has_time: true
input_text: input_text:
apt_docker_10_last_result: apt_docker_10_last_result:
@ -60,6 +64,58 @@ input_text:
name: "docker_69 APT last result" name: "docker_69 APT last result"
max: 255 max: 255
group:
docker_monitored_containers:
name: Docker Monitored Containers
entities:
- switch.cloudflared_kch_container
- switch.cloudflared_wp_container
- switch.codex_appliance_container
- switch.college_budget_app_container
- switch.cruise_tracker_container
- switch.dashy_container
- switch.docker_socket_proxy_container
- switch.dozzle_container
- switch.dozzle_agent_10_container
- switch.dozzle_agent_14_container
- switch.dozzle_agent_17_container
- switch.dozzle_agent_69_container
- switch.duplicati_container
- switch.esphome_container
- switch.fed437a0f191_tugtainer_socket_proxy_container
- switch.foodie_tracker_container
- switch.frigate_container
- switch.games_hub_container
- switch.home_assistant_container
- switch.imposter_container
- switch.infra_info_container
- switch.kingcrafthomes_container
- switch.lmediaservices_container
- switch.mariadb_container
- switch.mariadb_backup_container
- switch.matter_server_container
- switch.mqtt_container
- switch.nebula_sync_container
- switch.panel_notes_container
- switch.pihole_container
- switch.pihole_secondary_container
- switch.poker_tracker_container
- switch.portainer_container
- switch.portainer_agent_container
- switch.postgres_webhooks_engine_container
- switch.rc_price_checker_container
- switch.redis_webhooks_engine_container
- switch.rvtools_ppt_web_container
- switch.tapple_container
- switch.tugtainer_container
- switch.tugtainer_agent_container
- switch.tugtainer_socket_proxy_container
- switch.unifi_container
- switch.webhooks_engine_container
- switch.wordpress_db_container
- switch.wordpress_wp_container
- switch.wyze_bridge_container
template: template:
- sensor: - sensor:
- name: "docker_10 APT status" - name: "docker_10 APT status"
@ -143,6 +199,146 @@ template:
{{ as_local(as_datetime(stamp)) }} {{ as_local(as_datetime(stamp)) }}
{% endif %} {% endif %}
- sensor:
- name: "Docker Containers Down List"
unique_id: docker_containers_down_list
icon: mdi:docker
state: >-
{% set ns = namespace(keys=[], down=[]) %}
{% set monitored = state_attr('group.docker_monitored_containers', 'entity_id') | default([], true) %}
{% for switch_entity in monitored %}
{% set key = switch_entity | replace('switch.', '') | regex_replace('_container$', '') %}
{% if key not in ns.keys %}
{% set ns.keys = ns.keys + [key] %}
{% endif %}
{% endfor %}
{% for key in ns.keys | sort %}
{% set status_entity = 'binary_sensor.' ~ key ~ '_status' %}
{% set switch_entity = 'switch.' ~ key ~ '_container' %}
{% if expand(status_entity) | count > 0 %}
{% set effective_state = states(status_entity) | lower %}
{% elif expand(switch_entity) | count > 0 %}
{% set effective_state = states(switch_entity) | lower %}
{% else %}
{% set effective_state = 'unknown' %}
{% endif %}
{% if effective_state in ['off', 'unknown', 'unavailable'] %}
{% set ns.down = ns.down + [key] %}
{% endif %}
{% endfor %}
{{ ns.down | sort | join(', ') if (ns.down | count > 0) else 'none' }}
- name: "Docker Containers Down Count"
unique_id: docker_containers_down_count
icon: mdi:counter
state: >-
{% set down_list = states('sensor.docker_containers_down_list') %}
{% set normalized = down_list | lower %}
{% if normalized in ['unknown', 'unavailable', 'none', ''] %}
0
{% else %}
{{ down_list.split(',') | map('trim') | reject('equalto', '') | list | count }}
{% endif %}
- binary_sensor:
- name: "Docker Container Alerts Snoozed"
unique_id: docker_container_alerts_snoozed
device_class: problem
icon: mdi:bell-sleep
state: >-
{% set stamp = states('input_datetime.docker_container_alerts_snooze_until') %}
{% set until_ts = as_datetime(stamp) %}
{{ until_ts is not none and now() < until_ts }}
script:
docker_container_repairs_sync:
alias: Docker Container Repairs Sync
mode: parallel
fields:
entity_id:
description: Changed Portainer entity (`switch.*_container` or `binary_sensor.*_status`)
example: "switch.rc_price_checker_container"
operation:
description: "Sync operation: create or clear"
example: "create"
delay_minutes:
description: "Optional delay before evaluation (used for create path)"
example: 5
sequence:
- variables:
down_states: ['off', 'unknown', 'unavailable']
src_entity: "{{ entity_id | default('', true) }}"
op: "{{ operation | default('create', true) | lower }}"
wait_minutes: "{{ delay_minutes | default(0) | int(0) }}"
container_key: >-
{% if src_entity.startswith('binary_sensor.') %}
{{ src_entity | replace('binary_sensor.', '') | regex_replace('_status$', '') }}
{% elif src_entity.startswith('switch.') %}
{{ src_entity | replace('switch.', '') | regex_replace('_container$', '') }}
{% else %}
{{ src_entity }}
{% endif %}
switch_entity: "switch.{{ container_key }}_container"
restart_entity: "button.{{ container_key }}_restart_container"
status_entity: "binary_sensor.{{ container_key }}_status"
monitored_switches: "{{ state_attr('group.docker_monitored_containers', 'entity_id') | default([], true) }}"
tracked_container: "{{ switch_entity in monitored_switches }}"
effective_entity: >-
{% if expand(status_entity) | count > 0 %}
{{ status_entity }}
{% elif expand(switch_entity) | count > 0 %}
{{ switch_entity }}
{% else %}
{{ src_entity }}
{% endif %}
issue_id: "docker_container_{{ container_key }}_offline"
- condition: template
value_template: "{{ tracked_container and op in ['create', 'clear'] }}"
- choose:
- conditions: "{{ op == 'create' }}"
sequence:
- choose:
- conditions: "{{ wait_minutes > 0 }}"
sequence:
- delay:
minutes: "{{ wait_minutes }}"
- variables:
effective_state: "{{ states(effective_entity) | lower }}"
container_name: "{{ state_attr(effective_entity, 'friendly_name') | default(container_key, true) }}"
- condition: template
value_template: "{{ effective_state in down_states }}"
- condition: state
entity_id: binary_sensor.docker_container_alerts_snoozed
state: "off"
- service: repairs.create
data:
issue_id: "{{ issue_id }}"
title: "Container offline: {{ container_name }}"
description: >-
{{ container_name }} has been {{ effective_state }} for over 5 minutes.
Effective entity: {{ effective_entity }}.
severity: warning
persistent: true
- service: script.send_to_logbook
data:
topic: "DOCKER"
message: "{{ container_name }} is {{ effective_state }} for over 5 minutes."
- conditions: "{{ op == 'clear' }}"
sequence:
- variables:
effective_state: "{{ states(effective_entity) | lower }}"
container_name: "{{ state_attr(effective_entity, 'friendly_name') | default(container_key, true) }}"
- condition: template
value_template: "{{ effective_state not in down_states }}"
- service: repairs.remove
continue_on_error: true
data:
issue_id: "{{ issue_id }}"
- service: script.send_to_logbook
data:
topic: "DOCKER"
message: "{{ container_name }} recovered ({{ effective_state }})."
automation: automation:
- alias: "APT Update Report - Docker Hosts" - alias: "APT Update Report - Docker Hosts"
id: apt_update_report_docker_hosts id: apt_update_report_docker_hosts
@ -238,65 +434,112 @@ automation:
topic: "APT" topic: "APT"
message: "{{ log_message }}" message: "{{ log_message }}"
- alias: "Docker Container Offline - Create Repairs" - alias: "Docker Container State Sync - Repairs (Dynamic)"
id: docker_container_offline_repairs_create id: docker_container_state_sync_repairs_dynamic
description: "Create a Repairs issue when a watched container is down for 5+ minutes." description: "Detect dynamic container state transitions and delegate Repairs sync to script helper."
mode: parallel mode: parallel
trigger: trigger:
- platform: state - platform: event
entity_id: event_type: state_changed
- sensor.rc_price_checker_state condition:
- switch.rc_price_checker_container - condition: template
to: "unavailable" value_template: >-
for: "00:05:00" {% set ent = trigger.event.data.entity_id | default('') %}
- platform: state {{ ent.startswith('switch.') and ent.endswith('_container') or
entity_id: ent.startswith('binary_sensor.') and ent.endswith('_status') }}
- sensor.rc_price_checker_state - condition: template
to: "unknown" value_template: "{{ trigger.event.data.old_state is not none and trigger.event.data.new_state is not none }}"
for: "00:05:00" - condition: template
- platform: state value_template: "{{ trigger.event.data.old_state.state != trigger.event.data.new_state.state }}"
entity_id:
- sensor.rc_price_checker_state
to: "restarting"
for: "00:05:00"
- platform: state
entity_id:
- switch.rc_price_checker_container
to: "off"
for: "00:05:00"
variables:
issue_id: "docker_container_{{ trigger.entity_id | replace('.', '_') }}"
container_name: >-
{{ state_attr(trigger.entity_id, 'friendly_name') | default(trigger.entity_id) }}
current_state: "{{ states(trigger.entity_id) }}"
action: action:
- service: repairs.create - variables:
down_states: ['off', 'unknown', 'unavailable']
entity_id: "{{ trigger.event.data.entity_id }}"
old_state: "{{ trigger.event.data.old_state.state | lower }}"
new_state: "{{ trigger.event.data.new_state.state | lower }}"
- choose:
- conditions: "{{ new_state in down_states and old_state not in down_states }}"
sequence:
- service: script.docker_container_repairs_sync
data: data:
issue_id: "{{ issue_id }}" entity_id: "{{ entity_id }}"
title: "Container offline: {{ container_name }}" operation: "create"
description: >- delay_minutes: 5
{{ container_name }} has been {{ current_state }} for over 5 minutes. - conditions: "{{ old_state in down_states and new_state not in down_states }}"
Entity: {{ trigger.entity_id }}. sequence:
severity: warning - service: script.docker_container_repairs_sync
persistent: true data:
entity_id: "{{ entity_id }}"
operation: "clear"
- alias: "Docker Container Offline - Clear Repairs" - alias: "Docker Containers Maintenance Prompt"
id: docker_container_offline_repairs_clear id: docker_containers_maintenance_prompt
description: "Clear Repairs issue once the watched container is back online." description: "Prompt Carlo to snooze container alerts for maintenance when more than 3 containers are down."
mode: parallel mode: single
trigger: trigger:
- platform: state - platform: numeric_state
entity_id: entity_id: sensor.docker_containers_down_count
- sensor.rc_price_checker_state above: 3
- switch.rc_price_checker_container
variables:
issue_id: "docker_container_{{ trigger.entity_id | replace('.', '_') }}"
condition: condition:
- condition: template - condition: state
value_template: >- entity_id: binary_sensor.docker_container_alerts_snoozed
{{ states(trigger.entity_id) not in ['unavailable', 'unknown', 'restarting', 'off'] }} state: "off"
action: action:
- service: repairs.remove - service: script.notify_engine_two_button
continue_on_error: true
data: data:
issue_id: "{{ issue_id }}" title: "Docker Maintenance Check"
value1: "{{ states('sensor.docker_containers_down_count') }} containers are currently down."
value2: "Down: {{ states('sensor.docker_containers_down_list') }}"
who: "carlo"
group: "maintenance"
title1: "Yes, snooze 1h"
action1: "DOCKER_MAINTENANCE_SNOOZE_1H"
icon1: "sfsymbols:clock"
title2: "No, investigate"
action2: "DOCKER_MAINTENANCE_NOT_MAINTENANCE"
icon2: "sfsymbols:wrench.and.screwdriver"
- service: script.send_to_logbook
data:
topic: "DOCKER"
message: >-
Maintenance prompt sent to Carlo ({{ states('sensor.docker_containers_down_count') }} down:
{{ states('sensor.docker_containers_down_list') }}).
- alias: "Docker Maintenance Snooze 1H"
id: docker_maintenance_snooze_1h
description: "Snooze dynamic container alerts for one hour from a notification action."
mode: single
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: DOCKER_MAINTENANCE_SNOOZE_1H
variables:
snooze_until: "{{ (now() + timedelta(hours=1)).strftime('%Y-%m-%d %H:%M:%S') }}"
action:
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.docker_container_alerts_snooze_until
data:
datetime: "{{ snooze_until }}"
- service: script.send_to_logbook
data:
topic: "DOCKER"
message: "Container alerts snoozed for 1 hour (until {{ snooze_until }})."
- alias: "Docker Maintenance Declined"
id: docker_maintenance_declined
description: "Log when maintenance snooze is declined from the dynamic container prompt."
mode: single
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: DOCKER_MAINTENANCE_NOT_MAINTENANCE
action:
- service: script.send_to_logbook
data:
topic: "DOCKER"
message: >-
Maintenance snooze declined with {{ states('sensor.docker_containers_down_count') }}
containers down ({{ states('sensor.docker_containers_down_list') }}).

Loading…
Cancel
Save

Powered by TurnKey Linux.