Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
3ec7ca5
Add new MyNeomitis integration
l-pr Aug 29, 2025
4d20ed7
Add MyNeomitis integration
l-pr Sep 2, 2025
64e7a75
Add new MyNeomitis integration
l-pr Sep 2, 2025
7f4b3bb
Add quality_scale file, add more unit test
l-pr Sep 23, 2025
257ef2e
revert CLAUD.md
l-pr Oct 20, 2025
7c41f3d
Fix: strings.json
l-pr Oct 20, 2025
f10b7f1
update: add runtime_data, new version api, strings
l-pr Oct 21, 2025
73713ef
Merge branch 'home-assistant:dev' into myneomitis
l-pr Oct 21, 2025
4264d3f
Update select.py
l-pr Oct 21, 2025
6047c16
Merge branch 'dev' into myneomitis
l-pr Oct 21, 2025
c5b49f9
Update test_select.py
l-pr Oct 21, 2025
2d74032
Update utils.py
l-pr Oct 21, 2025
01bbe98
Merge branch 'dev' into myneomitis
l-pr Oct 21, 2025
daf7758
Update: add requirements_all
l-pr Oct 21, 2025
3e133ba
Merge branch 'dev' into myneomitis
l-pr Oct 24, 2025
82a6546
Merge branch 'dev' into myneomitis
l-pr Nov 7, 2025
89e987e
Merge branch 'dev' into myneomitis
l-pr Nov 7, 2025
d1cf319
Merge branch 'dev' into myneomitis
l-pr Nov 24, 2025
24cd411
Apply change
l-pr Nov 24, 2025
e188940
Merge branch 'dev' into myneomitis
l-pr Nov 24, 2025
daf293f
Merge branch 'dev' into myneomitis
l-pr Nov 24, 2025
321c0f5
fix test
l-pr Nov 24, 2025
7dafd40
Update
l-pr Dec 5, 2025
74a23ba
Update select.py
l-pr Dec 5, 2025
d4426ba
Merge branch 'dev' into myneomitis
l-pr Dec 5, 2025
189f330
Merge branch 'dev' into myneomitis
l-pr Dec 22, 2025
1df0f45
update myneomitis integration
l-pr Dec 23, 2025
9f20db5
Merge remote-tracking branch 'refs/remotes/origin/myneomitis' into my…
l-pr Dec 23, 2025
da736da
Merge branch 'dev' into myneomitis
l-pr Dec 23, 2025
9f9b168
Merge branch 'dev' into myneomitis
l-pr Jan 5, 2026
d4a0747
Merge branch 'dev' into myneomitis
l-pr Jan 5, 2026
4bf6cff
Merge branch 'dev' into myneomitis
l-pr Jan 7, 2026
acba73e
Merge branch 'dev' into myneomitis
l-pr Jan 7, 2026
0a90b50
Fix merge conflicts
l-pr Jan 26, 2026
5c6f328
Merge branch 'dev' into myneomitis
l-pr Jan 26, 2026
feba344
Merge branch 'dev' into myneomitis
l-pr Jan 27, 2026
b034557
Add MyNeomitis integration features and tests
l-pr Jan 27, 2026
029d768
Merge remote-tracking branch 'refs/remotes/origin/myneomitis' into my…
l-pr Jan 27, 2026
5c2c709
Merge branch 'dev' into myneomitis
l-pr Jan 27, 2026
1f858eb
Refactor tests to use MockConfigEntry instead of DummyEntry for MyNeo…
l-pr Jan 27, 2026
42b2ffb
Merge branch 'dev' into myneomitis
l-pr Jan 27, 2026
0c74ab5
Merge branch 'dev' into myneomitis
l-pr Jan 27, 2026
39421a6
Merge branch 'dev' into myneomitis
l-pr Jan 27, 2026
3ab9b2c
Merge branch 'dev' into myneomitis
l-pr Jan 28, 2026
53831de
Refactor MyNeomitis integration tests to use MockConfigEntry and impr…
l-pr Jan 29, 2026
00a7052
Merge remote-tracking branch 'refs/remotes/origin/myneomitis' into my…
l-pr Jan 29, 2026
8c62f88
Merge branch 'dev' into myneomitis
l-pr Jan 29, 2026
8cee654
Merge branch 'dev' into myneomitis
l-pr Jan 30, 2026
97a4ba0
Merge branch 'dev' into myneomitis
l-pr Feb 16, 2026
53edd7e
update myneomitis
l-pr Feb 17, 2026
5810ea7
Merge branch 'dev' into myneomitis
l-pr Feb 17, 2026
e4e053b
Merge branch 'dev' into myneomitis
l-pr Feb 18, 2026
52161bb
Merge branch 'dev' into myneomitis
l-pr Feb 20, 2026
afcce0f
Update myneomitis integration
l-pr Feb 20, 2026
f1785dd
update myneomitis test
l-pr Feb 20, 2026
310b4a3
Merge branch 'dev' into myneomitis
l-pr Feb 20, 2026
7c4dbea
Merge branch 'dev' into myneomitis
l-pr Feb 23, 2026
a889d7a
Merge branch 'dev' into myneomitis
l-pr Feb 23, 2026
bd40bb5
Update pyaxencoapi
l-pr Feb 23, 2026
013621a
fix coverage config_flow
l-pr Feb 23, 2026
f1f8484
Merge branch 'dev' into myneomitis
l-pr Feb 23, 2026
f5f1c5c
fix name
l-pr Feb 23, 2026
ea70dfd
Update tests/components/myneomitis/test_select.py
l-pr Feb 23, 2026
4da2a66
Update tests/components/myneomitis/test_config_flow.py
l-pr Feb 23, 2026
41d4259
Update homeassistant/components/myneomitis/select.py
l-pr Feb 23, 2026
195c823
fix error response
l-pr Feb 23, 2026
8e8d77f
Update homeassistant/components/myneomitis/quality_scale.yaml
l-pr Feb 23, 2026
6478b4e
repatch
l-pr Feb 23, 2026
831bf54
Update homeassistant/components/myneomitis/select.py
l-pr Feb 23, 2026
02aa014
Update homeassistant/components/myneomitis/__init__.py
l-pr Feb 23, 2026
3d0c871
Update homeassistant/components/myneomitis/select.py
l-pr Feb 23, 2026
6d65f86
Update tests/components/myneomitis/test_config_flow.py
l-pr Feb 23, 2026
fedafe2
fix and update
l-pr Feb 23, 2026
1b58b0e
Merge branch 'dev' into myneomitis
l-pr Feb 23, 2026
ba4293d
fix prek
l-pr Feb 23, 2026
8ea9658
Merge branch 'dev' into myneomitis
l-pr Feb 23, 2026
06a038d
Merge branch 'dev' into myneomitis
l-pr Feb 23, 2026
5ee42dc
add climate
l-pr Feb 24, 2026
4a7c074
add climate entity
l-pr Feb 24, 2026
ec2e541
Merge branch 'home-assistant:dev' into myneomitis
l-pr Feb 24, 2026
4b8659a
add unit test for climate
l-pr Feb 24, 2026
039bfa7
Merge branch 'home-assistant:dev' into myneomitis
l-pr Feb 24, 2026
c6838d3
add docstrings
l-pr Feb 24, 2026
3e5ba84
Merge branch 'dev' into myneomitis
l-pr Feb 24, 2026
72843c8
update myneomitis climate
l-pr Feb 24, 2026
bdc1591
Merge branch 'dev' into myneomitis
l-pr Feb 25, 2026
cacc0da
update myneomitis
l-pr Feb 25, 2026
031bdd6
Merge branch 'dev' into myneomitis
l-pr Feb 25, 2026
ef75bb8
update myneomitis test
l-pr Feb 25, 2026
5369cdd
Merge branch 'dev' into myneomitis
l-pr Feb 25, 2026
fe1c2ea
Merge branch 'dev' into myneomitis
l-pr Feb 25, 2026
3484691
Update homeassistant/components/myneomitis/icons.json
l-pr Feb 25, 2026
77a833c
Update tests/components/myneomitis/test_climate.py
l-pr Feb 25, 2026
f666d29
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 25, 2026
95820f3
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 25, 2026
4cb86e8
Merge branch 'dev' into myneomitis
l-pr Feb 25, 2026
bea8e38
update myneomitis
l-pr Feb 25, 2026
090bfc1
Merge branch 'dev' into myneomitis
l-pr Feb 25, 2026
c6dbc85
update myneomitis
l-pr Feb 26, 2026
fa7ad28
Merge branch 'dev' into myneomitis
l-pr Feb 26, 2026
252639a
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 26, 2026
9a14c02
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 26, 2026
8edcb80
Update homeassistant/components/myneomitis/select.py
l-pr Feb 26, 2026
0e4f97a
Merge branch 'dev' into myneomitis
l-pr Feb 26, 2026
904ec88
update myneomitis
l-pr Feb 26, 2026
834b610
fix mypy check
l-pr Feb 26, 2026
ed530e8
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 26, 2026
35375f7
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 26, 2026
4c6d6a7
update unit test
l-pr Feb 26, 2026
66f5d53
Merge branch 'dev' into myneomitis
l-pr Feb 26, 2026
eb41eb1
Update tests/components/myneomitis/test_climate.py
l-pr Feb 26, 2026
5995df0
more climate test
l-pr Feb 26, 2026
b881c42
Merge branch 'dev' into myneomitis
l-pr Feb 26, 2026
bfd42c8
Merge branch 'dev' into myneomitis
l-pr Feb 27, 2026
70dd771
Merge branch 'dev' into myneomitis
l-pr Feb 27, 2026
cbc4e24
Update homeassistant/components/myneomitis/const.py
l-pr Feb 27, 2026
082d894
Update homeassistant/components/myneomitis/climate.py
l-pr Feb 27, 2026
1fb9c6b
Merge branch 'dev' into myneomitis
l-pr Feb 27, 2026
1ab1361
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
d1e080a
Update homeassistant/components/myneomitis/climate.py
l-pr Mar 2, 2026
9a2c8cc
fix climate
l-pr Mar 2, 2026
1738537
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
456a473
fix climate
l-pr Mar 2, 2026
7a812c9
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
261c1e7
Update homeassistant/components/myneomitis/climate.py
l-pr Mar 2, 2026
37788a0
Update homeassistant/components/myneomitis/select.py
l-pr Mar 2, 2026
dc912f2
Update homeassistant/components/myneomitis/climate.py
l-pr Mar 2, 2026
af9cd83
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
e2d3e43
fix error
l-pr Mar 2, 2026
74b2c78
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
4813d73
Update homeassistant/components/myneomitis/climate.py
l-pr Mar 2, 2026
a0b6caa
Update homeassistant/components/myneomitis/climate.py
l-pr Mar 2, 2026
9335f5c
Update homeassistant/components/myneomitis/select.py
l-pr Mar 2, 2026
0072f19
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
f232194
fix climate
l-pr Mar 2, 2026
2f701f6
Merge branch 'dev' into myneomitis
l-pr Mar 2, 2026
cf83f12
Merge branch 'dev' into myneomitis
l-pr Mar 3, 2026
1bc1bba
Merge branch 'dev' into myneomitis
l-pr Mar 4, 2026
fefe4fc
update climate, remove select change
l-pr Mar 4, 2026
bbeaa31
Merge branch 'dev' into myneomitis
l-pr Mar 4, 2026
7a7b04a
change for the new pyaxencoapi update
l-pr Mar 4, 2026
03ee89d
Merge branch 'dev' into myneomitis
l-pr Mar 4, 2026
8b6574d
Merge branch 'dev' into myneomitis
l-pr Mar 4, 2026
dac2b57
Update homeassistant/components/myneomitis/const.py
l-pr Mar 4, 2026
4432479
Merge branch 'dev' into myneomitis
l-pr Mar 5, 2026
a02ee49
Merge branch 'dev' into myneomitis
l-pr Mar 6, 2026
64a2f1e
Merge branch 'dev' into myneomitis
l-pr Mar 17, 2026
d782290
Merge branch 'dev' into myneomitis
l-pr Apr 7, 2026
bc7d5e6
Merge branch 'dev' into myneomitis
l-pr Apr 7, 2026
ab8c4e1
fix climate test
l-pr Apr 8, 2026
73d9a93
Merge branch 'dev' into myneomitis
l-pr Apr 8, 2026
1f68bfb
Merge branch 'dev' into myneomitis
l-pr Apr 13, 2026
91df773
Merge branch 'dev' into myneomitis
l-pr Apr 13, 2026
8bf7de0
Merge branch 'dev' into myneomitis
l-pr Apr 15, 2026
36ecc94
Merge branch 'dev' into myneomitis
l-pr Apr 15, 2026
121f4c3
Fix climate test
l-pr Apr 15, 2026
5f79736
Merge branch 'dev' into myneomitis
l-pr Apr 15, 2026
9d3c1ea
Merge branch 'dev' into myneomitis
l-pr Apr 15, 2026
3a77ea0
Merge branch 'dev' into myneomitis
l-pr Apr 16, 2026
6f1d662
Merge branch 'dev' into myneomitis
l-pr Apr 16, 2026
8df1a65
fix climate test
l-pr Apr 16, 2026
49f15c9
Merge branch 'dev' into myneomitis
l-pr Apr 16, 2026
a54f7e1
Merge branch 'dev' into myneomitis
l-pr Apr 17, 2026
ce453bd
Merge branch 'home-assistant:dev' into myneomitis
l-pr Apr 20, 2026
5c703d1
fix sub-devices
l-pr Apr 20, 2026
c00ddf0
Merge branch 'dev' into myneomitis
l-pr Apr 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions homeassistant/components/myneomitis/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ def __init__(self, api: PyAxencoAPI, device: dict[str, Any]) -> None:

