Merge pull request #21778 from home-assistant/rc

0.89.1
This commit is contained in:
Paulus Schoutsen 2019-03-07 23:16:17 -08:00 committed by GitHub
commit ac4d5d7c30
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 116 additions and 43 deletions

41
.github/main.workflow vendored Normal file
View File

@ -0,0 +1,41 @@
workflow "Python 3.7 - tox" {
resolves = ["Python 3.7 - tests"]
on = "push"
}
action "Python 3.7 - tests" {
uses = "home-assistant/actions/py37-tox@master"
args = "-e py37"
}
workflow "Python 3.6 - tox" {
resolves = ["Python 3.6 - tests"]
on = "push"
}
action "Python 3.6 - tests" {
uses = "home-assistant/actions/py36-tox@master"
args = "-e py36"
}
workflow "Python 3.5 - tox" {
resolves = ["Pyton 3.5 - typing"]
on = "push"
}
action "Python 3.5 - tests" {
uses = "home-assistant/actions/py35-tox@master"
args = "-e py35"
}
action "Python 3.5 - lints" {
uses = "home-assistant/actions/py35-tox@master"
needs = ["Python 3.5 - tests"]
args = "-e lint"
}
action "Pyton 3.5 - typing" {
uses = "home-assistant/actions/py35-tox@master"
args = "-e typing"
needs = ["Python 3.5 - lints"]
}

View File

