Skip to content
Merged

0.104.3 #31048

Show file tree
Hide file tree
Changes from all commits
Commits
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
18 changes: 9 additions & 9 deletions homeassistant/components/deconz/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,15 +216,15 @@ async def async_step_hassio(self, user_input=None):
This flow is triggered by the discovery component.
"""
self.bridge_id = normalize_bridge_id(user_input[CONF_SERIAL])
gateway = self.hass.data.get(DOMAIN, {}).get(self.bridge_id)

if gateway:
return self._update_entry(
gateway.config_entry,
user_input[CONF_HOST],
user_input[CONF_PORT],
user_input[CONF_API_KEY],
)

for entry in self.hass.config_entries.async_entries(DOMAIN):
if self.bridge_id == entry.unique_id:
return self._update_entry(
entry,
user_input[CONF_HOST],
user_input[CONF_PORT],
user_input[CONF_API_KEY],
)

await self.async_set_unique_id(self.bridge_id)
self._hassio_discovery = user_input
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/emulated_roku/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "Emulated Roku",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/emulated_roku",
"requirements": ["emulated_roku==0.1.9"],
"requirements": ["emulated_roku==0.2.0"],
"dependencies": [],
"codeowners": []
}
2 changes: 1 addition & 1 deletion homeassistant/components/media_player/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -785,7 +785,7 @@ def entity_picture(self):
@property
def capability_attributes(self):
"""Return capabilitiy attributes."""
supported_features = self.supported_features
supported_features = self.supported_features or 0
data = {}

if supported_features & SUPPORT_SELECT_SOURCE:
Expand Down
30 changes: 27 additions & 3 deletions homeassistant/components/ring/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from typing import Optional

from oauthlib.oauth2 import AccessDeniedError
import requests
from ring_doorbell import Auth, Ring
import voluptuous as vol

Expand Down Expand Up @@ -95,20 +96,27 @@ def token_updater(token):
"api": ring,
"devices": ring.devices(),
"device_data": GlobalDataUpdater(
hass, entry.entry_id, ring, "update_devices", timedelta(minutes=1)
hass, "device", entry.entry_id, ring, "update_devices", timedelta(minutes=1)
),
"dings_data": GlobalDataUpdater(
hass, entry.entry_id, ring, "update_dings", timedelta(seconds=10)
hass,
"active dings",
entry.entry_id,
ring,
"update_dings",
timedelta(seconds=5),
),
"history_data": DeviceDataUpdater(
hass,
"history",
entry.entry_id,
ring,
lambda device: device.history(limit=10),
timedelta(minutes=1),
),
"health_data": DeviceDataUpdater(
hass,
"health",
entry.entry_id,
ring,
lambda device: device.update_health_data(),
Expand Down Expand Up @@ -168,13 +176,15 @@ class GlobalDataUpdater:
def __init__(
self,
hass: HomeAssistant,
data_type: str,
config_entry_id: str,
ring: Ring,
update_method: str,
update_interval: timedelta,
):
"""Initialize global data updater."""
self.hass = hass
self.data_type = data_type
self.config_entry_id = config_entry_id
self.ring = ring
self.update_method = update_method
Expand Down Expand Up @@ -215,6 +225,11 @@ async def async_refresh_all(self, _now: Optional[int] = None) -> None:
_LOGGER.error("Ring access token is no longer valid. Set up Ring again")
await self.hass.config_entries.async_unload(self.config_entry_id)
return
except requests.Timeout:
_LOGGER.warning(
"Time out fetching Ring %s data", self.data_type,
)
return

for update_callback in self.listeners:
update_callback()
Expand All @@ -226,12 +241,14 @@ class DeviceDataUpdater:
def __init__(
self,
hass: HomeAssistant,
data_type: str,
config_entry_id: str,
ring: Ring,
update_method: str,
update_interval: timedelta,
):
"""Initialize device data updater."""
self.data_type = data_type
self.hass = hass
self.config_entry_id = config_entry_id
self.ring = ring
Expand Down Expand Up @@ -282,7 +299,7 @@ def async_untrack_device(self, device, update_callback):

def refresh_all(self, _=None):
"""Refresh all registered devices."""
for info in self.devices.values():
for device_id, info in self.devices.items():
try:
data = info["data"] = self.update_method(info["device"])
except AccessDeniedError:
Expand All @@ -291,6 +308,13 @@ def refresh_all(self, _=None):
self.hass.config_entries.async_unload(self.config_entry_id)
)
return
except requests.Timeout:
_LOGGER.warning(
"Time out fetching Ring %s data for device %s",
self.data_type,
device_id,
)
continue

for update_callback in info["update_callbacks"]:
self.hass.loop.call_soon_threadsafe(update_callback, data)
13 changes: 5 additions & 8 deletions homeassistant/components/ring/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ def __init__(self, config_entry_id, ffmpeg, device):
self._last_event = None
self._last_video_id = None
self._video_url = None
self._utcnow = dt_util.utcnow()
self._expires_at = self._utcnow - FORCE_REFRESH_INTERVAL
self._expires_at = dt_util.utcnow() - FORCE_REFRESH_INTERVAL

async def async_added_to_hass(self):
"""Register callbacks."""
Expand Down Expand Up @@ -80,7 +79,7 @@ def _history_update_callback(self, history_data):
self._last_event = None
self._last_video_id = None
self._video_url = None
self._expires_at = self._utcnow
self._expires_at = dt_util.utcnow()
self.async_write_ha_state()

@property
Expand Down Expand Up @@ -141,10 +140,8 @@ async def async_update(self):
if self._last_event["recording"]["status"] != "ready":
return

if (
self._last_video_id == self._last_event["id"]
and self._utcnow <= self._expires_at
):
utcnow = dt_util.utcnow()
if self._last_video_id == self._last_event["id"] and utcnow <= self._expires_at:
return

try:
Expand All @@ -160,4 +157,4 @@ async def async_update(self):
if video_url:
self._last_video_id = self._last_event["id"]
self._video_url = video_url
self._expires_at = FORCE_REFRESH_INTERVAL + self._utcnow
self._expires_at = FORCE_REFRESH_INTERVAL + utcnow
9 changes: 8 additions & 1 deletion homeassistant/components/ring/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from datetime import timedelta
import logging

import requests

from homeassistant.components.light import Light
from homeassistant.core import callback
import homeassistant.util.dt as dt_util
Expand Down Expand Up @@ -72,7 +74,12 @@ def is_on(self):

def _set_light(self, new_state):
"""Update light state, and causes Home Assistant to correctly update."""
self._device.lights = new_state
try:
self._device.lights = new_state
except requests.Timeout:
_LOGGER.error("Time out setting %s light to %s", self.entity_id, new_state)
return

self._light_on = new_state == ON_STATE
self._no_updates_until = dt_util.utcnow() + SKIP_UPDATES_DELAY
self.async_schedule_update_ha_state()
Expand Down
12 changes: 6 additions & 6 deletions homeassistant/components/ring/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,13 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up a sensor for a Ring device."""
devices = hass.data[DOMAIN][config_entry.entry_id]["devices"]

