################################################################
## Packages / Heishamon
################################################################

################################################################
## Changelog
################################################################
##
## 1.0.0 (08-01-2020)
##   Added
##   - Initial version
##
## 1.1.0 (10-01-2020)
##   Added
##   - Added power switch and Fan RPM sensors
##
## 1.2.0 (17-05-2020)
##   Fixed
##   - New/changed topics
##
## 1.3.0 (22-06-2022)
##   Compatibility with Home Assistant 2022.6 MQTT configuration format


# Automations #
###############
automation:
  #Fetches quiet level from status and sets the selector accordingly
  - alias: Set quiet level selector
    trigger:
      platform: mqtt
      topic: "panasonic_heat_pump/main/Quiet_Mode_Level"
    action:
      service: input_select.select_option
      data:
      #was: data_template:
        entity_id: input_select.heishamon_quietmode
        option: >-
          {%- if trigger.payload == "0" -%}
            Aus
          {%- else -%}
            {{ trigger.payload }}
          {%- endif -%}

  #Sets quiet level to the selected value
  - alias: Set quiet level
    trigger:
      platform: state
      entity_id: input_select.heishamon_quietmode
    action:
      service: mqtt.publish
      data:
      #was data_template:
        topic: panasonic_heat_pump/commands/SetQuietMode
        retain: false #IMPORTANT! ALWAYS set retain flag false for commands!
        payload: >-
          {%- if states('input_select.heishamon_quietmode') == "Aus" -%}
            0
          {%- else -%}
            {{ states('input_select.heishamon_quietmode') }}
          {%- endif -%}

  #Fetches powerful level from status and sets the selector accordingly
  - alias: Set powerful level selector
    trigger:
      platform: mqtt
      topic: "panasonic_heat_pump/main/Powerful_Mode_Time"
    action:
      service: input_select.select_option
      data:
      #was data_template:
        entity_id: input_select.heishamon_powermode
        option: >-
          {%- if trigger.payload == "0" -%}
            Aus
          {%- else -%}
            {{ (trigger.payload | int) * 30 }} min
          {%- endif -%}

  #Sets powerful level to the selected value
  - alias: Set powerful level
    trigger:
      platform: state
      entity_id: input_select.heishamon_powermode
    action:
      service: mqtt.publish
      data:
      #was data_template:
        topic: panasonic_heat_pump/commands/SetPowerfulMode
        retain: false #IMPORTANT! ALWAYS set retain flag false for commands!
        payload: >-
          {%- if states('input_select.heishamon_powermode') == "Aus" -%}
            0
          {%- else -%}
            {{ "%.0f" % ((states('input_select.heishamon_powermode') | replace("min", "") | int) / 30) }}
          {%- endif -%}

  #Fetches heatmode from status and sets the selector accordingly
  - alias: Set heatmode selector
    trigger:
      platform: mqtt
      topic: "panasonic_heat_pump/main/Operating_Mode_State"
    action:
      service: input_select.select_option
      data:
      #was data_template:
        entity_id: input_select.heishamon_heatmode
        option: >-
          {%- if trigger.payload == "0" -%}
            Heizen
          {%- elif trigger.payload == "3" -%}
            WW
          {%- elif trigger.payload == "4" -%}
            Heizen+WW
          {%- endif -%}

  #Sets heatmode to the selected value
  - alias: Set heatmode
    trigger:
      platform: state
      entity_id: input_select.heishamon_heatmode
    action:
      service: mqtt.publish
      data:
      #was: data_template:
        topic: panasonic_heat_pump/commands/SetOperationMode
        retain: false #IMPORTANT! ALWAYS set retain flag false for commands!
        payload: >-  #was payload_template
          {%- if states('input_select.heishamon_heatmode') == "Heizen" -%}
            0
          {%- elif states('input_select.heishamon_heatmode') == "WW" -%}
            3
          {%- elif states('input_select.heishamon_heatmode') == "Heizen+WW" -%}
            4
          {%- endif -%}

  #Fetches heatshift temperature from status and sets the selector accordingly
  - alias: Set heatshift selector
    trigger:
      platform: mqtt
      topic: "panasonic_heat_pump/main/Z1_Heat_Request_Temp"
    action:
      service: input_number.set_value
      data:
      #was: data_template:        
        entity_id: input_number.heishamon_heatshift
        value: >-
          {{ "%.1f" % (trigger.payload | int) }}

  #Sets heatshift temperature to the selected value
  - alias: Set heatshift
    trigger:
      platform: state
      entity_id: input_number.heishamon_heatshift
    action:
      service: mqtt.publish
      data:
      # was: data_template:
        topic: panasonic_heat_pump/commands/SetZ1HeatRequestTemperature
        retain: false #IMPORTANT! ALWAYS set retain flag false for commands!
        payload: >-
          {{ "%.0f" % (states('input_number.heishamon_heatshift') | int) }}

  #Fetches tank target temperature from status and sets the selector accordingly
  - alias: Set tank target temperature selector
    trigger:
      platform: mqtt
      topic: "panasonic_heat_pump/main/DHW_Target_Temp"
    action:
      service: input_number.set_value
      data:
      #was: data_template:
        entity_id: input_number.heishamon_tank_temp
        value: >-
          {{ "%.1f" % (trigger.payload | int) }}

  #Sets tank target temperature to the selected value
  - alias: Set tank target temperature
    trigger:
      platform: state
      entity_id: input_number.heishamon_tank_temp
    action:
      service: mqtt.publish
      data: 
      #was: data_template:
        topic: panasonic_heat_pump/commands/SetDHWTemp
        retain: false #IMPORTANT! ALWAYS set retain flag false for commands!
        payload: >-
          {{ "%.0f" % (states('input_number.heishamon_tank_temp') | int) }}