@ -10,7 +10,7 @@ from homeassistant.const import (
CONF_BINARY_SENSORS, CONF_SENSORS, CONF_FILENAME, CONF_BINARY_SENSORS, CONF_SENSORS, CONF_FILENAME,
CONF_MONITORED_CONDITIONS, TEMP_FAHRENHEIT) CONF_MONITORED_CONDITIONS, TEMP_FAHRENHEIT)
REQUIREMENTS = ['blinkpy==0.12.1'] REQUIREMENTS = ['blinkpy==0.13.1']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -44,7 +44,7 @@ BINARY_SENSORS = {
SENSORS = { SENSORS = {
TYPE_TEMPERATURE: ['Temperature', TEMP_FAHRENHEIT, 'mdi:thermometer'], TYPE_TEMPERATURE: ['Temperature', TEMP_FAHRENHEIT, 'mdi:thermometer'],
TYPE_BATTERY: ['Battery', '%', 'mdi:battery-80'], TYPE_BATTERY: ['Battery', '%', 'mdi:battery-80'],
TYPE_WIFI_STRENGTH: ['Wifi Signal', 'bars', 'mdi:wifi-strength-2'], TYPE_WIFI_STRENGTH: ['Wifi Signal', 'dBm', 'mdi:wifi-strength-2'],
} }
BINARY_SENSOR_SCHEMA = vol.Schema({ BINARY_SENSOR_SCHEMA = vol.Schema({

View File

@ -21,7 +21,7 @@ from homeassistant.loader import bind_hass
from .storage import async_setup_frontend_storage from .storage import async_setup_frontend_storage
REQUIREMENTS = ['home-assistant-frontend==20190305.0'] REQUIREMENTS = ['home-assistant-frontend==20190305.1']
DOMAIN = 'frontend' DOMAIN = 'frontend'
DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log', DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log',

View File

@ -60,11 +60,14 @@ async def async_setup_entry(hass, entry):
# Register hap as device in registry. # Register hap as device in registry.
device_registry = await dr.async_get_registry(hass) device_registry = await dr.async_get_registry(hass)
home = hap.home home = hap.home
# Add the HAP name from configuration if set.
hapname = home.label \
if not home.name else "{} {}".format(home.label, home.name)
device_registry.async_get_or_create( device_registry.async_get_or_create(
config_entry_id=home.id, config_entry_id=home.id,
identifiers={(DOMAIN, home.id)}, identifiers={(DOMAIN, home.id)},
manufacturer='eQ-3', manufacturer='eQ-3',
name=home.label, name=hapname,
model=home.modelType, model=home.modelType,
sw_version=home.currentAPVersion, sw_version=home.currentAPVersion,
) )

View File

@ -4,6 +4,8 @@ import logging
from homeassistant.components.binary_sensor import BinarySensorDevice from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.components.homematicip_cloud import ( from homeassistant.components.homematicip_cloud import (
DOMAIN as HMIPC_DOMAIN, HMIPC_HAPID, HomematicipGenericDevice) DOMAIN as HMIPC_DOMAIN, HMIPC_HAPID, HomematicipGenericDevice)
from homeassistant.components.homematicip_cloud.device import (
ATTR_GROUP_MEMBER_UNREACHABLE)
DEPENDENCIES = ['homematicip_cloud'] DEPENDENCIES = ['homematicip_cloud']
@ -31,8 +33,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
AsyncWaterSensor, AsyncRotaryHandleSensor, AsyncWaterSensor, AsyncRotaryHandleSensor,
AsyncMotionDetectorPushButton) AsyncMotionDetectorPushButton)
from homematicip.group import ( from homematicip.aio.group import (
SecurityGroup, SecurityZoneGroup) AsyncSecurityGroup, AsyncSecurityZoneGroup)
home = hass.data[HMIPC_DOMAIN][config_entry.data[HMIPC_HAPID]].home home = hass.data[HMIPC_DOMAIN][config_entry.data[HMIPC_HAPID]].home
devices = [] devices = []
@ -48,9 +50,9 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
devices.append(HomematicipWaterDetector(home, device)) devices.append(HomematicipWaterDetector(home, device))
for group in home.groups: for group in home.groups:
if isinstance(group, SecurityGroup): if isinstance(group, AsyncSecurityGroup):
devices.append(HomematicipSecuritySensorGroup(home, group)) devices.append(HomematicipSecuritySensorGroup(home, group))
elif isinstance(group, SecurityZoneGroup): elif isinstance(group, AsyncSecurityZoneGroup):
devices.append(HomematicipSecurityZoneSensorGroup(home, group)) devices.append(HomematicipSecurityZoneSensorGroup(home, group))
if devices: if devices:
@ -137,27 +139,37 @@ class HomematicipSecurityZoneSensorGroup(HomematicipGenericDevice,
"""Return the class of this sensor.""" """Return the class of this sensor."""
return 'safety' return 'safety'
@property
def available(self):
"""Security-Group available."""
# A security-group must be available, and should not be affected by
# the individual availability of group members.
return True
@property @property
def device_state_attributes(self): def device_state_attributes(self):
"""Return the state attributes of the security zone group.""" """Return the state attributes of the security zone group."""
attr = super().device_state_attributes attr = super().device_state_attributes
if self._device.motionDetected: if self._device.motionDetected:
attr.update({ATTR_MOTIONDETECTED: True}) attr[ATTR_MOTIONDETECTED] = True
if self._device.presenceDetected: if self._device.presenceDetected:
attr.update({ATTR_PRESENCEDETECTED: True}) attr[ATTR_PRESENCEDETECTED] = True
from homematicip.base.enums import WindowState from homematicip.base.enums import WindowState
if self._device.windowState is not None and \ if self._device.windowState is not None and \
self._device.windowState != WindowState.CLOSED: self._device.windowState != WindowState.CLOSED:
attr.update({ATTR_WINDOWSTATE: str(self._device.windowState)}) attr[ATTR_WINDOWSTATE] = str(self._device.windowState)
if self._device.unreach:
attr[ATTR_GROUP_MEMBER_UNREACHABLE] = True
return attr return attr
@property @property
def is_on(self): def is_on(self):
"""Return true if security issue detected.""" """Return true if security issue detected."""
if self._device.motionDetected or \ if self._device.motionDetected or \
self._device.presenceDetected: self._device.presenceDetected or \
self._device.unreach or \
self._device.sabotage:
return True return True
from homematicip.base.enums import WindowState from homematicip.base.enums import WindowState
if self._device.windowState is not None and \ if self._device.windowState is not None and \
@ -180,29 +192,30 @@ class HomematicipSecuritySensorGroup(HomematicipSecurityZoneSensorGroup,
attr = super().device_state_attributes attr = super().device_state_attributes
if self._device.powerMainsFailure: if self._device.powerMainsFailure:
attr.update({ATTR_POWERMAINSFAILURE: True}) attr[ATTR_POWERMAINSFAILURE] = True
if self._device.moistureDetected: if self._device.moistureDetected:
attr.update({ATTR_MOISTUREDETECTED: True}) attr[ATTR_MOISTUREDETECTED] = True
if self._device.waterlevelDetected: if self._device.waterlevelDetected:
attr.update({ATTR_WATERLEVELDETECTED: True}) attr[ATTR_WATERLEVELDETECTED] = True
from homematicip.base.enums import SmokeDetectorAlarmType from homematicip.base.enums import SmokeDetectorAlarmType
if self._device.smokeDetectorAlarmType is not None and \ if self._device.smokeDetectorAlarmType is not None and \
self._device.smokeDetectorAlarmType != \ self._device.smokeDetectorAlarmType != \
SmokeDetectorAlarmType.IDLE_OFF: SmokeDetectorAlarmType.IDLE_OFF:
attr.update({ATTR_SMOKEDETECTORALARM: str( attr[ATTR_SMOKEDETECTORALARM] = \
self._device.smokeDetectorAlarmType)}) str(self._device.smokeDetectorAlarmType)
return attr return attr
@property @property
def is_on(self): def is_on(self):
"""Return true if security issue detected.""" """Return true if safety issue detected."""
parent_is_on = super().is_on parent_is_on = super().is_on
from homematicip.base.enums import SmokeDetectorAlarmType from homematicip.base.enums import SmokeDetectorAlarmType
if parent_is_on or \ if parent_is_on or \
self._device.powerMainsFailure or \ self._device.powerMainsFailure or \
self._device.moistureDetected or \ self._device.moistureDetected or \
self._device.waterlevelDetected: self._device.waterlevelDetected or \
self._device.lowBat:
return True return True
if self._device.smokeDetectorAlarmType is not None and \ if self._device.smokeDetectorAlarmType is not None and \
self._device.smokeDetectorAlarmType != \ self._device.smokeDetectorAlarmType != \

View File

@ -21,6 +21,7 @@ ATTR_OPERATION_LOCK = 'operation_lock'
ATTR_SABOTAGE = 'sabotage' ATTR_SABOTAGE = 'sabotage'
ATTR_STATUS_UPDATE = 'status_update' ATTR_STATUS_UPDATE = 'status_update'
ATTR_UNREACHABLE = 'unreachable' ATTR_UNREACHABLE = 'unreachable'
ATTR_GROUP_MEMBER_UNREACHABLE = 'group_member_unreachable'
class HomematicipGenericDevice(Entity): class HomematicipGenericDevice(Entity):

View File

@ -3,6 +3,8 @@ import logging
from homeassistant.components.homematicip_cloud import ( from homeassistant.components.homematicip_cloud import (
DOMAIN as HMIPC_DOMAIN, HMIPC_HAPID, HomematicipGenericDevice) DOMAIN as HMIPC_DOMAIN, HMIPC_HAPID, HomematicipGenericDevice)
from homeassistant.components.homematicip_cloud.device import (
ATTR_GROUP_MEMBER_UNREACHABLE)
from homeassistant.components.switch import SwitchDevice from homeassistant.components.switch import SwitchDevice
DEPENDENCIES = ['homematicip_cloud'] DEPENDENCIES = ['homematicip_cloud']
@ -30,7 +32,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
AsyncOpenCollector8Module, AsyncOpenCollector8Module,
) )
from homematicip.group import SwitchingGroup from homematicip.aio.group import AsyncSwitchingGroup
home = hass.data[HMIPC_DOMAIN][config_entry.data[HMIPC_HAPID]].home home = hass.data[HMIPC_DOMAIN][config_entry.data[HMIPC_HAPID]].home
devices = [] devices = []
@ -50,7 +52,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
devices.append(HomematicipMultiSwitch(home, device, channel)) devices.append(HomematicipMultiSwitch(home, device, channel))
for group in home.groups: for group in home.groups:
if isinstance(group, SwitchingGroup): if isinstance(group, AsyncSwitchingGroup):
devices.append( devices.append(
HomematicipGroupSwitch(home, group)) HomematicipGroupSwitch(home, group))
@ -92,6 +94,23 @@ class HomematicipGroupSwitch(HomematicipGenericDevice, SwitchDevice):
"""Return true if group is on.""" """Return true if group is on."""
return self._device.on return self._device.on
@property
def available(self):
"""Switch-Group available."""
# A switch-group must be available, and should not be affected by the
# individual availability of group members.
# This allows switching even when individual group members
# are not available.
return True
@property
def device_state_attributes(self):
"""Return the state attributes of the switch-group."""
attr = {}
if self._device.unreach:
attr[ATTR_GROUP_MEMBER_UNREACHABLE] = True
return attr
async def async_turn_on(self, **kwargs): async def async_turn_on(self, **kwargs):
"""Turn the group on.""" """Turn the group on."""
await self._device.turn_on() await self._device.turn_on()

View File

@ -186,6 +186,7 @@ class NeatoConnectedVacuum(StateVacuumDevice):
self._battery_level = self._state['details']['charge'] self._battery_level = self._state['details']['charge']
if self._robot_has_map: if self._robot_has_map:
if self._state['availableServices']['maps'] != "basic-1":
robot_map_id = self._robot_maps[self._robot_serial][0]['id'] robot_map_id = self._robot_maps[self._robot_serial][0]['id']
self._robot_boundaries = self.robot.get_map_boundaries( self._robot_boundaries = self.robot.get_map_boundaries(

View File

@ -67,7 +67,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
})) }))
}) })
TRACKABLE_DOMAINS = ['device_tracker', 'sensor', 'zone'] TRACKABLE_DOMAINS = ['device_tracker', 'sensor', 'zone', 'person']
DATA_KEY = 'google_travel_time' DATA_KEY = 'google_travel_time'

