###########################################
# ======================
# GLOBAL/MULTI-MODE SENSORS
# ======================
# ======================
# GLOBAL - Altherma Global - ULTIMATE SYSTEM COP
# ======================
# DOEL:
# De meest accurate systeem-efficiëntie berekening mogelijk voor Daikin Altherma 3.
# Berekent de werkelijke "System COP" (wat je betaalt vs. wat je krijgt).
#
# METHODE (v2.5.x):
# In plaats van te schatten hoeveel warmte de BUH toevoegt, meten we dit nu fysiek.
# • Thermische Output: Gemeten via sensor NA de backup heater.
# • Elektrische Input: Som van Compressor + Backup Heater.
#
# FORMULE:
# COP = (Flow × 0.0696 × ΔT_System) ÷ (Elektrisch_Comp + Elektrisch_BUH)
# * ΔT_System = (Temp NA BUH - Retour Temp)
#
# FEATURES:
# 1. Hybrid Measurement: Meet correct of de warmte van de compressor, de BUH, of beide komt.
# 2. 12kW Tuning: Ondersteunt flow rates tot 60 L/min (standaard sensoren kappen af op 25).
# 3. Partial Load Capture: Ondersteunt CoP tot 8.0 voor mild weer/deellast.
# 4. Defrost Detectie: Zet CoP op 0.0 tijdens ontdooien (geen nuttige warmte).
# 5. Directe Feedback: Geeft direct inzicht in impact van BUH op rendement.
# 6. Volledige Attributen: Behoudt alle dashboard-data (Volt, Amp, Flow, Modus, etc.).
#
# TYPISCHE WAARDEN (12kW Model):
# • Compressor only: CoP 3.5 - 6.0
# • Hybrid (Comp + BUH): CoP 2.0 - 3.0 (Tijdens SWW of extreme kou)
# • Defrost: CoP 0.0
#
# VERSION HISTORY:
# v2.5.3 - FIX: Power calculation consistency - use direct power sensor instead of calculated
# v2.5.2 - Added Performance Guidelines to calculation note
# v2.5.1 - Restored all original attributes with updated logic
# v2.5.0 - ULTIMATE: Overstap naar fysieke meting NA BUH (geen schattingen meer)
# v2.4.0 - System Efficiency: BUH elektrisch meegerekend in input
# v2.3.3 - Toegevoegd: Equipment Model informatie in attributen
# v2.3.2 - Fix: Scope errors in attributen opgelost
# v2.3.1 - Fix: Flow limiet verhoogd naar 60 L/min voor 12kW unit
# v2.3.0 - Toegevoegd: Outdoor temperatuur context
# v2.2.0 - Toegevoegd: BUH detectie en power stability check
# v2.0.0 - Major rewrite met universele ΔT validatie
# ======================
template:
- sensor:
name: "Altherma Global - COP"
unique_id: "altherma_global_cop"
unit_of_measurement: "COP"
state_class: "measurement"
device_class: "power_factor"
state: >-
{% set flow = state_attr('sensor.althermasensors', 'Flow sensor (l/min)') | float(0) %}
{% set temp_out = states('sensor.espaltherma_leaving_after_buh') | float(0) %}
{% set temp_in = state_attr('sensor.althermasensors', 'Inlet water temp.(R4T)') | float(0) %}
{% set comp_power_w = states('sensor.warmtepomp_power') | float(0) %}
{% set comp_power_kw = comp_power_w / 1000 %}
{% set buh_power_w = states('sensor.weerstand_power') | float(0) %}
{% set buh_power_kw = buh_power_w / 1000 %}
{% set total_elec_kw = comp_power_kw + buh_power_kw %}
{% set defrost = is_state('sensor.daikin_defrost_operation', 'ON') %}
{% set power_stable = comp_power_w > 50 and comp_power_w < 8000 %}
{% set valid_flow = flow > 5 and flow < 65 %}
{% set valid_temps = temp_out > 10 and temp_out < 70 and temp_in > 5 and temp_in < 65 %}
{% set delta_t = (temp_out - temp_in) | abs %}
{% set total_thermal_kw = flow * 0.0696 * delta_t %}
{% if not defrost and total_elec_kw > 0.05 and valid_flow and valid_temps and power_stable %}
{% set cop = total_thermal_kw / total_elec_kw %}
{% if cop <= 20.0 %}
{{ cop | round(3) }}
{% else %}
0.0
{% endif %}
{% else %}
0.0
{% endif %}
attributes:
operation_mode: >-
{% set temp_out = states('sensor.espaltherma_leaving_after_buh') | float(0) %}
{% set temp_in = state_attr('sensor.althermasensors', 'Inlet water temp.(R4T)') | float(0) %}
{% set delta_t = temp_out - temp_in %}
{% set defrost_active = is_state('sensor.daikin_defrost_operation', 'ON') %}
{% set buh_active = is_state('binary_sensor.daikin_backup_heater', 'on') or states('sensor.weerstand_power') | float(0) > 100 %}
{% if defrost_active %}
Defrost Active
{% elif buh_active and delta_t > 1.0 %}
Heating (Hybrid/BUH)
{% elif delta_t > 1.0 %}
Heating
{% elif delta_t < -1.0 %}
Cooling
{% else %}
Standby (ΔT: {{ delta_t | round(1) }}°C)
{% endif %}
flow_rate: >-
{% set val = state_attr('sensor.althermasensors', 'Flow sensor (l/min)') | float(0) %}
{% if val > 5 and val < 65 %}
{{ val | round(1) }} L/min
{% else %}
Invalid ({{ val | round(1) }})
{% endif %}
leaving_temp: >-
{{ states('sensor.espaltherma_leaving_after_buh') | float(0) | round(1) }} °C (After BUH)
inlet_temp: >-
{{ state_attr('sensor.althermasensors', 'Inlet water temp.(R4T)') | float(0) | round(1) }} °C
delta_t: >-
{% set temp_out = states('sensor.espaltherma_leaving_after_buh') | float(0) %}
{% set temp_in = state_attr('sensor.althermasensors', 'Inlet water temp.(R4T)') | float(0) %}
{{ (temp_out - temp_in) | abs | round(1) }} °C
thermal_power: >-
{% set flow = state_attr('sensor.althermasensors', 'Flow sensor (l/min)') | float(0) %}
{% set temp_out = states('sensor.espaltherma_leaving_after_buh') | float(0) %}
{% set temp_in = state_attr('sensor.althermasensors', 'Inlet water temp.(R4T)') | float(0) %}
{% set delta_t = (temp_out - temp_in) | abs %}
{{ (flow * 0.0696 * delta_t) | round(2) }} kW
electrical_input: >-
{% set comp_kw = states('sensor.warmtepomp_power') | float(0) / 1000 %}
{% set buh_kw = states('sensor.weerstand_power') | float(0) / 1000 %}
{{ (comp_kw + buh_kw) | round(2) }} kW (Comp + BUH)
current: "{{ states('sensor.warmtepomp_current') }} A"
voltage: "{{ states('sensor.warmtepomp_voltage') }} V"
power_factor: "{{ states('sensor.warmtepomp_power_factor') | default('0.92') }}"
warmtepomp_power: "{{ states('sensor.warmtepomp_power') | float(0) | round(1) }} W"
freeze_protection: "{{ state_attr('sensor.althermasensors', 'Freeze Protection') | default('Unknown') }}"
defrost_operation: "{{ states('sensor.daikin_defrost_operation') | default('Unknown') }}"
backup_heater_active: >-
{{ is_state('binary_sensor.daikin_backup_heater', 'on') or states('sensor.weerstand_power') | float(0) > 100 }}
buh_power: "{{ states('sensor.weerstand_power') | default('0') }} W"
power_stable: >-
{{ states('sensor.warmtepomp_power') | float(0) > 50 and states('sensor.warmtepomp_power') | float(0) < 8000 }}
outdoor_temperature: "{{ states('sensor.bt_carport_temperature') | default('Unknown') }} °C"
performance_context: >-
{% set flow = state_attr('sensor.althermasensors', 'Flow sensor (l/min)') | float(0) %}
{% set temp_out = states('sensor.espaltherma_leaving_after_buh') | float(0) %}
{% set temp_in = state_attr('sensor.althermasensors', 'Inlet water temp.(R4T)') | float(0) %}
{% set delta_t = (temp_out - temp_in) | abs %}
{% set therm = flow * 0.0696 * delta_t %}
{% set elec = (states('sensor.warmtepomp_power')|float / 1000) + (states('sensor.weerstand_power')|float / 1000) %}
{% if elec > 0.05 and flow > 5 %}
{% set real_cop = therm / elec %}
{% if real_cop == 0 %}Standby
{% elif real_cop < 2.5 %}Low Efficiency (Check BUH/Weather)
{% elif real_cop < 4.0 %}Good
{% else %}Excellent
{% endif %}
{% else %}
Standby
{% endif %}
calculation_active: >-
{% set flow = state_attr('sensor.althermasensors', 'Flow sensor (l/min)') | float(0) %}
{% set power = states('sensor.warmtepomp_power') | float(0) %}
{{ flow > 5 and power > 50 }}
data_quality: >-
{% set flow = state_attr('sensor.althermasensors', 'Flow sensor (l/min)') | float(0) %}
{% set temp = states('sensor.espaltherma_leaving_after_buh') | float(0) %}
{% if flow > 5 and flow < 65 and temp > 10 and temp < 70 %}Good{% else %}Poor/Idle{% endif %}
cop_calculation_note: "Guidelines (Heating LWT 35°C): • Excellent: > 5.0 (Mild +12°C) • Good: 4.0 - 5.0 (Nominal +7°C) • Normal: 3.0 - 4.0 (Cold +2°C) • Fair: 2.2 - 3.0 (Freeze -7°C) • Poor: < 2.2 (BUH Active or Issue)"
system_info: "ETVX12S23EJ6V + EPRA12EAV3, 12 kW (2023)"
version: "2.5.3"
availability: >-
{{ states('sensor.althermasensors') not in ['unavailable', 'unknown', 'none'] and states('sensor.espaltherma_leaving_after_buh') not in ['unavailable', 'unknown', 'none'] and states('sensor.warmtepomp_power') not in ['unavailable', 'unknown', 'none'] }}