Update to latest Somfy changes (#28207)

* Update to latest Somfy changes

* Update api.py

* Update api.py
This commit is contained in:
Paulus Schoutsen 2019-11-06 10:55:56 -08:00 committed by GitHub
parent 9a0a889492
commit d9edd42532
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 16 additions and 45 deletions

View File

@ -9,6 +9,7 @@ import logging
from datetime import timedelta from datetime import timedelta
import voluptuous as vol import voluptuous as vol
from requests import HTTPError
from homeassistant.helpers import config_validation as cv, config_entry_oauth2_flow from homeassistant.helpers import config_validation as cv, config_entry_oauth2_flow
from homeassistant.components.somfy import config_flow from homeassistant.components.somfy import config_flow
@ -156,13 +157,8 @@ class SomfyEntity(Entity):
@Throttle(SCAN_INTERVAL) @Throttle(SCAN_INTERVAL)
async def update_all_devices(hass): async def update_all_devices(hass):
"""Update all the devices.""" """Update all the devices."""
from requests import HTTPError
from oauthlib.oauth2 import TokenExpiredError
try: try:
data = hass.data[DOMAIN] data = hass.data[DOMAIN]
data[DEVICES] = await hass.async_add_executor_job(data[API].get_devices) data[DEVICES] = await hass.async_add_executor_job(data[API].get_devices)
except TokenExpiredError: except HTTPError as err:
_LOGGER.warning("Cannot update devices due to expired token") _LOGGER.warning("Cannot update devices: %s", err.response.status_code)
except HTTPError:
_LOGGER.warning("Cannot update devices")

View File

@ -1,15 +1,14 @@
"""API for Somfy bound to HASS OAuth.""" """API for Somfy bound to HASS OAuth."""
from asyncio import run_coroutine_threadsafe from asyncio import run_coroutine_threadsafe
from functools import partial from typing import Dict, Union
import requests
from pymfy.api import somfy_api from pymfy.api import somfy_api
from homeassistant import core, config_entries from homeassistant import core, config_entries
from homeassistant.helpers import config_entry_oauth2_flow from homeassistant.helpers import config_entry_oauth2_flow
class ConfigEntrySomfyApi(somfy_api.AbstractSomfyApi): class ConfigEntrySomfyApi(somfy_api.SomfyApi):
"""Provide a Somfy API tied into an OAuth2 based config entry.""" """Provide a Somfy API tied into an OAuth2 based config entry."""
def __init__( def __init__(
@ -24,32 +23,12 @@ class ConfigEntrySomfyApi(somfy_api.AbstractSomfyApi):
self.session = config_entry_oauth2_flow.OAuth2Session( self.session = config_entry_oauth2_flow.OAuth2Session(
hass, config_entry, implementation hass, config_entry, implementation
) )
super().__init__(None, None, token=self.session.token)
def get(self, path): def refresh_tokens(self,) -> Dict[str, Union[str, int]]:
"""Fetch a URL from the Somfy API.""" """Refresh and return new Somfy tokens using Home Assistant OAuth2 session."""
return run_coroutine_threadsafe( run_coroutine_threadsafe(
self._request("get", path), self.hass.loop self.session.async_ensure_token_valid(), self.hass.loop
).result() ).result()
def post(self, path, *, json): return self.session.token
"""Post data to the Somfy API."""
return run_coroutine_threadsafe(
self._request("post", path, json=json), self.hass.loop
).result()
async def _request(self, method, path, **kwargs):
"""Make a request."""
await self.session.async_ensure_token_valid()
return await self.hass.async_add_executor_job(
partial(
requests.request,
method,
f"{self.base_url}{path}",
**kwargs,
headers={
**kwargs.get("headers", {}),
"authorization": f"Bearer {self.config_entry.data['token']['access_token']}",
},
)
)

View File

@ -4,6 +4,8 @@ Support for Somfy Covers.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/cover.somfy/ https://home-assistant.io/components/cover.somfy/
""" """
from pymfy.api.devices.category import Category
from pymfy.api.devices.blind import Blind
from homeassistant.components.cover import ( from homeassistant.components.cover import (
CoverDevice, CoverDevice,
@ -18,8 +20,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
def get_covers(): def get_covers():
"""Retrieve covers.""" """Retrieve covers."""
from pymfy.api.devices.category import Category
categories = { categories = {
Category.ROLLER_SHUTTER.value, Category.ROLLER_SHUTTER.value,
Category.INTERIOR_BLIND.value, Category.INTERIOR_BLIND.value,
@ -51,15 +51,11 @@ class SomfyCover(SomfyEntity, CoverDevice):
def __init__(self, device, api): def __init__(self, device, api):
"""Initialize the Somfy device.""" """Initialize the Somfy device."""
from pymfy.api.devices.blind import Blind
super().__init__(device, api) super().__init__(device, api)
self.cover = Blind(self.device, self.api) self.cover = Blind(self.device, self.api)
async def async_update(self): async def async_update(self):
"""Update the device with the latest data.""" """Update the device with the latest data."""
from pymfy.api.devices.blind import Blind
await super().async_update() await super().async_update()
self.cover = Blind(self.device, self.api) self.cover = Blind(self.device, self.api)

View File

@ -5,5 +5,5 @@
"documentation": "https://www.home-assistant.io/integrations/somfy", "documentation": "https://www.home-assistant.io/integrations/somfy",
"dependencies": ["http"], "dependencies": ["http"],
"codeowners": ["@tetienne"], "codeowners": ["@tetienne"],
"requirements": ["pymfy==0.6.0"] "requirements": ["pymfy==0.6.1"]
} }

View File

@ -1313,7 +1313,7 @@ pymailgunner==1.4
pymediaroom==0.6.4 pymediaroom==0.6.4
# homeassistant.components.somfy # homeassistant.components.somfy
pymfy==0.6.0 pymfy==0.6.1
# homeassistant.components.xiaomi_tv # homeassistant.components.xiaomi_tv
pymitv==1.4.3 pymitv==1.4.3

View File

@ -439,7 +439,7 @@ pylitejet==0.1
pymailgunner==1.4 pymailgunner==1.4
# homeassistant.components.somfy # homeassistant.components.somfy
pymfy==0.6.0 pymfy==0.6.1
# homeassistant.components.mochad # homeassistant.components.mochad
pymochad==0.2.0 pymochad==0.2.0