View File

@ -13,7 +13,7 @@ from homeassistant.const import (
TEMP_FAHRENHEIT) TEMP_FAHRENHEIT)
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
REQUIREMENTS = ['pyeconet==0.0.8'] REQUIREMENTS = ['pyeconet==0.0.9']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -14,7 +14,7 @@ from homeassistant.components.media_player.const import (
MEDIA_TYPE_CHANNEL, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, MEDIA_TYPE_CHANNEL, SUPPORT_NEXT_TRACK, SUPPORT_PAUSE,
SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK, SUPPORT_PLAY, SUPPORT_PLAY_MEDIA, SUPPORT_PREVIOUS_TRACK,
SUPPORT_SELECT_SOURCE, SUPPORT_TURN_OFF, SUPPORT_TURN_ON, SUPPORT_SELECT_SOURCE, SUPPORT_TURN_OFF, SUPPORT_TURN_ON,
SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_STEP) SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, SUPPORT_VOLUME_STEP)
from homeassistant.const import ( from homeassistant.const import (
CONF_CUSTOMIZE, CONF_FILENAME, CONF_HOST, CONF_NAME, CONF_TIMEOUT, CONF_CUSTOMIZE, CONF_FILENAME, CONF_HOST, CONF_NAME, CONF_TIMEOUT,
STATE_OFF, STATE_PAUSED, STATE_PLAYING) STATE_OFF, STATE_PAUSED, STATE_PLAYING)
@ -36,7 +36,7 @@ WEBOSTV_CONFIG_FILE = 'webostv.conf'
SUPPORT_WEBOSTV = SUPPORT_TURN_OFF | \ SUPPORT_WEBOSTV = SUPPORT_TURN_OFF | \
SUPPORT_NEXT_TRACK | SUPPORT_PAUSE | SUPPORT_PREVIOUS_TRACK | \ SUPPORT_NEXT_TRACK | SUPPORT_PAUSE | SUPPORT_PREVIOUS_TRACK | \
SUPPORT_VOLUME_MUTE | SUPPORT_VOLUME_STEP | \ SUPPORT_VOLUME_MUTE | SUPPORT_VOLUME_SET | SUPPORT_VOLUME_STEP | \
SUPPORT_SELECT_SOURCE | SUPPORT_PLAY_MEDIA | SUPPORT_PLAY SUPPORT_SELECT_SOURCE | SUPPORT_PLAY_MEDIA | SUPPORT_PLAY
MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10)