state = device.get("state", {})
self._is_sub_device = model in SUPPORTED_SUB_MODELS
self._parents = device.get("parents") or {}
self._parents = device.get("parents")
if model in PRESET_MODE_MODELS:
self._attr_preset_modes = PRESET_MODE_MODELS[model]
else:
Expand Down Expand Up @@ -122,7 +122,7 @@ def __init__(self, api: PyAxencoAPI, device: dict[str, Any]) -> None:
if self._attr_preset_mode and self._attr_preset_mode != "standby"
else None
)
if model == "NTD" and state.get("changeOverUser") == 1:
if model == "NTD" and state.get("comfTemp") < state.get("ecoTemp"):
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guard the NTD COOL/OFF detection against missing/non-numeric comfTemp/ecoTemp values (or make them required) to avoid a TypeError when comparing None to a number.

Suggested change
if model == "NTD" and state.get("comfTemp") < state.get("ecoTemp"):
comf_temp = state.get("comfTemp")
eco_temp = state.get("ecoTemp")
if (
model == "NTD"
and isinstance(comf_temp, int | float)
and isinstance(eco_temp, int | float)
and comf_temp < eco_temp
):

Copilot uses AI. Check for mistakes.
self._attr_hvac_modes = [HVACMode.COOL, HVACMode.OFF]
self._attr_hvac_mode = (
HVACMode.OFF
Expand Down Expand Up @@ -315,7 +315,11 @@ async def _set_device_mode(self, mode: str) -> bool:
return False

if self._is_sub_device:
gateway = self._parents.get("gateway")
gateway = (
self._parents.split(",")[1]
if isinstance(self._parents, str)
else None
)
Comment on lines +318 to +322
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parse the gateway from parents without relying on a fixed comma layout (the current split(',')[1] can raise IndexError for a string that doesn’t contain at least two comma-separated parts).

Copilot uses AI. Check for mistakes.
rfid = self._device.get("rfid")
if not gateway or not rfid:
_LOGGER.error(
Expand All @@ -336,7 +340,11 @@ async def _set_device_temperature(self, temperature: float) -> bool:
"""Set the device temperature via API."""
try:
if self._is_sub_device:
gateway = self._parents.get("gateway")
gateway = (
self._parents.split(",")[1]
if isinstance(self._parents, str)
else None
)
Comment on lines +343 to +347
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parse the gateway from parents without relying on a fixed comma layout (the current split(',')[1] can raise IndexError for a string that doesn’t contain at least two comma-separated parts).

Suggested change
gateway = (
self._parents.split(",")[1]
if isinstance(self._parents, str)
else None
)
gateway = None
if isinstance(self._parents, str):
parent_parts = [
part.strip() for part in self._parents.split(",") if part.strip()
]
if parent_parts:
gateway = parent_parts[-1]

Copilot uses AI. Check for mistakes.
rfid = self._device.get("rfid")
if not gateway or not rfid:
_LOGGER.error(
Expand Down
28 changes: 27 additions & 1 deletion homeassistant/components/myneomitis/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
import logging
from typing import Any

import aiohttp
from pyaxencoapi import PyAxencoAPI

from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

Expand Down Expand Up @@ -141,6 +143,7 @@ def __init__(
self.entity_description = description
self._api = api
self._device = device
self._parents = device.get("parents")
self._attr_unique_id = device["_id"]
self._attr_available = device["connected"]
self._attr_device_info = dr.DeviceInfo(
Expand Down Expand Up @@ -199,6 +202,29 @@ async def async_select_option(self, option: str) -> None:
_LOGGER.warning("Unknown mode selected: %s", option)
return

await self._api.set_device_mode(self._device["_id"], mode_code)
try:
if self._device["model"] in SUPPORTED_MODELS:
await self._api.set_device_mode(self._device["_id"], mode_code)
else: # UFH
gateway = (
self._parents.split(",")[1]
if isinstance(self._parents, str)
else None
)
Comment on lines +209 to +213
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parse the gateway from parents without relying on a fixed comma layout (the current split(',')[1] can raise IndexError for a string that doesn’t contain at least two comma-separated parts).

Suggested change
gateway = (
self._parents.split(",")[1]
if isinstance(self._parents, str)
else None
)
gateway = None
if isinstance(self._parents, str):
parent_parts = [
part.strip() for part in self._parents.split(",") if part.strip()
]
if len(parent_parts) >= 2:
gateway = parent_parts[-1]

Copilot uses AI. Check for mistakes.
rfid = self._device.get("rfid")
if not gateway or not rfid:
_LOGGER.error(
"Missing gateway or rfid for sub-device %s, cannot set mode",
self._attr_unique_id,
)
raise HomeAssistantError(f"Failed to set mode for {self.entity_id}")

await self._api.set_sub_device_mode_ufh(gateway, str(rfid), mode_code)
except (aiohttp.ClientError, TimeoutError, ConnectionError) as err:
Comment on lines +206 to +223
Copy link

Copilot AI Apr 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a test that exercises the UFH sub-device path in async_select_option (including the parents/rfid handling and the set_sub_device_mode_ufh call), since current tests only cover the non-sub-device set_device_mode branch.

Copilot uses AI. Check for mistakes.
_LOGGER.error("Error setting mode for %s: %s", self._device["_id"], err)
raise HomeAssistantError(
f"Failed to set mode for {self.entity_id}"
) from err

self._attr_current_option = option
self.async_write_ha_state()
19 changes: 14 additions & 5 deletions tests/components/myneomitis/test_climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,14 @@
"currentTemp": 19.0,
"targetTemp": 20.0,
"targetMode": 1,
"comfTemp": 20.0,
"ecoTemp": 16.5,
"comfLimitMin": 7,
"comfLimitMax": 30,
"connected": True,
},
"connected": True,
"parents": {"gateway": "gw-1"},
"parents": ",gw-1,",
"rfid": "rfid-1",
"program": {"data": {}},
}
Expand All @@ -55,13 +57,15 @@
"currentTemp": 20.0,
"targetTemp": 21.0,
"targetMode": 1,
"comfTemp": 26.0,
"ecoTemp": 28.0,
"comfLimitMin": 7,
"comfLimitMax": 30,
"changeOverUser": 1,
"connected": True,
},
"connected": True,
"parents": {"gateway": "gw-ntd"},
"parents": ",gw-ntd,",
"rfid": "rfid-ntd",
"program": {"data": {}},
}
Expand Down Expand Up @@ -218,7 +222,7 @@ async def test_set_temperature_sub_device_missing_parents(
mock_pyaxenco_client: AsyncMock,
) -> None:
"""Missing parents/rfid for sub-device should fail temperature set without API call."""
bad_sub = {**CLIMATE_SUB_DEVICE, "parents": {}, "rfid": None}
bad_sub = {**CLIMATE_SUB_DEVICE, "parents": None, "rfid": None}
mock_pyaxenco_client.get_devices.return_value = [bad_sub]

mock_config_entry.add_to_hass(hass)
Expand Down Expand Up @@ -403,7 +407,7 @@ async def test_ntd_changeover_sets_cool(
mock_config_entry: MockConfigEntry,
mock_pyaxenco_client: AsyncMock,
) -> None:
"""NTD devices with changeOverUser==1 should expose COOL and OFF modes and start in COOL."""
"""NTD devices with comfTemp<ecoTemp should expose COOL and OFF modes and start in COOL."""
mock_pyaxenco_client.get_devices.return_value = [CLIMATE_NTD_COOL]
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
Expand Down Expand Up @@ -558,7 +562,12 @@ async def test_changeover_updates_hvac_when_not_off(
**CLIMATE_NTD_COOL,
"_id": "climate_ntd_heat",
"name": "Climate NTD Heat",
"state": {**CLIMATE_NTD_COOL["state"], "changeOverUser": 0},
"state": {
**CLIMATE_NTD_COOL["state"],
"changeOverUser": 0,
"comfTemp": 20.0,
"ecoTemp": 16.5,
},
}
mock_pyaxenco_client.get_devices.return_value = [ntd_heat]
mock_config_entry.add_to_hass(hass)
Expand Down
2 changes: 2 additions & 0 deletions tests/components/myneomitis/test_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
"name": "UFH Device",
"model": "UFH",
"state": {"changeOverUser": 0},
"parents": ",gw-ufh,",
"rfid": "rfid-ufh",
"connected": True,
"program": {"data": {}},
}
Expand Down