diff --git a/homeassistant/components/bluetooth/manifest.json b/homeassistant/components/bluetooth/manifest.json index f81e1324da4..783d4ce7df2 100644 --- a/homeassistant/components/bluetooth/manifest.json +++ b/homeassistant/components/bluetooth/manifest.json @@ -9,7 +9,7 @@ "bleak==0.18.1", "bleak-retry-connector==2.1.3", "bluetooth-adapters==0.6.0", - "bluetooth-auto-recovery==0.3.3", + "bluetooth-auto-recovery==0.3.4", "dbus-fast==1.24.0" ], "codeowners": ["@bdraco"], diff --git a/homeassistant/components/fibaro/__init__.py b/homeassistant/components/fibaro/__init__.py index 9c2d252d77f..08ee4658107 100644 --- a/homeassistant/components/fibaro/__init__.py +++ b/homeassistant/components/fibaro/__init__.py @@ -650,8 +650,8 @@ class FibaroDevice(Entity): attr[ATTR_BATTERY_LEVEL] = int( self.fibaro_device.properties.batteryLevel ) - if "fibaroAlarmArm" in self.fibaro_device.interfaces: - attr[ATTR_ARMED] = bool(self.fibaro_device.properties.armed) + if "armed" in self.fibaro_device.properties: + attr[ATTR_ARMED] = self.fibaro_device.properties.armed.lower() == "true" except (ValueError, KeyError): pass diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index 6f243da444a..98b978964a6 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -2,7 +2,7 @@ "domain": "frontend", "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", - "requirements": ["home-assistant-frontend==20221006.0"], + "requirements": ["home-assistant-frontend==20221010.0"], "dependencies": [ "api", "auth", diff --git a/homeassistant/components/gtfs/manifest.json b/homeassistant/components/gtfs/manifest.json index 8dfb37ad551..9e9eb6a5585 100644 --- a/homeassistant/components/gtfs/manifest.json +++ b/homeassistant/components/gtfs/manifest.json @@ -2,7 +2,7 @@ "domain": "gtfs", "name": "General Transit Feed Specification (GTFS)", "documentation": "https://www.home-assistant.io/integrations/gtfs", - "requirements": ["pygtfs==0.1.6"], + "requirements": ["pygtfs==0.1.7"], "codeowners": [], "iot_class": "local_polling", "loggers": ["pygtfs"] diff --git a/homeassistant/components/hassio/manifest.json b/homeassistant/components/hassio/manifest.json index b087eb25807..5de80fdbd19 100644 --- a/homeassistant/components/hassio/manifest.json +++ b/homeassistant/components/hassio/manifest.json @@ -6,6 +6,5 @@ "after_dependencies": ["panel_custom"], "codeowners": ["@home-assistant/supervisor"], "iot_class": "local_polling", - "quality_scale": "internal", - "integration_type": "system" + "quality_scale": "internal" } diff --git a/homeassistant/components/hive/manifest.json b/homeassistant/components/hive/manifest.json index 406b32d86f8..b7e5b3fa9ea 100644 --- a/homeassistant/components/hive/manifest.json +++ b/homeassistant/components/hive/manifest.json @@ -6,7 +6,7 @@ "models": ["HHKBridge*"] }, "documentation": "https://www.home-assistant.io/integrations/hive", - "requirements": ["pyhiveapi==0.5.13"], + "requirements": ["pyhiveapi==0.5.14"], "codeowners": ["@Rendili", "@KJonline"], "iot_class": "cloud_polling", "loggers": ["apyhiveapi"] diff --git a/homeassistant/components/homekit_controller/climate.py b/homeassistant/components/homekit_controller/climate.py index 2c4d2e3871d..41788eb4cb2 100644 --- a/homeassistant/components/homekit_controller/climate.py +++ b/homeassistant/components/homekit_controller/climate.py @@ -565,6 +565,14 @@ class HomeKitClimateEntity(HomeKitBaseClimateEntity): # This characteristic describes the current mode of a device, # e.g. a thermostat is "heating" a room to 75 degrees Fahrenheit. # Can be 0 - 2 (Off, Heat, Cool) + + # If the HVAC is switched off, it must be idle + # This works around a bug in some devices (like Eve radiator valves) that + # return they are heating when they are not. + target = self.service.value(CharacteristicsTypes.HEATING_COOLING_TARGET) + if target == HeatingCoolingTargetValues.OFF: + return HVACAction.IDLE + value = self.service.value(CharacteristicsTypes.HEATING_COOLING_CURRENT) return CURRENT_MODE_HOMEKIT_TO_HASS.get(value) diff --git a/homeassistant/components/netatmo/device_trigger.py b/homeassistant/components/netatmo/device_trigger.py index b037f45533f..c6a519a37d0 100644 --- a/homeassistant/components/netatmo/device_trigger.py +++ b/homeassistant/components/netatmo/device_trigger.py @@ -38,10 +38,10 @@ from .const import ( CONF_SUBTYPE = "subtype" DEVICES = { - "NACamera": INDOOR_CAMERA_TRIGGERS, - "NOC": OUTDOOR_CAMERA_TRIGGERS, - "NATherm1": CLIMATE_TRIGGERS, - "NRV": CLIMATE_TRIGGERS, + "Smart Indoor Camera": INDOOR_CAMERA_TRIGGERS, + "Smart Outdoor Camera": OUTDOOR_CAMERA_TRIGGERS, + "Smart Thermostat": CLIMATE_TRIGGERS, + "Smart Valve": CLIMATE_TRIGGERS, } SUBTYPES = { diff --git a/homeassistant/components/switchbot/manifest.json b/homeassistant/components/switchbot/manifest.json index 1d245d3fd81..282bf6aa447 100644 --- a/homeassistant/components/switchbot/manifest.json +++ b/homeassistant/components/switchbot/manifest.json @@ -2,7 +2,7 @@ "domain": "switchbot", "name": "SwitchBot", "documentation": "https://www.home-assistant.io/integrations/switchbot", - "requirements": ["PySwitchbot==0.19.13"], + "requirements": ["PySwitchbot==0.19.15"], "config_flow": true, "dependencies": ["bluetooth"], "codeowners": [ diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index eeb974242e9..365ce086fb0 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -3,7 +3,7 @@ "name": "UniFi Network", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifi", - "requirements": ["aiounifi==38"], + "requirements": ["aiounifi==39"], "codeowners": ["@Kane610"], "quality_scale": "platinum", "ssdp": [ diff --git a/homeassistant/components/zha/manifest.json b/homeassistant/components/zha/manifest.json index 426ac24bbe3..7067491a12a 100644 --- a/homeassistant/components/zha/manifest.json +++ b/homeassistant/components/zha/manifest.json @@ -10,8 +10,8 @@ "zha-quirks==0.0.82", "zigpy-deconz==0.19.0", "zigpy==0.51.3", - "zigpy-xbee==0.16.1", - "zigpy-zigate==0.10.1", + "zigpy-xbee==0.16.2", + "zigpy-zigate==0.10.2", "zigpy-znp==0.9.1" ], "usb": [ diff --git a/homeassistant/const.py b/homeassistant/const.py index 588cd972966..012a633947d 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -8,7 +8,7 @@ from .backports.enum import StrEnum APPLICATION_NAME: Final = "HomeAssistant" MAJOR_VERSION: Final = 2022 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "2" +PATCH_VERSION: Final = "3" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 9, 0) diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index cccbd162e57..4fd58cd88f3 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -1690,6 +1690,11 @@ "iot_class": "local_polling", "name": "Harman Kardon AVR" }, + "hassio": { + "config_flow": false, + "iot_class": "local_polling", + "name": "Home Assistant Supervisor" + }, "haveibeenpwned": { "config_flow": false, "iot_class": "cloud_polling", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 92b535f0d6f..183a0205762 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -13,7 +13,7 @@ bcrypt==3.1.7 bleak-retry-connector==2.1.3 bleak==0.18.1 bluetooth-adapters==0.6.0 -bluetooth-auto-recovery==0.3.3 +bluetooth-auto-recovery==0.3.4 certifi>=2021.5.30 ciso8601==2.2.0 cryptography==38.0.1 @@ -21,7 +21,7 @@ dbus-fast==1.24.0 fnvhash==0.1.0 hass-nabucasa==0.56.0 home-assistant-bluetooth==1.3.0 -home-assistant-frontend==20221006.0 +home-assistant-frontend==20221010.0 httpx==0.23.0 ifaddr==0.1.7 jinja2==3.1.2 diff --git a/pyproject.toml b/pyproject.toml index cb32075133e..8b6d4707521 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "homeassistant" -version = "2022.10.2" +version = "2022.10.3" license = {text = "Apache-2.0"} description = "Open-source home automation platform running on Python 3." readme = "README.rst" diff --git a/requirements_all.txt b/requirements_all.txt index 921f36cc597..857a8a0395a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -40,7 +40,7 @@ PyRMVtransport==0.3.3 PySocks==1.7.1 # homeassistant.components.switchbot -PySwitchbot==0.19.13 +PySwitchbot==0.19.15 # homeassistant.components.transport_nsw PyTransportNSW==0.1.1 @@ -276,7 +276,7 @@ aiosyncthing==0.5.1 aiotractive==0.5.4 # homeassistant.components.unifi -aiounifi==38 +aiounifi==39 # homeassistant.components.vlc_telnet aiovlc==0.1.0 @@ -438,7 +438,7 @@ bluemaestro-ble==0.2.0 bluetooth-adapters==0.6.0 # homeassistant.components.bluetooth -bluetooth-auto-recovery==0.3.3 +bluetooth-auto-recovery==0.3.4 # homeassistant.components.bond bond-async==0.1.22 @@ -865,7 +865,7 @@ hole==0.7.0 holidays==0.16 # homeassistant.components.frontend -home-assistant-frontend==20221006.0 +home-assistant-frontend==20221010.0 # homeassistant.components.home_connect homeconnect==0.7.2 @@ -1586,7 +1586,7 @@ pyfttt==0.3 pygatt[GATTTOOL]==4.0.5 # homeassistant.components.gtfs -pygtfs==0.1.6 +pygtfs==0.1.7 # homeassistant.components.hvv_departures pygti==0.9.3 @@ -1601,7 +1601,7 @@ pyheos==0.7.2 pyhik==0.3.0 # homeassistant.components.hive -pyhiveapi==0.5.13 +pyhiveapi==0.5.14 # homeassistant.components.homematic pyhomematic==0.1.77 @@ -2604,10 +2604,10 @@ ziggo-mediabox-xl==1.1.0 zigpy-deconz==0.19.0 # homeassistant.components.zha -zigpy-xbee==0.16.1 +zigpy-xbee==0.16.2 # homeassistant.components.zha -zigpy-zigate==0.10.1 +zigpy-zigate==0.10.2 # homeassistant.components.zha zigpy-znp==0.9.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8112bef68b0..49b17f021c1 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -36,7 +36,7 @@ PyRMVtransport==0.3.3 PySocks==1.7.1 # homeassistant.components.switchbot -PySwitchbot==0.19.13 +PySwitchbot==0.19.15 # homeassistant.components.transport_nsw PyTransportNSW==0.1.1 @@ -251,7 +251,7 @@ aiosyncthing==0.5.1 aiotractive==0.5.4 # homeassistant.components.unifi -aiounifi==38 +aiounifi==39 # homeassistant.components.vlc_telnet aiovlc==0.1.0 @@ -352,7 +352,7 @@ bluemaestro-ble==0.2.0 bluetooth-adapters==0.6.0 # homeassistant.components.bluetooth -bluetooth-auto-recovery==0.3.3 +bluetooth-auto-recovery==0.3.4 # homeassistant.components.bond bond-async==0.1.22 @@ -645,7 +645,7 @@ hole==0.7.0 holidays==0.16 # homeassistant.components.frontend -home-assistant-frontend==20221006.0 +home-assistant-frontend==20221010.0 # homeassistant.components.home_connect homeconnect==0.7.2 @@ -1123,7 +1123,7 @@ pyhaversion==22.8.0 pyheos==0.7.2 # homeassistant.components.hive -pyhiveapi==0.5.13 +pyhiveapi==0.5.14 # homeassistant.components.homematic pyhomematic==0.1.77 @@ -1799,10 +1799,10 @@ zha-quirks==0.0.82 zigpy-deconz==0.19.0 # homeassistant.components.zha -zigpy-xbee==0.16.1 +zigpy-xbee==0.16.2 # homeassistant.components.zha -zigpy-zigate==0.10.1 +zigpy-zigate==0.10.2 # homeassistant.components.zha zigpy-znp==0.9.1 diff --git a/tests/components/homekit_controller/test_climate.py b/tests/components/homekit_controller/test_climate.py index c5cad7015d8..0f669c9c51f 100644 --- a/tests/components/homekit_controller/test_climate.py +++ b/tests/components/homekit_controller/test_climate.py @@ -619,6 +619,27 @@ async def test_hvac_mode_vs_hvac_action(hass, utcnow): assert state.attributes["hvac_action"] == "heating" +async def test_hvac_mode_vs_hvac_action_current_mode_wrong(hass, utcnow): + """Check that we cope with buggy HEATING_COOLING_CURRENT.""" + helper = await setup_test_component(hass, create_thermostat_service) + + await helper.async_update( + ServicesTypes.THERMOSTAT, + { + CharacteristicsTypes.TEMPERATURE_CURRENT: 22, + CharacteristicsTypes.TEMPERATURE_TARGET: 21, + CharacteristicsTypes.HEATING_COOLING_CURRENT: 1, + CharacteristicsTypes.HEATING_COOLING_TARGET: 0, + CharacteristicsTypes.RELATIVE_HUMIDITY_CURRENT: 50, + CharacteristicsTypes.RELATIVE_HUMIDITY_TARGET: 45, + }, + ) + + state = await helper.poll_and_get_state() + assert state.state == "off" + assert state.attributes["hvac_action"] == "idle" + + def create_heater_cooler_service(accessory): """Define thermostat characteristics.""" service = accessory.add_service(ServicesTypes.HEATER_COOLER) diff --git a/tests/components/netatmo/test_device_trigger.py b/tests/components/netatmo/test_device_trigger.py index 25b86f8410e..f7a3772b404 100644 --- a/tests/components/netatmo/test_device_trigger.py +++ b/tests/components/netatmo/test_device_trigger.py @@ -47,10 +47,10 @@ def calls(hass): @pytest.mark.parametrize( "platform,device_type,event_types", [ - ("camera", "NOC", OUTDOOR_CAMERA_TRIGGERS), - ("camera", "NACamera", INDOOR_CAMERA_TRIGGERS), - ("climate", "NRV", CLIMATE_TRIGGERS), - ("climate", "NATherm1", CLIMATE_TRIGGERS), + ("camera", "Smart Outdoor Camera", OUTDOOR_CAMERA_TRIGGERS), + ("camera", "Smart Indoor Camera", INDOOR_CAMERA_TRIGGERS), + ("climate", "Smart Valve", CLIMATE_TRIGGERS), + ("climate", "Smart Thermostat", CLIMATE_TRIGGERS), ], ) async def test_get_triggers( @@ -105,15 +105,15 @@ async def test_get_triggers( @pytest.mark.parametrize( "platform,camera_type,event_type", - [("camera", "NOC", trigger) for trigger in OUTDOOR_CAMERA_TRIGGERS] - + [("camera", "NACamera", trigger) for trigger in INDOOR_CAMERA_TRIGGERS] + [("camera", "Smart Outdoor Camera", trigger) for trigger in OUTDOOR_CAMERA_TRIGGERS] + + [("camera", "Smart Indoor Camera", trigger) for trigger in INDOOR_CAMERA_TRIGGERS] + [ - ("climate", "NRV", trigger) + ("climate", "Smart Valve", trigger) for trigger in CLIMATE_TRIGGERS if trigger not in SUBTYPES ] + [ - ("climate", "NATherm1", trigger) + ("climate", "Smart Thermostat", trigger) for trigger in CLIMATE_TRIGGERS if trigger not in SUBTYPES ], @@ -183,12 +183,12 @@ async def test_if_fires_on_event( @pytest.mark.parametrize( "platform,camera_type,event_type,sub_type", [ - ("climate", "NRV", trigger, subtype) + ("climate", "Smart Valve", trigger, subtype) for trigger in SUBTYPES for subtype in SUBTYPES[trigger] ] + [ - ("climate", "NATherm1", trigger, subtype) + ("climate", "Smart Thermostat", trigger, subtype) for trigger in SUBTYPES for subtype in SUBTYPES[trigger] ], @@ -262,7 +262,7 @@ async def test_if_fires_on_event_with_subtype( @pytest.mark.parametrize( "platform,device_type,event_type", - [("climate", "NAPLUG", trigger) for trigger in CLIMATE_TRIGGERS], + [("climate", "NAPlug", trigger) for trigger in CLIMATE_TRIGGERS], ) async def test_if_invalid_device( hass, device_reg, entity_reg, platform, device_type, event_type