# input_number #
################
input_number:
  heishamon_tank_temp:
    name: Set Tank Temperature
    min: 40
    max: 75
    step: 1

  heishamon_heatshift:
    name: Set Heatshift Temperature
    min: -5
    max: 5
    step: 1


# input_select #
################
input_select:
  heishamon_quietmode:
    name: Set Quiet Mode
    options:
      - 'Aus'
      - 1
      - 2
      - 3

  heishamon_powermode:
    name: Set Powerful Mode
    options:
      - 'Aus'
      - 30 min
      - 60 min
      - 90 min

  heishamon_heatmode:
    name: Set Heat Mode
    options:
      - Heizen+WW
      - Heizen
      - WW

# sensor #
##########
mqtt:
  sensor:
    #TOP0 - Power state
    - name: Aquarea Power State
      state_topic: "panasonic_heat_pump/main/Heatpump_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

    #TOP1 - Pumpflow
    - name: Aquarea Pump Flow
      state_topic: "panasonic_heat_pump/main/Pump_Flow"
      unit_of_measurement: 'L/min'

    #TOP2 - Force DHW
    - name: Aquarea Force DHW Mode
      state_topic: "panasonic_heat_pump/main/Force_DHW_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

  #TOP4 - Heat mode (Hot water, Heat or Hot water + heat)
    - name: Aquarea Mode
      state_topic: "panasonic_heat_pump/main/Operating_Mode_State"
      value_template: >-
        {%- if value == "0" -%}
          Heizen
        {%- elif value == "1" -%}
          Kühlen
        {%- elif value == "2" -%}
          Auto
        {%- elif value == "3" -%}
          WW
        {%- elif value == "4" -%}
          Heizen+WW
        {%- elif value == "5" -%}
          Kühlen+WW
        {%- elif value == "6" -%}
          Auto+WW
        {%- endif -%}
     
    #TOP5 - Water inlet temp
    - name: Aquarea Inlet Temperature
      state_topic: "panasonic_heat_pump/main/Main_Inlet_Temp"
      unit_of_measurement: '°C'

    #TOP6 - Water outlet temp
    - name: Aquarea Outlet Temperature
      state_topic: "panasonic_heat_pump/main/Main_Outlet_Temp"
      unit_of_measurement: '°C'

    #TOP7 - Water outlet target temp
    - name: Aquarea Outlet Target Temperature
      state_topic: "panasonic_heat_pump/main/Main_Target_Temp"
      unit_of_measurement: '°C'

    #TOP8 - Compressor frequency
    - name: Aquarea Compressor Frequency
      state_topic: "panasonic_heat_pump/main/Compressor_Freq"
      unit_of_measurement: 'Hz'

    #TOP9 - Tank set temperature
    - name: Aquarea Tank Set Temperature
      state_topic: "panasonic_heat_pump/main/DHW_Target_Temp"
      unit_of_measurement: '°C'

    #TOP10 - Tank current temperature
    - name: Aquarea Actual Tank Temperature
      state_topic: "panasonic_heat_pump/main/DHW_Temp"
      unit_of_measurement: '°C'
      state_class: 'measurement'

    #TOP11 - Compressor Operating Time
    - name: Aquarea Compressor Operating Hours
      state_topic: "panasonic_heat_pump/main/Operations_Hours"
      unit_of_measurement: 'Hours'
      state_class: total

    #TOP12 - Compressor On/Off cycle number
    - name: Aquarea Compressor Start/Stop Counter
      state_topic: "panasonic_heat_pump/main/Operations_Counter"
      state_class: total

    #TOP14 - Outdoor unit ambient temperature
    - name: Aquarea Outdoor Ambient
      state_topic: "panasonic_heat_pump/main/Outside_Temp"
      unit_of_measurement: '°C'
      state_class: 'measurement'

    #TOP15 - Heating power produced
    - name: Aquarea Power Produced
      state_topic: "panasonic_heat_pump/main/Heat_Energy_Production"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      force_update: true

    #TOP16 - Heating power consumed
    - name: Aquarea Power Consumed
      state_topic: "panasonic_heat_pump/main/Heat_Energy_Consumption"
      unit_of_measurement: 'W'
      device_class: 'power'
      state_class: 'measurement'
      force_update: true

    #TOP17 - Heating powerful mode
    - name: Aquarea Powerful Mode
      state_topic: "panasonic_heat_pump/main/Powerful_Mode_Time"
      unit_of_measurement: 'Min'
      value_template: >-
        {{ (value | int) * 30 }}

    #TOP18 - Heating quiet mode
    - name: Aquarea Quiet Mode
      state_topic: "panasonic_heat_pump/main/Quiet_Mode_Level"
      value_template: >-
        {%- if value == "4" -%}
          Scheduled
        {%- elif value == "0" -%}
          Aus
        {%- else -%}
          {{ value }}
        {%- endif -%}

    #TOP19 - Holiday Mode
    - name: Aquarea Holiday Mode
      state_topic: "panasonic_heat_pump/main/Holiday_Mode_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

    #TOP20 - 3-way valve state
    - name: Aquarea 3-way Valve
      state_topic: "panasonic_heat_pump/main/ThreeWay_Valve_State"
      value_template: >-
        {%- if value == "0" -%}
          Heizung
        {%- elif value == "1" -%}
          WW-Tank
        {%- endif -%}

    #TOP21 - Outside pipe temp
    - name: Aquarea Outdoor Pipe Temperature
      state_topic: "panasonic_heat_pump/main/Outside_Pipe_Temp"
      unit_of_measurement: '°C'

    #TOP26 - Defrost state
    - name: Aquarea Defrost State
      state_topic: "panasonic_heat_pump/main/Defrosting_State"
      value_template: >-
        {%- if value == "0" -%}
          Inactive
        {%- elif value == "1" -%}
          Active
        {%- endif -%}

    #TOP27 - Heatshift Temperature
    - name: Aquarea Heatshift Temperature
      state_topic: "panasonic_heat_pump/main/Z1_Heat_Request_Temp"
      unit_of_measurement: '°C'

   #TOP36 - Zone 1 Water outlet temperature (°C)
    - name: Aquarea Z1 Water Temperature
      state_topic: "panasonic_heat_pump/main/Z1_Water_Temp"
      unit_of_measurement: '°C'

    #TOP40 - DHW power produced
    - name: Aquarea DHW Power Produced
      state_topic: "panasonic_heat_pump/main/DHW_Energy_Production"
      unit_of_measurement: 'W'
      device_class: 'power'
      state_class: 'measurement'
      force_update: true

    #TOP41 - DHW power consumed
    - name: Aquarea DHW Power Consumed
      state_topic: "panasonic_heat_pump/main/DHW_Energy_Consumption"
      unit_of_measurement: 'W'
      device_class: 'power'
      state_class: 'measurement'
      force_update: true

    #TOP44 - Last active error
    - name: Aquarea Last Error
      state_topic: "panasonic_heat_pump/main/Error"

    #TOP49 - Main HEX Outlet temp
    - name: Aquarea Main HEX Outlet Temperature
      state_topic: "panasonic_heat_pump/main/Main_Hex_Outlet_Temp"
      unit_of_measurement: '°C'

    #TOP50 - Discharge temp
    - name: Aquarea Discharge Temperature
      state_topic: "panasonic_heat_pump/main/Discharge_Temp"
      unit_of_measurement: '°C'

    #TOP51 - Inside Pipe temp
    - name: Aquarea Inside Pipe Temperature
      state_topic: "panasonic_heat_pump/main/Inside_Pipe_Temp"
      unit_of_measurement: '°C'

    #TOP52 - Defrost temp
    - name: Aquarea Defrost Temperature
      state_topic: "panasonic_heat_pump/main/Defrost_Temp"
      unit_of_measurement: '°C'

    #TOP53 - Eva Outlet temp
    - name: Aquarea Eva Outlet Temperature
      state_topic: "panasonic_heat_pump/main/Eva_Outlet_Temp"
      unit_of_measurement: '°C'

    #TOP54 - Bypass Outlet temp
    - name: Aquarea Bypass Outlet Temperature
      state_topic: "panasonic_heat_pump/main/Bypass_Outlet_Temp"
      unit_of_measurement: '°C'

    #TOP55 - lpm temp
    - name: Aquarea Ipm Temperature
      state_topic: "panasonic_heat_pump/main/Ipm_Temp"
      unit_of_measurement: '°C'

    #TOP58 - Tank electric heater allowed state
    - name: Aquarea Tank Heater Enabled
      state_topic: "panasonic_heat_pump/main/DHW_Heater_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

    #TOP59 - Water electric heater allowed state
    - name: Aquarea Room Heater Enabled
      state_topic: "panasonic_heat_pump/main/Room_Heater_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

    #TOP60 - Internal heater state
    - name: Aquarea Internal Heater State
      state_topic: "panasonic_heat_pump/main/Internal_Heater_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

    #TOP61 - External heater state
    - name: Aquarea External Heater State
      state_topic: "panasonic_heat_pump/main/External_Heater_State"
      value_template: >-
        {%- if value == "0" -%}
          Aus
        {%- elif value == "1" -%}
          Ein
        {%- endif -%}

    #TOP62 - Fan1 speed
    - name: Aquarea Fan 1 Speed
      state_topic: "panasonic_heat_pump/main/Fan1_Motor_Speed"
      unit_of_measurement: "R/min"

    #TOP63 - Fan2 speed
    - name: Aquarea Fan 2 Speed
      state_topic: "panasonic_heat_pump/main/Fan2_Motor_Speed"
      unit_of_measurement: "R/min"

    #TOP64 - High pressure
    - name: Aquarea High pressure
      state_topic: "panasonic_heat_pump/main/High_Pressure"
      unit_of_measurement: "Kgf/cm2"

    #TOP65 - Pump speed
    - name: Aquarea Pump Speed
      state_topic: "panasonic_heat_pump/main/Pump_Speed"
      unit_of_measurement: "R/min"

  #TOP66 - Low pressure
    - name: Aquarea Low pressure
      state_topic: "panasonic_heat_pump/main/Low_Pressure"
      unit_of_measurement: "Kgf/cm2"

  #TOP67 - Compressor Current
    - name: Aquarea Compressor Current
      state_topic: "panasonic_heat_pump/main/Compressor_Current"
      unit_of_measurement: "A"
 
 #TOP90 - Room Heater Operations Hours
    - name: Aquarea Room Heater Operation Hours
      state_topic: "panasonic_heat_pump/main/Room_Heater_Operations_Hours"
      unit_of_measurement: 'Hours'
      state_class: total

 #TOP91 - DHW Heater Operations Hours
    - name: Aquarea DHW Heater Operation Hours
      state_topic: "panasonic_heat_pump/main/DHW_Heater_Operations_Hours"
      unit_of_measurement: 'Hours'
      state_class: total

  #TOP93 - Pump_duty
    - name: Aquarea Pump Duty 
      state_topic: "panasonic_heat_pump/main/Pump_Duty"
      unit_of_measurement: "xx"

    ##1-Wire - Example, replace with correct sensor ID
    #- name: 1-wire sensor temperature
    #  state_topic: "panasonic_heat_pump/1wire/1234567890abcdef"
    #  unit_of_measurement: '°C'
    #  value_template: '{{value | round(1) }}'

    # The following S0 topics are only available if S0 is enabled.
    #
    #S0 kWh Meter 1 - Assumed to measure the heat pump consumption
