You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
543 lines
29 KiB
543 lines
29 KiB
######################################################################
|
|
# @CCOSTAN - Follow Me on X
|
|
# For more info visit https://www.vcloudinfo.com/click-here
|
|
# Original Repo : https://github.com/CCOSTAN/Home-AssistantConfig
|
|
# -------------------------------------------------------------------
|
|
# Synology DSM Monitoring - NAS health normalization + Joanna dispatch
|
|
# Reviews Synology DSM integration health and escalates sustained NAS problems.
|
|
# -------------------------------------------------------------------
|
|
# Notes: Uses native `synology_dsm` entities for Carlo-NAS01 and Carlo-NVR.
|
|
# Notes: Joanna dispatches are reserved for integration/security/storage problems, not routine reboot/shutdown controls.
|
|
# Notes: DSM update availability stays diagnostic context only; it does not trigger remediation by itself.
|
|
# Notes: Recent Powerwall outages route lone volume warnings to Joanna first; Repairs open after the recovery grace window if still active.
|
|
######################################################################
|
|
|
|
template:
|
|
- binary_sensor:
|
|
- name: "Carlo-NAS01 Synology Integration Problem"
|
|
unique_id: carlo_nas01_synology_integration_problem
|
|
device_class: problem
|
|
state: >-
|
|
{% set ids = [
|
|
'binary_sensor.carlo_nas01_security_status',
|
|
'sensor.carlo_nas01_volume_1_status',
|
|
'sensor.carlo_nas01_volume_1_volume_used',
|
|
'sensor.carlo_nas01_drive_1_status',
|
|
'sensor.carlo_nas01_drive_2_status',
|
|
'sensor.carlo_nas01_drive_3_status',
|
|
'binary_sensor.carlo_nas01_drive_1_below_min_remaining_life',
|
|
'binary_sensor.carlo_nas01_drive_2_below_min_remaining_life',
|
|
'binary_sensor.carlo_nas01_drive_3_below_min_remaining_life',
|
|
'binary_sensor.carlo_nas01_drive_1_exceeded_max_bad_sectors',
|
|
'binary_sensor.carlo_nas01_drive_2_exceeded_max_bad_sectors',
|
|
'binary_sensor.carlo_nas01_drive_3_exceeded_max_bad_sectors'
|
|
] %}
|
|
{% set ns = namespace(problem=false) %}
|
|
{% for id in ids %}
|
|
{% if states(id) in ['unknown', 'unavailable'] %}
|
|
{% set ns.problem = true %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{{ ns.problem }}
|
|
|
|
- name: "Carlo-NAS01 Synology Security Problem"
|
|
unique_id: carlo_nas01_synology_security_problem
|
|
device_class: problem
|
|
state: >-
|
|
{{ is_state('binary_sensor.carlo_nas01_security_status', 'on') }}
|
|
|
|
- name: "Carlo-NAS01 Synology Storage Problem"
|
|
unique_id: carlo_nas01_synology_storage_problem
|
|
device_class: problem
|
|
state: >-
|
|
{% set volume_status = states('sensor.carlo_nas01_volume_1_status') | lower %}
|
|
{% set volume_used_raw = states('sensor.carlo_nas01_volume_1_volume_used') %}
|
|
{% set volume_used = volume_used_raw | float(0) if volume_used_raw not in ['unknown', 'unavailable', 'none', ''] else 0 %}
|
|
{{ volume_status not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
volume_used >= 85 or
|
|
states('sensor.carlo_nas01_drive_1_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nas01_drive_2_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nas01_drive_3_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
is_state('binary_sensor.carlo_nas01_drive_1_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_2_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_3_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_1_exceeded_max_bad_sectors', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_2_exceeded_max_bad_sectors', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_3_exceeded_max_bad_sectors', 'on') }}
|
|
|
|
- name: "Carlo-NAS01 Synology Problem"
|
|
unique_id: carlo_nas01_synology_problem
|
|
device_class: problem
|
|
state: >-
|
|
{{ is_state('binary_sensor.carlo_nas01_synology_integration_problem', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_synology_security_problem', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_synology_storage_problem', 'on') }}
|
|
|
|
- name: "Carlo-NVR Synology Integration Problem"
|
|
unique_id: carlo_nvr_synology_integration_problem
|
|
device_class: problem
|
|
state: >-
|
|
{% set ids = [
|
|
'binary_sensor.carlo_nvr_security_status',
|
|
'sensor.carlo_nvr_volume_1_status',
|
|
'sensor.carlo_nvr_volume_1_volume_used',
|
|
'sensor.carlo_nvr_drive_1_status',
|
|
'sensor.carlo_nvr_drive_2_status',
|
|
'binary_sensor.carlo_nvr_drive_1_below_min_remaining_life',
|
|
'binary_sensor.carlo_nvr_drive_2_below_min_remaining_life',
|
|
'binary_sensor.carlo_nvr_drive_1_exceeded_max_bad_sectors',
|
|
'binary_sensor.carlo_nvr_drive_2_exceeded_max_bad_sectors'
|
|
] %}
|
|
{% set ns = namespace(problem=false) %}
|
|
{% for id in ids %}
|
|
{% if states(id) in ['unknown', 'unavailable'] %}
|
|
{% set ns.problem = true %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{{ ns.problem }}
|
|
|
|
- name: "Carlo-NVR Synology Security Problem"
|
|
unique_id: carlo_nvr_synology_security_problem
|
|
device_class: problem
|
|
state: >-
|
|
{{ is_state('binary_sensor.carlo_nvr_security_status', 'on') }}
|
|
|
|
- name: "Carlo-NVR Synology Storage Problem"
|
|
unique_id: carlo_nvr_synology_storage_problem
|
|
device_class: problem
|
|
state: >-
|
|
{% set volume_status = states('sensor.carlo_nvr_volume_1_status') | lower %}
|
|
{% set volume_used_raw = states('sensor.carlo_nvr_volume_1_volume_used') %}
|
|
{% set volume_used = volume_used_raw | float(0) if volume_used_raw not in ['unknown', 'unavailable', 'none', ''] else 0 %}
|
|
{{ volume_status not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
volume_used >= 85 or
|
|
states('sensor.carlo_nvr_drive_1_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nvr_drive_2_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
is_state('binary_sensor.carlo_nvr_drive_1_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_drive_2_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_drive_1_exceeded_max_bad_sectors', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_drive_2_exceeded_max_bad_sectors', 'on') }}
|
|
|
|
- name: "Carlo-NVR Synology Problem"
|
|
unique_id: carlo_nvr_synology_problem
|
|
device_class: problem
|
|
state: >-
|
|
{{ is_state('binary_sensor.carlo_nvr_synology_integration_problem', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_synology_security_problem', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_synology_storage_problem', 'on') }}
|
|
|
|
- sensor:
|
|
- name: "Carlo-NAS01 Synology Problem Severity"
|
|
unique_id: carlo_nas01_synology_problem_severity
|
|
state: >-
|
|
{% set volume_status = states('sensor.carlo_nas01_volume_1_status') | lower %}
|
|
{% set volume_used_raw = states('sensor.carlo_nas01_volume_1_volume_used') %}
|
|
{% set volume_used = volume_used_raw | float(0) if volume_used_raw not in ['unknown', 'unavailable', 'none', ''] else 0 %}
|
|
{% set hard_storage = volume_status not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nas01_drive_1_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nas01_drive_2_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nas01_drive_3_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
is_state('binary_sensor.carlo_nas01_drive_1_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_2_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_3_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_1_exceeded_max_bad_sectors', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_2_exceeded_max_bad_sectors', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_drive_3_exceeded_max_bad_sectors', 'on') or
|
|
volume_used >= 92 %}
|
|
{% if is_state('binary_sensor.carlo_nas01_synology_integration_problem', 'on') or
|
|
is_state('binary_sensor.carlo_nas01_synology_security_problem', 'on') or
|
|
hard_storage %}
|
|
error
|
|
{% elif is_state('binary_sensor.carlo_nas01_synology_storage_problem', 'on') %}
|
|
warning
|
|
{% else %}
|
|
none
|
|
{% endif %}
|
|
|
|
- name: "Carlo-NAS01 Synology Problem Summary"
|
|
unique_id: carlo_nas01_synology_problem_summary
|
|
state: >-
|
|
{% set ns = namespace(items=[]) %}
|
|
{% if states('binary_sensor.carlo_nas01_security_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['security sensor unavailable'] %}
|
|
{% elif is_state('binary_sensor.carlo_nas01_security_status', 'on') %}
|
|
{% set ns.items = ns.items + ['security advisor reported an unsafe state'] %}
|
|
{% endif %}
|
|
{% set volume_status = states('sensor.carlo_nas01_volume_1_status') | lower %}
|
|
{% if volume_status in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['volume status unavailable'] %}
|
|
{% elif volume_status not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['volume status=' ~ volume_status] %}
|
|
{% endif %}
|
|
{% set volume_used = states('sensor.carlo_nas01_volume_1_volume_used') %}
|
|
{% if volume_used in ['unknown', 'unavailable', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['volume used unavailable'] %}
|
|
{% elif volume_used | float(0) >= 85 %}
|
|
{% set ns.items = ns.items + ['volume used=' ~ (volume_used | float(0) | round(1)) ~ '%'] %}
|
|
{% endif %}
|
|
{% if states('sensor.carlo_nas01_drive_1_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['drive 1 status unavailable'] %}
|
|
{% elif states('sensor.carlo_nas01_drive_1_status') | lower not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['drive 1 status=' ~ (states('sensor.carlo_nas01_drive_1_status') | lower)] %}
|
|
{% endif %}
|
|
{% if states('sensor.carlo_nas01_drive_2_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['drive 2 status unavailable'] %}
|
|
{% elif states('sensor.carlo_nas01_drive_2_status') | lower not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['drive 2 status=' ~ (states('sensor.carlo_nas01_drive_2_status') | lower)] %}
|
|
{% endif %}
|
|
{% if states('sensor.carlo_nas01_drive_3_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['drive 3 status unavailable'] %}
|
|
{% elif states('sensor.carlo_nas01_drive_3_status') | lower not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['drive 3 status=' ~ (states('sensor.carlo_nas01_drive_3_status') | lower)] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nas01_drive_1_below_min_remaining_life', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 1 below remaining life threshold'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nas01_drive_2_below_min_remaining_life', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 2 below remaining life threshold'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nas01_drive_3_below_min_remaining_life', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 3 below remaining life threshold'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nas01_drive_1_exceeded_max_bad_sectors', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 1 exceeded max bad sectors'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nas01_drive_2_exceeded_max_bad_sectors', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 2 exceeded max bad sectors'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nas01_drive_3_exceeded_max_bad_sectors', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 3 exceeded max bad sectors'] %}
|
|
{% endif %}
|
|
{{ ns.items | join('; ') if ns.items else 'ok' }}
|
|
|
|
- name: "Carlo-NVR Synology Problem Severity"
|
|
unique_id: carlo_nvr_synology_problem_severity
|
|
state: >-
|
|
{% set volume_status = states('sensor.carlo_nvr_volume_1_status') | lower %}
|
|
{% set volume_used_raw = states('sensor.carlo_nvr_volume_1_volume_used') %}
|
|
{% set volume_used = volume_used_raw | float(0) if volume_used_raw not in ['unknown', 'unavailable', 'none', ''] else 0 %}
|
|
{% set hard_storage = volume_status not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nvr_drive_1_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
states('sensor.carlo_nvr_drive_2_status') | lower not in ['normal', 'unknown', 'unavailable', 'none', ''] or
|
|
is_state('binary_sensor.carlo_nvr_drive_1_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_drive_2_below_min_remaining_life', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_drive_1_exceeded_max_bad_sectors', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_drive_2_exceeded_max_bad_sectors', 'on') or
|
|
volume_used >= 92 %}
|
|
{% if is_state('binary_sensor.carlo_nvr_synology_integration_problem', 'on') or
|
|
is_state('binary_sensor.carlo_nvr_synology_security_problem', 'on') or
|
|
hard_storage %}
|
|
error
|
|
{% elif is_state('binary_sensor.carlo_nvr_synology_storage_problem', 'on') %}
|
|
warning
|
|
{% else %}
|
|
none
|
|
{% endif %}
|
|
|
|
- name: "Carlo-NVR Synology Problem Summary"
|
|
unique_id: carlo_nvr_synology_problem_summary
|
|
state: >-
|
|
{% set ns = namespace(items=[]) %}
|
|
{% if states('binary_sensor.carlo_nvr_security_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['security sensor unavailable'] %}
|
|
{% elif is_state('binary_sensor.carlo_nvr_security_status', 'on') %}
|
|
{% set ns.items = ns.items + ['security advisor reported an unsafe state'] %}
|
|
{% endif %}
|
|
{% set volume_status = states('sensor.carlo_nvr_volume_1_status') | lower %}
|
|
{% if volume_status in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['volume status unavailable'] %}
|
|
{% elif volume_status not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['volume status=' ~ volume_status] %}
|
|
{% endif %}
|
|
{% set volume_used = states('sensor.carlo_nvr_volume_1_volume_used') %}
|
|
{% if volume_used in ['unknown', 'unavailable', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['volume used unavailable'] %}
|
|
{% elif volume_used | float(0) >= 85 %}
|
|
{% set ns.items = ns.items + ['volume used=' ~ (volume_used | float(0) | round(1)) ~ '%'] %}
|
|
{% endif %}
|
|
{% if states('sensor.carlo_nvr_drive_1_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['drive 1 status unavailable'] %}
|
|
{% elif states('sensor.carlo_nvr_drive_1_status') | lower not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['drive 1 status=' ~ (states('sensor.carlo_nvr_drive_1_status') | lower)] %}
|
|
{% endif %}
|
|
{% if states('sensor.carlo_nvr_drive_2_status') in ['unknown', 'unavailable'] %}
|
|
{% set ns.items = ns.items + ['drive 2 status unavailable'] %}
|
|
{% elif states('sensor.carlo_nvr_drive_2_status') | lower not in ['normal', 'none', ''] %}
|
|
{% set ns.items = ns.items + ['drive 2 status=' ~ (states('sensor.carlo_nvr_drive_2_status') | lower)] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nvr_drive_1_below_min_remaining_life', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 1 below remaining life threshold'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nvr_drive_2_below_min_remaining_life', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 2 below remaining life threshold'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nvr_drive_1_exceeded_max_bad_sectors', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 1 exceeded max bad sectors'] %}
|
|
{% endif %}
|
|
{% if is_state('binary_sensor.carlo_nvr_drive_2_exceeded_max_bad_sectors', 'on') %}
|
|
{% set ns.items = ns.items + ['drive 2 exceeded max bad sectors'] %}
|
|
{% endif %}
|
|
{{ ns.items | join('; ') if ns.items else 'ok' }}
|
|
|
|
automation:
|
|
- id: synology_dsm_open_repair_and_dispatch
|
|
alias: "Synology DSM - Open Repair And Dispatch"
|
|
description: "Dispatch Joanna when a Synology problem stays active, and open Repairs after outage-aware grace checks."
|
|
mode: queued
|
|
trigger:
|
|
- id: initial_dispatch
|
|
platform: state
|
|
entity_id:
|
|
- binary_sensor.carlo_nas01_synology_problem
|
|
- binary_sensor.carlo_nvr_synology_problem
|
|
to: "on"
|
|
for: "00:10:00"
|
|
- id: repair_escalation
|
|
platform: state
|
|
entity_id:
|
|
- binary_sensor.carlo_nas01_synology_problem
|
|
- binary_sensor.carlo_nvr_synology_problem
|
|
to: "on"
|
|
for: "01:00:00"
|
|
variables:
|
|
outage_grace_minutes: 60
|
|
trigger_phase: "{{ trigger.id | default('initial_dispatch', true) }}"
|
|
is_repair_escalation: "{{ trigger_phase == 'repair_escalation' }}"
|
|
grid_state: "{{ states('binary_sensor.powerwall_grid_status') }}"
|
|
grid_changed_minutes: >-
|
|
{% if states.binary_sensor.powerwall_grid_status is defined %}
|
|
{{ ((as_timestamp(now(), 0) - as_timestamp(states.binary_sensor.powerwall_grid_status.last_changed, 0)) / 60) | round(1) }}
|
|
{% else %}
|
|
9999
|
|
{% endif %}
|
|
outage_grace_active: >-
|
|
{{ grid_state == 'off' or
|
|
(grid_state == 'on' and (grid_changed_minutes | float(9999)) <= outage_grace_minutes) }}
|
|
outage_context: >-
|
|
{% if states.binary_sensor.powerwall_grid_status is not defined %}
|
|
Powerwall grid status entity is unavailable to this automation.
|
|
{% elif grid_state == 'off' %}
|
|
Powerwall grid is currently down; outage began {{ states.binary_sensor.powerwall_grid_status.last_changed }}.
|
|
{% elif (grid_changed_minutes | float(9999)) <= outage_grace_minutes %}
|
|
Powerwall grid recovered {{ grid_changed_minutes }} minutes ago.
|
|
{% else %}
|
|
No recent Powerwall outage recovery within {{ outage_grace_minutes }} minutes.
|
|
{% endif %}
|
|
host_name: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
Carlo-NAS01
|
|
{% else %}
|
|
Carlo-NVR
|
|
{% endif %}
|
|
issue_id: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
synology_carlo_nas01_problem
|
|
{% else %}
|
|
synology_carlo_nvr_problem
|
|
{% endif %}
|
|
source: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
home_assistant_automation.synology_dsm_open_repair_and_dispatch.carlo_nas01
|
|
{% else %}
|
|
home_assistant_automation.synology_dsm_open_repair_and_dispatch.carlo_nvr
|
|
{% endif %}
|
|
ssh_alias: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
nas11
|
|
{% else %}
|
|
nas12
|
|
{% endif %}
|
|
dsm_url: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
http://192.168.10.11:5000
|
|
{% else %}
|
|
https://192.168.10.12:5001
|
|
{% endif %}
|
|
severity_sensor: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
sensor.carlo_nas01_synology_problem_severity
|
|
{% else %}
|
|
sensor.carlo_nvr_synology_problem_severity
|
|
{% endif %}
|
|
summary_sensor: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
sensor.carlo_nas01_synology_problem_summary
|
|
{% else %}
|
|
sensor.carlo_nvr_synology_problem_summary
|
|
{% endif %}
|
|
security_entity: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
binary_sensor.carlo_nas01_security_status
|
|
{% else %}
|
|
binary_sensor.carlo_nvr_security_status
|
|
{% endif %}
|
|
volume_status_entity: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
sensor.carlo_nas01_volume_1_status
|
|
{% else %}
|
|
sensor.carlo_nvr_volume_1_status
|
|
{% endif %}
|
|
volume_used_entity: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
sensor.carlo_nas01_volume_1_volume_used
|
|
{% else %}
|
|
sensor.carlo_nvr_volume_1_volume_used
|
|
{% endif %}
|
|
update_entity: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
update.carlo_nas01_dsm_update
|
|
{% else %}
|
|
update.carlo_nvr_dsm_update
|
|
{% endif %}
|
|
entity_ids: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
binary_sensor.carlo_nas01_synology_problem,
|
|
binary_sensor.carlo_nas01_synology_integration_problem,
|
|
binary_sensor.carlo_nas01_synology_security_problem,
|
|
binary_sensor.carlo_nas01_synology_storage_problem,
|
|
sensor.carlo_nas01_synology_problem_severity,
|
|
sensor.carlo_nas01_synology_problem_summary,
|
|
binary_sensor.carlo_nas01_security_status,
|
|
sensor.carlo_nas01_volume_1_status,
|
|
sensor.carlo_nas01_volume_1_volume_used,
|
|
sensor.carlo_nas01_drive_1_status,
|
|
sensor.carlo_nas01_drive_2_status,
|
|
sensor.carlo_nas01_drive_3_status,
|
|
binary_sensor.carlo_nas01_drive_1_below_min_remaining_life,
|
|
binary_sensor.carlo_nas01_drive_2_below_min_remaining_life,
|
|
binary_sensor.carlo_nas01_drive_3_below_min_remaining_life,
|
|
binary_sensor.carlo_nas01_drive_1_exceeded_max_bad_sectors,
|
|
binary_sensor.carlo_nas01_drive_2_exceeded_max_bad_sectors,
|
|
binary_sensor.carlo_nas01_drive_3_exceeded_max_bad_sectors,
|
|
update.carlo_nas01_dsm_update
|
|
{% else %}
|
|
binary_sensor.carlo_nvr_synology_problem,
|
|
binary_sensor.carlo_nvr_synology_integration_problem,
|
|
binary_sensor.carlo_nvr_synology_security_problem,
|
|
binary_sensor.carlo_nvr_synology_storage_problem,
|
|
sensor.carlo_nvr_synology_problem_severity,
|
|
sensor.carlo_nvr_synology_problem_summary,
|
|
binary_sensor.carlo_nvr_security_status,
|
|
sensor.carlo_nvr_volume_1_status,
|
|
sensor.carlo_nvr_volume_1_volume_used,
|
|
sensor.carlo_nvr_drive_1_status,
|
|
sensor.carlo_nvr_drive_2_status,
|
|
binary_sensor.carlo_nvr_drive_1_below_min_remaining_life,
|
|
binary_sensor.carlo_nvr_drive_2_below_min_remaining_life,
|
|
binary_sensor.carlo_nvr_drive_1_exceeded_max_bad_sectors,
|
|
binary_sensor.carlo_nvr_drive_2_exceeded_max_bad_sectors,
|
|
update.carlo_nvr_dsm_update
|
|
{% endif %}
|
|
problem_severity: "{{ states(severity_sensor) }}"
|
|
problem_summary: "{{ states(summary_sensor) }}"
|
|
security_state: "{{ states(security_entity) }}"
|
|
volume_status: "{{ states(volume_status_entity) }}"
|
|
volume_used: "{{ states(volume_used_entity) }}"
|
|
dsm_update_state: "{{ states(update_entity) }}"
|
|
lone_volume_warning: >-
|
|
{{ problem_summary | lower | trim == 'volume status=warning' and
|
|
volume_status | lower | trim == 'warning' and
|
|
security_state == 'off' }}
|
|
joanna_only_outage_grace: >-
|
|
{{ not (is_repair_escalation | bool(false)) and
|
|
(outage_grace_active | bool(false)) and
|
|
(lone_volume_warning | bool(false)) }}
|
|
should_create_repair: "{{ not (joanna_only_outage_grace | bool(false)) }}"
|
|
trigger_context: "HA automation synology_dsm_open_repair_and_dispatch (Synology DSM - Open Repair And Dispatch)"
|
|
action:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ should_create_repair | bool(false) }}"
|
|
sequence:
|
|
- service: repairs.create
|
|
data:
|
|
issue_id: "{{ issue_id }}"
|
|
title: "{{ host_name }} Synology health issue"
|
|
severity: "{{ 'error' if problem_severity == 'error' else 'warning' }}"
|
|
persistent: true
|
|
description: >-
|
|
Home Assistant detected a sustained Synology DSM issue for {{ host_name }}.
|
|
|
|
summary: {{ problem_summary }}
|
|
security_state: {{ security_state }}
|
|
volume_status: {{ volume_status }}
|
|
volume_used: {{ volume_used }}
|
|
dsm_update: {{ dsm_update_state }}
|
|
outage_context: {{ outage_context }}
|
|
ssh_alias: {{ ssh_alias }}
|
|
dsm_url: {{ dsm_url }}
|
|
- service: script.joanna_dispatch
|
|
data:
|
|
trigger_context: "{{ trigger_context }}"
|
|
source: "{{ source }}"
|
|
summary: >-
|
|
{{ host_name }} Synology DSM problem detected{{ ' after recent Powerwall outage' if joanna_only_outage_grace | bool(false) else '' }}
|
|
entity_ids: "{{ entity_ids }}"
|
|
diagnostics: >-
|
|
issue_id={{ issue_id }},
|
|
trigger_phase={{ trigger_phase }},
|
|
severity={{ problem_severity }},
|
|
problem_sensor={{ trigger.entity_id }},
|
|
problem_summary={{ problem_summary }},
|
|
security_state={{ security_state }},
|
|
volume_status={{ volume_status }},
|
|
volume_used={{ volume_used }},
|
|
dsm_update={{ dsm_update_state }},
|
|
outage_grace_active={{ outage_grace_active }},
|
|
outage_context={{ outage_context }},
|
|
joanna_only_outage_grace={{ joanna_only_outage_grace }},
|
|
repair_created={{ should_create_repair }},
|
|
ssh_alias={{ ssh_alias }},
|
|
dsm_url={{ dsm_url }}
|
|
request: >-
|
|
Investigate {{ host_name }} using the Home Assistant Synology DSM entities first, then DSM or SSH if needed.
|
|
Review security state, drive condition, volume condition, and integration availability.
|
|
If this is a recent Powerwall outage and the only symptom is a volume warning, treat it as post-outage recovery first and monitor before escalating.
|
|
Do not reboot or shut down the NAS unless explicitly requested.
|
|
- service: script.send_to_logbook
|
|
data:
|
|
topic: "SYNOLOGY"
|
|
message: >-
|
|
{{ host_name }} reported a Synology DSM problem for 10 minutes.
|
|
{% if should_create_repair | bool(false) %}
|
|
Repair {{ issue_id }} opened and Joanna investigation requested.
|
|
{% else %}
|
|
Joanna investigation requested without opening a Repair during the post-outage recovery grace window.
|
|
{% endif %}
|
|
Summary: {{ problem_summary }}.
|
|
|
|
- id: synology_dsm_clear_repair_on_recovery
|
|
alias: "Synology DSM - Clear Repair On Recovery"
|
|
description: "Clear the Synology Repairs issue once the monitored problem has recovered."
|
|
mode: queued
|
|
trigger:
|
|
- platform: state
|
|
entity_id:
|
|
- binary_sensor.carlo_nas01_synology_problem
|
|
- binary_sensor.carlo_nvr_synology_problem
|
|
to: "off"
|
|
for: "00:05:00"
|
|
variables:
|
|
host_name: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
Carlo-NAS01
|
|
{% else %}
|
|
Carlo-NVR
|
|
{% endif %}
|
|
issue_id: >-
|
|
{% if trigger.entity_id == 'binary_sensor.carlo_nas01_synology_problem' %}
|
|
synology_carlo_nas01_problem
|
|
{% else %}
|
|
synology_carlo_nvr_problem
|
|
{% endif %}
|
|
action:
|
|
- service: repairs.remove
|
|
continue_on_error: true
|
|
data:
|
|
issue_id: "{{ issue_id }}"
|
|
- service: script.send_to_logbook
|
|
data:
|
|
topic: "SYNOLOGY"
|
|
message: "{{ host_name }} Synology DSM health recovered. Repair {{ issue_id }} cleared."
|