Skip to content

Commit

Permalink
* Some fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
BenPru committed Nov 30, 2023
1 parent 04d6f60 commit 8735f7a
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 75 deletions.
9 changes: 6 additions & 3 deletions custom_components/luxtronik/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
from typing import Any

from homeassistant.backports.enum import StrEnum
from homeassistant.components.number import NumberEntityDescription
from homeassistant.components.sensor import RestoreSensor, SensorEntityDescription
from homeassistant.components.sensor.const import SensorDeviceClass, SensorStateClass
from homeassistant.components.water_heater import STATE_HEAT_PUMP
from homeassistant.const import STATE_OFF, UnitOfTemperature, UnitOfTime
from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.restore_state import RestoreEntity
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util import dt as dt_util
Expand Down Expand Up @@ -98,9 +100,10 @@ def __init__(

def enrich_description(self, d: LuxtronikEntityDescription) -> None:
d.key = d.luxtronik_key.name.lower()
d.icon = d.icon or UNIT_ICON_MAP.get(d.native_unit_of_measurement)
d.state_class = d.state_class or UNIT_STATE_CLASS_MAP.get(d.native_unit_of_measurement)
d.device_class = d.device_class or UNIT_DEVICE_CLASS_MAP.get(d.native_unit_of_measurement)
if isinstance(d, NumberEntityDescription) or isinstance(d, SensorEntityDescription):
d.icon = d.icon or UNIT_ICON_MAP.get(d.native_unit_of_measurement)
d.state_class = d.state_class or UNIT_STATE_CLASS_MAP.get(d.native_unit_of_measurement)
d.device_class = d.device_class or UNIT_DEVICE_CLASS_MAP.get(d.native_unit_of_measurement)

async def async_added_to_hass(self) -> None:
"""When entity is added to hass."""
Expand Down
9 changes: 5 additions & 4 deletions custom_components/luxtronik/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from .const import (
Calculation_SensorKey as LC,
Parameter_SensorKey as LP,
Parameter_Config_SensorKey as LPC,
Visibility_SensorKey as LV,
CONF_COORDINATOR,
CONF_HA_SENSOR_INDOOR_TEMPERATURE,
Expand Down Expand Up @@ -113,23 +114,23 @@
luxtronik_action_active=LuxOperationMode.heating.value,
# luxtronik_key_target_temperature_high=LP,
# luxtronik_key_target_temperature_low=LP,
luxtronik_key_correction_factor=LP.HEATING_ROOM_TEMPERATURE_IMPACT_FACTOR,
luxtronik_key_correction_factor=LPC.HEATING_ROOM_TEMPERATURE_IMPACT_FACTOR,
luxtronik_key_correction_target=LP.HEATING_TARGET_CORRECTION,
icon_by_state=LUX_STATE_ICON_MAP,
temperature_unit=UnitOfTemperature.CELSIUS,
visibility=LV.FLOW_IN_TEMPERATURE,
device_key=DeviceKey.heating,
),
LuxtronikClimateDescription(
key=SensorKey.COOLING,
key='cooling', # SensorKey.COOLING,
luxtronik_key=LP.MODE_COOLING,
hvac_modes=[HVACMode.COOL, HVACMode.OFF],
hvac_mode_mapping=HVAC_MODE_MAPPING_COOL,
hvac_action_mapping=HVAC_ACTION_MAPPING_COOL,
preset_modes=[PRESET_NONE],
supported_features=ClimateEntityFeature.TARGET_TEMPERATURE,
luxtronik_key=LP.MODE_COOLING,
# luxtronik_key_current_temperature=LC.C0227_ROOM_THERMOSTAT_TEMPERATURE,
luxtronik_key_target_temperature=LP.COOLING_OUTDOOR_TEMP_THRESHOLD,
luxtronik_key_target_temperature=LPC.COOLING_OUTDOOR_TEMP_THRESHOLD,
# luxtronik_key_has_target_temperature=LP
luxtronik_key_current_action=LC.STATUS,
luxtronik_action_active=LuxOperationMode.cooling.value,
Expand Down
4 changes: 3 additions & 1 deletion custom_components/luxtronik/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,9 +439,11 @@ class Parameter_Config_SensorKey(IntEnum):
HEATING_CIRCUIT2_CURVE1_TEMPERATURE: Final = 14 # ID_Einst_HzMK1E_akt 260
HEATING_CIRCUIT2_CURVE2_TEMPERATURE: Final = 15 # ID_Einst_HzMK1ANH_akt 290
HEATING_CIRCUIT2_CURVE_NIGHT_TEMPERATURE: Final = 16 # ID_Einst_HzMK1ABS_akt 0
HEATSOURCE_DEFROST_AIR_THRESHOLD_TEMPERATURE: Final = (
# OutdoorTemp > 15 C° -> no defrost
HEATSOURCE_DEFROST_AIR_THRESHOLD_TEMPERATURE: Final = ( # 70 -> 7.0 C° - Über 7 C° Luftabtauung erlaubt, Unter 7 C° Abtauung nur über Kreisumkehr?
44 # ID_Einst_TLAbt_akt" heatSourceDefrostAirThreshold # "temp. air defrost" 7.0 C°
)
# "45 ID_Einst_LAbtTime_akt": "10",
DHW_THERMAL_DESINFECTION_TARGET: Final = 47 # ID_Einst_LGST_akt
PUMP_OPTIMIZATION: Final = 49 # ID_Einst_Popt_akt
# P0033_ROOM_THERMOSTAT_TYPE: Final = "parameters.ID_Einst_RFVEinb_akt" # != 0 --> Has_Room_Temp
Expand Down
30 changes: 17 additions & 13 deletions custom_components/luxtronik/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
DeviceKey,
Calculation_SensorKey as LC,
LuxMkTypes,
Parameter_All_SensorKey as LPA,
Parameter_Static_SensorKey as LPS,
Parameter_Calc_SensorKey as LPCalc,
Parameter_Config_SensorKey as LPC,
Parameter_SensorKey as LP,
Visibility_SensorKey as LV,
)
Expand Down Expand Up @@ -303,8 +307,8 @@ def _build_device_info(
@property
def serial_number(self) -> str:
"""Return the serial number."""
serial_number_date = self.get_value(LP.SERIAL_NUMBER)
serial_number_hex = hex(int(self.get_value(LP.SERIAL_NUMBER_MODEL)))
serial_number_date = self.get_value(LPS.SERIAL_NUMBER)
serial_number_hex = hex(int(self.get_value(LPS.SERIAL_NUMBER_MODEL)))
return f"{serial_number_date}-{serial_number_hex}".replace("x", "")

@property
Expand All @@ -326,11 +330,11 @@ def manufacturer(self) -> str | None:
@property
def firmware_version(self) -> str:
"""Return the heatpump firmware version."""
# return str(self.get_value(LC.FIRMWARE_VERSION))
value = []
for i in range(LC.FIRMWARE_VERSION.value, LC.FIRMWARE_VERSION.value + 9):
value.append(self.get_value(i))
return "".join([chr(c) for c in value]).strip("\x00")
return str(self.get_value(LC.FIRMWARE_VERSION))
# value = []
# for i in range(LC.FIRMWARE_VERSION.value, LC.FIRMWARE_VERSION.value + 9):
# value.append(self.get_value(i))
# return "".join([chr(c) for c in value]).strip("\x00")

@property
def firmware_version_minor(self) -> int:
Expand Down Expand Up @@ -419,7 +423,7 @@ def has_domestic_water(self) -> bool:
"""Is domestic water activated."""
return bool(self.get_value(LV.DHW_TEMPERATURE))

def get_value(self, sensor_id: LP | LC | LV | int):
def get_value(self, sensor_id: LPA | LC | LV | int):
"""Get a sensor value from Luxtronik."""
# sensor = self.get_sensor_by_id(str(group_sensor_id))
sensor = self.get_sensor_by_id(sensor_id)
Expand All @@ -429,7 +433,7 @@ def get_value(self, sensor_id: LP | LC | LV | int):
# return correct_key_value(sensor.value, self.data, group_sensor_id)

# def get_sensor_by_id(self, group_sensor_id: str):
def get_sensor_by_id(self, sensor_id: LP | LC | LV | int):
def get_sensor_by_id(self, sensor_id: LPA | LC | LV | int):
"""Get a sensor object by id from Luxtronik."""
# try:
# group = group_sensor_id.split(".")[0]
Expand All @@ -440,7 +444,7 @@ def get_sensor_by_id(self, sensor_id: LP | LC | LV | int):

# def get_sensor(self, group, sensor_id):
"""Get sensor by configured sensor ID."""
if isinstance(sensor_id, LP): # == CONF_PARAMETERS:
if isinstance(sensor_id, LPA) or isinstance(sensor_id, LPS) or isinstance(sensor_id, LP) or isinstance(sensor_id, LPC) or isinstance(sensor_id, LPCalc): # == CONF_PARAMETERS:
# sensor = self.client.parameters[sensor_id.value]
return self.client.parameters.get(sensor_id.value)
elif isinstance(sensor_id, LV): #group == CONF_VISIBILITIES:
Expand All @@ -451,7 +455,7 @@ def get_sensor_by_id(self, sensor_id: LP | LC | LV | int):
return self.client.visibilities.get(sensor_id.value)
elif isinstance(sensor_id, int):
# sensor = self.client.calculations[sensor_id]
return self.client.calculations.get(sensor_id.value)
return self.client.calculations.get(sensor_id)

def _detect_cooling_mk(self):
"""We iterate over the mk sensors, detect cooling and return a list of parameters that are may show cooling is enabled."""
Expand All @@ -470,7 +474,7 @@ def _detect_solar_present(self) -> bool:
"""Detect and returns True if solar is present."""
return (
bool(self.get_value(LV.SOLAR))
or self.get_value(LP.SOLAR_OPERATION_HOURS) > 0.01 # noqa: W503
or self.get_value(LPCalc.SOLAR_OPERATION_HOURS) > 0.01 # noqa: W503
or (
bool(self.get_value(LV.SOLAR_COLLECTOR)) # noqa: W503
and float(
Expand All @@ -490,7 +494,7 @@ def _detect_solar_present(self) -> bool:
def _detect_dhw_circulation_pump_present(self) -> bool:
"""Detect and returns True if solar is present."""
try:
return int(self.get_value(LP.DHW_CHARGING_PUMP)) != 1
return int(self.get_value(LPCalc.DHW_CHARGING_PUMP)) != 1
except Exception: # pylint: disable=broad-except
return False

Expand Down
Loading

0 comments on commit 8735f7a

Please sign in to comment.