#    - name: Aquarea Metered Power Consumption
#      state_topic: "panasonic_heat_pump/s0/Watt/1"
#      unit_of_measurement: 'W'

#    - name: Aquarea Metered Power Consumption Total
#      state_topic: "panasonic_heat_pump/s0/WatthourTotal/1"
#      unit_of_measurement: 'kWh'
#      value_template: >-
#        {{ (value | int) / 1000}}

    #S0 kWh Meter 2 - Assumed to measure the backup heater consumption
#    - name: Aquarea Metered Backup Heater Power Consumption
#      state_topic: "panasonic_heat_pump/s0/Watt/2"
#      unit_of_measurement: 'W'

#    - name: Aquarea Metered Backup Heater Power Consumption Total
#      state_topic: "panasonic_heat_pump/s0/WatthourTotal/2"
#      unit_of_measurement: 'kWh'
#      value_template: >-
#        {{ (value | int) / 1000}}

# switch #
##########
  switch:
    #Turn on/off holiday mode
    - name: Aquarea Holiday Mode
      command_topic: "panasonic_heat_pump/commands/SetHolidayMode"
      state_topic: "panasonic_heat_pump/main/Holiday_Mode_State"
      qos: 0
      payload_on: "1"
      payload_off: "0"
      retain: false
  
    #Turn on/off heatpump  
    - name: Aquarea Main Power
      command_topic: "panasonic_heat_pump/commands/SetHeatpump"
      state_topic: "panasonic_heat_pump/main/Heatpump_State"
      qos: 0
      payload_on: "1"
      payload_off: "0"
      retain: false

    - name: Aquarea Force DHW Mode
      command_topic: "panasonic_heat_pump/commands/SetForceDHW"
      state_topic: "panasonic_heat_pump/main/Force_DHW_State"
      qos: 0
      payload_on: "1"
      payload_off: "0"
      retain: false

    - name: Aquarea Main Schedule Automatic
      command_topic: "panasonic_heat_pump/commands/SetMainSchedule"
      state_topic: "panasonic_heat_pump/main/Main_Schedule_State"
      qos: 0
      payload_on: "1"
      payload_off: "0"
      retain: false