# Makes a ton of requests. We will make this a config entry option in the future
wifi_enabled = False

sensors = []

for device_type in ("chimes", "doorbots", "authorized_doorbots", "stickup_cams"):
for sensor_type in SENSOR_TYPES:
if device_type not in SENSOR_TYPES[sensor_type][1]:
continue

if not wifi_enabled and sensor_type.startswith("wifi_"):
continue

for device in devices[device_type]:
if device_type == "battery" and device.battery_life is None:
continue
Expand Down Expand Up @@ -124,6 +118,12 @@ def _health_update_callback(self, _health_data):
"""Call update method."""
self.async_write_ha_state()

@property
def entity_registry_enabled_default(self) -> bool:
"""Return if the entity should be enabled when first added to the entity registry."""
# These sensors are data hungry and not useful. Disable by default.
return False

@property
def state(self):
"""Return the state of the sensor."""
Expand Down
9 changes: 8 additions & 1 deletion homeassistant/components/ring/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from datetime import timedelta
import logging

import requests

from homeassistant.components.switch import SwitchDevice
from homeassistant.core import callback
import homeassistant.util.dt as dt_util
Expand Down Expand Up @@ -74,7 +76,12 @@ def _update_callback(self):

def _set_switch(self, new_state):
"""Update switch state, and causes Home Assistant to correctly update."""
self._device.siren = new_state
try:
self._device.siren = new_state
except requests.Timeout:
_LOGGER.error("Time out setting %s siren to %s", self.entity_id, new_state)
return

self._siren_on = new_state > 0
self._no_updates_until = dt_util.utcnow() + SKIP_UPDATES_DELAY
self.schedule_update_ha_state()
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/water_heater/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ def precision(self):
@property
def capability_attributes(self):
"""Return capabilitiy attributes."""
supported_features = self.supported_features
supported_features = self.supported_features or 0

data = {
ATTR_MIN_TEMP: show_temp(
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/const.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Constants used by Home Assistant components."""
MAJOR_VERSION = 0
MINOR_VERSION = 104
PATCH_VERSION = "2"
PATCH_VERSION = "3"
__short_version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}"
__version__ = f"{__short_version__}.{PATCH_VERSION}"
REQUIRED_PYTHON_VER = (3, 7, 0)
Expand Down
2 changes: 1 addition & 1 deletion requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ eliqonline==1.2.2
elkm1-lib==0.7.15

# homeassistant.components.emulated_roku
emulated_roku==0.1.9
emulated_roku==0.2.0

# homeassistant.components.enocean
enocean==0.50
Expand Down
2 changes: 1 addition & 1 deletion requirements_test_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ eebrightbox==0.0.4
elgato==0.2.0

# homeassistant.components.emulated_roku
emulated_roku==0.1.9
emulated_roku==0.2.0

# homeassistant.components.season
ephem==3.7.7.0
Expand Down