###############################################################################
#   @author         :   Jeffrey Stone 
#   @date           :   06/12/2020
#   @package        :   Appliances
#   @description    :   Package for handling Smart Applicances and or automation to make dumb appliances seem smart.  
###############################################################################

sensor:
  # MQTT Sensor for DishWasher Status.  
  - platform: mqtt
    name: "DishWasher Status"
    state_topic: "house/dishwasher/status"
  # MQTT Sensor for Washing Machine Status. 
  - platform: mqtt
    name: "Washer Status"
    state_topic: "house/washer/status"
  - platform: mqtt
    name: "Washer Last Complete"
    state_topic: "house/washer/time_complete"
  - platform: mqtt
    name: "Washer Last Emptied"
    state_topic: "house/washer/time_emptied"

utility_meter:
  washer_daily_kwh:
    source: sensor.washer_switch_electric_consumed_kwh
    cycle: daily
  washer_weekly_kwh:
    source: sensor.washer_switch_electric_consumed_kwh
    cycle: weekly
  

automation:

  - id: washer_running
    alias: Washer Running
    trigger:
    - above: 5
      entity_id: sensor.washer_power_consumed_w
      platform: numeric_state
    condition:
      condition: or
      conditions:
      - condition: state
        entity_id: sensor.washer_status
        state: idle
      - condition: state
        entity_id: sensor.washer_status
        state: complete
    action:
    - service: script.washer_running
    initial_state: true

  - id: washer_complete
    alias: Washer Complete
    trigger:
    - below: 3
      entity_id: sensor.washer_power_consumed_w
      platform: numeric_state
    condition:
    - condition: state
      entity_id: sensor.washer_status
      state: running
    action:
    - service: script.washer_complete
    initial_state: true

  - id: washer_emptied
    initial_state: true
    alias: Washer Emptied
    trigger:
    - platform: state
      entity_id: binary_sensor.washer_door
      from: 'off'
      to: 'on'
    action:
    - service: script.washer_idle
    - service: script.turn_off
      entity_id: script.washer_finished_notification_audible
    - service: mqtt.publish
      data:
        topic: house/washer/time_emptied
        payload: '{{ now().timestamp() }}'
        retain: true

  - id: washer_notification
    initial_state: true
    alias: Washer Notification
    trigger:
    - platform: state
      entity_id: sensor.washer_status
      from: running
      to: complete
    - platform: event
      event_type: event_washer_complete_notification
    action:
    - service: script.turn_on
      entity_id: script.washer_finished_notification_audible
  
  
  - id: dishwasher_idle
    initial_state: true
    alias: Dishwasher Idle
    trigger:
    - platform: state
      entity_id: device_tracker.dishwasher
      to: 'not_home'
    action:
    - service: script.dishwasher_idle
  
  # When dishwasher connects to network assume it is running cycle. 
  - id: dishwasher_running
    initial_state: true
    alias: Dishwasher Running
    trigger:
    - platform: state
      entity_id: device_tracker.dishwasher
      to: 'home'
    action:
    - service: script.dishwasher_running

script:

  appliances_on:
    sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.box_fans
  
  appliances_off:
    sequence:
    - data:
        entity_id: switch.incense
      service: switch.turn_off
    - data:
        entity_id: switch.artemis
      service: switch.turn_off

  washer_finished_notification_audible:
    sequence:
    - delay:
        minutes: 15
    - service: script.washer_audible
    - delay:
        minutes: 30
    - event: event_washer_complete_notification
      event_data:
        name: Washer Complete Notification
        message: Washer has completed it's cycle

  washer_audible:
    sequence:
    - condition: state
      entity_id: sensor.family_status
      state: Home
    - condition: state
      entity_id: sensor.washer_status
      state: complete
    - service: script.status_annc
      data_template:
        who: '{{ states.sensor.room_presence.state }}'
        call_interuption: 1
        call_washer_needs_emptying: 1
    

  washer_idle:
    sequence:
    - service: mqtt.publish
      data:
        topic: house/washer/status
        payload: idle
        retain: true
  washer_running:
    sequence:
    - service: mqtt.publish
      data:
        topic: house/washer/status
        payload: running
        retain: true
  washer_complete:
    sequence:
    - service: mqtt.publish
      data:
        topic: house/washer/status
        payload: complete
        retain: true
    - service: mqtt.publish
      data:
        topic: house/washer/time_complete
        payload: '{{ now().timestamp() }}'
        retain: true

  dishwasher_idle:
    sequence:
    - service: mqtt.publish
      data:
        topic: house/dishwasher/status
        payload: idle
        retain: true
  dishwasher_running:
    sequence:
    - service: mqtt.publish
      data:
        topic: house/dishwasher/status
        payload: running
        retain: true