Skip to content

Commit

Permalink
Added additional temperature and operational time sensors
Browse files Browse the repository at this point in the history
  • Loading branch information
klejejs committed Jan 20, 2022
1 parent e77a3fb commit 0198860
Show file tree
Hide file tree
Showing 7 changed files with 433 additions and 127 deletions.
26 changes: 24 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,35 @@ See [example.py](https://github.com/klejejs/python-thermia-online-api/blob/main/
| `heat_min_temperature_value` | Minimum temperature value possible for Heat Pump to set |
| `heat_max_temperature_value` | Maximum temperature value possible for Heat Pump to set |
| `heat_temperature_step` | Step value for temperature setting |
| --- | --- |
| Other temperatures | |
| `supply_line_temperature` | Supply line temperature in Celsius |
| `desired_supply_line_temperature` | Desired supply line temperature in Celsius |
| `return_line_temperature` | Return line temperature in Celsius |
| `brine_out_temperature` | Brine out temperature in Celsius |
| `brine_in_temperature` | Brine in temperature in Celsius |
| `cooling_tank_temperature` | Cooling tank temperature in Celsius |
| `cooling_supply_line_temperature` | Cooling supply line temperature in Celsius |
| --- | --- |
| Operational Times | |
| `compressor_operational_time` | Compressor operational time in hours |
| `hot_water_operational_time` | Hot water operational time in hours |
| `auxiliary_heater_1_operational_time` | Auxiliary heater 1 operational time in hours |
| `auxiliary_heater_2_operational_time` | Auxiliary heater 2 operational time in hours |
| `auxiliary_heater_3_operational_time` | Auxiliary heater 3 operational time in hours |
| --- | --- |
| Alarms data | |
| `active_alarm_count` | Number of active alarms on the Heat Pump |
| `active_alarms` | List of titles of active alarms on the Heat Pump |
| --- | --- |
| Operation Mode data | |
| `operation_mode` | Current operation mode of the Heat Pump |
| `available_operation_modes` | List of available operation modes for the Heat Pump |
| `available_operation_mode_map` | Dictionary mapping operation mode names to their values |
| --- | --- |
| Hot Water data | |
| `is_operation_mode_read_only` | Boolean value indicating if the Heat Pump operation mode is read-only |
| `is_hot_water_switch_available` | Boolean value indicating if the Heat Pump has a hot water switch |
| `active_alarm_count` | Number of active alarms on the Heat Pump |
| `active_alarms` | List of titles of active alarms on the Heat Pump |

## Available functions within ThermiaHeatPump class:
| Function | Description |
Expand Down
131 changes: 46 additions & 85 deletions ThermiaOnlineAPI/api/ThermiaAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@
from datetime import datetime
import requests

from ThermiaOnlineAPI.const import (
REG_GROUP_HOT_WATER,
REG_GROUP_OPERATIONAL_OPERATION,
REG_GROUP_OPERATIONAL_TIME,
REG_GROUP_TEMPERATURES,
REGISTER_GROUPS,
THERMIA_API_CONFIG_URLS_BY_API_TYPE,
THERMIA_INSTALLATION_PATH,
)


from ..exceptions.AuthenticationException import AuthenticationException
from ..exceptions.NetworkException import NetworkException
from ..model.HeatPump import ThermiaHeatPump

_LOGGER = logging.getLogger(__name__)

THERMIA_CLASSIC_API_CONFIG_URL = "https://online.thermia.se/api/configuration"
THERMIA_GENESIS_API_CONFIG_URL = "https://online-genesis.thermia.se/api/configuration"

THERMIA_INSTALLATION_PATH = "/api/v1/Registers/Installations/"

THERMIA_API_CONFIG_URLS_BY_API_TYPE = {
"classic": THERMIA_CLASSIC_API_CONFIG_URL,
"genesis": THERMIA_GENESIS_API_CONFIG_URL,
}


class ThermiaAPI:
def __init__(self, email, password, api_type):
Expand Down Expand Up @@ -116,66 +116,18 @@ def get_all_alarms(self, device_id: str):

return request.json()

def get_temperature_status(self, device: ThermiaHeatPump):
self.__check_token_validity()
def get__group_temperatures(self, device_id: str):
return self.__get_register_group(device_id, REG_GROUP_TEMPERATURES)

url = (
self.configuration["apiBaseUrl"]
+ THERMIA_INSTALLATION_PATH
+ str(device.id)
+ "/Groups/REG_GROUP_TEMPERATURES"
)
request = requests.get(url, headers=self.__default_request_headers)
status = request.status_code
def get__group_operational_time(self, device_id: str):
return self.__get_register_group(device_id, REG_GROUP_OPERATIONAL_TIME)

if status != 200:
_LOGGER.error(
"Error in getting device's temperature status. " + str(status)
)
return None

device_temperature_register_index = device.get_register_indexes()["temperature"]
if device_temperature_register_index is None:
_LOGGER.error(
"Error in getting device's temperature status. No temperature register index."
)
return None

data = [
d
for d in request.json()
if d["registerIndex"] == device_temperature_register_index
]

if len(data) == 0:
# Temperature status not supported
return None

data = data[0]

return {
"minValue": data["minValue"],
"maxValue": data["maxValue"],
"step": data["step"],
}

def get_operation_mode(self, device: ThermiaHeatPump):
self.__check_token_validity()

url = (
self.configuration["apiBaseUrl"]
+ THERMIA_INSTALLATION_PATH
+ str(device.id)
+ "/Groups/REG_GROUP_OPERATIONAL_OPERATION"
def get_group_operational_operation(self, device: ThermiaHeatPump):
register_data = self.__get_register_group(
device.id, REG_GROUP_OPERATIONAL_OPERATION
)
request = requests.get(url, headers=self.__default_request_headers)
status = request.status_code

if status != 200:
_LOGGER.error("Error in getting device's operation mode. " + str(status))
return None

data = [d for d in request.json() if d["registerName"] == "REG_OPERATIONMODE"]
data = [d for d in register_data if d["registerName"] == "REG_OPERATIONMODE"]

if len(data) != 1:
# Operation mode not supported
Expand Down Expand Up @@ -217,25 +169,10 @@ def get_operation_mode(self, device: ThermiaHeatPump):

return None

def get_hot_water_switch_state(self, device: ThermiaHeatPump):
self.__check_token_validity()
def get_group_hot_water(self, device: ThermiaHeatPump):
register_data = self.__get_register_group(device.id, REG_GROUP_HOT_WATER)

url = (
self.configuration["apiBaseUrl"]
+ THERMIA_INSTALLATION_PATH
+ str(device.id)
+ "/Groups/REG_GROUP_HOT_WATER"
)
request = requests.get(url, headers=self.__default_request_headers)
status = request.status_code

if status != 200:
_LOGGER.error("Error in getting device's operation mode. " + str(status))
return None

data = [
d for d in request.json() if d["registerName"] == "REG_HOT_WATER_STATUS"
]
data = [d for d in register_data if d["registerName"] == "REG_HOT_WATER_STATUS"]

if len(data) == 0:
# Hot water switch not supported
Expand Down Expand Up @@ -313,6 +250,30 @@ def set_hot_water_switch_state(
device, device_hot_water_switch_state_register_index, state
)

def __get_register_group(self, device_id: str, register_group: REGISTER_GROUPS):
self.__check_token_validity()

url = (
self.configuration["apiBaseUrl"]
+ THERMIA_INSTALLATION_PATH
+ str(device_id)
+ "/Groups/"
+ register_group
)
request = requests.get(url, headers=self.__default_request_headers)
status = request.status_code

if status != 200:
_LOGGER.error(
"Error in getting device's register group: "
+ register_group
+ ", Status: "
+ str(status)
)
return None

return request.json()

def __set_register_value(
self, device: ThermiaHeatPump, register_index: int, register_value: int
):
Expand Down Expand Up @@ -394,5 +355,5 @@ def __check_token_validity(self):
self.__token_valid_to is None
or self.__token_valid_to < datetime.now().timestamp()
):
_LOGGER.info("Token expired, reauthenticating.")
_LOGGER.info("Token expired, re-authenticating.")
self.authenticated = self.__authenticate()
91 changes: 91 additions & 0 deletions ThermiaOnlineAPI/const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
###############################################################################
# General configuration
###############################################################################

THERMIA_CLASSIC_API_CONFIG_URL = "https://online.thermia.se/api/configuration"
THERMIA_GENESIS_API_CONFIG_URL = "https://online-genesis.thermia.se/api/configuration"

THERMIA_INSTALLATION_PATH = "/api/v1/Registers/Installations/"

THERMIA_API_CONFIG_URLS_BY_API_TYPE = {
"classic": THERMIA_CLASSIC_API_CONFIG_URL,
"genesis": THERMIA_GENESIS_API_CONFIG_URL,
}

###############################################################################
# Register groups
###############################################################################

REG_GROUP_TEMPERATURES = "REG_GROUP_TEMPERATURES"
REG_GROUP_OPERATIONAL_TIME = "REG_GROUP_OPERATIONAL_TIME"
REG_GROUP_OPERATIONAL_OPERATION = "REG_GROUP_OPERATIONAL_OPERATION"
REG_GROUP_HOT_WATER = "REG_GROUP_HOT_WATER"

REGISTER_GROUPS = [
REG_GROUP_TEMPERATURES,
REG_GROUP_OPERATIONAL_TIME,
REG_GROUP_OPERATIONAL_OPERATION,
REG_GROUP_HOT_WATER,
]

###############################################################################
# Temperature registers
###############################################################################

REG_OUTDOOR_TEMPERATURE = "REG_OUTDOOR_TEMPERATURE"
REG_INDOOR_TEMPERATURE = "REG_INDOOR_TEMPERATURE"
REG_SUPPLY_LINE = "REG_SUPPLY_LINE"
REG_HOT_WATER_TEMPERATURE = "REG_HOT_WATER_TEMPERATURE"
REG_BRINE_OUT = "REG_BRINE_OUT"
REG_BRINE_IN = "REG_BRINE_IN"

###############################################################################
# Temperature registers ("classic" specific)
###############################################################################

REG_RETURN_LINE = "REG_RETURN_LINE"
REG_DESIRED_SUPPLY_LINE = "REG_DESIRED_SUPPLY_LINE"
REG_DESIRED_INDOOR_TEMPERATURE = "REG_DESIRED_INDOOR_TEMPERATURE"

###############################################################################
# Temperature registers ("genesis" specific)
###############################################################################

REG_OPER_DATA_RETURN = "REG_OPER_DATA_RETURN"
REG_DESIRED_SYS_SUPPLY_LINE_TEMP = "REG_DESIRED_SYS_SUPPLY_LINE_TEMP"
REG_COOL_SENSOR_TANK = "REG_COOL_SENSOR_TANK"
REG_COOL_SENSOR_SUPPLY = "REG_COOL_SENSOR_SUPPLY"

TEMPERATURE_REGISTERS = [
REG_OUTDOOR_TEMPERATURE,
REG_INDOOR_TEMPERATURE,
REG_SUPPLY_LINE,
REG_HOT_WATER_TEMPERATURE,
REG_BRINE_OUT,
REG_BRINE_IN,
REG_DESIRED_INDOOR_TEMPERATURE,
REG_RETURN_LINE,
REG_DESIRED_SUPPLY_LINE,
REG_OPER_DATA_RETURN,
REG_DESIRED_SYS_SUPPLY_LINE_TEMP,
REG_COOL_SENSOR_TANK,
REG_COOL_SENSOR_SUPPLY,
]

###############################################################################
# Operational time registers
###############################################################################

REG_OPER_TIME_IMM1 = "REG_OPER_TIME_IMM1" # Auxiliary heater 1
REG_OPER_TIME_IMM2 = "REG_OPER_TIME_IMM2" # Auxiliary heater 2
REG_OPER_TIME_IMM3 = "REG_OPER_TIME_IMM3" # Auxiliary heater 3
REG_OPER_TIME_COMPRESSOR = "REG_OPER_TIME_COMPRESSOR"
REG_OPER_TIME_HOT_WATER = "REG_OPER_TIME_HOT_WATER"

OPERATIONAL_TIME_REGISTERS = [
REG_OPER_TIME_IMM1,
REG_OPER_TIME_IMM2,
REG_OPER_TIME_IMM3,
REG_OPER_TIME_COMPRESSOR,
REG_OPER_TIME_HOT_WATER,
]
Loading

0 comments on commit 0198860

Please sign in to comment.