Skip to content

Commit

Permalink
Breaking Changes
Browse files Browse the repository at this point in the history
* Rename circulation_pump to domestic_water_circulation_pump or domestic_water_charging_pump (calculations.ID_WEB_BUPout).
* Rename circulation_pump_domestic_water to domestic_water_recirculation_pump.

* Added new switch 'domestic_water_circulation_pump_release' / 'domestic_water_charging_pump_release' (parameters.ID_Einst_BWZIP_akt).
* Added new status and detection 'heatpump shutdown' to distinguish between 'heatpump coming / pump forerun'.
* Added new attribute 'Last thermal desinfection' to domestic_water_thermal_desinfection_target with the last timestamp of reaching the thermal desinfection target temperature.
* Added new attribute 'switch_gap' with the delta kelvin until the heatpump starts or stops underfloor heating. (Experimental!)
* Detect domestic_water_circulation_pump or domestic_water_charging_pump present. (parameters.ID_Einst_BWZIP_akt=0 circulation_pump or =1 charging_pump).
* Read complete serial_number.

* Show evu times in sensor.luxtronik2_status now in local ha time instead of utc.
  • Loading branch information
BenPru committed Dec 22, 2022
1 parent eb05dee commit 3e145b5
Show file tree
Hide file tree
Showing 13 changed files with 157 additions and 100 deletions.
4 changes: 3 additions & 1 deletion custom_components/luxtronik/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ def setup_internal(hass, data, conf):
hass.data[f"{DOMAIN}_conf"] = conf

# Create DeviceInfos:
serial_number = luxtronik.get_value("parameters.ID_WP_SerienNummer_DATUM")
serial_number_date = luxtronik.get_value("parameters.ID_WP_SerienNummer_DATUM")
serial_number_hex = hex(int(luxtronik.get_value("parameters.ID_WP_SerienNummer_HEX")))
serial_number = f"{serial_number_date}-{serial_number_hex}".replace('x', '')
model = luxtronik.get_value("calculations.ID_WEB_Code_WP_akt")

