From 390466e19254678317de13897a0b467eff7705d7 Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 11:04:45 +0200 Subject: [PATCH 1/9] refactor: improve error handling in Econet300Api by adding specific exception logging --- custom_components/econet300/api.py | 65 +++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/custom_components/econet300/api.py b/custom_components/econet300/api.py index ec2bfb7..d8ec74e 100644 --- a/custom_components/econet300/api.py +++ b/custom_components/econet300/api.py @@ -270,8 +270,22 @@ async def fetch_reg_params_data(self) -> dict[str, Any]: regParamsData = await self._fetch_api_data_by_key( API_REG_PARAMS_DATA_URI, API_REG_PARAMS_DATA_PARAM_DATA ) + except aiohttp.ClientError as e: + _LOGGER.error("Client error occurred while fetching regParamsData: %s", e) + return {} + except asyncio.TimeoutError as e: + _LOGGER.error("Timeout error occurred while fetching regParamsData: %s", e) + return {} + except ValueError as e: + _LOGGER.error("Value error occurred while fetching regParamsData: %s", e) + return {} except DataError as e: - _LOGGER.error("Error fetching regParamsData: %s", e) + _LOGGER.error("Data error occurred while fetching regParamsData: %s", e) + return {} + except Exception as e: + _LOGGER.error( + "Unexpected error occurred while fetching regParamsData: %s", e + ) return {} else: _LOGGER.debug("Fetched regParamsData: %s", regParamsData) @@ -309,19 +323,50 @@ async def fetch_sys_params(self) -> dict[str, Any]: async def _fetch_api_data_by_key(self, endpoint: str, data_key: str | None = None): """Fetch a key from the json-encoded data returned by the API for a given registry If key is None, then return whole data.""" - data = await self._client.get(f"{self.host}/econet/{endpoint}") + try: + data = await self._client.get(f"{self.host}/econet/{endpoint}") - if data is None: - raise DataError(f"Data fetched by API for endpoint: {endpoint} is None") + if data is None: + _LOGGER.error("Data fetched by API for endpoint: %s is None", endpoint) + return None - if data_key is None: - return data + if data_key is None: + return data - if data_key not in data: - _LOGGER.debug(data) - raise DataError(f"Data for key: {data_key} does not exist") + if data_key not in data: + _LOGGER.error( + "Data for key: %s does not exist in endpoint: %s", + data_key, + endpoint, + ) + return None - return data[data_key] + return data[data_key] + except aiohttp.ClientError as e: + _LOGGER.error( + "lient error occurred while fetching data from endpoint: %s, error: %s", + endpoint, + e, + ) + except asyncio.TimeoutError as e: + _LOGGER.error( + "A timeout error occurred while fetching data from endpoint: %s, error: %s", + endpoint, + e, + ) + except ValueError as e: + _LOGGER.error( + "A value error occurred while processing data from endpoint: %s, error: %s", + endpoint, + e, + ) + except Exception as e: + _LOGGER.error( + "An unexpected error occurred while fetching data from endpoint: %s, error: %s", + endpoint, + e, + ) + return None async def make_api(hass: HomeAssistant, cache: MemCache, data: dict): From 9642c932e9f0464a05aeb3637f005a0b86beac33 Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 16:06:30 +0200 Subject: [PATCH 2/9] refactor: improve data attribute checks in EconetEntity for better error handling --- custom_components/econet300/entity.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/custom_components/econet300/entity.py b/custom_components/econet300/entity.py index 7379103..efd29a5 100644 --- a/custom_components/econet300/entity.py +++ b/custom_components/econet300/entity.py @@ -84,6 +84,11 @@ async def async_added_to_hass(self): _LOGGER.debug("Added to HASS: %s", self.entity_description) _LOGGER.debug("Coordinator: %s", self.coordinator) + # Check if the coordinator has a 'data' attributes + if "data" not in dir(self.coordinator): + _LOGGER.error("Coordinator object does not have a 'data' attribute") + return + # Retrieve sysParams and regParams paramsEdits data sys_params = self.coordinator.data.get("sysParams", {}) reg_params = self.coordinator.data.get("regParams", {}) @@ -92,15 +97,10 @@ async def async_added_to_hass(self): _LOGGER.debug("async_regParams: %s", reg_params) _LOGGER.debug("async_paramsEdits: %s", params_edits) - # Check if the coordinator has a 'data' attributes - if "data" not in dir(self.coordinator): - _LOGGER.error("Coordinator object does not have a 'data' attribute") - return - # Check the available keys in all sources - sys_keys = sys_params.keys() - reg_keys = reg_params.keys() - edit_keys = params_edits.keys() + sys_keys = sys_params.keys() if sys_params is not None else [] + reg_keys = reg_params.keys() if reg_params is not None else [] + edit_keys = params_edits.keys() if params_edits is not None else [] _LOGGER.debug("Available keys in sysParams: %s", sys_keys) _LOGGER.debug("Available keys in regParams: %s", reg_keys) _LOGGER.debug("Available keys in paramsEdits: %s", edit_keys) @@ -167,7 +167,7 @@ def device_info(self) -> DeviceInfo | None: class LambdaEntity(EconetEntity): - """Represents EcosterEntity.""" + """Initialize the LambdaEntity.""" def __init__( self, From ac7b32472aa54858315aac1bbee1afb22edc6668 Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 20:18:26 +0200 Subject: [PATCH 3/9] refactor: enhance sensor creation ecomax360 and logging in Econet300 integration --- custom_components/econet300/sensor.py | 46 +++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/custom_components/econet300/sensor.py b/custom_components/econet300/sensor.py index 405eb03..dfc6a0c 100644 --- a/custom_components/econet300/sensor.py +++ b/custom_components/econet300/sensor.py @@ -116,10 +116,23 @@ def create_controller_sensors( """Create controller sensor entities.""" entities: list[EconetSensor] = [] + # Get the system and regular parameters from the coordinator data_regParams = coordinator.data.get("regParams", {}) data_sysParams = coordinator.data.get("sysParams", {}) - for data_key in SENSOR_MAP_KEY["_default"]: + # Extract the controllerID from sysParams + controller_id = data_sysParams.get("controllerID", None) + + # Determine the keys to use based on the controllerID + sensor_keys = SENSOR_MAP_KEY.get(controller_id, SENSOR_MAP_KEY["_default"]) + _LOGGER.info( + "Using sensor keys for controllerID '%s': %s", + controller_id if controller_id else "None (default)", + sensor_keys, + ) + + # Iterate through the selected keys and create sensors if valid data is found + for data_key in sensor_keys: _LOGGER.debug( "Processing entity sensor data_key: %s from regParams & sysParams", data_key ) @@ -266,19 +279,40 @@ async def async_setup_entry( ) -> bool: """Set up the sensor platform.""" - def async_gather_entities( + async def async_gather_entities( coordinator: EconetDataCoordinator, api: Econet300Api ) -> list[EconetSensor]: """Collect all sensor entities.""" entities = [] - entities.extend(create_controller_sensors(coordinator, api)) - entities.extend(create_mixer_sensors(coordinator, api)) - entities.extend(create_lambda_sensors(coordinator, api)) + _LOGGER.info("Starting entity collection for sensors...") + + # Gather sensors dynamically based on the controller + controller_sensors = create_controller_sensors(coordinator, api) + _LOGGER.info("Collected %d controller sensors", len(controller_sensors)) + entities.extend(controller_sensors) + + # Gather mixer sensors + mixer_sensors = create_mixer_sensors(coordinator, api) + _LOGGER.info("Collected %d mixer sensors", len(mixer_sensors)) + entities.extend(mixer_sensors) + + # Gather lambda sensors + lambda_sensors = create_lambda_sensors(coordinator, api) + _LOGGER.info("Collected %d lambda sensors", len(lambda_sensors)) + entities.extend(lambda_sensors) + + _LOGGER.info("Total entities collected: %d", len(entities)) return entities coordinator = hass.data[DOMAIN][entry.entry_id][SERVICE_COORDINATOR] api = hass.data[DOMAIN][entry.entry_id][SERVICE_API] - entities = async_gather_entities(coordinator, api) + # Collect entities asynchronously + entities = await hass.async_add_executor_job( + async_gather_entities, coordinator, api + ) + + # Add entities to Home Assistant async_add_entities(entities) + _LOGGER.info("Entities successfully added to Home Assistant") return True From 96071d802e4f7890cce379b537b783fe7dc03905 Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 20:25:40 +0200 Subject: [PATCH 4/9] feat: add ecoMAX360i sensor mappings and translations for enhanced functionality --- custom_components/econet300/const.py | 52 +++++++++++++++++-- custom_components/econet300/strings.json | 36 +++++++++++++ .../econet300/translations/en.json | 36 +++++++++++++ 3 files changed, 121 insertions(+), 3 deletions(-) diff --git a/custom_components/econet300/const.py b/custom_components/econet300/const.py index 09cc789..d13cc8c 100644 --- a/custom_components/econet300/const.py +++ b/custom_components/econet300/const.py @@ -87,9 +87,20 @@ ####################### SENSOR_MAP_KEY = { - "ecoster": { - "ecoSterTemp1", - "ecoSterTemp2", + "ecoMAX360i": { + "PS", + "Circuit2thermostatTemp", + "TempClutch", + "Circuit3thermostatTemp", + "TempWthr", + "TempCircuit3", + "TempCircuit2", + "TempBuforUp", + "TempCWU", + "TempBuforDown", + "heatingUpperTemp", + "Circuit1thermostat", + "heating_work_state_pump4", }, "lambda": { "lambdaStatus", @@ -175,6 +186,17 @@ "burnerOutput": PERCENTAGE, "mixerTemp": UnitOfTemperature.CELSIUS, "mixerSetTemp": UnitOfTemperature.CELSIUS, + # ecoNET360i + "Circuit2thermostatTemp": UnitOfTemperature.CELSIUS, + "TempClutch": UnitOfTemperature.CELSIUS, + "Circuit3thermostatTemp": UnitOfTemperature.CELSIUS, + "TempWthr": UnitOfTemperature.CELSIUS, + "TempCircuit3": UnitOfTemperature.CELSIUS, + "TempCircuit2": UnitOfTemperature.CELSIUS, + "TempBuforUp": UnitOfTemperature.CELSIUS, + "TempBuforDown": UnitOfTemperature.CELSIUS, + "heatingUpperTemp": UnitOfTemperature.CELSIUS, + "Circuit1thermostat": UnitOfTemperature.CELSIUS, } # By default all sensors state_class are MEASUREMENT @@ -190,6 +212,9 @@ "moduleCSoftVer": None, "moduleLambdaSoftVer": None, "modulePanelSoftVer": None, + # ecoNET360i + "PS": None, + "heating_work_state_pump4": None, } # By default all sensors device_class are None @@ -215,6 +240,17 @@ "tempLowerBuffer": SensorDeviceClass.TEMPERATURE, "signal": SensorDeviceClass.SIGNAL_STRENGTH, "servoMixer1": SensorDeviceClass.ENUM, + # ecoNET360i + "Circuit2thermostatTemp": SensorDeviceClass.TEMPERATURE, + "TempClutch": SensorDeviceClass.TEMPERATURE, + "Circuit3thermostatTemp": SensorDeviceClass.TEMPERATURE, + "TempWthr": SensorDeviceClass.TEMPERATURE, + "TempCircuit3": SensorDeviceClass.TEMPERATURE, + "TempCircuit2": SensorDeviceClass.TEMPERATURE, + "TempBuforUp": SensorDeviceClass.TEMPERATURE, + "TempBuforDown": SensorDeviceClass.TEMPERATURE, + "heatingUpperTemp": SensorDeviceClass.TEMPERATURE, + "Circuit1thermostat": SensorDeviceClass.TEMPERATURE, } ENTITY_NUMBER_SENSOR_DEVICE_CLASS_MAP = { @@ -261,6 +297,12 @@ "moduleCSoftVer": None, "moduleLambdaSoftVer": None, "modulePanelSoftVer": None, + # ecoNET360i + "PS": None, + "TempBuforDown": 1, + "heatingUpperTemp": 1, + "Circuit1thermostat": 1, + "heating_work_state_pump4": None, } ENTITY_ICON = { @@ -303,6 +345,10 @@ "moduleCSoftVer": "mdi:raspberry-pi", "moduleLambdaSoftVer": "mdi:raspberry-pi", "modulePanelSoftVer": "mdi:alarm-panel-outline", + # ecoNET360i + "TempBuforDown": "mdi:thermometer", + "heatingUpperTemp": "mdi:thermometer", + "heating_work_state_pump4": "mdi:sync", } ENTITY_ICON_OFF = { diff --git a/custom_components/econet300/strings.json b/custom_components/econet300/strings.json index 7601906..b12636c 100644 --- a/custom_components/econet300/strings.json +++ b/custom_components/econet300/strings.json @@ -206,6 +206,42 @@ }, "weather_control": { "name": "Weather control the boiler" + }, + "ps": { + "name": "PS" + }, + "circuit2thermostat_temp": { + "name": "Circuit 2 thermostat temp." + }, + "temp_clutch": { + "name": "Clutch temp." + }, + "circuit3thermostat_temp": { + "name": "Circuit 3 thermostat temp." + }, + "temp_wthr": { + "name": "Weather temp." + }, + "temp_circuit3": { + "name": "Circuit 3 temp." + }, + "temp_circuit2": { + "name": "Circuit 2 temp." + }, + "temp_bufor_up": { + "name": "Upper buffer temp." + }, + "temp_bufor_down": { + "name": "Buffer lower temp." + }, + "heating_upper_temp": { + "name": "Heating upper temp." + }, + "circuit1thermostat": { + "name": "Circuit 1 actual temp." + }, + "heating_work_state_pump4": { + "name": "Heating work state pump 4" } } } diff --git a/custom_components/econet300/translations/en.json b/custom_components/econet300/translations/en.json index 78d53ad..86aae80 100644 --- a/custom_components/econet300/translations/en.json +++ b/custom_components/econet300/translations/en.json @@ -206,6 +206,42 @@ }, "weather_control": { "name": "Weather control the boiler" + }, + "ps": { + "name": "PS" + }, + "circuit2thermostat_temp": { + "name": "Circuit 2 thermostat temp." + }, + "temp_clutch": { + "name": "Clutch temp." + }, + "circuit3thermostat_temp": { + "name": "Circuit 3 thermostat temp." + }, + "temp_wthr": { + "name": "Weather temp." + }, + "temp_circuit3": { + "name": "Circuit 3 temp." + }, + "temp_circuit2": { + "name": "Circuit 2 temp." + }, + "temp_bufor_up": { + "name": "Upper buffer temp." + }, + "temp_bufor_down": { + "name": "Buffer lower temp." + }, + "heating_upper_temp": { + "name": "Heating upper temp." + }, + "circuit1thermostat": { + "name": "Circuit 1 actual temp." + }, + "heating_work_state_pump4": { + "name": "Heating work state pump 4" } } } From 77a69817b13a0079ed98d3124ac5d0ebd90bd077 Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 20:47:52 +0200 Subject: [PATCH 5/9] refactor: change async_gather_entities to gather_entities for synchronous entity collection --- custom_components/econet300/sensor.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/custom_components/econet300/sensor.py b/custom_components/econet300/sensor.py index dfc6a0c..77e6ecd 100644 --- a/custom_components/econet300/sensor.py +++ b/custom_components/econet300/sensor.py @@ -279,7 +279,7 @@ async def async_setup_entry( ) -> bool: """Set up the sensor platform.""" - async def async_gather_entities( + def gather_entities( coordinator: EconetDataCoordinator, api: Econet300Api ) -> list[EconetSensor]: """Collect all sensor entities.""" @@ -307,10 +307,8 @@ async def async_gather_entities( coordinator = hass.data[DOMAIN][entry.entry_id][SERVICE_COORDINATOR] api = hass.data[DOMAIN][entry.entry_id][SERVICE_API] - # Collect entities asynchronously - entities = await hass.async_add_executor_job( - async_gather_entities, coordinator, api - ) + # Collect entities synchronously + entities = await hass.async_add_executor_job(gather_entities, coordinator, api) # Add entities to Home Assistant async_add_entities(entities) From ff021412093ecc530a4976f1e1e49a37da7b3d5a Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 22:14:42 +0200 Subject: [PATCH 6/9] chore: update version to v1.1.0 in manifest.json --- custom_components/econet300/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/econet300/manifest.json b/custom_components/econet300/manifest.json index ab0cdf6..076393f 100644 --- a/custom_components/econet300/manifest.json +++ b/custom_components/econet300/manifest.json @@ -12,6 +12,6 @@ "issue_tracker": "https://github.com/jontofront/ecoNET-300-Home-Assistant-Integration/issues", "requirements": [], "ssdp": [], - "version": "v1.0.14", + "version": "v1.1.0", "zeroconf": [] } \ No newline at end of file From e704b1f6bebf3d13d18e0ade035c0ba0fb0c9c1c Mon Sep 17 00:00:00 2001 From: jontofront Date: Thu, 9 Jan 2025 22:21:33 +0200 Subject: [PATCH 7/9] chore: update changelog for version 1.1.0 with new features and improvements --- CHANGELOG.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30648fc..7bd3e02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -187,17 +187,23 @@ Updated the names of the lighter, boilerPower, and feeder sensors in custom_comp ## # Changelog -## [1.1.14] - 2025-01-07 +## [1.1.0] - 2025-01-07 ### Added -- Introduced `should_skip_params_edits` function in `custom_components/econet300/common.py` to determine if parameter edits should be skipped based on `controllerID` (controller_id == "ecoMAX360i":). +- Introduced `should_skip_params_edits` function in `custom_components/econet300/common.py` to determine if parameter edits should be skipped based on `controllerID` (controller_id == "ecoMAX360i"). - Added `async_gather_entities` function in `custom_components/econet300/sensor.py` to collect sensor entities. - Added annotations and type hints across various functions. +- Support for ecoMAX360i controller. ### Changed - Updated `EconetDataCoordinator` class in `custom_components/econet300/common.py` to use type hints and new `should_skip_params_edits` function. - Modified entity setup in `custom_components/econet300/number.py` to skip for `controllerID: ecoMAX360i`. +- Refactored sensor entity gathering logic in `async_setup_entry`. +- Improved error handling in `Econet300Api` by adding specific exception logging. - Changed `homeassistant` version to `2024.12.2` and `ruff` version to `0.8.4` in `requirements.txt`. - Removed `colorlog` dependency from `requirements.txt`. ### Fixed -- Addressed type hinting issues in `custom_components/econet300/common.py` and `custom_components/econet300/number.py`. \ No newline at end of file +- Addressed type hinting issues in `custom_components/econet300/common.py` and `custom_components/econet300/number.py`. +- Improved data attribute checks in `EconetEntity` for better error handling. + +For more details, you can view the commits. \ No newline at end of file From b6420d5c525f795d853bc72db4fa52aa24f01fa6 Mon Sep 17 00:00:00 2001 From: jontofront Date: Mon, 13 Jan 2025 15:56:17 +0200 Subject: [PATCH 8/9] refactor: rename should_skip_params_edits to skip_params_edits and update references in Econet components --- CHANGELOG.md | 4 ++-- custom_components/econet300/common.py | 4 ++-- custom_components/econet300/number.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bd3e02..4d649d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -189,13 +189,13 @@ Updated the names of the lighter, boilerPower, and feeder sensors in custom_comp ## [1.1.0] - 2025-01-07 ### Added -- Introduced `should_skip_params_edits` function in `custom_components/econet300/common.py` to determine if parameter edits should be skipped based on `controllerID` (controller_id == "ecoMAX360i"). +- Introduced `skip_params_edits` function in `custom_components/econet300/common.py` to determine if parameter edits should be skipped based on `controllerID` (controller_id == "ecoMAX360i"). - Added `async_gather_entities` function in `custom_components/econet300/sensor.py` to collect sensor entities. - Added annotations and type hints across various functions. - Support for ecoMAX360i controller. ### Changed -- Updated `EconetDataCoordinator` class in `custom_components/econet300/common.py` to use type hints and new `should_skip_params_edits` function. +- Updated `EconetDataCoordinator` class in `custom_components/econet300/common.py` to use type hints and new `skip_params_edits` function. - Modified entity setup in `custom_components/econet300/number.py` to skip for `controllerID: ecoMAX360i`. - Refactored sensor entity gathering logic in `async_setup_entry`. - Improved error handling in `Econet300Api` by adding specific exception logging. diff --git a/custom_components/econet300/common.py b/custom_components/econet300/common.py index fe4e340..b3088bd 100644 --- a/custom_components/econet300/common.py +++ b/custom_components/econet300/common.py @@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) -def should_skip_params_edits(sys_params: dict[str, Any]) -> bool: +def skip_params_edits(sys_params: dict[str, Any]) -> bool: """Determine whether paramsEdits should be skipped based on controllerID.""" controller_id = sys_params.get("controllerID") if controller_id == "ecoMAX360i": @@ -71,7 +71,7 @@ async def _async_update_data(self) -> dict[str, Any]: sys_params = await self._api.fetch_sys_params() # Determine whether to fetch paramsEdits from ../econet/rmCurrentDataParamsEdits - if should_skip_params_edits(sys_params): + if skip_params_edits(sys_params): params_edits = {} else: params_edits = await self._api.fetch_param_edit_data() diff --git a/custom_components/econet300/number.py b/custom_components/econet300/number.py index fcef104..726dbf0 100644 --- a/custom_components/econet300/number.py +++ b/custom_components/econet300/number.py @@ -9,7 +9,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .api import Limits -from .common import Econet300Api, EconetDataCoordinator, should_skip_params_edits +from .common import Econet300Api, EconetDataCoordinator, skip_params_edits from .common_functions import camel_to_snake from .const import ( DOMAIN, @@ -175,7 +175,7 @@ async def async_setup_entry( for key in NUMBER_MAP: sys_params = coordinator.data.get("sysParams", {}) - if should_skip_params_edits(sys_params): + if skip_params_edits(sys_params): _LOGGER.info("Skipping number entity setup for controllerID: ecoMAX360i") continue From c8fd834016fa3bddcd7ca4f5d54edca0c6ba57b6 Mon Sep 17 00:00:00 2001 From: jontofront Date: Mon, 13 Jan 2025 16:03:00 +0200 Subject: [PATCH 9/9] refactor: update ecoNET360i references to ecoMAX360i in constant definitions --- custom_components/econet300/const.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/custom_components/econet300/const.py b/custom_components/econet300/const.py index d13cc8c..5f42e36 100644 --- a/custom_components/econet300/const.py +++ b/custom_components/econet300/const.py @@ -186,7 +186,7 @@ "burnerOutput": PERCENTAGE, "mixerTemp": UnitOfTemperature.CELSIUS, "mixerSetTemp": UnitOfTemperature.CELSIUS, - # ecoNET360i + # ecoMAX360i "Circuit2thermostatTemp": UnitOfTemperature.CELSIUS, "TempClutch": UnitOfTemperature.CELSIUS, "Circuit3thermostatTemp": UnitOfTemperature.CELSIUS, @@ -212,7 +212,7 @@ "moduleCSoftVer": None, "moduleLambdaSoftVer": None, "modulePanelSoftVer": None, - # ecoNET360i + # ecoMAX360i "PS": None, "heating_work_state_pump4": None, } @@ -240,7 +240,7 @@ "tempLowerBuffer": SensorDeviceClass.TEMPERATURE, "signal": SensorDeviceClass.SIGNAL_STRENGTH, "servoMixer1": SensorDeviceClass.ENUM, - # ecoNET360i + # ecoMAX360i "Circuit2thermostatTemp": SensorDeviceClass.TEMPERATURE, "TempClutch": SensorDeviceClass.TEMPERATURE, "Circuit3thermostatTemp": SensorDeviceClass.TEMPERATURE, @@ -297,7 +297,7 @@ "moduleCSoftVer": None, "moduleLambdaSoftVer": None, "modulePanelSoftVer": None, - # ecoNET360i + # ecoMAX360i "PS": None, "TempBuforDown": 1, "heatingUpperTemp": 1, @@ -345,7 +345,7 @@ "moduleCSoftVer": "mdi:raspberry-pi", "moduleLambdaSoftVer": "mdi:raspberry-pi", "modulePanelSoftVer": "mdi:alarm-panel-outline", - # ecoNET360i + # ecoMAX360i "TempBuforDown": "mdi:thermometer", "heatingUpperTemp": "mdi:thermometer", "heating_work_state_pump4": "mdi:sync",