From 6844932ce6f9f9b8d2256bddfff629f4481888b3 Mon Sep 17 00:00:00 2001 From: Daniel Rudolf Date: Fri, 16 Oct 2026 19:07:20 +0200 Subject: [PATCH] Add `HeatingCircuit.get{Program,Reduced,Comfort,Normal,ActiveProgram}Temperature()` `get{Reduced,Comfort,Normal}Temperature()` are shortcut methods for accessing the basic target room temperatures, complementing the existing `set{Reduced,Comfort,Normal}Temperature()` methods. `getProgramTemperature()` replaces the now-deprecated `getDesiredTemperatureForProgram()`. `getActiveProgramTemperature()` replaces the now-deprecated `getCurrentDesiredTemperature()` and additionally supports holiday mode (#851). Other complex programs are not yet implemented and may still raise either `PyViCareNotSupportedFeatureError` or `KeyError`. All temperature getters and setters now also support the program names used by reversible heat pumps (e.g., `"reducedHeating"` instead of `"reduced"`). Fixes #851 --- PyViCare/PyViCareHeatingDevice.py | 65 ++++++++++++++++++++++++------- README.md | 7 ++-- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/PyViCare/PyViCareHeatingDevice.py b/PyViCare/PyViCareHeatingDevice.py index 17f02ac3..dbe78d7e 100644 --- a/PyViCare/PyViCareHeatingDevice.py +++ b/PyViCare/PyViCareHeatingDevice.py @@ -1,6 +1,8 @@ from contextlib import suppress from typing import Any +from deprecated import deprecated + from PyViCare.PyViCareDevice import Device from PyViCare.PyViCareHeatCurveCalculation import ( heat_curve_formular_variant1, @@ -440,6 +442,26 @@ def setMode(self, mode): f"heating.circuits.{self.circuit}.operating.modes.active", "setMode", {'mode': mode}) return r + @handleNotSupported + def getProgramTemperature(self, program: str): + feature = self.getProperty(f"heating.circuits.{self.circuit}.operating.programs.{program}") + return feature["properties"]["temperature"]["value"] + + @handleNotSupported + def getReducedTemperature(self): + program = "reducedHeating" if "reducedHeating" in self.getPrograms() else "reduced" + return self.getProgramTemperature(program) + + @handleNotSupported + def getComfortTemperature(self): + program = "comfortHeating" if "comfortHeating" in self.getPrograms() else "comfort" + return self.getProgramTemperature(program) + + @handleNotSupported + def getNormalTemperature(self): + program = "normalHeating" if "normalHeating" in self.getPrograms() else "normal" + return self.getProgramTemperature(program) + def setProgramTemperature(self, program: str, temperature: float): # Works for normal, reduced, comfort # active has no action @@ -463,13 +485,16 @@ def setProgramTemperature(self, program: str, temperature: float): "setTemperature", {'targetTemperature': float(temperature)}) def setReducedTemperature(self, temperature): - return self.setProgramTemperature("reduced", temperature) + program = "reducedHeating" if "reducedHeating" in self.getPrograms() else "reduced" + return self.setProgramTemperature(program, temperature) def setComfortTemperature(self, temperature): - return self.setProgramTemperature("comfort", temperature) + program = "comfortHeating" if "comfortHeating" in self.getPrograms() else "comfort" + return self.setProgramTemperature(program, temperature) def setNormalTemperature(self, temperature): - return self.setProgramTemperature("normal", temperature) + program = "normalHeating" if "normalHeating" in self.getPrograms() else "normal" + return self.setProgramTemperature(program, temperature) @handleNotSupported def getActive(self): @@ -483,6 +508,20 @@ def getName(self): def getType(self): return self.getProperty(f"heating.circuits.{self.circuit}")["properties"]["type"]["value"] + @handleNotSupported + def getActiveProgramTemperature(self): + active_program = self.getActiveProgram() + try: + feature = self.getProperty(f"heating.circuits.{self.circuit}.operating.programs.{active_program}") + return feature["properties"]["temperature"]["value"] + except (PyViCareNotSupportedFeatureError, KeyError): + match active_program: + case "standby": + return None + case "holiday": + return self.getReducedTemperature() + raise + @handleNotSupported def getActiveProgramMinTemperature(self): active_program = self.getActiveProgram() @@ -542,7 +581,8 @@ def activateProgram(self, program): {}) def activateComfort(self): - return self.activateProgram("comfort") + program = "comfortHeating" if "comfortHeating" in self.getPrograms() else "comfort" + return self.activateProgram(program) def deactivateProgram(self, program): """ Deactivate a program @@ -560,7 +600,8 @@ def deactivateProgram(self, program): "deactivate", {}) def deactivateComfort(self): - return self.deactivateProgram("comfort") + program = "comfortHeating" if "comfortHeating" in self.getPrograms() else "comfort" + return self.deactivateProgram(program) @handleNotSupported def getSupplyTemperature(self): @@ -659,19 +700,13 @@ def getPrograms(self): return available_programs - @handleNotSupported + @deprecated(reason="renamed, use getProgramTemperature", version="2.64.0") def getDesiredTemperatureForProgram(self, program): - return \ - self.getProperty(f"heating.circuits.{self.circuit}.operating.programs.{program}")["properties"][ - "temperature"]["value"] + return self.getProgramTemperature(program) - @handleNotSupported + @deprecated(reason="renamed, use getActiveProgramTemperature", version="2.64.0") def getCurrentDesiredTemperature(self): - active_program = self.getActiveProgram() - if active_program in ['standby']: - return None - return self.getProperty(f"heating.circuits.{self.circuit}.operating.programs.{active_program}")[ - "properties"]["temperature"]["value"] + return self.getActiveProgramTemperature() @handleNotSupported def getFrostProtectionActive(self): diff --git a/README.md b/README.md index ec9572ea..22c9434c 100644 --- a/README.md +++ b/README.md @@ -92,12 +92,11 @@ print(circuit.getHeatingCurveSlope()) print(circuit.getActiveProgram()) print(circuit.getPrograms()) -print(circuit.getCurrentDesiredTemperature()) -print(circuit.getDesiredTemperatureForProgram("comfort")) +print(circuit.getActiveProgramTemperature()) +print(circuit.getProgramTemperature("comfort")) print(circuit.getActiveMode()) -print(circuit.getDesiredTemperatureForProgram("comfort")) -print(circuit.setProgramTemperature("comfort",21)) +print(circuit.setProgramTemperature("comfort", 21)) print(circuit.activateProgram("comfort")) print(circuit.deactivateComfort())