View File

@ -16,7 +16,7 @@ from homeassistant.helpers.entity import Entity
from homeassistant.helpers.event import async_track_point_in_utc_time from homeassistant.helpers.event import async_track_point_in_utc_time
from homeassistant.util.dt import utcnow from homeassistant.util.dt import utcnow
REQUIREMENTS = ['PyXiaomiGateway==0.12.0'] REQUIREMENTS = ['PyXiaomiGateway==0.12.2']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -2,7 +2,7 @@
"""Constants used by Home Assistant components.""" """Constants used by Home Assistant components."""
MAJOR_VERSION = 0 MAJOR_VERSION = 0
MINOR_VERSION = 89 MINOR_VERSION = 89
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)

View File

@ -52,15 +52,10 @@ def run(args: List) -> int:
hass = HomeAssistant(loop) hass = HomeAssistant(loop)
pkgload = PackageLoadable(hass) pkgload = PackageLoadable(hass)
for req in getattr(script, 'REQUIREMENTS', []): for req in getattr(script, 'REQUIREMENTS', []):
try: if loop.run_until_complete(pkgload.loadable(req)):
loop.run_until_complete(pkgload.loadable(req))
continue continue
except ImportError:
pass
returncode = install_package(req, **_pip_kwargs) if not install_package(req, **_pip_kwargs):
if not returncode:
print('Aborting script, could not install dependency', req) print('Aborting script, could not install dependency', req)
return 1 return 1

