This commit is contained in:
Franck Nijhof 2024-12-10 21:45:06 +01:00 committed by GitHub
commit 3fe2c14a79
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 144 additions and 107 deletions

View File

@ -25,5 +25,5 @@
"integration_type": "device", "integration_type": "device",
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["aioacaia"], "loggers": ["aioacaia"],
"requirements": ["aioacaia==0.1.10"] "requirements": ["aioacaia==0.1.11"]
} }

View File

@ -28,5 +28,5 @@
"documentation": "https://www.home-assistant.io/integrations/august", "documentation": "https://www.home-assistant.io/integrations/august",
"iot_class": "cloud_push", "iot_class": "cloud_push",
"loggers": ["pubnub", "yalexs"], "loggers": ["pubnub", "yalexs"],
"requirements": ["yalexs==8.10.0", "yalexs-ble==2.5.1"] "requirements": ["yalexs==8.10.0", "yalexs-ble==2.5.2"]
} }

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/conversation", "documentation": "https://www.home-assistant.io/integrations/conversation",
"integration_type": "system", "integration_type": "system",
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["hassil==2.0.5", "home-assistant-intents==2024.12.4"] "requirements": ["hassil==2.0.5", "home-assistant-intents==2024.12.9"]
} }

View File

@ -5,5 +5,5 @@
"documentation": "https://www.home-assistant.io/integrations/cups", "documentation": "https://www.home-assistant.io/integrations/cups",
"iot_class": "local_polling", "iot_class": "local_polling",
"quality_scale": "legacy", "quality_scale": "legacy",
"requirements": ["pycups==1.9.73"] "requirements": ["pycups==2.0.4"]
} }

View File

@ -6,5 +6,5 @@
"integration_type": "service", "integration_type": "service",
"iot_class": "local_push", "iot_class": "local_push",
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["debugpy==1.8.6"] "requirements": ["debugpy==1.8.8"]
} }

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/ecovacs", "documentation": "https://www.home-assistant.io/integrations/ecovacs",
"iot_class": "cloud_push", "iot_class": "cloud_push",
"loggers": ["sleekxmppfs", "sucks", "deebot_client"], "loggers": ["sleekxmppfs", "sucks", "deebot_client"],
"requirements": ["py-sucks==0.9.10", "deebot-client==9.2.0"] "requirements": ["py-sucks==0.9.10", "deebot-client==9.3.0"]
} }

View File

@ -7,5 +7,5 @@
"documentation": "https://www.home-assistant.io/integrations/ezviz", "documentation": "https://www.home-assistant.io/integrations/ezviz",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["paho_mqtt", "pyezviz"], "loggers": ["paho_mqtt", "pyezviz"],
"requirements": ["pyezviz==0.2.2.3"] "requirements": ["pyezviz==0.2.1.2"]
} }

View File

@ -20,5 +20,5 @@
"documentation": "https://www.home-assistant.io/integrations/frontend", "documentation": "https://www.home-assistant.io/integrations/frontend",
"integration_type": "system", "integration_type": "system",
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["home-assistant-frontend==20241127.6"] "requirements": ["home-assistant-frontend==20241127.7"]
} }

View File

