Files
N22/include/automations/opvaskemaskine.yaml
T

178 lines
7.2 KiB
YAML

- id: dishwasher_plan_cheapest_night_run
alias: Opvaskemaskine - plan billigste natkørsel
mode: single
trigger:
- platform: state
entity_id: sensor.energi_data_service
- platform: time
at: "13:10:00"
variables:
best_start_ts: >
{% set raw = (state_attr('sensor.energi_data_service', 'raw_today') or []) + (state_attr('sensor.energi_data_service', 'raw_tomorrow') or []) %}
{% set ns = namespace(prices=[], candidates=[]) %}
{% set fallback_ts = as_timestamp(today_at('23:50')) | int %}
{% for item in raw %}
{% set dt_source = item.start if item.start is defined else item.hour if item.hour is defined else item.time if item.time is defined else none %}
{% if dt_source %}
{% if item.price is defined %}
{% set price = item.price | float(999) %}
{% elif item.value is defined %}
{% set price = item.value | float(999) %}
{% else %}
{% set price = 999 %}
{% endif %}
{% set ns.prices = ns.prices + [{'ts': as_timestamp(as_datetime(dt_source)) | int, 'price': price}] %}
{% endif %}
{% endfor %}
{% set tomorrow_midnight = (as_timestamp(today_at('00:00')) | int) + 86400 %}
{% set candidate_starts = [
as_timestamp(today_at('21:00')) | int,
as_timestamp(today_at('22:00')) | int,
as_timestamp(today_at('23:00')) | int,
tomorrow_midnight,
tomorrow_midnight + 3600,
tomorrow_midnight + 7200
] %}
{% for base in candidate_starts %}
{% set total = namespace(value=0, missing=false) %}
{% for offset in range(4) %}
{% set target = base + (offset * 3600) %}
{% set matches = ns.prices | selectattr('ts', 'eq', target) | list %}
{% if matches | count > 0 %}
{% set total.value = total.value + (matches[0].price | float(999)) %}
{% else %}
{% set total.missing = true %}
{% endif %}
{% endfor %}
{% if not total.missing %}
{% set ns.candidates = ns.candidates + [{'ts': base, 'total': total.value}] %}
{% endif %}
{% endfor %}
{% set sorted = ns.candidates | sort(attribute='total') %}
{{ (sorted | first).ts if (sorted | count) > 0 else fallback_ts }}
action:
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.dishwasher_next_start
data:
timestamp: "{{ best_start_ts | int }}"
- id: dishwasher_start_planned_night_run
alias: Opvaskemaskine - start planlagt natkørsel
mode: single
trigger:
- platform: time
at: input_datetime.dishwasher_next_start
condition:
- condition: template
value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}"
action:
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.dishwasher_fjernbetjening
state: "on"
sequence:
- service: button.press
target:
entity_id: button.dishwasher_start
default:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Opvaskemaskine venter på remote control"
message: "Planlagt natkørsel kunne ikke startes, fordi fjernbetjening ikke er slået til."
- id: dishwasher_remote_control_hourly_reminder
alias: Opvaskemaskine - påmindelse om remote control
mode: single
trigger:
- platform: time_pattern
minutes: "/15"
condition:
- condition: template
value_template: "{{ now().hour >= 19 and now().hour <= 21 }}"
- condition: state
entity_id: input_boolean.dishwasher_reminder_snoozed
state: "off"
- condition: template
value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}"
- condition: or
conditions:
- condition: state
entity_id: binary_sensor.dishwasher_fjernbetjening
state: "off"
- condition: template
value_template: "{{ not is_state('binary_sensor.dishwasher_dor', 'off') }}"
- condition: template
value_template: "{{ is_state('binary_sensor.dishwasher_info_2', 'on') }}"
- condition: template
value_template: "{{ is_state('binary_sensor.dishwasher_svigt', 'on') }}"
- condition: template
value_template: "{{ states('sensor.dishwasher_salt_level') | float(999) < 20 }}"
- condition: template
value_template: "{{ states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 }}"
- condition: template
value_template: "{{ states('sensor.dishwasher_powerdisk_level') | float(999) < 20 }}"
action:
- variables:
reminder_time: "{{ now().strftime('%H:%M') }}"
remote_off: "{{ is_state('binary_sensor.dishwasher_fjernbetjening', 'off') }}"
door_not_closed: "{{ not is_state('binary_sensor.dishwasher_dor', 'off') }}"
low_salt: "{{ states('sensor.dishwasher_salt_level') | float(999) < 20 }}"
low_rinse: "{{ states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 }}"
low_powerdisk: "{{ states('sensor.dishwasher_powerdisk_level') | float(999) < 20 }}"
info_on: "{{ is_state('binary_sensor.dishwasher_info_2', 'on') }}"
svigt: "{{ is_state('binary_sensor.dishwasher_svigt', 'on') }}"
issue_text: >
{% set issues = [] %}
{% if remote_off %}{% set issues = issues + ['remote control er ikke slået til'] %}{% endif %}
{% if door_not_closed %}{% set issues = issues + ['døren er ikke lukket'] %}{% endif %}
{% if low_salt %}{% set issues = issues + ['salt er lavt (' ~ states('sensor.dishwasher_salt_level') ~ '%)'] %}{% endif %}
{% if low_rinse %}{% set issues = issues + ['afspændingsmiddel er lavt (' ~ states('sensor.dishwasher_rinse_aid_level') ~ '%)'] %}{% endif %}
{% if low_powerdisk %}{% set issues = issues + ['powerdisk er lav (' ~ states('sensor.dishwasher_powerdisk_level') ~ '%)'] %}{% endif %}
{% if info_on %}{% set issues = issues + ['info-advarsel aktiv'] %}{% endif %}
{% if svigt %}{% set issues = issues + ['maskinsvigt'] %}{% endif %}
{{ issues | join(', ') }}
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "⚠️ Opvaskemaskine - tjek inden natkørsel"
message: "[{{ reminder_time }}] {{ issue_text | capitalize }}."
data:
actions:
- action: "DISHWASHER_DONE"
title: "✅ Gjort det"
- action: "DISHWASHER_IGNORE"
title: "🔕 Ignorer i aften"
- id: dishwasher_reminder_action_ignore
alias: Opvaskemaskine - ignorer påmindelser i aften
mode: single
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: DISHWASHER_IGNORE
action:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.dishwasher_reminder_snoozed
- id: dishwasher_reminder_snooze_reset
alias: Opvaskemaskine - nulstil snooze ved midnat
mode: single
trigger:
- platform: time
at: "00:00:00"
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.dishwasher_reminder_snoozed