310 lines
10 KiB
Plaintext
310 lines
10 KiB
Plaintext
##########################################################################################
|
|
# heat_pump_helpers.yaml
|
|
#
|
|
# Panasonic Comfort Cloud (panasonic_cc) helpers for Heat/Cool control + presets.
|
|
#
|
|
# Purpose:
|
|
# - Provide "optimistic" UI feedback for cloud/slow mode changes
|
|
# - Provide one-tap scripts for Off/Heat/Cool/Dehumid
|
|
# - Provide a 3-step "Profile" cycler (Normal/Boost/Quiet) using preset_mode:
|
|
# * preset_mode: boost -> Powerful ON (we label this "Boost")
|
|
# * preset_mode: eco -> Quiet ON (we label this "Quiet")
|
|
# * preset_mode: none -> Powerful OFF + Quiet OFF (we label this "Normal")
|
|
#
|
|
# Notes:
|
|
# - Your climate entity supports preset_modes: [none, eco, boost]
|
|
# - The switch.lounge_ai_eco entity appears to be read-only (cannot be controlled),
|
|
# so "Eco" and "Eco/Quiet" profiles have been removed.
|
|
# - When turning the heat pump OFF, we also force preset_mode to "none" so that
|
|
# Boost/Quiet are cleared.
|
|
##########################################################################################
|
|
|
|
input_select:
|
|
# Used by your dashboard buttons to "light up" instantly (optimistic state).
|
|
# When set to something other than "none", the UI can treat that as "pending".
|
|
master_bedroom_hvac_requested_mode:
|
|
name: Master Bedroom HVAC Requested Mode
|
|
options:
|
|
- "none"
|
|
- "off"
|
|
- "heat"
|
|
- "cool"
|
|
- "dry"
|
|
initial: "none"
|
|
|
|
# Heat pump profile selector shown on the dashboard and cycled with one tap.
|
|
master_bedroom_heat_pump_profile:
|
|
name: Master Bedroom Heat Pump Profile
|
|
options:
|
|
- Normal
|
|
- Boost
|
|
- Quiet
|
|
initial: Normal
|
|
|
|
script:
|
|
########################################################################################
|
|
# One-tap HVAC mode scripts
|
|
# These set the optimistic helper first, then call the real climate services.
|
|
#
|
|
# IMPORTANT:
|
|
# - Off also clears Boost/Quiet by forcing preset_mode to "none".
|
|
########################################################################################
|
|
|
|
master_bedroom_hvac_off:
|
|
alias: Master Bedroom HVAC - Off
|
|
mode: restart
|
|
sequence:
|
|
# Optimistic UI: show "Off" immediately
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
data:
|
|
option: "off"
|
|
|
|
# Turn the unit off (more reliable than set_hvac_mode off on many cloud integrations)
|
|
- service: climate.turn_off
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
|
|
# Clear Panasonic preset flags: none = Boost OFF + Quiet OFF
|
|
- service: climate.set_preset_mode
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
data:
|
|
preset_mode: "none"
|
|
|
|
master_bedroom_hvac_heat:
|
|
alias: Master Bedroom HVAC - Heat
|
|
mode: restart
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
data:
|
|
option: "heat"
|
|
|
|
- service: climate.turn_on
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
|
|
- service: climate.set_hvac_mode
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
data:
|
|
hvac_mode: "heat"
|
|
|
|
master_bedroom_hvac_cool:
|
|
alias: Master Bedroom HVAC - Cool
|
|
mode: restart
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
data:
|
|
option: "cool"
|
|
|
|
- service: climate.turn_on
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
|
|
- service: climate.set_hvac_mode
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
data:
|
|
hvac_mode: "cool"
|
|
|
|
master_bedroom_hvac_dry:
|
|
alias: Master Bedroom HVAC - Dehumid
|
|
mode: restart
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
data:
|
|
option: "dry"
|
|
|
|
- service: climate.turn_on
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
|
|
- service: climate.set_hvac_mode
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
data:
|
|
hvac_mode: "dry"
|
|
|
|
########################################################################################
|
|
# Profile logic: Apply + Cycle
|
|
#
|
|
# Profile definitions (Panasonic CC / panasonic_cc):
|
|
# - Normal -> preset_mode none (Boost OFF, Quiet OFF)
|
|
# - Boost -> preset_mode boost (Powerful ON)
|
|
# - Quiet -> preset_mode eco (Quiet ON)
|
|
#
|
|
# The profile selector is kept in-sync with the actual preset_mode via automation.
|
|
########################################################################################
|
|
|
|
master_bedroom_heat_pump_profile_apply:
|
|
alias: Master Bedroom Heat Pump - Apply Profile
|
|
mode: restart
|
|
fields:
|
|
profile:
|
|
description: Profile name (Normal, Boost, Quiet)
|
|
example: Normal
|
|
sequence:
|
|
- variables:
|
|
p: "{{ profile | default(states('input_select.master_bedroom_heat_pump_profile')) }}"
|
|
preset_for_profile: >-
|
|
{% if p == 'Normal' %}none
|
|
{% elif p == 'Boost' %}boost
|
|
{% elif p == 'Quiet' %}eco
|
|
{% else %}none
|
|
{% endif %}
|
|
|
|
# Optional: ensure the unit is on when applying a profile.
|
|
# Comment out if you want profile selection while the unit is off.
|
|
- service: climate.turn_on
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
|
|
# Set preset explicitly every time so Boost/Quiet are mutually exclusive
|
|
- service: climate.set_preset_mode
|
|
target:
|
|
entity_id: climate.master_bedroom
|
|
data:
|
|
preset_mode: "{{ preset_for_profile }}"
|
|
|
|
master_bedroom_heat_pump_profile_next:
|
|
alias: Master Bedroom Heat Pump - Next Profile
|
|
mode: restart
|
|
sequence:
|
|
- variables:
|
|
cur: "{{ states('input_select.master_bedroom_heat_pump_profile') }}"
|
|
nxt: >-
|
|
{% if cur == 'Normal' %}Boost
|
|
{% elif cur == 'Boost' %}Quiet
|
|
{% else %}Normal
|
|
{% endif %}
|
|
|
|
# Store the new selection (UI)
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_heat_pump_profile
|
|
data:
|
|
option: "{{ nxt }}"
|
|
|
|
# Apply it to the heat pump
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.master_bedroom_heat_pump_profile_apply
|
|
data:
|
|
variables:
|
|
profile: "{{ nxt }}"
|
|
|
|
automation:
|
|
########################################################################################
|
|
# Clear "requested mode" once the climate entity catches up, so the UI reflects reality.
|
|
# This prevents two mode buttons appearing lit due to stale cloud attributes.
|
|
########################################################################################
|
|
- id: master_bedroom_hvac_clear_requested_mode
|
|
alias: Master Bedroom HVAC - Clear Requested Mode
|
|
mode: restart
|
|
trigger:
|
|
- platform: state
|
|
entity_id: climate.master_bedroom
|
|
|
|
- platform: state
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
to:
|
|
- "off"
|
|
- "heat"
|
|
- "cool"
|
|
- "dry"
|
|
|
|
condition:
|
|
- condition: template
|
|
value_template: >
|
|
{{ states('input_select.master_bedroom_hvac_requested_mode') != 'none' }}
|
|
|
|
action:
|
|
# Small delay to allow the cloud integration to reflect the change
|
|
- delay: "00:00:03"
|
|
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: >
|
|
{% set req = states('input_select.master_bedroom_hvac_requested_mode') %}
|
|
{% set mode = states('climate.master_bedroom') %}
|
|
{% set action = (state_attr('climate.master_bedroom','hvac_action') or '') %}
|
|
{{ (req == 'off' and (mode == 'off' or action == 'off'))
|
|
or (req in ['heat','cool','dry'] and mode == req) }}
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
data:
|
|
option: "none"
|
|
|
|
default:
|
|
# Failsafe: if the cloud entity is slow or ambiguous, clear after a while anyway
|
|
- delay: "00:00:25"
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_hvac_requested_mode
|
|
data:
|
|
option: "none"
|
|
|
|
########################################################################################
|
|
# Sync the Profile selector from actual device preset_mode (including changes made in
|
|
# the Panasonic app). This keeps the UI truthful.
|
|
#
|
|
# Mapping:
|
|
# - preset boost -> Boost
|
|
# - preset eco -> Quiet
|
|
# - preset none -> Normal
|
|
########################################################################################
|
|
- id: master_bedroom_heat_pump_profile_sync_from_entities
|
|
alias: Master Bedroom Heat Pump - Sync Profile From Entities
|
|
mode: restart
|
|
trigger:
|
|
- platform: state
|
|
entity_id: climate.master_bedroom
|
|
action:
|
|
- delay: "00:00:02"
|
|
- variables:
|
|
preset: "{{ state_attr('climate.master_bedroom', 'preset_mode') or 'none' }}"
|
|
new_profile: >-
|
|
{% if preset == 'boost' %}
|
|
Boost
|
|
{% elif preset == 'eco' %}
|
|
Quiet
|
|
{% else %}
|
|
Normal
|
|
{% endif %}
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ states('input_select.master_bedroom_heat_pump_profile') != new_profile }}"
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: input_select.master_bedroom_heat_pump_profile
|
|
data:
|
|
option: "{{ new_profile }}"
|
|
|
|
template:
|
|
- sensor:
|
|
- name: Master Bedroom Heat Pump Profile Tile
|
|
unique_id: master_bedroom_heat_pump_profile_tile
|
|
state: "{{ states('input_select.master_bedroom_heat_pump_profile') }}"
|
|
icon: >
|
|
{% set p = states('input_select.master_bedroom_heat_pump_profile') %}
|
|
{% if p == 'Boost' %}
|
|
mdi:rocket-launch
|
|
{% elif p == 'Quiet' %}
|
|
mdi:leaf
|
|
{% else %}
|
|
mdi:gauge
|
|
{% endif %}
|