@ -53,10 +53,10 @@ class HusqvarnaConfigFlowHandler(
tz = await dt_util.async_get_time_zone(str(dt_util.DEFAULT_TIME_ZONE)) tz = await dt_util.async_get_time_zone(str(dt_util.DEFAULT_TIME_ZONE))
automower_api = AutomowerSession(AsyncConfigFlowAuth(websession, token), tz) automower_api = AutomowerSession(AsyncConfigFlowAuth(websession, token), tz)
try: try:
data = await automower_api.get_status() status_data = await automower_api.get_status()
except Exception: # noqa: BLE001 except Exception: # noqa: BLE001
return self.async_abort(reason="unknown") return self.async_abort(reason="unknown")
if data == {}: if status_data == {}:
return self.async_abort(reason="no_mower_connected") return self.async_abort(reason="no_mower_connected")
structured_token = structure_token(token[CONF_ACCESS_TOKEN]) structured_token = structure_token(token[CONF_ACCESS_TOKEN])

View File

@ -7,7 +7,7 @@ from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.exceptions import ConfigEntryAuthFailed
from .const import DOMAIN from .const import APP_ID, DOMAIN
from .coordinator import ( from .coordinator import (
HydrawiseMainDataUpdateCoordinator, HydrawiseMainDataUpdateCoordinator,
HydrawiseUpdateCoordinators, HydrawiseUpdateCoordinators,
@ -30,7 +30,8 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b
raise ConfigEntryAuthFailed raise ConfigEntryAuthFailed
hydrawise = client.Hydrawise( hydrawise = client.Hydrawise(
auth.Auth(config_entry.data[CONF_USERNAME], config_entry.data[CONF_PASSWORD]) auth.Auth(config_entry.data[CONF_USERNAME], config_entry.data[CONF_PASSWORD]),
app_id=APP_ID,
) )
main_coordinator = HydrawiseMainDataUpdateCoordinator(hass, hydrawise) main_coordinator = HydrawiseMainDataUpdateCoordinator(hass, hydrawise)

View File

@ -6,14 +6,14 @@ from collections.abc import Callable, Mapping
from typing import Any from typing import Any
from aiohttp import ClientError from aiohttp import ClientError
from pydrawise import auth, client from pydrawise import auth as pydrawise_auth, client
from pydrawise.exceptions import NotAuthorizedError from pydrawise.exceptions import NotAuthorizedError
import voluptuous as vol import voluptuous as vol
from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
from .const import DOMAIN, LOGGER from .const import APP_ID, DOMAIN, LOGGER
class HydrawiseConfigFlow(ConfigFlow, domain=DOMAIN): class HydrawiseConfigFlow(ConfigFlow, domain=DOMAIN):
@ -29,16 +29,21 @@ class HydrawiseConfigFlow(ConfigFlow, domain=DOMAIN):
on_failure: Callable[[str], ConfigFlowResult], on_failure: Callable[[str], ConfigFlowResult],
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Create the config entry.""" """Create the config entry."""
# Verify that the provided credentials work.""" # Verify that the provided credentials work."""
api = client.Hydrawise(auth.Auth(username, password)) auth = pydrawise_auth.Auth(username, password)
try: try:
# Don't fetch zones because we don't need them yet. await auth.token()
user = await api.get_user(fetch_zones=False)
except NotAuthorizedError: except NotAuthorizedError:
return on_failure("invalid_auth") return on_failure("invalid_auth")
except TimeoutError: except TimeoutError:
return on_failure("timeout_connect") return on_failure("timeout_connect")
try:
api = client.Hydrawise(auth, app_id=APP_ID)
# Don't fetch zones because we don't need them yet.
user = await api.get_user(fetch_zones=False)
except TimeoutError:
return on_failure("timeout_connect")
except ClientError as ex: except ClientError as ex:
LOGGER.error("Unable to connect to Hydrawise cloud service: %s", ex) LOGGER.error("Unable to connect to Hydrawise cloud service: %s", ex)
return on_failure("cannot_connect") return on_failure("cannot_connect")

View File

@ -3,8 +3,12 @@
from datetime import timedelta from datetime import timedelta
import logging import logging
from homeassistant.const import __version__ as HA_VERSION
LOGGER = logging.getLogger(__package__) LOGGER = logging.getLogger(__package__)
APP_ID = f"homeassistant-{HA_VERSION}"
DOMAIN = "hydrawise" DOMAIN = "hydrawise"
DEFAULT_WATERING_TIME = timedelta(minutes=15) DEFAULT_WATERING_TIME = timedelta(minutes=15)

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/hydrawise", "documentation": "https://www.home-assistant.io/integrations/hydrawise",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["pydrawise"], "loggers": ["pydrawise"],
"requirements": ["pydrawise==2024.9.0"] "requirements": ["pydrawise==2024.12.0"]
} }

View File

@ -8,6 +8,6 @@
"iot_class": "calculated", "iot_class": "calculated",
"loggers": ["yt_dlp"], "loggers": ["yt_dlp"],
"quality_scale": "internal", "quality_scale": "internal",
"requirements": ["yt-dlp[default]==2024.12.03"], "requirements": ["yt-dlp[default]==2024.12.06"],
"single_config_entry": true "single_config_entry": true
} }

View File

@ -95,11 +95,17 @@ PARAMETER_ID_TO_EXCLUDE_F730 = (
) )
PARAMETER_ID_TO_INCLUDE_SMO20 = ( PARAMETER_ID_TO_INCLUDE_SMO20 = (
"40013",
"40033",
"40940", "40940",
"44069",
"44071",
"44073",
"47011", "47011",
"47015", "47015",
"47028", "47028",
"47032", "47032",
"47398",
"50004", "50004",
) )

View File

@ -191,17 +191,8 @@ class PlugwiseClimateEntity(PlugwiseEntity, ClimateEntity):
self._previous_action_mode(self.coordinator) self._previous_action_mode(self.coordinator)
# Adam provides the hvac_action for each thermostat # Adam provides the hvac_action for each thermostat
if self._gateway["smile_name"] == "Adam": if (action := self.device.get("control_state")) is not None:
if (control_state := self.device.get("control_state")) == "cooling": return HVACAction(action)
return HVACAction.COOLING
if control_state == "heating":
return HVACAction.HEATING
if control_state == "preheating":
return HVACAction.PREHEATING
if control_state == "off":
return HVACAction.IDLE
return HVACAction.IDLE
# Anna # Anna
heater: str = self._gateway["heater_id"] heater: str = self._gateway["heater_id"]

View File

@ -7,6 +7,6 @@
"integration_type": "hub", "integration_type": "hub",
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["plugwise"], "loggers": ["plugwise"],
"requirements": ["plugwise==1.6.0"], "requirements": ["plugwise==1.6.3"],
"zeroconf": ["_plugwise._tcp.local."] "zeroconf": ["_plugwise._tcp.local."]
} }

View File

@ -18,5 +18,5 @@
"documentation": "https://www.home-assistant.io/integrations/reolink", "documentation": "https://www.home-assistant.io/integrations/reolink",
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["reolink_aio"], "loggers": ["reolink_aio"],
"requirements": ["reolink-aio==0.11.4"] "requirements": ["reolink-aio==0.11.5"]
} }

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/risco", "documentation": "https://www.home-assistant.io/integrations/risco",
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["pyrisco"], "loggers": ["pyrisco"],
"requirements": ["pyrisco==0.6.4"] "requirements": ["pyrisco==0.6.5"]
} }

View File

@ -79,6 +79,8 @@ class SwitchBotCloudAirConditioner(SwitchBotCloudEntity, ClimateEntity):
_attr_hvac_mode = HVACMode.FAN_ONLY _attr_hvac_mode = HVACMode.FAN_ONLY
_attr_temperature_unit = UnitOfTemperature.CELSIUS _attr_temperature_unit = UnitOfTemperature.CELSIUS
_attr_target_temperature = 21 _attr_target_temperature = 21
_attr_target_temperature_step = 1
_attr_precision = 1
_attr_name = None _attr_name = None
_enable_turn_on_off_backwards_compatibility = False _enable_turn_on_off_backwards_compatibility = False
@ -97,7 +99,7 @@ class SwitchBotCloudAirConditioner(SwitchBotCloudEntity, ClimateEntity):
) )
await self.send_api_command( await self.send_api_command(
AirConditionerCommands.SET_ALL, AirConditionerCommands.SET_ALL,
parameters=f"{new_temperature},{new_mode},{new_fan_speed},on", parameters=f"{int(new_temperature)},{new_mode},{new_fan_speed},on",
) )
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:

