Skip to content
Merged
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
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=5)
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)
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