hass.data[f"{DOMAIN}_DeviceInfo"] = build_device_info(
Expand Down
46 changes: 22 additions & 24 deletions custom_components/luxtronik/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,16 @@
from homeassistant.helpers.typing import ConfigType
from homeassistant.util import slugify

from .const import (
ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY,
CONF_CALCULATIONS,
CONF_GROUP,
CONF_INVERT_STATE,
CONF_LANGUAGE_SENSOR_NAMES,
CONF_PARAMETERS,
CONF_VISIBILITIES,
DEFAULT_DEVICE_CLASS,
DEVICE_CLASSES,
DOMAIN,
LOGGER,
LUX_BINARY_SENSOR_ADDITIONAL_CIRCULATION_PUMP,
LUX_BINARY_SENSOR_CIRCULATION_PUMP_DOMESTIC_WATER,
LUX_BINARY_SENSOR_CIRCULATION_PUMP_HEATING,
LUX_BINARY_SENSOR_EVU_UNLOCKED,
LUX_BINARY_SENSOR_SOLAR_PUMP
)
from .const import (ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY,
CONF_CALCULATIONS, CONF_GROUP, CONF_INVERT_STATE,
CONF_LANGUAGE_SENSOR_NAMES, CONF_PARAMETERS,
CONF_VISIBILITIES, DEFAULT_DEVICE_CLASS, DEVICE_CLASSES,
DOMAIN, LOGGER,
LUX_BINARY_SENSOR_ADDITIONAL_CIRCULATION_PUMP,
LUX_BINARY_SENSOR_DOMESTIC_WATER_RECIRCULATION_PUMP,
LUX_BINARY_SENSOR_CIRCULATION_PUMP_HEATING,
LUX_BINARY_SENSOR_EVU_UNLOCKED,
LUX_BINARY_SENSOR_SOLAR_PUMP)
from .helpers.helper import get_sensor_text
from .luxtronik_device import LuxtronikDevice

Expand Down Expand Up @@ -160,7 +152,7 @@ async def async_setup_entry(
text_compressor = get_sensor_text(lang, "compressor")
text_circulation_pump = get_sensor_text(lang, "circulation_pump")
text_additional_circulation_pump = get_sensor_text(lang, "additional_circulation_pump")
text_circulation_pump_domestic_water = get_sensor_text(lang, "circulation_pump_domestic_water")
text_domestic_water_recirculation_pump = get_sensor_text(lang, "domestic_water_recirculation_pump")
text_circulation_pump_heating = get_sensor_text(lang, "circulation_pump_heating")
text_pump_flow = get_sensor_text(lang, "pump_flow")
text_compressor_heater = get_sensor_text(lang, "compressor_heater")
Expand Down Expand Up @@ -262,22 +254,28 @@ async def async_setup_entry(
deviceInfoDomesticWater = hass.data[f"{DOMAIN}_DeviceInfo_Domestic_Water"]
if deviceInfoDomesticWater is not None:
text_solar_pump = get_sensor_text(lang, "solar_pump")
if luxtronik.has_domestic_water_circulation_pump:
circulation_pump_unique_id = 'domestic_water_circulation_pump'
text_domestic_water_circulation_pump = text_circulation_pump
else:
circulation_pump_unique_id = 'domestic_water_charging_pump'
text_domestic_water_circulation_pump = get_sensor_text(lang, "domestic_water_charging_pump")
entities += [
LuxtronikBinarySensor(
luxtronik=luxtronik,
deviceInfo=deviceInfoDomesticWater,
sensor_key=LUX_BINARY_SENSOR_CIRCULATION_PUMP_DOMESTIC_WATER,
unique_id="circulation_pump_domestic_water",
name=text_circulation_pump_domestic_water,
sensor_key=LUX_BINARY_SENSOR_DOMESTIC_WATER_RECIRCULATION_PUMP,
unique_id="domestic_water_recirculation_pump",
name=text_domestic_water_recirculation_pump,
icon="mdi:pump",
device_class=DEVICE_CLASS_RUNNING,
),
LuxtronikBinarySensor(
luxtronik=luxtronik,
deviceInfo=deviceInfoDomesticWater,
sensor_key='calculations.ID_WEB_ZIPout',
unique_id="circulation_pump",
name=text_circulation_pump,
unique_id=circulation_pump_unique_id,
name=text_domestic_water_circulation_pump,
icon="mdi:pump",
device_class=DEVICE_CLASS_RUNNING,
),
Expand Down
23 changes: 8 additions & 15 deletions custom_components/luxtronik/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,27 +28,20 @@
CONF_HA_SENSOR_INDOOR_TEMPERATURE,
CONF_LANGUAGE_SENSOR_NAMES, CONF_PARAMETERS,
CONF_VISIBILITIES, DEFAULT_TOLERANCE, DOMAIN, LOGGER,

LUX_BINARY_SENSOR_DOMESTIC_WATER_RECIRCULATION_PUMP,
LUX_BINARY_SENSOR_CIRCULATION_PUMP_HEATING,
LUX_SENSOR_COOLING_THRESHOLD,
LUX_SENSOR_DOMESTIC_WATER_CURRENT_TEMPERATURE,
LUX_SENSOR_DOMESTIC_WATER_TARGET_TEMPERATURE,
LUX_SENSOR_HEATING_TARGET_CORRECTION,
LUX_SENSOR_COOLING_THRESHOLD,
LUX_SENSOR_OUTDOOR_TEMPERATURE,

LUX_SENSOR_MODE_DOMESTIC_WATER,
LUX_SENSOR_MODE_HEATING,
LUX_SENSOR_MODE_COOLING,

LUX_SENSOR_MODE_COOLING, LUX_SENSOR_MODE_DOMESTIC_WATER,
LUX_SENSOR_MODE_HEATING, LUX_SENSOR_OUTDOOR_TEMPERATURE,
LUX_SENSOR_STATUS, LUX_SENSOR_STATUS1, LUX_SENSOR_STATUS3,
LUX_STATUS1_WORKAROUND, LUX_STATUS3_WORKAROUND,
LUX_STATUS_COOLING, LUX_STATUS_DEFROST,
LUX_STATUS_DOMESTIC_WATER,
LUX_STATUS_EVU,
LUX_STATUS_HEATING,
LUX_STATUS_HEATING_EXTERNAL_SOURCE,
LUX_STATUS_DOMESTIC_WATER, LUX_STATUS_EVU,
LUX_STATUS_HEATING, LUX_STATUS_HEATING_EXTERNAL_SOURCE,
LUX_STATUS_NO_REQUEST, LUX_STATUS_SWIMMING_POOL_SOLAR,
LUX_BINARY_SENSOR_CIRCULATION_PUMP_HEATING,
LUX_BINARY_SENSOR_CIRCULATION_PUMP_DOMESTIC_WATER,
PRESET_SECOND_HEATSOURCE, LuxMode)
from .helpers.helper import get_sensor_text

Expand Down Expand Up @@ -406,7 +399,7 @@ def icon(self): # -> str | None:
return result_icon

def _is__heating_on_special(self) -> bool:
return self._luxtronik.get_value(self._status_sensor) == LUX_STATUS_DEFROST and self._attr_hvac_mode != HVAC_MODE_OFF and self._luxtronik.get_value(LUX_BINARY_SENSOR_CIRCULATION_PUMP_DOMESTIC_WATER)
return self._luxtronik.get_value(self._status_sensor) == LUX_STATUS_DEFROST and self._attr_hvac_mode != HVAC_MODE_OFF and self._luxtronik.get_value(LUX_BINARY_SENSOR_DOMESTIC_WATER_RECIRCULATION_PUMP)


class LuxtronikHeatingThermostat(LuxtronikThermostat):
Expand Down
1 change: 1 addition & 0 deletions custom_components/luxtronik/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def _get_schema(self):
vol.Required(CONF_HOST, default=self._discovery_host): str,
vol.Required(CONF_PORT, default=self._discovery_port): int,
vol.Optional(CONF_CONTROL_MODE_HOME_ASSISTANT, default=False): bool,
vol.Optional(CONF_UPDATE_IMMEDIATELY_AFTER_WRITE, default=True): bool,
vol.Optional(CONF_HA_SENSOR_INDOOR_TEMPERATURE, default=f"sensor.{self._sensor_prefix}_room_temperature"): str,
vol.Optional(CONF_LANGUAGE_SENSOR_NAMES, default=LANG_DEFAULT): vol.In(
LANGUAGES_SENSOR_NAMES
Expand Down
5 changes: 3 additions & 2 deletions custom_components/luxtronik/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class LuxtronikSensorEntityDescription(SensorEntityDescription):
SECOUND_TO_HOUR_FACTOR: Final = 0.000277777777778

ATTR_STATUS_TEXT: Final = "status_text"
ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY: Final = "Luxtronik Key"
ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY: Final = "Luxtronik_Key"
ATTR_EXTRA_STATE_ATTRIBUTE_LAST_THERMAL_DESINFECTION: Final = "Last thermal desinfection"


Expand Down Expand Up @@ -149,6 +149,7 @@ class LuxMode(Enum):
LUX_STATUS1_HEATPUMP_IDLE: Final = "heatpump idle"
LUX_STATUS1_PUMP_FORERUN: Final = "pump forerun"
LUX_STATUS1_HEATPUMP_COMING: Final = "heatpump coming"
LUX_STATUS1_HEATPUMP_SHUTDOWN: Final = "heatpump shutdown"

LUX_STATUS3_GRID_SWITCH_ON_DELAY: Final = "grid switch on delay"

Expand Down Expand Up @@ -234,7 +235,7 @@ class LuxMode(Enum):
LUX_BINARY_SENSOR_CIRCULATION_PUMP_HEATING: Final = "calculations.ID_WEB_HUPout"
LUX_BINARY_SENSOR_ADDITIONAL_CIRCULATION_PUMP: Final = "calculations.ID_WEB_ZUPout"

LUX_BINARY_SENSOR_CIRCULATION_PUMP_DOMESTIC_WATER: Final = "calculations.ID_WEB_BUPout"
LUX_BINARY_SENSOR_DOMESTIC_WATER_RECIRCULATION_PUMP: Final = "calculations.ID_WEB_BUPout"

LUX_BINARY_SENSOR_SOLAR_PUMP: Final = "calculations.ID_WEB_SLPout"

Expand Down
11 changes: 10 additions & 1 deletion custom_components/luxtronik/luxtronik_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,16 @@ def has_second_heat_generator(self) -> bool:
self.read()
return int(self.get_value('parameters.ID_Einst_ZWE1Art_akt')) > 0
# ID_Einst_ZWE1Fkt_akt = 1 --> Heating and domestic water
except Exception as e:
except Exception:
return False

@property
def has_domestic_water_circulation_pump(self) -> bool:
"""Exists a domestic water circulation pump. If not it is a domestic water charging pump"""
try:
self.read()
return int(self.get_value('parameters.ID_Einst_BWZIP_akt')) != 1
except Exception:
return False

def detect_cooling_Mk(self):
Expand Down
22 changes: 22 additions & 0 deletions custom_components/luxtronik/number.py
Original file line number Diff line number Diff line change
Expand Up @@ -398,3 +398,25 @@ def update(self):
ATTR_EXTRA_STATE_ATTRIBUTE_LAST_THERMAL_DESINFECTION: datetime.utcnow()
}

async def async_added_to_hass(self) -> None:
"""Handle entity which will be added."""
await super().async_added_to_hass()
state = await self.async_get_last_state()
if not state:
return
self._state = state.state

if ATTR_EXTRA_STATE_ATTRIBUTE_LAST_THERMAL_DESINFECTION in state.attributes:
self._attr_extra_state_attributes = {
ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY: self._number_key,
ATTR_EXTRA_STATE_ATTRIBUTE_LAST_THERMAL_DESINFECTION: state.attributes[ATTR_EXTRA_STATE_ATTRIBUTE_LAST_THERMAL_DESINFECTION]
}

DATA_UPDATED = f"{DOMAIN}_data_updated"
async_dispatcher_connect(
self.hass, DATA_UPDATED, self._schedule_immediate_update
)

@callback
def _schedule_immediate_update(self):
self.async_schedule_update_ha_state(True)
92 changes: 54 additions & 38 deletions custom_components/luxtronik/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,19 @@
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.util import dt as dt_util

from .const import (ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY, ATTR_STATUS_TEXT, CONF_GROUP,
CONF_LANGUAGE_SENSOR_NAMES,
DEFAULT_DEVICE_CLASS,
DEVICE_CLASSES, DOMAIN, ICONS,
LOGGER,
LUX_BINARY_SENSOR_ADDITIONAL_CIRCULATION_PUMP,
LUX_SENSOR_STATUS,
LUX_SENSOR_STATUS1,
LUX_SENSOR_STATUS3,
LUX_STATE_ICON_MAP,
LUX_STATES_ON,
LUX_STATUS_DOMESTIC_WATER,
LUX_STATUS_EVU,
LUX_STATUS1_WORKAROUND,
LUX_STATUS3_WORKAROUND,
LUX_STATUS_HEATING,
LUX_STATUS_NO_REQUEST,
LUX_STATUS_THERMAL_DESINFECTION,
SECOUND_TO_HOUR_FACTOR, UNITS)
from .helpers.helper import (get_sensor_text, get_sensor_value_text)
from .const import (ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY, ATTR_STATUS_TEXT,
CONF_GROUP, CONF_LANGUAGE_SENSOR_NAMES,
DEFAULT_DEVICE_CLASS, DEVICE_CLASSES, DOMAIN, ICONS,
LOGGER, LUX_BINARY_SENSOR_ADDITIONAL_CIRCULATION_PUMP,
LUX_SENSOR_MODE_HEATING, LUX_SENSOR_STATUS,
LUX_SENSOR_STATUS1, LUX_SENSOR_STATUS3, LUX_STATE_ICON_MAP,
LUX_STATES_ON, LUX_STATUS1_HEATPUMP_COMING,
LUX_STATUS1_HEATPUMP_SHUTDOWN, LUX_STATUS1_WORKAROUND,
LUX_STATUS3_WORKAROUND, LUX_STATUS_DOMESTIC_WATER,
LUX_STATUS_EVU, LUX_STATUS_HEATING, LUX_STATUS_NO_REQUEST,
LUX_STATUS_THERMAL_DESINFECTION, SECOUND_TO_HOUR_FACTOR,
UNITS, LuxMode)
from .helpers.helper import get_sensor_text, get_sensor_value_text
from .luxtronik_device import LuxtronikDevice
from .model import LuxtronikStatusExtraAttributes

Expand Down Expand Up @@ -211,21 +204,22 @@ async def async_setup_entry(
'ZWE1 seit (ID_WEB_Time_ZWE1_akt)': 'calculations.ID_WEB_Time_ZWE1_akt',
# 'ZWE2 seit (ID_WEB_Time_ZWE2_akt)': 'calculations.ID_WEB_Time_ZWE2_akt',
'Netzeinschaltv. (ID_WEB_Timer_EinschVerz)': 'calculations.ID_WEB_Timer_EinschVerz',
'SSP-Aus-Zeit (ID_WEB_Time_SSPAUS_akt)': 'calculations.ID_WEB_Time_SSPAUS_akt',
'SSP-Ein-Zeit (ID_WEB_Time_SSPEIN_akt)': 'calculations.ID_WEB_Time_SSPEIN_akt',
'Schaltspielsperre SSP-Aus-Zeit (ID_WEB_Time_SSPAUS_akt)': 'calculations.ID_WEB_Time_SSPAUS_akt',
'Schaltspielsperre SSP-Ein-Zeit (ID_WEB_Time_SSPEIN_akt)': 'calculations.ID_WEB_Time_SSPEIN_akt',
'VD-Stand (ID_WEB_Time_VDStd_akt)': 'calculations.ID_WEB_Time_VDStd_akt',
# Zeit seit Modus "Heizung" aktiv?
'HRM-Zeit (ID_WEB_Time_HRM_akt)': 'calculations.ID_WEB_Time_HRM_akt',
# Zeit seit Modus "Wasser" aktiv?
'HRW-Stand (ID_WEB_Time_HRW_akt)': 'calculations.ID_WEB_Time_HRW_akt',
'Heizungsregler Mehr-Zeit HRM-Zeit (ID_WEB_Time_HRM_akt)': 'calculations.ID_WEB_Time_HRM_akt',
'Heizungsregler Weniger-Zeit HRW-Stand (ID_WEB_Time_HRW_akt)': 'calculations.ID_WEB_Time_HRW_akt',
# TDI seti?
'ID_WEB_Time_LGS_akt': 'calculations.ID_WEB_Time_LGS_akt',
'ID_WEB_Time_SBW_akt': 'calculations.ID_WEB_Time_SBW_akt'
'Sperre WW? ID_WEB_Time_SBW_akt': 'calculations.ID_WEB_Time_SBW_akt',
'Abtauen in ID_WEB_Time_AbtIn': 'calculations.ID_WEB_Time_AbtIn',
'ID_WEB_Time_Heissgas': 'calculations.ID_WEB_Time_Heissgas'
}
),
LuxtronikSensor(
luxtronik,
device_info,
"calculations.ID_WEB_HauptMenuStatus_Zeile1",
LUX_SENSOR_STATUS1,
"status_line_1",
"Status 1",
"mdi:numeric-1-circle",
Expand All @@ -251,7 +245,7 @@ async def async_setup_entry(
LuxtronikSensor(
luxtronik,
device_info,
"calculations.ID_WEB_HauptMenuStatus_Zeile3",
LUX_SENSOR_STATUS3,
"status_line_3",
"Status 3",
"mdi:numeric-3-circle",
Expand Down Expand Up @@ -538,7 +532,7 @@ async def async_setup_entry(
"mdi:waves-arrow-left",
entity_category=None,
),
LuxtronikSensor(
LuxtronikFlowOutStatusSensor(
luxtronik,
device_info_heating,
"calculations.ID_WEB_Sollwert_TRL_HZ",
Expand Down Expand Up @@ -798,6 +792,11 @@ def native_value(self): # -> float | int | None:
# pump forerun
return LUX_STATUS_NO_REQUEST
# endregion Workaround Luxtronik Bug: Status shows heating but status 3 = no request!
# region Workaround Luxtronik Bug: Line 1 shows 'heatpump coming' on shutdown!
elif self._sensor_key == LUX_SENSOR_STATUS1 and value == LUX_STATUS1_HEATPUMP_COMING:
if int(self._luxtronik.get_value('calculations.ID_WEB_Time_SSPEIN_akt')) < 10 and int(self._luxtronik.get_value('calculations.ID_WEB_Time_SSPAUS_akt')) > 0:
return LUX_STATUS1_HEATPUMP_SHUTDOWN
# endregion Workaround Luxtronik Bug: Line 1 shows 'heatpump coming' on shutdown!


return value if self._factor is None else round(value * self._factor, 2)
Expand Down Expand Up @@ -842,9 +841,26 @@ def __init__(self, set_entity_id: str, *args, **kwargs) -> None:
# """Return the entity_id of the sensor."""
# return self._set_entity_id

# @entity_id.setter
# def set_entity_id(self, x):
# pass
class LuxtronikFlowOutStatusSensor(LuxtronikSensor, RestoreEntity):
def _calc_switch_gap(self) -> float:
flow_out_target = float(self._luxtronik.get_value("calculations.ID_WEB_Sollwert_TRL_HZ"))
flow_out = float(self._luxtronik.get_value("calculations.ID_WEB_Temperatur_TRL"))
hyst = float(self._luxtronik.get_value("parameters.ID_Einst_HRHyst_akt")) * 0.1

if self._luxtronik.get_value(LUX_SENSOR_STATUS) == LUX_STATUS_HEATING:
return flow_out + hyst - flow_out_target
elif self._luxtronik.get_value(LUX_SENSOR_MODE_HEATING) != LuxMode.off.value:
return flow_out - hyst - flow_out_target
return None

@property
def extra_state_attributes(self) -> dict[str, str]:
"""Return the state attributes of the device."""
return {
ATTR_EXTRA_STATE_ATTRIBUTE_LUXTRONIK_KEY: self._sensor_key,
'switch_gap': self._calc_switch_gap(),
}


class LuxtronikStatusSensor(LuxtronikSensor, RestoreEntity):
"""Luxtronik Status Sensor with extended attr."""
Expand All @@ -858,10 +874,10 @@ class LuxtronikStatusSensor(LuxtronikSensor, RestoreEntity):

def update(self):
LuxtronikSensor.update(self)
time_now = time(datetime.utcnow().hour, datetime.utcnow().minute)
time_now = time(datetime.now().hour, datetime.now().minute)
if self.native_value is not None and self._last_state is not None and self.native_value == LUX_STATUS_EVU and self._last_state != LUX_STATUS_EVU:
# evu start
if self._first_evu_start_time is None or time_now.hour <= self._first_evu_start_time.hour:
if self._first_evu_start_time is None or time_now.hour <= self._first_evu_start_time.hour or time_now.hour <= self._first_evu_end_time.hour:
self._first_evu_start_time = time_now
else:
self._second_evu_start_time = time_now
Expand Down Expand Up @@ -922,15 +938,15 @@ def _calc_next_evu_event_minutes_text(self) -> str:

def _calc_next_evu_event_minutes(self) -> int:
evu_time = self._get_next_evu_event_time()
time_now = time(datetime.utcnow().hour, datetime.utcnow().minute)
time_now = time(datetime.now().hour, datetime.now().minute)
if evu_time is None:
return None
evu_hours = (24 if evu_time < time_now else 0) + evu_time.hour
return (evu_hours - time_now.hour) * 60 + evu_time.minute - time_now.minute

def _get_next_evu_event_time(self) -> time:
event: time = None
time_now = time(datetime.utcnow().hour, datetime.utcnow().minute)
time_now = time(datetime.now().hour, datetime.now().minute)
for evu_time in [self._first_evu_start_time, self._first_evu_end_time, self._second_evu_start_time, self._second_evu_end_time]:
if evu_time is None:
continue
Expand All @@ -946,7 +962,7 @@ def _get_next_evu_event_time(self) -> time:


@property
def extra_state_attributes(self) -> LuxtronikStatusExtraAttributes:
def extra_state_attributes(self) -> dict[str, str]:
"""Return the state attributes of the device."""
return {
ATTR_STATUS_TEXT: self._build_status_text(),
Expand Down
Loading

0 comments on commit 3e145b5

Please sign in to comment.