View File

@ -14,5 +14,5 @@
}, },
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["PyTado"], "loggers": ["PyTado"],
"requirements": ["python-tado==0.17.7"] "requirements": ["python-tado==0.17.6"]
} }

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/totalconnect", "documentation": "https://www.home-assistant.io/integrations/totalconnect",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["total_connect_client"], "loggers": ["total_connect_client"],
"requirements": ["total-connect-client==2024.5"] "requirements": ["total-connect-client==2024.12"]
} }

View File

@ -7,5 +7,5 @@
"integration_type": "service", "integration_type": "service",
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["twentemilieu"], "loggers": ["twentemilieu"],
"requirements": ["twentemilieu==2.1.0"] "requirements": ["twentemilieu==2.2.0"]
} }

View File

@ -7,7 +7,7 @@
"integration_type": "hub", "integration_type": "hub",
"iot_class": "local_push", "iot_class": "local_push",
"loggers": ["aiounifi"], "loggers": ["aiounifi"],
"requirements": ["aiounifi==80"], "requirements": ["aiounifi==81"],
"ssdp": [ "ssdp": [
{ {
"manufacturer": "Ubiquiti Networks", "manufacturer": "Ubiquiti Networks",

View File

@ -13,5 +13,5 @@
"documentation": "https://www.home-assistant.io/integrations/yale", "documentation": "https://www.home-assistant.io/integrations/yale",
"iot_class": "cloud_push", "iot_class": "cloud_push",
"loggers": ["socketio", "engineio", "yalexs"], "loggers": ["socketio", "engineio", "yalexs"],
"requirements": ["yalexs==8.10.0", "yalexs-ble==2.5.1"] "requirements": ["yalexs==8.10.0", "yalexs-ble==2.5.2"]
} }

View File

@ -12,5 +12,5 @@
"dependencies": ["bluetooth_adapters"], "dependencies": ["bluetooth_adapters"],
"documentation": "https://www.home-assistant.io/integrations/yalexs_ble", "documentation": "https://www.home-assistant.io/integrations/yalexs_ble",
"iot_class": "local_push", "iot_class": "local_push",
"requirements": ["yalexs-ble==2.5.1"] "requirements": ["yalexs-ble==2.5.2"]
} }

View File

