mirror of
https://github.com/home-assistant/core.git
synced 2025-07-08 13:57:10 +00:00
commit
c209236f47
@ -20,7 +20,7 @@ from .const import (
|
|||||||
ATTR_LAST_DATA, CONF_APP_KEY, DATA_CLIENT, DOMAIN, TOPIC_UPDATE,
|
ATTR_LAST_DATA, CONF_APP_KEY, DATA_CLIENT, DOMAIN, TOPIC_UPDATE,
|
||||||
TYPE_BINARY_SENSOR, TYPE_SENSOR)
|
TYPE_BINARY_SENSOR, TYPE_SENSOR)
|
||||||
|
|
||||||
REQUIREMENTS = ['aioambient==0.1.3']
|
REQUIREMENTS = ['aioambient==0.2.0']
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -417,9 +417,8 @@ class AmbientWeatherEntity(Entity):
|
|||||||
@property
|
@property
|
||||||
def available(self):
|
def available(self):
|
||||||
"""Return True if entity is available."""
|
"""Return True if entity is available."""
|
||||||
return bool(
|
return self._ambient.stations[self._mac_address][ATTR_LAST_DATA].get(
|
||||||
self._ambient.stations[self._mac_address][ATTR_LAST_DATA].get(
|
self._sensor_type) is not None
|
||||||
self._sensor_type))
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_info(self):
|
def device_info(self):
|
||||||
|
@ -38,9 +38,12 @@ class FlowHandler(config_entries.ConfigFlow):
|
|||||||
"""Create device."""
|
"""Create device."""
|
||||||
from pydaikin.appliance import Appliance
|
from pydaikin.appliance import Appliance
|
||||||
try:
|
try:
|
||||||
|
device = Appliance(
|
||||||
|
host,
|
||||||
|
self.hass.helpers.aiohttp_client.async_get_clientsession(),
|
||||||
|
)
|
||||||
with async_timeout.timeout(10):
|
with async_timeout.timeout(10):
|
||||||
device = await self.hass.async_add_executor_job(
|
await device.init()
|
||||||
Appliance, host)
|
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
return self.async_abort(reason='device_timeout')
|
return self.async_abort(reason='device_timeout')
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception: # pylint: disable=broad-except
|
||||||
|
@ -58,10 +58,11 @@ class FoscamCam(Camera):
|
|||||||
self._foscam_session = FoscamCamera(
|
self._foscam_session = FoscamCamera(
|
||||||
ip_address, port, self._username, self._password, verbose=False)
|
ip_address, port, self._username, self._password, verbose=False)
|
||||||
|
|
||||||
self._media_port = None
|
self._rtsp_port = None
|
||||||
result, response = self._foscam_session.get_port_info()
|
result, response = self._foscam_session.get_port_info()
|
||||||
if result == 0:
|
if result == 0:
|
||||||
self._media_port = response['mediaPort']
|
self._rtsp_port = response.get('rtspPort') or \
|
||||||
|
response.get('mediaPort')
|
||||||
|
|
||||||
def camera_image(self):
|
def camera_image(self):
|
||||||
"""Return a still image response from the camera."""
|
"""Return a still image response from the camera."""
|
||||||
@ -76,19 +77,19 @@ class FoscamCam(Camera):
|
|||||||
@property
|
@property
|
||||||
def supported_features(self):
|
def supported_features(self):
|
||||||
"""Return supported features."""
|
"""Return supported features."""
|
||||||
if self._media_port:
|
if self._rtsp_port:
|
||||||
return SUPPORT_STREAM
|
return SUPPORT_STREAM
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def stream_source(self):
|
def stream_source(self):
|
||||||
"""Return the stream source."""
|
"""Return the stream source."""
|
||||||
if self._media_port:
|
if self._rtsp_port:
|
||||||
return 'rtsp://{}:{}@{}:{}/videoMain'.format(
|
return 'rtsp://{}:{}@{}:{}/videoMain'.format(
|
||||||
self._username,
|
self._username,
|
||||||
self._password,
|
self._password,
|
||||||
self._foscam_session.host,
|
self._foscam_session.host,
|
||||||
self._media_port)
|
self._rtsp_port)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -85,7 +85,6 @@ class HassIOView(HomeAssistantView):
|
|||||||
"http://{}/{}".format(self._host, path), data=data,
|
"http://{}/{}".format(self._host, path), data=data,
|
||||||
headers=headers, timeout=read_timeout
|
headers=headers, timeout=read_timeout
|
||||||
)
|
)
|
||||||
print(client.headers)
|
|
||||||
|
|
||||||
# Simple request
|
# Simple request
|
||||||
if int(client.headers.get(CONTENT_LENGTH, 0)) < 4194000:
|
if int(client.headers.get(CONTENT_LENGTH, 0)) < 4194000:
|
||||||
|
@ -1,21 +1,23 @@
|
|||||||
"""Hass.io Add-on ingress service."""
|
"""Hass.io Add-on ingress service."""
|
||||||
import asyncio
|
import asyncio
|
||||||
from ipaddress import ip_address
|
import logging
|
||||||
import os
|
import os
|
||||||
|
from ipaddress import ip_address
|
||||||
from typing import Dict, Union
|
from typing import Dict, Union
|
||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
from aiohttp import web
|
from aiohttp import hdrs, web
|
||||||
from aiohttp import hdrs
|
|
||||||
from aiohttp.web_exceptions import HTTPBadGateway
|
from aiohttp.web_exceptions import HTTPBadGateway
|
||||||
from multidict import CIMultiDict
|
from multidict import CIMultiDict
|
||||||
|
|
||||||
from homeassistant.core import callback
|
|
||||||
from homeassistant.components.http import HomeAssistantView
|
from homeassistant.components.http import HomeAssistantView
|
||||||
|
from homeassistant.core import callback
|
||||||
from homeassistant.helpers.typing import HomeAssistantType
|
from homeassistant.helpers.typing import HomeAssistantType
|
||||||
|
|
||||||
from .const import X_HASSIO, X_INGRESS_PATH
|
from .const import X_HASSIO, X_INGRESS_PATH
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_setup_ingress(hass: HomeAssistantType, host: str):
|
def async_setup_ingress(hass: HomeAssistantType, host: str):
|
||||||
@ -30,7 +32,7 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
"""Hass.io view to handle base part."""
|
"""Hass.io view to handle base part."""
|
||||||
|
|
||||||
name = "api:hassio:ingress"
|
name = "api:hassio:ingress"
|
||||||
url = "/api/hassio_ingress/{addon}/{path:.+}"
|
url = "/api/hassio_ingress/{token}/{path:.*}"
|
||||||
requires_auth = False
|
requires_auth = False
|
||||||
|
|
||||||
def __init__(self, host: str, websession: aiohttp.ClientSession):
|
def __init__(self, host: str, websession: aiohttp.ClientSession):
|
||||||
@ -38,24 +40,24 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
self._host = host
|
self._host = host
|
||||||
self._websession = websession
|
self._websession = websession
|
||||||
|
|
||||||
def _create_url(self, addon: str, path: str) -> str:
|
def _create_url(self, token: str, path: str) -> str:
|
||||||
"""Create URL to service."""
|
"""Create URL to service."""
|
||||||
return "http://{}/addons/{}/web/{}".format(self._host, addon, path)
|
return "http://{}/ingress/{}/{}".format(self._host, token, path)
|
||||||
|
|
||||||
async def _handle(
|
async def _handle(
|
||||||
self, request: web.Request, addon: str, path: str
|
self, request: web.Request, token: str, path: str
|
||||||
) -> Union[web.Response, web.StreamResponse, web.WebSocketResponse]:
|
) -> Union[web.Response, web.StreamResponse, web.WebSocketResponse]:
|
||||||
"""Route data to Hass.io ingress service."""
|
"""Route data to Hass.io ingress service."""
|
||||||
try:
|
try:
|
||||||
# Websocket
|
# Websocket
|
||||||
if _is_websocket(request):
|
if _is_websocket(request):
|
||||||
return await self._handle_websocket(request, addon, path)
|
return await self._handle_websocket(request, token, path)
|
||||||
|
|
||||||
# Request
|
# Request
|
||||||
return await self._handle_request(request, addon, path)
|
return await self._handle_request(request, token, path)
|
||||||
|
|
||||||
except aiohttp.ClientError:
|
except aiohttp.ClientError as err:
|
||||||
pass
|
_LOGGER.debug("Ingress error with %s / %s: %s", token, path, err)
|
||||||
|
|
||||||
raise HTTPBadGateway() from None
|
raise HTTPBadGateway() from None
|
||||||
|
|
||||||
@ -65,15 +67,15 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
delete = _handle
|
delete = _handle
|
||||||
|
|
||||||
async def _handle_websocket(
|
async def _handle_websocket(
|
||||||
self, request: web.Request, addon: str, path: str
|
self, request: web.Request, token: str, path: str
|
||||||
) -> web.WebSocketResponse:
|
) -> web.WebSocketResponse:
|
||||||
"""Ingress route for websocket."""
|
"""Ingress route for websocket."""
|
||||||
ws_server = web.WebSocketResponse()
|
ws_server = web.WebSocketResponse()
|
||||||
await ws_server.prepare(request)
|
await ws_server.prepare(request)
|
||||||
|
|
||||||
# Preparing
|
# Preparing
|
||||||
url = self._create_url(addon, path)
|
url = self._create_url(token, path)
|
||||||
source_header = _init_header(request, addon)
|
source_header = _init_header(request, token)
|
||||||
|
|
||||||
# Support GET query
|
# Support GET query
|
||||||
if request.query_string:
|
if request.query_string:
|
||||||
@ -95,16 +97,16 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
return ws_server
|
return ws_server
|
||||||
|
|
||||||
async def _handle_request(
|
async def _handle_request(
|
||||||
self, request: web.Request, addon: str, path: str
|
self, request: web.Request, token: str, path: str
|
||||||
) -> Union[web.Response, web.StreamResponse]:
|
) -> Union[web.Response, web.StreamResponse]:
|
||||||
"""Ingress route for request."""
|
"""Ingress route for request."""
|
||||||
url = self._create_url(addon, path)
|
url = self._create_url(token, path)
|
||||||
data = await request.read()
|
data = await request.read()
|
||||||
source_header = _init_header(request, addon)
|
source_header = _init_header(request, token)
|
||||||
|
|
||||||
async with self._websession.request(
|
async with self._websession.request(
|
||||||
request.method, url, headers=source_header,
|
request.method, url, headers=source_header,
|
||||||
params=request.query, data=data, cookies=request.cookies
|
params=request.query, data=data
|
||||||
) as result:
|
) as result:
|
||||||
headers = _response_header(result)
|
headers = _response_header(result)
|
||||||
|
|
||||||
@ -126,24 +128,25 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
await response.prepare(request)
|
await response.prepare(request)
|
||||||
async for data in result.content:
|
async for data in result.content.iter_chunked(4096):
|
||||||
await response.write(data)
|
await response.write(data)
|
||||||
|
|
||||||
except (aiohttp.ClientError, aiohttp.ClientPayloadError):
|
except (aiohttp.ClientError, aiohttp.ClientPayloadError) as err:
|
||||||
pass
|
_LOGGER.debug("Stream error %s / %s: %s", token, path, err)
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
def _init_header(
|
def _init_header(
|
||||||
request: web.Request, addon: str
|
request: web.Request, token: str
|
||||||
) -> Union[CIMultiDict, Dict[str, str]]:
|
) -> Union[CIMultiDict, Dict[str, str]]:
|
||||||
"""Create initial header."""
|
"""Create initial header."""
|
||||||
headers = {}
|
headers = {}
|
||||||
|
|
||||||
# filter flags
|
# filter flags
|
||||||
for name, value in request.headers.items():
|
for name, value in request.headers.items():
|
||||||
if name in (hdrs.CONTENT_LENGTH, hdrs.CONTENT_TYPE):
|
if name in (hdrs.CONTENT_LENGTH, hdrs.CONTENT_TYPE,
|
||||||
|
hdrs.CONTENT_ENCODING):
|
||||||
continue
|
continue
|
||||||
headers[name] = value
|
headers[name] = value
|
||||||
|
|
||||||
@ -151,7 +154,7 @@ def _init_header(
|
|||||||
headers[X_HASSIO] = os.environ.get('HASSIO_TOKEN', "")
|
headers[X_HASSIO] = os.environ.get('HASSIO_TOKEN', "")
|
||||||
|
|
||||||
# Ingress information
|
# Ingress information
|
||||||
headers[X_INGRESS_PATH] = "/api/hassio_ingress/{}".format(addon)
|
headers[X_INGRESS_PATH] = "/api/hassio_ingress/{}".format(token)
|
||||||
|
|
||||||
# Set X-Forwarded-For
|
# Set X-Forwarded-For
|
||||||
forward_for = request.headers.get(hdrs.X_FORWARDED_FOR)
|
forward_for = request.headers.get(hdrs.X_FORWARDED_FOR)
|
||||||
@ -183,7 +186,7 @@ def _response_header(response: aiohttp.ClientResponse) -> Dict[str, str]:
|
|||||||
|
|
||||||
for name, value in response.headers.items():
|
for name, value in response.headers.items():
|
||||||
if name in (hdrs.TRANSFER_ENCODING, hdrs.CONTENT_LENGTH,
|
if name in (hdrs.TRANSFER_ENCODING, hdrs.CONTENT_LENGTH,
|
||||||
hdrs.CONTENT_TYPE):
|
hdrs.CONTENT_TYPE, hdrs.CONTENT_ENCODING):
|
||||||
continue
|
continue
|
||||||
headers[name] = value
|
headers[name] = value
|
||||||
|
|
||||||
|
@ -29,11 +29,7 @@ def create_stream_buffer(stream_output, video_stream, audio_frame):
|
|||||||
segment = io.BytesIO()
|
segment = io.BytesIO()
|
||||||
output = av.open(
|
output = av.open(
|
||||||
segment, mode='w', format=stream_output.format)
|
segment, mode='w', format=stream_output.format)
|
||||||
vstream = output.add_stream(
|
vstream = output.add_stream(template=video_stream)
|
||||||
stream_output.video_codec, video_stream.rate)
|
|
||||||
# Fix format
|
|
||||||
vstream.codec_context.format = \
|
|
||||||
video_stream.codec_context.format
|
|
||||||
# Check if audio is requested
|
# Check if audio is requested
|
||||||
astream = None
|
astream = None
|
||||||
if stream_output.audio_codec:
|
if stream_output.audio_codec:
|
||||||
|
@ -111,37 +111,6 @@ UPDATE_REQUEST_PROPERTIES = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def _transitions_config_parser(transitions):
|
|
||||||
"""Parse transitions config into initialized objects."""
|
|
||||||
import yeelight
|
|
||||||
|
|
||||||
transition_objects = []
|
|
||||||
for transition_config in transitions:
|
|
||||||
transition, params = list(transition_config.items())[0]
|
|
||||||
transition_objects.append(getattr(yeelight, transition)(*params))
|
|
||||||
|
|
||||||
return transition_objects
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_custom_effects(effects_config):
|
|
||||||
import yeelight
|
|
||||||
|
|
||||||
effects = {}
|
|
||||||
for config in effects_config:
|
|
||||||
params = config[CONF_FLOW_PARAMS]
|
|
||||||
action = yeelight.Flow.actions[params[ATTR_ACTION]]
|
|
||||||
transitions = _transitions_config_parser(
|
|
||||||
params[ATTR_TRANSITIONS])
|
|
||||||
|
|
||||||
effects[config[CONF_NAME]] = {
|
|
||||||
ATTR_COUNT: params[ATTR_COUNT],
|
|
||||||
ATTR_ACTION: action,
|
|
||||||
ATTR_TRANSITIONS: transitions
|
|
||||||
}
|
|
||||||
|
|
||||||
return effects
|
|
||||||
|
|
||||||
|
|
||||||
def setup(hass, config):
|
def setup(hass, config):
|
||||||
"""Set up the Yeelight bulbs."""
|
"""Set up the Yeelight bulbs."""
|
||||||
conf = config.get(DOMAIN, {})
|
conf = config.get(DOMAIN, {})
|
||||||
@ -192,9 +161,8 @@ def _setup_device(hass, hass_config, ipaddr, device_config):
|
|||||||
|
|
||||||
platform_config = device_config.copy()
|
platform_config = device_config.copy()
|
||||||
platform_config[CONF_HOST] = ipaddr
|
platform_config[CONF_HOST] = ipaddr
|
||||||
platform_config[CONF_CUSTOM_EFFECTS] = _parse_custom_effects(
|
platform_config[CONF_CUSTOM_EFFECTS] = \
|
||||||
hass_config.get(DOMAIN, {}).get(CONF_CUSTOM_EFFECTS, {})
|
hass_config.get(DOMAIN, {}).get(CONF_CUSTOM_EFFECTS, {})
|
||||||
)
|
|
||||||
|
|
||||||
load_platform(hass, LIGHT_DOMAIN, DOMAIN, platform_config, hass_config)
|
load_platform(hass, LIGHT_DOMAIN, DOMAIN, platform_config, hass_config)
|
||||||
load_platform(hass, BINARY_SENSOR_DOMAIN, DOMAIN, platform_config,
|
load_platform(hass, BINARY_SENSOR_DOMAIN, DOMAIN, platform_config,
|
||||||
|
@ -7,7 +7,7 @@ from homeassistant.helpers.service import extract_entity_ids
|
|||||||
from homeassistant.util.color import (
|
from homeassistant.util.color import (
|
||||||
color_temperature_mired_to_kelvin as mired_to_kelvin,
|
color_temperature_mired_to_kelvin as mired_to_kelvin,
|
||||||
color_temperature_kelvin_to_mired as kelvin_to_mired)
|
color_temperature_kelvin_to_mired as kelvin_to_mired)
|
||||||
from homeassistant.const import CONF_HOST, ATTR_ENTITY_ID
|
from homeassistant.const import CONF_HOST, ATTR_ENTITY_ID, CONF_NAME
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.components.light import (
|
from homeassistant.components.light import (
|
||||||
ATTR_BRIGHTNESS, ATTR_HS_COLOR, ATTR_TRANSITION, ATTR_COLOR_TEMP,
|
ATTR_BRIGHTNESS, ATTR_HS_COLOR, ATTR_TRANSITION, ATTR_COLOR_TEMP,
|
||||||
@ -19,8 +19,8 @@ from homeassistant.components.yeelight import (
|
|||||||
CONF_TRANSITION, DATA_YEELIGHT, CONF_MODE_MUSIC,
|
CONF_TRANSITION, DATA_YEELIGHT, CONF_MODE_MUSIC,
|
||||||
CONF_SAVE_ON_CHANGE, CONF_CUSTOM_EFFECTS, DATA_UPDATED,
|
CONF_SAVE_ON_CHANGE, CONF_CUSTOM_EFFECTS, DATA_UPDATED,
|
||||||
YEELIGHT_SERVICE_SCHEMA, DOMAIN, ATTR_TRANSITIONS,
|
YEELIGHT_SERVICE_SCHEMA, DOMAIN, ATTR_TRANSITIONS,
|
||||||
YEELIGHT_FLOW_TRANSITION_SCHEMA, _transitions_config_parser,
|
YEELIGHT_FLOW_TRANSITION_SCHEMA, ACTION_RECOVER, CONF_FLOW_PARAMS,
|
||||||
ACTION_RECOVER)
|
ATTR_ACTION, ATTR_COUNT)
|
||||||
|
|
||||||
DEPENDENCIES = ['yeelight']
|
DEPENDENCIES = ['yeelight']
|
||||||
|
|
||||||
@ -81,6 +81,37 @@ YEELIGHT_EFFECT_LIST = [
|
|||||||
EFFECT_STOP]
|
EFFECT_STOP]
|
||||||
|
|
||||||
|
|
||||||
|
def _transitions_config_parser(transitions):
|
||||||
|
"""Parse transitions config into initialized objects."""
|
||||||
|
import yeelight
|
||||||
|
|
||||||
|
transition_objects = []
|
||||||
|
for transition_config in transitions:
|
||||||
|
transition, params = list(transition_config.items())[0]
|
||||||
|
transition_objects.append(getattr(yeelight, transition)(*params))
|
||||||
|
|
||||||
|
return transition_objects
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_custom_effects(effects_config):
|
||||||
|
import yeelight
|
||||||
|
|
||||||
|
effects = {}
|
||||||
|
for config in effects_config:
|
||||||
|
params = config[CONF_FLOW_PARAMS]
|
||||||
|
action = yeelight.Flow.actions[params[ATTR_ACTION]]
|
||||||
|
transitions = _transitions_config_parser(
|
||||||
|
params[ATTR_TRANSITIONS])
|
||||||
|
|
||||||
|
effects[config[CONF_NAME]] = {
|
||||||
|
ATTR_COUNT: params[ATTR_COUNT],
|
||||||
|
ATTR_ACTION: action,
|
||||||
|
ATTR_TRANSITIONS: transitions
|
||||||
|
}
|
||||||
|
|
||||||
|
return effects
|
||||||
|
|
||||||
|
|
||||||
def _cmd(func):
|
def _cmd(func):
|
||||||
"""Define a wrapper to catch exceptions from the bulb."""
|
"""Define a wrapper to catch exceptions from the bulb."""
|
||||||
def _wrap(self, *args, **kwargs):
|
def _wrap(self, *args, **kwargs):
|
||||||
@ -109,7 +140,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
device = hass.data[DATA_YEELIGHT][discovery_info[CONF_HOST]]
|
device = hass.data[DATA_YEELIGHT][discovery_info[CONF_HOST]]
|
||||||
_LOGGER.debug("Adding %s", device.name)
|
_LOGGER.debug("Adding %s", device.name)
|
||||||
|
|
||||||
custom_effects = discovery_info[CONF_CUSTOM_EFFECTS]
|
custom_effects = _parse_custom_effects(discovery_info[CONF_CUSTOM_EFFECTS])
|
||||||
|
|
||||||
lights = [YeelightLight(device, custom_effects=custom_effects)]
|
lights = [YeelightLight(device, custom_effects=custom_effects)]
|
||||||
|
|
||||||
|
@ -77,7 +77,6 @@ ELECTRICAL_MEASUREMENT = 'electrical_measurement'
|
|||||||
GENERIC = 'generic'
|
GENERIC = 'generic'
|
||||||
UNKNOWN = 'unknown'
|
UNKNOWN = 'unknown'
|
||||||
OPENING = 'opening'
|
OPENING = 'opening'
|
||||||
ZONE = 'zone'
|
|
||||||
OCCUPANCY = 'occupancy'
|
OCCUPANCY = 'occupancy'
|
||||||
ACCELERATION = 'acceleration'
|
ACCELERATION = 'acceleration'
|
||||||
|
|
||||||
@ -90,7 +89,7 @@ BASIC_CHANNEL = 'basic'
|
|||||||
COLOR_CHANNEL = 'light_color'
|
COLOR_CHANNEL = 'light_color'
|
||||||
FAN_CHANNEL = 'fan'
|
FAN_CHANNEL = 'fan'
|
||||||
LEVEL_CHANNEL = ATTR_LEVEL
|
LEVEL_CHANNEL = ATTR_LEVEL
|
||||||
ZONE_CHANNEL = 'ias_zone'
|
ZONE_CHANNEL = ZONE = 'ias_zone'
|
||||||
ELECTRICAL_MEASUREMENT_CHANNEL = 'electrical_measurement'
|
ELECTRICAL_MEASUREMENT_CHANNEL = 'electrical_measurement'
|
||||||
POWER_CONFIGURATION_CHANNEL = 'power'
|
POWER_CONFIGURATION_CHANNEL = 'power'
|
||||||
EVENT_RELAY_CHANNEL = 'event_relay'
|
EVENT_RELAY_CHANNEL = 'event_relay'
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"""Constants used by Home Assistant components."""
|
"""Constants used by Home Assistant components."""
|
||||||
MAJOR_VERSION = 0
|
MAJOR_VERSION = 0
|
||||||
MINOR_VERSION = 91
|
MINOR_VERSION = 91
|
||||||
PATCH_VERSION = '0'
|
PATCH_VERSION = '1'
|
||||||
__short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION)
|
__short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION)
|
||||||
__version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)
|
__version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)
|
||||||
REQUIRED_PYTHON_VER = (3, 5, 3)
|
REQUIRED_PYTHON_VER = (3, 5, 3)
|
||||||
|
@ -97,7 +97,7 @@ abodepy==0.15.0
|
|||||||
afsapi==0.0.4
|
afsapi==0.0.4
|
||||||
|
|
||||||
# homeassistant.components.ambient_station
|
# homeassistant.components.ambient_station
|
||||||
aioambient==0.1.3
|
aioambient==0.2.0
|
||||||
|
|
||||||
# homeassistant.components.asuswrt
|
# homeassistant.components.asuswrt
|
||||||
aioasuswrt==1.1.21
|
aioasuswrt==1.1.21
|
||||||
|
@ -35,7 +35,7 @@ PyTransportNSW==0.1.1
|
|||||||
YesssSMS==0.2.3
|
YesssSMS==0.2.3
|
||||||
|
|
||||||
# homeassistant.components.ambient_station
|
# homeassistant.components.ambient_station
|
||||||
aioambient==0.1.3
|
aioambient==0.2.0
|
||||||
|
|
||||||
# homeassistant.components.automatic.device_tracker
|
# homeassistant.components.automatic.device_tracker
|
||||||
aioautomatic==0.6.5
|
aioautomatic==0.6.5
|
||||||
|
@ -24,9 +24,14 @@ def init_config_flow(hass):
|
|||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_daikin():
|
def mock_daikin():
|
||||||
"""Mock tellduslive."""
|
"""Mock pydaikin."""
|
||||||
|
async def mock_daikin_init():
|
||||||
|
"""Mock the init function in pydaikin."""
|
||||||
|
pass
|
||||||
|
|
||||||
with MockDependency('pydaikin.appliance') as mock_daikin_:
|
with MockDependency('pydaikin.appliance') as mock_daikin_:
|
||||||
mock_daikin_.Appliance().values.get.return_value = 'AABBCCDDEEFF'
|
mock_daikin_.Appliance().values.get.return_value = 'AABBCCDDEEFF'
|
||||||
|
mock_daikin_.Appliance().init = mock_daikin_init
|
||||||
yield mock_daikin_
|
yield mock_daikin_
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,12 +8,13 @@ import pytest
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'build_type', [
|
'build_type', [
|
||||||
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
||||||
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5")
|
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5"),
|
||||||
|
("fsadjf10312", "")
|
||||||
])
|
])
|
||||||
async def test_ingress_request_get(
|
async def test_ingress_request_get(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""Test no auth needed for ."""
|
||||||
aioclient_mock.get("http://127.0.0.1/addons/{}/web/{}".format(
|
aioclient_mock.get("http://127.0.0.1/ingress/{}/{}".format(
|
||||||
build_type[0], build_type[1]), text="test")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.get(
|
resp = await hassio_client.get(
|
||||||
@ -40,12 +41,13 @@ async def test_ingress_request_get(
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'build_type', [
|
'build_type', [
|
||||||
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
||||||
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5")
|
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5"),
|
||||||
|
("fsadjf10312", "")
|
||||||
])
|
])
|
||||||
async def test_ingress_request_post(
|
async def test_ingress_request_post(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""Test no auth needed for ."""
|
||||||
aioclient_mock.post("http://127.0.0.1/addons/{}/web/{}".format(
|
aioclient_mock.post("http://127.0.0.1/ingress/{}/{}".format(
|
||||||
build_type[0], build_type[1]), text="test")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.post(
|
resp = await hassio_client.post(
|
||||||
@ -72,12 +74,13 @@ async def test_ingress_request_post(
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'build_type', [
|
'build_type', [
|
||||||
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
||||||
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5")
|
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5"),
|
||||||
|
("fsadjf10312", "")
|
||||||
])
|
])
|
||||||
async def test_ingress_request_put(
|
async def test_ingress_request_put(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""Test no auth needed for ."""
|
||||||
aioclient_mock.put("http://127.0.0.1/addons/{}/web/{}".format(
|
aioclient_mock.put("http://127.0.0.1/ingress/{}/{}".format(
|
||||||
build_type[0], build_type[1]), text="test")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.put(
|
resp = await hassio_client.put(
|
||||||
@ -104,12 +107,13 @@ async def test_ingress_request_put(
|
|||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'build_type', [
|
'build_type', [
|
||||||
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"),
|
||||||
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5")
|
("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5"),
|
||||||
|
("fsadjf10312", "")
|
||||||
])
|
])
|
||||||
async def test_ingress_request_delete(
|
async def test_ingress_request_delete(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""Test no auth needed for ."""
|
||||||
aioclient_mock.delete("http://127.0.0.1/addons/{}/web/{}".format(
|
aioclient_mock.delete("http://127.0.0.1/ingress/{}/{}".format(
|
||||||
build_type[0], build_type[1]), text="test")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.delete(
|
resp = await hassio_client.delete(
|
||||||
@ -142,7 +146,7 @@ async def test_ingress_request_delete(
|
|||||||
async def test_ingress_websocket(
|
async def test_ingress_websocket(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""Test no auth needed for ."""
|
||||||
aioclient_mock.get("http://127.0.0.1/addons/{}/web/{}".format(
|
aioclient_mock.get("http://127.0.0.1/ingress/{}/{}".format(
|
||||||
build_type[0], build_type[1]))
|
build_type[0], build_type[1]))
|
||||||
|
|
||||||
# Ignore error because we can setup a full IO infrastructure
|
# Ignore error because we can setup a full IO infrastructure
|
||||||
|
Loading…
x
Reference in New Issue
Block a user