View File

@ -67,7 +67,7 @@ PyRMVtransport==0.1.3
PyTransportNSW==0.1.1 PyTransportNSW==0.1.1
# homeassistant.components.xiaomi_aqara # homeassistant.components.xiaomi_aqara
PyXiaomiGateway==0.12.0 PyXiaomiGateway==0.12.2
# homeassistant.components.rpi_gpio # homeassistant.components.rpi_gpio
# RPi.GPIO==0.6.5 # RPi.GPIO==0.6.5
@ -206,7 +206,7 @@ bellows-homeassistant==0.7.1
bimmer_connected==0.5.3 bimmer_connected==0.5.3
# homeassistant.components.blink # homeassistant.components.blink
blinkpy==0.12.1 blinkpy==0.13.1
# homeassistant.components.light.blinksticklight # homeassistant.components.light.blinksticklight
blinkstick==1.1.8 blinkstick==1.1.8
@ -539,7 +539,7 @@ hole==0.3.0
holidays==0.9.9 holidays==0.9.9
# homeassistant.components.frontend # homeassistant.components.frontend
home-assistant-frontend==20190305.0 home-assistant-frontend==20190305.1
# homeassistant.components.zwave # homeassistant.components.zwave
homeassistant-pyozw==0.1.2 homeassistant-pyozw==0.1.2
@ -1004,7 +1004,7 @@ pydukeenergy==0.0.6
pyebox==1.1.4 pyebox==1.1.4
# homeassistant.components.water_heater.econet # homeassistant.components.water_heater.econet
pyeconet==0.0.8 pyeconet==0.0.9
# homeassistant.components.switch.edimax # homeassistant.components.switch.edimax
pyedimax==0.1 pyedimax==0.1

View File

@ -120,7 +120,7 @@ hdate==0.8.7
holidays==0.9.9 holidays==0.9.9
# homeassistant.components.frontend # homeassistant.components.frontend
home-assistant-frontend==20190305.0 home-assistant-frontend==20190305.1
# homeassistant.components.homekit_controller # homeassistant.components.homekit_controller
homekit==0.12.2 homekit==0.12.2