###################################################################### # @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."