sensor:
  #### SENSORS BELOW ARE NOT IN FIRMWARE ####
  #Energy use/production
  # - platform: template
    # sensors:
      # heishamon_w_production:
        # friendly_name: "Aquarea Energy Production"
        # unit_of_measurement: 'W'
        # value_template: >-
          # {%- if states('sensor.aquarea_dhw_power_produced') != "0" -%}
            # {{ states('sensor.aquarea_dhw_power_produced') }}
          # {%- else -%}
            # {{ states('sensor.aquarea_power_produced') }}
          # {%- endif -%}
      # heishamon_w_consumption:
        # friendly_name: "Aquarea Energy Consumption"
        # unit_of_measurement: 'W'
        # value_template: >-
          # {%- if states('sensor.aquarea_dhw_power_consumed') != "0" -%}
            # {{ states('sensor.aquarea_dhw_power_consumed') }}
          # {%- else -%}
            # {{ states('sensor.aquarea_power_consumed') }}
          # {%- endif -%}

  #COP Calculations
  # - platform: template
    # sensors:
      # heishamon_cop:
        # friendly_name: "Aquarea COP"
        # unit_of_measurement: "x"
        # value_template: >-
          # {%- if states('sensor.heishamon_w_consumption') | float(0) > 0 -%}
            # {{ '%0.1f' % ((states('sensor.heishamon_w_production') | float ) / (states('sensor.heishamon_w_consumption') | float )) }}
          # {%- else -%}
            # 0.0
          # {%- endif -%}

        # availability_template: >-
          # {%- if is_number(states('sensor.heishamon_w_consumption')) and is_number(states('sensor.heishamon_w_production')) %}
            # true
          # {%- else %}
            # false
          # {%- endif %}

  #Calculation Energy consumed (kWh) - DHW
  - platform: integration
    source: sensor.aquarea_dhw_power_consumed
    name: Aquarea DHW Energy Consumed
    unit_prefix: k
    method: left
  #Calculation Energy consumed (kWh) - Heat    
  - platform: integration
    source: sensor.aquarea_power_consumed
    name: Aquarea Heat Energy Consumed
    unit_prefix: k
    method: left