@ -21,7 +21,7 @@
"zha", "zha",
"universal_silabs_flasher" "universal_silabs_flasher"
], ],
"requirements": ["universal-silabs-flasher==0.0.25", "zha==0.0.41"], "requirements": ["universal-silabs-flasher==0.0.25", "zha==0.0.42"],
"usb": [ "usb": [
{ {
"vid": "10C4", "vid": "10C4",

View File

@ -25,7 +25,7 @@ if TYPE_CHECKING:
APPLICATION_NAME: Final = "HomeAssistant" APPLICATION_NAME: Final = "HomeAssistant"
MAJOR_VERSION: Final = 2024 MAJOR_VERSION: Final = 2024
MINOR_VERSION: Final = 12 MINOR_VERSION: Final = 12
PATCH_VERSION: Final = "1" PATCH_VERSION: Final = "2"
__short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
__version__: Final = f"{__short_version__}.{PATCH_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}"
REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 12, 0) REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 12, 0)

View File

@ -34,8 +34,8 @@ habluetooth==3.6.0
hass-nabucasa==0.86.0 hass-nabucasa==0.86.0
hassil==2.0.5 hassil==2.0.5
home-assistant-bluetooth==1.13.0 home-assistant-bluetooth==1.13.0
home-assistant-frontend==20241127.6 home-assistant-frontend==20241127.7
home-assistant-intents==2024.12.4 home-assistant-intents==2024.12.9
httpx==0.27.2 httpx==0.27.2
ifaddr==0.2.0 ifaddr==0.2.0
Jinja2==3.1.4 Jinja2==3.1.4

View File

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "homeassistant" name = "homeassistant"
version = "2024.12.1" version = "2024.12.2"
license = {text = "Apache-2.0"} license = {text = "Apache-2.0"}
description = "Open-source home automation platform running on Python 3." description = "Open-source home automation platform running on Python 3."
readme = "README.rst" readme = "README.rst"

View File

@ -173,7 +173,7 @@ aio-geojson-usgs-earthquakes==0.3
aio-georss-gdacs==0.10 aio-georss-gdacs==0.10
# homeassistant.components.acaia # homeassistant.components.acaia
aioacaia==0.1.10 aioacaia==0.1.11
# homeassistant.components.airq # homeassistant.components.airq
aioairq==0.4.3 aioairq==0.4.3
@ -402,7 +402,7 @@ aiotedee==0.2.20
aiotractive==0.6.0 aiotractive==0.6.0
# homeassistant.components.unifi # homeassistant.components.unifi
aiounifi==80 aiounifi==81
# homeassistant.components.vlc_telnet # homeassistant.components.vlc_telnet
aiovlc==0.5.1 aiovlc==0.5.1
@ -729,7 +729,7 @@ datapoint==0.9.9
dbus-fast==2.24.3 dbus-fast==2.24.3
# homeassistant.components.debugpy # homeassistant.components.debugpy
debugpy==1.8.6 debugpy==1.8.8
# homeassistant.components.decora_wifi # homeassistant.components.decora_wifi
# decora-wifi==1.4 # decora-wifi==1.4
@ -738,7 +738,7 @@ debugpy==1.8.6
# decora==0.6 # decora==0.6
# homeassistant.components.ecovacs # homeassistant.components.ecovacs
deebot-client==9.2.0 deebot-client==9.3.0
# homeassistant.components.ihc # homeassistant.components.ihc
# homeassistant.components.namecheapdns # homeassistant.components.namecheapdns
@ -1130,10 +1130,10 @@ hole==0.8.0
holidays==0.62 holidays==0.62
# homeassistant.components.frontend # homeassistant.components.frontend
home-assistant-frontend==20241127.6 home-assistant-frontend==20241127.7
# homeassistant.components.conversation # homeassistant.components.conversation
home-assistant-intents==2024.12.4 home-assistant-intents==2024.12.9
# homeassistant.components.home_connect # homeassistant.components.home_connect
homeconnect==0.8.0 homeconnect==0.8.0
@ -1622,7 +1622,7 @@ plexauth==0.0.6
plexwebsocket==0.0.14 plexwebsocket==0.0.14
# homeassistant.components.plugwise # homeassistant.components.plugwise
plugwise==1.6.0 plugwise==1.6.3
# homeassistant.components.plum_lightpad # homeassistant.components.plum_lightpad
plumlightpad==0.0.11 plumlightpad==0.0.11
@ -1832,7 +1832,7 @@ pycountry==24.6.1
pycsspeechtts==1.0.8 pycsspeechtts==1.0.8
# homeassistant.components.cups # homeassistant.components.cups
# pycups==1.9.73 # pycups==2.0.4
# homeassistant.components.daikin # homeassistant.components.daikin
pydaikin==2.13.7 pydaikin==2.13.7
@ -1859,7 +1859,7 @@ pydiscovergy==3.0.2
pydoods==1.0.2 pydoods==1.0.2
# homeassistant.components.hydrawise # homeassistant.components.hydrawise
pydrawise==2024.9.0 pydrawise==2024.12.0
# homeassistant.components.android_ip_webcam # homeassistant.components.android_ip_webcam
pydroid-ipcam==2.0.0 pydroid-ipcam==2.0.0
@ -1907,7 +1907,7 @@ pyeverlights==0.1.0
pyevilgenius==2.0.0 pyevilgenius==2.0.0
# homeassistant.components.ezviz # homeassistant.components.ezviz
pyezviz==0.2.2.3 pyezviz==0.2.1.2
# homeassistant.components.fibaro # homeassistant.components.fibaro
pyfibaro==0.8.0 pyfibaro==0.8.0
@ -2203,7 +2203,7 @@ pyrecswitch==1.0.2
pyrepetierng==0.1.0 pyrepetierng==0.1.0
# homeassistant.components.risco # homeassistant.components.risco
pyrisco==0.6.4 pyrisco==0.6.5
# homeassistant.components.rituals_perfume_genie # homeassistant.components.rituals_perfume_genie
pyrituals==0.0.6 pyrituals==0.0.6
@ -2411,7 +2411,7 @@ python-smarttub==0.0.38
python-songpal==0.16.2 python-songpal==0.16.2
# homeassistant.components.tado # homeassistant.components.tado
python-tado==0.17.7 python-tado==0.17.6
# homeassistant.components.technove # homeassistant.components.technove
python-technove==1.3.1 python-technove==1.3.1
@ -2556,7 +2556,7 @@ renault-api==0.2.7
renson-endura-delta==1.7.1 renson-endura-delta==1.7.1
# homeassistant.components.reolink # homeassistant.components.reolink
reolink-aio==0.11.4 reolink-aio==0.11.5
# homeassistant.components.idteck_prox # homeassistant.components.idteck_prox
rfk101py==0.0.1 rfk101py==0.0.1
@ -2858,7 +2858,7 @@ tololib==1.1.0
toonapi==0.3.0 toonapi==0.3.0
# homeassistant.components.totalconnect # homeassistant.components.totalconnect
total-connect-client==2024.5 total-connect-client==2024.12
# homeassistant.components.tplink_lte # homeassistant.components.tplink_lte
tp-connected==0.0.4 tp-connected==0.0.4
@ -2882,7 +2882,7 @@ ttn_client==1.2.0
tuya-device-sharing-sdk==0.2.1 tuya-device-sharing-sdk==0.2.1
# homeassistant.components.twentemilieu # homeassistant.components.twentemilieu
twentemilieu==2.1.0 twentemilieu==2.2.0
# homeassistant.components.twilio # homeassistant.components.twilio
twilio==6.32.0 twilio==6.32.0
@ -3044,7 +3044,7 @@ yalesmartalarmclient==0.4.3
# homeassistant.components.august # homeassistant.components.august
# homeassistant.components.yale # homeassistant.components.yale
# homeassistant.components.yalexs_ble # homeassistant.components.yalexs_ble
yalexs-ble==2.5.1 yalexs-ble==2.5.2
# homeassistant.components.august # homeassistant.components.august
# homeassistant.components.yale # homeassistant.components.yale
@ -3066,7 +3066,7 @@ youless-api==2.1.2
youtubeaio==1.1.5 youtubeaio==1.1.5
# homeassistant.components.media_extractor # homeassistant.components.media_extractor
yt-dlp[default]==2024.12.03 yt-dlp[default]==2024.12.06
# homeassistant.components.zamg # homeassistant.components.zamg
zamg==0.3.6 zamg==0.3.6
@ -3081,7 +3081,7 @@ zeroconf==0.136.2
zeversolar==0.3.2 zeversolar==0.3.2
# homeassistant.components.zha # homeassistant.components.zha
zha==0.0.41 zha==0.0.42
# homeassistant.components.zhong_hong # homeassistant.components.zhong_hong
zhong-hong-hvac==1.0.13 zhong-hong-hvac==1.0.13

View File

@ -161,7 +161,7 @@ aio-geojson-usgs-earthquakes==0.3
aio-georss-gdacs==0.10 aio-georss-gdacs==0.10
# homeassistant.components.acaia # homeassistant.components.acaia
aioacaia==0.1.10 aioacaia==0.1.11
# homeassistant.components.airq # homeassistant.components.airq
aioairq==0.4.3 aioairq==0.4.3
@ -384,7 +384,7 @@ aiotedee==0.2.20
aiotractive==0.6.0 aiotractive==0.6.0
# homeassistant.components.unifi # homeassistant.components.unifi
aiounifi==80 aiounifi==81
# homeassistant.components.vlc_telnet # homeassistant.components.vlc_telnet
aiovlc==0.5.1 aiovlc==0.5.1
@ -625,10 +625,10 @@ datapoint==0.9.9
dbus-fast==2.24.3 dbus-fast==2.24.3
# homeassistant.components.debugpy # homeassistant.components.debugpy
debugpy==1.8.6 debugpy==1.8.8
# homeassistant.components.ecovacs # homeassistant.components.ecovacs
deebot-client==9.2.0 deebot-client==9.3.0
# homeassistant.components.ihc # homeassistant.components.ihc
# homeassistant.components.namecheapdns # homeassistant.components.namecheapdns
@ -956,10 +956,10 @@ hole==0.8.0
holidays==0.62 holidays==0.62
# homeassistant.components.frontend # homeassistant.components.frontend
home-assistant-frontend==20241127.6 home-assistant-frontend==20241127.7
# homeassistant.components.conversation # homeassistant.components.conversation
home-assistant-intents==2024.12.4 home-assistant-intents==2024.12.9
# homeassistant.components.home_connect # homeassistant.components.home_connect
homeconnect==0.8.0 homeconnect==0.8.0
@ -1329,7 +1329,7 @@ plexauth==0.0.6
plexwebsocket==0.0.14 plexwebsocket==0.0.14
# homeassistant.components.plugwise # homeassistant.components.plugwise
plugwise==1.6.0 plugwise==1.6.3
# homeassistant.components.plum_lightpad # homeassistant.components.plum_lightpad
plumlightpad==0.0.11 plumlightpad==0.0.11
@ -1500,7 +1500,7 @@ pydexcom==0.2.3
pydiscovergy==3.0.2 pydiscovergy==3.0.2
# homeassistant.components.hydrawise # homeassistant.components.hydrawise
pydrawise==2024.9.0 pydrawise==2024.12.0
# homeassistant.components.android_ip_webcam # homeassistant.components.android_ip_webcam
pydroid-ipcam==2.0.0 pydroid-ipcam==2.0.0
@ -1536,7 +1536,7 @@ pyeverlights==0.1.0
pyevilgenius==2.0.0 pyevilgenius==2.0.0
# homeassistant.components.ezviz # homeassistant.components.ezviz
pyezviz==0.2.2.3 pyezviz==0.2.1.2
# homeassistant.components.fibaro # homeassistant.components.fibaro
pyfibaro==0.8.0 pyfibaro==0.8.0
@ -1775,7 +1775,7 @@ pyqwikswitch==0.93
pyrainbird==6.0.1 pyrainbird==6.0.1
# homeassistant.components.risco # homeassistant.components.risco
pyrisco==0.6.4 pyrisco==0.6.5
# homeassistant.components.rituals_perfume_genie # homeassistant.components.rituals_perfume_genie
pyrituals==0.0.6 pyrituals==0.0.6
@ -1932,7 +1932,7 @@ python-smarttub==0.0.38
python-songpal==0.16.2 python-songpal==0.16.2
# homeassistant.components.tado # homeassistant.components.tado
python-tado==0.17.7 python-tado==0.17.6
# homeassistant.components.technove # homeassistant.components.technove
python-technove==1.3.1 python-technove==1.3.1
@ -2047,7 +2047,7 @@ renault-api==0.2.7
renson-endura-delta==1.7.1 renson-endura-delta==1.7.1
# homeassistant.components.reolink # homeassistant.components.reolink
reolink-aio==0.11.4 reolink-aio==0.11.5
# homeassistant.components.rflink # homeassistant.components.rflink
rflink==0.0.66 rflink==0.0.66
@ -2274,7 +2274,7 @@ tololib==1.1.0
toonapi==0.3.0 toonapi==0.3.0
# homeassistant.components.totalconnect # homeassistant.components.totalconnect
total-connect-client==2024.5 total-connect-client==2024.12
# homeassistant.components.tplink_omada # homeassistant.components.tplink_omada
tplink-omada-client==1.4.3 tplink-omada-client==1.4.3
@ -2295,7 +2295,7 @@ ttn_client==1.2.0
tuya-device-sharing-sdk==0.2.1 tuya-device-sharing-sdk==0.2.1
# homeassistant.components.twentemilieu # homeassistant.components.twentemilieu
twentemilieu==2.1.0 twentemilieu==2.2.0
# homeassistant.components.twilio # homeassistant.components.twilio
twilio==6.32.0 twilio==6.32.0
@ -2433,7 +2433,7 @@ yalesmartalarmclient==0.4.3
# homeassistant.components.august # homeassistant.components.august
# homeassistant.components.yale # homeassistant.components.yale
# homeassistant.components.yalexs_ble # homeassistant.components.yalexs_ble
yalexs-ble==2.5.1 yalexs-ble==2.5.2
# homeassistant.components.august # homeassistant.components.august
# homeassistant.components.yale # homeassistant.components.yale
@ -2452,7 +2452,7 @@ youless-api==2.1.2
youtubeaio==1.1.5 youtubeaio==1.1.5
# homeassistant.components.media_extractor # homeassistant.components.media_extractor
yt-dlp[default]==2024.12.03 yt-dlp[default]==2024.12.06
# homeassistant.components.zamg # homeassistant.components.zamg
zamg==0.3.6 zamg==0.3.6
@ -2464,7 +2464,7 @@ zeroconf==0.136.2
zeversolar==0.3.2 zeversolar==0.3.2
# homeassistant.components.zha # homeassistant.components.zha
zha==0.0.41 zha==0.0.42
# homeassistant.components.zwave_js # homeassistant.components.zwave_js
zwave-js-server-python==0.59.1 zwave-js-server-python==0.59.1

View File

@ -23,7 +23,7 @@ RUN --mount=from=ghcr.io/astral-sh/uv:0.5.4,source=/uv,target=/bin/uv \
-c /usr/src/homeassistant/homeassistant/package_constraints.txt \ -c /usr/src/homeassistant/homeassistant/package_constraints.txt \
-r /usr/src/homeassistant/requirements.txt \ -r /usr/src/homeassistant/requirements.txt \
stdlib-list==0.10.0 pipdeptree==2.23.4 tqdm==4.66.5 ruff==0.8.0 \ stdlib-list==0.10.0 pipdeptree==2.23.4 tqdm==4.66.5 ruff==0.8.0 \
PyTurboJPEG==1.7.5 go2rtc-client==0.1.1 ha-ffmpeg==3.2.2 hassil==2.0.5 home-assistant-intents==2024.12.4 mutagen==1.47.0 pymicro-vad==1.0.1 pyspeex-noise==1.0.2 PyTurboJPEG==1.7.5 go2rtc-client==0.1.1 ha-ffmpeg==3.2.2 hassil==2.0.5 home-assistant-intents==2024.12.9 mutagen==1.47.0 pymicro-vad==1.0.1 pyspeex-noise==1.0.2
LABEL "name"="hassfest" LABEL "name"="hassfest"
LABEL "maintainer"="Home Assistant <hello@home-assistant.io>" LABEL "maintainer"="Home Assistant <hello@home-assistant.io>"

View File

@ -571,7 +571,7 @@
'name': 'HassGetState', 'name': 'HassGetState',
}), }),
'match': True, 'match': True,
'sentence_template': '[tell me] how many {on_off_domains:domain} (is|are) {on_off_states:state} [in <area>]', 'sentence_template': '[tell me] how many {on_off_domains:domain} (is|are) {on_off_states:state} [<in_area_floor>]',
'slots': dict({ 'slots': dict({
'area': 'kitchen', 'area': 'kitchen',
'domain': 'lights', 'domain': 'lights',

View File

@ -56,7 +56,6 @@ def mock_legacy_pydrawise(
@pytest.fixture @pytest.fixture
def mock_pydrawise( def mock_pydrawise(
mock_auth: AsyncMock,
user: User, user: User,
controller: Controller, controller: Controller,
zones: list[Zone], zones: list[Zone],

View File

@ -21,6 +21,7 @@ pytestmark = pytest.mark.usefixtures("mock_setup_entry")
async def test_form( async def test_form(
hass: HomeAssistant, hass: HomeAssistant,
mock_setup_entry: AsyncMock, mock_setup_entry: AsyncMock,
mock_auth: AsyncMock,
mock_pydrawise: AsyncMock, mock_pydrawise: AsyncMock,
user: User, user: User,
) -> None: ) -> None:
@ -46,11 +47,12 @@ async def test_form(
CONF_PASSWORD: "__password__", CONF_PASSWORD: "__password__",
} }
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
mock_pydrawise.get_user.assert_called_once_with(fetch_zones=False) mock_auth.token.assert_awaited_once_with()
mock_pydrawise.get_user.assert_awaited_once_with(fetch_zones=False)
async def test_form_api_error( async def test_form_api_error(
hass: HomeAssistant, mock_pydrawise: AsyncMock, user: User hass: HomeAssistant, mock_auth: AsyncMock, mock_pydrawise: AsyncMock, user: User
) -> None: ) -> None:
"""Test we handle API errors.""" """Test we handle API errors."""
mock_pydrawise.get_user.side_effect = ClientError("XXX") mock_pydrawise.get_user.side_effect = ClientError("XXX")
@ -71,8 +73,29 @@ async def test_form_api_error(
assert result2["type"] is FlowResultType.CREATE_ENTRY assert result2["type"] is FlowResultType.CREATE_ENTRY
async def test_form_connect_timeout( async def test_form_auth_connect_timeout(
hass: HomeAssistant, mock_pydrawise: AsyncMock, user: User hass: HomeAssistant, mock_auth: AsyncMock, mock_pydrawise: AsyncMock
) -> None:
"""Test we handle API errors."""
mock_auth.token.side_effect = TimeoutError
init_result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
data = {CONF_USERNAME: "asdf@asdf.com", CONF_PASSWORD: "__password__"}
result = await hass.config_entries.flow.async_configure(
init_result["flow_id"], data
)
assert result["type"] is FlowResultType.FORM
assert result["errors"] == {"base": "timeout_connect"}
mock_auth.token.reset_mock(side_effect=True)
result2 = await hass.config_entries.flow.async_configure(result["flow_id"], data)
assert result2["type"] is FlowResultType.CREATE_ENTRY
async def test_form_client_connect_timeout(
hass: HomeAssistant, mock_auth: AsyncMock, mock_pydrawise: AsyncMock, user: User
) -> None: ) -> None:
"""Test we handle API errors.""" """Test we handle API errors."""
mock_pydrawise.get_user.side_effect = TimeoutError mock_pydrawise.get_user.side_effect = TimeoutError
@ -94,10 +117,10 @@ async def test_form_connect_timeout(
async def test_form_not_authorized_error( async def test_form_not_authorized_error(
hass: HomeAssistant, mock_pydrawise: AsyncMock, user: User hass: HomeAssistant, mock_auth: AsyncMock, mock_pydrawise: AsyncMock
) -> None: ) -> None:
"""Test we handle API errors.""" """Test we handle API errors."""
mock_pydrawise.get_user.side_effect = NotAuthorizedError mock_auth.token.side_effect = NotAuthorizedError
init_result = await hass.config_entries.flow.async_init( init_result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER} DOMAIN, context={"source": config_entries.SOURCE_USER}
@ -109,8 +132,7 @@ async def test_form_not_authorized_error(
assert result["type"] is FlowResultType.FORM assert result["type"] is FlowResultType.FORM
assert result["errors"] == {"base": "invalid_auth"} assert result["errors"] == {"base": "invalid_auth"}
mock_pydrawise.get_user.reset_mock(side_effect=True) mock_auth.token.reset_mock(side_effect=True)
mock_pydrawise.get_user.return_value = user
result2 = await hass.config_entries.flow.async_configure(result["flow_id"], data) result2 = await hass.config_entries.flow.async_configure(result["flow_id"], data)
assert result2["type"] is FlowResultType.CREATE_ENTRY assert result2["type"] is FlowResultType.CREATE_ENTRY
@ -118,6 +140,7 @@ async def test_form_not_authorized_error(
async def test_reauth( async def test_reauth(
hass: HomeAssistant, hass: HomeAssistant,
user: User, user: User,
mock_auth: AsyncMock,
mock_pydrawise: AsyncMock, mock_pydrawise: AsyncMock,
) -> None: ) -> None:
"""Test that re-authorization works.""" """Test that re-authorization works."""

View File

@ -176,7 +176,7 @@
"off" "off"
], ],
"climate_mode": "auto", "climate_mode": "auto",
"control_state": "off", "control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Bathroom", "name": "Bathroom",

View File

@ -3,7 +3,7 @@
"06aecb3d00354375924f50c47af36bd2": { "06aecb3d00354375924f50c47af36bd2": {
"active_preset": "no_frost", "active_preset": "no_frost",
"climate_mode": "off", "climate_mode": "off",
"control_state": "off", "control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Slaapkamer", "name": "Slaapkamer",
@ -26,7 +26,7 @@
"13228dab8ce04617af318a2888b3c548": { "13228dab8ce04617af318a2888b3c548": {
"active_preset": "home", "active_preset": "home",
"climate_mode": "heat", "climate_mode": "heat",
"control_state": "off", "control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Woonkamer", "name": "Woonkamer",
@ -238,7 +238,7 @@
"d27aede973b54be484f6842d1b2802ad": { "d27aede973b54be484f6842d1b2802ad": {
"active_preset": "home", "active_preset": "home",
"climate_mode": "heat", "climate_mode": "heat",
"control_state": "off", "control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Kinderkamer", "name": "Kinderkamer",
@ -285,7 +285,7 @@
"d58fec52899f4f1c92e4f8fad6d8c48c": { "d58fec52899f4f1c92e4f8fad6d8c48c": {
"active_preset": "home", "active_preset": "home",
"climate_mode": "heat", "climate_mode": "heat",
"control_state": "off", "control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Logeerkamer", "name": "Logeerkamer",

View File

@ -32,6 +32,7 @@
"off" "off"
], ],
"climate_mode": "auto", "climate_mode": "auto",
"control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Badkamer", "name": "Badkamer",
@ -66,6 +67,7 @@
"off" "off"
], ],
"climate_mode": "heat", "climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Bios", "name": "Bios",
@ -112,6 +114,7 @@
"446ac08dd04d4eff8ac57489757b7314": { "446ac08dd04d4eff8ac57489757b7314": {
"active_preset": "no_frost", "active_preset": "no_frost",
"climate_mode": "heat", "climate_mode": "heat",
"control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Garage", "name": "Garage",
@ -258,6 +261,7 @@
"off" "off"
], ],
"climate_mode": "auto", "climate_mode": "auto",
"control_state": "idle",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Jessie", "name": "Jessie",
@ -402,6 +406,7 @@
"off" "off"
], ],
"climate_mode": "auto", "climate_mode": "auto",
"control_state": "heating",
"dev_class": "climate", "dev_class": "climate",
"model": "ThermoZone", "model": "ThermoZone",
"name": "Woonkamer", "name": "Woonkamer",
@ -577,7 +582,7 @@
"cooling_present": false, "cooling_present": false,
"gateway_id": "fe799307f1624099878210aa0b9f1475", "gateway_id": "fe799307f1624099878210aa0b9f1475",
"heater_id": "90986d591dcd426cae3ec3e8111ff730", "heater_id": "90986d591dcd426cae3ec3e8111ff730",
"item_count": 364, "item_count": 369,
"notifications": { "notifications": {
"af82e4ccf9c548528166d38e560662a4": { "af82e4ccf9c548528166d38e560662a4": {
"warning": "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device." "warning": "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device."

View File

@ -34,6 +34,7 @@
'off', 'off',
]), ]),
'climate_mode': 'auto', 'climate_mode': 'auto',
'control_state': 'idle',
'dev_class': 'climate', 'dev_class': 'climate',
'model': 'ThermoZone', 'model': 'ThermoZone',
'name': 'Badkamer', 'name': 'Badkamer',
@ -75,6 +76,7 @@
'off', 'off',
]), ]),
'climate_mode': 'heat', 'climate_mode': 'heat',
'control_state': 'idle',
'dev_class': 'climate', 'dev_class': 'climate',
'model': 'ThermoZone', 'model': 'ThermoZone',
'name': 'Bios', 'name': 'Bios',
@ -131,6 +133,7 @@
'446ac08dd04d4eff8ac57489757b7314': dict({ '446ac08dd04d4eff8ac57489757b7314': dict({
'active_preset': 'no_frost', 'active_preset': 'no_frost',
'climate_mode': 'heat', 'climate_mode': 'heat',
'control_state': 'idle',
'dev_class': 'climate', 'dev_class': 'climate',
'model': 'ThermoZone', 'model': 'ThermoZone',
'name': 'Garage', 'name': 'Garage',
@ -286,6 +289,7 @@
'off', 'off',
]), ]),
'climate_mode': 'auto', 'climate_mode': 'auto',
'control_state': 'idle',
'dev_class': 'climate', 'dev_class': 'climate',
'model': 'ThermoZone', 'model': 'ThermoZone',
'name': 'Jessie', 'name': 'Jessie',
@ -440,6 +444,7 @@
'off', 'off',
]), ]),
'climate_mode': 'auto', 'climate_mode': 'auto',
'control_state': 'heating',
'dev_class': 'climate', 'dev_class': 'climate',
'model': 'ThermoZone', 'model': 'ThermoZone',
'name': 'Woonkamer', 'name': 'Woonkamer',
@ -625,7 +630,7 @@
'cooling_present': False, 'cooling_present': False,
'gateway_id': 'fe799307f1624099878210aa0b9f1475', 'gateway_id': 'fe799307f1624099878210aa0b9f1475',
'heater_id': '90986d591dcd426cae3ec3e8111ff730', 'heater_id': '90986d591dcd426cae3ec3e8111ff730',
'item_count': 364, 'item_count': 369,
'notifications': dict({ 'notifications': dict({
'af82e4ccf9c548528166d38e560662a4': dict({ 'af82e4ccf9c548528166d38e560662a4': dict({
'warning': "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device.", 'warning': "Node Plug (with MAC address 000D6F000D13CB01, in room 'n.a.') has been unreachable since 23:03 2020-01-18. Please check the connection and restart the device.",

View File

@ -31,15 +31,13 @@ async def test_adam_climate_entity_attributes(
state = hass.states.get("climate.woonkamer") state = hass.states.get("climate.woonkamer")
assert state assert state
assert state.state == HVACMode.AUTO assert state.state == HVACMode.AUTO
assert state.attributes["hvac_action"] == "heating"
assert state.attributes["hvac_modes"] == [HVACMode.AUTO, HVACMode.HEAT] assert state.attributes["hvac_modes"] == [HVACMode.AUTO, HVACMode.HEAT]
# hvac_action is not asserted as the fixture is not in line with recent firmware functionality
assert "preset_modes" in state.attributes assert "preset_modes" in state.attributes
assert "no_frost" in state.attributes["preset_modes"] assert "no_frost" in state.attributes["preset_modes"]
assert "home" in state.attributes["preset_modes"] assert "home" in state.attributes["preset_modes"]
assert state.attributes["current_temperature"] == 20.9
assert state.attributes["preset_mode"] == "home" assert state.attributes["preset_mode"] == "home"
assert state.attributes["current_temperature"] == 20.9
assert state.attributes["supported_features"] == 17 assert state.attributes["supported_features"] == 17
assert state.attributes["temperature"] == 21.5 assert state.attributes["temperature"] == 21.5
assert state.attributes["min_temp"] == 0.0 assert state.attributes["min_temp"] == 0.0
@ -49,15 +47,13 @@ async def test_adam_climate_entity_attributes(
state = hass.states.get("climate.jessie") state = hass.states.get("climate.jessie")
assert state assert state
assert state.state == HVACMode.AUTO assert state.state == HVACMode.AUTO
assert state.attributes["hvac_action"] == "idle"
assert state.attributes["hvac_modes"] == [HVACMode.AUTO, HVACMode.HEAT] assert state.attributes["hvac_modes"] == [HVACMode.AUTO, HVACMode.HEAT]
# hvac_action is not asserted as the fixture is not in line with recent firmware functionality
assert "preset_modes" in state.attributes assert "preset_modes" in state.attributes
assert "no_frost" in state.attributes["preset_modes"] assert "no_frost" in state.attributes["preset_modes"]
assert "home" in state.attributes["preset_modes"] assert "home" in state.attributes["preset_modes"]
assert state.attributes["current_temperature"] == 17.2
assert state.attributes["preset_mode"] == "asleep" assert state.attributes["preset_mode"] == "asleep"
assert state.attributes["current_temperature"] == 17.2
assert state.attributes["temperature"] == 15.0 assert state.attributes["temperature"] == 15.0
assert state.attributes["min_temp"] == 0.0 assert state.attributes["min_temp"] == 0.0
assert state.attributes["max_temp"] == 35.0 assert state.attributes["max_temp"] == 35.0