Explorar el Código

Add Poolsana InverPRESTIGE PRO pool heat pump (#5348)

* Add Poolsana InverPRESTIGE PRO pool heat pump

Supports the Poolsana InverPRESTIGE PRO inverter pool heat pump
(Tuya protocol 3.5, product ID qmht2j30hapasy87, purchased 2025/2026).

Key differences from the existing poolsana_heatpump.yaml (InverPower Next):
- Operating modes use preset_mode on the climate entity: Smart/Powerful/Silent
  heating and cooling plus Auto (DPs 1+4 via constraint/conditions)
- Fault bitmap is on DP21 (not DP15 as on the InverPower Next); includes
  description mapping for all known fault codes
- 14 diagnostic sensors on DPs 101-115: water inlet/outlet, ambient, exhaust,
  suction, heating/cooling coil temperatures, EEV steps, compressor current,
  heat sink, DC bus voltage, compressor frequency, DC fan speed, PCB version
- DP15 is present in device status but is a legacy duplicate of the water
  inlet temperature (DP3/DP101); kept as a hidden optional sensor

* Fix CI: wrap comment lines to 80 chars, use ambient_temperature translation_key

* Address review feedback on Poolsana InverPRESTIGE PRO heat pump

- Generic top-level name; branding moved to products block
- Preset mode values use translation_keys (smart_heat/cool, quick_heat/cool,
  quiet_heat/cool, auto)
- Hidden sub-modes (h_powerful, h_silent, c_powerful, c_silent) in
  hvac_mode conditions so heat/cool/auto remain the selectable HVAC modes
- Remove redundant temperature_unit DP13 (unit: C already hardcoded)
- Remove icon from climate entity
- Remove name from binary_sensor (fault)
- Remove duplicate standalone Fault code sensor; DP21 fault_code stays as
  attribute on binary_sensor
- Move PCB version (DP115) from standalone sensor to attribute on
  binary_sensor

* Fix trailing blank line to pass YAML lint

* fix(poolsana_interprestige_pro_heatpump): remove punctuation from entity name

Risk if someone enables this then exports to another system like NodeRed, MQTT etc that punctuation in the name may cause problems.
There is no name clash, so removing "(legacy)" is OK (comments take care of informing that)

* Fix icon formatting for DC fan speed sensor

---------

Co-authored-by: Jason Rumney <make-all@users.noreply.github.com>
lsteffen hace 1 semana
padre
commit
27e6e98b3e

+ 300 - 0
custom_components/tuya_local/devices/poolsana_inverprestige_pro_heatpump.yaml

@@ -0,0 +1,300 @@
+name: Pool heat pump
+
+products:
+  - id: qmht2j30hapasy87
+    manufacturer: Poolsana
+    model: InverPrestige Pro
+
+entities:
+  - entity: climate
+    translation_key: pool_heatpump
+    dps:
+      - id: 1
+        type: boolean
+        name: hvac_mode
+        mapping:
+          - dps_val: false
+            value: "off"
+          - dps_val: true
+            constraint: preset_mode
+            conditions:
+              - dps_val: heat
+                value: heat
+              - dps_val: h_powerful
+                value: heat
+                hidden: true
+              - dps_val: h_silent
+                value: heat
+                hidden: true
+              - dps_val: cool
+                value: cool
+              - dps_val: c_powerful
+                value: cool
+                hidden: true
+              - dps_val: c_silent
+                value: cool
+                hidden: true
+              - dps_val: auto
+                value: auto
+      - id: 2
+        type: integer
+        name: temperature
+        unit: C
+        range:
+          min: 5
+          max: 40
+      - id: 3
+        type: integer
+        name: current_temperature
+        unit: C
+      - id: 4
+        type: string
+        name: preset_mode
+        mapping:
+          - dps_val: heat
+            value: smart_heat
+          - dps_val: h_powerful
+            value: quick_heat
+          - dps_val: h_silent
+            value: quiet_heat
+          - dps_val: cool
+            value: smart_cool
+          - dps_val: c_powerful
+            value: quick_cool
+          - dps_val: c_silent
+            value: quiet_cool
+          - dps_val: auto
+            value: auto
+
+  - entity: binary_sensor
+    class: problem
+    category: diagnostic
+    dps:
+      - id: 21
+        type: bitfield
+        name: sensor
+        mapping:
+          - dps_val: 0
+            value: false
+          - value: true
+      - id: 21
+        type: bitfield
+        name: fault_code
+      - id: 21
+        type: bitfield
+        name: description
+        mapping:
+          - dps_val: 0
+            value: OK
+          - dps_val: 1
+            value: compressor_overcurrent
+          - dps_val: 2
+            value: compressor_out_of_sync
+          - dps_val: 8
+            value: compressor_phase_loss
+          - dps_val: 16
+            value: dc_voltage_low
+          - dps_val: 32
+            value: dc_voltage_high
+          - dps_val: 257
+            value: communication_error
+          - dps_val: 258
+            value: ac_phase_loss
+          - dps_val: 260
+            value: ac_overcurrent
+          - dps_val: 288
+            value: ipm_overheat
+          - dps_val: 320
+            value: compressor_current_protection
+          - dps_val: 384
+            value: pfc_overheat
+      - id: 115
+        type: integer
+        name: pcb_version
+        optional: true
+
+  # DP15 is a legacy duplicate of the water inlet temperature (same
+  # physical sensor as DP3 and DP101). On most other Tuya pool heat
+  # pumps DP15 is the fault bitmap, but on this firmware fault moved
+  # to DP21 and DP15 was repurposed. Use DP101 as the authoritative
+  # inlet sensor.
+  - entity: sensor
+    name: Pool temperature
+    class: temperature
+    category: diagnostic
+    hidden: true
+    dps:
+      - id: 15
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  # Query list mapping from the Smart Life app screenshots:
+  - entity: sensor
+    name: Water inlet temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 101
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: Water outlet temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 102
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    translation_key: ambient_temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 103
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: Exhaust temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 104
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: Suction temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 105
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: Heating coil temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 106
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: Cooling coil temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 107
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: Steps of main EEV
+    category: diagnostic
+    dps:
+      - id: 108
+        type: integer
+        name: sensor
+        optional: true
+        unit: step
+        class: measurement
+
+  - entity: sensor
+    name: Not available steps
+    category: diagnostic
+    hidden: true
+    dps:
+      - id: 109
+        type: integer
+        name: sensor
+        optional: true
+        unit: step
+        class: measurement
+
+  - entity: sensor
+    name: Compressor current
+    class: current
+    category: diagnostic
+    dps:
+      - id: 110
+        type: integer
+        name: sensor
+        optional: true
+        unit: A
+        class: measurement
+
+  - entity: sensor
+    name: Heat sink temperature
+    class: temperature
+    category: diagnostic
+    dps:
+      - id: 111
+        type: integer
+        name: sensor
+        optional: true
+        unit: C
+        class: measurement
+
+  - entity: sensor
+    name: DC bus voltage
+    class: voltage
+    category: diagnostic
+    dps:
+      - id: 112
+        type: integer
+        name: sensor
+        optional: true
+        unit: V
+        class: measurement
+
+  - entity: sensor
+    name: Compressor frequency
+    class: frequency
+    category: diagnostic
+    dps:
+      - id: 113
+        type: integer
+        name: sensor
+        optional: true
+        unit: Hz
+        class: measurement
+
+  - entity: sensor
+    name: DC fan speed
+    category: diagnostic
+    icon: "mdi:fan"
+    dps:
+      - id: 114
+        type: integer
+        name: sensor
+        optional: true
+        unit: rpm
+        class: measurement