From 3acd926d294983dce60680de77f0244c04a523fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Thu, 23 Mar 2017 21:58:22 +0100 Subject: [PATCH 001/116] Flux led update lib (#6763) * Update flux_led lib --- homeassistant/components/light/flux_led.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/light/flux_led.py b/homeassistant/components/light/flux_led.py index f0f719fd15f..ca18511c660 100644 --- a/homeassistant/components/light/flux_led.py +++ b/homeassistant/components/light/flux_led.py @@ -18,7 +18,7 @@ from homeassistant.components.light import ( PLATFORM_SCHEMA) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['flux_led==0.15'] +REQUIREMENTS = ['flux_led==0.16'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index e766ed0c854..0c41139c3f4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -161,7 +161,7 @@ fitbit==0.2.3 fixerio==0.1.1 # homeassistant.components.light.flux_led -flux_led==0.15 +flux_led==0.16 # homeassistant.components.notify.free_mobile freesms==0.1.1 From 6c5989895a41d62948da7ca18d06f02696c51102 Mon Sep 17 00:00:00 2001 From: micw Date: Thu, 23 Mar 2017 22:55:07 +0100 Subject: [PATCH 002/116] Adding expire_after to mqtt sensor to expire outdated values (#6708) * Adding expire_after to mqtt sensor to expire outdated values * Extending test case * mqtt: refactoring expire_after to use timed events instead of polling; lint * refactor to reset unused trigger * Fix: handler must be set to None after execution or removal to avoid warning * Commenting out non-working test * Fix lint * Commit to trigger new build * Commit to trigger new build * Make testcase work * Undo unnecessary change * Remove default value, add extra check --- homeassistant/components/sensor/mqtt.py | 33 ++++++++++- tests/components/sensor/test_mqtt.py | 73 ++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/mqtt.py b/homeassistant/components/sensor/mqtt.py index 1e17e929b2c..9fcb9298805 100644 --- a/homeassistant/components/sensor/mqtt.py +++ b/homeassistant/components/sensor/mqtt.py @@ -6,6 +6,7 @@ https://home-assistant.io/components/sensor.mqtt/ """ import asyncio import logging +from datetime import timedelta import voluptuous as vol @@ -16,10 +17,13 @@ from homeassistant.const import ( from homeassistant.helpers.entity import Entity import homeassistant.components.mqtt as mqtt import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.event import async_track_point_in_utc_time +from homeassistant.util import dt as dt_util _LOGGER = logging.getLogger(__name__) CONF_FORCE_UPDATE = 'force_update' +CONF_EXPIRE_AFTER = 'expire_after' DEFAULT_NAME = 'MQTT Sensor' DEFAULT_FORCE_UPDATE = False @@ -28,6 +32,7 @@ DEPENDENCIES = ['mqtt'] PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + vol.Optional(CONF_EXPIRE_AFTER): cv.positive_int, vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, }) @@ -48,6 +53,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): config.get(CONF_QOS), config.get(CONF_UNIT_OF_MEASUREMENT), config.get(CONF_FORCE_UPDATE), + config.get(CONF_EXPIRE_AFTER), value_template, )]) @@ -56,7 +62,7 @@ class MqttSensor(Entity): """Representation of a sensor that can be updated using MQTT.""" def __init__(self, name, state_topic, qos, unit_of_measurement, - force_update, value_template): + force_update, expire_after, value_template): """Initialize the sensor.""" self._state = STATE_UNKNOWN self._name = name @@ -65,6 +71,8 @@ class MqttSensor(Entity): self._unit_of_measurement = unit_of_measurement self._force_update = force_update self._template = value_template + self._expire_after = expire_after + self._expiration_trigger = None def async_added_to_hass(self): """Subscribe mqtt events. @@ -74,6 +82,22 @@ class MqttSensor(Entity): @callback def message_received(topic, payload, qos): """A new MQTT message has been received.""" + # auto-expire enabled? + if self._expire_after is not None and self._expire_after > 0: + # Reset old trigger + if self._expiration_trigger: + self._expiration_trigger() + self._expiration_trigger = None + + # Set new trigger + expiration_at = ( + dt_util.utcnow() + timedelta(seconds=self._expire_after)) + + self._expiration_trigger = async_track_point_in_utc_time( + self.hass, + self.value_is_expired, + expiration_at) + if self._template is not None: payload = self._template.async_render_with_possible_json_value( payload, self._state) @@ -83,6 +107,13 @@ class MqttSensor(Entity): return mqtt.async_subscribe( self.hass, self._state_topic, message_received, self._qos) + @callback + def value_is_expired(self, *_): + """Triggered when value is expired.""" + self._expiration_trigger = None + self._state = STATE_UNKNOWN + self.hass.async_add_job(self.async_update_ha_state()) + @property def should_poll(self): """No polling needed.""" diff --git a/tests/components/sensor/test_mqtt.py b/tests/components/sensor/test_mqtt.py index 336c7fd57c5..42136966e13 100644 --- a/tests/components/sensor/test_mqtt.py +++ b/tests/components/sensor/test_mqtt.py @@ -1,12 +1,16 @@ """The tests for the MQTT sensor platform.""" import unittest +from datetime import timedelta, datetime +from unittest.mock import patch + import homeassistant.core as ha from homeassistant.setup import setup_component import homeassistant.components.sensor as sensor from homeassistant.const import EVENT_STATE_CHANGED -from tests.common import mock_mqtt_component, fire_mqtt_message +import homeassistant.util.dt as dt_util +from tests.common import mock_mqtt_component, fire_mqtt_message from tests.common import get_test_home_assistant, mock_component @@ -42,6 +46,69 @@ class TestSensorMQTT(unittest.TestCase): self.assertEqual('fav unit', state.attributes.get('unit_of_measurement')) + @patch('homeassistant.core.dt_util.utcnow') + def test_setting_sensor_value_expires(self, mock_utcnow): + """Test the expiration of the value.""" + mock_component(self.hass, 'mqtt') + assert setup_component(self.hass, sensor.DOMAIN, { + sensor.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'test-topic', + 'unit_of_measurement': 'fav unit', + 'expire_after': '4', + 'force_update': True + } + }) + + state = self.hass.states.get('sensor.test') + self.assertEqual('unknown', state.state) + + now = datetime(2017, 1, 1, 1, tzinfo=dt_util.UTC) + mock_utcnow.return_value = now + fire_mqtt_message(self.hass, 'test-topic', '100') + self.hass.block_till_done() + + # Value was set correctly. + state = self.hass.states.get('sensor.test') + self.assertEqual('100', state.state) + + # Time jump +3s + now = now + timedelta(seconds=3) + self._send_time_changed(now) + self.hass.block_till_done() + + # Value is not yet expired + state = self.hass.states.get('sensor.test') + self.assertEqual('100', state.state) + + # Next message resets timer + mock_utcnow.return_value = now + fire_mqtt_message(self.hass, 'test-topic', '101') + self.hass.block_till_done() + + # Value was updated correctly. + state = self.hass.states.get('sensor.test') + self.assertEqual('101', state.state) + + # Time jump +3s + now = now + timedelta(seconds=3) + self._send_time_changed(now) + self.hass.block_till_done() + + # Value is not yet expired + state = self.hass.states.get('sensor.test') + self.assertEqual('101', state.state) + + # Time jump +2s + now = now + timedelta(seconds=2) + self._send_time_changed(now) + self.hass.block_till_done() + + # Value is expired now + state = self.hass.states.get('sensor.test') + self.assertEqual('unknown', state.state) + def test_setting_sensor_value_via_mqtt_json_message(self): """Test the setting of the value via MQTT with JSON playload.""" mock_component(self.hass, 'mqtt') @@ -117,3 +184,7 @@ class TestSensorMQTT(unittest.TestCase): fire_mqtt_message(self.hass, 'test-topic', '100') self.hass.block_till_done() self.assertEqual(2, len(events)) + + def _send_time_changed(self, now): + """Send a time changed event.""" + self.hass.bus.fire(ha.EVENT_TIME_CHANGED, {ha.ATTR_NOW: now}) From 5dfdb9e48184cd9fa6e7dded307658b65dff367e Mon Sep 17 00:00:00 2001 From: Tim Soderstrom Date: Thu, 23 Mar 2017 22:48:31 -0500 Subject: [PATCH 003/116] New indexes for states and recording_runs tables (#6688) * New indexes for states table * Added recorder_runs indexes * Created a new function for compound indexes. A new function was created because it makes it a little cleaner when creating a single-field index since one doesn't have to create a list. This is mostly when creating the name of the index so with a bit more logic it's possible to combine it into one function. Given how often migration changes are run, I thought that code bloat was probably a worthy trade-off for now. * Adjusted indexes, POC for ref indexes by name. * Corrected lint errors * Fixed pydocstyle error * Moved create_index function outside apply_update * Moved to single line (just barely) --- homeassistant/components/recorder/__init__.py | 1 + .../components/recorder/migration.py | 39 ++++++++++++------- homeassistant/components/recorder/models.py | 11 ++++-- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 8ac610f1bcf..0ed5c3126b7 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -166,6 +166,7 @@ class Recorder(threading.Thread): migration.migrate_schema(self) self._setup_run() connected = True + _LOGGER.debug("Connected to recorder database") except Exception as err: # pylint: disable=broad-except _LOGGER.error("Error during connection setup: %s (retrying " "in %s seconds)", err, CONNECT_RETRY_WAIT) diff --git a/homeassistant/components/recorder/migration.py b/homeassistant/components/recorder/migration.py index 09c5e9837c3..0fac32bdec7 100644 --- a/homeassistant/components/recorder/migration.py +++ b/homeassistant/components/recorder/migration.py @@ -36,25 +36,34 @@ def migrate_schema(instance): _LOGGER.info("Upgrade to version %s done", new_version) -def _apply_update(engine, new_version): - """Perform operations to bring schema up to date.""" +def _create_index(engine, table_name, index_name): + """Create an index for the specified table. + + The index name should match the name given for the index + within the table definition described in the models + """ from sqlalchemy import Table from . import models - if new_version == 1: - def create_index(table_name, column_name): - """Create an index for the specified table and column.""" - table = Table(table_name, models.Base.metadata) - name = "_".join(("ix", table_name, column_name)) - # Look up the index object that was created from the models - index = next(idx for idx in table.indexes if idx.name == name) - _LOGGER.debug("Creating index for table %s column %s", - table_name, column_name) - index.create(engine) - _LOGGER.debug("Index creation done for table %s column %s", - table_name, column_name) + table = Table(table_name, models.Base.metadata) + _LOGGER.debug("Looking up index for table %s", table_name) + # Look up the index object by name from the table is the the models + index = next(idx for idx in table.indexes if idx.name == index_name) + _LOGGER.debug("Creating %s index", index_name) + index.create(engine) + _LOGGER.debug("Finished creating %s", index_name) - create_index("events", "time_fired") + +def _apply_update(engine, new_version): + """Perform operations to bring schema up to date.""" + if new_version == 1: + _create_index(engine, "events", "ix_events_time_fired") + elif new_version == 2: + # Create compound start/end index for recorder_runs + _create_index(engine, "recorder_runs", "ix_recorder_runs_start_end") + # Create indexes for states + _create_index(engine, "states", "ix_states_last_updated") + _create_index(engine, "states", "ix_states_entity_id_created") else: raise ValueError("No schema migration defined for version {}" .format(new_version)) diff --git a/homeassistant/components/recorder/models.py b/homeassistant/components/recorder/models.py index 4bc044a51bd..ce42ba187c2 100644 --- a/homeassistant/components/recorder/models.py +++ b/homeassistant/components/recorder/models.py @@ -16,7 +16,7 @@ from homeassistant.remote import JSONEncoder # pylint: disable=invalid-name Base = declarative_base() -SCHEMA_VERSION = 1 +SCHEMA_VERSION = 2 _LOGGER = logging.getLogger(__name__) @@ -66,13 +66,16 @@ class States(Base): # type: ignore attributes = Column(Text) event_id = Column(Integer, ForeignKey('events.event_id')) last_changed = Column(DateTime(timezone=True), default=datetime.utcnow) - last_updated = Column(DateTime(timezone=True), default=datetime.utcnow) + last_updated = Column(DateTime(timezone=True), default=datetime.utcnow, + index=True) created = Column(DateTime(timezone=True), default=datetime.utcnow) __table_args__ = (Index('states__state_changes', 'last_changed', 'last_updated', 'entity_id'), Index('states__significant_changes', - 'domain', 'last_updated', 'entity_id'), ) + 'domain', 'last_updated', 'entity_id'), + Index('ix_states_entity_id_created', + 'entity_id', 'created'),) @staticmethod def from_event(event): @@ -124,6 +127,8 @@ class RecorderRuns(Base): # type: ignore closed_incorrect = Column(Boolean, default=False) created = Column(DateTime(timezone=True), default=datetime.utcnow) + __table_args__ = (Index('ix_recorder_runs_start_end', 'start', 'end'),) + def entity_ids(self, point_in_time=None): """Return the entity ids that existed in this run. From efbd66bca1e21e7e96ff42d6d2b22ac59ef66e8b Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Thu, 23 Mar 2017 23:56:39 -0400 Subject: [PATCH 004/116] Fix flaky template test (#6768) --- tests/helpers/test_template.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index 18656acac51..b6951172c64 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -151,13 +151,14 @@ class TestHelpersTemplate(unittest.TestCase): def test_timestamp_custom(self): """Test the timestamps to custom filter.""" + now = dt_util.utcnow() tests = [ (None, None, None, 'None'), (1469119144, None, True, '2016-07-21 16:39:04'), (1469119144, '%Y', True, '2016'), (1469119144, 'invalid', True, 'invalid'), - (dt_util.as_timestamp(dt_util.utcnow()), None, False, - dt_util.now().strftime('%Y-%m-%d %H:%M:%S')) + (dt_util.as_timestamp(now), None, False, + now.strftime('%Y-%m-%d %H:%M:%S')) ] for inp, fmt, local, out in tests: @@ -202,11 +203,12 @@ class TestHelpersTemplate(unittest.TestCase): def test_timestamp_utc(self): """Test the timestamps to local filter.""" + now = dt_util.utcnow() tests = { None: 'None', 1469119144: '2016-07-21 16:39:04', - dt_util.as_timestamp(dt_util.utcnow()): - dt_util.now().strftime('%Y-%m-%d %H:%M:%S') + dt_util.as_timestamp(now): + now.strftime('%Y-%m-%d %H:%M:%S') } for inp, out in tests.items(): From 22613d8e2e1b0231e30f707b469284614d5c79a9 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Thu, 23 Mar 2017 23:57:15 -0400 Subject: [PATCH 005/116] Repair zwave sensor coverage (#6764) --- tests/components/sensor/test_zwave.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/components/sensor/test_zwave.py b/tests/components/sensor/test_zwave.py index 8affe9d489c..e3792c27d77 100644 --- a/tests/components/sensor/test_zwave.py +++ b/tests/components/sensor/test_zwave.py @@ -37,6 +37,7 @@ def test_get_device_detects_multilevelsensor(mock_openzwave): device = zwave.get_device(node=node, values=values, node_config={}) assert isinstance(device, zwave.ZWaveMultilevelSensor) + assert device.force_update def test_get_device_detects_multilevel_meter(mock_openzwave): @@ -107,3 +108,18 @@ def test_multilevelsensor_value_changed_integer(mock_openzwave): value.data = 6 value_changed(value) assert device.state == 6 + + +def test_alarm_sensor_value_changed(mock_openzwave): + """Test value changed for Z-Wave sensor.""" + node = MockNode(command_classes=[const.COMMAND_CLASS_ALARM, + const.COMMAND_CLASS_SENSOR_ALARM]) + value = MockValue(data=12.34, node=node, units='%') + values = MockEntityValues(primary=value) + + device = zwave.get_device(node=node, values=values, node_config={}) + assert device.state == 12.34 + assert device.unit_of_measurement == '%' + value.data = 45.67 + value_changed(value) + assert device.state == 45.67 From 9f2f0c556655ab2e58f9e8c1c6c3e9c3b7f2fc1a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 23 Mar 2017 23:33:49 -0700 Subject: [PATCH 006/116] Version bump to 0.42.0.dev0 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 6c36dc4bda2..bb882ca4ea9 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -1,7 +1,7 @@ # coding: utf-8 """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 -MINOR_VERSION = 41 +MINOR_VERSION = 42 PATCH_VERSION = '0.dev0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) From 82c599a7494931eb5e50863797ae764db168d856 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Fri, 24 Mar 2017 07:50:36 +0100 Subject: [PATCH 007/116] current temp could be none (#6759) --- homeassistant/components/climate/zwave.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/climate/zwave.py b/homeassistant/components/climate/zwave.py index 4aaea884816..74fadb8c5fd 100755 --- a/homeassistant/components/climate/zwave.py +++ b/homeassistant/components/climate/zwave.py @@ -112,8 +112,9 @@ class ZWaveClimate(ZWaveDeviceEntity, ClimateDevice): _LOGGER.debug("Setpoint is 0, setting default to " "current_temperature=%s", self._current_temperature) - self._target_temperature = ( - round((float(self._current_temperature)), 1)) + if self._current_temperature is not None: + self._target_temperature = ( + round((float(self._current_temperature)), 1)) else: self._target_temperature = round( (float(self.values.primary.data)), 1) From ee6c9ab6a93f0e4f4d651af3319bbb115984eef3 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Fri, 24 Mar 2017 07:53:59 +0100 Subject: [PATCH 008/116] Typing error and update test (#6757) --- homeassistant/components/lock/zwave.py | 8 ++++---- tests/components/lock/test_zwave.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/lock/zwave.py b/homeassistant/components/lock/zwave.py index 1a3b9bd662c..676775aace5 100644 --- a/homeassistant/components/lock/zwave.py +++ b/homeassistant/components/lock/zwave.py @@ -53,8 +53,8 @@ LOCK_ALARM_TYPE = { '9': 'Deadbolt Jammed', '18': 'Locked with Keypad by user ', '19': 'Unlocked with Keypad by user ', - '21': 'Manually Locked by ', - '22': 'Manually Unlocked by Key or Inside thumb turn', + '21': 'Manually Locked ', + '22': 'Manually Unlocked ', '24': 'Locked by RF', '25': 'Unlocked by RF', '27': 'Auto re-lock', @@ -69,8 +69,8 @@ LOCK_ALARM_TYPE = { } MANUAL_LOCK_ALARM_LEVEL = { - '1': 'Key Cylinder or Inside thumb turn', - '2': 'Touch function (lock and leave)' + '1': 'by Key Cylinder or Inside thumb turn', + '2': 'by Touch function (lock and leave)' } TAMPER_ALARM_LEVEL = { diff --git a/tests/components/lock/test_zwave.py b/tests/components/lock/test_zwave.py index ff7dd15c4c4..33cc2e61483 100644 --- a/tests/components/lock/test_zwave.py +++ b/tests/components/lock/test_zwave.py @@ -115,7 +115,7 @@ def test_lock_alarm_type(mock_openzwave): values.alarm_type.data = 21 value_changed(values.alarm_type) assert device.device_state_attributes[zwave.ATTR_LOCK_STATUS] == \ - 'Manually Locked by None' + 'Manually Locked None' values.alarm_type.data = 18 value_changed(values.alarm_type) From 06d3889e1bcdf0d6cdb32ee7bb85a9bff6947798 Mon Sep 17 00:00:00 2001 From: geekofweek Date: Fri, 24 Mar 2017 15:13:14 -0500 Subject: [PATCH 009/116] Wink Aros Fixes (#6726) Wink Aros only supports 3 Fan Modes: Low Medium High Fan Mode had a Typo and wasn't represented in the UI --- homeassistant/components/climate/wink.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/climate/wink.py b/homeassistant/components/climate/wink.py index f2c2551d371..df29768b3ff 100644 --- a/homeassistant/components/climate/wink.py +++ b/homeassistant/components/climate/wink.py @@ -19,7 +19,6 @@ DEPENDENCIES = ['wink'] STATE_AUX = 'aux' STATE_ECO = 'eco' STATE_FAN = 'fan' -SPEED_LOWEST = 'lowest' SPEED_LOW = 'low' SPEED_MEDIUM = 'medium' SPEED_HIGH = 'high' @@ -400,7 +399,7 @@ class WinkAC(WinkDevice, ClimateDevice): op_list.append(STATE_COOL) if 'auto_eco' in modes: op_list.append(STATE_ECO) - if 'fan_eco' in modes: + if 'fan_only' in modes: op_list.append(STATE_FAN) return op_list @@ -439,9 +438,7 @@ class WinkAC(WinkDevice, ClimateDevice): def current_fan_mode(self): """Return the current fan mode.""" speed = self.wink.current_fan_speed() - if speed <= 0.3 and speed >= 0.0: - return SPEED_LOWEST - elif speed <= 0.5 and speed > 0.3: + if speed <= 0.4 and speed > 0.3: return SPEED_LOW elif speed <= 0.8 and speed > 0.5: return SPEED_MEDIUM @@ -453,14 +450,12 @@ class WinkAC(WinkDevice, ClimateDevice): @property def fan_list(self): """List of available fan modes.""" - return [SPEED_LOWEST, SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH] + return [SPEED_LOW, SPEED_MEDIUM, SPEED_HIGH] def set_fan_mode(self, mode): """Set fan speed.""" - if mode == SPEED_LOWEST: - speed = 0.3 - elif mode == SPEED_LOW: - speed = 0.5 + if mode == SPEED_LOW: + speed = 0.4 elif mode == SPEED_MEDIUM: speed = 0.8 elif mode == SPEED_HIGH: From 1be2706de3a2e55e3df50741b27638eb9964af24 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 24 Mar 2017 21:42:00 +0100 Subject: [PATCH 010/116] Upgrade pydroid-ipcam to 0.7 (#6772) --- homeassistant/components/android_ip_webcam.py | 38 +++++++++---------- requirements_all.txt | 2 +- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/android_ip_webcam.py b/homeassistant/components/android_ip_webcam.py index e2929d159da..7699242e478 100644 --- a/homeassistant/components/android_ip_webcam.py +++ b/homeassistant/components/android_ip_webcam.py @@ -26,17 +26,24 @@ from homeassistant.util.dt import utcnow from homeassistant.components.camera.mjpeg import ( CONF_MJPEG_URL, CONF_STILL_IMAGE_URL) -DOMAIN = 'android_ip_webcam' -REQUIREMENTS = ["pydroid-ipcam==0.6"] +REQUIREMENTS = ['pydroid-ipcam==0.7'] _LOGGER = logging.getLogger(__name__) -SCAN_INTERVAL = timedelta(seconds=10) - -DATA_IP_WEBCAM = 'android_ip_webcam' +ATTR_AUD_CONNS = 'Audio Connections' ATTR_HOST = 'host' ATTR_VID_CONNS = 'Video Connections' -ATTR_AUD_CONNS = 'Audio Connections' + +CONF_MOTION_SENSOR = 'motion_sensor' + +DATA_IP_WEBCAM = 'android_ip_webcam' +DEFAULT_NAME = 'IP Webcam' +DEFAULT_PORT = 8080 +DEFAULT_TIMEOUT = 10 +DOMAIN = 'android_ip_webcam' + +SCAN_INTERVAL = timedelta(seconds=10) +SIGNAL_UPDATE_DATA = 'android_ip_webcam_update' KEY_MAP = { 'audio_connections': 'Audio Connections', @@ -123,15 +130,6 @@ SENSORS = ['audio_connections', 'battery_level', 'battery_temp', 'battery_voltage', 'light', 'motion', 'pressure', 'proximity', 'sound', 'video_connections'] -SIGNAL_UPDATE_DATA = 'android_ip_webcam_update' - -CONF_MOTION_SENSOR = 'motion_sensor' - -DEFAULT_NAME = 'IP Webcam' -DEFAULT_PORT = 8080 -DEFAULT_TIMEOUT = 10 - - CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.All(cv.ensure_list, [vol.Schema({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, @@ -153,7 +151,7 @@ CONFIG_SCHEMA = vol.Schema({ @asyncio.coroutine def async_setup(hass, config): - """Setup the IP Webcam component.""" + """Set up the IP Webcam component.""" from pydroid_ipcam import PyDroidIPCam webcams = hass.data[DATA_IP_WEBCAM] = {} @@ -161,7 +159,7 @@ def async_setup(hass, config): @asyncio.coroutine def async_setup_ipcamera(cam_config): - """Setup a ip camera.""" + """Set up an IP camera.""" host = cam_config[CONF_HOST] username = cam_config.get(CONF_USERNAME) password = cam_config.get(CONF_PASSWORD) @@ -171,7 +169,7 @@ def async_setup(hass, config): sensors = cam_config[CONF_SENSORS] motion = cam_config[CONF_MOTION_SENSOR] - # init ip webcam + # Init ip webcam cam = PyDroidIPCam( hass.loop, websession, host, cam_config[CONF_PORT], username=username, password=password, @@ -192,7 +190,7 @@ def async_setup(hass, config): @asyncio.coroutine def async_update_data(now): - """Update data from ipcam in SCAN_INTERVAL.""" + """Update data from IP camera in SCAN_INTERVAL.""" yield from cam.update() async_dispatcher_send(hass, SIGNAL_UPDATE_DATA, host) @@ -201,7 +199,7 @@ def async_setup(hass, config): yield from async_update_data(None) - # load platforms + # Load platforms webcams[host] = cam mjpeg_camera = { diff --git a/requirements_all.txt b/requirements_all.txt index 0c41139c3f4..b6d4034b919 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -490,7 +490,7 @@ pycmus==0.1.0 pydispatcher==2.0.5 # homeassistant.components.android_ip_webcam -pydroid-ipcam==0.6 +pydroid-ipcam==0.7 # homeassistant.components.sensor.ebox pyebox==0.1.0 From 7ae814357a0c52b0ff7332b45529cecd6f5967cd Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 24 Mar 2017 21:43:48 +0100 Subject: [PATCH 011/116] Upgrade psutil to 5.2.1 (#6771) --- homeassistant/components/sensor/systemmonitor.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/systemmonitor.py b/homeassistant/components/sensor/systemmonitor.py index fbdb302b84b..4b402d32792 100755 --- a/homeassistant/components/sensor/systemmonitor.py +++ b/homeassistant/components/sensor/systemmonitor.py @@ -16,7 +16,7 @@ from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv import homeassistant.util.dt as dt_util -REQUIREMENTS = ['psutil==5.2.0'] +REQUIREMENTS = ['psutil==5.2.1'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index b6d4034b919..7dea8509fa1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -435,7 +435,7 @@ pmsensor==0.4 proliphix==0.4.1 # homeassistant.components.sensor.systemmonitor -psutil==5.2.0 +psutil==5.2.1 # homeassistant.components.wink pubnubsub-handler==1.0.1 From 8d606f8d16731a02e7a9ba58f8810d261af2b7d7 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 24 Mar 2017 21:44:04 +0100 Subject: [PATCH 012/116] Upgrade sleekxmpp to 1.3.2 (#6773) --- homeassistant/components/notify/xmpp.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/notify/xmpp.py b/homeassistant/components/notify/xmpp.py index e0228e967a9..ee358ed069c 100644 --- a/homeassistant/components/notify/xmpp.py +++ b/homeassistant/components/notify/xmpp.py @@ -13,7 +13,7 @@ from homeassistant.components.notify import ( ATTR_TITLE, ATTR_TITLE_DEFAULT, PLATFORM_SCHEMA, BaseNotificationService) from homeassistant.const import CONF_PASSWORD, CONF_SENDER, CONF_RECIPIENT -REQUIREMENTS = ['sleekxmpp==1.3.1', +REQUIREMENTS = ['sleekxmpp==1.3.2', 'dnspython3==1.15.0', 'pyasn1==0.2.3', 'pyasn1-modules==0.0.8'] diff --git a/requirements_all.txt b/requirements_all.txt index 7dea8509fa1..bc697d6a657 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -692,7 +692,7 @@ simplisafe-python==1.0.2 slacker==0.9.42 # homeassistant.components.notify.xmpp -sleekxmpp==1.3.1 +sleekxmpp==1.3.2 # homeassistant.components.sleepiq sleepyq==0.6 From cffc6c7beaf3c48d619ef295ebe888e60691ca35 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 24 Mar 2017 18:31:46 -0400 Subject: [PATCH 013/116] Tests for zwave workaround detection (#6761) * Tests for zwave workaround detection * Remove unused code * Revert "Remove unused code" This reverts commit e06cce0abecc233dab3488dc4194b2d296eee002. * Tests for empty manufacturer ID --- .coveragerc | 1 - tests/components/zwave/test_workaround.py | 40 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/components/zwave/test_workaround.py diff --git a/.coveragerc b/.coveragerc index d57aa96b40d..91cb5ef6404 100644 --- a/.coveragerc +++ b/.coveragerc @@ -436,7 +436,6 @@ omit = homeassistant/components/zeroconf.py homeassistant/components/zwave/__init__.py homeassistant/components/zwave/util.py - homeassistant/components/zwave/workaround.py [report] diff --git a/tests/components/zwave/test_workaround.py b/tests/components/zwave/test_workaround.py new file mode 100644 index 00000000000..2ef54ae066b --- /dev/null +++ b/tests/components/zwave/test_workaround.py @@ -0,0 +1,40 @@ +"""Test Z-Wave workarounds.""" +from homeassistant.components.zwave import const, workaround +from tests.mock.zwave import MockNode, MockValue + + +def test_get_device_no_component_mapping(): + """Test that None is returned.""" + node = MockNode(manufacturer_id=' ') + value = MockValue(data=0, node=node) + assert workaround.get_device_component_mapping(value) is None + + +def test_get_device_component_mapping(): + """Test that component is returned.""" + node = MockNode(manufacturer_id='010f', product_type='0b00') + value = MockValue(data=0, node=node, + command_class=const.COMMAND_CLASS_SENSOR_ALARM) + assert workaround.get_device_component_mapping(value) == 'binary_sensor' + + +def test_get_device_no_mapping(): + """Test that no device mapping is returned.""" + node = MockNode(manufacturer_id=' ') + value = MockValue(data=0, node=node) + assert workaround.get_device_mapping(value) is None + + +def test_get_device_mapping_mt(): + """Test that device mapping mt is returned.""" + node = MockNode(manufacturer_id='0047', product_type='5a52') + value = MockValue(data=0, node=node) + assert workaround.get_device_mapping(value) == 'workaround_no_position' + + +def test_get_device_mapping_mtii(): + """Test that device mapping mtii is returned.""" + node = MockNode(manufacturer_id='013c', product_type='0002', + product_id='0002') + value = MockValue(data=0, node=node, index=0) + assert workaround.get_device_mapping(value) == 'trigger_no_off_event' From f4e9466394e1cb94a9173c915e9137ead174d8f7 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 24 Mar 2017 23:52:14 +0100 Subject: [PATCH 014/116] Bugfix automation fire on bootstrap (#6770) * Bugfix automation fire on bootstrap * Add test & fix bug * fix lint --- .../components/automation/__init__.py | 21 ++++++++++- tests/components/automation/test_init.py | 37 ++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 96d5b0499d2..451a0c538b8 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -12,10 +12,11 @@ import os import voluptuous as vol from homeassistant.setup import async_prepare_setup_platform +from homeassistant.core import CoreState from homeassistant import config as conf_util from homeassistant.const import ( ATTR_ENTITY_ID, CONF_PLATFORM, STATE_ON, SERVICE_TURN_ON, SERVICE_TURN_OFF, - SERVICE_TOGGLE, SERVICE_RELOAD) + SERVICE_TOGGLE, SERVICE_RELOAD, EVENT_HOMEASSISTANT_START) from homeassistant.components import logbook from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import extract_domain_configs, script, condition @@ -266,15 +267,31 @@ class AutomationEntity(ToggleEntity): @asyncio.coroutine def async_added_to_hass(self) -> None: """Startup with initial state or previous state.""" + enable_automation = False + state = yield from async_get_last_state(self.hass, self.entity_id) if state is None: if self._initial_state: - yield from self.async_enable() + enable_automation = True else: self._last_triggered = state.attributes.get('last_triggered') if state.state == STATE_ON: + enable_automation = True + + # HomeAssistant is on bootstrap + if enable_automation and self.hass.state == CoreState.not_running: + @asyncio.coroutine + def async_enable_automation(event): + """Start automation on startup.""" yield from self.async_enable() + self.hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_START, async_enable_automation) + + # HomeAssistant is running + elif enable_automation: + yield from self.async_enable() + @asyncio.coroutine def async_turn_on(self, **kwargs) -> None: """Turn the entity on and update the state.""" diff --git a/tests/components/automation/test_init.py b/tests/components/automation/test_init.py index 271aa58f7fb..629ee8e2975 100644 --- a/tests/components/automation/test_init.py +++ b/tests/components/automation/test_init.py @@ -4,10 +4,11 @@ from datetime import timedelta import unittest from unittest.mock import patch -from homeassistant.core import State +from homeassistant.core import State, CoreState from homeassistant.setup import setup_component, async_setup_component import homeassistant.components.automation as automation -from homeassistant.const import ATTR_ENTITY_ID, STATE_ON, STATE_OFF +from homeassistant.const import ( + ATTR_ENTITY_ID, STATE_ON, STATE_OFF, EVENT_HOMEASSISTANT_START) from homeassistant.exceptions import HomeAssistantError import homeassistant.util.dt as dt_util @@ -568,6 +569,38 @@ class TestAutomation(unittest.TestCase): self.hass.block_till_done() assert len(self.calls) == 2 + def test_automation_not_trigger_on_bootstrap(self): + """Test if automation is not trigger on bootstrap.""" + self.hass.state = CoreState.not_running + + assert setup_component(self.hass, automation.DOMAIN, { + automation.DOMAIN: { + 'trigger': { + 'platform': 'event', + 'event_type': 'test_event', + }, + 'action': { + 'service': 'test.automation', + 'entity_id': 'hello.world' + } + } + }) + + self.hass.bus.fire('test_event') + self.hass.block_till_done() + + assert len(self.calls) == 0 + + self.hass.bus.fire(EVENT_HOMEASSISTANT_START) + self.hass.block_till_done() + self.hass.states = CoreState.running + + self.hass.bus.fire('test_event') + self.hass.block_till_done() + + assert len(self.calls) == 1 + assert ['hello.world'] == self.calls[0].data.get(ATTR_ENTITY_ID) + @asyncio.coroutine def test_automation_restore_state(hass): From 447048701c313ea83c2d9dbafa9bc2704efa5700 Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Sat, 25 Mar 2017 09:48:05 +0100 Subject: [PATCH 015/116] Homematic Fixes (#6769) * Added missing operational modes for thermostats * Added attributes * Updated requirements * Bumped dependency --- homeassistant/components/climate/homematic.py | 4 ++++ homeassistant/components/homematic.py | 9 +++++++-- requirements_all.txt | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/climate/homematic.py b/homeassistant/components/climate/homematic.py index 66b50cd507d..7385eeac98a 100644 --- a/homeassistant/components/climate/homematic.py +++ b/homeassistant/components/climate/homematic.py @@ -16,11 +16,15 @@ _LOGGER = logging.getLogger(__name__) STATE_MANUAL = "manual" STATE_BOOST = "boost" +STATE_COMFORT = "comfort" +STATE_LOWERING = "lowering" HM_STATE_MAP = { "AUTO_MODE": STATE_AUTO, "MANU_MODE": STATE_MANUAL, "BOOST_MODE": STATE_BOOST, + "COMFORT_MODE": STATE_COMFORT, + "LOWERING_MODE": STATE_LOWERING } HM_TEMP_MAP = [ diff --git a/homeassistant/components/homematic.py b/homeassistant/components/homematic.py index e9bcfa80f6c..e40cab05b29 100644 --- a/homeassistant/components/homematic.py +++ b/homeassistant/components/homematic.py @@ -22,7 +22,7 @@ from homeassistant.helpers.event import track_time_interval from homeassistant.config import load_yaml_config_file DOMAIN = 'homematic' -REQUIREMENTS = ["pyhomematic==0.1.22"] +REQUIREMENTS = ["pyhomematic==0.1.24"] SCAN_INTERVAL_HUB = timedelta(seconds=300) SCAN_INTERVAL_VARIABLES = timedelta(seconds=30) @@ -82,7 +82,12 @@ HM_ATTRIBUTE_SUPPORT = { 'RSSI_DEVICE': ['rssi', {}], 'VALVE_STATE': ['valve', {}], 'BATTERY_STATE': ['battery', {}], - 'CONTROL_MODE': ['mode', {0: 'Auto', 1: 'Manual', 2: 'Away', 3: 'Boost'}], + 'CONTROL_MODE': ['mode', {0: 'Auto', + 1: 'Manual', + 2: 'Away', + 3: 'Boost', + 4: 'Comfort', + 5: 'Lowering'}], 'POWER': ['power', {}], 'CURRENT': ['current', {}], 'VOLTAGE': ['voltage', {}], diff --git a/requirements_all.txt b/requirements_all.txt index bc697d6a657..67c67f53b57 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -517,7 +517,7 @@ pyharmony==1.0.12 pyhik==0.1.0 # homeassistant.components.homematic -pyhomematic==0.1.22 +pyhomematic==0.1.24 # homeassistant.components.sensor.hydroquebec pyhydroquebec==1.0.0 From f8005153c95b2ffda072e95f1613c3210b8d9616 Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Sat, 25 Mar 2017 10:28:16 -0400 Subject: [PATCH 016/116] Fix wink siren (#6775) * Fix siren/switch attributes and update python-wink * Updated requirements_all.txt --- homeassistant/components/switch/wink.py | 8 ++++---- homeassistant/components/wink.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/switch/wink.py b/homeassistant/components/switch/wink.py index 1f534f7290f..5d5b477be99 100644 --- a/homeassistant/components/switch/wink.py +++ b/homeassistant/components/switch/wink.py @@ -56,10 +56,10 @@ class WinkToggleDevice(WinkDevice, ToggleEntity): @property def device_state_attributes(self): """Return the state attributes.""" + attributes = super(WinkToggleDevice, self).device_state_attributes try: event = self.wink.last_event() + attributes["last_event"] = event except AttributeError: - event = None - return { - 'last_event': event - } + pass + return attributes diff --git a/homeassistant/components/wink.py b/homeassistant/components/wink.py index 67cfcc7074d..92cd7baa65e 100644 --- a/homeassistant/components/wink.py +++ b/homeassistant/components/wink.py @@ -15,7 +15,7 @@ from homeassistant.const import ( from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['python-wink==1.2.1', 'pubnubsub-handler==1.0.1'] +REQUIREMENTS = ['python-wink==1.2.3', 'pubnubsub-handler==1.0.1'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 67c67f53b57..ef14d364136 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -626,7 +626,7 @@ python-twitch==1.3.0 python-vlc==1.1.2 # homeassistant.components.wink -python-wink==1.2.1 +python-wink==1.2.3 # homeassistant.components.device_tracker.trackr pytrackr==0.0.5 From c817ab08b76399cd902cf7c3781d6f00ba98cc73 Mon Sep 17 00:00:00 2001 From: Nick Sabinske Date: Sat, 25 Mar 2017 10:32:57 -0400 Subject: [PATCH 017/116] Fix bridge-led support in limitlessled.py (#6776) Addressing #6382 . Feedback from github & forums is the bridge_led feature never worked and defining the bridge LED as another group+bulb type is the right way to do this in the limitlessled component. --- homeassistant/components/light/limitlessled.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/homeassistant/components/light/limitlessled.py b/homeassistant/components/light/limitlessled.py index 23d0716e0b4..c2769ab6638 100644 --- a/homeassistant/components/light/limitlessled.py +++ b/homeassistant/components/light/limitlessled.py @@ -25,14 +25,13 @@ CONF_BRIDGES = 'bridges' CONF_GROUPS = 'groups' CONF_NUMBER = 'number' CONF_VERSION = 'version' -CONF_BRIDGE_LED = 'bridge_led' DEFAULT_LED_TYPE = 'rgbw' DEFAULT_PORT = 5987 DEFAULT_TRANSITION = 0 DEFAULT_VERSION = 6 -LED_TYPE = ['rgbw', 'rgbww', 'white'] +LED_TYPE = ['rgbw', 'rgbww', 'white', 'bridge-led'] RGB_BOUNDARY = 40 @@ -54,7 +53,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_VERSION, default=DEFAULT_VERSION): cv.positive_int, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_BRIDGE_LED, default=False): cv.boolean, vol.Required(CONF_GROUPS): vol.All(cv.ensure_list, [ { vol.Required(CONF_NAME): cv.string, @@ -116,8 +114,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None): group_conf.get(CONF_NAME), group_conf.get(CONF_TYPE, DEFAULT_LED_TYPE)) lights.append(LimitlessLEDGroup.factory(group)) - if bridge_conf.get(CONF_BRIDGE_LED) and bridge.bridge_led is not None: - lights.append(LimitlessLEDGroup.factory(bridge.bridge_led)) add_devices(lights) From 5a7155fc4a1336d6d91f00f409da62687da98034 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Sat, 25 Mar 2017 19:39:03 +0100 Subject: [PATCH 018/116] Wrong info in discovery schema (#6779) --- homeassistant/components/zwave/discovery_schemas.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homeassistant/components/zwave/discovery_schemas.py b/homeassistant/components/zwave/discovery_schemas.py index 7753d58651d..12a8c8c4375 100644 --- a/homeassistant/components/zwave/discovery_schemas.py +++ b/homeassistant/components/zwave/discovery_schemas.py @@ -164,7 +164,6 @@ DISCOVERY_SCHEMAS = [ 'v2btze_advanced': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_CONFIGURATION], const.DISC_INDEX: [12], - const.DISC_LABEL: 'Access Control', const.DISC_OPTIONAL: True, }})}, {const.DISC_COMPONENT: 'sensor', From f5d4f853ba8eea966052eb98e54d48040a2e385c Mon Sep 17 00:00:00 2001 From: Teemu R Date: Sun, 26 Mar 2017 10:55:17 +0200 Subject: [PATCH 019/116] switch.tplink: upgrade to the newest upstream release which adds support for plugs using the newer communication protocol (#6790) --- homeassistant/components/switch/tplink.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/switch/tplink.py b/homeassistant/components/switch/tplink.py index f740a5f1614..b4c1df3db73 100644 --- a/homeassistant/components/switch/tplink.py +++ b/homeassistant/components/switch/tplink.py @@ -14,7 +14,7 @@ from homeassistant.components.switch import (SwitchDevice, PLATFORM_SCHEMA) from homeassistant.const import (CONF_HOST, CONF_NAME) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['pyHS100==0.2.3'] +REQUIREMENTS = ['pyHS100==0.2.4.1'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index ef14d364136..b06d6545d00 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -456,7 +456,7 @@ py-cpuinfo==0.2.7 pyCEC==0.4.13 # homeassistant.components.switch.tplink -pyHS100==0.2.3 +pyHS100==0.2.4.1 # homeassistant.components.rfxtrx pyRFXtrx==0.17.0 From 22b28d85db1a9ae753a777e3bbdff3c6aaf60470 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Mar 2017 15:48:28 +0200 Subject: [PATCH 020/116] Add switch to MQTT discovery (#6733) --- homeassistant/components/mqtt/discovery.py | 5 +++-- homeassistant/components/switch/mqtt.py | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index 86cce757449..c3ff0f9dce5 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -19,12 +19,13 @@ _LOGGER = logging.getLogger(__name__) TOPIC_MATCHER = re.compile( r'(?P\w+)/(?P\w+)/(?P\w+)/config') -SUPPORTED_COMPONENTS = ['binary_sensor', 'light', 'sensor'] +SUPPORTED_COMPONENTS = ['binary_sensor', 'light', 'sensor', 'switch'] ALLOWED_PLATFORMS = { 'binary_sensor': ['mqtt'], 'light': ['mqtt', 'mqtt_json', 'mqtt_template'], - 'sensor': ['mqtt'] + 'sensor': ['mqtt'], + 'switch': ['mqtt'], } diff --git a/homeassistant/components/switch/mqtt.py b/homeassistant/components/switch/mqtt.py index d94815a1d2e..391df2ad67e 100644 --- a/homeassistant/components/switch/mqtt.py +++ b/homeassistant/components/switch/mqtt.py @@ -38,7 +38,10 @@ PLATFORM_SCHEMA = mqtt.MQTT_RW_PLATFORM_SCHEMA.extend({ @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): - """Setup the MQTT switch.""" + """Set up the MQTT switch.""" + if discovery_info is not None: + config = PLATFORM_SCHEMA(discovery_info) + value_template = config.get(CONF_VALUE_TEMPLATE) if value_template is not None: value_template.hass = hass From 5d5547cdb6dd91924e719c0b5e61e2b89e48e14b Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Mar 2017 15:50:40 +0200 Subject: [PATCH 021/116] Update docstrings (#6795) * Add link to docs and remove comments which are obvious * Update docstrings * Repleace conf details with link to docs * Add link to docs * Update docstrings * Update import * Update ordering * Update ordering * Update docstring * Update ordering * Update ordering --- .../components/binary_sensor/blink.py | 2 +- .../components/binary_sensor/workday.py | 32 ++--- homeassistant/components/blink.py | 26 ++-- homeassistant/components/climate/tado.py | 118 +++++++++--------- homeassistant/components/light/piglow.py | 10 +- .../components/light/yeelightsunflower.py | 16 ++- .../media_player/frontier_silicon.py | 6 +- .../components/media_player/volumio.py | 55 +++----- homeassistant/components/notify/ciscospark.py | 6 +- .../components/sensor/api_streams.py | 10 +- homeassistant/components/sensor/blink.py | 7 +- homeassistant/components/sensor/ring.py | 4 +- homeassistant/components/tado.py | 46 ++++--- homeassistant/components/twilio.py | 14 ++- 14 files changed, 160 insertions(+), 192 deletions(-) diff --git a/homeassistant/components/binary_sensor/blink.py b/homeassistant/components/binary_sensor/blink.py index 8d84ffb9c90..1e95d4d466b 100644 --- a/homeassistant/components/binary_sensor/blink.py +++ b/homeassistant/components/binary_sensor/blink.py @@ -11,7 +11,7 @@ DEPENDENCIES = ['blink'] def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the blink binary sensors.""" + """Set up the blink binary sensors.""" if discovery_info is None: return diff --git a/homeassistant/components/binary_sensor/workday.py b/homeassistant/components/binary_sensor/workday.py index 1b53738a25f..c2590925df7 100644 --- a/homeassistant/components/binary_sensor/workday.py +++ b/homeassistant/components/binary_sensor/workday.py @@ -1,4 +1,9 @@ -"""Sensor to indicate whether the current day is a workday.""" +""" +Sensor to indicate whether the current day is a workday. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.workday/ +""" import asyncio import logging import datetime @@ -6,8 +11,8 @@ import datetime import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import (STATE_ON, STATE_OFF, STATE_UNKNOWN, - CONF_NAME, WEEKDAYS) +from homeassistant.const import ( + STATE_ON, STATE_OFF, STATE_UNKNOWN, CONF_NAME, WEEKDAYS) import homeassistant.util.dt as dt_util from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv @@ -48,29 +53,18 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the Workday sensor.""" + """Set up the Workday sensor.""" import holidays - # Get the Sensor name from the config sensor_name = config.get(CONF_NAME) - - # Get the country code from the config country = config.get(CONF_COUNTRY) - - # Get the province from the config province = config.get(CONF_PROVINCE) - - # Get the list of workdays from the config workdays = config.get(CONF_WORKDAYS) - - # Get the list of excludes from the config excludes = config.get(CONF_EXCLUDES) - # Instantiate the holidays module for the current year year = datetime.datetime.now().year obj_holidays = getattr(holidays, country)(years=year) - # Also apply the provience, if available for the configured country if province: if province not in obj_holidays.PROVINCES: _LOGGER.error('There is no province/state %s in country %s', @@ -81,14 +75,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): obj_holidays = getattr(holidays, country)(prov=province, years=year) - # Output found public holidays via the debug channel _LOGGER.debug("Found the following holidays for your configuration:") for date, name in sorted(obj_holidays.items()): _LOGGER.debug("%s %s", date, name) - # Add ourselves as device - add_devices([IsWorkdaySensor(obj_holidays, workdays, - excludes, sensor_name)], True) + add_devices([IsWorkdaySensor( + obj_holidays, workdays, excludes, sensor_name)], True) def day_to_string(day): @@ -122,7 +114,6 @@ class IsWorkdaySensor(Entity): def is_include(self, day, now): """Check if given day is in the includes list.""" - # Check includes if day in self._workdays: return True elif 'holiday' in self._workdays and now in self._obj_holidays: @@ -132,7 +123,6 @@ class IsWorkdaySensor(Entity): def is_exclude(self, day, now): """Check if given day is in the excludes list.""" - # Check excludes if day in self._excludes: return True elif 'holiday' in self._excludes and now in self._obj_holidays: diff --git a/homeassistant/components/blink.py b/homeassistant/components/blink.py index 2a079716b68..4ae5007d665 100644 --- a/homeassistant/components/blink.py +++ b/homeassistant/components/blink.py @@ -5,17 +5,19 @@ For more details about this component, please refer to the documentation at https://home-assistant.io/components/blink/ """ import logging + import voluptuous as vol + import homeassistant.helpers.config_validation as cv -from homeassistant.const import (CONF_USERNAME, - CONF_PASSWORD, - ATTR_FRIENDLY_NAME, - ATTR_ARMED) +from homeassistant.const import ( + CONF_USERNAME, CONF_PASSWORD, ATTR_FRIENDLY_NAME, ATTR_ARMED) from homeassistant.helpers import discovery + +REQUIREMENTS = ['blinkpy==0.5.2'] + _LOGGER = logging.getLogger(__name__) DOMAIN = 'blink' -REQUIREMENTS = ['blinkpy==0.5.2'] CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ @@ -50,7 +52,7 @@ class BlinkSystem(object): def setup(hass, config): - """Setup Blink System.""" + """Set up Blink System.""" hass.data[DOMAIN] = BlinkSystem(config) discovery.load_platform(hass, 'camera', DOMAIN, {}, config) discovery.load_platform(hass, 'sensor', DOMAIN, {}, config) @@ -77,11 +79,11 @@ def setup(hass, config): hass.data[DOMAIN].blink.arm = value hass.data[DOMAIN].blink.refresh() - hass.services.register(DOMAIN, 'snap_picture', snap_picture, - schema=SNAP_PICTURE_SCHEMA) - hass.services.register(DOMAIN, 'arm_camera', arm_camera, - schema=ARM_CAMERA_SCHEMA) - hass.services.register(DOMAIN, 'arm_system', arm_system, - schema=ARM_SYSTEM_SCHEMA) + hass.services.register( + DOMAIN, 'snap_picture', snap_picture, schema=SNAP_PICTURE_SCHEMA) + hass.services.register( + DOMAIN, 'arm_camera', arm_camera, schema=ARM_CAMERA_SCHEMA) + hass.services.register( + DOMAIN, 'arm_system', arm_system, schema=ARM_SYSTEM_SCHEMA) return True diff --git a/homeassistant/components/climate/tado.py b/homeassistant/components/climate/tado.py index e5242f88162..734b13dc7e7 100644 --- a/homeassistant/components/climate/tado.py +++ b/homeassistant/components/climate/tado.py @@ -1,40 +1,40 @@ -"""tado component to create a climate device for each zone.""" +""" +Tado component to create a climate device for each zone. +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/climate.tado/ +""" import logging from homeassistant.const import TEMP_CELSIUS - -from homeassistant.components.climate import ( - ClimateDevice) -from homeassistant.const import ( - ATTR_TEMPERATURE) -from homeassistant.components.tado import ( - DATA_TADO) - -CONST_MODE_SMART_SCHEDULE = "SMART_SCHEDULE" # Default mytado mode -CONST_MODE_OFF = "OFF" # Switch off heating in a zone - -# When we change the temperature setting, we need an overlay mode -# wait until tado changes the mode automatic -CONST_OVERLAY_TADO_MODE = "TADO_MODE" -# the user has change the temperature or mode manually -CONST_OVERLAY_MANUAL = "MANUAL" -# the temperature will be reset after a timespan -CONST_OVERLAY_TIMER = "TIMER" - -OPERATION_LIST = { - CONST_OVERLAY_MANUAL: "Manual", - CONST_OVERLAY_TIMER: "Timer", - CONST_OVERLAY_TADO_MODE: "Tado mode", - CONST_MODE_SMART_SCHEDULE: "Smart schedule", - CONST_MODE_OFF: "Off"} +from homeassistant.components.climate import ClimateDevice +from homeassistant.const import ATTR_TEMPERATURE +from homeassistant.components.tado import DATA_TADO _LOGGER = logging.getLogger(__name__) +CONST_MODE_SMART_SCHEDULE = 'SMART_SCHEDULE' # Default mytado mode +CONST_MODE_OFF = 'OFF' # Switch off heating in a zone + +# When we change the temperature setting, we need an overlay mode +# wait until tado changes the mode automatic +CONST_OVERLAY_TADO_MODE = 'TADO_MODE' +# the user has change the temperature or mode manually +CONST_OVERLAY_MANUAL = 'MANUAL' +# the temperature will be reset after a timespan +CONST_OVERLAY_TIMER = 'TIMER' + +OPERATION_LIST = { + CONST_OVERLAY_MANUAL: 'Manual', + CONST_OVERLAY_TIMER: 'Timer', + CONST_OVERLAY_TADO_MODE: 'Tado mode', + CONST_MODE_SMART_SCHEDULE: 'Smart schedule', + CONST_MODE_OFF: 'Off', +} + def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the climate platform.""" - # get the PyTado object from the hub component + """Set up the Tado climate platform.""" tado = hass.data[DATA_TADO] try: @@ -45,10 +45,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): climate_devices = [] for zone in zones: - climate_devices.append(create_climate_device(tado, hass, - zone, - zone['name'], - zone['id'])) + climate_devices.append(create_climate_device( + tado, hass, zone, zone['name'], zone['id'])) if len(climate_devices) > 0: add_devices(climate_devices, True) @@ -58,13 +56,13 @@ def setup_platform(hass, config, add_devices, discovery_info=None): def create_climate_device(tado, hass, zone, name, zone_id): - """Create a climate device.""" + """Create a Tado climate device.""" capabilities = tado.get_capabilities(zone_id) unit = TEMP_CELSIUS - min_temp = float(capabilities["temperatures"]["celsius"]["min"]) - max_temp = float(capabilities["temperatures"]["celsius"]["max"]) - ac_mode = capabilities["type"] != "HEATING" + min_temp = float(capabilities['temperatures']['celsius']['min']) + max_temp = float(capabilities['temperatures']['celsius']['max']) + ac_mode = capabilities['type'] != 'HEATING' data_id = 'zone {} {}'.format(name, zone_id) device = TadoClimate(tado, @@ -74,10 +72,10 @@ def create_climate_device(tado, hass, zone, name, zone_id): ac_mode) tado.add_sensor(data_id, { - "id": zone_id, - "zone": zone, - "name": name, - "climate": device + 'id': zone_id, + 'zone': zone, + 'name': name, + 'climate': device }) return device @@ -89,7 +87,7 @@ class TadoClimate(ClimateDevice): def __init__(self, store, zone_name, zone_id, data_id, min_temp, max_temp, ac_mode, tolerance=0.3): - """Initialization of TadoClimate device.""" + """Initialization of Tado climate device.""" self._store = store self._data_id = data_id @@ -202,8 +200,7 @@ class TadoClimate(ClimateDevice): data = self._store.get_data(self._data_id) if data is None: - _LOGGER.debug('Recieved no data for zone %s', - self.zone_name) + _LOGGER.debug("Recieved no data for zone %s", self.zone_name) return if 'sensorDataPoints' in data: @@ -232,11 +229,11 @@ class TadoClimate(ClimateDevice): if 'tadoMode' in data: mode = data['tadoMode'] - self._is_away = mode == "AWAY" + self._is_away = mode == 'AWAY' if 'setting' in data: power = data['setting']['power'] - if power == "OFF": + if power == 'OFF': self._current_operation = CONST_MODE_OFF self._device_is_active = False else: @@ -249,48 +246,47 @@ class TadoClimate(ClimateDevice): overlay = False termination = "" - # if you set mode manualy to off, there will be an overlay - # and a termination, but we want to see the mode "OFF" + # If you set mode manualy to off, there will be an overlay + # and a termination, but we want to see the mode "OFF" if overlay and self._device_is_active: - # there is an overlay the device is on + # There is an overlay the device is on self._overlay_mode = termination self._current_operation = termination else: - # there is no overlay, the mode will always be - # "SMART_SCHEDULE" + # There is no overlay, the mode will always be + # "SMART_SCHEDULE" self._overlay_mode = CONST_MODE_SMART_SCHEDULE self._current_operation = CONST_MODE_SMART_SCHEDULE def _control_heating(self): """Send new target temperature to mytado.""" - if not self._active and None not in (self._cur_temp, - self._target_temp): + if not self._active and None not in ( + self._cur_temp, self._target_temp): self._active = True - _LOGGER.info('Obtained current and target temperature. ' - 'tado thermostat active.') + _LOGGER.info("Obtained current and target temperature. " + "Tado thermostat active") if not self._active or self._current_operation == self._overlay_mode: return if self._current_operation == CONST_MODE_SMART_SCHEDULE: - _LOGGER.info('Switching mytado.com to SCHEDULE (default) ' - 'for zone %s', self.zone_name) + _LOGGER.info("Switching mytado.com to SCHEDULE (default) " + "for zone %s", self.zone_name) self._store.reset_zone_overlay(self.zone_id) self._overlay_mode = self._current_operation return if self._current_operation == CONST_MODE_OFF: - _LOGGER.info('Switching mytado.com to OFF for zone %s', + _LOGGER.info("Switching mytado.com to OFF for zone %s", self.zone_name) self._store.set_zone_overlay(self.zone_id, CONST_OVERLAY_MANUAL) self._overlay_mode = self._current_operation return - _LOGGER.info('Switching mytado.com to %s mode for zone %s', + _LOGGER.info("Switching mytado.com to %s mode for zone %s", self._current_operation, self.zone_name) - self._store.set_zone_overlay(self.zone_id, - self._current_operation, - self._target_temp) + self._store.set_zone_overlay( + self.zone_id, self._current_operation, self._target_temp) self._overlay_mode = self._current_operation diff --git a/homeassistant/components/light/piglow.py b/homeassistant/components/light/piglow.py index d4e9c9ed106..afdda745721 100644 --- a/homeassistant/components/light/piglow.py +++ b/homeassistant/components/light/piglow.py @@ -9,15 +9,12 @@ import subprocess import voluptuous as vol -# Import the device class from the component that you want to support +import homeassistant.helpers.config_validation as cv from homeassistant.components.light import ( - ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS, - ATTR_RGB_COLOR, SUPPORT_RGB_COLOR, + ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS, ATTR_RGB_COLOR, SUPPORT_RGB_COLOR, Light, PLATFORM_SCHEMA) from homeassistant.const import CONF_NAME -import homeassistant.helpers.config_validation as cv -# Home Assistant depends on 3rd party packages for API specific code. REQUIREMENTS = ['piglow==1.2.4'] _LOGGER = logging.getLogger(__name__) @@ -32,7 +29,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the Piglow Light platform.""" + """Set up the Piglow Light platform.""" import piglow if subprocess.getoutput("i2cdetect -q -y 1 | grep -o 54") != '54': @@ -41,7 +38,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None): name = config.get(CONF_NAME) - # Add devices add_devices([PiglowLight(piglow, name)]) diff --git a/homeassistant/components/light/yeelightsunflower.py b/homeassistant/components/light/yeelightsunflower.py index 204803e9991..70df2136716 100644 --- a/homeassistant/components/light/yeelightsunflower.py +++ b/homeassistant/components/light/yeelightsunflower.py @@ -5,21 +5,19 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/light.yeelightsunflower/ """ import logging + import voluptuous as vol -from homeassistant.components.light import (Light, - ATTR_RGB_COLOR, SUPPORT_RGB_COLOR, - ATTR_BRIGHTNESS, - SUPPORT_BRIGHTNESS, - PLATFORM_SCHEMA) -from homeassistant.const import CONF_HOST import homeassistant.helpers.config_validation as cv +from homeassistant.components.light import ( + Light, ATTR_RGB_COLOR, SUPPORT_RGB_COLOR, ATTR_BRIGHTNESS, + SUPPORT_BRIGHTNESS, PLATFORM_SCHEMA) +from homeassistant.const import CONF_HOST REQUIREMENTS = ['yeelightsunflower==0.0.8'] _LOGGER = logging.getLogger(__name__) - SUPPORT_YEELIGHT_SUNFLOWER = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ @@ -35,7 +33,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): hub = yeelightsunflower.Hub(host) if not hub.available: - _LOGGER.error('Could not connect to Yeelight Sunflower hub') + _LOGGER.error("Could not connect to Yeelight Sunflower hub") return False add_devices(SunflowerBulb(light) for light in hub.get_lights()) @@ -55,7 +53,7 @@ class SunflowerBulb(Light): @property def name(self): """Return the display name of this light.""" - return "sunflower_{}".format(self._light.zid) + return 'sunflower_{}'.format(self._light.zid) @property def available(self): diff --git a/homeassistant/components/media_player/frontier_silicon.py b/homeassistant/components/media_player/frontier_silicon.py index 386a489b646..8bd36b4535c 100644 --- a/homeassistant/components/media_player/frontier_silicon.py +++ b/homeassistant/components/media_player/frontier_silicon.py @@ -42,7 +42,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ # pylint: disable=unused-argument def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the Frontier Silicon platform.""" + """Set up the Frontier Silicon platform.""" import requests if discovery_info is not None: @@ -59,10 +59,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices( [FSAPIDevice(DEVICE_URL.format(host, port), password)], update_before_add=True) - _LOGGER.debug('FSAPI device %s:%s -> %s', host, port, password) + _LOGGER.debug("FSAPI device %s:%s -> %s", host, port, password) return True except requests.exceptions.RequestException: - _LOGGER.error('Could not add the FSAPI device at %s:%s -> %s', + _LOGGER.error("Could not add the FSAPI device at %s:%s -> %s", host, port, password) return False diff --git a/homeassistant/components/media_player/volumio.py b/homeassistant/components/media_player/volumio.py index 46345f9c7f3..bcd4ebd0c11 100755 --- a/homeassistant/components/media_player/volumio.py +++ b/homeassistant/components/media_player/volumio.py @@ -1,49 +1,31 @@ """ Volumio Platform. -The volumio platform allows you to control a Volumio media player -from Home Assistant. - - -To add a Volumio player to your installation, add the following to -your configuration.yaml file. - -# Example configuration.yaml entry -media_player: - - platform: volumio - name: 'Volumio Home Audio' - host: homeaudio.local - port: 3000 -Configuration variables: - -- **name** (*Optional*): Name of the device -- **host** (*Required*): IP address or hostname of the device -- **port** (*Required*): Port number of Volumio service +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/media_player.volumio/ """ import logging import asyncio import aiohttp + import voluptuous as vol from homeassistant.components.media_player import ( - SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, - SUPPORT_PREVIOUS_TRACK, SUPPORT_SEEK, - SUPPORT_PLAY_MEDIA, SUPPORT_VOLUME_MUTE, - SUPPORT_VOLUME_SET, SUPPORT_STOP, - SUPPORT_PLAY, MediaPlayerDevice, - PLATFORM_SCHEMA, MEDIA_TYPE_MUSIC) + SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, SUPPORT_PREVIOUS_TRACK, SUPPORT_SEEK, + SUPPORT_PLAY_MEDIA, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, SUPPORT_STOP, + SUPPORT_PLAY, MediaPlayerDevice, PLATFORM_SCHEMA, MEDIA_TYPE_MUSIC) from homeassistant.const import ( STATE_PLAYING, STATE_PAUSED, STATE_IDLE, CONF_HOST, CONF_PORT, CONF_NAME) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.aiohttp_client import async_get_clientsession - _CONFIGURING = {} _LOGGER = logging.getLogger(__name__) DEFAULT_HOST = 'localhost' DEFAULT_NAME = 'Volumio' DEFAULT_PORT = 3000 + TIMEOUT = 10 SUPPORT_VOLUMIO = SUPPORT_PAUSE | SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \ @@ -60,10 +42,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): - """Setup the Volumio platform.""" + """Set up the Volumio platform.""" host = config.get(CONF_HOST) port = config.get(CONF_PORT) name = config.get(CONF_NAME) + async_add_devices([Volumio(name, host, port, hass)]) @@ -75,7 +58,7 @@ class Volumio(MediaPlayerDevice): self.host = host self.port = port self.hass = hass - self._url = host + ":" + str(port) + self._url = '{}:{}'.format(host, str(port)) self._name = name self._state = {} self.async_update() @@ -84,8 +67,7 @@ class Volumio(MediaPlayerDevice): @asyncio.coroutine def send_volumio_msg(self, method, params=None): """Send message.""" - url = "http://{}:{}/api/v1/{}/".format( - self.host, self.port, method) + url = "http://{}:{}/api/v1/{}/".format(self.host, self.port, method) response = None _LOGGER.debug("URL: %s params: %s", url, params) @@ -218,9 +200,8 @@ class Volumio(MediaPlayerDevice): def async_set_volume_level(self, volume): """Send volume_up command to media player.""" - return self.send_volumio_msg('commands', - params={'cmd': 'volume', - 'volume': int(volume * 100)}) + return self.send_volumio_msg( + 'commands', params={'cmd': 'volume', 'volume': int(volume * 100)}) def async_mute_volume(self, mute): """Send mute command to media player.""" @@ -228,10 +209,8 @@ class Volumio(MediaPlayerDevice): if mute: # mute is implemenhted as 0 volume, do save last volume level self._lastvol = self._state['volume'] - return self.send_volumio_msg('commands', - params={'cmd': 'volume', - 'volume': mutecmd}) + return self.send_volumio_msg( + 'commands', params={'cmd': 'volume', 'volume': mutecmd}) else: - return self.send_volumio_msg('commands', - params={'cmd': 'volume', - 'volume': self._lastvol}) + return self.send_volumio_msg( + 'commands', params={'cmd': 'volume', 'volume': self._lastvol}) diff --git a/homeassistant/components/notify/ciscospark.py b/homeassistant/components/notify/ciscospark.py index 3a4ef1384d9..ee6115c3f79 100644 --- a/homeassistant/components/notify/ciscospark.py +++ b/homeassistant/components/notify/ciscospark.py @@ -5,17 +5,19 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/notify.ciscospark/ """ import logging + import voluptuous as vol + from homeassistant.components.notify import ( PLATFORM_SCHEMA, BaseNotificationService, ATTR_TITLE) from homeassistant.const import (CONF_TOKEN) import homeassistant.helpers.config_validation as cv -CONF_ROOMID = "roomid" +REQUIREMENTS = ['ciscosparkapi==0.4.2'] _LOGGER = logging.getLogger(__name__) -REQUIREMENTS = ['ciscosparkapi==0.4.2'] +CONF_ROOMID = 'roomid' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_TOKEN): cv.string, diff --git a/homeassistant/components/sensor/api_streams.py b/homeassistant/components/sensor/api_streams.py index e1d6c775196..c15ca41d2bf 100644 --- a/homeassistant/components/sensor/api_streams.py +++ b/homeassistant/components/sensor/api_streams.py @@ -1,4 +1,9 @@ -"""Entity to track connections to stream API.""" +""" +Entity to track connections to stream API. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.api_stream/ +""" import asyncio import logging @@ -6,7 +11,6 @@ from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.core import callback from homeassistant.helpers.entity import Entity - NAME_WS = 'homeassistant.components.websocket_api' NAME_STREAM = 'homeassistant.components.api' @@ -46,7 +50,7 @@ class StreamHandler(logging.Handler): @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): - """Set up the logger for filters.""" + """Set up the API stream platform.""" entity = APICount() handler = StreamHandler(entity) diff --git a/homeassistant/components/sensor/blink.py b/homeassistant/components/sensor/blink.py index 738f8cb2768..e069dfa00f7 100644 --- a/homeassistant/components/sensor/blink.py +++ b/homeassistant/components/sensor/blink.py @@ -10,18 +10,19 @@ from homeassistant.components.blink import DOMAIN from homeassistant.const import TEMP_FAHRENHEIT from homeassistant.helpers.entity import Entity +_LOGGER = logging.getLogger(__name__) + DEPENDENCIES = ['blink'] + SENSOR_TYPES = { 'temperature': ['Temperature', TEMP_FAHRENHEIT], 'battery': ['Battery', ''], 'notifications': ['Notifications', ''] } -_LOGGER = logging.getLogger(__name__) - def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup a Blink sensor.""" + """Set up a Blink sensor.""" if discovery_info is None: return diff --git a/homeassistant/components/sensor/ring.py b/homeassistant/components/sensor/ring.py index ab64557dd2f..7c342a75f13 100644 --- a/homeassistant/components/sensor/ring.py +++ b/homeassistant/components/sensor/ring.py @@ -8,15 +8,15 @@ import logging from datetime import timedelta import voluptuous as vol -import homeassistant.helpers.config_validation as cv +import homeassistant.loader as loader +import homeassistant.helpers.config_validation as cv from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( CONF_ENTITY_NAMESPACE, CONF_MONITORED_CONDITIONS, CONF_SCAN_INTERVAL, CONF_USERNAME, CONF_PASSWORD, STATE_UNKNOWN, ATTR_ATTRIBUTION) from homeassistant.helpers.entity import Entity -import homeassistant.loader as loader from requests.exceptions import HTTPError, ConnectTimeout diff --git a/homeassistant/components/tado.py b/homeassistant/components/tado.py index b0aae8b3f4a..ffb4da61fed 100644 --- a/homeassistant/components/tado.py +++ b/homeassistant/components/tado.py @@ -1,31 +1,31 @@ """ -Support for the (unofficial) tado api. +Support for the (unofficial) Tado api. For more details about this component, please refer to the documentation at https://home-assistant.io/components/tado/ """ - import logging import urllib - from datetime import timedelta + import voluptuous as vol from homeassistant.helpers.discovery import load_platform from homeassistant.helpers import config_validation as cv -from homeassistant.const import ( - CONF_USERNAME, CONF_PASSWORD) +from homeassistant.const import CONF_USERNAME, CONF_PASSWORD from homeassistant.util import Throttle - -_LOGGER = logging.getLogger(__name__) - -DOMAIN = 'tado' - REQUIREMENTS = ['https://github.com/wmalgadey/PyTado/archive/' '0.1.10.zip#' 'PyTado==0.1.10'] +_LOGGER = logging.getLogger(__name__) + +DATA_TADO = 'tado_data' +DOMAIN = 'tado' + +MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=10) + TADO_COMPONENTS = [ 'sensor', 'climate' ] @@ -37,13 +37,9 @@ CONFIG_SCHEMA = vol.Schema({ }) }, extra=vol.ALLOW_EXTRA) -MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=10) - -DATA_TADO = 'tado_data' - def setup(hass, config): - """Your controller/hub specific code.""" + """Set up of the Tado component.""" username = config[DOMAIN][CONF_USERNAME] password = config[DOMAIN][CONF_PASSWORD] @@ -64,7 +60,7 @@ def setup(hass, config): class TadoDataStore: - """An object to store the tado data.""" + """An object to store the Tado data.""" def __init__(self, tado): """Initialize Tado data store.""" @@ -80,19 +76,19 @@ class TadoDataStore: data = None try: - if "zone" in sensor: - _LOGGER.info("querying mytado.com for zone %s %s", - sensor["id"], sensor["name"]) - data = self.tado.getState(sensor["id"]) + if 'zone' in sensor: + _LOGGER.info("Querying mytado.com for zone %s %s", + sensor['id'], sensor['name']) + data = self.tado.getState(sensor['id']) - if "device" in sensor: - _LOGGER.info("querying mytado.com for device %s %s", - sensor["id"], sensor["name"]) + if 'device' in sensor: + _LOGGER.info("Querying mytado.com for device %s %s", + sensor['id'], sensor['name']) data = self.tado.getDevices()[0] except RuntimeError: _LOGGER.error("Unable to connect to myTado. %s %s", - sensor["id"], sensor["id"]) + sensor['id'], sensor['id']) self.data[data_id] = data @@ -103,7 +99,7 @@ class TadoDataStore: def get_data(self, data_id): """Get the cached data.""" - data = {"error": "no data"} + data = {'error': 'no data'} if data_id in self.data: data = self.data[data_id] diff --git a/homeassistant/components/twilio.py b/homeassistant/components/twilio.py index e4b36d41e14..9f32a44ce7e 100644 --- a/homeassistant/components/twilio.py +++ b/homeassistant/components/twilio.py @@ -5,21 +5,25 @@ For more details about this component, please refer to the documentation at https://home-assistant.io/components/twilio/ """ import voluptuous as vol + import homeassistant.helpers.config_validation as cv from homeassistant.core import callback from homeassistant.components.http import HomeAssistantView -DEPENDENCIES = ['http'] REQUIREMENTS = ['twilio==5.7.0'] DOMAIN = 'twilio' -DATA_TWILIO = DOMAIN + API_PATH = '/api/{}'.format(DOMAIN) -RECEIVED_DATA = '{}_data_received'.format(DOMAIN) CONF_ACCOUNT_SID = 'account_sid' CONF_AUTH_TOKEN = 'auth_token' +DATA_TWILIO = DOMAIN +DEPENDENCIES = ['http'] + +RECEIVED_DATA = '{}_data_received'.format(DOMAIN) + CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ vol.Required(CONF_ACCOUNT_SID): cv.string, @@ -32,8 +36,8 @@ def setup(hass, config): """Set up the Twilio component.""" from twilio.rest import TwilioRestClient conf = config[DOMAIN] - hass.data[DATA_TWILIO] = TwilioRestClient(conf.get(CONF_ACCOUNT_SID), - conf.get(CONF_AUTH_TOKEN)) + hass.data[DATA_TWILIO] = TwilioRestClient( + conf.get(CONF_ACCOUNT_SID), conf.get(CONF_AUTH_TOKEN)) hass.http.register_view(TwilioReceiveDataView()) return True From 7782e7e948ae6bdf322169fe0c8acaa143f7fcdc Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Mar 2017 15:52:59 +0200 Subject: [PATCH 022/116] Add optional unit of measurement (#6796) --- homeassistant/components/sensor/random.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/random.py b/homeassistant/components/sensor/random.py index 21251ab5f3b..0b0761d7076 100644 --- a/homeassistant/components/sensor/random.py +++ b/homeassistant/components/sensor/random.py @@ -11,7 +11,8 @@ import voluptuous as vol import homeassistant.helpers.config_validation as cv from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import (CONF_NAME, CONF_MINIMUM, CONF_MAXIMUM) +from homeassistant.const import ( + CONF_NAME, CONF_MINIMUM, CONF_MAXIMUM, CONF_UNIT_OF_MEASUREMENT) from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) @@ -26,6 +27,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_MAXIMUM, default=DEFAULT_MAX): cv.positive_int, vol.Optional(CONF_MINIMUM, default=DEFAULT_MIN): cv.positive_int, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, }) @@ -35,19 +37,21 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): name = config.get(CONF_NAME) minimum = config.get(CONF_MINIMUM) maximum = config.get(CONF_MAXIMUM) + unit = config.get(CONF_UNIT_OF_MEASUREMENT) - async_add_devices([RandomSensor(name, minimum, maximum)], True) + async_add_devices([RandomSensor(name, minimum, maximum, unit)], True) return True class RandomSensor(Entity): """Representation of a Random number sensor.""" - def __init__(self, name, minimum, maximum): + def __init__(self, name, minimum, maximum, unit_of_measurement): """Initialize the sensor.""" self._name = name self._minimum = minimum self._maximum = maximum + self._unit_of_measurement = unit_of_measurement self._state = None @property @@ -65,6 +69,11 @@ class RandomSensor(Entity): """Icon to use in the frontend, if any.""" return ICON + @property + def unit_of_measurement(self): + """Return the unit this state is expressed in.""" + return self._unit_of_measurement + @asyncio.coroutine def async_update(self): """Get a new number and updates the states.""" From ad649009cdbd4f05018974feaa9ddc0609f874bd Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Mar 2017 15:53:42 +0200 Subject: [PATCH 023/116] Upgrade zeroconf to 0.19.0 (#6792) --- homeassistant/components/zeroconf.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/zeroconf.py b/homeassistant/components/zeroconf.py index d0a61e0cec0..3dc30f3a24e 100644 --- a/homeassistant/components/zeroconf.py +++ b/homeassistant/components/zeroconf.py @@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['api'] DOMAIN = 'zeroconf' -REQUIREMENTS = ['zeroconf==0.18.0'] +REQUIREMENTS = ['zeroconf==0.19.0'] ZEROCONF_TYPE = '_home-assistant._tcp.local.' diff --git a/requirements_all.txt b/requirements_all.txt index b06d6545d00..e78297ca418 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -796,4 +796,4 @@ yeelightsunflower==0.0.8 zengge==0.2 # homeassistant.components.zeroconf -zeroconf==0.18.0 +zeroconf==0.19.0 From 6e44ccf683b0e1661f1fe593d6883be5bc7fb992 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Mar 2017 15:53:53 +0200 Subject: [PATCH 024/116] Upgrade pysnmp to 4.3.5 (#6793) --- homeassistant/components/device_tracker/snmp.py | 2 +- homeassistant/components/sensor/snmp.py | 14 +++++++------- requirements_all.txt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/device_tracker/snmp.py b/homeassistant/components/device_tracker/snmp.py index 6e8b07e6bab..cbe70075665 100644 --- a/homeassistant/components/device_tracker/snmp.py +++ b/homeassistant/components/device_tracker/snmp.py @@ -19,7 +19,7 @@ from homeassistant.util import Throttle _LOGGER = logging.getLogger(__name__) -REQUIREMENTS = ['pysnmp==4.3.4'] +REQUIREMENTS = ['pysnmp==4.3.5'] CONF_COMMUNITY = 'community' CONF_AUTHKEY = 'authkey' diff --git a/homeassistant/components/sensor/snmp.py b/homeassistant/components/sensor/snmp.py index b72398c3736..1342f3d2a9e 100644 --- a/homeassistant/components/sensor/snmp.py +++ b/homeassistant/components/sensor/snmp.py @@ -16,7 +16,7 @@ from homeassistant.const import ( import homeassistant.helpers.config_validation as cv from homeassistant.util import Throttle -REQUIREMENTS = ['pysnmp==4.3.4'] +REQUIREMENTS = ['pysnmp==4.3.5'] _LOGGER = logging.getLogger(__name__) @@ -42,9 +42,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the SNMP sensor.""" - from pysnmp.hlapi import (getCmd, CommunityData, SnmpEngine, - UdpTransportTarget, ContextData, ObjectType, - ObjectIdentity) + from pysnmp.hlapi import ( + getCmd, CommunityData, SnmpEngine, UdpTransportTarget, ContextData, + ObjectType, ObjectIdentity) name = config.get(CONF_NAME) host = config.get(CONF_HOST) @@ -114,9 +114,9 @@ class SnmpData(object): @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): """Get the latest data from the remote SNMP capable host.""" - from pysnmp.hlapi import (getCmd, CommunityData, SnmpEngine, - UdpTransportTarget, ContextData, ObjectType, - ObjectIdentity) + from pysnmp.hlapi import ( + getCmd, CommunityData, SnmpEngine, UdpTransportTarget, ContextData, + ObjectType, ObjectIdentity) errindication, errstatus, errindex, restable = next( getCmd(SnmpEngine(), CommunityData(self._community, mpModel=0), diff --git a/requirements_all.txt b/requirements_all.txt index e78297ca418..05655e3ed07 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -577,7 +577,7 @@ pysma==0.1.3 # homeassistant.components.device_tracker.snmp # homeassistant.components.sensor.snmp -pysnmp==4.3.4 +pysnmp==4.3.5 # homeassistant.components.media_player.clementine python-clementine-remote==1.0.1 From 78b5eb7aac10adb3b0083498afe240d299923f64 Mon Sep 17 00:00:00 2001 From: David Straub Date: Sun, 26 Mar 2017 19:06:40 +0200 Subject: [PATCH 025/116] Platform for Munich public transport departure times (#6704) * Add MVGLive (Munich public transport real-time departure) sensor platform * Move update on startup to add_devices; rewrite dictionary filtering * Fix lint error * Updated requirement to PyMVGLive 1.1.3 (PyPI version) * Refactor and clean up MVGLiveData.update method * Shorten line --- .coveragerc | 1 + homeassistant/components/sensor/mvglive.py | 159 +++++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 163 insertions(+) create mode 100644 homeassistant/components/sensor/mvglive.py diff --git a/.coveragerc b/.coveragerc index 91cb5ef6404..fac7edfa42b 100644 --- a/.coveragerc +++ b/.coveragerc @@ -360,6 +360,7 @@ omit = homeassistant/components/sensor/miflora.py homeassistant/components/sensor/modem_callerid.py homeassistant/components/sensor/mqtt_room.py + homeassistant/components/sensor/mvglive.py homeassistant/components/sensor/netdata.py homeassistant/components/sensor/neurio_energy.py homeassistant/components/sensor/nut.py diff --git a/homeassistant/components/sensor/mvglive.py b/homeassistant/components/sensor/mvglive.py new file mode 100644 index 00000000000..734744378ba --- /dev/null +++ b/homeassistant/components/sensor/mvglive.py @@ -0,0 +1,159 @@ +""" +Support for real-time departure information for public transport in Munich. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.mvglive/ +""" + +import logging +from datetime import timedelta + +import voluptuous as vol + +from homeassistant.util import Throttle +from homeassistant.helpers.entity import Entity +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import STATE_UNKNOWN +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) +# A typo in the file name of the PyPI version prevents installation from PyPI +REQUIREMENTS = ["PyMVGLive==1.1.3"] +ICON = 'mdi:bus' + +# Return cached results if last scan was less then this time ago. +MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=15) + +CONF_STATION = 'station' +CONF_DEST = 'destination' +CONF_LINE = 'line' +CONF_OFFSET = 'offset' +CONF_UBAHN = 'ubahn' +CONF_TRAM = 'tram' +CONF_BUS = 'bus' +CONF_SBAHN = 'sbahn' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_STATION): cv.string, + vol.Optional(CONF_DEST, default=None): cv.string, + vol.Optional(CONF_LINE, default=None): cv.string, + vol.Optional(CONF_OFFSET, default=0): cv.positive_int, + vol.Optional(CONF_UBAHN, default=True): cv.boolean, + vol.Optional(CONF_TRAM, default=True): cv.boolean, + vol.Optional(CONF_BUS, default=True): cv.boolean, + vol.Optional(CONF_SBAHN, default=True): cv.boolean, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the MVG Live Sensor.""" + station = config.get(CONF_STATION) + destination = config.get(CONF_DEST) + line = config.get(CONF_LINE) + offset = config.get(CONF_OFFSET) + ubahn = config.get(CONF_UBAHN) + tram = config.get(CONF_TRAM) + bus = config.get(CONF_BUS) + sbahn = config.get(CONF_SBAHN) + + add_devices([MVGLiveSensor(station, destination, line, + offset, ubahn, tram, bus, sbahn)], True) + + +# pylint: disable=too-few-public-methods +class MVGLiveSensor(Entity): + """Implementation of an MVG Live sensor.""" + + def __init__(self, station, destination, line, + offset, ubahn, tram, bus, sbahn): + """Initialize the sensor.""" + self._station = station + self._destination = destination + self._line = line + self.data = MVGLiveData(station, destination, line, + offset, ubahn, tram, bus, sbahn) + self._state = STATE_UNKNOWN + + @property + def name(self): + """Return the name of the sensor.""" + # e.g. + # 'Hauptbahnhof (S1)' + # 'Hauptbahnhof-Marienplatz' + # 'Hauptbahnhof-Marienplatz (S1)' + namestr = self._station + if self._destination: + namestr = namestr + '-' + self._destination + if self._line: + namestr = namestr + ' (' + self._line + ')' + return namestr + + @property + def icon(self): + """Return the icon for the frontend.""" + return ICON + + @property + def state(self): + """Return the departure time of the next train.""" + return self._state + + @property + def state_attributes(self): + """Return the state attributes.""" + return self.data.nextdeparture + + def update(self): + """Get the latest data and update the state.""" + self.data.update() + if not self.data.nextdeparture: + self._state = '-' + else: + self._state = self.data.nextdeparture.get('time', '-') + + +class MVGLiveData(object): + """Pull data from the mvg-live.de web page.""" + + def __init__(self, station, destination, line, + offset, ubahn, tram, bus, sbahn): + """Initialize the sensor.""" + import MVGLive + self._station = station + self._destination = destination + self._line = line + self._offset = offset + self._ubahn = ubahn + self._tram = tram + self._bus = bus + self._sbahn = sbahn + self.mvg = MVGLive.MVGLive() + self.nextdeparture = {} + + @Throttle(MIN_TIME_BETWEEN_UPDATES) + def update(self): + """Update the connection data.""" + try: + _departures = self.mvg.getlivedata(station=self._station, + ubahn=self._ubahn, + tram=self._tram, + bus=self._bus, + sbahn=self._sbahn) + except ValueError: + self.nextdeparture = {} + _LOGGER.warning("Returned data not understood.") + return + for _departure in _departures: + # find the first departure meeting the criteria + if not _departure['destination'].startswith(self._destination): + continue + elif _departure['time'] < self._offset: + continue + # now select the relevant data + _nextdep = {} + for k in ['destination', 'linename', 'time', 'direction', + 'product']: + _nextdep[k] = _departure.get(k, '') + _nextdep['time'] = int(_nextdep['time']) + self.nextdeparture = _nextdep + break diff --git a/requirements_all.txt b/requirements_all.txt index 05655e3ed07..475993acced 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -21,6 +21,9 @@ PyISY==1.0.7 # homeassistant.components.notify.html5 PyJWT==1.4.2 +# homeassistant.components.sensor.mvglive +PyMVGLive==1.1.3 + # homeassistant.components.arduino PyMata==2.13 From 84287872bbe51c9876d63a9e6413580e8d755ea2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 26 Mar 2017 21:13:38 +0200 Subject: [PATCH 026/116] Use string formatting and remove already global disabled pylint issue (#6801) --- homeassistant/components/sensor/mvglive.py | 42 ++++++++++------------ 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/homeassistant/components/sensor/mvglive.py b/homeassistant/components/sensor/mvglive.py index 734744378ba..7043da53222 100644 --- a/homeassistant/components/sensor/mvglive.py +++ b/homeassistant/components/sensor/mvglive.py @@ -4,34 +4,33 @@ Support for real-time departure information for public transport in Munich. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.mvglive/ """ - import logging from datetime import timedelta import voluptuous as vol +import homeassistant.helpers.config_validation as cv from homeassistant.util import Throttle from homeassistant.helpers.entity import Entity from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import STATE_UNKNOWN -import homeassistant.helpers.config_validation as cv + +REQUIREMENTS = ['PyMVGLive==1.1.3'] _LOGGER = logging.getLogger(__name__) -# A typo in the file name of the PyPI version prevents installation from PyPI -REQUIREMENTS = ["PyMVGLive==1.1.3"] -ICON = 'mdi:bus' -# Return cached results if last scan was less then this time ago. -MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=15) - -CONF_STATION = 'station' +CONF_BUS = 'bus' CONF_DEST = 'destination' CONF_LINE = 'line' CONF_OFFSET = 'offset' -CONF_UBAHN = 'ubahn' -CONF_TRAM = 'tram' -CONF_BUS = 'bus' CONF_SBAHN = 'sbahn' +CONF_STATION = 'station' +CONF_TRAM = 'tram' +CONF_UBAHN = 'ubahn' + +ICON = 'mdi:bus' + +MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=15) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_STATION): cv.string, @@ -46,7 +45,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the MVG Live Sensor.""" + """Set up the MVG Live Sensor.""" station = config.get(CONF_STATION) destination = config.get(CONF_DEST) line = config.get(CONF_LINE) @@ -56,11 +55,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): bus = config.get(CONF_BUS) sbahn = config.get(CONF_SBAHN) - add_devices([MVGLiveSensor(station, destination, line, - offset, ubahn, tram, bus, sbahn)], True) + add_devices([MVGLiveSensor( + station, destination, line, offset, ubahn, tram, bus, sbahn)], True) -# pylint: disable=too-few-public-methods class MVGLiveSensor(Entity): """Implementation of an MVG Live sensor.""" @@ -83,9 +81,9 @@ class MVGLiveSensor(Entity): # 'Hauptbahnhof-Marienplatz (S1)' namestr = self._station if self._destination: - namestr = namestr + '-' + self._destination + namestr = '{}-{}'.format(namestr, self._destination) if self._line: - namestr = namestr + ' (' + self._line + ')' + namestr = '{} ({})'.format(namestr, self._line) return namestr @property @@ -134,11 +132,9 @@ class MVGLiveData(object): def update(self): """Update the connection data.""" try: - _departures = self.mvg.getlivedata(station=self._station, - ubahn=self._ubahn, - tram=self._tram, - bus=self._bus, - sbahn=self._sbahn) + _departures = self.mvg.getlivedata( + station=self._station, ubahn=self._ubahn, tram=self._tram, + bus=self._bus, sbahn=self._sbahn) except ValueError: self.nextdeparture = {} _LOGGER.warning("Returned data not understood.") From f4f72e420ad696a26a194749740a829ab69de656 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 27 Mar 2017 10:35:27 +0200 Subject: [PATCH 027/116] Fix typo and update name (#6809) --- homeassistant/components/notify/pushbullet.py | 38 +++++++++---------- homeassistant/components/notify/smtp.py | 15 ++++---- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/notify/pushbullet.py b/homeassistant/components/notify/pushbullet.py index 4f50146ac61..fb6543afcb4 100644 --- a/homeassistant/components/notify/pushbullet.py +++ b/homeassistant/components/notify/pushbullet.py @@ -1,5 +1,5 @@ """ -PushBullet platform for notify component. +Pushbullet platform for notify component. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/notify.pushbullet/ @@ -26,7 +26,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ # pylint: disable=unused-argument def get_service(hass, config, discovery_info=None): - """Get the PushBullet notification service.""" + """Get the Pushbullet notification service.""" from pushbullet import PushBullet from pushbullet import InvalidKeyError @@ -53,9 +53,9 @@ class PushBulletNotificationService(BaseNotificationService): def refresh(self): """Refresh devices, contacts, etc. - pbtargets stores all targets available from this pushbullet instance - into a dict. These are PB objects!. It sacrifices a bit of memory - for faster processing at send_message. + pbtargets stores all targets available from this Pushbullet instance + into a dict. These are Pushbullet objects!. It sacrifices a bit of + memory for faster processing at send_message. As of sept 2015, contacts were replaced by chats. This is not implemented in the module yet. @@ -73,7 +73,7 @@ class PushBulletNotificationService(BaseNotificationService): """Send a message to a specified target. If no target specified, a 'normal' push will be sent to all devices - linked to the PB account. + linked to the Pushbullet account. Email is special, these are assumed to always exist. We use a special call which doesn't require a push object. """ @@ -86,37 +86,37 @@ class PushBulletNotificationService(BaseNotificationService): refreshed = False if not targets: - # Backward compatebility, notify all devices in own account + # Backward compatibility, notify all devices in own account if url: self.pushbullet.push_link(title, url, body=message) else: self.pushbullet.push_note(title, message) - _LOGGER.info('Sent notification to self') + _LOGGER.info("Sent notification to self") return - # Main loop, Process all targets specified + # Main loop, process all targets specified for target in targets: try: ttype, tname = target.split('/', 1) except ValueError: - _LOGGER.error('Invalid target syntax: %s', target) + _LOGGER.error("Invalid target syntax: %s", target) continue # Target is email, send directly, don't use a target object # This also seems works to send to all devices in own account if ttype == 'email': if url: - self.pushbullet.push_link(title, url, - body=message, email=tname) + self.pushbullet.push_link( + title, url, body=message, email=tname) else: self.pushbullet.push_note(title, message, email=tname) - _LOGGER.info('Sent notification to email %s', tname) + _LOGGER.info("Sent notification to email %s", tname) continue # Refresh if name not found. While awaiting periodic refresh # solution in component, poor mans refresh ;) if ttype not in self.pbtargets: - _LOGGER.error('Invalid target syntax: %s', target) + _LOGGER.error("Invalid target syntax: %s", target) continue tname = tname.lower() @@ -129,14 +129,14 @@ class PushBulletNotificationService(BaseNotificationService): # name. Dict pbtargets has all *actual* targets. try: if url: - self.pbtargets[ttype][tname].push_link(title, url, - body=message) + self.pbtargets[ttype][tname].push_link( + title, url, body=message) else: self.pbtargets[ttype][tname].push_note(title, message) - _LOGGER.info('Sent notification to %s/%s', ttype, tname) + _LOGGER.info("Sent notification to %s/%s", ttype, tname) except KeyError: - _LOGGER.error('No such target: %s/%s', ttype, tname) + _LOGGER.error("No such target: %s/%s", ttype, tname) continue except self.pushbullet.errors.PushError: - _LOGGER.error('Notify failed to: %s/%s', ttype, tname) + _LOGGER.error("Notify failed to: %s/%s", ttype, tname) continue diff --git a/homeassistant/components/notify/smtp.py b/homeassistant/components/notify/smtp.py index 460659b3214..fbfa9e7a970 100644 --- a/homeassistant/components/notify/smtp.py +++ b/homeassistant/components/notify/smtp.py @@ -156,8 +156,8 @@ class MailNotificationService(BaseNotificationService): msg.as_string()) break except smtplib.SMTPException: - _LOGGER.warning('SMTPException sending mail: ' - 'retrying connection') + _LOGGER.warning( + "SMTPException sending mail: retrying connection") mail.quit() mail = self.connect() @@ -166,13 +166,13 @@ class MailNotificationService(BaseNotificationService): def _build_text_msg(message): """Build plaintext email.""" - _LOGGER.debug('Building plain text email') + _LOGGER.debug("Building plain text email") return MIMEText(message) def _build_multipart_msg(message, images): """Build Multipart message with in-line images.""" - _LOGGER.debug('Building multipart email with embedded attachment(s)') + _LOGGER.debug("Building multipart email with embedded attachment(s)") msg = MIMEMultipart('related') msg_alt = MIMEMultipart('alternative') msg.attach(msg_alt) @@ -191,16 +191,15 @@ def _build_multipart_msg(message, images): msg.attach(attachment) attachment.add_header('Content-ID', '<{}>'.format(cid)) except TypeError: - _LOGGER.warning('Attachment %s has an unkown MIME type.' - ' Falling back to file', atch_name) + _LOGGER.warning("Attachment %s has an unkown MIME type." + " Falling back to file", atch_name) attachment = MIMEApplication(file_bytes, Name=atch_name) attachment['Content-Disposition'] = ('attachment; ' 'filename="%s"' % atch_name) msg.attach(attachment) except FileNotFoundError: - _LOGGER.warning('Attachment %s not found. Skipping', - atch_name) + _LOGGER.warning("Attachment %s not found. Skipping", atch_name) body_html = MIMEText(''.join(body_text), 'html') msg_alt.attach(body_html) From be04ef7be1e6a1936b1526caba0d6a727e7827b8 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 27 Mar 2017 10:35:40 +0200 Subject: [PATCH 028/116] Upgrade matrix-client to 0.0.6 (#6808) --- homeassistant/components/notify/matrix.py | 35 ++++++++--------------- requirements_all.txt | 2 +- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/notify/matrix.py b/homeassistant/components/notify/matrix.py index b36721e8f80..15da3f053d8 100644 --- a/homeassistant/components/notify/matrix.py +++ b/homeassistant/components/notify/matrix.py @@ -15,7 +15,9 @@ from homeassistant.components.notify import ( ATTR_TARGET, PLATFORM_SCHEMA, BaseNotificationService) from homeassistant.const import CONF_USERNAME, CONF_PASSWORD, CONF_VERIFY_SSL -REQUIREMENTS = ['matrix-client==0.0.5'] +REQUIREMENTS = ['matrix-client==0.0.6'] + +_LOGGER = logging.getLogger(__name__) SESSION_FILE = 'matrix.conf' AUTH_TOKENS = dict() @@ -31,8 +33,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_DEFAULT_ROOM): cv.string, }) -_LOGGER = logging.getLogger(__name__) - def get_service(hass, config, discovery_info=None): """Get the Matrix notification service.""" @@ -49,7 +49,7 @@ def get_service(hass, config, discovery_info=None): class MatrixNotificationService(BaseNotificationService): - """Wrapper for the MatrixNotificationClient.""" + """Wrapper for the Matrix Notification Client.""" def __init__(self, homeserver, default_room, verify_ssl, username, password): @@ -107,32 +107,23 @@ def send_message(message, homeserver, target_rooms, verify_tls, valid_cert_check=verify_tls ) except MatrixRequestError as ex: - _LOGGER.info( - 'login_by_token: (%d) %s', ex.code, ex.content - ) + _LOGGER.info("login_by_token: (%d) %s", ex.code, ex.content) def login_by_password(): """Login using password authentication.""" try: _client = MatrixClient( - base_url=homeserver, - valid_cert_check=verify_tls - ) + base_url=homeserver, valid_cert_check=verify_tls) _client.login_with_password(username, password) store_token(mx_id, _client.token) return _client except MatrixRequestError as ex: - _LOGGER.error( - 'login_by_password: (%d) %s', ex.code, ex.content - ) + _LOGGER.error("login_by_password: (%d) %s", ex.code, ex.content) - # this is as close as we can get to the mx_id, since there is no + # This is as close as we can get to the mx_id, since there is no # homeserver discovery protocol we have to fall back to the homeserver url # instead of the actual domain it serves. - mx_id = "{user}@{homeserver}".format( - user=username, - homeserver=homeserver - ) + mx_id = "{user}@{homeserver}".format(user=username, homeserver=homeserver) if mx_id in AUTH_TOKENS: client = login_by_token() @@ -140,14 +131,12 @@ def send_message(message, homeserver, target_rooms, verify_tls, client = login_by_password() if not client: _LOGGER.error( - 'login failed, both token and username/password ' - 'invalid' - ) + "Login failed, both token and username/password invalid") return else: client = login_by_password() if not client: - _LOGGER.error('login failed, username/password invalid') + _LOGGER.error("Login failed, username/password invalid") return rooms = client.get_rooms() @@ -161,6 +150,6 @@ def send_message(message, homeserver, target_rooms, verify_tls, _LOGGER.debug(room.send_text(message)) except MatrixRequestError as ex: _LOGGER.error( - 'Unable to deliver message to room \'%s\': (%d): %s', + "Unable to deliver message to room '%s': (%d): %s", target_room, ex.code, ex.content ) diff --git a/requirements_all.txt b/requirements_all.txt index 475993acced..8e093156b10 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -360,7 +360,7 @@ liveboxplaytv==1.4.9 lyft_rides==0.1.0b0 # homeassistant.components.notify.matrix -matrix-client==0.0.5 +matrix-client==0.0.6 # homeassistant.components.maxcube maxcube-api==0.1.0 From a70af62e60705b30876e360659b72c4ca7a6b0aa Mon Sep 17 00:00:00 2001 From: tantecky Date: Mon, 27 Mar 2017 12:22:59 +0200 Subject: [PATCH 029/116] Make get_snmp_data more robust (#6798) --- homeassistant/components/device_tracker/snmp.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/device_tracker/snmp.py b/homeassistant/components/device_tracker/snmp.py index cbe70075665..1449ae6dbef 100644 --- a/homeassistant/components/device_tracker/snmp.py +++ b/homeassistant/components/device_tracker/snmp.py @@ -125,7 +125,10 @@ class SnmpScanner(DeviceScanner): for resrow in restable: for _, val in resrow: - mac = binascii.hexlify(val.asOctets()).decode('utf-8') + try: + mac = binascii.hexlify(val.asOctets()).decode('utf-8') + except AttributeError: + continue _LOGGER.debug("Found MAC %s", mac) mac = ':'.join([mac[i:i+2] for i in range(0, len(mac), 2)]) devices.append({'mac': mac}) From f242ad26ca5bd7c648d33632314319e5288847a8 Mon Sep 17 00:00:00 2001 From: John Mihalic Date: Mon, 27 Mar 2017 06:41:57 -0400 Subject: [PATCH 030/116] Add NVR support to Hikvision Binary Sensors (#6807) * Add NVR support to hikvision * Only append channel for nvr devices * Descriptor cleanup * Update requirements --- .../components/binary_sensor/hikvision.py | 61 +++++++++++++------ requirements_all.txt | 2 +- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/binary_sensor/hikvision.py b/homeassistant/components/binary_sensor/hikvision.py index 135d9a1e028..ac1b2657448 100644 --- a/homeassistant/components/binary_sensor/hikvision.py +++ b/homeassistant/components/binary_sensor/hikvision.py @@ -18,7 +18,7 @@ from homeassistant.const import ( CONF_SSL, EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_START, ATTR_LAST_TRIP_TIME, CONF_CUSTOMIZE) -REQUIREMENTS = ['pyhik==0.1.0'] +REQUIREMENTS = ['pyhik==0.1.1'] _LOGGER = logging.getLogger(__name__) CONF_IGNORED = 'ignored' @@ -33,7 +33,6 @@ ATTR_DELAY = 'delay' DEVICE_CLASS_MAP = { 'Motion': 'motion', 'Line Crossing': 'motion', - 'IO Trigger': None, 'Field Detection': 'motion', 'Video Loss': None, 'Tamper Detection': 'motion', @@ -47,6 +46,7 @@ DEVICE_CLASS_MAP = { 'Bad Video': None, 'PIR Alarm': 'motion', 'Face Detection': 'motion', + 'Scene Change Detection': 'motion', } CUSTOMIZE_SCHEMA = vol.Schema({ @@ -91,24 +91,30 @@ def setup_platform(hass, config, add_entities, discovery_info=None): entities = [] - for sensor in data.sensors: - # Build sensor name, then parse customize config. - sensor_name = sensor.replace(' ', '_') + for sensor, channel_list in data.sensors.items(): + for channel in channel_list: + # Build sensor name, then parse customize config. + if data.type == 'NVR': + sensor_name = '{}_{}'.format( + sensor.replace(' ', '_'), channel[1]) + else: + sensor_name = sensor.replace(' ', '_') - custom = customize.get(sensor_name.lower(), {}) - ignore = custom.get(CONF_IGNORED) - delay = custom.get(CONF_DELAY) + custom = customize.get(sensor_name.lower(), {}) + ignore = custom.get(CONF_IGNORED) + delay = custom.get(CONF_DELAY) - _LOGGER.debug('Entity: %s - %s, Options - Ignore: %s, Delay: %s', - data.name, sensor_name, ignore, delay) - if not ignore: - entities.append(HikvisionBinarySensor(hass, sensor, data, delay)) + _LOGGER.debug('Entity: %s - %s, Options - Ignore: %s, Delay: %s', + data.name, sensor_name, ignore, delay) + if not ignore: + entities.append(HikvisionBinarySensor( + hass, sensor, channel[1], data, delay)) add_entities(entities) class HikvisionData(object): - """Hikvision camera event stream object.""" + """Hikvision device event stream object.""" def __init__(self, hass, url, port, name, username, password): """Initialize the data oject.""" @@ -144,25 +150,40 @@ class HikvisionData(object): @property def cam_id(self): - """Return camera id.""" + """Return device id.""" return self.camdata.get_id @property def name(self): - """Return camera name.""" + """Return device name.""" return self._name + @property + def type(self): + """Return device type.""" + return self.camdata.get_type + + def get_attributes(self, sensor, channel): + """Return attribute list for sensor/channel.""" + return self.camdata.fetch_attributes(sensor, channel) + class HikvisionBinarySensor(BinarySensorDevice): """Representation of a Hikvision binary sensor.""" - def __init__(self, hass, sensor, cam, delay): + def __init__(self, hass, sensor, channel, cam, delay): """Initialize the binary_sensor.""" self._hass = hass self._cam = cam - self._name = self._cam.name + ' ' + sensor - self._id = self._cam.cam_id + '.' + sensor self._sensor = sensor + self._channel = channel + + if self._cam.type == 'NVR': + self._name = '{} {} {}'.format(self._cam.name, sensor, channel) + else: + self._name = '{} {}'.format(self._cam.name, sensor) + + self._id = '{}.{}.{}'.format(self._cam.cam_id, sensor, channel) if delay is None: self._delay = 0 @@ -176,11 +197,11 @@ class HikvisionBinarySensor(BinarySensorDevice): def _sensor_state(self): """Extract sensor state.""" - return self._cam.sensors[self._sensor][0] + return self._cam.get_attributes(self._sensor, self._channel)[0] def _sensor_last_update(self): """Extract sensor last update time.""" - return self._cam.sensors[self._sensor][3] + return self._cam.get_attributes(self._sensor, self._channel)[3] @property def name(self): diff --git a/requirements_all.txt b/requirements_all.txt index 8e093156b10..d449f7e2d11 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -517,7 +517,7 @@ pygatt==3.0.0 pyharmony==1.0.12 # homeassistant.components.binary_sensor.hikvision -pyhik==0.1.0 +pyhik==0.1.1 # homeassistant.components.homematic pyhomematic==0.1.24 From c53de19246ea10597a1a22c0f809546b2b5b2bc7 Mon Sep 17 00:00:00 2001 From: Greg Dowling Date: Mon, 27 Mar 2017 11:43:43 +0100 Subject: [PATCH 031/116] Update Insight parameters using the subscription data. (#6782) * Update Insight parameters using the subscription dta. * Minor refactor. * Tidy. --- homeassistant/components/switch/wemo.py | 15 +++++++-------- homeassistant/components/wemo.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/switch/wemo.py b/homeassistant/components/switch/wemo.py index 97c0fb3d386..e78190bf444 100644 --- a/homeassistant/components/switch/wemo.py +++ b/homeassistant/components/switch/wemo.py @@ -61,16 +61,14 @@ class WemoSwitch(SwitchDevice): wemo.SUBSCRIPTION_REGISTRY.register(self.wemo) wemo.SUBSCRIPTION_REGISTRY.on(self.wemo, None, self._update_callback) - def _update_callback(self, _device, _params): + def _update_callback(self, _device, _type, _params): """Called by the Wemo device callback to update state.""" _LOGGER.info( 'Subscription update for %s', _device) - if self._model_name == 'CoffeeMaker': - self.wemo.subscription_callback(_params) - self._update(force_update=False) - else: - self.update() + updated = self.wemo.subscription_update(_type, _params) + self._update(force_update=(not updated)) + if not hasattr(self, 'hass'): return self.schedule_update_ha_state() @@ -219,5 +217,6 @@ class WemoSwitch(SwitchDevice): self.maker_params = self.wemo.maker_params elif self._model_name == 'CoffeeMaker': self.coffeemaker_mode = self.wemo.mode - except AttributeError: - _LOGGER.warning('Could not update status for %s', self.name) + except AttributeError as err: + _LOGGER.warning('Could not update status for %s (%s)', + self.name, err) diff --git a/homeassistant/components/wemo.py b/homeassistant/components/wemo.py index c121c58470b..7cec1707211 100644 --- a/homeassistant/components/wemo.py +++ b/homeassistant/components/wemo.py @@ -14,7 +14,7 @@ from homeassistant.helpers import config_validation as cv from homeassistant.const import EVENT_HOMEASSISTANT_STOP -REQUIREMENTS = ['pywemo==0.4.13'] +REQUIREMENTS = ['pywemo==0.4.15'] DOMAIN = 'wemo' diff --git a/requirements_all.txt b/requirements_all.txt index d449f7e2d11..bb0993338f3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -647,7 +647,7 @@ pyvera==0.2.24 pywebpush==0.6.1 # homeassistant.components.wemo -pywemo==0.4.13 +pywemo==0.4.15 # homeassistant.components.zabbix pyzabbix==0.7.4 From b8c1bc9542130ee2133ab555a8537d1fe9c88b7e Mon Sep 17 00:00:00 2001 From: goto100 Date: Mon, 27 Mar 2017 20:02:43 +0800 Subject: [PATCH 032/116] fix WOL in docker/jail (#6810) * fix WOL in docker/jail add ip_address parameter to send_magic_packet if host specific. in docker/jail, WOL doesn't works due to subnet broadcast issues. * Update wake_on_lan.py lint --- homeassistant/components/switch/wake_on_lan.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/switch/wake_on_lan.py b/homeassistant/components/switch/wake_on_lan.py index ba3439dc951..c86a4674bb6 100644 --- a/homeassistant/components/switch/wake_on_lan.py +++ b/homeassistant/components/switch/wake_on_lan.py @@ -75,7 +75,11 @@ class WOLSwitch(SwitchDevice): def turn_on(self): """Turn the device on.""" - self._wol.send_magic_packet(self._mac_address) + if self._host: + self._wol.send_magic_packet(self._mac_address, + ip_address=self._host) + else: + self._wol.send_magic_packet(self._mac_address) def turn_off(self): """Turn the device off if an off action is present.""" From d027df5a897b8a60415e4ff115f9dfbf386c3832 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 27 Mar 2017 22:11:15 +0200 Subject: [PATCH 033/116] Allow to monitor Windows hosts (#6803) --- homeassistant/components/sensor/glances.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/glances.py b/homeassistant/components/sensor/glances.py index 0896e99989f..699781d323b 100644 --- a/homeassistant/components/sensor/glances.py +++ b/homeassistant/components/sensor/glances.py @@ -133,7 +133,11 @@ class GlancesSensor(Entity): elif self.type == 'swap_free': return round(value['memswap']['free'] / 1024**3, 1) elif self.type == 'processor_load': - return value['load']['min15'] + # Windows systems don't provide load details + try: + return value['load']['min15'] + except KeyError: + return value['cpu']['total'] elif self.type == 'process_running': return value['processcount']['running'] elif self.type == 'process_total': From 5c80da6a8f475f2abc2608e4a7f0bc6df62a1588 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Tue, 28 Mar 2017 00:04:28 +0200 Subject: [PATCH 034/116] lights/hue: use device class for on/off devices like the osram lightify plug (#6817) * hue: remove duplicate SUPPORT_FLASH flag * hue: use correct device class for the Osram Lightify Plug --- homeassistant/components/light/hue.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/light/hue.py b/homeassistant/components/light/hue.py index 1c0970f154c..31ec88f3c97 100644 --- a/homeassistant/components/light/hue.py +++ b/homeassistant/components/light/hue.py @@ -47,7 +47,7 @@ MIN_TIME_BETWEEN_FORCED_SCANS = timedelta(milliseconds=100) PHUE_CONFIG_FILE = 'phue.conf' -SUPPORT_HUE_ON_OFF = (SUPPORT_FLASH | SUPPORT_TRANSITION | SUPPORT_FLASH) +SUPPORT_HUE_ON_OFF = (SUPPORT_FLASH | SUPPORT_TRANSITION) SUPPORT_HUE_DIMMABLE = (SUPPORT_HUE_ON_OFF | SUPPORT_BRIGHTNESS) SUPPORT_HUE_COLOR_TEMP = (SUPPORT_HUE_DIMMABLE | SUPPORT_COLOR_TEMP) SUPPORT_HUE_COLOR = (SUPPORT_HUE_DIMMABLE | SUPPORT_EFFECT | @@ -58,6 +58,7 @@ SUPPORT_HUE = { 'Extended color light': SUPPORT_HUE_EXTENDED, 'Color light': SUPPORT_HUE_COLOR, 'Dimmable light': SUPPORT_HUE_DIMMABLE, + 'On/Off plug-in unit': SUPPORT_HUE_ON_OFF, 'Color temperature light': SUPPORT_HUE_COLOR_TEMP } From 6dba05c79f189aaaed88b18c22cf27b1ff277068 Mon Sep 17 00:00:00 2001 From: Lewis Juggins Date: Tue, 28 Mar 2017 16:24:33 +0100 Subject: [PATCH 035/116] [switch.wemo] Fix mW to kW conversion. (#6826) * Fix mW to kW conversion. * Line length. --- homeassistant/components/switch/wemo.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/switch/wemo.py b/homeassistant/components/switch/wemo.py index e78190bf444..7518a1958cf 100644 --- a/homeassistant/components/switch/wemo.py +++ b/homeassistant/components/switch/wemo.py @@ -148,7 +148,8 @@ class WemoSwitch(SwitchDevice): def today_energy_kwh(self): """Today total energy usage in kWh.""" if self.insight_params: - return convert(self.insight_params['todaymw'], float, 0.0) / 1000.0 + miliwatts = convert(self.insight_params['todaymw'], float, 0.0) + return miliwatts / 1000000.0 @property def detail_state(self): From 429367409c0538e936322e5249a4a26764b06415 Mon Sep 17 00:00:00 2001 From: Teemu R Date: Tue, 28 Mar 2017 17:26:43 +0200 Subject: [PATCH 036/116] yeelight: adjust supported features on update() (#6799) * yeelight: adjust supported features on update() Earlier we checked for the type only during the initialization, but this won't work when the bulb is disconnected during the init, causing failures to adjust rgb&color temperature even if those should be supported. fixes #6692 * Use reassign instead of OR for updating the supported features --- homeassistant/components/light/yeelight.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/light/yeelight.py b/homeassistant/components/light/yeelight.py index 7e0bd0e253e..65b32786ce7 100644 --- a/homeassistant/components/light/yeelight.py +++ b/homeassistant/components/light/yeelight.py @@ -44,13 +44,14 @@ DEVICE_SCHEMA = vol.Schema({ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( {vol.Optional(CONF_DEVICES, default={}): {cv.string: DEVICE_SCHEMA}, }) -SUPPORT_YEELIGHT_RGB = (SUPPORT_RGB_COLOR | - SUPPORT_COLOR_TEMP) - SUPPORT_YEELIGHT = (SUPPORT_BRIGHTNESS | SUPPORT_TRANSITION | SUPPORT_FLASH) +SUPPORT_YEELIGHT_RGB = (SUPPORT_YEELIGHT | + SUPPORT_RGB_COLOR | + SUPPORT_COLOR_TEMP) + def _cmd(func): """A wrapper to catch exceptions from the bulb.""" @@ -179,9 +180,6 @@ class YeelightLight(Light): self._bulb_device = yeelight.Bulb(self._ipaddr) self._bulb_device.get_properties() # force init for type - btype = self._bulb_device.bulb_type - if btype == yeelight.BulbType.Color: - self._supported_features |= SUPPORT_YEELIGHT_RGB self._available = True except yeelight.BulbException as ex: self._available = False @@ -203,6 +201,9 @@ class YeelightLight(Light): try: self._bulb.get_properties() + if self._bulb_device.bulb_type == yeelight.BulbType.Color: + self._supported_features = SUPPORT_YEELIGHT_RGB + self._is_on = self._properties.get("power") == "on" bright = self._properties.get("bright", None) From b5336ed04ee863187848d2937d06bebc706b0ea0 Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Tue, 28 Mar 2017 14:13:45 -0400 Subject: [PATCH 037/116] Updated pubnubsub-handler version (#6829) --- homeassistant/components/wink.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/wink.py b/homeassistant/components/wink.py index 92cd7baa65e..8cf32f64d61 100644 --- a/homeassistant/components/wink.py +++ b/homeassistant/components/wink.py @@ -15,7 +15,7 @@ from homeassistant.const import ( from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['python-wink==1.2.3', 'pubnubsub-handler==1.0.1'] +REQUIREMENTS = ['python-wink==1.2.3', 'pubnubsub-handler==1.0.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index bb0993338f3..ea986259ea8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -441,7 +441,7 @@ proliphix==0.4.1 psutil==5.2.1 # homeassistant.components.wink -pubnubsub-handler==1.0.1 +pubnubsub-handler==1.0.2 # homeassistant.components.notify.pushbullet pushbullet.py==0.10.0 From fb8323f48d576341310ba878d281d00cd1e57043 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 28 Mar 2017 23:01:29 +0300 Subject: [PATCH 038/116] Remove zwave cover invert workaround. Use config instead. (#6832) --- homeassistant/components/cover/zwave.py | 11 ++++++----- homeassistant/components/zwave/__init__.py | 4 ++++ homeassistant/components/zwave/workaround.py | 3 --- tests/components/cover/test_zwave.py | 7 +++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/cover/zwave.py b/homeassistant/components/cover/zwave.py index 129dbd32ffe..3f26da183b5 100644 --- a/homeassistant/components/cover/zwave.py +++ b/homeassistant/components/cover/zwave.py @@ -20,12 +20,13 @@ _LOGGER = logging.getLogger(__name__) SUPPORT_GARAGE = SUPPORT_OPEN | SUPPORT_CLOSE -def get_device(values, **kwargs): +def get_device(values, node_config, **kwargs): """Create zwave entity device.""" + invert_buttons = node_config.get(zwave.CONF_INVERT_OPENCLOSE_BUTTONS) if (values.primary.command_class == zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and values.primary.index == 0): - return ZwaveRollershutter(values) + return ZwaveRollershutter(values, invert_buttons) elif (values.primary.command_class in [ zwave.const.COMMAND_CLASS_SWITCH_BINARY, zwave.const.COMMAND_CLASS_BARRIER_OPERATOR]): @@ -36,13 +37,14 @@ def get_device(values, **kwargs): class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): """Representation of an Zwave roller shutter.""" - def __init__(self, values): + def __init__(self, values, invert_buttons): """Initialize the zwave rollershutter.""" ZWaveDeviceEntity.__init__(self, values, DOMAIN) # pylint: disable=no-member self._open_id = None self._close_id = None self._current_position = None + self._invert_buttons = invert_buttons self._workaround = workaround.get_device_mapping(values.primary) if self._workaround: @@ -56,10 +58,9 @@ class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): if self.values.open and self.values.close and \ self._open_id is None and self._close_id is None: - if self._workaround == workaround.WORKAROUND_REVERSE_OPEN_CLOSE: + if self._invert_buttons: self._open_id = self.values.close.value_id self._close_id = self.values.open.value_id - self._workaround = None else: self._open_id = self.values.open.value_id self._close_id = self.values.close.value_id diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 83fa38862c3..4eea502d40a 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -45,6 +45,7 @@ CONF_POLLING_INTERVAL = 'polling_interval' CONF_USB_STICK_PATH = 'usb_path' CONF_CONFIG_PATH = 'config_path' CONF_IGNORED = 'ignored' +CONF_INVERT_OPENCLOSE_BUTTONS = 'invert_openclose_buttons' CONF_REFRESH_VALUE = 'refresh_value' CONF_REFRESH_DELAY = 'delay' CONF_DEVICE_CONFIG = 'device_config' @@ -58,6 +59,7 @@ DEFAULT_CONF_USB_STICK_PATH = '/zwaveusbstick' DEFAULT_POLLING_INTERVAL = 60000 DEFAULT_DEBUG = False DEFAULT_CONF_IGNORED = False +DEFAULT_CONF_INVERT_OPENCLOSE_BUTTONS = False DEFAULT_CONF_REFRESH_VALUE = False DEFAULT_CONF_REFRESH_DELAY = 5 @@ -105,6 +107,8 @@ SET_WAKEUP_SCHEMA = vol.Schema({ DEVICE_CONFIG_SCHEMA_ENTRY = vol.Schema({ vol.Optional(CONF_POLLING_INTENSITY): cv.positive_int, vol.Optional(CONF_IGNORED, default=DEFAULT_CONF_IGNORED): cv.boolean, + vol.Optional(CONF_INVERT_OPENCLOSE_BUTTONS, + default=DEFAULT_CONF_INVERT_OPENCLOSE_BUTTONS): cv.boolean, vol.Optional(CONF_REFRESH_VALUE, default=DEFAULT_CONF_REFRESH_VALUE): cv.boolean, vol.Optional(CONF_REFRESH_DELAY, default=DEFAULT_CONF_REFRESH_DELAY): diff --git a/homeassistant/components/zwave/workaround.py b/homeassistant/components/zwave/workaround.py index 17dbf1437f3..27e98457a2d 100644 --- a/homeassistant/components/zwave/workaround.py +++ b/homeassistant/components/zwave/workaround.py @@ -30,7 +30,6 @@ WENZHOU_SLIM_SENSOR_MOTION_MTII = ( # Workarounds WORKAROUND_NO_OFF_EVENT = 'trigger_no_off_event' WORKAROUND_NO_POSITION = 'workaround_no_position' -WORKAROUND_REVERSE_OPEN_CLOSE = 'reverse_open_close' WORKAROUND_REFRESH_NODE_ON_UPDATE = 'refresh_node_on_update' WORKAROUND_IGNORE = 'workaround_ignore' @@ -43,12 +42,10 @@ DEVICE_MAPPINGS_MTII = { } SOMFY_ZRTSI_CONTROLLER_MT = (SOMFY, SOMFY_ZRTSI) -FIBARO_FGRM222_MT = (FIBARO, FGRM222_SHUTTER2) # List of workarounds by (manufacturer_id, product_type) DEVICE_MAPPINGS_MT = { SOMFY_ZRTSI_CONTROLLER_MT: WORKAROUND_NO_POSITION, - FIBARO_FGRM222_MT: WORKAROUND_REVERSE_OPEN_CLOSE, } diff --git a/tests/components/cover/test_zwave.py b/tests/components/cover/test_zwave.py index 1b4ce015987..425331ff35c 100644 --- a/tests/components/cover/test_zwave.py +++ b/tests/components/cover/test_zwave.py @@ -120,14 +120,17 @@ def test_roller_commands(mock_network, mock_openzwave): @patch('homeassistant.components.zwave.NETWORK') def test_roller_reverse_open_close(mock_network, mock_openzwave): """Test position changed.""" - node = MockNode(manufacturer_id='010f', product_type='0301') + node = MockNode() value = MockValue(data=50, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL) open_value = MockValue(data=False, node=node) close_value = MockValue(data=False, node=node) values = MockEntityValues(primary=value, open=open_value, close=close_value, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device( + node=node, + values=values, + node_config={zwave.zwave.CONF_INVERT_OPENCLOSE_BUTTONS: True}) device.open_cover() assert mock_network.manager.pressButton.called From 63c15e997a665624c1d541244ba63bf1bf44bdea Mon Sep 17 00:00:00 2001 From: Oleksii Serdiuk Date: Wed, 29 Mar 2017 06:58:59 +0200 Subject: [PATCH 039/116] history_stats: Fix schema, as `state` can be arbitrary string (#6753) --- homeassistant/components/sensor/history_stats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/history_stats.py b/homeassistant/components/sensor/history_stats.py index d5a02f8744e..fe073b89fcd 100644 --- a/homeassistant/components/sensor/history_stats.py +++ b/homeassistant/components/sensor/history_stats.py @@ -66,7 +66,7 @@ def exactly_two_period_keys(conf): PLATFORM_SCHEMA = vol.All(PLATFORM_SCHEMA.extend({ vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Required(CONF_STATE): cv.slug, + vol.Required(CONF_STATE): cv.string, vol.Optional(CONF_START, default=None): cv.template, vol.Optional(CONF_END, default=None): cv.template, vol.Optional(CONF_DURATION, default=None): cv.time_period, From e1ed076015b0c8904caf208dbe556485131f963b Mon Sep 17 00:00:00 2001 From: Johan Bloemberg Date: Wed, 29 Mar 2017 07:04:25 +0200 Subject: [PATCH 040/116] Rflink group commands (#5969) * Add support for group commands (allon/alloff). Add 'group_aliasses' config attribute that only respond to group commands. Add nogroup_aliases that only respond to 'on' 'off' commands. Allow settings device id group behaviour. * Fix linting. * Fix lint. --- homeassistant/components/light/rflink.py | 32 ++++- homeassistant/components/rflink.py | 35 ++++-- requirements_all.txt | 2 +- tests/components/light/test_rflink.py | 148 +++++++++++++++++++++++ 4 files changed, 200 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/light/rflink.py b/homeassistant/components/light/rflink.py index 0630792602d..ad25ae6a38d 100644 --- a/homeassistant/components/light/rflink.py +++ b/homeassistant/components/light/rflink.py @@ -11,11 +11,13 @@ from homeassistant.components.light import ( ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS, Light) from homeassistant.components.rflink import ( CONF_ALIASSES, CONF_DEVICE_DEFAULTS, CONF_DEVICES, CONF_FIRE_EVENT, - CONF_IGNORE_DEVICES, CONF_SIGNAL_REPETITIONS, DATA_DEVICE_REGISTER, - DATA_ENTITY_LOOKUP, DEVICE_DEFAULTS_SCHEMA, DOMAIN, - EVENT_KEY_COMMAND, EVENT_KEY_ID, SwitchableRflinkDevice, cv, vol) + CONF_GROUP, CONF_GROUP_ALIASSES, CONF_IGNORE_DEVICES, + CONF_NOGROUP_ALIASSES, CONF_SIGNAL_REPETITIONS, DATA_DEVICE_REGISTER, + DATA_ENTITY_GROUP_LOOKUP, DATA_ENTITY_LOOKUP, DEVICE_DEFAULTS_SCHEMA, + DOMAIN, EVENT_KEY_COMMAND, EVENT_KEY_ID, SwitchableRflinkDevice, cv, vol) from homeassistant.const import ( CONF_NAME, CONF_PLATFORM, CONF_TYPE, STATE_UNKNOWN) + DEPENDENCIES = ['rflink'] _LOGGER = logging.getLogger(__name__) @@ -38,8 +40,13 @@ PLATFORM_SCHEMA = vol.Schema({ TYPE_HYBRID, TYPE_TOGGLE), vol.Optional(CONF_ALIASSES, default=[]): vol.All(cv.ensure_list, [cv.string]), + vol.Optional(CONF_GROUP_ALIASSES, default=[]): + vol.All(cv.ensure_list, [cv.string]), + vol.Optional(CONF_NOGROUP_ALIASSES, default=[]): + vol.All(cv.ensure_list, [cv.string]), vol.Optional(CONF_FIRE_EVENT, default=False): cv.boolean, vol.Optional(CONF_SIGNAL_REPETITIONS): vol.Coerce(int), + vol.Optional(CONF_GROUP, default=True): cv.boolean, }, }), }) @@ -110,7 +117,24 @@ def devices_from_config(domain_config, hass=None): devices.append(device) # Register entity (and aliasses) to listen to incoming rflink events - for _id in [device_id] + config[CONF_ALIASSES]: + + # device id and normal aliasses respond to normal and group command + hass.data[DATA_ENTITY_LOOKUP][ + EVENT_KEY_COMMAND][device_id].append(device) + if config[CONF_GROUP]: + hass.data[DATA_ENTITY_GROUP_LOOKUP][ + EVENT_KEY_COMMAND][device_id].append(device) + for _id in config[CONF_ALIASSES]: + hass.data[DATA_ENTITY_LOOKUP][ + EVENT_KEY_COMMAND][_id].append(device) + hass.data[DATA_ENTITY_GROUP_LOOKUP][ + EVENT_KEY_COMMAND][_id].append(device) + # group_aliasses only respond to group commands + for _id in config[CONF_GROUP_ALIASSES]: + hass.data[DATA_ENTITY_GROUP_LOOKUP][ + EVENT_KEY_COMMAND][_id].append(device) + # nogroup_aliasses only respond to normal commands + for _id in config[CONF_NOGROUP_ALIASSES]: hass.data[DATA_ENTITY_LOOKUP][ EVENT_KEY_COMMAND][_id].append(device) diff --git a/homeassistant/components/rflink.py b/homeassistant/components/rflink.py index df1ca955a4d..2986b898ed0 100644 --- a/homeassistant/components/rflink.py +++ b/homeassistant/components/rflink.py @@ -20,7 +20,7 @@ from homeassistant.exceptions import HomeAssistantError import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity -REQUIREMENTS = ['rflink==0.0.28'] +REQUIREMENTS = ['rflink==0.0.31'] _LOGGER = logging.getLogger(__name__) @@ -28,6 +28,9 @@ ATTR_EVENT = 'event' ATTR_STATE = 'state' CONF_ALIASSES = 'aliasses' +CONF_GROUP_ALIASSES = 'group_aliasses' +CONF_GROUP = 'group' +CONF_NOGROUP_ALIASSES = 'nogroup_aliasses' CONF_DEVICE_DEFAULTS = 'device_defaults' CONF_DEVICES = 'devices' CONF_FIRE_EVENT = 'fire_event' @@ -38,6 +41,7 @@ CONF_WAIT_FOR_ACK = 'wait_for_ack' DATA_DEVICE_REGISTER = 'rflink_device_register' DATA_ENTITY_LOOKUP = 'rflink_entity_lookup' +DATA_ENTITY_GROUP_LOOKUP = 'rflink_entity_group_only_lookup' DEFAULT_RECONNECT_INTERVAL = 10 DEFAULT_SIGNAL_REPETITIONS = 1 CONNECTION_TIMEOUT = 10 @@ -48,6 +52,8 @@ EVENT_KEY_ID = 'id' EVENT_KEY_SENSOR = 'sensor' EVENT_KEY_UNIT = 'unit' +RFLINK_GROUP_COMMANDS = ['allon', 'alloff'] + DOMAIN = 'rflink' DEVICE_DEFAULTS_SCHEMA = vol.Schema({ @@ -94,6 +100,10 @@ def async_setup(hass, config): EVENT_KEY_COMMAND: defaultdict(list), EVENT_KEY_SENSOR: defaultdict(list), } + hass.data[DATA_ENTITY_GROUP_LOOKUP] = { + EVENT_KEY_COMMAND: defaultdict(list), + EVENT_KEY_SENSOR: defaultdict(list), + } # Allow platform to specify function to register new unknown devices hass.data[DATA_DEVICE_REGISTER] = {} @@ -116,7 +126,14 @@ def async_setup(hass, config): # Lookup entities who registered this device id as device id or alias event_id = event.get('id', None) - entities = hass.data[DATA_ENTITY_LOOKUP][event_type][event_id] + + is_group_event = (event_type == EVENT_KEY_COMMAND and + event[EVENT_KEY_COMMAND] in RFLINK_GROUP_COMMANDS) + if is_group_event: + entities = hass.data[DATA_ENTITY_GROUP_LOOKUP][event_type].get( + event_id, []) + else: + entities = hass.data[DATA_ENTITY_LOOKUP][event_type][event_id] if entities: # Propagate event to every entity matching the device id @@ -202,8 +219,8 @@ class RflinkDevice(Entity): platform = None _state = STATE_UNKNOWN - def __init__(self, device_id, hass, name=None, - aliasses=None, fire_event=False, + def __init__(self, device_id, hass, name=None, aliasses=None, group=True, + group_aliasses=None, nogroup_aliasses=None, fire_event=False, signal_repetitions=DEFAULT_SIGNAL_REPETITIONS): """Initialize the device.""" self.hass = hass @@ -215,12 +232,6 @@ class RflinkDevice(Entity): else: self._name = device_id - # Generate list of device_ids to match against - if aliasses: - self._aliasses = aliasses - else: - self._aliasses = [] - self._should_fire_event = fire_event self._signal_repetitions = signal_repetitions @@ -375,9 +386,9 @@ class SwitchableRflinkDevice(RflinkCommand): self.cancel_queued_send_commands() command = event['command'] - if command == 'on': + if command in ['on', 'allon']: self._state = True - elif command == 'off': + elif command in ['off', 'alloff']: self._state = False def async_turn_on(self, **kwargs): diff --git a/requirements_all.txt b/requirements_all.txt index ea986259ea8..dac5add5c94 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -659,7 +659,7 @@ qnapstats==0.2.3 radiotherm==1.2 # homeassistant.components.rflink -rflink==0.0.28 +rflink==0.0.31 # homeassistant.components.sensor.ring ring_doorbell==0.1.0 diff --git a/tests/components/light/test_rflink.py b/tests/components/light/test_rflink.py index 2cd6d6fd092..9f1d98b0ffd 100644 --- a/tests/components/light/test_rflink.py +++ b/tests/components/light/test_rflink.py @@ -81,6 +81,25 @@ def test_default_setup(hass, monkeypatch): assert hass.states.get('light.test').state == 'off' + # should repond to group command + event_callback({ + 'id': 'protocol_0_0', + 'command': 'allon', + }) + yield from hass.async_block_till_done() + + light_after_first_command = hass.states.get('light.test') + assert light_after_first_command.state == 'on' + + # should repond to group command + event_callback({ + 'id': 'protocol_0_0', + 'command': 'alloff', + }) + yield from hass.async_block_till_done() + + assert hass.states.get('light.test').state == 'off' + # test following aliasses # mock incoming command event for this device alias event_callback({ @@ -385,3 +404,132 @@ def test_type_toggle(hass, monkeypatch): yield from hass.async_block_till_done() assert hass.states.get('light.toggle_test').state == 'off' + + +@asyncio.coroutine +def test_group_alias(hass, monkeypatch): + """Group aliases should only respond to group commands (allon/alloff).""" + config = { + 'rflink': { + 'port': '/dev/ttyABC0', + }, + DOMAIN: { + 'platform': 'rflink', + 'devices': { + 'protocol_0_0': { + 'name': 'test', + 'group_aliasses': ['test_group_0_0'], + }, + }, + }, + } + + # setup mocking rflink module + event_callback, _, _, _ = yield from mock_rflink( + hass, config, DOMAIN, monkeypatch) + + assert hass.states.get('light.test').state == 'off' + + # test sending group command to group alias + event_callback({ + 'id': 'test_group_0_0', + 'command': 'allon', + }) + yield from hass.async_block_till_done() + + assert hass.states.get('light.test').state == 'on' + + # test sending group command to group alias + event_callback({ + 'id': 'test_group_0_0', + 'command': 'off', + }) + yield from hass.async_block_till_done() + + assert hass.states.get('light.test').state == 'on' + + +@asyncio.coroutine +def test_nogroup_alias(hass, monkeypatch): + """Non group aliases should not respond to group commands.""" + config = { + 'rflink': { + 'port': '/dev/ttyABC0', + }, + DOMAIN: { + 'platform': 'rflink', + 'devices': { + 'protocol_0_0': { + 'name': 'test', + 'nogroup_aliasses': ['test_nogroup_0_0'], + }, + }, + }, + } + + # setup mocking rflink module + event_callback, _, _, _ = yield from mock_rflink( + hass, config, DOMAIN, monkeypatch) + + assert hass.states.get('light.test').state == 'off' + + # test sending group command to nogroup alias + event_callback({ + 'id': 'test_nogroup_0_0', + 'command': 'allon', + }) + yield from hass.async_block_till_done() + # should not affect state + assert hass.states.get('light.test').state == 'off' + + # test sending group command to nogroup alias + event_callback({ + 'id': 'test_nogroup_0_0', + 'command': 'on', + }) + yield from hass.async_block_till_done() + # should affect state + assert hass.states.get('light.test').state == 'on' + + +@asyncio.coroutine +def test_nogroup_device_id(hass, monkeypatch): + """Device id that do not respond to group commands (allon/alloff).""" + config = { + 'rflink': { + 'port': '/dev/ttyABC0', + }, + DOMAIN: { + 'platform': 'rflink', + 'devices': { + 'test_nogroup_0_0': { + 'name': 'test', + 'group': False, + }, + }, + }, + } + + # setup mocking rflink module + event_callback, _, _, _ = yield from mock_rflink( + hass, config, DOMAIN, monkeypatch) + + assert hass.states.get('light.test').state == 'off' + + # test sending group command to nogroup + event_callback({ + 'id': 'test_nogroup_0_0', + 'command': 'allon', + }) + yield from hass.async_block_till_done() + # should not affect state + assert hass.states.get('light.test').state == 'off' + + # test sending group command to nogroup + event_callback({ + 'id': 'test_nogroup_0_0', + 'command': 'on', + }) + yield from hass.async_block_till_done() + # should affect state + assert hass.states.get('light.test').state == 'on' From d1b519a41809edc9dfbb1d1706cbb3e2b583f724 Mon Sep 17 00:00:00 2001 From: Xorso Date: Wed, 29 Mar 2017 00:21:40 -0600 Subject: [PATCH 041/116] Updating Alarm.com Component for async and no Selenium (#6752) * Updating Alarm.com Component for async and no Selenium * Fixed gen_all_requirements --- .../alarm_control_panel/alarmdotcom.py | 83 ++++++++++--------- requirements_all.txt | 6 +- 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/alarmdotcom.py b/homeassistant/components/alarm_control_panel/alarmdotcom.py index 07f90cf4476..22cbdefd403 100644 --- a/homeassistant/components/alarm_control_panel/alarmdotcom.py +++ b/homeassistant/components/alarm_control_panel/alarmdotcom.py @@ -1,13 +1,13 @@ """ + Interfaces with Alarm.com alarm control panels. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/alarm_control_panel.alarmdotcom/ """ import logging - +import asyncio import voluptuous as vol - import homeassistant.components.alarm_control_panel as alarm from homeassistant.components.alarm_control_panel import PLATFORM_SCHEMA from homeassistant.const import ( @@ -15,10 +15,9 @@ from homeassistant.const import ( STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED, STATE_UNKNOWN, CONF_CODE, CONF_NAME) import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.aiohttp_client import async_get_clientsession -REQUIREMENTS = ['https://github.com/Xorso/pyalarmdotcom' - '/archive/0.1.1.zip' - '#pyalarmdotcom==0.1.1'] +REQUIREMENTS = ['pyalarmdotcom==0.2.9'] _LOGGER = logging.getLogger(__name__) @@ -32,14 +31,17 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ }) -def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup an Alarm.com control panel.""" +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Setup a Alarm.com control panel.""" name = config.get(CONF_NAME) code = config.get(CONF_CODE) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) - add_devices([AlarmDotCom(hass, name, code, username, password)], True) + alarmdotcom = AlarmDotCom(hass, name, code, username, password) + yield from alarmdotcom.async_login() + async_add_devices([alarmdotcom]) class AlarmDotCom(alarm.AlarmControlPanel): @@ -47,18 +49,30 @@ class AlarmDotCom(alarm.AlarmControlPanel): def __init__(self, hass, name, code, username, password): """Initialize the Alarm.com status.""" - from pyalarmdotcom.pyalarmdotcom import Alarmdotcom - self._alarm = Alarmdotcom(username, password, timeout=10) + from pyalarmdotcom import Alarmdotcom + _LOGGER.debug('Setting up Alarm.com...') self._hass = hass self._name = name self._code = str(code) if code else None self._username = username self._password = password + self._websession = async_get_clientsession(self._hass) self._state = STATE_UNKNOWN + self._alarm = Alarmdotcom(username, + password, + self._websession, + hass.loop) - def update(self): + @asyncio.coroutine + def async_login(self): + """Login to Alarm.com.""" + yield from self._alarm.async_login() + + @asyncio.coroutine + def async_update(self): """Fetch the latest state.""" - self._state = self._alarm.state + yield from self._alarm.async_update() + return self._alarm.state @property def name(self): @@ -73,45 +87,36 @@ class AlarmDotCom(alarm.AlarmControlPanel): @property def state(self): """Return the state of the device.""" - if self._state == 'Disarmed': + if self._alarm.state.lower() == 'disarmed': return STATE_ALARM_DISARMED - elif self._state == 'Armed Stay': + elif self._alarm.state.lower() == 'armed stay': return STATE_ALARM_ARMED_HOME - elif self._state == 'Armed Away': + elif self._alarm.state.lower() == 'armed away': return STATE_ALARM_ARMED_AWAY else: return STATE_UNKNOWN - def alarm_disarm(self, code=None): + @asyncio.coroutine + def async_alarm_disarm(self, code=None): """Send disarm command.""" - if not self._validate_code(code, 'disarming home'): - return - from pyalarmdotcom.pyalarmdotcom import Alarmdotcom - # Open another session to alarm.com to fire off the command - _alarm = Alarmdotcom(self._username, self._password, timeout=10) - _alarm.disarm() + if self._validate_code(code): + yield from self._alarm.async_alarm_disarm() - def alarm_arm_home(self, code=None): - """Send arm home command.""" - if not self._validate_code(code, 'arming home'): - return - from pyalarmdotcom.pyalarmdotcom import Alarmdotcom - # Open another session to alarm.com to fire off the command - _alarm = Alarmdotcom(self._username, self._password, timeout=10) - _alarm.arm_stay() + @asyncio.coroutine + def async_alarm_arm_home(self, code=None): + """Send arm hom command.""" + if self._validate_code(code): + yield from self._alarm.async_alarm_arm_home() - def alarm_arm_away(self, code=None): + @asyncio.coroutine + def async_alarm_arm_away(self, code=None): """Send arm away command.""" - if not self._validate_code(code, 'arming home'): - return - from pyalarmdotcom.pyalarmdotcom import Alarmdotcom - # Open another session to alarm.com to fire off the command - _alarm = Alarmdotcom(self._username, self._password, timeout=10) - _alarm.arm_away() + if self._validate_code(code): + yield from self._alarm.async_alarm_arm_away() - def _validate_code(self, code, state): + def _validate_code(self, code): """Validate given code.""" check = self._code is None or code == self._code if not check: - _LOGGER.warning('Wrong code entered for %s', state) + _LOGGER.warning('Wrong code entered.') return check diff --git a/requirements_all.txt b/requirements_all.txt index dac5add5c94..2c3301671a3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -236,9 +236,6 @@ https://github.com/TheRealLink/pylgtv/archive/v0.1.4.zip#pylgtv==0.1.4 # homeassistant.components.switch.thinkingcleaner https://github.com/TheRealLink/pythinkingcleaner/archive/v0.0.2.zip#pythinkingcleaner==0.0.2 -# homeassistant.components.alarm_control_panel.alarmdotcom -https://github.com/Xorso/pyalarmdotcom/archive/0.1.1.zip#pyalarmdotcom==0.1.1 - # homeassistant.components.media_player.braviatv https://github.com/aparraga/braviarc/archive/0.3.6.zip#braviarc==0.3.6 @@ -464,6 +461,9 @@ pyHS100==0.2.4.1 # homeassistant.components.rfxtrx pyRFXtrx==0.17.0 +# homeassistant.components.alarm_control_panel.alarmdotcom +pyalarmdotcom==0.2.9 + # homeassistant.components.notify.xmpp pyasn1-modules==0.0.8 From 7c614a67389b76c8d73c2e169bf4778e95c7aa03 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Wed, 29 Mar 2017 08:39:53 +0200 Subject: [PATCH 042/116] Add voluptuous config validation to scenes (#6830) * Add platform schema to scene component and homeassistant platform. * Clean up code and add constants. * Add unit test and clean up tests. --- homeassistant/components/scene/__init__.py | 54 +++++++---- .../components/scene/homeassistant.py | 40 +++++--- tests/components/scene/test_init.py | 96 +++++++++++-------- 3 files changed, 115 insertions(+), 75 deletions(-) diff --git a/homeassistant/components/scene/__init__.py b/homeassistant/components/scene/__init__.py index 1abe6432409..0d407ac3a9a 100644 --- a/homeassistant/components/scene/__init__.py +++ b/homeassistant/components/scene/__init__.py @@ -6,28 +6,55 @@ https://home-assistant.io/components/scene/ """ import asyncio import logging -from collections import namedtuple import voluptuous as vol from homeassistant.const import ( - ATTR_ENTITY_ID, SERVICE_TURN_ON, CONF_PLATFORM) -from homeassistant.helpers import extract_domain_configs + ATTR_ENTITY_ID, CONF_PLATFORM, SERVICE_TURN_ON) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity_component import EntityComponent +from homeassistant.helpers.state import HASS_DOMAIN +from homeassistant.loader import get_platform DOMAIN = 'scene' STATE = 'scening' +STATES = 'states' -CONF_ENTITIES = "entities" + +def _hass_domain_validator(config): + """Validate platform in config for homeassistant domain.""" + if CONF_PLATFORM not in config: + config = { + CONF_PLATFORM: HASS_DOMAIN, STATES: config} + + return config + + +def _platform_validator(config): + """Validate it is a valid platform.""" + p_name = config[CONF_PLATFORM] + platform = get_platform(DOMAIN, p_name) + + if not hasattr(platform, 'PLATFORM_SCHEMA'): + return config + + return getattr(platform, 'PLATFORM_SCHEMA')(config) + + +PLATFORM_SCHEMA = vol.Schema( + vol.All( + _hass_domain_validator, + vol.Schema({ + vol.Required(CONF_PLATFORM): cv.platform_validator(DOMAIN) + }, extra=vol.ALLOW_EXTRA), + _platform_validator + ), extra=vol.ALLOW_EXTRA) SCENE_SERVICE_SCHEMA = vol.Schema({ vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, }) -SceneConfig = namedtuple('SceneConfig', ['name', 'states']) - def activate(hass, entity_id=None): """Activate a scene.""" @@ -43,21 +70,6 @@ def activate(hass, entity_id=None): def async_setup(hass, config): """Setup scenes.""" logger = logging.getLogger(__name__) - - # You are not allowed to mutate the original config so make a copy - config = dict(config) - - for config_key in extract_domain_configs(config, DOMAIN): - platform_config = config[config_key] - if not isinstance(platform_config, list): - platform_config = [platform_config] - - if not any(CONF_PLATFORM in entry for entry in platform_config): - platform_config = [{'platform': 'homeassistant', 'states': entry} - for entry in platform_config] - - config[config_key] = platform_config - component = EntityComponent(logger, DOMAIN, hass) yield from component.async_setup(config) diff --git a/homeassistant/components/scene/homeassistant.py b/homeassistant/components/scene/homeassistant.py index 2081dfe89ab..39942eea301 100644 --- a/homeassistant/components/scene/homeassistant.py +++ b/homeassistant/components/scene/homeassistant.py @@ -7,26 +7,38 @@ https://home-assistant.io/components/scene/ import asyncio from collections import namedtuple -from homeassistant.components.scene import Scene +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.components.scene import Scene, STATES from homeassistant.const import ( - ATTR_ENTITY_ID, STATE_OFF, STATE_ON) + ATTR_ENTITY_ID, ATTR_STATE, CONF_ENTITIES, CONF_NAME, CONF_PLATFORM, + STATE_OFF, STATE_ON) from homeassistant.core import State -from homeassistant.helpers.state import async_reproduce_state +from homeassistant.helpers.state import async_reproduce_state, HASS_DOMAIN -STATE = 'scening' +PLATFORM_SCHEMA = vol.Schema({ + vol.Required(CONF_PLATFORM): HASS_DOMAIN, + vol.Required(STATES): vol.All( + cv.ensure_list, + [ + { + vol.Required(CONF_NAME): cv.string, + vol.Required(CONF_ENTITIES): { + cv.entity_id: vol.Any(str, bool, dict) + }, + } + ] + ), +}, extra=vol.ALLOW_EXTRA) -CONF_ENTITIES = "entities" - -SceneConfig = namedtuple('SceneConfig', ['name', 'states']) +SCENECONFIG = namedtuple('SceneConfig', [CONF_NAME, STATES]) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup home assistant scene entries.""" - scene_config = config.get("states") - - if not isinstance(scene_config, list): - scene_config = [scene_config] + scene_config = config.get(STATES) async_add_devices(HomeAssistantScene( hass, _process_config(scene)) for scene in scene_config) @@ -38,7 +50,7 @@ def _process_config(scene_config): Async friendly. """ - name = scene_config.get('name') + name = scene_config.get(CONF_NAME) states = {} c_entities = dict(scene_config.get(CONF_ENTITIES, {})) @@ -46,7 +58,7 @@ def _process_config(scene_config): for entity_id in c_entities: if isinstance(c_entities[entity_id], dict): entity_attrs = c_entities[entity_id].copy() - state = entity_attrs.pop('state', None) + state = entity_attrs.pop(ATTR_STATE, None) attributes = entity_attrs else: state = c_entities[entity_id] @@ -61,7 +73,7 @@ def _process_config(scene_config): states[entity_id.lower()] = State(entity_id, state, attributes) - return SceneConfig(name, states) + return SCENECONFIG(name, states) class HomeAssistantScene(Scene): diff --git a/tests/components/scene/test_init.py b/tests/components/scene/test_init.py index d84d6ad37f4..25ea818c774 100644 --- a/tests/components/scene/test_init.py +++ b/tests/components/scene/test_init.py @@ -1,9 +1,11 @@ """The tests for the Scene component.""" +import io import unittest from homeassistant.setup import setup_component from homeassistant import loader from homeassistant.components import light, scene +from homeassistant.util import yaml from tests.common import get_test_home_assistant @@ -14,6 +16,22 @@ class TestScene(unittest.TestCase): def setUp(self): # pylint: disable=invalid-name """Setup things to be run when tests are started.""" self.hass = get_test_home_assistant() + test_light = loader.get_component('light.test') + test_light.init() + + self.assertTrue(setup_component(self.hass, light.DOMAIN, { + light.DOMAIN: {'platform': 'test'} + })) + + self.light_1, self.light_2 = test_light.DEVICES[0:2] + + light.turn_off( + self.hass, [self.light_1.entity_id, self.light_2.entity_id]) + + self.hass.block_till_done() + + self.assertFalse(self.light_1.is_on) + self.assertFalse(self.light_2.is_on) def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" @@ -36,19 +54,6 @@ class TestScene(unittest.TestCase): reference to the original dictionary, instead of creating a copy, so care needs to be taken to not modify the original. """ - test_light = loader.get_component('light.test') - test_light.init() - - self.assertTrue(setup_component(self.hass, light.DOMAIN, { - light.DOMAIN: {'platform': 'test'} - })) - - light_1, light_2 = test_light.DEVICES[0:2] - - light.turn_off(self.hass, [light_1.entity_id, light_2.entity_id]) - - self.hass.block_till_done() - entity_state = { 'state': 'on', 'brightness': 100, @@ -57,8 +62,8 @@ class TestScene(unittest.TestCase): 'scene': [{ 'name': 'test', 'entities': { - light_1.entity_id: entity_state, - light_2.entity_id: entity_state, + self.light_1.entity_id: entity_state, + self.light_2.entity_id: entity_state, } }] })) @@ -66,34 +71,45 @@ class TestScene(unittest.TestCase): scene.activate(self.hass, 'scene.test') self.hass.block_till_done() - self.assertTrue(light_1.is_on) - self.assertTrue(light_2.is_on) - self.assertEqual(100, - light_1.last_call('turn_on')[1].get('brightness')) - self.assertEqual(100, - light_2.last_call('turn_on')[1].get('brightness')) + self.assertTrue(self.light_1.is_on) + self.assertTrue(self.light_2.is_on) + self.assertEqual( + 100, self.light_1.last_call('turn_on')[1].get('brightness')) + self.assertEqual( + 100, self.light_2.last_call('turn_on')[1].get('brightness')) + + def test_config_yaml_bool(self): + """Test parsing of booleans in yaml config.""" + config = ( + 'scene:\n' + ' - name: test\n' + ' entities:\n' + ' {0}: on\n' + ' {1}:\n' + ' state: on\n' + ' brightness: 100\n').format( + self.light_1.entity_id, self.light_2.entity_id) + + with io.StringIO(config) as file: + doc = yaml.yaml.safe_load(file) + + self.assertTrue(setup_component(self.hass, scene.DOMAIN, doc)) + scene.activate(self.hass, 'scene.test') + self.hass.block_till_done() + + self.assertTrue(self.light_1.is_on) + self.assertTrue(self.light_2.is_on) + self.assertEqual( + 100, self.light_2.last_call('turn_on')[1].get('brightness')) def test_activate_scene(self): """Test active scene.""" - test_light = loader.get_component('light.test') - test_light.init() - - self.assertTrue(setup_component(self.hass, light.DOMAIN, { - light.DOMAIN: {'platform': 'test'} - })) - - light_1, light_2 = test_light.DEVICES[0:2] - - light.turn_off(self.hass, [light_1.entity_id, light_2.entity_id]) - - self.hass.block_till_done() - self.assertTrue(setup_component(self.hass, scene.DOMAIN, { 'scene': [{ 'name': 'test', 'entities': { - light_1.entity_id: 'on', - light_2.entity_id: { + self.light_1.entity_id: 'on', + self.light_2.entity_id: { 'state': 'on', 'brightness': 100, } @@ -104,7 +120,7 @@ class TestScene(unittest.TestCase): scene.activate(self.hass, 'scene.test') self.hass.block_till_done() - self.assertTrue(light_1.is_on) - self.assertTrue(light_2.is_on) - self.assertEqual(100, - light_2.last_call('turn_on')[1].get('brightness')) + self.assertTrue(self.light_1.is_on) + self.assertTrue(self.light_2.is_on) + self.assertEqual( + 100, self.light_2.last_call('turn_on')[1].get('brightness')) From c935bfce2ac447adf387a8e9e69cbdf755d31727 Mon Sep 17 00:00:00 2001 From: Anubhaw Arya Date: Wed, 29 Mar 2017 08:25:23 -0700 Subject: [PATCH 043/116] Integration with lockitron (#6805) * Integration with lockitron * Let super class deal with polling and updating --- .coveragerc | 1 + homeassistant/components/lock/lockitron.py | 92 ++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 homeassistant/components/lock/lockitron.py diff --git a/.coveragerc b/.coveragerc index fac7edfa42b..c6bf3d197ae 100644 --- a/.coveragerc +++ b/.coveragerc @@ -235,6 +235,7 @@ omit = homeassistant/components/light/zengge.py homeassistant/components/lirc.py homeassistant/components/lock/nuki.py + homeassistant/components/lock/lockitron.py homeassistant/components/media_player/anthemav.py homeassistant/components/media_player/apple_tv.py homeassistant/components/media_player/aquostv.py diff --git a/homeassistant/components/lock/lockitron.py b/homeassistant/components/lock/lockitron.py new file mode 100644 index 00000000000..86821711fd2 --- /dev/null +++ b/homeassistant/components/lock/lockitron.py @@ -0,0 +1,92 @@ +""" +Lockitron lock platform. + +For more details about this platform, please refer to the documentation +https://home-assistant.io/components/lockitron/ +""" +import logging + +import requests +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.components.lock import LockDevice, PLATFORM_SCHEMA +from homeassistant.const import CONF_ACCESS_TOKEN, CONF_ID + +_LOGGER = logging.getLogger(__name__) + +DOMAIN = 'lockitron' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_ACCESS_TOKEN): cv.string, + vol.Required(CONF_ID): cv.string +}) +BASE_URL = 'https://api.lockitron.com' +API_STATE_URL = BASE_URL + '/v2/locks/{}?access_token={}' +API_ACTION_URL = BASE_URL + '/v2/locks/{}?access_token={}&state={}' + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Lockitron platform.""" + access_token = config.get(CONF_ACCESS_TOKEN) + device_id = config.get(CONF_ID) + response = requests.get(API_STATE_URL.format(device_id, access_token)) + if response.status_code == 200: + add_devices([Lockitron(response.json()['state'], access_token, + device_id)]) + else: + _LOGGER.error('Error retrieving lock status during init: %s', + response.text) + + +class Lockitron(LockDevice): + """Representation of a Lockitron lock.""" + + LOCK_STATE = 'lock' + UNLOCK_STATE = 'unlock' + + def __init__(self, state, access_token, device_id): + """Initialize the lock.""" + self._state = state + self.access_token = access_token + self.device_id = device_id + + @property + def name(self): + """Return the name of the device.""" + return DOMAIN + + @property + def is_locked(self): + """Return True if the lock is currently locked, else False.""" + return self._state == Lockitron.LOCK_STATE + + def lock(self, **kwargs): + """Lock the device.""" + self._state = self.do_change_request(Lockitron.LOCK_STATE) + + def unlock(self, **kwargs): + """Unlock the device.""" + self._state = self.do_change_request(Lockitron.UNLOCK_STATE) + + def update(self): + """Update the internal state of the device.""" + response = requests \ + .get(API_STATE_URL.format(self.device_id, self.access_token)) + if response.status_code == 200: + self._state = response.json()['state'] + else: + _LOGGER.error('Error retrieving lock status: %s', response.text) + + def do_change_request(self, requested_state): + """Execute the change request and pull out the new state.""" + response = requests.put( + API_ACTION_URL.format(self.device_id, self.access_token, + requested_state)) + if response.status_code == 200: + return response.json()['state'] + else: + _LOGGER.error('Error setting lock state: %s\n%s', + requested_state, response.text) + return self._state From 9de4c2b056db06b262f70d758241cf7f2f653d20 Mon Sep 17 00:00:00 2001 From: Lewis Juggins Date: Wed, 29 Mar 2017 20:49:28 +0100 Subject: [PATCH 044/116] [switch.wemo] Fix today_energy_kwh calculation. (#6846) * [switch.wemo] Fix today_energy_kwh calculation. * Blank line fail * Round to two decimal places. --- homeassistant/components/switch/wemo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/switch/wemo.py b/homeassistant/components/switch/wemo.py index 7518a1958cf..0e40c3eff3b 100644 --- a/homeassistant/components/switch/wemo.py +++ b/homeassistant/components/switch/wemo.py @@ -149,7 +149,7 @@ class WemoSwitch(SwitchDevice): """Today total energy usage in kWh.""" if self.insight_params: miliwatts = convert(self.insight_params['todaymw'], float, 0.0) - return miliwatts / 1000000.0 + return round(miliwatts / (1000.0 * 1000.0 * 60), 2) @property def detail_state(self): From bfe0aee468d8726ee008fbf4ba1c0364e11cd002 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Mar 2017 22:19:58 -0700 Subject: [PATCH 045/116] Locative tests to use aiohttp test utils (#6838) --- .../components/device_tracker/locative.py | 3 +- .../device_tracker/test_locative.py | 353 ++++++++---------- 2 files changed, 166 insertions(+), 190 deletions(-) diff --git a/homeassistant/components/device_tracker/locative.py b/homeassistant/components/device_tracker/locative.py index 75cebbd95e7..255440a18e1 100644 --- a/homeassistant/components/device_tracker/locative.py +++ b/homeassistant/components/device_tracker/locative.py @@ -18,6 +18,7 @@ from homeassistant.components.device_tracker import ( # NOQA _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['http'] +URL = '/api/locative' def setup_scanner(hass, config, see, discovery_info=None): @@ -30,7 +31,7 @@ def setup_scanner(hass, config, see, discovery_info=None): class LocativeView(HomeAssistantView): """View to handle locative requests.""" - url = '/api/locative' + url = URL name = 'api:locative' def __init__(self, see): diff --git a/tests/components/device_tracker/test_locative.py b/tests/components/device_tracker/test_locative.py index 5f3f12ba82a..2476247e069 100644 --- a/tests/components/device_tracker/test_locative.py +++ b/tests/components/device_tracker/test_locative.py @@ -1,21 +1,13 @@ """The tests the for Locative device tracker platform.""" -import unittest +import asyncio from unittest.mock import patch -import requests +import pytest -from homeassistant import setup, const +from homeassistant.setup import async_setup_component import homeassistant.components.device_tracker as device_tracker -import homeassistant.components.http as http from homeassistant.const import CONF_PLATFORM - -from tests.common import ( - assert_setup_component, get_test_home_assistant, get_test_instance_port) - -SERVER_PORT = get_test_instance_port() -HTTP_BASE_URL = "http://127.0.0.1:{}".format(SERVER_PORT) - -hass = None # pylint: disable=invalid-name +from homeassistant.components.device_tracker.locative import URL def _url(data=None): @@ -23,213 +15,196 @@ def _url(data=None): data = data or {} data = "&".join(["{}={}".format(name, value) for name, value in data.items()]) - return "{}{}locative?{}".format(HTTP_BASE_URL, const.URL_API, data) + return "{}?{}".format(URL, data) -# pylint: disable=invalid-name -def setUpModule(): - """Initalize a Home Assistant server.""" - global hass - - hass = get_test_home_assistant() - # http is not platform based, assert_setup_component not applicable - setup.setup_component(hass, http.DOMAIN, { - http.DOMAIN: { - http.CONF_SERVER_PORT: SERVER_PORT - }, - }) - - # Set up device tracker - with assert_setup_component(1, device_tracker.DOMAIN): - setup.setup_component(hass, device_tracker.DOMAIN, { +@pytest.fixture +def locative_client(loop, hass, test_client): + """Locative mock client.""" + assert loop.run_until_complete(async_setup_component( + hass, device_tracker.DOMAIN, { device_tracker.DOMAIN: { CONF_PLATFORM: 'locative' } - }) + })) - hass.start() + with patch('homeassistant.components.device_tracker.update_config'): + yield loop.run_until_complete(test_client(hass.http.app)) -def tearDownModule(): # pylint: disable=invalid-name - """Stop the Home Assistant server.""" - hass.stop() +@asyncio.coroutine +def test_missing_data(locative_client): + """Test missing data.""" + data = { + 'latitude': 1.0, + 'longitude': 1.1, + 'device': '123', + 'id': 'Home', + 'trigger': 'enter' + } + + # No data + req = yield from locative_client.get(_url({})) + assert req.status == 422 + + # No latitude + copy = data.copy() + del copy['latitude'] + req = yield from locative_client.get(_url(copy)) + assert req.status == 422 + + # No device + copy = data.copy() + del copy['device'] + req = yield from locative_client.get(_url(copy)) + assert req.status == 422 + + # No location + copy = data.copy() + del copy['id'] + req = yield from locative_client.get(_url(copy)) + assert req.status == 422 + + # No trigger + copy = data.copy() + del copy['trigger'] + req = yield from locative_client.get(_url(copy)) + assert req.status == 422 + + # Test message + copy = data.copy() + copy['trigger'] = 'test' + req = yield from locative_client.get(_url(copy)) + assert req.status == 200 + + # Test message, no location + copy = data.copy() + copy['trigger'] = 'test' + del copy['id'] + req = yield from locative_client.get(_url(copy)) + assert req.status == 200 + + # Unknown trigger + copy = data.copy() + copy['trigger'] = 'foobar' + req = yield from locative_client.get(_url(copy)) + assert req.status == 422 -# Stub out update_config or else Travis CI raises an exception -@patch('homeassistant.components.device_tracker.update_config') -class TestLocative(unittest.TestCase): - """Test Locative platform.""" +@asyncio.coroutine +def test_enter_and_exit(hass, locative_client): + """Test when there is a known zone.""" + data = { + 'latitude': 40.7855, + 'longitude': -111.7367, + 'device': '123', + 'id': 'Home', + 'trigger': 'enter' + } - def tearDown(self): - """Stop everything that was started.""" - hass.block_till_done() + # Enter the Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'home' == state_name - def test_missing_data(self, update_config): - """Test missing data.""" - data = { - 'latitude': 1.0, - 'longitude': 1.1, - 'device': '123', - 'id': 'Home', - 'trigger': 'enter' - } + data['id'] = 'HOME' + data['trigger'] = 'exit' - # No data - req = requests.get(_url({})) - self.assertEqual(422, req.status_code) + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'not_home' == state_name - # No latitude - copy = data.copy() - del copy['latitude'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + data['id'] = 'hOmE' + data['trigger'] = 'enter' - # No device - copy = data.copy() - del copy['device'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + # Enter Home again + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'home' == state_name - # No location - copy = data.copy() - del copy['id'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + data['trigger'] = 'exit' - # No trigger - copy = data.copy() - del copy['trigger'] - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'not_home' == state_name - # Test message - copy = data.copy() - copy['trigger'] = 'test' - req = requests.get(_url(copy)) - self.assertEqual(200, req.status_code) + data['id'] = 'work' + data['trigger'] = 'enter' - # Test message, no location - copy = data.copy() - copy['trigger'] = 'test' - del copy['id'] - req = requests.get(_url(copy)) - self.assertEqual(200, req.status_code) + # Enter Work + req = yield from locative_client.get(_url(data)) + assert req.status == 200 + state_name = hass.states.get('{}.{}'.format('device_tracker', + data['device'])).state + assert 'work' == state_name - # Unknown trigger - copy = data.copy() - copy['trigger'] = 'foobar' - req = requests.get(_url(copy)) - self.assertEqual(422, req.status_code) - def test_enter_and_exit(self, update_config): - """Test when there is a known zone.""" - data = { - 'latitude': 40.7855, - 'longitude': -111.7367, - 'device': '123', - 'id': 'Home', - 'trigger': 'enter' - } +@asyncio.coroutine +def test_exit_after_enter(hass, locative_client): + """Test when an exit message comes after an enter message.""" + data = { + 'latitude': 40.7855, + 'longitude': -111.7367, + 'device': '123', + 'id': 'Home', + 'trigger': 'enter' + } - # Enter the Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - state_name = hass.states.get('{}.{}'.format('device_tracker', - data['device'])).state - self.assertEqual(state_name, 'home') + # Enter Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - data['id'] = 'HOME' - data['trigger'] = 'exit' + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'home' - # Exit Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - state_name = hass.states.get('{}.{}'.format('device_tracker', - data['device'])).state - self.assertEqual(state_name, 'not_home') + data['id'] = 'Work' - data['id'] = 'hOmE' - data['trigger'] = 'enter' + # Enter Work + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - # Enter Home again - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - state_name = hass.states.get('{}.{}'.format('device_tracker', - data['device'])).state - self.assertEqual(state_name, 'home') + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'work' - data['trigger'] = 'exit' + data['id'] = 'Home' + data['trigger'] = 'exit' - # Exit Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - state_name = hass.states.get('{}.{}'.format('device_tracker', - data['device'])).state - self.assertEqual(state_name, 'not_home') + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - data['id'] = 'work' - data['trigger'] = 'enter' + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'work' - # Enter Work - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - state_name = hass.states.get('{}.{}'.format('device_tracker', - data['device'])).state - self.assertEqual(state_name, 'work') - def test_exit_after_enter(self, update_config): - """Test when an exit message comes after an enter message.""" - data = { - 'latitude': 40.7855, - 'longitude': -111.7367, - 'device': '123', - 'id': 'Home', - 'trigger': 'enter' - } +@asyncio.coroutine +def test_exit_first(hass, locative_client): + """Test when an exit message is sent first on a new device.""" + data = { + 'latitude': 40.7855, + 'longitude': -111.7367, + 'device': 'new_device', + 'id': 'Home', + 'trigger': 'exit' + } - # Enter Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) + # Exit Home + req = yield from locative_client.get(_url(data)) + assert req.status == 200 - state = hass.states.get('{}.{}'.format('device_tracker', - data['device'])) - self.assertEqual(state.state, 'home') - - data['id'] = 'Work' - - # Enter Work - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - - state = hass.states.get('{}.{}'.format('device_tracker', - data['device'])) - self.assertEqual(state.state, 'work') - - data['id'] = 'Home' - data['trigger'] = 'exit' - - # Exit Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - - state = hass.states.get('{}.{}'.format('device_tracker', - data['device'])) - self.assertEqual(state.state, 'work') - - def test_exit_first(self, update_config): - """Test when an exit message is sent first on a new device.""" - data = { - 'latitude': 40.7855, - 'longitude': -111.7367, - 'device': 'new_device', - 'id': 'Home', - 'trigger': 'exit' - } - - # Exit Home - req = requests.get(_url(data)) - self.assertEqual(200, req.status_code) - - state = hass.states.get('{}.{}'.format('device_tracker', - data['device'])) - self.assertEqual(state.state, 'not_home') + state = hass.states.get('{}.{}'.format('device_tracker', + data['device'])) + assert state.state == 'not_home' From 556dba40201b4807bd763f80acc09d1c98e44e33 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 29 Mar 2017 22:21:39 -0700 Subject: [PATCH 046/116] Convert Alexa tests to use aiohttp test utils (#6839) --- tests/components/test_alexa.py | 650 ++++++++++++++++----------------- 1 file changed, 319 insertions(+), 331 deletions(-) diff --git a/tests/components/test_alexa.py b/tests/components/test_alexa.py index f25eb2b0970..66d506d40c9 100644 --- a/tests/components/test_alexa.py +++ b/tests/components/test_alexa.py @@ -1,33 +1,20 @@ """The tests for the Alexa component.""" # pylint: disable=protected-access +import asyncio import json import datetime -import unittest -import requests +import pytest from homeassistant.core import callback -from homeassistant import setup, const -from homeassistant.components import alexa, http - -from tests.common import get_test_instance_port, get_test_home_assistant - -API_PASSWORD = "test1234" -SERVER_PORT = get_test_instance_port() -BASE_API_URL = "http://127.0.0.1:{}".format(SERVER_PORT) -INTENTS_API_URL = "{}{}".format(BASE_API_URL, alexa.INTENTS_API_ENDPOINT) - -HA_HEADERS = { - const.HTTP_HEADER_HA_AUTH: API_PASSWORD, - const.HTTP_HEADER_CONTENT_TYPE: const.CONTENT_TYPE_JSON, -} +from homeassistant.setup import async_setup_component +from homeassistant.components import alexa SESSION_ID = "amzn1.echo-api.session.0000000-0000-0000-0000-00000000000" APPLICATION_ID = "amzn1.echo-sdk-ams.app.000000-d0ed-0000-ad00-000000d00ebe" REQUEST_ID = "amzn1.echo-api.request.0000000-0000-0000-0000-00000000000" # pylint: disable=invalid-name -hass = None calls = [] NPR_NEWS_MP3_URL = "https://pd.npr.org/anon.npr-mp3/npr/news/newscast.mp3" @@ -36,25 +23,16 @@ NPR_NEWS_MP3_URL = "https://pd.npr.org/anon.npr-mp3/npr/news/newscast.mp3" STATIC_TIME = datetime.datetime.utcfromtimestamp(1476129102) -# pylint: disable=invalid-name -def setUpModule(): +@pytest.fixture +def alexa_client(loop, hass, test_client): """Initialize a Home Assistant server for testing this module.""" - global hass - - hass = get_test_home_assistant() - - setup.setup_component( - hass, http.DOMAIN, - {http.DOMAIN: {http.CONF_API_PASSWORD: API_PASSWORD, - http.CONF_SERVER_PORT: SERVER_PORT}}) - @callback def mock_service(call): calls.append(call) - hass.services.register("test", "alexa", mock_service) + hass.services.async_register("test", "alexa", mock_service) - setup.setup_component(hass, alexa.DOMAIN, { + assert loop.run_until_complete(async_setup_component(hass, alexa.DOMAIN, { # Key is here to verify we allow other keys in config too "homeassistant": {}, "alexa": { @@ -122,357 +100,367 @@ def setUpModule(): } } } - }) - - hass.start() + })) + return loop.run_until_complete(test_client(hass.http.app)) -# pylint: disable=invalid-name -def tearDownModule(): - """Stop the Home Assistant server.""" - hass.stop() +def _intent_req(client, data={}): + return client.post(alexa.INTENTS_API_ENDPOINT, data=json.dumps(data), + headers={'content-type': 'application/json'}) -def _intent_req(data={}): - return requests.post(INTENTS_API_URL, data=json.dumps(data), timeout=5, - headers=HA_HEADERS) +def _flash_briefing_req(client, briefing_id): + return client.get( + "/api/alexa/flash_briefings/{}".format(briefing_id)) -def _flash_briefing_req(briefing_id=None): - url_format = "{}/api/alexa/flash_briefings/{}" - FLASH_BRIEFING_API_URL = url_format.format(BASE_API_URL, - briefing_id) - return requests.get(FLASH_BRIEFING_API_URL, timeout=5, - headers=HA_HEADERS) - - -class TestAlexa(unittest.TestCase): - """Test Alexa.""" - - def tearDown(self): - """Stop everything that was started.""" - hass.block_till_done() - - def test_intent_launch_request(self): - """Test the launch of a request.""" - data = { - "version": "1.0", - "session": { - "new": True, - "sessionId": SESSION_ID, - "application": { - "applicationId": APPLICATION_ID - }, - "attributes": {}, - "user": { - "userId": "amzn1.account.AM3B00000000000000000000000" - } +@asyncio.coroutine +def test_intent_launch_request(alexa_client): + """Test the launch of a request.""" + data = { + "version": "1.0", + "session": { + "new": True, + "sessionId": SESSION_ID, + "application": { + "applicationId": APPLICATION_ID }, - "request": { - "type": "LaunchRequest", - "requestId": REQUEST_ID, - "timestamp": "2015-05-13T12:34:56Z" + "attributes": {}, + "user": { + "userId": "amzn1.account.AM3B00000000000000000000000" } + }, + "request": { + "type": "LaunchRequest", + "requestId": REQUEST_ID, + "timestamp": "2015-05-13T12:34:56Z" } - req = _intent_req(data) - self.assertEqual(200, req.status_code) - resp = req.json() - self.assertIn("outputSpeech", resp["response"]) + } + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + resp = yield from req.json() + assert "outputSpeech" in resp["response"] - def test_intent_request_with_slots(self): - """Test a request with slots.""" - data = { - "version": "1.0", - "session": { - "new": False, - "sessionId": SESSION_ID, - "application": { - "applicationId": APPLICATION_ID - }, - "attributes": { - "supportedHoroscopePeriods": { - "daily": True, - "weekly": False, - "monthly": False - } - }, - "user": { - "userId": "amzn1.account.AM3B00000000000000000000000" + +@asyncio.coroutine +def test_intent_request_with_slots(alexa_client): + """Test a request with slots.""" + data = { + "version": "1.0", + "session": { + "new": False, + "sessionId": SESSION_ID, + "application": { + "applicationId": APPLICATION_ID + }, + "attributes": { + "supportedHoroscopePeriods": { + "daily": True, + "weekly": False, + "monthly": False } }, - "request": { - "type": "IntentRequest", - "requestId": REQUEST_ID, - "timestamp": "2015-05-13T12:34:56Z", - "intent": { - "name": "GetZodiacHoroscopeIntent", - "slots": { - "ZodiacSign": { - "name": "ZodiacSign", - "value": "virgo" - } + "user": { + "userId": "amzn1.account.AM3B00000000000000000000000" + } + }, + "request": { + "type": "IntentRequest", + "requestId": REQUEST_ID, + "timestamp": "2015-05-13T12:34:56Z", + "intent": { + "name": "GetZodiacHoroscopeIntent", + "slots": { + "ZodiacSign": { + "name": "ZodiacSign", + "value": "virgo" } } } } - req = _intent_req(data) - self.assertEqual(200, req.status_code) - text = req.json().get("response", {}).get("outputSpeech", - {}).get("text") - self.assertEqual("You told us your sign is virgo.", text) + } + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + data = yield from req.json() + text = data.get("response", {}).get("outputSpeech", + {}).get("text") + assert text == "You told us your sign is virgo." - def test_intent_request_with_slots_but_no_value(self): - """Test a request with slots but no value.""" - data = { - "version": "1.0", - "session": { - "new": False, - "sessionId": SESSION_ID, - "application": { - "applicationId": APPLICATION_ID - }, - "attributes": { - "supportedHoroscopePeriods": { - "daily": True, - "weekly": False, - "monthly": False - } - }, - "user": { - "userId": "amzn1.account.AM3B00000000000000000000000" + +@asyncio.coroutine +def test_intent_request_with_slots_but_no_value(alexa_client): + """Test a request with slots but no value.""" + data = { + "version": "1.0", + "session": { + "new": False, + "sessionId": SESSION_ID, + "application": { + "applicationId": APPLICATION_ID + }, + "attributes": { + "supportedHoroscopePeriods": { + "daily": True, + "weekly": False, + "monthly": False } }, - "request": { - "type": "IntentRequest", - "requestId": REQUEST_ID, - "timestamp": "2015-05-13T12:34:56Z", - "intent": { - "name": "GetZodiacHoroscopeIntent", - "slots": { - "ZodiacSign": { - "name": "ZodiacSign", - } + "user": { + "userId": "amzn1.account.AM3B00000000000000000000000" + } + }, + "request": { + "type": "IntentRequest", + "requestId": REQUEST_ID, + "timestamp": "2015-05-13T12:34:56Z", + "intent": { + "name": "GetZodiacHoroscopeIntent", + "slots": { + "ZodiacSign": { + "name": "ZodiacSign", } } } } - req = _intent_req(data) - self.assertEqual(200, req.status_code) - text = req.json().get("response", {}).get("outputSpeech", - {}).get("text") - self.assertEqual("You told us your sign is .", text) + } + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + data = yield from req.json() + text = data.get("response", {}).get("outputSpeech", + {}).get("text") + assert text == "You told us your sign is ." - def test_intent_request_without_slots(self): - """Test a request without slots.""" - data = { - "version": "1.0", - "session": { - "new": False, - "sessionId": SESSION_ID, - "application": { - "applicationId": APPLICATION_ID - }, - "attributes": { - "supportedHoroscopePeriods": { - "daily": True, - "weekly": False, - "monthly": False - } - }, - "user": { - "userId": "amzn1.account.AM3B00000000000000000000000" + +@asyncio.coroutine +def test_intent_request_without_slots(hass, alexa_client): + """Test a request without slots.""" + data = { + "version": "1.0", + "session": { + "new": False, + "sessionId": SESSION_ID, + "application": { + "applicationId": APPLICATION_ID + }, + "attributes": { + "supportedHoroscopePeriods": { + "daily": True, + "weekly": False, + "monthly": False } }, - "request": { - "type": "IntentRequest", - "requestId": REQUEST_ID, - "timestamp": "2015-05-13T12:34:56Z", - "intent": { - "name": "WhereAreWeIntent", - } + "user": { + "userId": "amzn1.account.AM3B00000000000000000000000" + } + }, + "request": { + "type": "IntentRequest", + "requestId": REQUEST_ID, + "timestamp": "2015-05-13T12:34:56Z", + "intent": { + "name": "WhereAreWeIntent", } } - req = _intent_req(data) - self.assertEqual(200, req.status_code) - text = req.json().get("response", {}).get("outputSpeech", - {}).get("text") + } + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + json = yield from req.json() + text = json.get("response", {}).get("outputSpeech", + {}).get("text") - self.assertEqual("Anne Therese is at unknown and Paulus is at unknown", - text) + assert text == "Anne Therese is at unknown and Paulus is at unknown" - hass.states.set("device_tracker.paulus", "home") - hass.states.set("device_tracker.anne_therese", "home") + hass.states.async_set("device_tracker.paulus", "home") + hass.states.async_set("device_tracker.anne_therese", "home") - req = _intent_req(data) - self.assertEqual(200, req.status_code) - text = req.json().get("response", {}).get("outputSpeech", - {}).get("text") - self.assertEqual("You are both home, you silly", text) + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + json = yield from req.json() + text = json.get("response", {}).get("outputSpeech", + {}).get("text") + assert text == "You are both home, you silly" - def test_intent_request_calling_service(self): - """Test a request for calling a service.""" - data = { - "version": "1.0", - "session": { - "new": False, - "sessionId": SESSION_ID, - "application": { - "applicationId": APPLICATION_ID - }, - "attributes": {}, - "user": { - "userId": "amzn1.account.AM3B00000000000000000000000" - } + +@asyncio.coroutine +def test_intent_request_calling_service(alexa_client): + """Test a request for calling a service.""" + data = { + "version": "1.0", + "session": { + "new": False, + "sessionId": SESSION_ID, + "application": { + "applicationId": APPLICATION_ID }, - "request": { - "type": "IntentRequest", - "requestId": REQUEST_ID, - "timestamp": "2015-05-13T12:34:56Z", - "intent": { - "name": "CallServiceIntent", - "slots": { - "ZodiacSign": { - "name": "ZodiacSign", - "value": "virgo", - } + "attributes": {}, + "user": { + "userId": "amzn1.account.AM3B00000000000000000000000" + } + }, + "request": { + "type": "IntentRequest", + "requestId": REQUEST_ID, + "timestamp": "2015-05-13T12:34:56Z", + "intent": { + "name": "CallServiceIntent", + "slots": { + "ZodiacSign": { + "name": "ZodiacSign", + "value": "virgo", } } } } - call_count = len(calls) - req = _intent_req(data) - self.assertEqual(200, req.status_code) - self.assertEqual(call_count + 1, len(calls)) - call = calls[-1] - self.assertEqual("test", call.domain) - self.assertEqual("alexa", call.service) - self.assertEqual(["switch.test"], call.data.get("entity_id")) - self.assertEqual("virgo", call.data.get("hello")) + } + call_count = len(calls) + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + assert call_count + 1 == len(calls) + call = calls[-1] + assert call.domain == "test" + assert call.service == "alexa" + assert call.data.get("entity_id") == ["switch.test"] + assert call.data.get("hello") == "virgo" - def test_intent_session_ended_request(self): - """Test the request for ending the session.""" - data = { - "version": "1.0", - "session": { - "new": False, - "sessionId": SESSION_ID, - "application": { - "applicationId": APPLICATION_ID - }, - "attributes": { - "supportedHoroscopePeriods": { - "daily": True, - "weekly": False, - "monthly": False - } - }, - "user": { - "userId": "amzn1.account.AM3B00000000000000000000000" + +@asyncio.coroutine +def test_intent_session_ended_request(alexa_client): + """Test the request for ending the session.""" + data = { + "version": "1.0", + "session": { + "new": False, + "sessionId": SESSION_ID, + "application": { + "applicationId": APPLICATION_ID + }, + "attributes": { + "supportedHoroscopePeriods": { + "daily": True, + "weekly": False, + "monthly": False } }, - "request": { - "type": "SessionEndedRequest", - "requestId": REQUEST_ID, - "timestamp": "2015-05-13T12:34:56Z", - "reason": "USER_INITIATED" + "user": { + "userId": "amzn1.account.AM3B00000000000000000000000" } + }, + "request": { + "type": "SessionEndedRequest", + "requestId": REQUEST_ID, + "timestamp": "2015-05-13T12:34:56Z", + "reason": "USER_INITIATED" } + } - req = _intent_req(data) - self.assertEqual(200, req.status_code) - self.assertEqual("", req.text) + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + text = yield from req.text() + assert text == '' - def test_intent_from_built_in_intent_library(self): - """Test intents from the Built-in Intent Library.""" - data = { - 'request': { - 'intent': { - 'name': 'AMAZON.PlaybackAction', - 'slots': { - 'object.byArtist.name': { - 'name': 'object.byArtist.name', - 'value': 'the shins' - }, - 'object.composer.name': { - 'name': 'object.composer.name' - }, - 'object.contentSource': { - 'name': 'object.contentSource' - }, - 'object.era': { - 'name': 'object.era' - }, - 'object.genre': { - 'name': 'object.genre' - }, - 'object.name': { - 'name': 'object.name' - }, - 'object.owner.name': { - 'name': 'object.owner.name' - }, - 'object.select': { - 'name': 'object.select' - }, - 'object.sort': { - 'name': 'object.sort' - }, - 'object.type': { - 'name': 'object.type', - 'value': 'music' - } + +@asyncio.coroutine +def test_intent_from_built_in_intent_library(alexa_client): + """Test intents from the Built-in Intent Library.""" + data = { + 'request': { + 'intent': { + 'name': 'AMAZON.PlaybackAction', + 'slots': { + 'object.byArtist.name': { + 'name': 'object.byArtist.name', + 'value': 'the shins' + }, + 'object.composer.name': { + 'name': 'object.composer.name' + }, + 'object.contentSource': { + 'name': 'object.contentSource' + }, + 'object.era': { + 'name': 'object.era' + }, + 'object.genre': { + 'name': 'object.genre' + }, + 'object.name': { + 'name': 'object.name' + }, + 'object.owner.name': { + 'name': 'object.owner.name' + }, + 'object.select': { + 'name': 'object.select' + }, + 'object.sort': { + 'name': 'object.sort' + }, + 'object.type': { + 'name': 'object.type', + 'value': 'music' } - }, - 'timestamp': '2016-12-14T23:23:37Z', - 'type': 'IntentRequest', - 'requestId': REQUEST_ID, - - }, - 'session': { - 'sessionId': SESSION_ID, - 'application': { - 'applicationId': APPLICATION_ID } + }, + 'timestamp': '2016-12-14T23:23:37Z', + 'type': 'IntentRequest', + 'requestId': REQUEST_ID, + + }, + 'session': { + 'sessionId': SESSION_ID, + 'application': { + 'applicationId': APPLICATION_ID } } - req = _intent_req(data) - self.assertEqual(200, req.status_code) - text = req.json().get("response", {}).get("outputSpeech", - {}).get("text") - self.assertEqual("Playing the shins.", text) + } + req = yield from _intent_req(alexa_client, data) + assert req.status == 200 + data = yield from req.json() + text = data.get("response", {}).get("outputSpeech", + {}).get("text") + assert text == "Playing the shins." - def test_flash_briefing_invalid_id(self): - """Test an invalid Flash Briefing ID.""" - req = _flash_briefing_req() - self.assertEqual(404, req.status_code) - self.assertEqual("", req.text) - def test_flash_briefing_date_from_str(self): - """Test the response has a valid date parsed from string.""" - req = _flash_briefing_req("weather") - self.assertEqual(200, req.status_code) - self.assertEqual(req.json()[0].get(alexa.ATTR_UPDATE_DATE), - "2016-10-09T19:51:42.0Z") +@asyncio.coroutine +def test_flash_briefing_invalid_id(alexa_client): + """Test an invalid Flash Briefing ID.""" + req = yield from _flash_briefing_req(alexa_client, 10000) + assert req.status == 404 + text = yield from req.text() + assert text == '' - def test_flash_briefing_date_from_datetime(self): - """Test the response has a valid date from a datetime object.""" - req = _flash_briefing_req("weather") - self.assertEqual(200, req.status_code) - self.assertEqual(req.json()[1].get(alexa.ATTR_UPDATE_DATE), - '2016-10-10T19:51:42.0Z') - def test_flash_briefing_valid(self): - """Test the response is valid.""" - data = [{ - "titleText": "NPR", - "redirectionURL": "https://npr.org", - "streamUrl": NPR_NEWS_MP3_URL, - "mainText": "", - "uid": "uuid", - "updateDate": '2016-10-10T19:51:42.0Z' - }] +@asyncio.coroutine +def test_flash_briefing_date_from_str(alexa_client): + """Test the response has a valid date parsed from string.""" + req = yield from _flash_briefing_req(alexa_client, "weather") + assert req.status == 200 + data = yield from req.json() + assert data[0].get(alexa.ATTR_UPDATE_DATE) == "2016-10-09T19:51:42.0Z" - req = _flash_briefing_req("news_audio") - self.assertEqual(200, req.status_code) - response = req.json() - self.assertEqual(response, data) + +@asyncio.coroutine +def test_flash_briefing_date_from_datetime(alexa_client): + """Test the response has a valid date from a datetime object.""" + req = yield from _flash_briefing_req(alexa_client, "weather") + assert req.status == 200 + data = yield from req.json() + assert data[1].get(alexa.ATTR_UPDATE_DATE) == '2016-10-10T19:51:42.0Z' + + +@asyncio.coroutine +def test_flash_briefing_valid(alexa_client): + """Test the response is valid.""" + data = [{ + "titleText": "NPR", + "redirectionURL": "https://npr.org", + "streamUrl": NPR_NEWS_MP3_URL, + "mainText": "", + "uid": "uuid", + "updateDate": '2016-10-10T19:51:42.0Z' + }] + + req = yield from _flash_briefing_req(alexa_client, "news_audio") + assert req.status == 200 + json = yield from req.json() + assert json == data From ead00e956f758a73b86b384c23ee0abbd7f2f0fd Mon Sep 17 00:00:00 2001 From: Johan Bloemberg Date: Thu, 30 Mar 2017 07:50:32 +0200 Subject: [PATCH 047/116] Handle initial event after entity is instantiated. (#6760) --- homeassistant/components/light/rflink.py | 4 ++-- homeassistant/components/sensor/rflink.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/light/rflink.py b/homeassistant/components/light/rflink.py index ad25ae6a38d..a36a4f43f22 100644 --- a/homeassistant/components/light/rflink.py +++ b/homeassistant/components/light/rflink.py @@ -162,8 +162,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): hass.data[DATA_ENTITY_LOOKUP][ EVENT_KEY_COMMAND][device_id].append(device) - # Make sure the event is processed by the new entity - device.handle_event(event) + # Schedule task to process event after entity is created + hass.async_add_job(device.handle_event, event) hass.data[DATA_DEVICE_REGISTER][EVENT_KEY_COMMAND] = add_new_device diff --git a/homeassistant/components/sensor/rflink.py b/homeassistant/components/sensor/rflink.py index 8f8ae769d0e..80a5b7dfb8d 100644 --- a/homeassistant/components/sensor/rflink.py +++ b/homeassistant/components/sensor/rflink.py @@ -88,8 +88,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): hass.data[DATA_ENTITY_LOOKUP][ EVENT_KEY_SENSOR][device_id].append(device) - # Make sure the event is processed by the new entity - device.handle_event(event) + # Schedule task to process event after entity is created + hass.async_add_job(device.handle_event, event) hass.data[DATA_DEVICE_REGISTER][EVENT_KEY_SENSOR] = add_new_device From 7b83a836f3975b13f1931d8a061d5934a3811cff Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Thu, 30 Mar 2017 08:00:22 +0200 Subject: [PATCH 048/116] Lifx legacy (#6847) * Add legacy LIFX platform for Windows support The async platform introduced in 9ef084d9034351a7aa26480d0604aad9857dbbc7 has turned out to use Python functionality that is not available in Windows. This commit restores the previous implementation, now named lifx_legacy. * Add a comment about the platform being a legacy implementation * Warn when using unsupported lifx platform on Windows * Update .coveragerc --- .coveragerc | 1 + homeassistant/components/light/lifx.py | 5 + homeassistant/components/light/lifx_legacy.py | 280 ++++++++++++++++++ requirements_all.txt | 3 + 4 files changed, 289 insertions(+) create mode 100644 homeassistant/components/light/lifx_legacy.py diff --git a/.coveragerc b/.coveragerc index c6bf3d197ae..52b88444dc6 100644 --- a/.coveragerc +++ b/.coveragerc @@ -225,6 +225,7 @@ omit = homeassistant/components/light/hue.py homeassistant/components/light/hyperion.py homeassistant/components/light/lifx.py + homeassistant/components/light/lifx_legacy.py homeassistant/components/light/limitlessled.py homeassistant/components/light/osramlightify.py homeassistant/components/light/tikteck.py diff --git a/homeassistant/components/light/lifx.py b/homeassistant/components/light/lifx.py index 990fc2acc1f..d3b084b3b94 100644 --- a/homeassistant/components/light/lifx.py +++ b/homeassistant/components/light/lifx.py @@ -7,6 +7,7 @@ https://home-assistant.io/components/light.lifx/ import colorsys import logging import asyncio +import sys from functools import partial from datetime import timedelta @@ -51,6 +52,10 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup the LIFX platform.""" import aiolifx + if sys.platform == 'win32': + _LOGGER.warning('The lifx platform is known to not work on Windows. ' + 'Consider using the lifx_legacy platform instead.') + server_addr = config.get(CONF_SERVER) lifx_manager = LIFXManager(hass, async_add_devices) diff --git a/homeassistant/components/light/lifx_legacy.py b/homeassistant/components/light/lifx_legacy.py new file mode 100644 index 00000000000..8a81c992a13 --- /dev/null +++ b/homeassistant/components/light/lifx_legacy.py @@ -0,0 +1,280 @@ +""" +Support for the LIFX platform that implements lights. + +This is a legacy platform, included because the current lifx platform does +not yet support Windows. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/light.lifx/ +""" +import colorsys +import logging + +import voluptuous as vol + +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_RGB_COLOR, ATTR_TRANSITION, + SUPPORT_BRIGHTNESS, SUPPORT_COLOR_TEMP, SUPPORT_RGB_COLOR, + SUPPORT_TRANSITION, Light, PLATFORM_SCHEMA) +from homeassistant.helpers.event import track_time_change +from homeassistant.util.color import ( + color_temperature_mired_to_kelvin, color_temperature_kelvin_to_mired) +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['liffylights==0.9.4'] + +BYTE_MAX = 255 + +CONF_BROADCAST = 'broadcast' +CONF_SERVER = 'server' + +SHORT_MAX = 65535 + +TEMP_MAX = 9000 +TEMP_MAX_HASS = 500 +TEMP_MIN = 2500 +TEMP_MIN_HASS = 154 + +SUPPORT_LIFX = (SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP | SUPPORT_RGB_COLOR | + SUPPORT_TRANSITION) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_SERVER, default=None): cv.string, + vol.Optional(CONF_BROADCAST, default=None): cv.string, +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the LIFX platform.""" + server_addr = config.get(CONF_SERVER) + broadcast_addr = config.get(CONF_BROADCAST) + + lifx_library = LIFX(add_devices, server_addr, broadcast_addr) + + # Register our poll service + track_time_change(hass, lifx_library.poll, second=[10, 40]) + + lifx_library.probe() + + +class LIFX(object): + """Representation of a LIFX light.""" + + def __init__(self, add_devices_callback, server_addr=None, + broadcast_addr=None): + """Initialize the light.""" + import liffylights + + self._devices = [] + + self._add_devices_callback = add_devices_callback + + self._liffylights = liffylights.LiffyLights( + self.on_device, self.on_power, self.on_color, server_addr, + broadcast_addr) + + def find_bulb(self, ipaddr): + """Search for bulbs.""" + bulb = None + for device in self._devices: + if device.ipaddr == ipaddr: + bulb = device + break + return bulb + + def on_device(self, ipaddr, name, power, hue, sat, bri, kel): + """Initialize the light.""" + bulb = self.find_bulb(ipaddr) + + if bulb is None: + _LOGGER.debug("new bulb %s %s %d %d %d %d %d", + ipaddr, name, power, hue, sat, bri, kel) + bulb = LIFXLight( + self._liffylights, ipaddr, name, power, hue, sat, bri, kel) + self._devices.append(bulb) + self._add_devices_callback([bulb]) + else: + _LOGGER.debug("update bulb %s %s %d %d %d %d %d", + ipaddr, name, power, hue, sat, bri, kel) + bulb.set_power(power) + bulb.set_color(hue, sat, bri, kel) + bulb.schedule_update_ha_state() + + def on_color(self, ipaddr, hue, sat, bri, kel): + """Initialize the light.""" + bulb = self.find_bulb(ipaddr) + + if bulb is not None: + bulb.set_color(hue, sat, bri, kel) + bulb.schedule_update_ha_state() + + def on_power(self, ipaddr, power): + """Initialize the light.""" + bulb = self.find_bulb(ipaddr) + + if bulb is not None: + bulb.set_power(power) + bulb.schedule_update_ha_state() + + # pylint: disable=unused-argument + def poll(self, now): + """Polling for the light.""" + self.probe() + + def probe(self, address=None): + """Probe the light.""" + self._liffylights.probe(address) + + +def convert_rgb_to_hsv(rgb): + """Convert Home Assistant RGB values to HSV values.""" + red, green, blue = [_ / BYTE_MAX for _ in rgb] + + hue, saturation, brightness = colorsys.rgb_to_hsv(red, green, blue) + + return [int(hue * SHORT_MAX), + int(saturation * SHORT_MAX), + int(brightness * SHORT_MAX)] + + +class LIFXLight(Light): + """Representation of a LIFX light.""" + + def __init__(self, liffy, ipaddr, name, power, hue, saturation, brightness, + kelvin): + """Initialize the light.""" + _LOGGER.debug("LIFXLight: %s %s", ipaddr, name) + + self._liffylights = liffy + self._ip = ipaddr + self.set_name(name) + self.set_power(power) + self.set_color(hue, saturation, brightness, kelvin) + + @property + def should_poll(self): + """No polling needed for LIFX light.""" + return False + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def ipaddr(self): + """Return the IP address of the device.""" + return self._ip + + @property + def rgb_color(self): + """Return the RGB value.""" + _LOGGER.debug( + "rgb_color: [%d %d %d]", self._rgb[0], self._rgb[1], self._rgb[2]) + return self._rgb + + @property + def brightness(self): + """Return the brightness of this light between 0..255.""" + brightness = int(self._bri / (BYTE_MAX + 1)) + _LOGGER.debug("brightness: %d", brightness) + return brightness + + @property + def color_temp(self): + """Return the color temperature.""" + temperature = color_temperature_kelvin_to_mired(self._kel) + + _LOGGER.debug("color_temp: %d", temperature) + return temperature + + @property + def is_on(self): + """Return true if device is on.""" + _LOGGER.debug("is_on: %d", self._power) + return self._power != 0 + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_LIFX + + def turn_on(self, **kwargs): + """Turn the device on.""" + if ATTR_TRANSITION in kwargs: + fade = int(kwargs[ATTR_TRANSITION] * 1000) + else: + fade = 0 + + if ATTR_RGB_COLOR in kwargs: + hue, saturation, brightness = \ + convert_rgb_to_hsv(kwargs[ATTR_RGB_COLOR]) + else: + hue = self._hue + saturation = self._sat + brightness = self._bri + + if ATTR_BRIGHTNESS in kwargs: + brightness = kwargs[ATTR_BRIGHTNESS] * (BYTE_MAX + 1) + else: + brightness = self._bri + + if ATTR_COLOR_TEMP in kwargs: + kelvin = int(color_temperature_mired_to_kelvin( + kwargs[ATTR_COLOR_TEMP])) + else: + kelvin = self._kel + + _LOGGER.debug("turn_on: %s (%d) %d %d %d %d %d", + self._ip, self._power, + hue, saturation, brightness, kelvin, fade) + + if self._power == 0: + self._liffylights.set_color(self._ip, hue, saturation, + brightness, kelvin, 0) + self._liffylights.set_power(self._ip, 65535, fade) + else: + self._liffylights.set_color(self._ip, hue, saturation, + brightness, kelvin, fade) + + def turn_off(self, **kwargs): + """Turn the device off.""" + if ATTR_TRANSITION in kwargs: + fade = int(kwargs[ATTR_TRANSITION] * 1000) + else: + fade = 0 + + _LOGGER.debug("turn_off: %s %d", self._ip, fade) + self._liffylights.set_power(self._ip, 0, fade) + + def set_name(self, name): + """Set name of the light.""" + self._name = name + + def set_power(self, power): + """Set power state value.""" + _LOGGER.debug("set_power: %d", power) + self._power = (power != 0) + + def set_color(self, hue, sat, bri, kel): + """Set color state values.""" + self._hue = hue + self._sat = sat + self._bri = bri + self._kel = kel + + red, green, blue = colorsys.hsv_to_rgb(hue / SHORT_MAX, + sat / SHORT_MAX, + bri / SHORT_MAX) + + red = int(red * BYTE_MAX) + green = int(green * BYTE_MAX) + blue = int(blue * BYTE_MAX) + + _LOGGER.debug("set_color: %d %d %d %d [%d %d %d]", + hue, sat, bri, kel, red, green, blue) + + self._rgb = [red, green, blue] diff --git a/requirements_all.txt b/requirements_all.txt index 2c3301671a3..d97e830874c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -347,6 +347,9 @@ libnacl==1.5.0 # homeassistant.components.media_player.soundtouch libsoundtouch==0.1.0 +# homeassistant.components.light.lifx_legacy +liffylights==0.9.4 + # homeassistant.components.light.limitlessled limitlessled==1.0.5 From 714b5161767bc426f261835b4fc06519435076e3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 30 Mar 2017 00:50:53 -0700 Subject: [PATCH 049/116] aiohttp 2 (#6835) * Upgrade aiohttp2 * Fix resource caching * Fix helpers.aiohttp_client * Lint * Use static path for api error_log * Fix ClientErrors import * Remove not needed DisconnectError * Remove releasing responses code * Add timeout if stream starts non responding * More async_aiohttp_proxy_stream cleanup * Fix references to ClientError * Fix fingerprinting * Fix aiohttp stream tests * Rename aiohttp_proxy_stream * Remove impossible darksky test * Fix sleepiq requests escaping mocker * Lint * Remove deprecated parameter * Break up aiohttp_proxy_stream in 2 methods * Lint * Upgrade to aiohttp 2.0.4 * Convert connector close to a callback * Fix static fingerprinted links --- homeassistant/components/api.py | 18 +-- homeassistant/components/camera/__init__.py | 7 +- homeassistant/components/camera/amcrest.py | 4 +- homeassistant/components/camera/ffmpeg.py | 30 ++--- homeassistant/components/camera/generic.py | 8 +- homeassistant/components/camera/mjpeg.py | 12 +- homeassistant/components/camera/synology.py | 26 ++-- .../components/device_tracker/__init__.py | 7 +- .../components/device_tracker/tado.py | 8 +- .../components/device_tracker/upc_connect.py | 23 +--- homeassistant/components/frontend/__init__.py | 2 +- homeassistant/components/http/__init__.py | 53 ++++---- homeassistant/components/http/static.py | 63 ++++++---- .../image_processing/openalpr_cloud.py | 8 +- .../components/media_player/__init__.py | 12 +- .../components/media_player/squeezebox.py | 14 +-- .../components/media_player/volumio.py | 8 +- homeassistant/components/microsoft_face.py | 21 ++-- homeassistant/components/rest_command.py | 15 +-- homeassistant/components/sensor/yr.py | 11 +- homeassistant/components/switch/hook.py | 25 +--- homeassistant/components/switch/rest.py | 29 ++--- homeassistant/components/tts/google.py | 7 +- homeassistant/components/tts/voicerss.py | 7 +- homeassistant/components/tts/yandextts.py | 8 +- homeassistant/helpers/aiohttp_client.py | 56 +++++---- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- tests/components/sensor/test_darksky.py | 11 +- tests/components/switch/test_rest.py | 2 +- tests/components/test_api.py | 19 --- tests/components/test_frontend.py | 116 ++++++++---------- tests/components/test_rest_command.py | 2 +- tests/components/test_sleepiq.py | 10 +- tests/helpers/test_aiohttp_client.py | 44 ++----- 36 files changed, 250 insertions(+), 442 deletions(-) diff --git a/homeassistant/components/api.py b/homeassistant/components/api.py index 1af85605874..b22bd851190 100644 --- a/homeassistant/components/api.py +++ b/homeassistant/components/api.py @@ -50,9 +50,11 @@ def setup(hass, config): hass.http.register_view(APIDomainServicesView) hass.http.register_view(APIEventForwardingView) hass.http.register_view(APIComponentsView) - hass.http.register_view(APIErrorLogView) hass.http.register_view(APITemplateView) + hass.http.register_static_path( + URL_API_ERROR_LOG, hass.config.path(ERROR_LOG_FILENAME), False) + return True @@ -402,20 +404,6 @@ class APIComponentsView(HomeAssistantView): return self.json(request.app['hass'].config.components) -class APIErrorLogView(HomeAssistantView): - """View to handle ErrorLog requests.""" - - url = URL_API_ERROR_LOG - name = "api:error-log" - - @asyncio.coroutine - def get(self, request): - """Serve error log.""" - resp = yield from self.file( - request, request.app['hass'].config.path(ERROR_LOG_FILENAME)) - return resp - - class APITemplateView(HomeAssistantView): """View to handle requests.""" diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index b531a931a7a..d3c6699f77c 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -58,7 +58,6 @@ def async_get_image(hass, entity_id, timeout=10): state.attributes.get(ATTR_ENTITY_PICTURE) ) - response = None try: with async_timeout.timeout(timeout, loop=hass.loop): response = yield from websession.get(url) @@ -70,13 +69,9 @@ def async_get_image(hass, entity_id, timeout=10): image = yield from response.read() return image - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): raise HomeAssistantError("Can't connect to {0}".format(url)) - finally: - if response is not None: - yield from response.release() - @asyncio.coroutine def async_setup(hass, config): diff --git a/homeassistant/components/camera/amcrest.py b/homeassistant/components/camera/amcrest.py index f272dda4bb3..9bf89b8b3a5 100644 --- a/homeassistant/components/camera/amcrest.py +++ b/homeassistant/components/camera/amcrest.py @@ -16,7 +16,7 @@ from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_PORT) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import ( - async_get_clientsession, async_aiohttp_proxy_stream) + async_get_clientsession, async_aiohttp_proxy_web) REQUIREMENTS = ['amcrest==1.1.4'] @@ -125,7 +125,7 @@ class AmcrestCam(Camera): stream_coro = websession.get( streaming_url, auth=self._token, timeout=TIMEOUT) - yield from async_aiohttp_proxy_stream(self.hass, request, stream_coro) + yield from async_aiohttp_proxy_web(self.hass, request, stream_coro) @property def name(self): diff --git a/homeassistant/components/camera/ffmpeg.py b/homeassistant/components/camera/ffmpeg.py index ed8c84f90df..d4c7b54fc7f 100644 --- a/homeassistant/components/camera/ffmpeg.py +++ b/homeassistant/components/camera/ffmpeg.py @@ -8,14 +8,14 @@ import asyncio import logging import voluptuous as vol -from aiohttp import web +from homeassistant.const import CONF_NAME from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.components.ffmpeg import ( DATA_FFMPEG, CONF_INPUT, CONF_EXTRA_ARGUMENTS) import homeassistant.helpers.config_validation as cv -from homeassistant.const import CONF_NAME - +from homeassistant.helpers.aiohttp_client import ( + async_aiohttp_proxy_stream) DEPENDENCIES = ['ffmpeg'] _LOGGER = logging.getLogger(__name__) @@ -69,26 +69,10 @@ class FFmpegCamera(Camera): yield from stream.open_camera( self._input, extra_cmd=self._extra_arguments) - response = web.StreamResponse() - response.content_type = 'multipart/x-mixed-replace;boundary=ffserver' - - yield from response.prepare(request) - - try: - while True: - data = yield from stream.read(102400) - if not data: - break - response.write(data) - - except asyncio.CancelledError: - _LOGGER.debug("Close stream by frontend.") - response = None - - finally: - yield from stream.close() - if response is not None: - yield from response.write_eof() + yield from async_aiohttp_proxy_stream( + self.hass, request, stream, + 'multipart/x-mixed-replace;boundary=ffserver') + yield from stream.close() @property def name(self): diff --git a/homeassistant/components/camera/generic.py b/homeassistant/components/camera/generic.py index 3f50bc799c4..a330836f32b 100644 --- a/homeassistant/components/camera/generic.py +++ b/homeassistant/components/camera/generic.py @@ -107,7 +107,6 @@ class GenericCamera(Camera): None, fetch) # async else: - response = None try: websession = async_get_clientsession(self.hass) with async_timeout.timeout(10, loop=self.hass.loop): @@ -117,14 +116,9 @@ class GenericCamera(Camera): except asyncio.TimeoutError: _LOGGER.error('Timeout getting camera image') return self._last_image - except (aiohttp.errors.ClientError, - aiohttp.errors.DisconnectedError, - aiohttp.errors.HttpProcessingError) as err: + except aiohttp.ClientError as err: _LOGGER.error('Error getting new camera image: %s', err) return self._last_image - finally: - if response is not None: - yield from response.release() self._last_url = url return self._last_image diff --git a/homeassistant/components/camera/mjpeg.py b/homeassistant/components/camera/mjpeg.py index 532b91e7442..a158c36152e 100644 --- a/homeassistant/components/camera/mjpeg.py +++ b/homeassistant/components/camera/mjpeg.py @@ -19,7 +19,7 @@ from homeassistant.const import ( HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION) from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera) from homeassistant.helpers.aiohttp_client import ( - async_get_clientsession, async_aiohttp_proxy_stream) + async_get_clientsession, async_aiohttp_proxy_web) from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -93,7 +93,6 @@ class MjpegCamera(Camera): return image websession = async_get_clientsession(self.hass) - response = None try: with async_timeout.timeout(10, loop=self.hass.loop): response = yield from websession.get( @@ -105,14 +104,9 @@ class MjpegCamera(Camera): except asyncio.TimeoutError: _LOGGER.error('Timeout getting camera image') - except (aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as err: + except aiohttp.ClientError as err: _LOGGER.error('Error getting new camera image: %s', err) - finally: - if response is not None: - yield from response.release() - def camera_image(self): """Return a still image response from the camera.""" if self._username and self._password: @@ -140,7 +134,7 @@ class MjpegCamera(Camera): websession = async_get_clientsession(self.hass) stream_coro = websession.get(self._mjpeg_url, auth=self._auth) - yield from async_aiohttp_proxy_stream(self.hass, request, stream_coro) + yield from async_aiohttp_proxy_web(self.hass, request, stream_coro) @property def name(self): diff --git a/homeassistant/components/camera/synology.py b/homeassistant/components/camera/synology.py index 2b4d72f92f8..e986d81887b 100644 --- a/homeassistant/components/camera/synology.py +++ b/homeassistant/components/camera/synology.py @@ -19,7 +19,7 @@ from homeassistant.components.camera import ( Camera, PLATFORM_SCHEMA) from homeassistant.helpers.aiohttp_client import ( async_get_clientsession, async_create_clientsession, - async_aiohttp_proxy_stream) + async_aiohttp_proxy_web) import homeassistant.helpers.config_validation as cv from homeassistant.util.async import run_coroutine_threadsafe @@ -74,7 +74,6 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): 'version': '1', 'query': 'SYNO.' } - query_req = None try: with async_timeout.timeout(timeout, loop=hass.loop): query_req = yield from websession_init.get( @@ -88,14 +87,10 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): camera_path = query_resp['data'][CAMERA_API]['path'] streaming_path = query_resp['data'][STREAMING_API]['path'] - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.exception("Error on %s", syno_api_url) return False - finally: - if query_req is not None: - yield from query_req.release() - # Authticate to NAS to get a session id syno_auth_url = SYNO_API_URL.format( config.get(CONF_URL), WEBAPI_PATH, auth_path) @@ -128,13 +123,12 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): syno_camera_url, params=camera_payload ) - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.exception("Error on %s", syno_camera_url) return False camera_resp = yield from camera_req.json() cameras = camera_resp['data']['cameras'] - yield from camera_req.release() # add cameras devices = [] @@ -172,7 +166,6 @@ def get_session_id(hass, websession, username, password, login_url, timeout): 'session': 'SurveillanceStation', 'format': 'sid' } - auth_req = None try: with async_timeout.timeout(timeout, loop=hass.loop): auth_req = yield from websession.get( @@ -182,14 +175,10 @@ def get_session_id(hass, websession, username, password, login_url, timeout): auth_resp = yield from auth_req.json() return auth_resp['data']['sid'] - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.exception("Error on %s", login_url) return False - finally: - if auth_req is not None: - yield from auth_req.release() - class SynologyCamera(Camera): """An implementation of a Synology NAS based IP camera.""" @@ -235,12 +224,11 @@ class SynologyCamera(Camera): image_url, params=image_payload ) - except (asyncio.TimeoutError, aiohttp.errors.ClientError): - _LOGGER.exception("Error on %s", image_url) + except (asyncio.TimeoutError, aiohttp.ClientError): + _LOGGER.error("Error fetching %s", image_url) return None image = yield from response.read() - yield from response.release() return image @@ -260,7 +248,7 @@ class SynologyCamera(Camera): stream_coro = self._websession.get( streaming_url, params=streaming_payload) - yield from async_aiohttp_proxy_stream(self.hass, request, stream_coro) + yield from async_aiohttp_proxy_web(self.hass, request, stream_coro) @property def name(self): diff --git a/homeassistant/components/device_tracker/__init__.py b/homeassistant/components/device_tracker/__init__.py index 3e04f46cb50..f2a538507a0 100644 --- a/homeassistant/components/device_tracker/__init__.py +++ b/homeassistant/components/device_tracker/__init__.py @@ -553,7 +553,6 @@ class Device(Entity): # bytes like 00 get truncates to 0, API needs full bytes oui = '{:02x}:{:02x}:{:02x}'.format(*[int(b, 16) for b in oui_bytes]) url = 'http://api.macvendors.com/' + oui - resp = None try: websession = async_get_clientsession(self.hass) @@ -570,13 +569,9 @@ class Device(Entity): # in the 'known_devices.yaml' file which only happens # the first time the device is seen. return 'unknown' - except (asyncio.TimeoutError, aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError): + except (asyncio.TimeoutError, aiohttp.ClientError): # same as above return 'unknown' - finally: - if resp is not None: - yield from resp.release() @asyncio.coroutine def async_added_to_hass(self): diff --git a/homeassistant/components/device_tracker/tado.py b/homeassistant/components/device_tracker/tado.py index ca0bec29706..3c21037d028 100644 --- a/homeassistant/components/device_tracker/tado.py +++ b/homeassistant/components/device_tracker/tado.py @@ -105,8 +105,6 @@ class TadoDeviceScanner(DeviceScanner): _LOGGER.debug("Requesting Tado") last_results = [] - response = None - tado_json = None try: with async_timeout.timeout(10, loop=self.hass.loop): @@ -127,14 +125,10 @@ class TadoDeviceScanner(DeviceScanner): tado_json = yield from response.json() - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Cannot load Tado data") return False - finally: - if response is not None: - yield from response.release() - # Without a home_id, we fetched an URL where the mobile devices can be # found under the mobileDevices key. if 'mobileDevices' in tado_json: diff --git a/homeassistant/components/device_tracker/upc_connect.py b/homeassistant/components/device_tracker/upc_connect.py index 879a645fe30..cec00221aaf 100644 --- a/homeassistant/components/device_tracker/upc_connect.py +++ b/homeassistant/components/device_tracker/upc_connect.py @@ -101,7 +101,6 @@ class UPCDeviceScanner(DeviceScanner): @asyncio.coroutine def async_login(self): """Login into firmware and get first token.""" - response = None try: # get first token with async_timeout.timeout(10, loop=self.hass.loop): @@ -109,7 +108,8 @@ class UPCDeviceScanner(DeviceScanner): "http://{}/common_page/login.html".format(self.host) ) - yield from response.text() + yield from response.text() + self.token = response.cookies['sessionToken'].value # login @@ -119,18 +119,12 @@ class UPCDeviceScanner(DeviceScanner): }) # successfull? - if data is not None: - return True - return False + return data is not None - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Can not load login page from %s", self.host) return False - finally: - if response is not None: - yield from response.release() - @asyncio.coroutine def _async_ws_function(self, function, additional_form=None): """Execute a command on UPC firmware webservice.""" @@ -142,8 +136,7 @@ class UPCDeviceScanner(DeviceScanner): if additional_form: form_data.update(additional_form) - redirects = True if function != CMD_DEVICES else False - response = None + redirects = function != CMD_DEVICES try: with async_timeout.timeout(10, loop=self.hass.loop): response = yield from self.websession.post( @@ -163,10 +156,6 @@ class UPCDeviceScanner(DeviceScanner): self.token = response.cookies['sessionToken'].value return (yield from response.text()) - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Error on %s", function) self.token = None - - finally: - if response is not None: - yield from response.release() diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 7d95cfb20fe..b6f65d9953a 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -153,7 +153,7 @@ def setup(hass, config): sw_path = "service_worker.js" hass.http.register_static_path("/service_worker.js", - os.path.join(STATIC_PATH, sw_path), 0) + os.path.join(STATIC_PATH, sw_path), False) hass.http.register_static_path("/robots.txt", os.path.join(STATIC_PATH, "robots.txt")) hass.http.register_static_path("/static", STATIC_PATH) diff --git a/homeassistant/components/http/__init__.py b/homeassistant/components/http/__init__.py index d6e03e76619..f99b2390bb8 100644 --- a/homeassistant/components/http/__init__.py +++ b/homeassistant/components/http/__init__.py @@ -9,7 +9,6 @@ import json import logging import ssl from ipaddress import ip_network -from pathlib import Path import os import voluptuous as vol @@ -31,7 +30,8 @@ from .const import ( KEY_USE_X_FORWARDED_FOR, KEY_TRUSTED_NETWORKS, KEY_BANS_ENABLED, KEY_LOGIN_THRESHOLD, KEY_DEVELOPMENT, KEY_AUTHENTICATED) -from .static import FILE_SENDER, CACHING_FILE_SENDER, staticresource_middleware +from .static import ( + staticresource_middleware, CachingFileResponse, CachingStaticResource) from .util import get_real_ip DOMAIN = 'http' @@ -187,7 +187,7 @@ class HomeAssistantWSGI(object): if is_ban_enabled: middlewares.insert(0, ban_middleware) - self.app = web.Application(middlewares=middlewares, loop=hass.loop) + self.app = web.Application(middlewares=middlewares) self.app['hass'] = hass self.app[KEY_USE_X_FORWARDED_FOR] = use_x_forwarded_for self.app[KEY_TRUSTED_NETWORKS] = trusted_networks @@ -255,31 +255,39 @@ class HomeAssistantWSGI(object): self.app.router.add_route('GET', url, redirect) - def register_static_path(self, url_root, path, cache_length=31): - """Register a folder to serve as a static path. - - Specify optional cache length of asset in days. - """ + def register_static_path(self, url_path, path, cache_headers=True): + """Register a folder or file to serve as a static path.""" if os.path.isdir(path): - self.app.router.add_static(url_root, path) + if cache_headers: + resource = CachingStaticResource + else: + resource = web.StaticResource + + self.app.router.register_resource(resource(url_path, path)) return - filepath = Path(path) - - @asyncio.coroutine - def serve_file(request): - """Serve file from disk.""" - res = yield from CACHING_FILE_SENDER.send(request, filepath) - return res + if cache_headers: + @asyncio.coroutine + def serve_file(request): + """Serve file from disk.""" + return CachingFileResponse(path) + else: + @asyncio.coroutine + def serve_file(request): + """Serve file from disk.""" + return web.FileResponse(path) # aiohttp supports regex matching for variables. Using that as temp # to work around cache busting MD5. # Turns something like /static/dev-panel.html into # /static/{filename:dev-panel(-[a-z0-9]{32}|)\.html} - base, ext = url_root.rsplit('.', 1) - base, file = base.rsplit('/', 1) - regex = r"{}(-[a-z0-9]{{32}}|)\.{}".format(file, ext) - url_pattern = "{}/{{filename:{}}}".format(base, regex) + base, ext = os.path.splitext(url_path) + if ext: + base, file = base.rsplit('/', 1) + regex = r"{}(-[a-z0-9]{{32}}|){}".format(file, ext) + url_pattern = "{}/{{filename:{}}}".format(base, regex) + else: + url_pattern = url_path self.app.router.add_route('GET', url_pattern, serve_file) @@ -318,7 +326,7 @@ class HomeAssistantWSGI(object): # re-register all redirects, views, static paths. self.app._frozen = True # pylint: disable=protected-access - self._handler = self.app.make_handler() + self._handler = self.app.make_handler(loop=self.hass.loop) try: self.server = yield from self.hass.loop.create_server( @@ -365,8 +373,7 @@ class HomeAssistantView(object): def file(self, request, fil): """Return a file.""" assert isinstance(fil, str), 'only string paths allowed' - response = yield from FILE_SENDER.send(request, Path(fil)) - return response + return web.FileResponse(fil) def register(self, router): """Register the view with a router.""" diff --git a/homeassistant/components/http/static.py b/homeassistant/components/http/static.py index 6489144ec70..21e955fc968 100644 --- a/homeassistant/components/http/static.py +++ b/homeassistant/components/http/static.py @@ -3,14 +3,45 @@ import asyncio import re from aiohttp import hdrs -from aiohttp.file_sender import FileSender +from aiohttp.web import FileResponse +from aiohttp.web_exceptions import HTTPNotFound from aiohttp.web_urldispatcher import StaticResource +from yarl import unquote + from .const import KEY_DEVELOPMENT _FINGERPRINT = re.compile(r'^(.+)-[a-z0-9]{32}\.(\w+)$', re.IGNORECASE) -class CachingFileSender(FileSender): +class CachingStaticResource(StaticResource): + """Static Resource handler that will add cache headers.""" + + @asyncio.coroutine + def _handle(self, request): + filename = unquote(request.match_info['filename']) + try: + # PyLint is wrong about resolve not being a member. + # pylint: disable=no-member + filepath = self._directory.joinpath(filename).resolve() + if not self._follow_symlinks: + filepath.relative_to(self._directory) + except (ValueError, FileNotFoundError) as error: + # relatively safe + raise HTTPNotFound() from error + except Exception as error: + # perm error or other kind! + request.app.logger.exception(error) + raise HTTPNotFound() from error + + if filepath.is_dir(): + return (yield from super()._handle(request)) + elif filepath.is_file(): + return CachingFileResponse(filepath, chunk_size=self._chunk_size) + else: + raise HTTPNotFound + + +class CachingFileResponse(FileResponse): """FileSender class that caches output if not in dev mode.""" def __init__(self, *args, **kwargs): @@ -20,46 +51,34 @@ class CachingFileSender(FileSender): orig_sendfile = self._sendfile @asyncio.coroutine - def sendfile(request, resp, fobj, count): + def sendfile(request, fobj, count): """Sendfile that includes a cache header.""" if not request.app[KEY_DEVELOPMENT]: cache_time = 31 * 86400 # = 1 month - resp.headers[hdrs.CACHE_CONTROL] = "public, max-age={}".format( + self.headers[hdrs.CACHE_CONTROL] = "public, max-age={}".format( cache_time) - yield from orig_sendfile(request, resp, fobj, count) + yield from orig_sendfile(request, fobj, count) # Overwriting like this because __init__ can change implementation. self._sendfile = sendfile -FILE_SENDER = FileSender() -CACHING_FILE_SENDER = CachingFileSender() - - @asyncio.coroutine def staticresource_middleware(app, handler): - """Enhance StaticResourceHandler middleware. - - Adds gzip encoding and fingerprinting matching. - """ - inst = getattr(handler, '__self__', None) - if not isinstance(inst, StaticResource): - return handler - - # pylint: disable=protected-access - inst._file_sender = CACHING_FILE_SENDER - + """Middleware to strip out fingerprint from fingerprinted assets.""" @asyncio.coroutine def static_middleware_handler(request): """Strip out fingerprints from resource names.""" + if not request.path.startswith('/static/'): + return handler(request) + fingerprinted = _FINGERPRINT.match(request.match_info['filename']) if fingerprinted: request.match_info['filename'] = \ '{}.{}'.format(*fingerprinted.groups()) - resp = yield from handler(request) - return resp + return handler(request) return static_middleware_handler diff --git a/homeassistant/components/image_processing/openalpr_cloud.py b/homeassistant/components/image_processing/openalpr_cloud.py index 7f8bd83116c..1ba8dfcfbc4 100644 --- a/homeassistant/components/image_processing/openalpr_cloud.py +++ b/homeassistant/components/image_processing/openalpr_cloud.py @@ -112,8 +112,6 @@ class OpenAlprCloudEntity(ImageProcessingAlprEntity): params['image_bytes'] = str(b64encode(image), 'utf-8') - data = None - request = None try: with async_timeout.timeout(self.timeout, loop=self.hass.loop): request = yield from websession.post( @@ -127,14 +125,10 @@ class OpenAlprCloudEntity(ImageProcessingAlprEntity): request.status, data.get('error')) return - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Timeout for openalpr api.") return - finally: - if request is not None: - yield from request.release() - # processing api data vehicles = 0 result = {} diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index a603cb9c3e3..511cb8208a5 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -864,21 +864,17 @@ def _async_fetch_image(hass, url): content, content_type = (None, None) websession = async_get_clientsession(hass) - response = None try: with async_timeout.timeout(10, loop=hass.loop): response = yield from websession.get(url) - if response.status == 200: - content = yield from response.read() - content_type = response.headers.get(CONTENT_TYPE_HEADER) + + if response.status == 200: + content = yield from response.read() + content_type = response.headers.get(CONTENT_TYPE_HEADER) except asyncio.TimeoutError: pass - finally: - if response is not None: - yield from response.release() - if not content: return (None, None) diff --git a/homeassistant/components/media_player/squeezebox.py b/homeassistant/components/media_player/squeezebox.py index 6db376aa073..eec8eeb8177 100644 --- a/homeassistant/components/media_player/squeezebox.py +++ b/homeassistant/components/media_player/squeezebox.py @@ -117,7 +117,6 @@ class LogitechMediaServer(object): @asyncio.coroutine def async_query(self, *command, player=""): """Abstract out the JSON-RPC connection.""" - response = None auth = None if self._username is None else aiohttp.BasicAuth( self._username, self._password) url = "http://{}:{}/jsonrpc.js".format( @@ -138,22 +137,17 @@ class LogitechMediaServer(object): data=data, auth=auth) - if response.status == 200: - data = yield from response.json() - else: + if response.status != 200: _LOGGER.error( "Query failed, response code: %s Full message: %s", response.status, response) return False - except (asyncio.TimeoutError, - aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as error: + data = yield from response.json() + + except (asyncio.TimeoutError, aiohttp.ClientError) as error: _LOGGER.error("Failed communicating with LMS: %s", type(error)) return False - finally: - if response is not None: - yield from response.release() try: return data['result'] diff --git a/homeassistant/components/media_player/volumio.py b/homeassistant/components/media_player/volumio.py index bcd4ebd0c11..5944921f94f 100755 --- a/homeassistant/components/media_player/volumio.py +++ b/homeassistant/components/media_player/volumio.py @@ -68,7 +68,6 @@ class Volumio(MediaPlayerDevice): def send_volumio_msg(self, method, params=None): """Send message.""" url = "http://{}:{}/api/v1/{}/".format(self.host, self.port, method) - response = None _LOGGER.debug("URL: %s params: %s", url, params) @@ -83,14 +82,9 @@ class Volumio(MediaPlayerDevice): response.status, response) return False - except (asyncio.TimeoutError, - aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as error: + except (asyncio.TimeoutError, aiohttp.ClientError) as error: _LOGGER.error("Failed communicating with Volumio: %s", type(error)) return False - finally: - if response is not None: - yield from response.release() try: return data diff --git a/homeassistant/components/microsoft_face.py b/homeassistant/components/microsoft_face.py index dc0e9001b24..5d98f04d01e 100644 --- a/homeassistant/components/microsoft_face.py +++ b/homeassistant/components/microsoft_face.py @@ -359,30 +359,25 @@ class MicrosoftFace(object): else: payload = None - response = None try: with async_timeout.timeout(self.timeout, loop=self.hass.loop): response = yield from getattr(self.websession, method)( url, data=payload, headers=headers, params=params) answer = yield from response.json() - _LOGGER.debug("Read from microsoft face api: %s", answer) - if response.status == 200 or response.status == 202: - return answer - _LOGGER.warning("Error %d microsoft face api %s", - response.status, response.url) - raise HomeAssistantError(answer['error']['message']) + _LOGGER.debug("Read from microsoft face api: %s", answer) + if response.status < 300: + return answer - except (aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError): + _LOGGER.warning("Error %d microsoft face api %s", + response.status, response.url) + raise HomeAssistantError(answer['error']['message']) + + except aiohttp.ClientError: _LOGGER.warning("Can't connect to microsoft face api") except asyncio.TimeoutError: _LOGGER.warning("Timeout from microsoft face api %s", response.url) - finally: - if response is not None: - yield from response.release() - raise HomeAssistantError("Network error on microsoft face api.") diff --git a/homeassistant/components/rest_command.py b/homeassistant/components/rest_command.py index abf25981af6..7084339ab42 100644 --- a/homeassistant/components/rest_command.py +++ b/homeassistant/components/rest_command.py @@ -81,7 +81,6 @@ def async_setup(hass, config): template_payload.async_render(variables=service.data), 'utf-8') - request = None try: with async_timeout.timeout(timeout, loop=hass.loop): request = yield from getattr(websession, method)( @@ -90,22 +89,18 @@ def async_setup(hass, config): auth=auth ) - if request.status < 400: - _LOGGER.info("Success call %s.", request.url) - return - + if request.status < 400: + _LOGGER.info("Success call %s.", request.url) + else: _LOGGER.warning( "Error %d on call %s.", request.status, request.url) + except asyncio.TimeoutError: _LOGGER.warning("Timeout call %s.", request.url) - except aiohttp.errors.ClientError: + except aiohttp.ClientError: _LOGGER.error("Client error %s.", request.url) - finally: - if request is not None: - yield from request.release() - # register services hass.services.async_register(DOMAIN, name, async_service_handler) diff --git a/homeassistant/components/sensor/yr.py b/homeassistant/components/sensor/yr.py index 047edd0b994..4306ad68553 100644 --- a/homeassistant/components/sensor/yr.py +++ b/homeassistant/components/sensor/yr.py @@ -151,6 +151,8 @@ class YrData(object): @asyncio.coroutine def async_update(self, *_): """Get the latest data from yr.no.""" + import xmltodict + def try_again(err: str): """Retry in 15 minutes.""" _LOGGER.warning('Retrying in 15 minutes: %s', err) @@ -161,7 +163,6 @@ class YrData(object): nxt) if self._nextrun is None or dt_util.utcnow() >= self._nextrun: - resp = None try: websession = async_get_clientsession(self.hass) with async_timeout.timeout(10, loop=self.hass.loop): @@ -172,17 +173,11 @@ class YrData(object): return text = yield from resp.text() - except (asyncio.TimeoutError, aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as err: + except (asyncio.TimeoutError, aiohttp.ClientError) as err: try_again(err) return - finally: - if resp is not None: - yield from resp.release() - try: - import xmltodict self.data = xmltodict.parse(text)['weatherdata'] model = self.data['meta']['model'] if '@nextrun' not in model: diff --git a/homeassistant/components/switch/hook.py b/homeassistant/components/switch/hook.py index a21d9814768..33b49a24caa 100644 --- a/homeassistant/components/switch/hook.py +++ b/homeassistant/components/switch/hook.py @@ -34,7 +34,6 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): password = config.get(CONF_PASSWORD) websession = async_get_clientsession(hass) - response = None try: with async_timeout.timeout(TIMEOUT, loop=hass.loop): response = yield from websession.post( @@ -43,14 +42,9 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): 'username': username, 'password': password}) data = yield from response.json() - except (asyncio.TimeoutError, - aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as error: + except (asyncio.TimeoutError, aiohttp.ClientError) as error: _LOGGER.error("Failed authentication API call: %s", error) return False - finally: - if response is not None: - yield from response.release() try: token = data['data']['token'] @@ -58,21 +52,15 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): _LOGGER.error("No token. Check username and password") return False - response = None try: with async_timeout.timeout(TIMEOUT, loop=hass.loop): response = yield from websession.get( '{}{}'.format(HOOK_ENDPOINT, 'device'), params={"token": data['data']['token']}) data = yield from response.json() - except (asyncio.TimeoutError, - aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as error: + except (asyncio.TimeoutError, aiohttp.ClientError) as error: _LOGGER.error("Failed getting devices: %s", error) return False - finally: - if response is not None: - yield from response.release() async_add_devices( HookSmartHome( @@ -110,7 +98,6 @@ class HookSmartHome(SwitchDevice): @asyncio.coroutine def _send(self, url): """Send the url to the Hook API.""" - response = None try: _LOGGER.debug("Sending: %s", url) websession = async_get_clientsession(self.hass) @@ -119,16 +106,10 @@ class HookSmartHome(SwitchDevice): url, params={"token": self._token}) data = yield from response.json() - except (asyncio.TimeoutError, - aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError) as error: + except (asyncio.TimeoutError, aiohttp.ClientError) as error: _LOGGER.error("Failed setting state: %s", error) return False - finally: - if response is not None: - yield from response.release() - _LOGGER.debug("Got: %s", data) return data['return_value'] == '1' diff --git a/homeassistant/components/switch/rest.py b/homeassistant/components/switch/rest.py index 74add400850..179b3b24068 100644 --- a/homeassistant/components/switch/rest.py +++ b/homeassistant/components/switch/rest.py @@ -57,20 +57,21 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): body_off.hass = hass timeout = config.get(CONF_TIMEOUT) - req = None try: with async_timeout.timeout(timeout, loop=hass.loop): req = yield from websession.get(resource) + + if req.status >= 400: + _LOGGER.error('Got non-ok response from resource: %s', req.status) + return False + except (TypeError, ValueError): _LOGGER.error("Missing resource or schema in configuration. " "Add http:// or https:// to your URL") return False - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("No route to resource/endpoint: %s", resource) return False - finally: - if req is not None: - yield from req.release() async_add_devices( [RestSwitch(hass, name, resource, body_on, body_off, @@ -108,17 +109,13 @@ class RestSwitch(SwitchDevice): body_on_t = self._body_on.async_render() websession = async_get_clientsession(self.hass) - request = None try: with async_timeout.timeout(self._timeout, loop=self.hass.loop): request = yield from websession.post( self._resource, data=bytes(body_on_t, 'utf-8')) - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Error while turn on %s", self._resource) return - finally: - if request is not None: - yield from request.release() if request.status == 200: self._state = True @@ -132,17 +129,13 @@ class RestSwitch(SwitchDevice): body_off_t = self._body_off.async_render() websession = async_get_clientsession(self.hass) - request = None try: with async_timeout.timeout(self._timeout, loop=self.hass.loop): request = yield from websession.post( self._resource, data=bytes(body_off_t, 'utf-8')) - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Error while turn off %s", self._resource) return - finally: - if request is not None: - yield from request.release() if request.status == 200: self._state = False @@ -155,17 +148,13 @@ class RestSwitch(SwitchDevice): """Get the latest data from REST API and update the state.""" websession = async_get_clientsession(self.hass) - request = None try: with async_timeout.timeout(self._timeout, loop=self.hass.loop): request = yield from websession.get(self._resource) text = yield from request.text() - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.exception("Error while fetch data.") return - finally: - if request is not None: - yield from request.release() if self._is_on_template is not None: text = self._is_on_template.async_render_with_possible_json_value( diff --git a/homeassistant/components/tts/google.py b/homeassistant/components/tts/google.py index be84e0e029b..d433aef8c47 100644 --- a/homeassistant/components/tts/google.py +++ b/homeassistant/components/tts/google.py @@ -95,7 +95,6 @@ class GoogleProvider(Provider): 'textlen': len(part), } - request = None try: with async_timeout.timeout(10, loop=self.hass.loop): request = yield from websession.get( @@ -109,14 +108,10 @@ class GoogleProvider(Provider): return (None, None) data += yield from request.read() - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Timeout for google speech.") return (None, None) - finally: - if request is not None: - yield from request.release() - return ("mp3", data) @staticmethod diff --git a/homeassistant/components/tts/voicerss.py b/homeassistant/components/tts/voicerss.py index ee50cc30cca..e8622d3b9a1 100644 --- a/homeassistant/components/tts/voicerss.py +++ b/homeassistant/components/tts/voicerss.py @@ -123,7 +123,6 @@ class VoiceRSSProvider(Provider): form_data['src'] = message form_data['hl'] = language - request = None try: with async_timeout.timeout(10, loop=self.hass.loop): request = yield from websession.post( @@ -141,12 +140,8 @@ class VoiceRSSProvider(Provider): "Error receive %s from VoiceRSS", str(data, 'utf-8')) return (None, None) - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Timeout for VoiceRSS API") return (None, None) - finally: - if request is not None: - yield from request.release() - return (self._extension, data) diff --git a/homeassistant/components/tts/yandextts.py b/homeassistant/components/tts/yandextts.py index b60f9cab61e..fb95faf1ecf 100644 --- a/homeassistant/components/tts/yandextts.py +++ b/homeassistant/components/tts/yandextts.py @@ -98,10 +98,8 @@ class YandexSpeechKitProvider(Provider): def async_get_tts_audio(self, message, language, options=None): """Load TTS from yandex.""" websession = async_get_clientsession(self.hass) - actual_language = language - request = None try: with async_timeout.timeout(10, loop=self.hass.loop): url_param = { @@ -123,12 +121,8 @@ class YandexSpeechKitProvider(Provider): return (None, None) data = yield from request.read() - except (asyncio.TimeoutError, aiohttp.errors.ClientError): + except (asyncio.TimeoutError, aiohttp.ClientError): _LOGGER.error("Timeout for yandex speech kit api.") return (None, None) - finally: - if request is not None: - yield from request.release() - return (self._codec, data) diff --git a/homeassistant/helpers/aiohttp_client.py b/homeassistant/helpers/aiohttp_client.py index 75755ad3685..8dc64105e8b 100644 --- a/homeassistant/helpers/aiohttp_client.py +++ b/homeassistant/helpers/aiohttp_client.py @@ -5,7 +5,7 @@ import sys import aiohttp from aiohttp.hdrs import USER_AGENT, CONTENT_TYPE from aiohttp import web -from aiohttp.web_exceptions import HTTPGatewayTimeout +from aiohttp.web_exceptions import HTTPGatewayTimeout, HTTPBadGateway import async_timeout from homeassistant.core import callback @@ -71,42 +71,46 @@ def async_create_clientsession(hass, verify_ssl=True, auto_cleanup=True, @asyncio.coroutine -def async_aiohttp_proxy_stream(hass, request, stream_coro, buffer_size=102400, - timeout=10): +def async_aiohttp_proxy_web(hass, request, web_coro, buffer_size=102400, + timeout=10): """Stream websession request to aiohttp web response.""" - response = None - stream = None - try: with async_timeout.timeout(timeout, loop=hass.loop): - stream = yield from stream_coro + req = yield from web_coro - response = web.StreamResponse() - response.content_type = stream.headers.get(CONTENT_TYPE) + except asyncio.TimeoutError as err: + raise HTTPGatewayTimeout() from err - yield from response.prepare(request) + except aiohttp.ClientError as err: + raise HTTPBadGateway() from err + yield from async_aiohttp_proxy_stream(hass, request, req.content, + req.headers.get(CONTENT_TYPE)) + + +@asyncio.coroutine +def async_aiohttp_proxy_stream(hass, request, stream, content_type, + buffer_size=102400, timeout=10): + """Stream a stream to aiohttp web response.""" + response = web.StreamResponse() + response.content_type = content_type + yield from response.prepare(request) + + try: while True: - data = yield from stream.content.read(buffer_size) + with async_timeout.timeout(timeout, loop=hass.loop): + data = yield from stream.read(buffer_size) + if not data: + yield from response.write_eof() break + response.write(data) - except asyncio.TimeoutError: - raise HTTPGatewayTimeout() - - except (aiohttp.errors.ClientError, - aiohttp.errors.ClientDisconnectedError): + except (asyncio.TimeoutError, aiohttp.ClientError): pass - except (asyncio.CancelledError, ConnectionResetError): - response = None - - finally: - if stream is not None: - stream.close() - if response is not None: - yield from response.write_eof() + yield from response.write_eof() @callback @@ -149,10 +153,10 @@ def _async_get_connector(hass, verify_ssl=True): connector = hass.data[DATA_CONNECTOR_NOTVERIFY] if is_new: - @asyncio.coroutine + @callback def _async_close_connector(event): """Close connector pool.""" - yield from connector.close() + connector.close() hass.bus.async_listen_once( EVENT_HOMEASSISTANT_CLOSE, _async_close_connector) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index cc8280bd6c5..2b22a367121 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -5,5 +5,5 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==1.3.5 +aiohttp==2.0.4 async_timeout==1.2.0 diff --git a/requirements_all.txt b/requirements_all.txt index d97e830874c..29ef28c5ed7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==1.3.5 +aiohttp==2.0.4 async_timeout==1.2.0 # homeassistant.components.nuimo_controller diff --git a/setup.py b/setup.py index 0f2c6e6d876..966ae72bc88 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ REQUIRES = [ 'jinja2>=2.9.5', 'voluptuous==0.9.3', 'typing>=3,<4', - 'aiohttp==1.3.5', + 'aiohttp==2.0.4', 'async_timeout==1.2.0', ] diff --git a/tests/components/sensor/test_darksky.py b/tests/components/sensor/test_darksky.py index 54453f42d43..7ee04b0df4c 100644 --- a/tests/components/sensor/test_darksky.py +++ b/tests/components/sensor/test_darksky.py @@ -36,10 +36,8 @@ class TestDarkSkySetup(unittest.TestCase): 'monitored_conditions': ['summary', 'icon', 'temperature_max'], 'update_interval': timedelta(seconds=120), } - self.lat = 37.8267 - self.lon = -122.423 - self.hass.config.latitude = self.lat - self.hass.config.longitude = self.lon + self.lat = self.hass.config.latitude = 37.8267 + self.lon = self.hass.config.longitude = -122.423 self.entities = [] def tearDown(self): # pylint: disable=invalid-name @@ -51,11 +49,6 @@ class TestDarkSkySetup(unittest.TestCase): self.assertTrue( setup_component(self.hass, 'sensor', {'darksky': self.config})) - def test_setup_no_latitude(self): - """Test that the component is not loaded without required config.""" - self.hass.config.latitude = None - self.assertFalse(darksky.setup_platform(self.hass, {}, MagicMock())) - @patch('forecastio.api.get_forecast') def test_setup_bad_api_key(self, mock_get_forecast): """Test for handling a bad API key.""" diff --git a/tests/components/switch/test_rest.py b/tests/components/switch/test_rest.py index a2da94b614a..5a9ce679edf 100644 --- a/tests/components/switch/test_rest.py +++ b/tests/components/switch/test_rest.py @@ -42,7 +42,7 @@ class TestRestSwitchSetup: def test_setup_failed_connect(self, aioclient_mock): """Test setup when connection error occurs.""" - aioclient_mock.get('http://localhost', exc=aiohttp.errors.ClientError) + aioclient_mock.get('http://localhost', exc=aiohttp.ClientError) assert not run_coroutine_threadsafe( rest.async_setup_platform(self.hass, { 'platform': 'rest', diff --git a/tests/components/test_api.py b/tests/components/test_api.py index 2cdc359bfea..e2d93c9cce7 100644 --- a/tests/components/test_api.py +++ b/tests/components/test_api.py @@ -1,12 +1,9 @@ """The tests for the Home Assistant API component.""" # pylint: disable=protected-access -import asyncio from contextlib import closing import json import unittest -from unittest.mock import Mock, patch -from aiohttp import web import requests from homeassistant import setup, const @@ -247,22 +244,6 @@ class TestAPI(unittest.TestCase): headers=HA_HEADERS) self.assertEqual(hass.config.components, set(req.json())) - def test_api_get_error_log(self): - """Test the return of the error log.""" - test_string = 'Test String°' - - @asyncio.coroutine - def mock_send(): - """Mock file send.""" - return web.Response(text=test_string) - - with patch('homeassistant.components.http.HomeAssistantView.file', - Mock(return_value=mock_send())): - req = requests.get(_url(const.URL_API_ERROR_LOG), - headers=HA_HEADERS) - self.assertEqual(test_string, req.text) - self.assertIsNone(req.headers.get('expires')) - def test_api_get_event_listeners(self): """Test if we can get the list of events being listened for.""" req = requests.get(_url(const.URL_API_EVENTS), diff --git a/tests/components/test_frontend.py b/tests/components/test_frontend.py index 0c42d05f3ae..952061be3c2 100644 --- a/tests/components/test_frontend.py +++ b/tests/components/test_frontend.py @@ -1,89 +1,69 @@ """The tests for Home Assistant frontend.""" -# pylint: disable=protected-access +import asyncio import re -import unittest -import requests +import pytest -from homeassistant import setup -from homeassistant.components import http -from homeassistant.const import HTTP_HEADER_HA_AUTH - -from tests.common import get_test_instance_port, get_test_home_assistant - -API_PASSWORD = "test1234" -SERVER_PORT = get_test_instance_port() -HTTP_BASE_URL = "http://127.0.0.1:{}".format(SERVER_PORT) -HA_HEADERS = {HTTP_HEADER_HA_AUTH: API_PASSWORD} - -hass = None +from homeassistant.setup import async_setup_component -def _url(path=""): - """Helper method to generate URLs.""" - return HTTP_BASE_URL + path +@pytest.fixture +def mock_http_client(loop, hass, test_client): + """Start the Hass HTTP component.""" + loop.run_until_complete(async_setup_component(hass, 'frontend', {})) + return loop.run_until_complete(test_client(hass.http.app)) -# pylint: disable=invalid-name -def setUpModule(): - """Initialize a Home Assistant server.""" - global hass +@asyncio.coroutine +def test_frontend_and_static(mock_http_client): + """Test if we can get the frontend.""" + resp = yield from mock_http_client.get('') + assert resp.status == 200 + assert 'cache-control' not in resp.headers - hass = get_test_home_assistant() + text = yield from resp.text() - assert setup.setup_component( - hass, http.DOMAIN, - {http.DOMAIN: {http.CONF_API_PASSWORD: API_PASSWORD, - http.CONF_SERVER_PORT: SERVER_PORT}}) + # Test we can retrieve frontend.js + frontendjs = re.search( + r'(?P\/static\/frontend-[A-Za-z0-9]{32}.html)', text) - assert setup.setup_component(hass, 'frontend') - - hass.start() + assert frontendjs is not None + resp = yield from mock_http_client.get(frontendjs.groups(0)[0]) + assert resp.status == 200 + assert 'public' in resp.headers.get('cache-control') -# pylint: disable=invalid-name -def tearDownModule(): - """Stop everything that was started.""" - hass.stop() +@asyncio.coroutine +def test_dont_cache_service_worker(mock_http_client): + """Test that we don't cache the service worker.""" + resp = yield from mock_http_client.get('/service_worker.js') + assert resp.status == 200 + assert 'cache-control' not in resp.headers -class TestFrontend(unittest.TestCase): - """Test the frontend.""" +@asyncio.coroutine +def test_404(mock_http_client): + """Test for HTTP 404 error.""" + resp = yield from mock_http_client.get('/not-existing') + assert resp.status == 404 - def tearDown(self): - """Stop everything that was started.""" - hass.block_till_done() - def test_frontend_and_static(self): - """Test if we can get the frontend.""" - req = requests.get(_url("")) - self.assertEqual(200, req.status_code) +@asyncio.coroutine +def test_we_cannot_POST_to_root(mock_http_client): + """Test that POST is not allow to root.""" + resp = yield from mock_http_client.post('/') + assert resp.status == 405 - # Test we can retrieve frontend.js - frontendjs = re.search( - r'(?P\/static\/frontend-[A-Za-z0-9]{32}.html)', - req.text) - self.assertIsNotNone(frontendjs) - req = requests.get(_url(frontendjs.groups(0)[0])) - self.assertEqual(200, req.status_code) +@asyncio.coroutine +def test_states_routes(hass, mock_http_client): + """All served by index.""" + resp = yield from mock_http_client.get('/states') + assert resp.status == 200 - def test_404(self): - """Test for HTTP 404 error.""" - self.assertEqual(404, requests.get(_url("/not-existing")).status_code) + resp = yield from mock_http_client.get('/states/group.non_existing') + assert resp.status == 404 - def test_we_cannot_POST_to_root(self): - """Test that POST is not allow to root.""" - self.assertEqual(405, requests.post(_url("")).status_code) - - def test_states_routes(self): - """All served by index.""" - req = requests.get(_url("/states")) - self.assertEqual(200, req.status_code) - - req = requests.get(_url("/states/group.non_existing")) - self.assertEqual(404, req.status_code) - - hass.states.set('group.existing', 'on', {'view': True}) - req = requests.get(_url("/states/group.existing")) - self.assertEqual(200, req.status_code) + hass.states.async_set('group.existing', 'on', {'view': True}) + resp = yield from mock_http_client.get('/states/group.existing') + assert resp.status == 200 diff --git a/tests/components/test_rest_command.py b/tests/components/test_rest_command.py index a62bddc4a0f..0648a30c922 100644 --- a/tests/components/test_rest_command.py +++ b/tests/components/test_rest_command.py @@ -107,7 +107,7 @@ class TestRestCommandComponent(object): with assert_setup_component(4): setup_component(self.hass, rc.DOMAIN, self.config) - aioclient_mock.get(self.url, exc=aiohttp.errors.ClientError()) + aioclient_mock.get(self.url, exc=aiohttp.ClientError()) self.hass.services.call(rc.DOMAIN, 'get_test', {}) self.hass.block_till_done() diff --git a/tests/components/test_sleepiq.py b/tests/components/test_sleepiq.py index 3c7551d130c..becf897a8e9 100644 --- a/tests/components/test_sleepiq.py +++ b/tests/components/test_sleepiq.py @@ -1,5 +1,7 @@ """The tests for the SleepIQ component.""" import unittest +from unittest.mock import MagicMock, patch + import requests_mock from homeassistant import setup @@ -49,8 +51,12 @@ class TestSleepIQ(unittest.TestCase): """Test the setup.""" mock_responses(mock) - response = sleepiq.setup(self.hass, self.config) - self.assertTrue(response) + # We're mocking the load_platform discoveries or else the platforms + # will be setup during tear down when blocking till done, but the mocks + # are no longer active. + with patch( + 'homeassistant.helpers.discovery.load_platform', MagicMock()): + assert sleepiq.setup(self.hass, self.config) @requests_mock.Mocker() def test_setup_login_failed(self, mock): diff --git a/tests/helpers/test_aiohttp_client.py b/tests/helpers/test_aiohttp_client.py index 42e2697b7a7..7aa7f6fa4d1 100644 --- a/tests/helpers/test_aiohttp_client.py +++ b/tests/helpers/test_aiohttp_client.py @@ -5,7 +5,7 @@ import unittest import aiohttp from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE -from homeassistant.setup import setup_component +from homeassistant.setup import async_setup_component import homeassistant.helpers.aiohttp_client as client from homeassistant.util.async import run_callback_threadsafe @@ -119,22 +119,19 @@ class TestHelpersAiohttpClient(unittest.TestCase): @asyncio.coroutine -def test_fetching_url(aioclient_mock, hass, test_client): +def test_async_aiohttp_proxy_stream(aioclient_mock, hass, test_client): """Test that it fetches the given url.""" aioclient_mock.get('http://example.com/mjpeg_stream', content=[ b'Frame1', b'Frame2', b'Frame3' ]) - def setup_platform(): - """Setup the platform.""" - assert setup_component(hass, 'camera', { - 'camera': { - 'name': 'config_test', - 'platform': 'mjpeg', - 'mjpeg_url': 'http://example.com/mjpeg_stream', - }}) - - yield from hass.loop.run_in_executor(None, setup_platform) + result = yield from async_setup_component(hass, 'camera', { + 'camera': { + 'name': 'config_test', + 'platform': 'mjpeg', + 'mjpeg_url': 'http://example.com/mjpeg_stream', + }}) + assert result, 'Failed to setup camera' client = yield from test_client(hass.http.app) @@ -151,29 +148,12 @@ def test_fetching_url(aioclient_mock, hass, test_client): content=[b'Frame1', b'Frame2', b'Frame3']) resp = yield from client.get('/api/camera_proxy_stream/camera.config_test') - - assert resp.status == 200 - body = yield from resp.text() - assert body == '' + assert resp.status == 504 aioclient_mock.clear_requests() aioclient_mock.get( - 'http://example.com/mjpeg_stream', exc=asyncio.CancelledError(), + 'http://example.com/mjpeg_stream', exc=aiohttp.ClientError(), content=[b'Frame1', b'Frame2', b'Frame3']) resp = yield from client.get('/api/camera_proxy_stream/camera.config_test') - - assert resp.status == 200 - body = yield from resp.text() - assert body == '' - - aioclient_mock.clear_requests() - aioclient_mock.get( - 'http://example.com/mjpeg_stream', exc=aiohttp.errors.ClientError(), - content=[b'Frame1', b'Frame2', b'Frame3']) - - resp = yield from client.get('/api/camera_proxy_stream/camera.config_test') - - assert resp.status == 200 - body = yield from resp.text() - assert body == '' + assert resp.status == 502 From ee8701b560e180caa6a446be270c3a493a66c5eb Mon Sep 17 00:00:00 2001 From: Beat Date: Thu, 30 Mar 2017 15:26:11 +0200 Subject: [PATCH 050/116] Fix configuration setup (#6853) When the user exceeds the request limit for google APIs, the response status stays at 200 but the response body is different: ``` { "error_message" : "You have exceeded your daily request quota for this API. We recommend registering for a key at the Google Developers Console: https://console.developers.google.com/apis/credentials?project=_", "results" : [], "status" : "OVER_QUERY_LIMIT" } ``` This prevents HA from creating the initial configuration --- homeassistant/util/location.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/util/location.py b/homeassistant/util/location.py index d3c35457dbc..950f2f99fed 100644 --- a/homeassistant/util/location.py +++ b/homeassistant/util/location.py @@ -76,7 +76,7 @@ def elevation(latitude, longitude): try: return int(float(req.json()['results'][0]['elevation'])) - except (ValueError, KeyError): + except (ValueError, KeyError, IndexError): return 0 From 816b1891b52edb77a9874cc9779e10af234413e9 Mon Sep 17 00:00:00 2001 From: Johan Bloemberg Date: Thu, 30 Mar 2017 17:02:03 +0200 Subject: [PATCH 051/116] Add option to disable automatic add for lights and sensors. (#6852) --- homeassistant/components/light/rflink.py | 8 +++--- homeassistant/components/rflink.py | 1 + homeassistant/components/sensor/rflink.py | 10 +++++--- tests/components/light/test_rflink.py | 28 +++++++++++++++++++++ tests/components/sensor/test_rflink.py | 30 +++++++++++++++++++++++ 5 files changed, 70 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/light/rflink.py b/homeassistant/components/light/rflink.py index a36a4f43f22..e0b627f1ffa 100644 --- a/homeassistant/components/light/rflink.py +++ b/homeassistant/components/light/rflink.py @@ -10,8 +10,8 @@ import logging from homeassistant.components.light import ( ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS, Light) from homeassistant.components.rflink import ( - CONF_ALIASSES, CONF_DEVICE_DEFAULTS, CONF_DEVICES, CONF_FIRE_EVENT, - CONF_GROUP, CONF_GROUP_ALIASSES, CONF_IGNORE_DEVICES, + CONF_ALIASSES, CONF_AUTOMATIC_ADD, CONF_DEVICE_DEFAULTS, CONF_DEVICES, + CONF_FIRE_EVENT, CONF_GROUP, CONF_GROUP_ALIASSES, CONF_IGNORE_DEVICES, CONF_NOGROUP_ALIASSES, CONF_SIGNAL_REPETITIONS, DATA_DEVICE_REGISTER, DATA_ENTITY_GROUP_LOOKUP, DATA_ENTITY_LOOKUP, DEVICE_DEFAULTS_SCHEMA, DOMAIN, EVENT_KEY_COMMAND, EVENT_KEY_ID, SwitchableRflinkDevice, cv, vol) @@ -32,6 +32,7 @@ PLATFORM_SCHEMA = vol.Schema({ vol.Optional(CONF_IGNORE_DEVICES): vol.All(cv.ensure_list, [cv.string]), vol.Optional(CONF_DEVICE_DEFAULTS, default=DEVICE_DEFAULTS_SCHEMA({})): DEVICE_DEFAULTS_SCHEMA, + vol.Optional(CONF_AUTOMATIC_ADD, default=True): cv.boolean, vol.Optional(CONF_DEVICES, default={}): vol.Schema({ cv.string: { vol.Optional(CONF_NAME): cv.string, @@ -165,7 +166,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): # Schedule task to process event after entity is created hass.async_add_job(device.handle_event, event) - hass.data[DATA_DEVICE_REGISTER][EVENT_KEY_COMMAND] = add_new_device + if config[CONF_AUTOMATIC_ADD]: + hass.data[DATA_DEVICE_REGISTER][EVENT_KEY_COMMAND] = add_new_device class RflinkLight(SwitchableRflinkDevice, Light): diff --git a/homeassistant/components/rflink.py b/homeassistant/components/rflink.py index 2986b898ed0..52fd602f0de 100644 --- a/homeassistant/components/rflink.py +++ b/homeassistant/components/rflink.py @@ -33,6 +33,7 @@ CONF_GROUP = 'group' CONF_NOGROUP_ALIASSES = 'nogroup_aliasses' CONF_DEVICE_DEFAULTS = 'device_defaults' CONF_DEVICES = 'devices' +CONF_AUTOMATIC_ADD = 'automatic_add' CONF_FIRE_EVENT = 'fire_event' CONF_IGNORE_DEVICES = 'ignore_devices' CONF_RECONNECT_INTERVAL = 'reconnect_interval' diff --git a/homeassistant/components/sensor/rflink.py b/homeassistant/components/sensor/rflink.py index 80a5b7dfb8d..c6660701c21 100644 --- a/homeassistant/components/sensor/rflink.py +++ b/homeassistant/components/sensor/rflink.py @@ -9,9 +9,9 @@ from functools import partial import logging from homeassistant.components.rflink import ( - CONF_ALIASSES, CONF_DEVICES, DATA_DEVICE_REGISTER, DATA_ENTITY_LOOKUP, - DOMAIN, EVENT_KEY_ID, EVENT_KEY_SENSOR, EVENT_KEY_UNIT, RflinkDevice, - cv, vol) + CONF_ALIASSES, CONF_AUTOMATIC_ADD, CONF_DEVICES, DATA_DEVICE_REGISTER, + DATA_ENTITY_LOOKUP, DOMAIN, EVENT_KEY_ID, EVENT_KEY_SENSOR, EVENT_KEY_UNIT, + RflinkDevice, cv, vol) from homeassistant.const import ( ATTR_UNIT_OF_MEASUREMENT, CONF_NAME, CONF_PLATFORM, CONF_UNIT_OF_MEASUREMENT) @@ -30,6 +30,7 @@ CONF_SENSOR_TYPE = 'sensor_type' PLATFORM_SCHEMA = vol.Schema({ vol.Required(CONF_PLATFORM): DOMAIN, + vol.Optional(CONF_AUTOMATIC_ADD, default=True): cv.boolean, vol.Optional(CONF_DEVICES, default={}): vol.Schema({ cv.string: { vol.Optional(CONF_NAME): cv.string, @@ -91,7 +92,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): # Schedule task to process event after entity is created hass.async_add_job(device.handle_event, event) - hass.data[DATA_DEVICE_REGISTER][EVENT_KEY_SENSOR] = add_new_device + if config[CONF_AUTOMATIC_ADD]: + hass.data[DATA_DEVICE_REGISTER][EVENT_KEY_SENSOR] = add_new_device class RflinkSensor(RflinkDevice): diff --git a/tests/components/light/test_rflink.py b/tests/components/light/test_rflink.py index 9f1d98b0ffd..7eaa8e8fc6d 100644 --- a/tests/components/light/test_rflink.py +++ b/tests/components/light/test_rflink.py @@ -533,3 +533,31 @@ def test_nogroup_device_id(hass, monkeypatch): yield from hass.async_block_till_done() # should affect state assert hass.states.get('light.test').state == 'on' + + +@asyncio.coroutine +def test_disable_automatic_add(hass, monkeypatch): + """If disabled new devices should not be automatically added.""" + config = { + 'rflink': { + 'port': '/dev/ttyABC0', + }, + DOMAIN: { + 'platform': 'rflink', + 'automatic_add': False, + }, + } + + # setup mocking rflink module + event_callback, _, _, _ = yield from mock_rflink( + hass, config, DOMAIN, monkeypatch) + + # test event for new unconfigured sensor + event_callback({ + 'id': 'protocol_0_0', + 'command': 'off', + }) + yield from hass.async_block_till_done() + + # make sure new device is not added + assert not hass.states.get('light.protocol_0_0') diff --git a/tests/components/sensor/test_rflink.py b/tests/components/sensor/test_rflink.py index 2925551ee06..a99d14cc735 100644 --- a/tests/components/sensor/test_rflink.py +++ b/tests/components/sensor/test_rflink.py @@ -70,3 +70,33 @@ def test_default_setup(hass, monkeypatch): assert new_sensor.state == '0' assert new_sensor.attributes['unit_of_measurement'] == '°C' assert new_sensor.attributes['icon'] == 'mdi:thermometer' + + +@asyncio.coroutine +def test_disable_automatic_add(hass, monkeypatch): + """If disabled new devices should not be automatically added.""" + config = { + 'rflink': { + 'port': '/dev/ttyABC0', + }, + DOMAIN: { + 'platform': 'rflink', + 'automatic_add': False, + }, + } + + # setup mocking rflink module + event_callback, _, _, _ = yield from mock_rflink( + hass, config, DOMAIN, monkeypatch) + + # test event for new unconfigured sensor + event_callback({ + 'id': 'test2', + 'sensor': 'temperature', + 'value': 0, + 'unit': '°C', + }) + yield from hass.async_block_till_done() + + # make sure new device is not added + assert not hass.states.get('sensor.test2') From 72db4a80ddd8a1286f41d84667ca10cee4487009 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Thu, 30 Mar 2017 17:27:53 +0200 Subject: [PATCH 052/116] Update aioHTTP to 2.0.5 (#6856) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 2b22a367121..e052c662e3b 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -5,5 +5,5 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.4 +aiohttp==2.0.5 async_timeout==1.2.0 diff --git a/requirements_all.txt b/requirements_all.txt index 29ef28c5ed7..cb2f9fdff5c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.4 +aiohttp==2.0.5 async_timeout==1.2.0 # homeassistant.components.nuimo_controller diff --git a/setup.py b/setup.py index 966ae72bc88..5e973790dcc 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ REQUIRES = [ 'jinja2>=2.9.5', 'voluptuous==0.9.3', 'typing>=3,<4', - 'aiohttp==2.0.4', + 'aiohttp==2.0.5', 'async_timeout==1.2.0', ] From 5bb201c7fc5f8a8232385d09ef4be6bc68cd7111 Mon Sep 17 00:00:00 2001 From: "Craig J. Ward" Date: Fri, 31 Mar 2017 01:53:11 -0500 Subject: [PATCH 053/116] use change light level to avoid variable ramp speeds (#6860) --- homeassistant/components/light/insteon_local.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/light/insteon_local.py b/homeassistant/components/light/insteon_local.py index 865458eae24..27f297a82f0 100644 --- a/homeassistant/components/light/insteon_local.py +++ b/homeassistant/components/light/insteon_local.py @@ -175,7 +175,7 @@ class InsteonLocalDimmerDevice(Light): if ATTR_BRIGHTNESS in kwargs: brightness = int(kwargs[ATTR_BRIGHTNESS]) / 255 * 100 - self.node.on(brightness) + self.node.change_level(brightness) def turn_off(self, **kwargs): """Turn device off.""" From 8c97bccaaa3950fbe2701d213ab51782f62daec5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 31 Mar 2017 02:55:22 -0700 Subject: [PATCH 054/116] Handle aiohttp task cancellation better (#6862) --- homeassistant/components/camera/__init__.py | 21 ++++++++++----------- homeassistant/helpers/aiohttp_client.py | 13 +++++++++++-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index d3c6699f77c..388a9fce39b 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -7,6 +7,7 @@ https://home-assistant.io/components/camera/ """ import asyncio import collections +from contextlib import suppress from datetime import timedelta import logging import hashlib @@ -167,7 +168,7 @@ class Camera(Entity): if not img_bytes: break - if img_bytes is not None and img_bytes != last_image: + if img_bytes and img_bytes != last_image: write(img_bytes) # Chrome seems to always ignore first picture, @@ -180,8 +181,8 @@ class Camera(Entity): yield from asyncio.sleep(.5) - except (asyncio.CancelledError, ConnectionResetError): - _LOGGER.debug("Close stream by frontend.") + except asyncio.CancelledError: + _LOGGER.debug("Stream closed by frontend.") response = None finally: @@ -263,16 +264,14 @@ class CameraImageView(CameraView): @asyncio.coroutine def handle(self, request, camera): """Serve camera image.""" - try: - image = yield from camera.async_camera_image() + with suppress(asyncio.CancelledError, asyncio.TimeoutError): + with async_timeout.timeout(10, loop=request.app['hass'].loop): + image = yield from camera.async_camera_image() - if image is None: - return web.Response(status=500) + if image: + return web.Response(body=image) - return web.Response(body=image) - - except asyncio.CancelledError: - _LOGGER.debug("Close stream by frontend.") + return web.Response(status=500) class CameraMjpegStream(CameraView): diff --git a/homeassistant/helpers/aiohttp_client.py b/homeassistant/helpers/aiohttp_client.py index 8dc64105e8b..9aac258684f 100644 --- a/homeassistant/helpers/aiohttp_client.py +++ b/homeassistant/helpers/aiohttp_client.py @@ -78,10 +78,16 @@ def async_aiohttp_proxy_web(hass, request, web_coro, buffer_size=102400, with async_timeout.timeout(timeout, loop=hass.loop): req = yield from web_coro + except asyncio.CancelledError: + # The user cancelled the request + return + except asyncio.TimeoutError as err: + # Timeout trying to start the web request raise HTTPGatewayTimeout() from err except aiohttp.ClientError as err: + # Something went wrong with the connection raise HTTPBadGateway() from err yield from async_aiohttp_proxy_stream(hass, request, req.content, @@ -108,9 +114,12 @@ def async_aiohttp_proxy_stream(hass, request, stream, content_type, response.write(data) except (asyncio.TimeoutError, aiohttp.ClientError): - pass + # Something went wrong fetching data, close connection gracefully + yield from response.write_eof() - yield from response.write_eof() + except asyncio.CancelledError: + # The user closed the connection + pass @callback From 05398a9dff06bd9d79783786ccab3fa194748786 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Fri, 31 Mar 2017 11:53:56 -0400 Subject: [PATCH 055/116] Introduced Ring binary sensors and refactored Ring component (#6520) * - Introduced Ring binary_sensor. - Added unittest for Ring binary_sensor. - Bumped ring_doorbell 3rd party module. * Updated requirements * Added correct file for unittest * - Introduced Ring binary_sensor. - Added unittest for Ring binary_sensor. - Bumped ring_doorbell 3rd party module. * Updated requirements * Added correct file for unittest * Added extra sensors last_ding and last_motion * Modified Ring binary_sensor and sensor to inherit DOMAIN configuration * Moved static to top ring.py * Fixed requirements * Bump version ring_doorbell to 0.1.2 * testing unittests * Use hass.data dict instead GLOBALS * Fixed unittests * Bump ring_doorbell to 0.1.3 * Updated unittest and coverted to use decorator @requests_mock.Mocker() * Updated ring_session with lower case --- .../components/binary_sensor/ring.py | 109 ++++++++++ homeassistant/components/ring.py | 63 ++++++ homeassistant/components/sensor/ring.py | 64 ++---- requirements_all.txt | 4 +- tests/components/binary_sensor/test_ring.py | 63 ++++++ tests/components/sensor/test_ring.py | 202 +++--------------- tests/components/test_ring.py | 56 +++++ tests/fixtures/ring_devices.json | 79 +++++++ tests/fixtures/ring_ding_active.json | 26 +++ tests/fixtures/ring_doorbots.json | 10 + tests/fixtures/ring_session.json | 36 ++++ 11 files changed, 494 insertions(+), 218 deletions(-) create mode 100644 homeassistant/components/binary_sensor/ring.py create mode 100644 homeassistant/components/ring.py create mode 100644 tests/components/binary_sensor/test_ring.py create mode 100644 tests/components/test_ring.py create mode 100644 tests/fixtures/ring_devices.json create mode 100644 tests/fixtures/ring_ding_active.json create mode 100644 tests/fixtures/ring_doorbots.json create mode 100644 tests/fixtures/ring_session.json diff --git a/homeassistant/components/binary_sensor/ring.py b/homeassistant/components/binary_sensor/ring.py new file mode 100644 index 00000000000..429e92afa7f --- /dev/null +++ b/homeassistant/components/binary_sensor/ring.py @@ -0,0 +1,109 @@ +""" +This component provides HA sensor support for Ring Door Bell/Chimes. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.ring/ +""" +import logging +from datetime import timedelta + +import voluptuous as vol +import homeassistant.helpers.config_validation as cv + +from homeassistant.components.ring import ( + CONF_ATTRIBUTION, DEFAULT_ENTITY_NAMESPACE) + +from homeassistant.const import ( + ATTR_ATTRIBUTION, CONF_ENTITY_NAMESPACE, CONF_MONITORED_CONDITIONS) + +from homeassistant.components.binary_sensor import ( + BinarySensorDevice, PLATFORM_SCHEMA) + +DEPENDENCIES = ['ring'] + +_LOGGER = logging.getLogger(__name__) + +SCAN_INTERVAL = timedelta(seconds=5) + +# Sensor types: Name, category, device_class +SENSOR_TYPES = { + 'ding': ['Ding', ['doorbell'], 'occupancy'], + 'motion': ['Motion', ['doorbell'], 'motion'], +} + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_ENTITY_NAMESPACE, default=DEFAULT_ENTITY_NAMESPACE): + cv.string, + vol.Required(CONF_MONITORED_CONDITIONS, default=[]): + vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up a sensor for a Ring device.""" + ring = hass.data.get('ring') + + sensors = [] + for sensor_type in config.get(CONF_MONITORED_CONDITIONS): + for device in ring.doorbells: + if 'doorbell' in SENSOR_TYPES[sensor_type][1]: + sensors.append(RingBinarySensor(hass, + device, + sensor_type)) + add_devices(sensors, True) + return True + + +class RingBinarySensor(BinarySensorDevice): + """A binary sensor implementation for Ring device.""" + + def __init__(self, hass, data, sensor_type): + """Initialize a sensor for Ring device.""" + super(RingBinarySensor, self).__init__() + self._sensor_type = sensor_type + self._data = data + self._name = "{0} {1}".format(self._data.name, + SENSOR_TYPES.get(self._sensor_type)[0]) + self._device_class = SENSOR_TYPES.get(self._sensor_type)[2] + self._state = None + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def is_on(self): + """Return True if the binary sensor is on.""" + return self._state + + @property + def device_class(self): + """Return the class of the binary sensor.""" + return self._device_class + + @property + def device_state_attributes(self): + """Return the state attributes.""" + attrs = {} + attrs[ATTR_ATTRIBUTION] = CONF_ATTRIBUTION + + attrs['device_id'] = self._data.id + attrs['firmware'] = self._data.firmware + attrs['timezone'] = self._data.timezone + + if self._data.alert and self._data.alert_expires_at: + attrs['expires_at'] = self._data.alert_expires_at + attrs['state'] = self._data.alert.get('state') + + return attrs + + def update(self): + """Get the latest data and updates the state.""" + self._data.check_alerts() + + if self._data.alert: + self._state = (self._sensor_type == + self._data.alert.get('kind')) + else: + self._state = False diff --git a/homeassistant/components/ring.py b/homeassistant/components/ring.py new file mode 100644 index 00000000000..61c772eced7 --- /dev/null +++ b/homeassistant/components/ring.py @@ -0,0 +1,63 @@ +""" +Support for Ring Doorbell/Chimes. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/ring/ +""" +from datetime import timedelta +import logging +import voluptuous as vol +import homeassistant.helpers.config_validation as cv + +from homeassistant.const import CONF_USERNAME, CONF_PASSWORD +import homeassistant.loader as loader + +from requests.exceptions import HTTPError, ConnectTimeout + +REQUIREMENTS = ['ring_doorbell==0.1.3'] + +_LOGGER = logging.getLogger(__name__) + +CONF_ATTRIBUTION = "Data provided by Ring.com" + +NOTIFICATION_ID = 'ring_notification' +NOTIFICATION_TITLE = 'Ring Sensor Setup' + +DOMAIN = 'ring' +DEFAULT_CACHEDB = '.ring_cache.pickle' +DEFAULT_ENTITY_NAMESPACE = 'ring' +DEFAULT_SCAN_INTERVAL = timedelta(seconds=30) + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + }), +}, extra=vol.ALLOW_EXTRA) + + +def setup(hass, config): + """Set up Ring component.""" + conf = config[DOMAIN] + username = conf.get(CONF_USERNAME) + password = conf.get(CONF_PASSWORD) + + persistent_notification = loader.get_component('persistent_notification') + try: + from ring_doorbell import Ring + + cache = hass.config.path(DEFAULT_CACHEDB) + ring = Ring(username=username, password=password, cache_file=cache) + if not ring.is_connected: + return False + hass.data['ring'] = ring + except (ConnectTimeout, HTTPError) as ex: + _LOGGER.error("Unable to connect to Ring service: %s", str(ex)) + persistent_notification.create( + hass, 'Error: {}
' + 'You will need to restart hass after fixing.' + ''.format(ex), + title=NOTIFICATION_TITLE, + notification_id=NOTIFICATION_ID) + return False + return True diff --git a/homeassistant/components/sensor/ring.py b/homeassistant/components/sensor/ring.py index 7c342a75f13..665fb167bcc 100644 --- a/homeassistant/components/sensor/ring.py +++ b/homeassistant/components/sensor/ring.py @@ -5,43 +5,32 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.ring/ """ import logging -from datetime import timedelta import voluptuous as vol -import homeassistant.loader as loader import homeassistant.helpers.config_validation as cv +from homeassistant.components.ring import ( + CONF_ATTRIBUTION, DEFAULT_ENTITY_NAMESPACE, DEFAULT_SCAN_INTERVAL) from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( CONF_ENTITY_NAMESPACE, CONF_MONITORED_CONDITIONS, CONF_SCAN_INTERVAL, - CONF_USERNAME, CONF_PASSWORD, STATE_UNKNOWN, - ATTR_ATTRIBUTION) + STATE_UNKNOWN, ATTR_ATTRIBUTION) from homeassistant.helpers.entity import Entity -from requests.exceptions import HTTPError, ConnectTimeout - -REQUIREMENTS = ['ring_doorbell==0.1.0'] +DEPENDENCIES = ['ring'] _LOGGER = logging.getLogger(__name__) -NOTIFICATION_ID = 'ring_notification' -NOTIFICATION_TITLE = 'Ring Sensor Setup' - -DEFAULT_ENTITY_NAMESPACE = 'ring' -DEFAULT_SCAN_INTERVAL = timedelta(seconds=30) - -CONF_ATTRIBUTION = "Data provided by Ring.com" - -# Sensor types: Name, category, units, icon +# Sensor types: Name, category, units, icon, kind SENSOR_TYPES = { - 'battery': ['Battery', ['doorbell'], '%', 'battery-50'], - 'last_activity': ['Last Activity', ['doorbell'], None, 'history'], - 'volume': ['Volume', ['chime', 'doorbell'], None, 'bell-ring'], + 'battery': ['Battery', ['doorbell'], '%', 'battery-50', None], + 'last_activity': ['Last Activity', ['doorbell'], None, 'history', None], + 'last_ding': ['Last Ding', ['doorbell'], None, 'history', 'ding'], + 'last_motion': ['Last Motion', ['doorbell'], None, 'history', 'motion'], + 'volume': ['Volume', ['chime', 'doorbell'], None, 'bell-ring', None], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_ENTITY_NAMESPACE, default=DEFAULT_ENTITY_NAMESPACE): cv.string, vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): @@ -53,22 +42,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_devices, discovery_info=None): """Set up a sensor for a Ring device.""" - from ring_doorbell import Ring - - ring = Ring(config.get(CONF_USERNAME), config.get(CONF_PASSWORD)) - - persistent_notification = loader.get_component('persistent_notification') - try: - ring.is_connected - except (ConnectTimeout, HTTPError) as ex: - _LOGGER.error("Unable to connect to Ring service: %s", str(ex)) - persistent_notification.create( - hass, 'Error: {}
' - 'You will need to restart hass after fixing.' - ''.format(ex), - title=NOTIFICATION_TITLE, - notification_id=NOTIFICATION_ID) - return False + ring = hass.data.get('ring') sensors = [] for sensor_type in config.get(CONF_MONITORED_CONDITIONS): @@ -98,6 +72,7 @@ class RingSensor(Entity): self._data = data self._extra = None self._icon = 'mdi:{}'.format(SENSOR_TYPES.get(self._sensor_type)[3]) + self._kind = SENSOR_TYPES.get(self._sensor_type)[4] self._name = "{0} {1}".format(self._data.name, SENSOR_TYPES.get(self._sensor_type)[0]) self._state = STATE_UNKNOWN @@ -125,7 +100,7 @@ class RingSensor(Entity): attrs['timezone'] = self._data.timezone attrs['type'] = self._data.family - if self._extra and self._sensor_type == 'last_activity': + if self._extra and self._sensor_type.startswith('last_'): attrs['created_at'] = self._extra['created_at'] attrs['answered'] = self._extra['answered'] attrs['recording_status'] = self._extra['recording']['status'] @@ -153,8 +128,11 @@ class RingSensor(Entity): if self._sensor_type == 'battery': self._state = self._data.battery_life - if self._sensor_type == 'last_activity': - self._extra = self._data.history(limit=1, timezone=self._tz)[0] - created_at = self._extra['created_at'] - self._state = '{0:0>2}:{1:0>2}'.format(created_at.hour, - created_at.minute) + if self._sensor_type.startswith('last_'): + history = self._data.history(timezone=self._tz, + kind=self._kind) + if history: + self._extra = history[0] + created_at = self._extra['created_at'] + self._state = '{0:0>2}:{1:0>2}'.format(created_at.hour, + created_at.minute) diff --git a/requirements_all.txt b/requirements_all.txt index cb2f9fdff5c..ac0d6a3752f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -664,8 +664,8 @@ radiotherm==1.2 # homeassistant.components.rflink rflink==0.0.31 -# homeassistant.components.sensor.ring -ring_doorbell==0.1.0 +# homeassistant.components.ring +ring_doorbell==0.1.3 # homeassistant.components.switch.rpi_rf # rpi-rf==0.9.6 diff --git a/tests/components/binary_sensor/test_ring.py b/tests/components/binary_sensor/test_ring.py new file mode 100644 index 00000000000..75c7aced369 --- /dev/null +++ b/tests/components/binary_sensor/test_ring.py @@ -0,0 +1,63 @@ +"""The tests for the Ring binary sensor platform.""" +import unittest +import requests_mock + +from homeassistant.components.binary_sensor import ring +from homeassistant.components import ring as base_ring + +from tests.components.test_ring import ATTRIBUTION, VALID_CONFIG +from tests.common import get_test_home_assistant, load_fixture + + +class TestRingBinarySensorSetup(unittest.TestCase): + """Test the Ring Binary Sensor platform.""" + + DEVICES = [] + + def add_devices(self, devices, action): + """Mock add devices.""" + for device in devices: + self.DEVICES.append(device) + + def setUp(self): + """Initialize values for this testcase class.""" + self.hass = get_test_home_assistant() + self.config = { + 'username': 'foo', + 'password': 'bar', + 'monitored_conditions': ['ding', 'motion'], + } + + def tearDown(self): + """Stop everything that was started.""" + self.hass.stop() + + @requests_mock.Mocker() + def test_binary_sensor(self, mock): + """Test the Ring sensor class and methods.""" + mock.post('https://api.ring.com/clients_api/session', + text=load_fixture('ring_session.json')) + mock.get('https://api.ring.com/clients_api/ring_devices', + text=load_fixture('ring_devices.json')) + mock.get('https://api.ring.com/clients_api/dings/active', + text=load_fixture('ring_ding_active.json')) + + base_ring.setup(self.hass, VALID_CONFIG) + ring.setup_platform(self.hass, + self.config, + self.add_devices, + None) + + for device in self.DEVICES: + device.update() + if device.name == 'Front Door Ding': + self.assertEqual('on', device.state) + self.assertEqual('America/New_York', + device.device_state_attributes['timezone']) + elif device.name == 'Front Door Motion': + self.assertEqual('off', device.state) + self.assertEqual('motion', device.device_class) + + self.assertIsNone(device.entity_picture) + self.assertEqual(ATTRIBUTION, + device.device_state_attributes['attribution']) diff --git a/tests/components/sensor/test_ring.py b/tests/components/sensor/test_ring.py index c7bf966a3e9..0ee72107413 100644 --- a/tests/components/sensor/test_ring.py +++ b/tests/components/sensor/test_ring.py @@ -1,171 +1,17 @@ """The tests for the Ring sensor platform.""" import unittest -from unittest import mock +import requests_mock from homeassistant.components.sensor import ring -from tests.common import get_test_home_assistant +from homeassistant.components import ring as base_ring -VALID_CONFIG = { - "platform": "ring", - "username": "foo", - "password": "bar", - "monitored_conditions": [ - "battery", "last_activity", "volume" - ] -} - -ATTRIBUTION = 'Data provided by Ring.com' +from tests.components.test_ring import ATTRIBUTION, VALID_CONFIG +from tests.common import get_test_home_assistant, load_fixture -def mocked_requests_get(*args, **kwargs): - """Mock requests.get invocations.""" - class MockResponse: - """Class to represent a mocked response.""" - - def __init__(self, json_data, status_code): - """Initialize the mock response class.""" - self.json_data = json_data - self.status_code = status_code - - def json(self): - """Return the json of the response.""" - return self.json_data - - if str(args[0]).startswith('https://api.ring.com/clients_api/session'): - return MockResponse({ - "profile": { - "authentication_token": "12345678910", - "email": "foo@bar.org", - "features": { - "chime_dnd_enabled": False, - "chime_pro_enabled": True, - "delete_all_enabled": True, - "delete_all_settings_enabled": False, - "device_health_alerts_enabled": True, - "floodlight_cam_enabled": True, - "live_view_settings_enabled": True, - "lpd_enabled": True, - "lpd_motion_announcement_enabled": False, - "multiple_calls_enabled": True, - "multiple_delete_enabled": True, - "nw_enabled": True, - "nw_larger_area_enabled": False, - "nw_user_activated": False, - "owner_proactive_snoozing_enabled": True, - "power_cable_enabled": False, - "proactive_snoozing_enabled": False, - "reactive_snoozing_enabled": False, - "remote_logging_format_storing": False, - "remote_logging_level": 1, - "ringplus_enabled": True, - "starred_events_enabled": True, - "stickupcam_setup_enabled": True, - "subscriptions_enabled": True, - "ujet_enabled": False, - "video_search_enabled": False, - "vod_enabled": False}, - "first_name": "Home", - "id": 999999, - "last_name": "Assistant"} - }, 201) - elif str(args[0])\ - .startswith("https://api.ring.com/clients_api/ring_devices"): - return MockResponse({ - "authorized_doorbots": [], - "chimes": [ - { - "address": "123 Main St", - "alerts": {"connection": "online"}, - "description": "Downstairs", - "device_id": "abcdef123", - "do_not_disturb": {"seconds_left": 0}, - "features": {"ringtones_enabled": True}, - "firmware_version": "1.2.3", - "id": 999999, - "kind": "chime", - "latitude": 12.000000, - "longitude": -70.12345, - "owned": True, - "owner": { - "email": "foo@bar.org", - "first_name": "Marcelo", - "id": 999999, - "last_name": "Assistant"}, - "settings": { - "ding_audio_id": None, - "ding_audio_user_id": None, - "motion_audio_id": None, - "motion_audio_user_id": None, - "volume": 2}, - "time_zone": "America/New_York"}], - "doorbots": [ - { - "address": "123 Main St", - "alerts": {"connection": "online"}, - "battery_life": 4081, - "description": "Front Door", - "device_id": "aacdef123", - "external_connection": False, - "features": { - "advanced_motion_enabled": False, - "motion_message_enabled": False, - "motions_enabled": True, - "people_only_enabled": False, - "shadow_correction_enabled": False, - "show_recordings": True}, - "firmware_version": "1.4.26", - "id": 987652, - "kind": "lpd_v1", - "latitude": 12.000000, - "longitude": -70.12345, - "motion_snooze": None, - "owned": True, - "owner": { - "email": "foo@bar.org", - "first_name": "Home", - "id": 999999, - "last_name": "Assistant"}, - "settings": { - "chime_settings": { - "duration": 3, - "enable": True, - "type": 0}, - "doorbell_volume": 1, - "enable_vod": True, - "live_view_preset_profile": "highest", - "live_view_presets": [ - "low", - "middle", - "high", - "highest"], - "motion_announcement": False, - "motion_snooze_preset_profile": "low", - "motion_snooze_presets": [ - "none", - "low", - "medium", - "high"]}, - "subscribed": True, - "subscribed_motions": True, - "time_zone": "America/New_York"}] - }, 200) - elif str(args[0]).startswith("https://api.ring.com/clients_api/doorbots"): - return MockResponse([{ - "answered": False, - "created_at": "2017-03-05T15:03:40.000Z", - "events": [], - "favorite": False, - "id": 987654321, - "kind": "motion", - "recording": {"status": "ready"}, - "snapshot_url": "" - }], 200) - - -class TestRingSetup(unittest.TestCase): +class TestRingSensorSetup(unittest.TestCase): """Test the Ring platform.""" - # pylint: disable=invalid-name DEVICES = [] def add_devices(self, devices, action): @@ -176,25 +22,35 @@ class TestRingSetup(unittest.TestCase): def setUp(self): """Initialize values for this testcase class.""" self.hass = get_test_home_assistant() - self.config = VALID_CONFIG + self.config = { + 'username': 'foo', + 'password': 'bar', + 'monitored_conditions': [ + 'battery', + 'last_activity', + 'last_ding', + 'last_motion', + 'volume'] + } def tearDown(self): """Stop everything that was started.""" self.hass.stop() - @mock.patch('requests.Session.get', side_effect=mocked_requests_get) - @mock.patch('requests.Session.post', side_effect=mocked_requests_get) - def test_setup(self, get_mock, post_mock): - """Test if component loaded successfully.""" - self.assertTrue( - ring.setup_platform(self.hass, VALID_CONFIG, - self.add_devices, None)) - - @mock.patch('requests.Session.get', side_effect=mocked_requests_get) - @mock.patch('requests.Session.post', side_effect=mocked_requests_get) - def test_sensor(self, get_mock, post_mock): - """Test the Ring sensor class and methods.""" - ring.setup_platform(self.hass, VALID_CONFIG, self.add_devices, None) + @requests_mock.Mocker() + def test_sensor(self, mock): + """Test the Ring senskor class and methods.""" + mock.post('https://api.ring.com/clients_api/session', + text=load_fixture('ring_session.json')) + mock.get('https://api.ring.com/clients_api/ring_devices', + text=load_fixture('ring_devices.json')) + mock.get('https://api.ring.com/clients_api/doorbots/987652/history', + text=load_fixture('ring_doorbots.json')) + base_ring.setup(self.hass, VALID_CONFIG) + ring.setup_platform(self.hass, + self.config, + self.add_devices, + None) for device in self.DEVICES: device.update() diff --git a/tests/components/test_ring.py b/tests/components/test_ring.py new file mode 100644 index 00000000000..e10e5c20aea --- /dev/null +++ b/tests/components/test_ring.py @@ -0,0 +1,56 @@ +"""The tests for the Ring component.""" +import unittest +import requests_mock + +from homeassistant import setup +import homeassistant.components.ring as ring + +from tests.common import get_test_home_assistant, load_fixture + +ATTRIBUTION = 'Data provided by Ring.com' + +VALID_CONFIG = { + "ring": { + "username": "foo", + "password": "bar", + } +} + + +class TestRing(unittest.TestCase): + """Tests the Ring component.""" + + def setUp(self): + """Initialize values for this test case class.""" + self.hass = get_test_home_assistant() + self.config = VALID_CONFIG + + def tearDown(self): # pylint: disable=invalid-name + """Stop everything that was started.""" + self.hass.stop() + + @requests_mock.Mocker() + def test_setup(self, mock): + """Test the setup.""" + mock.post('https://api.ring.com/clients_api/session', + text=load_fixture('ring_session.json')) + response = ring.setup(self.hass, self.config) + self.assertTrue(response) + + @requests_mock.Mocker() + def test_setup_component_no_login(self, mock): + """Test the setup when no login is configured.""" + mock.post('https://api.ring.com/clients_api/session', + text=load_fixture('ring_session.json')) + conf = self.config.copy() + del conf['ring']['username'] + assert not setup.setup_component(self.hass, ring.DOMAIN, conf) + + @requests_mock.Mocker() + def test_setup_component_no_pwd(self, mock): + """Test the setup when no password is configured.""" + mock.post('https://api.ring.com/clients_api/session', + text=load_fixture('ring_session.json')) + conf = self.config.copy() + del conf['ring']['password'] + assert not setup.setup_component(self.hass, ring.DOMAIN, conf) diff --git a/tests/fixtures/ring_devices.json b/tests/fixtures/ring_devices.json new file mode 100644 index 00000000000..4d204ba5250 --- /dev/null +++ b/tests/fixtures/ring_devices.json @@ -0,0 +1,79 @@ +{ + "authorized_doorbots": [], + "chimes": [ + { + "address": "123 Main St", + "alerts": {"connection": "online"}, + "description": "Downstairs", + "device_id": "abcdef123", + "do_not_disturb": {"seconds_left": 0}, + "features": {"ringtones_enabled": true}, + "firmware_version": "1.2.3", + "id": 999999, + "kind": "chime", + "latitude": 12.000000, + "longitude": -70.12345, + "owned": true, + "owner": { + "email": "foo@bar.org", + "first_name": "Marcelo", + "id": 999999, + "last_name": "Assistant"}, + "settings": { + "ding_audio_id": null, + "ding_audio_user_id": null, + "motion_audio_id": null, + "motion_audio_user_id": null, + "volume": 2}, + "time_zone": "America/New_York"}], + "doorbots": [ + { + "address": "123 Main St", + "alerts": {"connection": "online"}, + "battery_life": 4081, + "description": "Front Door", + "device_id": "aacdef123", + "external_connection": false, + "features": { + "advanced_motion_enabled": false, + "motion_message_enabled": false, + "motions_enabled": true, + "people_only_enabled": false, + "shadow_correction_enabled": false, + "show_recordings": true}, + "firmware_version": "1.4.26", + "id": 987652, + "kind": "lpd_v1", + "latitude": 12.000000, + "longitude": -70.12345, + "motion_snooze": null, + "owned": true, + "owner": { + "email": "foo@bar.org", + "first_name": "Home", + "id": 999999, + "last_name": "Assistant"}, + "settings": { + "chime_settings": { + "duration": 3, + "enable": true, + "type": 0}, + "doorbell_volume": 1, + "enable_vod": true, + "live_view_preset_profile": "highest", + "live_view_presets": [ + "low", + "middle", + "high", + "highest"], + "motion_announcement": false, + "motion_snooze_preset_profile": "low", + "motion_snooze_presets": [ + "null", + "low", + "medium", + "high"]}, + "subscribed": true, + "subscribed_motions": true, + "time_zone": "America/New_York"}] +} diff --git a/tests/fixtures/ring_ding_active.json b/tests/fixtures/ring_ding_active.json new file mode 100644 index 00000000000..6bbcc0ee3f9 --- /dev/null +++ b/tests/fixtures/ring_ding_active.json @@ -0,0 +1,26 @@ +[{ + "audio_jitter_buffer_ms": 0, + "device_kind": "lpd_v1", + "doorbot_description": "Front Door", + "doorbot_id": 12345, + "expires_in": 180, + "id": 123456789, + "id_str": "123456789", + "kind": "ding", + "motion": false, + "now": 1490949469.5498993, + "optimization_level": 1, + "protocol": "sip", + "sip_ding_id": "123456789", + "sip_endpoints": null, + "sip_from": "sip:abc123@ring.com", + "sip_server_ip": "192.168.0.1", + "sip_server_port": "15063", + "sip_server_tls": "false", + "sip_session_id": "28qdvjh-2043", + "sip_to": "sip:28qdvjh-2043@192.168.0.1:15063;transport=tcp", + "sip_token": "adecc24a428ed704b2d80adb621b5775755915529639e", + "snapshot_url": "", + "state": "ringing", + "video_jitter_buffer_ms": 0 +}] diff --git a/tests/fixtures/ring_doorbots.json b/tests/fixtures/ring_doorbots.json new file mode 100644 index 00000000000..7ec2d4fd0b7 --- /dev/null +++ b/tests/fixtures/ring_doorbots.json @@ -0,0 +1,10 @@ +[{ + "answered": false, + "created_at": "2017-03-05T15:03:40.000Z", + "events": [], + "favorite": false, + "id": 987654321, + "kind": "motion", + "recording": {"status": "ready"}, + "snapshot_url": "" +}] diff --git a/tests/fixtures/ring_session.json b/tests/fixtures/ring_session.json new file mode 100644 index 00000000000..21ae51c6bf6 --- /dev/null +++ b/tests/fixtures/ring_session.json @@ -0,0 +1,36 @@ +{ + "profile": { + "authentication_token": "12345678910", + "email": "foo@bar.org", + "features": { + "chime_dnd_enabled": false, + "chime_pro_enabled": true, + "delete_all_enabled": true, + "delete_all_settings_enabled": false, + "device_health_alerts_enabled": true, + "floodlight_cam_enabled": true, + "live_view_settings_enabled": true, + "lpd_enabled": true, + "lpd_motion_announcement_enabled": false, + "multiple_calls_enabled": true, + "multiple_delete_enabled": true, + "nw_enabled": true, + "nw_larger_area_enabled": false, + "nw_user_activated": false, + "owner_proactive_snoozing_enabled": true, + "power_cable_enabled": false, + "proactive_snoozing_enabled": false, + "reactive_snoozing_enabled": false, + "remote_logging_format_storing": false, + "remote_logging_level": 1, + "ringplus_enabled": true, + "starred_events_enabled": true, + "stickupcam_setup_enabled": true, + "subscriptions_enabled": true, + "ujet_enabled": false, + "video_search_enabled": false, + "vod_enabled": false}, + "first_name": "Home", + "id": 999999, + "last_name": "Assistant"} +} From ac25eff2d0f0dce92de901f946d3546d26b91f5f Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 31 Mar 2017 21:37:34 +0200 Subject: [PATCH 056/116] Upgrade sendgrid to 3.6.5 (#6866) --- homeassistant/components/notify/sendgrid.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/notify/sendgrid.py b/homeassistant/components/notify/sendgrid.py index 458113d1cdf..f2ef64a9ea0 100644 --- a/homeassistant/components/notify/sendgrid.py +++ b/homeassistant/components/notify/sendgrid.py @@ -13,7 +13,7 @@ from homeassistant.components.notify import ( from homeassistant.const import (CONF_API_KEY, CONF_SENDER, CONF_RECIPIENT) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['sendgrid==3.6.3'] +REQUIREMENTS = ['sendgrid==3.6.5'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index ac0d6a3752f..678f1d8c464 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -683,7 +683,7 @@ schiene==0.18 scsgate==0.1.0 # homeassistant.components.notify.sendgrid -sendgrid==3.6.3 +sendgrid==3.6.5 # homeassistant.components.sensor.sensehat sense-hat==2.2.0 From 573b2a11c0c6f6938235c50c5951879d68e1a408 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 31 Mar 2017 21:39:22 +0200 Subject: [PATCH 057/116] Upgrade sphinx-autodoc-typehints to 1.2.0 (#6865) --- requirements_docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_docs.txt b/requirements_docs.txt index e3e89425109..19c305afc4d 100644 --- a/requirements_docs.txt +++ b/requirements_docs.txt @@ -1,3 +1,3 @@ Sphinx==1.5.3 -sphinx-autodoc-typehints==1.1.0 +sphinx-autodoc-typehints==1.2.0 sphinx-autodoc-annotation==1.0.post1 From 2d6b09586db3d9d8c3c082ea117c9edc22e93107 Mon Sep 17 00:00:00 2001 From: Jacob Tomlinson Date: Fri, 31 Mar 2017 21:03:27 +0100 Subject: [PATCH 058/116] Added Met Office weather and sensor components (#6742) * Added Met Office weather and sensor components * Removed unnecessary dependancy * Generated requirements * Fix time interval * Updated coverage * Some review changes * Allow user to specify lat and lon in component * Added missing import * Fixed unit * Fixed import indent * Updated condition to use CONDITION_CLASSES --- .coveragerc | 4 +- homeassistant/components/sensor/metoffice.py | 176 ++++++++++++++++++ homeassistant/components/weather/metoffice.py | 122 ++++++++++++ requirements_all.txt | 4 + 4 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/sensor/metoffice.py create mode 100644 homeassistant/components/weather/metoffice.py diff --git a/.coveragerc b/.coveragerc index 52b88444dc6..939565ed43a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -147,7 +147,7 @@ omit = homeassistant/components/tado.py homeassistant/components/*/tado.py - + homeassistant/components/alarm_control_panel/alarmdotcom.py homeassistant/components/alarm_control_panel/concord232.py homeassistant/components/alarm_control_panel/nx584.py @@ -359,6 +359,7 @@ omit = homeassistant/components/sensor/linux_battery.py homeassistant/components/sensor/loopenergy.py homeassistant/components/sensor/lyft.py + homeassistant/components/sensor/metoffice.py homeassistant/components/sensor/miflora.py homeassistant/components/sensor/modem_callerid.py homeassistant/components/sensor/mqtt_room.py @@ -434,6 +435,7 @@ omit = homeassistant/components/tts/picotts.py homeassistant/components/upnp.py homeassistant/components/weather/bom.py + homeassistant/components/weather/metoffice.py homeassistant/components/weather/openweathermap.py homeassistant/components/weather/zamg.py homeassistant/components/zeroconf.py diff --git a/homeassistant/components/sensor/metoffice.py b/homeassistant/components/sensor/metoffice.py new file mode 100644 index 00000000000..725fca1db44 --- /dev/null +++ b/homeassistant/components/sensor/metoffice.py @@ -0,0 +1,176 @@ +""" +Support for UK Met Office weather service. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.metoffice/ +""" + +import logging +from datetime import timedelta + +import voluptuous as vol + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import ( + CONF_MONITORED_CONDITIONS, TEMP_CELSIUS, STATE_UNKNOWN, CONF_NAME, + ATTR_ATTRIBUTION, CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE) +from homeassistant.helpers.entity import Entity +from homeassistant.util import Throttle +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['datapoint==0.4.3'] + +CONF_ATTRIBUTION = "Data provided by the Met Office" + +CONDITION_CLASSES = { + 'cloudy': ["7", "8"], + 'fog': ["5", "6"], + 'hail': ["19", "20", "21"], + 'lightning': ["30"], + 'lightning-rainy': ["28", "29"], + 'partlycloudy': ["2", "3"], + 'pouring': ["13", "14", "15"], + 'rainy': ["9", "10", "11", "12"], + 'snowy': ["22", "23", "24", "25", "26", "27"], + 'snowy-rainy': ["16", "17", "18"], + 'sunny': ["0", "1"], + 'windy': [], + 'windy-variant': [], + 'exceptional': [], +} + +SCAN_INTERVAL = timedelta(minutes=35) + +# Sensor types are defined like: Name, units +SENSOR_TYPES = { + 'name': ['Station Name', None], + 'weather': ['Weather', None], + 'temperature': ['Temperature', TEMP_CELSIUS], + 'feels_like_temperature': ['Feels Like Temperature', TEMP_CELSIUS], + 'wind_speed': ['Wind Speed', 'm/s'], + 'wind_direction': ['Wind Direction', None], + 'wind_gust': ['Wind Gust', 'm/s'], + 'visibility': ['Visibility', 'km'], + 'uv': ['UV', None], + 'precipitation': ['Probability of Precipitation', '%'], + 'humidity': ['Humidity', '%'] +} + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_NAME, default=None): cv.string, + vol.Required(CONF_API_KEY): cv.string, + vol.Required(CONF_MONITORED_CONDITIONS, default=[]): + vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the sensor platform.""" + import datapoint as dp + datapoint = dp.connection(api_key=config.get(CONF_API_KEY)) + + latitude = config.get(CONF_LATITUDE, hass.config.latitude) + longitude = config.get(CONF_LONGITUDE, hass.config.longitude) + + if None in (latitude, longitude): + _LOGGER.error("Latitude or longitude not set in Home Assistant config") + return False + + try: + site = datapoint.get_nearest_site(latitude=latitude, + longitude=longitude) + except dp.exceptions.APIException as err: + _LOGGER.error("Received error from Met Office Datapoint: %s", err) + return False + + if not site: + _LOGGER.error("Unable to get nearest Met Office forecast site") + return False + + # Get data + data = MetOfficeCurrentData(hass, datapoint, site) + try: + data.update() + except (ValueError, dp.exceptions.APIException) as err: + _LOGGER.error("Received error from Met Office Datapoint: %s", err) + return False + + # Add + add_devices([MetOfficeCurrentSensor(site, data, variable) + for variable in config[CONF_MONITORED_CONDITIONS]]) + return True + + +class MetOfficeCurrentSensor(Entity): + """Implementation of a Met Office current sensor.""" + + def __init__(self, site, data, condition): + """Initialize the sensor.""" + self.site = site + self.data = data + self._condition = condition + + @property + def name(self): + """Return the name of the sensor.""" + return 'Met Office {}'.format(SENSOR_TYPES[self._condition][0]) + + @property + def state(self): + """Return the state of the sensor.""" + if self._condition in self.data.data.__dict__.keys(): + variable = getattr(self.data.data, self._condition) + if self._condition == "weather": + return [k for k, v in CONDITION_CLASSES.items() if + self.data.data.weather.value in v][0] + else: + return variable.value + else: + return STATE_UNKNOWN + + @property + def unit_of_measurement(self): + """Return the unit of measurement.""" + return SENSOR_TYPES[self._condition][1] + + @property + def device_state_attributes(self): + """Return the state attributes of the device.""" + attr = {} + attr['Sensor Id'] = self._condition + attr['Site Id'] = self.site.id + attr['Site Name'] = self.site.name + attr['Last Update'] = self.data.lastupdate + attr[ATTR_ATTRIBUTION] = CONF_ATTRIBUTION + return attr + + def update(self): + """Update current conditions.""" + self.data.update() + + +class MetOfficeCurrentData(object): + """Get data from Datapoint.""" + + def __init__(self, hass, datapoint, site): + """Initialize the data object.""" + self._hass = hass + self._datapoint = datapoint + self._site = site + self.data = None + + @Throttle(SCAN_INTERVAL) + def update(self): + """Get the latest data from Datapoint.""" + import datapoint as dp + + try: + forecast = self._datapoint.get_forecast_for_site(self._site.id, + "3hourly") + self.data = forecast.now() + except (ValueError, dp.exceptions.APIException) as err: + _LOGGER.error("Check Met Office %s", err.args) + self.data = None + raise diff --git a/homeassistant/components/weather/metoffice.py b/homeassistant/components/weather/metoffice.py new file mode 100644 index 00000000000..50bbb84faa7 --- /dev/null +++ b/homeassistant/components/weather/metoffice.py @@ -0,0 +1,122 @@ +""" +Support for UK Met Office weather service. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/weather.metoffice/ +""" +import logging + +import voluptuous as vol + +from homeassistant.components.weather import WeatherEntity, PLATFORM_SCHEMA +from homeassistant.const import ( + CONF_NAME, TEMP_CELSIUS, CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE) +from homeassistant.helpers import config_validation as cv +# Reuse data and API logic from the sensor implementation +from homeassistant.components.sensor.metoffice import \ + MetOfficeCurrentData, CONF_ATTRIBUTION, CONDITION_CLASSES + +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['datapoint==0.4.3'] + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_NAME): cv.string, + vol.Required(CONF_API_KEY): cv.string, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the Met Office weather platform.""" + import datapoint as dp + datapoint = dp.connection(api_key=config.get(CONF_API_KEY)) + + latitude = config.get(CONF_LATITUDE, hass.config.latitude) + longitude = config.get(CONF_LONGITUDE, hass.config.longitude) + + if None in (latitude, longitude): + _LOGGER.error("Latitude or longitude not set in Home Assistant config") + return False + + try: + site = datapoint.get_nearest_site(latitude=latitude, + longitude=longitude) + except dp.exceptions.APIException as err: + _LOGGER.error("Received error from Met Office Datapoint: %s", err) + return False + + if not site: + _LOGGER.error("Unable to get nearest Met Office forecast site") + return False + + # Get data + data = MetOfficeCurrentData(hass, datapoint, site) + try: + data.update() + except (ValueError, dp.exceptions.APIException) as err: + _LOGGER.error("Received error from Met Office Datapoint: %s", err) + return False + add_devices([MetOfficeWeather(site, data, config.get(CONF_NAME))], + True) + return True + + +class MetOfficeWeather(WeatherEntity): + """Implementation of a Met Office weather condition.""" + + def __init__(self, site, data, config): + """Initialise the platform with a data instance and site.""" + self.data = data + self.site = site + + def update(self): + """Update current conditions.""" + self.data.update() + + @property + def name(self): + """Return the name of the sensor.""" + return 'Met Office ({})'.format(self.site.name) + + @property + def condition(self): + """Return the current condition.""" + return [k for k, v in CONDITION_CLASSES.items() if + self.data.data.weather.value in v][0] + + # Now implement the WeatherEntity interface + + @property + def temperature(self): + """Return the platform temperature.""" + return self.data.data.temperature.value + + @property + def temperature_unit(self): + """Return the unit of measurement.""" + return TEMP_CELSIUS + + @property + def pressure(self): + """Return the mean sea-level pressure.""" + return None + + @property + def humidity(self): + """Return the relative humidity.""" + return self.data.data.humidity.value + + @property + def wind_speed(self): + """Return the wind speed.""" + return self.data.data.wind_speed.value + + @property + def wind_bearing(self): + """Return the wind bearing.""" + return self.data.data.wind_direction.value + + @property + def attribution(self): + """Return the attribution.""" + return CONF_ATTRIBUTION diff --git a/requirements_all.txt b/requirements_all.txt index 678f1d8c464..9caba7d75d5 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -105,6 +105,10 @@ colorlog>2.1,<3 # homeassistant.components.binary_sensor.concord232 concord232==0.14 +# homeassistant.components.sensor.metoffice +# homeassistant.components.weather.metoffice +datapoint==0.4.3 + # homeassistant.components.light.decora # decora==0.3 From a0bb554f8ac6d3e84729ab75498eb9795e5eed4e Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Fri, 31 Mar 2017 22:57:29 +0200 Subject: [PATCH 059/116] Upgrade speedtest-cli to 1.0.3 (#6867) --- homeassistant/components/sensor/speedtest.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/speedtest.py b/homeassistant/components/sensor/speedtest.py index 00d8d24853e..76dbbe4ed39 100644 --- a/homeassistant/components/sensor/speedtest.py +++ b/homeassistant/components/sensor/speedtest.py @@ -20,7 +20,7 @@ from homeassistant.helpers.entity import Entity from homeassistant.helpers.event import track_time_change from homeassistant.helpers.restore_state import async_get_last_state -REQUIREMENTS = ['speedtest-cli==1.0.2'] +REQUIREMENTS = ['speedtest-cli==1.0.3'] _LOGGER = logging.getLogger(__name__) _SPEEDTEST_REGEX = re.compile(r'Ping:\s(\d+\.\d+)\sms[\r\n]+' diff --git a/requirements_all.txt b/requirements_all.txt index 9caba7d75d5..cdebbdf5b0f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -714,7 +714,7 @@ snapcast==1.2.2 somecomfort==0.4.1 # homeassistant.components.sensor.speedtest -speedtest-cli==1.0.2 +speedtest-cli==1.0.3 # homeassistant.components.recorder # homeassistant.scripts.db_migrator From 65b9383e04c9f7031495476af6cfd9a4b8e641aa Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sat, 1 Apr 2017 06:36:04 -0400 Subject: [PATCH 060/116] Bumped amcrest module to 1.1.5 (#6872) --- homeassistant/components/camera/amcrest.py | 2 +- homeassistant/components/sensor/amcrest.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/camera/amcrest.py b/homeassistant/components/camera/amcrest.py index 9bf89b8b3a5..294a63bcff9 100644 --- a/homeassistant/components/camera/amcrest.py +++ b/homeassistant/components/camera/amcrest.py @@ -18,7 +18,7 @@ from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import ( async_get_clientsession, async_aiohttp_proxy_web) -REQUIREMENTS = ['amcrest==1.1.4'] +REQUIREMENTS = ['amcrest==1.1.5'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/sensor/amcrest.py b/homeassistant/components/sensor/amcrest.py index f250905e952..79e886c154d 100644 --- a/homeassistant/components/sensor/amcrest.py +++ b/homeassistant/components/sensor/amcrest.py @@ -20,7 +20,7 @@ import homeassistant.loader as loader from requests.exceptions import HTTPError, ConnectTimeout -REQUIREMENTS = ['amcrest==1.1.4'] +REQUIREMENTS = ['amcrest==1.1.5'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index cdebbdf5b0f..94f4ecadfae 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -48,7 +48,7 @@ aiolifx==0.4.2 # homeassistant.components.camera.amcrest # homeassistant.components.sensor.amcrest -amcrest==1.1.4 +amcrest==1.1.5 # homeassistant.components.media_player.anthemav anthemav==1.1.8 From ec2df2ca0f631fb213c4a66a119889666cb836a0 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 1 Apr 2017 12:36:24 +0200 Subject: [PATCH 061/116] Upgrade pytz to 2017.02 (#6875) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index e052c662e3b..a8e8df3d250 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -1,6 +1,6 @@ requests>=2,<3 pyyaml>=3.11,<4 -pytz>=2016.10 +pytz>=2017.02 pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 diff --git a/requirements_all.txt b/requirements_all.txt index 94f4ecadfae..cf0d5ee646d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1,7 +1,7 @@ # Home Assistant core requests>=2,<3 pyyaml>=3.11,<4 -pytz>=2016.10 +pytz>=2017.02 pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 diff --git a/setup.py b/setup.py index 5e973790dcc..cdc4c43e7a2 100755 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ PACKAGES = find_packages(exclude=['tests', 'tests.*']) REQUIRES = [ 'requests>=2,<3', 'pyyaml>=3.11,<4', - 'pytz>=2016.10', + 'pytz>=2017.02', 'pip>=7.1.0', 'jinja2>=2.9.5', 'voluptuous==0.9.3', From 7afe694cc7451ea76c48b6f4539a33825764e1c2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 1 Apr 2017 12:36:35 +0200 Subject: [PATCH 062/116] Upgrade aiohttp_cors to 0.5.2 (#6874) --- homeassistant/components/http/__init__.py | 3 ++- requirements_all.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/http/__init__.py b/homeassistant/components/http/__init__.py index f99b2390bb8..ee107ec5cfa 100644 --- a/homeassistant/components/http/__init__.py +++ b/homeassistant/components/http/__init__.py @@ -34,8 +34,9 @@ from .static import ( staticresource_middleware, CachingFileResponse, CachingStaticResource) from .util import get_real_ip +REQUIREMENTS = ['aiohttp_cors==0.5.2'] + DOMAIN = 'http' -REQUIREMENTS = ('aiohttp_cors==0.5.0',) CONF_API_PASSWORD = 'api_password' CONF_SERVER_HOST = 'server_host' diff --git a/requirements_all.txt b/requirements_all.txt index cf0d5ee646d..0b0e53fdefe 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -41,7 +41,7 @@ aiodns==1.1.1 # homeassistant.components.emulated_hue # homeassistant.components.http -aiohttp_cors==0.5.0 +aiohttp_cors==0.5.2 # homeassistant.components.light.lifx aiolifx==0.4.2 From 395f9b654891a0c6454e7e869893f6fadf5ad148 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 1 Apr 2017 12:36:46 +0200 Subject: [PATCH 063/116] Upgrade sqlalchemy to 1.1.8 (#6873) --- homeassistant/components/recorder/__init__.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 0ed5c3126b7..a56ad775eac 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -35,7 +35,7 @@ from .util import session_scope DOMAIN = 'recorder' -REQUIREMENTS = ['sqlalchemy==1.1.6'] +REQUIREMENTS = ['sqlalchemy==1.1.8'] DEFAULT_URL = 'sqlite:///{hass_config_path}' DEFAULT_DB_FILE = 'home-assistant_v2.db' diff --git a/requirements_all.txt b/requirements_all.txt index 0b0e53fdefe..088d81dde65 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -718,7 +718,7 @@ speedtest-cli==1.0.3 # homeassistant.components.recorder # homeassistant.scripts.db_migrator -sqlalchemy==1.1.6 +sqlalchemy==1.1.8 # homeassistant.components.statsd statsd==3.2.1 From 2413d97415a62eebad4540c4704fed8bd8b02c97 Mon Sep 17 00:00:00 2001 From: ChristianKuehnel Date: Sun, 2 Apr 2017 11:41:53 +0200 Subject: [PATCH 064/116] added support for Fibaro FGR-222 (similar to FGRM-222) (#6890) --- homeassistant/components/zwave/workaround.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/homeassistant/components/zwave/workaround.py b/homeassistant/components/zwave/workaround.py index 27e98457a2d..8971658d9ec 100644 --- a/homeassistant/components/zwave/workaround.py +++ b/homeassistant/components/zwave/workaround.py @@ -15,6 +15,7 @@ PHILIO_PAN07 = 0x0005 # Product Types FGFS101_FLOOD_SENSOR_TYPE = 0x0b00 FGRM222_SHUTTER2 = 0x0301 +FGR222_SHUTTER2 = 0x0302 PHILIO_SWITCH = 0x0001 PHILIO_SENSOR = 0x0002 SOMFY_ZRTSI = 0x5a52 @@ -54,12 +55,15 @@ FIBARO_FGFS101_SENSOR_ALARM = ( FIBARO, FGFS101_FLOOD_SENSOR_TYPE, const.COMMAND_CLASS_SENSOR_ALARM) FIBARO_FGRM222_BINARY = ( FIBARO, FGRM222_SHUTTER2, const.COMMAND_CLASS_SWITCH_BINARY) +FIBARO_FGR222_BINARY = ( + FIBARO, FGR222_SHUTTER2, const.COMMAND_CLASS_SWITCH_BINARY) # List of component workarounds by # (manufacturer_id, product_type, command_class) DEVICE_COMPONENT_MAPPING = { FIBARO_FGFS101_SENSOR_ALARM: 'binary_sensor', FIBARO_FGRM222_BINARY: WORKAROUND_IGNORE, + FIBARO_FGR222_BINARY: WORKAROUND_IGNORE, } From 8806265e99b8bfb93cd5dfdba65bc9998eaf736f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Sun, 2 Apr 2017 14:12:38 +0200 Subject: [PATCH 065/116] Fluxled (#6892) * Update flux_led lib --- homeassistant/components/light/flux_led.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/light/flux_led.py b/homeassistant/components/light/flux_led.py index ca18511c660..97b2d1a1d23 100644 --- a/homeassistant/components/light/flux_led.py +++ b/homeassistant/components/light/flux_led.py @@ -18,7 +18,7 @@ from homeassistant.components.light import ( PLATFORM_SCHEMA) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['flux_led==0.16'] +REQUIREMENTS = ['flux_led==0.17'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 088d81dde65..a7740065776 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -168,7 +168,7 @@ fitbit==0.2.3 fixerio==0.1.1 # homeassistant.components.light.flux_led -flux_led==0.16 +flux_led==0.17 # homeassistant.components.notify.free_mobile freesms==0.1.1 From 864b57d42c4a9bc490dbe0dd6cc738929d38cd6b Mon Sep 17 00:00:00 2001 From: Wolfgang Malgadey Date: Sun, 2 Apr 2017 18:47:15 +0200 Subject: [PATCH 066/116] Fix Tado climate set off mode (#6848) --- homeassistant/components/tado.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/tado.py b/homeassistant/components/tado.py index ffb4da61fed..b7758c95c0e 100644 --- a/homeassistant/components/tado.py +++ b/homeassistant/components/tado.py @@ -122,6 +122,6 @@ class TadoDataStore: """Wrapper for resetZoneOverlay(..).""" return self.tado.resetZoneOverlay(zone_id) - def set_zone_overlay(self, zone_id, mode, temperature): + def set_zone_overlay(self, zone_id, mode, temperature=None, duration=None): """Wrapper for setZoneOverlay(..).""" - return self.tado.setZoneOverlay(zone_id, mode, temperature) + return self.tado.setZoneOverlay(zone_id, mode, temperature, duration) From f0027e3cc1cff9c860f60cf3f1514058783f308a Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 2 Apr 2017 18:31:28 -0400 Subject: [PATCH 067/116] Fox UMP volume set (#6904) async needs consistant paramater namming accross platforms. This fixes UMP's volume set method by renaming the paramater. --- homeassistant/components/media_player/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/media_player/universal.py b/homeassistant/components/media_player/universal.py index b5f88eb28a4..5dfe007976f 100644 --- a/homeassistant/components/media_player/universal.py +++ b/homeassistant/components/media_player/universal.py @@ -425,12 +425,12 @@ class UniversalMediaPlayer(MediaPlayerDevice): return self._async_call_service( SERVICE_VOLUME_MUTE, data, allow_override=True) - def async_set_volume_level(self, volume_level): + def async_set_volume_level(self, volume): """Set volume level, range 0..1. This method must be run in the event loop and returns a coroutine. """ - data = {ATTR_MEDIA_VOLUME_LEVEL: volume_level} + data = {ATTR_MEDIA_VOLUME_LEVEL: volume} return self._async_call_service( SERVICE_VOLUME_SET, data, allow_override=True) From 36e5878b2e3a741e2a022eca22dae716d48d6cae Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 2 Apr 2017 17:01:51 -0700 Subject: [PATCH 068/116] Move examples out (#6908) * Remove examples from main repo * Simplify README * Point screenshot for components at dev branch for now --- .gitignore | 11 - README.rst | 82 +---- config/configuration.yaml.example | 158 --------- config/custom_components/example.py | 149 -------- config/custom_components/hello_world.py | 27 -- config/custom_components/mqtt_example.py | 55 --- config/panels/react.html | 432 ----------------------- docs/screenshot-components.png | Bin 0 -> 47635 bytes 8 files changed, 9 insertions(+), 905 deletions(-) delete mode 100644 config/configuration.yaml.example delete mode 100644 config/custom_components/example.py delete mode 100644 config/custom_components/hello_world.py delete mode 100644 config/custom_components/mqtt_example.py delete mode 100644 config/panels/react.html create mode 100755 docs/screenshot-components.png diff --git a/.gitignore b/.gitignore index aa27aa435bd..d5c29180e09 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,4 @@ config/* -!config/home-assistant.conf.default - -# There is not a better solution afaik.. -!config/custom_components -config/custom_components/* -!config/custom_components/example.py -!config/custom_components/hello_world.py -!config/custom_components/mqtt_example.py -!config/panels -config/panels/* -!config/panels/react.html tests/testing_config/deps tests/testing_config/home-assistant.log diff --git a/README.rst b/README.rst index 2b166cd9a13..ec0a770b1da 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,7 @@ Home Assistant |Build Status| |Coverage Status| |Join the chat at https://gitter.im/home-assistant/home-assistant| |Join the dev chat at https://gitter.im/home-assistant/home-assistant/devs| ============================================================================================================================================================================================== -Home Assistant is a home automation platform running on Python 3. The -goal of Home Assistant is to be able to track and control all devices at -home and offer a platform for automating control. +Home Assistant is a home automation platform running on Python 3. It is to be able to track and control all devices at home and offer a platform for automating control. To get started: @@ -12,83 +10,19 @@ To get started: python3 -m pip install homeassistant hass --open-ui -Check out `the website `__ for `a -demo `__, installation instructions, -tutorials and documentation. +Check out `home-assistant.io `__ for `a +demo `__, `installation instructions `__, +`tutorials `__ and `documentation `__. |screenshot-states| -Examples of devices Home Assistant can interface with: +|screenshot-components| -- Monitoring connected devices to a wireless router: - `OpenWrt `__, - `Tomato `__, - `Netgear `__, - `DD-WRT `__, - `TPLink `__, - `ASUSWRT `__, - `Xiaomi `__ and any SNMP - capable Linksys WAP/WRT -- `Philips Hue `__ lights, - `WeMo `__ - switches, `Edimax `__ switches, - `Efergy `__ energy monitoring, and - `Tellstick `__ devices and - sensors -- `Google - Chromecasts `__, - `Music Player Daemon `__, `Logitech - Squeezebox `__, - `Plex `__, `Kodi (XBMC) `__, - iTunes (by way of - `itunes-api `__), and Amazon - Fire TV (by way of - `python-firetv `__) -- Support for - `ISY994 `__ - (Insteon and X10 devices), `Z-Wave `__, `Nest - Thermostats `__, - `RFXtrx `__, - `Arduino `__, `Raspberry - Pi `__, and - `Modbus `__ -- Interaction with `IFTTT `__ -- Integrate data from the `Bitcoin `__ network, - meteorological data from - `OpenWeatherMap `__ and - `Forecast.io `__, - `Transmission `__, or - `SABnzbd `__. -- `See full list of supported - devices `__ - -Build home automation on top of your devices: - -- Keep a precise history of every change to the state of your house -- Turn on the lights when people get home after sunset -- Turn on lights slowly during sunset to compensate for less light -- Turn off all lights and devices when everybody leaves the house -- Offers a `REST API `__ - and can interface with MQTT for easy integration with other projects - like `OwnTracks `__ -- Allow sending notifications using - `Instapush `__, `Notify My Android - (NMA) `__, - `PushBullet `__, - `PushOver `__, - `Slack `__, - `Telegram `__, `Join `__, and `Jabber - (XMPP) `__ - -The system is built using a modular approach so support for other devices or actions can -be implemented easily. See also the `section on -architecture `__ -and the `section on creating your own +The system is built using a modular approach so support for other devices or actions can be implemented easily. See also the `section on architecture `__ and the `section on creating your own components `__. If you run into issues while using Home Assistant or during development -of a component, check the `Home Assistant help -section `__ of our website for further help and information. +of a component, check the `Home Assistant help section `__ of our website for further help and information. .. |Build Status| image:: https://travis-ci.org/home-assistant/home-assistant.svg?branch=master :target: https://travis-ci.org/home-assistant/home-assistant @@ -100,3 +34,5 @@ section `__ of our website for further help and :target: https://gitter.im/home-assistant/home-assistant/devs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge .. |screenshot-states| image:: https://raw.github.com/home-assistant/home-assistant/master/docs/screenshots.png :target: https://home-assistant.io/demo/ +.. |screenshot-components| image:: https://raw.github.com/home-assistant/home-assistant/dev/docs/screenshot-components.png + :target: https://home-assistant.io/components/ \ No newline at end of file diff --git a/config/configuration.yaml.example b/config/configuration.yaml.example deleted file mode 100644 index 08b0324371f..00000000000 --- a/config/configuration.yaml.example +++ /dev/null @@ -1,158 +0,0 @@ -homeassistant: - # Omitted values in this section will be auto detected using freegeoip.io - - # Location required to calculate the time the sun rises and sets. - # Coordinates are also used for location for weather related components. - # Google Maps can be used to determine more precise GPS coordinates. - latitude: 32.87336 - longitude: 117.22743 - - # Impacts weather/sunrise data - elevation: 665 - - # 'metric' for Metric System, 'imperial' for imperial system - unit_system: metric - - # Pick yours from here: - # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones - time_zone: America/Los_Angeles - - # Name of the location where Home Assistant is running - name: Home - -http: - api_password: mypass - # Set to 1 to enable development mode - # development: 1 - -# Enable the frontend -frontend: - -light: -# platform: hue - -wink: - # Get your token at https://winkbearertoken.appspot.com - access_token: 'YOUR_TOKEN' - -device_tracker: - # The following tracker are available: - # https://home-assistant.io/components/#presence-detection - platform: netgear - host: 192.168.1.1 - username: admin - password: PASSWORD - -switch: - platform: wemo - -climate: - platform: nest - # Required: username and password that are used to login to the Nest thermostat. - username: myemail@mydomain.com - password: mypassword - -downloader: - download_dir: downloads - -notify: - platform: pushbullet - api_key: ABCDEFGHJKLMNOPQRSTUVXYZ - -device_sun_light_trigger: - # Optional: specify a specific light/group of lights that has to be turned on - light_group: group.living_room - # Optional: specify which light profile to use when turning lights on - light_profile: relax - # Optional: disable lights being turned off when everybody leaves the house - # disable_turn_off: 1 - -# A comma separated list of states that have to be tracked as a single group -# Grouped states should share the same type of states (ON/OFF or HOME/NOT_HOME) -# You can also have groups within groups. -# https://home-assistant.io/components/group/ -group: - default_view: - view: yes - entities: - - group.awesome_people - - group.climate - kitchen: - name: Kitchen - entities: - - switch.kitchen_pin_3 - upstairs: - name: Kids - icon: mdi:account-multiple - view: yes - entities: - - input_boolean.notify_home - - camera.demo_camera - -browser: -keyboard: - -# https://home-assistant.io/getting-started/automation/ -automation: - - alias: Turn on light when sun sets - trigger: - platform: sun - event: sunset - offset: "-01:00:00" - condition: - condition: state - entity_id: group.all_devices - state: 'home' - action: - service: light.turn_on - -# Another way to do is to collect all entries under one "sensor:" -# sensor: -# - platform: mqtt -# name: "MQTT Sensor 1" -# - platform: mqtt -# name: "MQTT Sensor 2" -# -# Details: https://home-assistant.io/getting-started/devices/ - -sensor: - platform: systemmonitor - resources: - - type: 'disk_use_percent' - arg: '/' - - type: 'disk_use_percent' - arg: '/home' - -sensor 2: - platform: cpuspeed - -script: - wakeup: - alias: Wake Up - sequence: - - event: LOGBOOK_ENTRY - event_data: - name: Paulus - message: is waking up - entity_id: device_tracker.paulus - domain: light - - alias: Bedroom lights on - service: light.turn_on - data: - entity_id: group.bedroom - brightness: 100 - - delay: - minutes: 1 - - alias: Living room lights on - service: light.turn_on - data: - entity_id: group.living_room - -scene: - - name: Romantic - entities: - light.tv_back_light: on - light.ceiling: - state: on - xy_color: [0.33, 0.66] - brightness: 200 diff --git a/config/custom_components/example.py b/config/custom_components/example.py deleted file mode 100644 index 4d3df9328d8..00000000000 --- a/config/custom_components/example.py +++ /dev/null @@ -1,149 +0,0 @@ -""" -Example of a custom component. - -Example component to target an entity_id to: - - turn it on at 7AM in the morning - - turn it on if anyone comes home and it is off - - turn it off if all lights are turned off - - turn it off if all people leave the house - - offer a service to turn it on for 10 seconds - -Configuration: - -To use the Example custom component you will need to add the following to -your configuration.yaml file. - -example: - target: TARGET_ENTITY - -Variable: - -target -*Required -TARGET_ENTITY should be one of your devices that can be turned on and off, -ie a light or a switch. Example value could be light.Ceiling or switch.AC -(if you have these devices with those names). -""" -import time -import logging - -from homeassistant.const import STATE_HOME, STATE_NOT_HOME, STATE_ON, STATE_OFF -from homeassistant.helpers import validate_config -from homeassistant.helpers.event_decorators import \ - track_state_change, track_time_change -from homeassistant.helpers.service import service -import homeassistant.components as core -from homeassistant.components import device_tracker -from homeassistant.components import light - -# The domain of your component. Should be equal to the name of your component. -DOMAIN = "example" - -# List of component names (string) your component depends upon. -# We depend on group because group will be loaded after all the components that -# initialize devices have been setup. -DEPENDENCIES = ['group', 'device_tracker', 'light'] - -# Configuration key for the entity id we are targeting. -CONF_TARGET = 'target' - -# Variable for storing configuration parameters. -TARGET_ID = None - -# Name of the service that we expose. -SERVICE_FLASH = 'flash' - -# Shortcut for the logger -_LOGGER = logging.getLogger(__name__) - - -def setup(hass, config): - """Setup example component.""" - global TARGET_ID - - # Validate that all required config options are given. - if not validate_config(config, {DOMAIN: [CONF_TARGET]}, _LOGGER): - return False - - TARGET_ID = config[DOMAIN][CONF_TARGET] - - # Validate that the target entity id exists. - if hass.states.get(TARGET_ID) is None: - _LOGGER.error("Target entity id %s does not exist", - TARGET_ID) - - # Tell the bootstrapper that we failed to initialize and clear the - # stored target id so our functions don't run. - TARGET_ID = None - return False - - # Tell the bootstrapper that we initialized successfully. - return True - - -@track_state_change(device_tracker.ENTITY_ID_ALL_DEVICES) -def track_devices(hass, entity_id, old_state, new_state): - """Called when the group.all devices change state.""" - # If the target id is not set, return - if not TARGET_ID: - return - - # If anyone comes home and the entity is not on, turn it on. - if new_state.state == STATE_HOME and not core.is_on(hass, TARGET_ID): - - core.turn_on(hass, TARGET_ID) - - # If all people leave the house and the entity is on, turn it off. - elif new_state.state == STATE_NOT_HOME and core.is_on(hass, TARGET_ID): - - core.turn_off(hass, TARGET_ID) - - -@track_time_change(hour=7, minute=0, second=0) -def wake_up(hass, now): - """Turn light on in the morning. - - Turn the light on at 7 AM if there are people home and it is not already - on. - """ - if not TARGET_ID: - return - - if device_tracker.is_on(hass) and not core.is_on(hass, TARGET_ID): - _LOGGER.info('People home at 7AM, turning it on') - core.turn_on(hass, TARGET_ID) - - -@track_state_change(light.ENTITY_ID_ALL_LIGHTS, STATE_ON, STATE_OFF) -def all_lights_off(hass, entity_id, old_state, new_state): - """If all lights turn off, turn off.""" - if not TARGET_ID: - return - - if core.is_on(hass, TARGET_ID): - _LOGGER.info('All lights have been turned off, turning it off') - core.turn_off(hass, TARGET_ID) - - -@service(DOMAIN, SERVICE_FLASH) -def flash_service(hass, call): - """Service that will toggle the target. - - Set the light to off for 10 seconds if on and vice versa. - """ - if not TARGET_ID: - return - - if core.is_on(hass, TARGET_ID): - core.turn_off(hass, TARGET_ID) - - time.sleep(10) - - core.turn_on(hass, TARGET_ID) - - else: - core.turn_on(hass, TARGET_ID) - - time.sleep(10) - - core.turn_off(hass, TARGET_ID) diff --git a/config/custom_components/hello_world.py b/config/custom_components/hello_world.py deleted file mode 100644 index b35e9f6c0ed..00000000000 --- a/config/custom_components/hello_world.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -The "hello world" custom component. - -This component implements the bare minimum that a component should implement. - -Configuration: - -To use the hello_word component you will need to add the following to your -configuration.yaml file. - -hello_world: -""" - -# The domain of your component. Should be equal to the name of your component. -DOMAIN = "hello_world" - -# List of component names (string) your component depends upon. -DEPENDENCIES = [] - - -def setup(hass, config): - """Setup our skeleton component.""" - # States are in the format DOMAIN.OBJECT_ID. - hass.states.set('hello_world.Hello_World', 'Works!') - - # Return boolean to indicate that initialization was successfully. - return True diff --git a/config/custom_components/mqtt_example.py b/config/custom_components/mqtt_example.py deleted file mode 100644 index 451a60deef4..00000000000 --- a/config/custom_components/mqtt_example.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Example of a custom MQTT component. - -Shows how to communicate with MQTT. Follows a topic on MQTT and updates the -state of an entity to the last message received on that topic. - -Also offers a service 'set_state' that will publish a message on the topic that -will be passed via MQTT to our message received listener. Call the service with -example payload {"new_state": "some new state"}. - -Configuration: - -To use the mqtt_example component you will need to add the following to your -configuration.yaml file. - -mqtt_example: - topic: "home-assistant/mqtt_example" -""" -import homeassistant.loader as loader - -# The domain of your component. Should be equal to the name of your component. -DOMAIN = "mqtt_example" - -# List of component names (string) your component depends upon. -DEPENDENCIES = ['mqtt'] - -CONF_TOPIC = 'topic' -DEFAULT_TOPIC = 'home-assistant/mqtt_example' - - -def setup(hass, config): - """Setup the MQTT example component.""" - mqtt = loader.get_component('mqtt') - topic = config[DOMAIN].get('topic', DEFAULT_TOPIC) - entity_id = 'mqtt_example.last_message' - - # Listen to a message on MQTT. - def message_received(topic, payload, qos): - """A new MQTT message has been received.""" - hass.states.set(entity_id, payload) - - mqtt.subscribe(hass, topic, message_received) - - hass.states.set(entity_id, 'No messages') - - # Service to publish a message on MQTT. - def set_state_service(call): - """Service to send a message.""" - mqtt.publish(hass, topic, call.data.get('new_state')) - - # Register our service with Home Assistant. - hass.services.register(DOMAIN, 'set_state', set_state_service) - - # Return boolean to indicate that initialization was successfully. - return True diff --git a/config/panels/react.html b/config/panels/react.html deleted file mode 100644 index dc2735cf759..00000000000 --- a/config/panels/react.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/screenshot-components.png b/docs/screenshot-components.png new file mode 100755 index 0000000000000000000000000000000000000000..247f3073a5e228cb7118ecbbecacefe4f03f5706 GIT binary patch literal 47635 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%0D{WcI>TO!jbp#EYFsmV*4jeWxuGG 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 literal 0 HcmV?d00001 From ce42648a51feeac4b424797da034757ea3e607ff Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 2 Apr 2017 17:35:03 -0700 Subject: [PATCH 069/116] Update README.rst --- README.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index ec0a770b1da..66c9cedea74 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,7 @@ Home Assistant |Build Status| |Coverage Status| |Join the chat at https://gitter.im/home-assistant/home-assistant| |Join the dev chat at https://gitter.im/home-assistant/home-assistant/devs| ============================================================================================================================================================================================== -Home Assistant is a home automation platform running on Python 3. It is to be able to track and control all devices at home and offer a platform for automating control. +Home Assistant is a home automation platform running on Python 3. It is able to track and control all devices at home and offer a platform for automating control. To get started: @@ -16,6 +16,9 @@ demo `__, `installation instructions `__ and the `section on creating your own @@ -35,4 +38,4 @@ of a component, check the `Home Assistant help section Date: Mon, 3 Apr 2017 02:46:18 -0400 Subject: [PATCH 070/116] Makes amcrest.sensor to handle properly the scan_interval option. (#6885) * Makes amcrest.sensor to handle scan_interval option as expected. * Added _LOGGER.debug statement for troubleshooting. * Fixed lint --- homeassistant/components/sensor/amcrest.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/sensor/amcrest.py b/homeassistant/components/sensor/amcrest.py index 79e886c154d..5a349d28b7c 100644 --- a/homeassistant/components/sensor/amcrest.py +++ b/homeassistant/components/sensor/amcrest.py @@ -13,8 +13,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_MONITORED_CONDITIONS, - CONF_SCAN_INTERVAL, CONF_USERNAME, CONF_PASSWORD, - CONF_PORT, STATE_UNKNOWN) + CONF_USERNAME, CONF_PASSWORD, CONF_PORT, STATE_UNKNOWN) from homeassistant.helpers.entity import Entity import homeassistant.loader as loader @@ -29,7 +28,7 @@ NOTIFICATION_TITLE = 'Amcrest Sensor Setup' DEFAULT_NAME = 'Amcrest' DEFAULT_PORT = 80 -DEFAULT_SCAN_INTERVAL = timedelta(seconds=10) +SCAN_INTERVAL = timedelta(seconds=10) # Sensor types are defined like: Name, units, icon SENSOR_TYPES = { @@ -44,8 +43,6 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): - vol.All(vol.Coerce(int), vol.Range(min=1)), vol.Required(CONF_MONITORED_CONDITIONS, default=[]): vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), }) @@ -122,6 +119,8 @@ class AmcrestSensor(Entity): def update(self): """Get the latest data and updates the state.""" + _LOGGER.debug("Pulling data from %s sensor.", self._name) + try: version, build_date = self._camera.software_information self._attrs['Build Date'] = build_date.split('=')[-1] From f4d2ece2fed2f0727e50d3236cb3e0898046630e Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Mon, 3 Apr 2017 02:46:54 -0400 Subject: [PATCH 071/116] Make sensor.ring to handle scan_interval option as expected. (#6886) * Make sensor.ring to handle scan_interval option as expected. * Fix lint * Fixed lint timedelta --- homeassistant/components/ring.py | 2 -- homeassistant/components/sensor/ring.py | 11 +++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/ring.py b/homeassistant/components/ring.py index 61c772eced7..01b9cee9996 100644 --- a/homeassistant/components/ring.py +++ b/homeassistant/components/ring.py @@ -4,7 +4,6 @@ Support for Ring Doorbell/Chimes. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/ring/ """ -from datetime import timedelta import logging import voluptuous as vol import homeassistant.helpers.config_validation as cv @@ -26,7 +25,6 @@ NOTIFICATION_TITLE = 'Ring Sensor Setup' DOMAIN = 'ring' DEFAULT_CACHEDB = '.ring_cache.pickle' DEFAULT_ENTITY_NAMESPACE = 'ring' -DEFAULT_SCAN_INTERVAL = timedelta(seconds=30) CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ diff --git a/homeassistant/components/sensor/ring.py b/homeassistant/components/sensor/ring.py index 665fb167bcc..dfe791c4c41 100644 --- a/homeassistant/components/sensor/ring.py +++ b/homeassistant/components/sensor/ring.py @@ -4,16 +4,17 @@ This component provides HA sensor support for Ring Door Bell/Chimes. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.ring/ """ +from datetime import timedelta import logging import voluptuous as vol import homeassistant.helpers.config_validation as cv from homeassistant.components.ring import ( - CONF_ATTRIBUTION, DEFAULT_ENTITY_NAMESPACE, DEFAULT_SCAN_INTERVAL) + CONF_ATTRIBUTION, DEFAULT_ENTITY_NAMESPACE) from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( - CONF_ENTITY_NAMESPACE, CONF_MONITORED_CONDITIONS, CONF_SCAN_INTERVAL, + CONF_ENTITY_NAMESPACE, CONF_MONITORED_CONDITIONS, STATE_UNKNOWN, ATTR_ATTRIBUTION) from homeassistant.helpers.entity import Entity @@ -21,6 +22,8 @@ DEPENDENCIES = ['ring'] _LOGGER = logging.getLogger(__name__) +SCAN_INTERVAL = timedelta(seconds=30) + # Sensor types: Name, category, units, icon, kind SENSOR_TYPES = { 'battery': ['Battery', ['doorbell'], '%', 'battery-50', None], @@ -33,8 +36,6 @@ SENSOR_TYPES = { PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_ENTITY_NAMESPACE, default=DEFAULT_ENTITY_NAMESPACE): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): - vol.All(vol.Coerce(int), vol.Range(min=1)), vol.Required(CONF_MONITORED_CONDITIONS, default=[]): vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), }) @@ -120,6 +121,8 @@ class RingSensor(Entity): def update(self): """Get the latest data and updates the state.""" + _LOGGER.debug("Pulling data from %s sensor.", self._name) + self._data.update() if self._sensor_type == 'volume': From c27a526f5be39efeca94a96f1859d2507adeef81 Mon Sep 17 00:00:00 2001 From: David McNett Date: Mon, 3 Apr 2017 02:01:53 -0500 Subject: [PATCH 072/116] Eliminate needless async_add_job invocation of async_add_devices (#6864) --- homeassistant/components/binary_sensor/insteon_plm.py | 2 +- homeassistant/components/light/insteon_plm.py | 2 +- homeassistant/components/light/lifx.py | 2 +- homeassistant/components/switch/insteon_plm.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/binary_sensor/insteon_plm.py b/homeassistant/components/binary_sensor/insteon_plm.py index f6c8d9edbd1..03cc7e6bd9b 100644 --- a/homeassistant/components/binary_sensor/insteon_plm.py +++ b/homeassistant/components/binary_sensor/insteon_plm.py @@ -32,7 +32,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): InsteonPLMBinarySensorDevice(hass, plm, address, name) ) - hass.async_add_job(async_add_devices(device_list)) + async_add_devices(device_list) class InsteonPLMBinarySensorDevice(BinarySensorDevice): diff --git a/homeassistant/components/light/insteon_plm.py b/homeassistant/components/light/insteon_plm.py index 2d043a9f985..2cd22cf6d4d 100644 --- a/homeassistant/components/light/insteon_plm.py +++ b/homeassistant/components/light/insteon_plm.py @@ -36,7 +36,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): InsteonPLMDimmerDevice(hass, plm, address, name, dimmable) ) - hass.async_add_job(async_add_devices(device_list)) + async_add_devices(device_list) class InsteonPLMDimmerDevice(Light): diff --git a/homeassistant/components/light/lifx.py b/homeassistant/components/light/lifx.py index d3b084b3b94..76a2a9e907d 100644 --- a/homeassistant/components/light/lifx.py +++ b/homeassistant/components/light/lifx.py @@ -95,7 +95,7 @@ class LIFXManager(object): entity = LIFXLight(device) _LOGGER.debug("%s register READY", entity.ipaddr) self.entities[device.mac_addr] = entity - self.hass.async_add_job(self.async_add_devices, [entity]) + self.async_add_devices([entity]) @callback def unregister(self, device): diff --git a/homeassistant/components/switch/insteon_plm.py b/homeassistant/components/switch/insteon_plm.py index 646e6d4416b..ee192b82be4 100644 --- a/homeassistant/components/switch/insteon_plm.py +++ b/homeassistant/components/switch/insteon_plm.py @@ -32,7 +32,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): InsteonPLMSwitchDevice(hass, plm, address, name) ) - hass.async_add_job(async_add_devices(device_list)) + async_add_devices(device_list) class InsteonPLMSwitchDevice(SwitchDevice): From 134b21dfea9d8cd3fb7466e3448a453e621fabf2 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 3 Apr 2017 03:35:36 -0400 Subject: [PATCH 073/116] Onkyo update (#6906) * Update onkyo req, change volume to int * Update Onkyo Updates onkyo component. Pulls added sources (Bluetooth, built-in streaming, etc.) * Regenerated requirements_all.txt via script * Update onkyo.py * Update requirements_all.txt --- homeassistant/components/media_player/onkyo.py | 7 ++++--- requirements_all.txt | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/media_player/onkyo.py b/homeassistant/components/media_player/onkyo.py index 017581f8186..67197d7d0da 100644 --- a/homeassistant/components/media_player/onkyo.py +++ b/homeassistant/components/media_player/onkyo.py @@ -14,8 +14,9 @@ from homeassistant.components.media_player import ( from homeassistant.const import (STATE_OFF, STATE_ON, CONF_HOST, CONF_NAME) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['https://github.com/danieljkemp/onkyo-eiscp/archive/' - 'python3.zip#onkyo-eiscp==0.9.2'] +REQUIREMENTS = ['https://github.com/miracle2k/onkyo-eiscp/archive/' + '066023aec04770518d494c32fb72eea0ec5c1b7c.zip#' + 'onkyo-eiscp==1.0'] _LOGGER = logging.getLogger(__name__) @@ -127,7 +128,7 @@ class OnkyoDevice(MediaPlayerDevice): self._current_source = '_'.join( [i for i in current_source_tuples[1]]) self._muted = bool(mute_raw[1] == 'on') - self._volume = int(volume_raw[1], 16) / 80.0 + self._volume = volume_raw[1] / 80.0 @property def name(self): diff --git a/requirements_all.txt b/requirements_all.txt index a7740065776..76a7afe62b8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -252,9 +252,6 @@ https://github.com/bah2830/python-roku/archive/3.1.3.zip#roku==3.1.3 # homeassistant.components.modbus https://github.com/bashwork/pymodbus/archive/d7fc4f1cc975631e0a9011390e8017f64b612661.zip#pymodbus==1.2.0 -# homeassistant.components.media_player.onkyo -https://github.com/danieljkemp/onkyo-eiscp/archive/python3.zip#onkyo-eiscp==0.9.2 - # homeassistant.components.lutron_caseta https://github.com/gurumitts/pylutron-caseta/archive/v0.2.4.zip#pylutron-caseta==v0.2.4 @@ -273,6 +270,9 @@ https://github.com/joopert/nad_receiver/archive/0.0.3.zip#nad_receiver==0.0.3 # homeassistant.components.media_player.russound_rnet https://github.com/laf/russound/archive/0.1.7.zip#russound==0.1.7 +# homeassistant.components.media_player.onkyo +https://github.com/miracle2k/onkyo-eiscp/archive/066023aec04770518d494c32fb72eea0ec5c1b7c.zip#onkyo-eiscp==1.0 + # homeassistant.components.sensor.pocketcasts https://github.com/molobrakos/python-pocketcasts/archive/9f61ff00c77c7c98ffa0af9dd3540df3dce4a836.zip#python-pocketcasts==0.0.1 From a107a592de1851f7daa0868f3bba6208fa96d329 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Mon, 3 Apr 2017 14:42:21 +0200 Subject: [PATCH 074/116] Fix for #6691 Neato Connection error handling (#6731) * Responsiveness * Delay was not needed as commands does not return until done. * Offline error catch * Remove unneeded code --- homeassistant/components/sensor/neato.py | 10 ++++++++-- homeassistant/components/switch/neato.py | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/sensor/neato.py b/homeassistant/components/sensor/neato.py index 438e5fb189b..ca5cff1d24a 100644 --- a/homeassistant/components/sensor/neato.py +++ b/homeassistant/components/sensor/neato.py @@ -5,7 +5,7 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.neato/ """ import logging - +import requests from homeassistant.helpers.entity import Entity from homeassistant.components.neato import ( NEATO_ROBOTS, NEATO_LOGIN, ACTION, ERRORS, MODE, ALERTS) @@ -52,7 +52,13 @@ class NeatoConnectedSensor(Entity): self.neato.update_robots() if not self._state: return - self._state = self.robot.state + try: + self._state = self.robot.state + except requests.exceptions.HTTPError as ex: + self._state = None + self._status_state = 'Offline' + _LOGGER.debug('Neato connection issue: %s', ex) + return _LOGGER.debug('self._state=%s', self._state) if self.type == SENSOR_TYPE_STATUS: if self._state['state'] == 1: diff --git a/homeassistant/components/switch/neato.py b/homeassistant/components/switch/neato.py index 3b723acb748..6cd5c5088dc 100644 --- a/homeassistant/components/switch/neato.py +++ b/homeassistant/components/switch/neato.py @@ -5,7 +5,7 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/switch.neato/ """ import logging - +import requests from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.helpers.entity import ToggleEntity from homeassistant.components.neato import NEATO_ROBOTS, NEATO_LOGIN @@ -53,6 +53,11 @@ class NeatoConnectedSwitch(ToggleEntity): self.neato.update_robots() if not self._state: return + try: + self._state = self.robot.state + except requests.exceptions.HTTPError: + self._state = None + return self._state = self.robot.state _LOGGER.debug('self._state=%s', self._state) if self.type == SWITCH_TYPE_CLEAN: From 01e581acede049bb551333e8133606e344c9c2b1 Mon Sep 17 00:00:00 2001 From: Mitesh Patel Date: Mon, 3 Apr 2017 10:52:02 -0500 Subject: [PATCH 075/116] Adds support for the PlugInDimmer hardware (#6915) --- homeassistant/components/light/lutron_caseta.py | 2 +- homeassistant/components/lutron_caseta.py | 4 ++-- requirements_all.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/light/lutron_caseta.py b/homeassistant/components/light/lutron_caseta.py index aef3f8ae799..e77501e8ce4 100644 --- a/homeassistant/components/light/lutron_caseta.py +++ b/homeassistant/components/light/lutron_caseta.py @@ -19,7 +19,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup Lutron Caseta lights.""" devs = [] bridge = hass.data[LUTRON_CASETA_SMARTBRIDGE] - light_devices = bridge.get_devices_by_type("WallDimmer") + light_devices = bridge.get_devices_by_types(["WallDimmer", "PlugInDimmer"]) for light_device in light_devices: dev = LutronCasetaLight(light_device, bridge) devs.append(dev) diff --git a/homeassistant/components/lutron_caseta.py b/homeassistant/components/lutron_caseta.py index 6cb42618af2..416c9f7fd00 100644 --- a/homeassistant/components/lutron_caseta.py +++ b/homeassistant/components/lutron_caseta.py @@ -17,8 +17,8 @@ from homeassistant.helpers import discovery from homeassistant.helpers.entity import Entity REQUIREMENTS = ['https://github.com/gurumitts/' - 'pylutron-caseta/archive/v0.2.4.zip#' - 'pylutron-caseta==v0.2.4'] + 'pylutron-caseta/archive/v0.2.5.zip#' + 'pylutron-caseta==v0.2.5'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 76a7afe62b8..f9715190e5a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -253,7 +253,7 @@ https://github.com/bah2830/python-roku/archive/3.1.3.zip#roku==3.1.3 https://github.com/bashwork/pymodbus/archive/d7fc4f1cc975631e0a9011390e8017f64b612661.zip#pymodbus==1.2.0 # homeassistant.components.lutron_caseta -https://github.com/gurumitts/pylutron-caseta/archive/v0.2.4.zip#pylutron-caseta==v0.2.4 +https://github.com/gurumitts/pylutron-caseta/archive/v0.2.5.zip#pylutron-caseta==v0.2.5 # homeassistant.components.netatmo https://github.com/jabesq/netatmo-api-python/archive/v0.9.1.zip#lnetatmo==0.9.1 From 06e1c21b1f32576ff1c11d7131a6b77225ccd00a Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Mon, 3 Apr 2017 14:56:48 -0400 Subject: [PATCH 076/116] Support for zwave light transitions (#6868) * Support for zwave light transitions * Dimming duration is optional * Updated supported_features to show transition --- homeassistant/components/light/zwave.py | 84 ++++++++++++++----- homeassistant/components/zwave/__init__.py | 5 ++ .../components/zwave/discovery_schemas.py | 7 ++ tests/components/light/test_zwave.py | 63 +++++++++++++- 4 files changed, 132 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/light/zwave.py b/homeassistant/components/light/zwave.py index a2ba8e7c2a0..45660474fde 100644 --- a/homeassistant/components/light/zwave.py +++ b/homeassistant/components/light/zwave.py @@ -10,8 +10,8 @@ import logging # pylint: disable=import-error from threading import Timer from homeassistant.components.light import ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, \ - ATTR_RGB_COLOR, SUPPORT_BRIGHTNESS, SUPPORT_COLOR_TEMP, \ - SUPPORT_RGB_COLOR, DOMAIN, Light + ATTR_RGB_COLOR, ATTR_TRANSITION, SUPPORT_BRIGHTNESS, SUPPORT_COLOR_TEMP, \ + SUPPORT_RGB_COLOR, SUPPORT_TRANSITION, DOMAIN, Light from homeassistant.components import zwave from homeassistant.components.zwave import async_setup_platform # noqa # pylint: disable=unused-import from homeassistant.const import STATE_OFF, STATE_ON @@ -43,11 +43,6 @@ TEMP_MID_HASS = (HASS_COLOR_MAX - HASS_COLOR_MIN) / 2 + HASS_COLOR_MIN TEMP_WARM_HASS = (HASS_COLOR_MAX - HASS_COLOR_MIN) / 3 * 2 + HASS_COLOR_MIN TEMP_COLD_HASS = (HASS_COLOR_MAX - HASS_COLOR_MIN) / 3 + HASS_COLOR_MIN -SUPPORT_ZWAVE_DIMMER = SUPPORT_BRIGHTNESS -SUPPORT_ZWAVE_COLOR = SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR -SUPPORT_ZWAVE_COLORTEMP = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR - | SUPPORT_COLOR_TEMP) - def get_device(node, values, node_config, **kwargs): """Create zwave entity device.""" @@ -72,6 +67,13 @@ def brightness_state(value): return 0, STATE_OFF +def ct_to_rgb(temp): + """Convert color temperature (mireds) to RGB.""" + colorlist = list( + color_temperature_to_rgb(color_temperature_mired_to_kelvin(temp))) + return [int(val) for val in colorlist] + + class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): """Representation of a Z-Wave dimmer.""" @@ -80,6 +82,7 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): zwave.ZWaveDeviceEntity.__init__(self, values, DOMAIN) self._brightness = None self._state = None + self._supported_features = None self._delay = delay self._refresh_value = refresh self._zw098 = None @@ -100,6 +103,7 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): self._timer = None _LOGGER.debug('self._refreshing=%s self.delay=%s', self._refresh_value, self._delay) + self.value_added() self.update_properties() def update_properties(self): @@ -107,6 +111,12 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): # Brightness self._brightness, self._state = brightness_state(self.values.primary) + def value_added(self): + """Called when a new value is added to this entity.""" + self._supported_features = SUPPORT_BRIGHTNESS + if self.values.dimming_duration is not None: + self._supported_features |= SUPPORT_TRANSITION + def value_changed(self): """Called when a value for this entity's node has changed.""" if self._refresh_value: @@ -139,10 +149,43 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): @property def supported_features(self): """Flag supported features.""" - return SUPPORT_ZWAVE_DIMMER + return self._supported_features + + def _set_duration(self, **kwargs): + """Set the transition time for the brightness value. + + Zwave Dimming Duration values: + 0x00 = instant + 0x01-0x7F = 1 second to 127 seconds + 0x80-0xFE = 1 minute to 127 minutes + 0xFF = factory default + """ + if self.values.dimming_duration is None: + if ATTR_TRANSITION in kwargs: + _LOGGER.debug("Dimming not supported by %s.", self.entity_id) + return + + if ATTR_TRANSITION not in kwargs: + self.values.dimming_duration.data = 0xFF + return + + transition = kwargs[ATTR_TRANSITION] + if transition <= 127: + self.values.dimming_duration.data = int(transition) + elif transition > 7620: + self.values.dimming_duration.data = 0xFE + _LOGGER.warning("Transition clipped to 127 minutes for %s.", + self.entity_id) + else: + minutes = int(transition / 60) + _LOGGER.debug("Transition rounded to %d minutes for %s.", + minutes, self.entity_id) + self.values.dimming_duration.data = minutes + 0x7F def turn_on(self, **kwargs): """Turn the device on.""" + self._set_duration(**kwargs) + # Zwave multilevel switches use a range of [0, 99] to control # brightness. Level 255 means to set it to previous value. if ATTR_BRIGHTNESS in kwargs: @@ -156,17 +199,12 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): def turn_off(self, **kwargs): """Turn the device off.""" + self._set_duration(**kwargs) + if self.node.set_dimmer(self.values.primary.value_id, 0): self._state = STATE_OFF -def ct_to_rgb(temp): - """Convert color temperature (mireds) to RGB.""" - colorlist = list( - color_temperature_to_rgb(color_temperature_mired_to_kelvin(temp))) - return [int(val) for val in colorlist] - - class ZwaveColorLight(ZwaveDimmer): """Representation of a Z-Wave color changing light.""" @@ -178,6 +216,14 @@ class ZwaveColorLight(ZwaveDimmer): super().__init__(values, refresh, delay) + def value_added(self): + """Called when a new value is added to this entity.""" + super().value_added() + + self._supported_features |= SUPPORT_RGB_COLOR + if self._zw098: + self._supported_features |= SUPPORT_COLOR_TEMP + def update_properties(self): """Update internal properties based on zwave values.""" super().update_properties() @@ -288,11 +334,3 @@ class ZwaveColorLight(ZwaveDimmer): self.values.color.data = rgbw super().turn_on(**kwargs) - - @property - def supported_features(self): - """Flag supported features.""" - if self._zw098: - return SUPPORT_ZWAVE_COLORTEMP - else: - return SUPPORT_ZWAVE_COLOR diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 4eea502d40a..efef8b39b64 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -669,6 +669,7 @@ class ZWaveDeviceEntityValues(): continue self._values[name] = value if self._entity: + self._entity.value_added() self._entity.value_changed() self._check_entity_ready() @@ -778,6 +779,10 @@ class ZWaveDeviceEntity(ZWaveBaseEntity): if value.value_id in [v.value_id for v in self.values if v]: return self.value_changed() + def value_added(self): + """Called when a new value is added to this entity.""" + pass + def value_changed(self): """Called when a value for this entity's node has changed.""" self._update_attributes() diff --git a/homeassistant/components/zwave/discovery_schemas.py b/homeassistant/components/zwave/discovery_schemas.py index 12a8c8c4375..f6e56ce79c8 100644 --- a/homeassistant/components/zwave/discovery_schemas.py +++ b/homeassistant/components/zwave/discovery_schemas.py @@ -121,6 +121,13 @@ DISCOVERY_SCHEMAS = [ const.DISC_GENRE: const.GENRE_USER, const.DISC_TYPE: const.TYPE_BYTE, }, + 'dimming_duration': { + const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_MULTILEVEL], + const.DISC_GENRE: const.GENRE_SYSTEM, + const.DISC_TYPE: const.TYPE_BYTE, + const.DISC_LABEL: 'Dimming Duration', + const.DISC_OPTIONAL: True, + }, 'color': { const.DISC_COMMAND_CLASS: [const.COMMAND_CLASS_SWITCH_COLOR], const.DISC_GENRE: const.GENRE_USER, diff --git a/tests/components/light/test_zwave.py b/tests/components/light/test_zwave.py index dc4096ac68c..0afe9ec8f6a 100644 --- a/tests/components/light/test_zwave.py +++ b/tests/components/light/test_zwave.py @@ -4,7 +4,9 @@ from unittest.mock import patch, MagicMock import homeassistant.components.zwave from homeassistant.components.zwave import const from homeassistant.components.light import ( - zwave, ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_RGB_COLOR) + zwave, ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_RGB_COLOR, ATTR_TRANSITION, + SUPPORT_BRIGHTNESS, SUPPORT_TRANSITION, SUPPORT_RGB_COLOR, + SUPPORT_COLOR_TEMP) from tests.mock.zwave import ( MockNode, MockValue, MockEntityValues, value_changed) @@ -15,6 +17,7 @@ class MockLightValues(MockEntityValues): def __init__(self, **kwargs): """Initialize the mock zwave values.""" + self.dimming_duration = None self.color = None self.color_channels = None super().__init__(**kwargs) @@ -28,7 +31,7 @@ def test_get_device_detects_dimmer(mock_openzwave): device = zwave.get_device(node=node, values=values, node_config={}) assert isinstance(device, zwave.ZwaveDimmer) - assert device.supported_features == zwave.SUPPORT_ZWAVE_DIMMER + assert device.supported_features == SUPPORT_BRIGHTNESS def test_get_device_detects_colorlight(mock_openzwave): @@ -39,7 +42,7 @@ def test_get_device_detects_colorlight(mock_openzwave): device = zwave.get_device(node=node, values=values, node_config={}) assert isinstance(device, zwave.ZwaveColorLight) - assert device.supported_features == zwave.SUPPORT_ZWAVE_COLOR + assert device.supported_features == SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR def test_get_device_detects_zw098(mock_openzwave): @@ -50,7 +53,8 @@ def test_get_device_detects_zw098(mock_openzwave): values = MockLightValues(primary=value) device = zwave.get_device(node=node, values=values, node_config={}) assert isinstance(device, zwave.ZwaveColorLight) - assert device.supported_features == zwave.SUPPORT_ZWAVE_COLORTEMP + assert device.supported_features == ( + SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR | SUPPORT_COLOR_TEMP) def test_dimmer_turn_on(mock_openzwave): @@ -77,6 +81,57 @@ def test_dimmer_turn_on(mock_openzwave): assert value_id == value.value_id assert brightness == 46 # int(120 / 255 * 99) + with patch.object(zwave, '_LOGGER', MagicMock()) as mock_logger: + device.turn_on(**{ATTR_TRANSITION: 35}) + assert mock_logger.debug.called + assert node.set_dimmer.called + msg, entity_id = mock_logger.debug.mock_calls[0][1] + assert entity_id == device.entity_id + + +def test_dimmer_transitions(mock_openzwave): + """Test dimming transition on a dimmable Z-Wave light.""" + node = MockNode() + value = MockValue(data=0, node=node) + duration = MockValue(data=0, node=node) + values = MockLightValues(primary=value, dimming_duration=duration) + device = zwave.get_device(node=node, values=values, node_config={}) + assert device.supported_features == SUPPORT_BRIGHTNESS | SUPPORT_TRANSITION + + # Test turn_on + # Factory Default + device.turn_on() + assert duration.data == 0xFF + + # Seconds transition + device.turn_on(**{ATTR_TRANSITION: 45}) + assert duration.data == 45 + + # Minutes transition + device.turn_on(**{ATTR_TRANSITION: 245}) + assert duration.data == 0x83 + + # Clipped transition + device.turn_on(**{ATTR_TRANSITION: 10000}) + assert duration.data == 0xFE + + # Test turn_off + # Factory Default + device.turn_off() + assert duration.data == 0xFF + + # Seconds transition + device.turn_off(**{ATTR_TRANSITION: 45}) + assert duration.data == 45 + + # Minutes transition + device.turn_off(**{ATTR_TRANSITION: 245}) + assert duration.data == 0x83 + + # Clipped transition + device.turn_off(**{ATTR_TRANSITION: 10000}) + assert duration.data == 0xFE + def test_dimmer_turn_off(mock_openzwave): """Test turning off a dimmable Z-Wave light.""" From 4c7ec4932c509821963a029f0aa81a4fbd7e3d60 Mon Sep 17 00:00:00 2001 From: John Mihalic Date: Tue, 4 Apr 2017 00:54:33 -0400 Subject: [PATCH 077/116] Bump pyHik library version to support more cameras (#6921) --- homeassistant/components/binary_sensor/hikvision.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/binary_sensor/hikvision.py b/homeassistant/components/binary_sensor/hikvision.py index ac1b2657448..9a7a1dcf546 100644 --- a/homeassistant/components/binary_sensor/hikvision.py +++ b/homeassistant/components/binary_sensor/hikvision.py @@ -18,7 +18,7 @@ from homeassistant.const import ( CONF_SSL, EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_START, ATTR_LAST_TRIP_TIME, CONF_CUSTOMIZE) -REQUIREMENTS = ['pyhik==0.1.1'] +REQUIREMENTS = ['pyhik==0.1.2'] _LOGGER = logging.getLogger(__name__) CONF_IGNORED = 'ignored' diff --git a/requirements_all.txt b/requirements_all.txt index f9715190e5a..5cac1151302 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -524,7 +524,7 @@ pygatt==3.0.0 pyharmony==1.0.12 # homeassistant.components.binary_sensor.hikvision -pyhik==0.1.1 +pyhik==0.1.2 # homeassistant.components.homematic pyhomematic==0.1.24 From 5b9d9954c56f8a203e207700a78a2a081af9dff7 Mon Sep 17 00:00:00 2001 From: Greg Dowling Date: Tue, 4 Apr 2017 06:44:52 +0100 Subject: [PATCH 078/116] Update vera cover refresh logic (#6897) * Update cover update logic to fix compatibility bug. Bump vera library. * Tidy. * Add missed file. --- homeassistant/components/cover/vera.py | 4 ++++ homeassistant/components/vera.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/cover/vera.py b/homeassistant/components/cover/vera.py index 48abe373eac..033cea4a828 100644 --- a/homeassistant/components/cover/vera.py +++ b/homeassistant/components/cover/vera.py @@ -47,6 +47,7 @@ class VeraCover(VeraDevice, CoverDevice): def set_cover_position(self, position, **kwargs): """Move the cover to a specific position.""" self.vera_device.set_level(position) + self.schedule_update_ha_state() @property def is_closed(self): @@ -60,11 +61,14 @@ class VeraCover(VeraDevice, CoverDevice): def open_cover(self, **kwargs): """Open the cover.""" self.vera_device.open() + self.schedule_update_ha_state() def close_cover(self, **kwargs): """Close the cover.""" self.vera_device.close() + self.schedule_update_ha_state() def stop_cover(self, **kwargs): """Stop the cover.""" self.vera_device.stop() + self.schedule_update_ha_state() diff --git a/homeassistant/components/vera.py b/homeassistant/components/vera.py index 4d14db5b7d7..555a800708c 100644 --- a/homeassistant/components/vera.py +++ b/homeassistant/components/vera.py @@ -20,7 +20,7 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_STOP) from homeassistant.helpers.entity import Entity -REQUIREMENTS = ['pyvera==0.2.24'] +REQUIREMENTS = ['pyvera==0.2.25'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 5cac1151302..efe8db79624 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -648,7 +648,7 @@ pyunifi==2.0 # pyuserinput==0.1.11 # homeassistant.components.vera -pyvera==0.2.24 +pyvera==0.2.25 # homeassistant.components.notify.html5 pywebpush==0.6.1 From 3895979e390b3d52a3c5f42775202549d086fca3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 3 Apr 2017 23:02:04 -0700 Subject: [PATCH 079/116] Update frontend --- homeassistant/components/frontend/version.py | 8 ++++---- .../frontend/www_static/frontend.html | 10 +++++----- .../frontend/www_static/frontend.html.gz | Bin 139220 -> 139452 bytes .../www_static/home-assistant-polymer | 2 +- .../components/frontend/www_static/mdi.html | 2 +- .../frontend/www_static/mdi.html.gz | Bin 194233 -> 194700 bytes .../www_static/panels/ha-panel-history.html | 2 +- .../panels/ha-panel-history.html.gz | Bin 11873 -> 11885 bytes .../www_static/panels/ha-panel-map.html | 2 +- .../www_static/panels/ha-panel-map.html.gz | Bin 43996 -> 44162 bytes .../frontend/www_static/service_worker.js | 2 +- .../frontend/www_static/service_worker.js.gz | Bin 2514 -> 2513 bytes 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index cae324af9ba..44563480cdb 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -3,8 +3,8 @@ FINGERPRINTS = { "compatibility.js": "83d9c77748dafa9db49ae77d7f3d8fb0", "core.js": "5d08475f03adb5969bd31855d5ca0cfd", - "frontend.html": "53c45b837a3bcae7cfb9ef4a5919844f", - "mdi.html": "4921d26f29dc148c3e8bd5bcd8ce5822", + "frontend.html": "feaf3e9453eca239f29eb10e7645a84f", + "mdi.html": "989f02c51eba561dc32b9ecc628a84b3", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", "panels/ha-panel-config.html": "6dcb246cd356307a638f81c4f89bf9b3", "panels/ha-panel-dev-event.html": "1f169700c2345785855b1d7919d12326", @@ -12,9 +12,9 @@ FINGERPRINTS = { "panels/ha-panel-dev-service.html": "0fe8e6acdccf2dc3d1ae657b2c7f2df0", "panels/ha-panel-dev-state.html": "48d37db4a1d6708314ded1d624d0f4d4", "panels/ha-panel-dev-template.html": "6f353392d68574fbc5af188bca44d0ae", - "panels/ha-panel-history.html": "bfd5f929d5aa9cefdd799ec37624efa1", + "panels/ha-panel-history.html": "6945cebe5d8075aae560d2c4246b063f", "panels/ha-panel-iframe.html": "d920f0aa3c903680f2f8795e2255daab", "panels/ha-panel-logbook.html": "a1fc2b5d739bedb9d87e4da4cd929a71", - "panels/ha-panel-map.html": "9aa065b1908089f3bb5af7fdf9485be5", + "panels/ha-panel-map.html": "e3c7a54f90dd4269d7e53cdcd96514c6", "websocket_test.html": "575de64b431fe11c3785bf96d7813450" } diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html index ead35a04662..ce38aab6821 100644 --- a/homeassistant/components/frontend/www_static/frontend.html +++ b/homeassistant/components/frontend/www_static/frontend.html @@ -391,7 +391,7 @@ window.hassUtil.computeDomain = function (stateObj) { }; window.hassUtil.computeStateName = function (stateObj) { - if (!stateObj._entityDisplay) { + if (stateObj._entityDisplay === undefined) { stateObj._entityDisplay = ( stateObj.attributes.friendly_name || window.HAWS.extractObjectId(stateObj.entity_id) @@ -419,7 +419,7 @@ window.hassUtil.isComponentLoaded = function (hass, component) { window.hassUtil.computeLocationName = function (hass) { return hass.config.core.location_name; -}; \ No newline at end of file +}()); \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/frontend.html.gz b/homeassistant/components/frontend/www_static/frontend.html.gz index 09e5808da651f875100923881edc3dc352dcd000..f41ff60ac7600e79608fd580e7832c236c02c5d9 100644 GIT binary patch delta 90864 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

+f)7N{g=nv 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 delta 90616 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

n?d6-PCwLMpy6leX}(_r6=9>YGa-Ccv~(u=`4-f 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 V_MVm_pUsc|4D3n{vPEk+7y$B<7wrH5 diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index f4c59e1eff3..abbdc6f0555 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit f4c59e1eff3223262c198a29cf70c62572de019b +Subproject commit abbdc6f055524c5d3ed0bb50e35400fed40d573f diff --git a/homeassistant/components/frontend/www_static/mdi.html b/homeassistant/components/frontend/www_static/mdi.html index 0354cac0c44..afb3f013acf 100644 --- a/homeassistant/components/frontend/www_static/mdi.html +++ b/homeassistant/components/frontend/www_static/mdi.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/mdi.html.gz b/homeassistant/components/frontend/www_static/mdi.html.gz index e58a965a79ce1cfa8a1da7639a655cb3b67e5bb9..638f13140e4bdc1d4d3df02c5aa0193a959c0130 100644 GIT binary patch delta 140113 zcmdn_mb>R8Hy+H8}W<7eyK*z)_bXzSDPX>yAmPYU}Kxb^>cuI)9OzwHc-;m%_I zvbjSwj_Kc81BMNYd9)5oSXwcDoxSnix)X{gwra_ zrqZQRZ!lZx;9^GKy)FkOzohDP>}{D;Qhw9qq)z3eBRiaD>*@Hb?09EnczvRlq=Vw; z|FVCVCj^;z$#0qBY$C=aU%pW>^s`@0-{E_=54_lFUpX=HP?&(Olr`hiv=G~;DIr@D zj`OU!p|jXsf0lC2f*`?{xB8xKW}9=UZpy@&ym{xN=iI0_`)T(^d+**0!FvABV^yb3 zpUlLbQPJ+s>dR3~{MLu;sT$o?a*TdhzrEz?M zgSAZL7VeLx9lus^Kk`}G)wBQg-7_*VVc|z_ZhmwxMqutapN_)X*s4_%m;6`YTW+xE z;nB+%q{@o+&fd~q7+$~DW}=v0txEj2l5f|9XL{=i@v!V&(8bhSEb08`az&gRUtief zqnlm*e9qpzbH!)%mtWcPb~V3VX68;`IYn|i>yM0W2drY*943^Vso(xFk+rc+ zO80ozYQ?FGPo8zzv-AIte?MOq%K7LN8L(9<-D%t3xkRnDQ=HW#!r@d(&)cKzrM7`H z4runy;7~|sF8&pC>)yTnHv6Krw9ZctF=;AkSGrL-@r~djN82}FZq1mMcJ|S}klBK7 zLp*~#JDph)<6qRASDWq8(viO7slldt-!&hN+7ql}W@VJIGlX2fvTbXwn0?~?u=aWB zNy#e~KAR-m7PLmK)jze>&?HOmyz#{JU&~HRnXNL1X`UwMbCbyIiEk>^%oHtG#$CPr z^iQ4VEtlWvj@dq87mvwtBrMs%d^q*mw=N&S%hx&t|0%87rfsa4{U^tl`SO>5;D=?W zdA*MwwY|Nz_ulPqUuIly>Hn}Z=EsviOb-m> zo~;#Ks&%tLW$NzcnVVN4D;&DQS zZ$D#PV?*jI|G5F#r4{RCP9@wEXIi7(a4{ozxvRC1y#_8KnzkK@e%gV<_|MWNCt!A&Q51*?G669<&NWJ#Hqb2UkZX^Dd z#1>A&rUk8^M2zao|4430aW&92oBlw5&yQZs*FV30Y(Jh@_;Z6pN0zm%&dc0J{&RhG z+vYCQp3bOg%N%rSu2#j?<8t5R)ThPU^9S)IaV``UZoHDPQ=^>A>En}VML}cEXFn!7 z^l=-vbSyb)T)~?1ZNsz$nGYm{-)&IspU%aX!n!Bn?|!-dx?S}(^>v>=y<5I~`O-a> zkuD;yWZ$ie2`#Fay4ONcGr35pcS8HO0~=)C-kkKu@Wg7t6Ca8^V(uu*w0_%IYj(3S z@vDW&EvDspj7%#gNIzlNVe#N@#O&}luYv@)^quTHxn?c!x#OL$cz>f&f~U>p2pRuR zQ!iBW&2JH(Z0nJ2&h_x;*Ry}?Ki4?<#oQ0KeAl`(A>nRZqf3u~?xJL+Wov`>&3hL& zFTY6pQc+ zXcP6)!EI`9x`>7RTS*5Yi5;mDmk!$S!^m6#Xvgzy(vxPgOOMeycw@rIGY0B+O_dHCEQuc0m`ITix{FdN0;mMQg zHrxxJBvle5*e9c_9hIZvV`2Pb@(ION@lWOM)u(QH&Z|1hU!?8XH7+H^$J@70{!=FB zXy7dpD}MKC>BJ>#vhOi7`RDKZa`yD=zq|MA`*^RO{=73j<=3}0+l%AR>p#pgkJ(I|VXR=sAghxvoIZ=2IE&Dw3!&3AC-O*zi*It*5`zbCwV zEm*`G=6xe}y~oPLxTTxV7_w+fH^)3Oo8sQ>J|o!XNV5v7N>c6@k2`v|#{J_ZPVI@@45AX^~rnwzWn&~>&xTM zf6t$O>5AB*m2;VX%EjjYx^lQ<=ig1C;_3C$*13DiZq;4Ne0(F*b=zfO`M|5!qW7Q3 zRnb`f?b_|k8?REkAF{2ox_y{;yQzw$N4&K4h0?=05~sfGDL-7{`t9?Etv1O<_O|OH z{8t{AU3N;YPi%@;MaPEOE{yeGwo6ZKQ%e-^(pa-)M$wFE!TWeOQ|A6BaBhc&X6oE9Yre&lAg>CroS)c|T{;$17!= zd-f#zTv*QU@2p+(WB&Gj`R98Xr99`IE}dn(H{#Wi=r&oYj&~-vA1-m>NxWx!v%WU{ zl2O;Q6PHi1sE0l3Yzm!kzR31&iCR_ZlPwpTI?r@R)XaSOMMcXkPu?c`p4`oIN=hBm zYm=0dlQuE0y&fpj^<=(@Yw_}nvk%*{&fQRP{J;job!&E}Ii4_ia-gHhKsij^=jkaoTpfEOOl-{Y0BxfSN2uc)O~;Wu$qb^&i)pPp@}g`_jDjSJ>5h*JCfUl>+Kx%(h+n|9169pZFO+uJlQNJ2q|E z{P**xPqsI+R+p|^6qRc!`9{h3k+4C?oYf1?{9>NHKxp?>w)*s0`|D%RPudmw{C|_k zO-GT7feL>;qAOLzC%McuK4j{$c+MQwodGge-v4_lGynF9tD?QB_3L_rXE07a+YuNn zZvOSU;$H1|?RjtaU5Lv4|6apsLixYyrTYS}t!GPl|NOSz!nj#S=Pg=U>3{m~1`W#q z;T`WPE*`Gg!F1=~>AGc{4>xH(Sn>4YwP_{BE2Cr6Gvp?p0<6kiSJ%jtghcf-1N(NOjif!s7Q%l+SOFT z^tw|ZYrTig+t$6(Ki%5S^3^;(xF!CnT6^@%1)EjareDx7zjT*T`jT8;*{Aj$8>BaX z{>@do+3^4GR&7ny7ZF@9rl^E>PdV-EXQXrMq{jXyms~#cY-m}@B4y$9fBp4qy&Em+ z1vkBA@&A4K+oP`~fA>!fYqC(@^WkR2ir$3Tq84wK8uSzuM!N_q`n|nB>*)W!kp0Ww z&KKP{%iz4Fp+^cC&b-OGWuw!xS(|I8Owg@2KRIto+#T!Y?-#l+tIzR}|5IPS zW6xf<%N3db9@eLSnAy9_Kt@Q=eC0gPsg=8AA`L@%iz%c$Gd;q&G*~fsh`z-*Ft4e3-jHaCC?q=c@O{pYcu8Gd1gg{ zf1XYniv@&#yFaKuEwSXRuA`Q3%CXsezWX=-nAG-sQ^4d0?v_%9r{g}T@yLm-?Yp(8 z&^YL$>BhNTI(siThh?>m&4zy3|Cmx;5u((#eF=th1}0H78VAYMeMVF@|%uZ4qy^ z&}O4Lb}bVw>5`-ilM{RtziXFnGR(7>6)$@;v1e6n#--hc{OS4)^^vwL#aUIGtSoB8xG5=WRm=TFOd)aP~ggrI~&>$c|PutSqX8&@{U-aPm{qG{^Y4c~(p-MG7D zf}X7OU)|CawcWbJM9 zrk6Q6b%pzU-@}3_o7k^TULjoX%Jlj~#es=zpWZoyWyN>ii{Rys)-7OhdwhzgbV|tM zhT zWX{nWUYe3BUoQy7ohf}J5!hs5)^&VgwpOvEz}A$dL2Fj{UB90DfAudv z-{yD7|GPWXQIfd2|TV7R313K_sL|^I=Lh`W364RyhZTK!}E^TRc*OHZL;3Wi+AS9 zFO*+WC3^{(3Q`KTiIK z7ngngtm>+X*OScZLN`ZzKQ>F#_XF$Eid}XI=c}rxeedWxvekXB?X30wzx0Rv$87D9g9l;e)#Ks~dk` zf48rjby>*$0N;y6N`4zIMY`_NJzm=O((SpJxbxfaLlPRB+}E2)cowv%at83vY&3bP zWbb_c!OFiEn_jzBXeq2u=WftyGSAUG_3z8iN=Mrsiz0D775*vb>c86=ZDgpP136|xqUAOM-I(Pi_dhgAJ`F)8e zXD!r!+TB{-YR$C!s%#VM|Eu4;13q4;3v>M{dzAHI-`@iDmw&1iZ7Y1%uH~^boiSCv zWNY)x-RaL$GGRO>g!+M zu>W12nD)!`Hxka7I_uhI->fYD|L*SP=dETo3tu>7zMZ_qbxU9GwhhTGep~JzU1uz% z>3KRsPW+zkDUCCa4~b9zY_mRZp0xS-)w8F!Y|UKx*tILZ=r(gIkK^AN3_4N9cIPha z6Iv=I(07^f!|lxHvEIK9AO38#?TvQi&mzMUGt#9QHyq@6qg(Und^Fej^ZxtSgx|Sg zG;fndieAsm$+i6w^_S-6J-j+EvxHlHt-@BWb@exkem*>WS-*RyQQYK{5h)UyTMj;B zn|CicN=rF8S*!DGOi9!QN;jc< zqE?6Ag<~7CH%8l9irk(1X!om&O)@Llc5SSX>CR5}o&Ns7v*bm$r>hv$Xa4g(bIaRq z@&7qCg|j|Q&wBE7>Bkw*-KyugG}c+a*Ur6v#$t+%(RvMyRG#0byKMe*^NGx_yDKnn zX6vz?Ztr&3+%}ykb+JA*VDXdJp=};5Us)$hoVQ(gWb>-K+b=xxeEWX37~doD%&*IK z8d(~bCQB>MbUY&N7$#%#O6IPLev!MEcG>#wlM!iOu76Wd-EJIx&wT1PI|wIkk!GD0UHEDC6rag= zC#ck0MGHJzS>3u^VUnV^kMsBRi+9^r6mu5y?kE-vW}UAR8uLD^}yf`jx9KIlo25s^5$#qg5{ zXIOBOo`~1_&5kXv6{9Qsrv-*hQfgRK9dW+%aM8gR^$QQ17_%QP(iC8tr+1p~v3;={ey;j<2OGJh_ShuSsLak_CMUS-@-62y>R`UHJ1;Us?NFPI%m&p z$vbysx1CpBR`&PfJFQijQnOPygeTf0FST41u!Akz<;2g0vkp%cf0BLT=scC}Pk4Ek z#YC!h`vrOnR9xtdU+k7{&ve3gZR=$riSAZo)~>E6z9rtq0t|VX={EJjpSYxBqqoN< z@yp-W-#&r;V%>WeW}81V3vYWY+PK`lJ49K++E{ZFpNd=|*ES!s`Nc;!l<(cRm6gp- zRpNj~`!Z*-{6uE|r5m?Z8vU!1RhY%asU^%7x+JIa*1oc|JDf{m{FCe#&U@wgsGsLl zKrypp`FYR#XU@$#RrKKDx|~N#>bpJ!);Jv&O5Q9`A2BKJYq4{Bgh_YZy{u2KijHWn z>k!C{@~xZ1RQf5}?exvkOUtJwM_WE|YTxqX;fuJFkq753doQQ|)aT{XlU2Fr9`o9t z6inRGt`b*K!85z2LSW^Ki`ons-=@shJak|c$D$u`|5o)aS@qCHrK~J^-p6`%R#o@< ziHRzL&ecM*lor_MnZI*gBVhAT_JQ6H{@XSe{wb_Vw>S`eignMNd0VbO(FyWb_-$yj zRO#`YudK-{ePt|<)STJ3VUPc;D|ffb&*+*RwRitFmh1VZnJ${&XZ(6oaQ)7w2~R_M zK0iyITgqDHp*B}B-kO<_%WPgks2$IN*{PN}ywmHS`F@gOERW?p$hJW_Sp4MSZZ$rY zX=;2M!^{5bUUgl$Z_mB;YHR*CGZ!q$(9#I;?QQ2X*Y|6^l96y-^~a_o=hc6H;#9LR z{V2@pmT=@^s%GM^$t)Y+Y+C(HSuVc8_-fw6N~_4Pz5lmQoo1dt|6jW3?WV6s3M1~U zHQR95GT_S5-uk&ZdB>Of7X1HUXSe&#?L(5bRS(*qbhTT|w>YD&q`)exQKlQsIB~zk z4xZ)NA)Ab3T<)*SGqByJbD!_^PqFB4nISH!3onQV|9t;ra zXn4GJZtS<&s~=o=a^>d|-N3CMggYMJs$sPXyrq72dSv$W^_Jqt>)oEtEIYmR=eFrD zq~lM$^<{srD6K8mzSAPfWOJEWht|fa`qp9#fA1-qYT!GmCZnY4abD7{5ckSi4{W+u zi_SmGzc%OiB{}Z-{o7UrcDg0mty4Yq)jY-I)fyMor5V#5Gi;}2h^%^)va0{GkncC4 z+T`6X_I7*zefnZ^zv1J*lqClB-+UWfKdE@i9#p=r;(9P!%~MF_fd8Z`b6KY6Y!5hY zb!P1p<0_f-HD?TDuW8n=SsS9ua`S7knEeIsQe!iRqnhQ%cO{7A_&xRI`r~c?_<8I8 ztld2G@9n+!--3Pmp^QRtKchtndgm7WU-Ifg;Qp4{GY_4Nx%t}_k6K;1A#+UbdR6`L zCA%ZorFMs83$4B0TOPApRj*c)JKFa3>PX8OTq>iySZQZ=3KF^ z)VDA3p6b)OMNg*r=)4s|)_b%jM6lPmzSQH8tDiRcqsxYKl{2fncHFhDjw`Q7zu_qV zl}qn`<=dLGGd9Bs<0T(&BP$Jm;n{{O+l( z-u!ca{pWZ8F28=v6cgK1-LWflP0`1y+dCC*P0uV>nQ~aS#{bdod0*dE&B?ZyYMm@o zppbg$dC~8v`mOytj~@4M-7z6Cu7)eG{pWV+*1{ad35DV=m9o=xZpzFJ%jVdWVx4^Q z-HA!P*KZ0>;HcA6HI41;5=X5KCa^9jb-E>) zYrXN*b=}HMTg>hyd_4Y@-7L_C?S+Z`dEfIhrkqW=|K+O4?IxXxtjOx zbwSl%^QS!js^nv}UHG5>InCglo++C$QX7KQB{qDV9w?S@SZmSgB9WZM%Buf)E$3@6 zY%tc1wNJSeH#c|F>HGYLk4<9u@c8iMzrR&WS1-7v&2geWMA!cBhr`RHXB`xrd$w?a z&8!gN2O*Q^7u=fjuxNppfW*amzA4X|4{i7~;d7bVi7go$Mdz5?l*X*MBUB%3cuCW3 zxoX)_!#5glx@R2dc$?nT#oVJL#88$pb>jYbj{`gR=)Gj=)Y!2tW0HuRh{n?mEDe>C zi3|=QK~e%vZ#L{T_>yq{X*2(v10FfgEkECi=)mh)>YJ<=HxAfKYmRv=z*QBp5zbPE`F}im`>^-3)uL4Zu zLmAKgGHbN_+N8%&JWaFsfatkjj}(_iZo6)uA6NJHN8UxT$BA#uCeJh3_A1OI>+N+t z2h(YhHyO^@*XvKJ2w>lAq?tT(N|@T;2(?#RpPvzU#qz#J-FDu>q|W(oAIONWuWJgl zlytVa%IXp2d3WU|{gtjC7QEmlvzCVP)WmK3!mnnt+OPOv$o$p^4x#*QP$M> z-U1_;&5s;?tY6wEzo@PH&#>pk-}Rq+Q|%9@wTd2Eecz=bGx^cO<%js34fH>(U+T6% z@0TgN+_sdIQ+-B}eUBa(<0_>bF8gc9x&~#b&9CZiydtUn_FyK=-1G ze~)%*6mN1l;%!m4aKXQSAAW5r*%ucyo45KhZ{Kr|M25bphZEL5n7!lYwf6d&`hEWm z`cpRD&8-*t*=%-AcZt)Q)ell--c8wfn%A7~Z04y4!T(F8f4Chnz4Y_(=fi(rAO1Z1 z`uum#(;DANH7wh3L$|B;`4!`%P;Yo~ujJGE}b+BCS8h3a~n zX&8Oe742^N(_HlR;lrn?vHucz&Tn4e-F?!#Uj6zcuH|#Xw=9^{)z857XqL&vefQ+* zr*T~Vs`2gVm4E-Z4lIaLHw`$VD__GcoBQ)o?e(gk%izWh3EdTR;GB96>$QpV4G zwuML*AMR}lY`0%@xKH!$q-1vyL-Fm5)9wpI*%;PrRN0ox+Eox2v{`A+KGv^%*B5T| z6i!`#mHAvffA>s#h4}gJ=F8jd`}gI8(flnt1otv)t`%so>$ceWUVYtydoOq-DmI@_ zab38~NLE_FyXk4PTad$Ymq0m_Scj|54;VIY57Srus5j@$>+}nEoW$cig4$t;Lnztu(H^L|Z(AeEy1JDBuq{qM>gPV-YZ+q#gGDn8PE23EkuUwzyt?g2HYEIF zh_&qf&bOOUGLl38kPLUdvBaNq6^CScpI&*lYvzQlQ_VYt*rY1TmwZj0{C7?x)7g~C z4Rb?$c=yfHsxf6P`MWf!Rqn|`xfb_! z)!&V(+muySIXCb9C#klA`DVe51GfY1<#_v76tk2~UC<|drN3!cXn_9X`KRLVz4pJ9 z^lAa)(vB7TEPiJ{?-sn_JzLeNyJXGl^sin#j`{5$H|(Ex_Eg8~skYbO*Q?d<)Oh)0 z0bk{`ie|l)cM4|kKUO^LYHf3kuRq|XUwfdaYvi2QirO)cWnM>m|6HZzKBGCf`@q8c zz3q;=ZBN28{EwN7_T-;RH#L`8^vrZp)t<1FNXOjJXF6sHGN0BgvATMxu;meFO}4`^ z)gIwZzc^D(ul82#xNWsYz0{7+k-c8aut?*Mq-OI+8wqaa`ghK|T}#3$J}r5tS9|Jp z;Z5EC&8ptcok6Pw-DW=6v3O0UNl=@q$4VKKvXvDki#A>`Ik!^7^v}u`TgS8K!fyUf zy1MXS@YE%Sp{3=v-^`d+FEce*&6u$#Z1)9&bgVv!O1(16^yi9+@%=NOocgz*GrK53cy86juRG?;91hC;dx7tbzM6Kr>~+3hWf$bM zma&{W>B0W7snM}`{dY6*@ZY;P_WXX>-oA7hvy*YcA139;v4&MLY}o;kDn4_BTW74X zuyi)lDdN|2Ien^?@1Vh}CU&i9xyv&qU;W_6W7APzS}<(~_sL2x?|XB!w(g(8`h8(V z)}bqv=MG#nvUJuivgo?$_UTyhV&#RJ#z%KNZ2aeD7dQXjpC4NqI76jYc9wpS+SBpN z^X9bXYgfAGwg{E%o>}`wh4qTVl$9Mjx?7K2+Vxf{(E5==<6`A!yC(I|37=hOB&(kn zCFPeeBAY5xh7D_U*7J{e~Z@-x$C7bc&OJ;U}QYa zDk+k}RU|IOu=1q|4{!0>rqvgm7WfM-Q#OvRQa{Gr_xsT5_R>f5=H37E<-^0vhkb0; zHh){Zym#Miq57I%KcBbnJi2DnS^q05m$n)&cU1kmO8oDu4P5f;j!0iQuWc0GQ8-yj z{9%Ja@0%0(obigztlHmq75uvefa`Ind`sv)HVIuQ)lh{ z8y(ix9DgLIt+2A?`O(+Uo<0{l`uf?@_xob@oL0DLAG+|6Ip6oWk5v{LstK_^F}Yt; zZx~(QXr?SDuKvo=TCn#;v+m$mlMU%oX>+)&hwGg`7I^-_iOo5IUA|3ul? zPm1hnyYW`?z2f0novEcFr(d}i=x@4Kr+n-PSK1Q&{enA%pBZHP$Gx}tY|o>;yGFsC zIVrn6N=i&#;lrG1t`0F(^QtvpoWFnBs%NT(cRjm=m(FBOQSL3u2R9wAV*JNo_PS=_ zs;`|(E|))IRK3c>$#K-Lg0nbXebE7?1AOMUkJne7-Z54Gg6Ln?S$lU2uY7fJL;1pq z;yaTC7hgO(^Y!J=mv^^MpWe#<)_-dKnYZGJ3PpL^0|BbCk-sS2OJlzWtWGWVH`3vXD?b-2lG`6O1~_~_tFj$29m7IFHm zO%4L9nVPHG;>ryegq6GszRYWIsb}9Mt$*c9Bf}@1j_iDotR3|W7U^w2?D2nHM*9=h zvu@7Z9rKo0YN_U(JaG8LGo@`mKc+leE3;dB-t|dSt$60~e0gH?>iFWKf@di&DsBqi z5kKMSS}2sCCp#;2^7Os)J?x}jdrsoMUL4Y;efo%I$C|2`XInS|8Ll6ZUD8=yFp2S_ z%E|mw{EiFdTwL0YHJtx^@j(3y&UihZ{_+rW#r@oNvO*JQ9A4ho@%D_W%WutXFD~-U z%(h+>n@-M#I> zbwi15uIv1qB6W9^@|5Q?ZqQZQ=6b@+WbL*C6@f~h53aPU7KVzL1oe5c= z%T@O`E%2D%>O0*0htrbcr#T28e-Wt}D-hEt8>q;z+@wq9#%=wo7o|r!2ob-Mh z?VBx6BY%l)e_^> zse9P>rpD=pr>mYkYP5A(p*PcfL&Je7wF{gq6rJxpE9IHS(UUE#x;X#Ff@FOm=6yNJ zv)6xr-}blu_20+stp=4lpG?vn;YXn7?aE_&x8b-&j{U&2+=A>-Tq+?{HW+vGRe3r9i7i56hBv51y{scbHZ@ za@-aFq=qSx`<~IBRcG!^X%j#CZJxy);q-jZ_CtS}?=x2JDLNJ<9W9nq>Y>2(Y}L6# z?QQ!vd)V4@Kb{@W?7mv8zQTGNzv}xBNqWysYv=!v4h(#GV79?^rjMsnRcF?7K5J}B z{rB_b_nmqP-_I#M(fRbDQN?DXMe_?87v&d64pvBgu3p`{=l`FVhad0$eZ8GkPv&g4 zUBh?d%@Hk;IF8$lINb8@O*>?+h;XiB7?7#E>bK=9fd7tjRc~QFV;lzCk9}nJ&iCMlibEDE< z*&B72?zZSJ{d@LrJ3n_>>-9{;Vte{(WV9m?g|5WAo0^^~R^>rgp{LwcB0?&ff|IsA&dH6u0V-Of-!d6qZ(WmOA(xfmDdt+G4NwZ>Yq zPLRVQZ$+SS_U?OAHnux=?vGr;o|(<6lUiS=-T8CxiknPlpRpeMu#7eOq^7V)+NAD} zpTe1@Gw(3S&^<0|DB0WURMDm~{o@3ei;ZbHX;v4``DQ3P{rqTa^vL+-JeG}djf{F) zE{$1fi^LZC#%dm{+J52<|96I-pIg4Bcllbpe4u)qY18DnBBBY$+gJYUyLC7;QDWT* zUZ$w#dZoHPrde$&Xa4oI@P>MA3-f-Mu*QGMwdeD;zRFj;`6uAl76tzM+Q+sW5I3yL zJfYyBaAVg&#)%#_j(v5GQ#9wlc4tgYJkUK!?x=a8fm?^mF?M(3c%!B97Z0>HF>$S% zyZo@sag!~oh5Lhb6@z&#CGxB$%N|;?JkYi_e?@+$ct?FuoNccj*U`fZyH?2buiZLF z!c|9n!~I!0&D?6~GS0V~xP9bjS2(2zhrVFgq2{8pz5nJMo4!A)NqZ$u^%zvie&Uzc%=j5off(i6mQ#2~t}&S6#D} zJ$~#Go83K!5U(XV^&Zdc&cBqtG=F*1Ckv~Z$DUuRKdxTKzW4lLp&ym++ZFF>^tqmrpecgIDNWW zjlQaTEnUpFL+I-ozW53srwMX>i~L%?C2cFunONq)IpyA*@|n)(40c%53#WVTiCehq zP^O0L6@Q^cLbF!o?~uC~<|`^%<@&ZjJwAR>7guk(Q&DGkyow$RllR=1FF#un`i^_J zJrM|)xn#zY(|IxrZ0D}-{PgYZ4Ze@lCft5GZ*Ta+OK*34`*O+PDA&ambG)>E*JN@z zHbyx|>#PxQMZXH~piy0<6l^Xbidwy!&PZ{PMgref>v$(zsToc*4E`+MCl z20K}QFO3h#Xk*=0S9o*o*2{4ZUWhCFYR$O*YM1iN49kE|DepB)gzrqvmsD*1G4+j6 zO-Mca$8(J{XZBt_{6fucS@XF>t_8j}7tH!5q*QjcRc>8w%wXuSL89%W!L6?gwu=7R zufTZNdXE#!Z@E2=5h@BF;u1RMRzA?qVPjE9QC%~^uxq)NMY6N1pu!9Whm4DY@%@ur zHWVC9<#P%EHzt(K} z`9o{Y*(!UswWsux&oEtoKbK8oxyYi;)@stb9gk&pi7$MAo8#nUDevMm%N?s^CMj#K z-twTAH>|17|J|ztYp3i|{KB%M*@<<6^@UYOPxdcBRMa5fA_w2UMXkD^(!egeB(wxi1 zv~6xoWS;8HvMpEFvWoAc=i|AF>wo?~bL;i{Q#N|1m1`sT+rFhFazEo(e&NmrFHs|6vv5-&n-Pc*`J#yL^6O|3&zp7FVk{O?!I~a0*Z+w)I z<4dV+PwuPFtoZe?Ju-qfO6}_No0SK$54g(A*}TM<@v`QQ6+c6@v(LNgNV2U_XpGg8 zs6ROG(sNn!H5`SuTlqCI1SVH29^Sft<1CfZ%#DGXpR|(yF2V4`0ZA`aGv2=%=LYR_UK>wl8t{d9^oVo#&zWduLZJ3pl}f@8L{i znKwoMgdXOo>1MPrcm3@C?Dyz=On+(des;A#%9Zx@8<`$QM^(q{y24trq?+5*_;{?^ z#$>%6k1j1eTEf^p8bVkDvNP%nEoZCYH3lZNI&JZPX$!J-@zb-gf6~xbOCT zoLeLu;Q!>s;iD%0oFb>#lRj;EB0I~1r_DtE^0u4#wSUg?pXZl8p*&e<siXIZGB|sHC#;; zewun#+vf2~;SC9Zum!D(1p|$V-Cew@dd-wb)`TxU4`e!re1;Kg!@*Jo4CU4REXB>LTI%cOp>&fbX zu$Wzor`~?+7W%+q0fR5=WhVX4@8-_?=%jkt_*$_*k@($H=RX!n%-?ur?#k6QSL+!b z|I5?k3|qec^{cA--6r?`{CJuAaIz*hSB?GOUdiN7yVvMV|9`sm*XiSxSGIbq>zwSK z82NMey@;BZT+fuGR&~wdde$Vp#DCwsmzJs-rkjpM*VOHf*_t%N;zj<#WV6dQk6nf5 ztKRYuHRE$~@SE_FJKCi$qHfb)_1=$jcj{;Du0K9eg7y47rmKOQS43EdzB%c)eEnyA zmGf=W7_8@u`|@miU~R`4d3^HT{Pz-U4d)xAj@ae$-1NG3ZqljOrx-QPOxc){p*(~ilN7LE@7-z;|Th^*B2zIfZ@%_MEh6F>8gDe~-24ivkZ zc$M>Csk{81&NwlZX>F5SE@p4a{QCTzp7FMB1KuApJ&n`9ojWt%P4DotCTYDtC;yf| z^S{%RYRNfO(m?d&Vx0?5!s_hm|2%wo_;>sF;(x&(q>Zx<2$$7AY`HS2N7vwM?^G)j zqh}^(zIN?rwtJwH#qi0?eeFTf#)uz7e5IsP zdT}PVS@yiQr;BfN?98qHc_b{YZfE?Cg1qT3#U8u~m|eK)_VRDv4gS5WEETT&_BZRr z&z}z;?~cE}r?%GoxcXOz4}8|Kg-y&Coo+jN4;v$YUwO@WWRXMc>h_azdxP>ETf06^7Bh9T*I9UOgXZO#GtRfI zWbm7_;^N$E3~%$7JlHdhwZ!Dyzk521+s~i>JeRv?*1IXKWp9@-nVjLjWi+8KBSTDR z>UkC>foTs~0@ky4UHg=N(>rWqP@~hij2_|Yddcc`sg{`{^FLf-QVI5GuTUy@A++}T zdzUk{EpgIKQ^gjY?-TDhX!Sv|yG7=nP}!y?<*Qq4yZ21roRJ_RTji-g+bkwP?sK0^ zqI16LwSDFnSZlt1Ip!#(5}3E9$UgK%C%e#^)8^ejj&GkY_Gk5>y^nU!OtPL@!L&>M z;PIaIgwNr}YvPk_HH~+&ddiwO9Ni?IO#HxoOZlCY z4r_Ai(~Pd@JpKdn^?xjmvxPXCMY8`}$5n9dgUy?ts*8jx?rcBmwrQ*0${T@Oc8EoD z+%E{(`NUy!+Lbi%3O8^0y7r5SA(lEZ>oqJiPw_1JVW3fM+18Vm-sM{F!F%rhnLD4K zZ|C0h;~hta@hhHl=I4Uv1RI^z>AiOLcE$VNKR&12Pe}b`Tw}bTtKdrDqp91R7YICd z((Thf^Lld4v$R9;^QSxN2_IP!%woOFwB+|>%jFEoCwnH#rhVmTdvs>%mkUQ2&M|45 z?%-W1;ojP`kheL9r~enKO=tc+>~sA z*M9s31v2Z}_0H`-P*bpvi6!ii-Ip(!Q&zAy-mTDLnCL3M{ED{l4IM)pS810Q6>l%P zG98ymozXIlm1p&vEuL-dCz#jF=JWh)E%C5dKKf8@m#GWarjs9B8mBmIbbk5eLqL%I zx%!&<=X?a6*Qs7_^HI;cA!BzqQdpEhe^=fLHos=+YYN=14c{GFmH9NTK8rp3Z6;r& zbK8v+FCMYIXKxz#u4UU7lDgV-bN*5JyP}CKOW!sV{X^|LViw( zTLDK!-3>E)ZY3{Jzk9dQ**^AdX#5tJIfma8D;c)cmxd*Cs9a8bo7!xibmp~5*e#t>?A)u{Hb`Y@$7iqh%R23wrR|s1J&CO|+retj zmStT9qU3TGf?Rb)Ww|Z2x^;K2E$z<$|bmm!ABQjt76^ zRJPYnIog=OU*G=H&BM~?o4S_91jWA!4nhu=2PzWoI{TlBxxF>!kk2hqS0?p~e$(;< z4j6H9*K+8mHz=4#Gi5Mlt)4o;+;aJmys!>$fh56<2v0%w3X)GT_pWVx;LZI1-w z!%C-BRpXrVtEZ{<)(6)&OW*T&vV8e*)fd9vZI*=!(>NA13U2CHkmtMVM#YWzoGq(W zc6IDusJy-Chq%cK`z_3^iEqA6zn%Z~oN%uCIUS9|LJn=r?y*xFR)n}bo=|w{Jk!Dn zkEDM_Z>m~w^4dwgdxBa_^;6B)7+cS{86(>gBgJ3w`{jm6RZ9V0yNDBI!S(y1S+^-} zswraIAS$Wt^0_(u!`YnKcRG6QXE5B<_%m_eHcrjF<5y3$9sK|I@9V#}e@_oJ;Z56f zsG;uA(ss?y2c(?u=sw#%vBF63!c!3s7w)gI)1-BUnWc^^%-~=XVwk|1b*Y*s_3FLJ z5xXzOvHXjVOt6^qVw%{Uwa-^BI(+)@>-xlpJqCRl_PO_WOxpCB_1mjy5pGhFH-7$_ zxG2KH7Mhk}$7rwhldoC2wEJCMkrrojauwB^kE) z+=cTO>V1CCO%s%H>Da;dfA(R<7j{b5H+X6Nh}n34>fG#BUlZwOL+OS`VK?Q zhWdxqK03+MjglFgSepWCe3;f>+9l6s7d%ZjQ@pi-Rbu`tu{&F3Q`8U56JJxHTrqRS zn=Qgd2GV`*r`-RQ_}1Uum2mIw{~tB~Kc7+b;71_c~5~F{Z|ivW*r3+a8G61ULBVUlDxBQ>{6(a<1l{)+#RN z&8w#9teK#L^Z@Nc8WF{k6pwroCHZ^X{}w(i|er#Zjww2P_RC${gIaSTou=>yQeedc>imsk6Kf*S{KczP4H7X z`tF}iD--9$Os7{yig$|q>)TUv%5;TpB?im6j{l>7v^ESV_vu2w7ym|6s-hKB&Z$Cd|;AC;a?<$9|iD@6p?4m#J zMt$E8zBAQ2cf(JqY4zQnRkoh4JuS1B-q`81Wpduzo*kcm{WV@2`!P&=--?O%HQJ}g z%gNd4&WOrsnY5+eN2#3K;APN5%{_;UE2f`5)*Q9x%)=`S?#!Pi^D>-k;opw+%ugO1 z$*r|IxcqV8`j1806Qw`xJ6yy!@A~AO=QCyW5Ba9tbhsh+r|`xeqYHfp+~Rzzk|Oqo zIxPCBHe;`FL#t87g{YpCM<&)j$&+=}RtcB{9u~M!Sm`Zz!G+U&-h+Bs>7SK*<9k?V z{tIurWv%3^PASzZZEeh|OMl!B-d?W}x43U>_^L2i&->)w(&(@#+{(jnwLl!27G8Vek@fbLo2r!=a-t_vwK_Q(T z94QN3IkV#hMg3-5gw>=}@w$C|bu{ViyFY8M?6v#*X+uH7@5eRb!Ov8p)|tMtER86i zIr;EU<9Xgj^%pOD`zg$N_2fq`qgl_1$mQ?9{`+|Nw9HCDfygAo6F261owVewoqyW; zLH+NxL)Lk3y#D|E@bKm3!=Gnw_do5hHF18$!*{#q_isu($g!g%xI<><^c|&HQxj*r z+Bu)!W|_mC4QIcbFkMNW!ZZ6>*{(A($BPe5H|}1{eA`bfdfnvDH!FfGEhqOJ&rK0_ zzVbJQtL;I3&wDNzFR8`8wtGJWEq|fVr`GauiD~-f-}T3T^Ur^GUtj!osh+q=cAwCS z882CN*RK{xdn%Q7k@0Vi*_`;rmwvywX|>-jy?IW&%HM(+!Kc1|KK|M1WL}-=0;}JZ z%pBb_tMqEN@6h7gWT1cGX1ImodG3PJxhH4rSJi!|^?Cb`yxO_>CqGZWa@02OU*FNx zZRc&y`@}A}diL|C9rbI(?CPCo+`n`_e#4GeX1Cs)_t#D^NE7Ls$2o7(!|>bEhfeDj z)$3V23f#TSCsl_>XTucNKkv>tRE9AXojBn6F>l@EjZ2dRzFt^-?PcZn565bk-z?HR z=PI_b^5+rP=%~2&X2Ngw`!{`FWA=M@rOW*-xmS*w8lF3M%W3}$jY>nKtMy;M)){Yp z=pSQUe@Usk{^GaB?K*LrcBFsoI(qfr9*?6+g54%pu3mln=-vP5JLX-#qf0lv56FC} zACvjn=)HLAEb-L1>(_VZU%LFvWdG)Vol61X;roNv?k~Sv^VZS5iD8cwUyGcSZSb=5 z(N{|PZsbnf^wsH^_~h+uJ9H$2WgYGZ)r+rR@?9`jwqMiA|7c$Z*Av$Tg+~K34K;Tp ze=1wWxpjKNisb5M^CPAH6XG=9cJK2%E&NP(-xMd8c)8$rGn}5Dh&6uof{BxDZ%^RU zqJ?`d9z0j_q_VgujMH?U&B_D(zg$csEce#7D8HF&$e}dX;8y1by-AIy7D#gFDV&?~ zr@6QO+VVF`PwY(ZY)w*UID9QOK!1Ds!cTemZ(L`ec)hfCcA#~r(ZXd@tTs zxDRJ;<@No(bMN4tk9W^(vRhH)prz*{*pq*#anjclKawk1o^0Jd?V0bs3vYc{xhr%` zHDyaV?y^gryUomgD1EQRsyAD|EuH*M>>s&sFWwAG_WSx?*Cc4o6pU%&2x;HlqAX&;?*vOHyVb^?oQ{mGE4HC ztJb~h-8Dt0hd;J`Z9ir*hqYpz*@bqEbs-1lTCUnrWP5JrNu}*;EG$Lq{|YSnSj}lI z`~BsGrW=!D^7aI3HZ|z}v^#$NwBnq*?`Da#Fs_*YJmur|&c#OxIDTt2Y&hB0>*Z&_ zXHq-y3PqpuN$={+uL6XFxP=cw1WFZWE_Zk-yVu)X)t#6NlZ zZM4Hu?krI$KcnM3y&@wp_TG-%_3qA_xego^v%A^6Zb|nyA^&M?d!@H`JYhUso+Y7u zzP|0frw;2iopUT5Zc4kvFSKx+;W(cs{k%HM{^V#SaM!HFqkJ;ajV6j>pS4tF&5P-hJ29^>%6OG#Pal<6_GshIHK>dt?hgZ8<7yyJOKwmDbV? zsu|N)N=dFSG?n=lBf-D3;Nq{_+n-;$7ZD;7a;f`4<%-6P?;kY`w6t#h)|%bA?^5Kv z-EO{fx?GnS%&fOcd9_+Fd2-0^D7&ep!BSp-m+{E#U^c&USD<{mCTscQx;_7W0)3-d zLtAAMWh39N;GG>awX{}wR{9&Q|5=)8=@Tr{g%h@>7cTk!^BZT~q}BT>V!s`Iy-Pn% zyzb+!PudA>{d`gQCbXNo|D^!OWQqo43`;2l)hL!ueY!9s%%n=WP0C*t8PC_p4^S#EnJi& zVB4&9<7~UP_#IuR&GS-hC+1%^7myV@=r?oA`=l8~+X6ms31<k>o1pd)!sibd-f()eEs9D-YPT68Cr2y!%~m$j@iE1e?ISt z=ZtsF|Ai<7*KRziFnc3o;`e!iCVV-ET@5|s0w-HIWz=k&JT>v6r{kBIW!-fX_vV?` z{k&6Lk!Hj?|7on(Lg$aK1$1-1PP?Zg(wSZFvHWoCCXV{&Zv@U4Z58FWI{5t+=f1bI z*t{w=`hs6GZ8Ymis+{>Y;kIpbzS{2n z$**0xPAuA(dW5O^?Oz+Go$hD!P6Xc8P401QyYjx}miprU2TP<~zy3LJD9Yo&rG1W%yxlIIFX&(i zQ|kNUB#<*rhC8)PHLGxv$BBT{si8MbR7Lc8FLBELJXP&bUm5)M$-&I1qZ}@4Lkt{V zY+7#X%I|q``ub06ytw(la7{jY&g8PLuSIc&o7kQUI{Jsh)mH9{HF4PUx7O`y`SEp^ z=XXTg8%8m6FVG0z@h?Ac+r&Bl1MfVSS!FbH)mb0a&wKyb2ToYf@n^{G^_CK23>_2 zRjghb!IP6GU31Z9YH6t!J@a+KvI(n{jwH=LdTK(#8ipOF7ccr9@V?5KyH9AX1pm&P z3Z2Vc!W7qN+ST6hwO)Ml{mq}I=XY$$)~Bq0EX`erR|N2E$IrsCJeQ(ST;bEWOcX{Hv+ZBg+cRfCTBX5Q!fAog) z+r@j_KGom9Q(sXL=MkwWeDu?TU$U8RX70Om>Ar7lvYPa6j;OAR`zCkmCa%kym*>TD zX1%u%Th1ky%bto8K5W-uy4hRv_wnbZrBh0R&CR~Q481Llwmzxve#3y zGFXgh;m$~{w;4CCbwqN`67+OSu4%t^^U8zwe`Wse+uZ%Q{_cUT+2^B9?h9JHX7|)> z=@+6UCbK5I`ykF~yeg3G+rB;7*B(qNyI#K1k}vu4#H(co4Ju3S?J2sNBXDPOOIG{5 zg%dA2J+Ks2t3JJMZ{F@5=8}9n92OMap1`z1^C;a(APKbVJ-? z@l672cr-$;b}8KYaaQ?hy~-+a(;*FX8HwtpHkFm~}mZY(8NpV*FJkMUy zuDN%VrArkjZ(jGK-fmxxM?lMB3HDb@KR!FhB>TDM#EQ>?$%UcImLHYA^GI!b#qn2F z_1Z6^jTRmhk#0KK(sn=Tsi|Yw?Gt9f?-z2mcB`=gr?_t>dK|$oC&Z7E4)98t3 zELku8Sr)l~+c{eN`gPY&AM5-cvfg>O;bZ-hP=?3Rf~_&vcJ)S;ORkQ)bn0S|Y-YsN zI=K*uJvQgQIz;)nwZ1!(vuX0Vj&k-@s~y;wcPEY-#eE5aVm7g2-Z<(upg13B9 zqhf#m%SH81s!kk}aZ1e3O-WfB_MdHNek2eaO zYSJ(GK4IsPN$K{PofD5wSbEUB{oUL=7WBQDsn{JE<`g2d&b-pemt)a< zQ6uM@B2EV;mAKV#y6lv^!}3{ZMei(%=&A*v)AY5oiMg2Rj)Xc5l9oa0j7V}ss z9oOEw{P?L80c&&$8GYT&(<>N$GVT4b=9EwMuU)GSh0hf9S+MtF*sivGMRkeGPOVcP zin8wu6z_7Y5$fu^vGUmEAC1P%^JJgv$0>I2=(uB3`)b#&cR~8aD?6<||9vvkhA0*u5LFDY~?Smw^kLa?^HQCXI|pw-9GY%qR&;@#eMty(CEDT?OnUHI-jK`N#q-P z_r@=8b7A@XBv*3Tk_8zT?yom9WKk z-cyE5DbGr+7lLzNxGC|4ZnS*FIgQak;6mV;MF+0TU0K)p-*3x8_e#y1t5?)d?|fc< zMDMD!YEeLZ+JzYz5jXj7_RpwzBqhW;OJ-%y$N!msKI}Z()#dko%XF(}r7LSItovt8 z$uEvr{oTEPMTbq#ik}^Eu_B-E%GhiODT-bEH?^g7-;4=vsVkDxcAqx+`E}X!sJT1K z7Ioa1b@5o-jqU)xc*Z$$XY-ZM+TXXYi>W{5^F>!;S;wha_JY?Bxm;0G*5jW4e5r<# zr%}wLZ{H&XdM|r!%Ys3ZRGmAHfm=6)0*x3o=>Q}WlFF)UIy>a=&g$ofo-2IlV;ySyId-;9_DGvWw@veQ{ z3qx+@8f_1>_ZFGUGmkC!#+!dVRnAyk{F@yXL2|=uOpG zktx!5!S0pr55DyLy|2z5Z@(Tdb}VkfhI7}S7%cHWpTZ}bw7$RitM{?_MH8=_&;2`r z?PZ!;sle+60(4u;i^Q(l!N{X_rTdby^7fefau+2xKK~@>!4Q(yt@CGV z+~WAye07uAkN(w6WD|S8%q}<~#roaU7~#6SwD-p;hugr=Fg`e zh1Xs@VC1cT{e4k_ymfcxuJFT;Is_dqaK95@G37Ytr1YNWedSV1%S@iXdURJrA$Cr( zRNj)(txKoB650RyvJs_;~5QE3j#M)I$7nt-(Zr}e(X=;cTwh^j#rWvPy}dANhesesoH?{VH)`MX5GXmU(u>%a7z3kPb? z$HpB0yZ@13jB+sBwP~hDO1>SLDgNs>?@iUENtVK!B&N+`C|mknUBh+S31i**e;0Tf zGEG?9%0d!Ed#pIO=`L5kY<9!>`T}M#g`0Oj_@BJ*uM$_xTQ4v-=Il@X4_vlyO)5Ur zs3xd;-&cDl^)Qn^zGt%N*9n<>)bfjjliOZ47o4gw;7<2CyD9SQmY3((_?_as^HoHL z{lTQ$U*_%-^|bF?uQbbXk?9mmO)Hx()5Pb>_FFmD*_O&b_@6)hjKi755-Lr_4d3^r zT+DwzMdRVx%sYC4FT||s4=qV&zwl_T$cgG0_RCu?On9?J_Sg&;vEXL;nQ@F0gC}0F zb5fBKF=VT4y3b;BT(Bf=Nu!=p`mE+vok=M>&#a7?e@5#V?+lffnHMf9PSj7Se4F{; z`eZlHbFcXJdb*fztty@`^xrp5YFnP@!sXRI6N0`OF#HynYPjsDbl&QGUhDePia(=; zDov!%9$b0#OW0Pa8`=vW$6jpEk90X_e`DA0LcJ`#A7{2*x^8BlF=wIjw&drXdmPP- zBsa|J^x!c!G_6h+)2)0IaY-<4-j&OItv4>K{7B7+op{e^QIvJ%qPdGEEfPG&{gWqs zq2SH_h;Y^b)#R<>e=7{G_%ARF`F2)Asy#85#G9DkaTLqS!Jh;`-@W^GQs~aoE$cmw($U8=sQCk{2?3m)T9l zxYFy(YW);C;*3;S>b7h<8nKh3dufRc#|+Uz`}Tusn*&u>9&F&^n{-a%UFWx)9qvuC zPmBG(iPlPN-tv6)$&>NAT-x5>_f5auy|p>TWJ1LGi;JobAN$;bB9r7)cWbgGmPgbVpZ`}PnY5s+s zAJ55YTid;R)BAQc(?7#S6N;DQIeE!QXnD(>|FEv~W6eL4`yV0=Vvf{v9qy|>;ZVtX zf#dRGU4izzsGvztVsz{=pv z9=L4ss`WBY&T@6-D^!%o=j4zYk6e{`H-u|3Y zV*%%~WqlQCX$?=`Gdl6@Oti0>^-Q=a#-^El<#8p3z3nF3T9kZa6ukLU&pcoCu(q!L z`}e1IvOiK;CVoq{sJx|r{^7n&7VOQBpY`q)VQ6b!{g)@&<;C(1O`;xm!nFMa&$9)k zWnT?Z30IF|XZBbuHbr{r%zL;TWF_f9frG9Jfx;%#U6pQf4I++jxhhp zT@o%|SNe9kXm-CSk=Fb?!JvpGs_1RR&KJk_Jalx7&N=fiG4FP{s}DD~m~K{Uy426) zXOr5aj~%LK-R!wI-Fx|Vi#aBrB(;LA(!%yu*z!(^^Sf?kvH6IM@`ciE2^QaDeyhK- zoh@FWVK4jbOaIMh3yw=2)Xovyz{5S=WP{z^%0=_mI9Z6aie8dD>a1n0nsj`_r0M2s z%`0-OU9OkS(hrjPeBtu#um=aSD=j|%-<=S%;La|ln4E_an)UO3$i3NkG5CpSf8p}O zPWsCE4vP%D#DwxLi%ltAQGT-cdb9|K?O%>DlfCU7`~Ck+%&)v({VYkT-(vZfBMJ#u*G)(`_~39%$KlGwKcX`-Cm5NY z;k5hJ?ZNOO;;0LMxfok^{m!j?Li1l_Ob+_}!0MKenz5Cc;~MuAJuk^ci=9}u>dI`h zy12{n*g^xj!$P6c9!YN0a{Kmv$JsQ^{5Ko-uk;k$H*4P7N&BQDt)+IBC71-QQj$(6 zm3q%0#&sw4d~2xGFWJBo(@#maZ?j$<#kuRM_oJ&Dp8G9falLc;yGw=2q>^j(Tb$o2 z9ZYmdIk50bAj6u=lQhGF4Nvdsv}?&z-jtwodFlK6?3WpiO*{KscQxy|Wm*aTVr=Y+5Rd;=!&Y`^dJZEl2UhsG4dZNRAc;1@5Vov27 zr!{0WMQYF7CRb)R;f2ui3$rV|J?6RGZgO${dG7!Gz4OzpY5bffbk*R9zVU%&CYogqyM#uY&3kwYE(h8VPyU&7CW0KD+_FBm=ib>koFw;k@aLN(R7yFD?SZqDAcgM3`4^~h6{_wF;*1>PQ zUmGVH_m=aOJ}bJ~jgCjy8K!VH_IXz>E)hRE_rjy5osWJo1XwMX63o|m z|73>9gVY5&+OtxZe%!P+>(_(~g_Rd(S}C;6S$_Ls#`)gpfU@bYckFuf|MQQ!+@q78 zSbD6JezB){MhYau@lW^wwzzdb-6$GO+(v7GKV~7{`rnmQz`$ za4s+|jIH;ZRP`-=7xzxRfV`R8a>9QrbMvZ-a z!=7BO`Bf#13r~vOUCpo9Tw;HNE0yC;i=(Oa?e+hQtggS6%HQPnq-{3;qKoOf*7B%N z0XE4w*=Odn2JZWEVvM}Ng`-Wjbm zd9f$Yxk#wUoZbG2eO^i2p3IW66&9>GhZzbnW`5O4D{z<@j*W=t?eaFlvp80!9^~}21*xu({oA2J_b?D0e+`Gs^ zKEPS}Y(?iY*BFt$MVBp%diPXEo(Z=yN_6;Gq^5sTXuNIrPIsSUb^TO*MDVA>I^gA+W4vLS{FU^*4AG==f3iZ z8n^Y7^V7;7e>|2|yfL+S`cpZVXDc$Ro7iiDBquO;nkb#uYt-MgX+j3OaM(hjLl0b* ze!q0h%O=2pZTIvotKVC53%kzP5W=&#!uhO1%9-v}Onbx3Z=Y&Eu6?`R^><70lsyaP zWU?KpFPhe~CvQpe_Sv&0iv6GQU5)!ih=g;h)&8PDyOi5f&t}hBGvPvv$wT=o_f?I3 zvo`kU%?qn8+!(n3*|VyRcMoRvwcZRq@$G8X{)yMEpa0s-Yt?p{aYyUbC+~Okx<4}G zvE7{eM|Jzlf-enSu?fg;WZG>valbN-w55(9H`Q%w``u^P5 z@ruCx%DQ&(FsEg58@GET@#h%twecyp|Mjh}w*HCrD?arL9|g8Pwp6&kT=@HGyS$Cx z>(#&iUvc4Ff})&?UVT*f+}ufCtIOL2Ufx<1W)a$1t|BD5NmlLq++Ag!w>ZV8=-hn# z<=gkYAwq}t2IYO(pRND(NB?*K{Qm#8R;&8L1Li+ob3Svk-tox$i*h}6u6PxugpSzaj z&iAw*dD-{gZ39ud5Ax1@*lrqAx41r1etYy2H^1bUJ9pmQa!|ZeJ1QiO>BN)e7X6>D zKjnK{&HR7*^y&KEc|3~qIx4kd9Yi-hTyxj;VK7^GVazN4kIgl_8ezs^f4$;Q%Er~m zF*TPw$#ECk5pHzF`ghb}so(mtF<#kK>knl(+?-px*7`wTl#s&461|5XCh~3MF}YA& zKh0yFUDmvA>-%4sqPA$VH^od`z0Bw5@~Uv3moZc7HG+e0PS#(3`H#!V2`>wpa>Dq$ z`?h_)yt(htXU6u+U&?j9&16vVnBM1@dua3KY?<>j{-`a?JyQRp>Bj7p+K0bBzI1C} z&*lBHXAaz+XB$7|o>^GI?$5dl&o4A-X0qV;5lnEsdm zqxr7QJVIFw-{e@?nsdxQ$M=3Z>X8_H=+wR?cOGeEu6EcW^;JVk-TI`+%q96Ezw8?A zIsbAv9#6lW-sW+0+rLu5ls*3~UbEPIJ8S;%b&=wi_&k^0wmE+UA77krmgF_TdoibR z#lEkKEBbAW`0A&3skZ6x2AgpSF3^1RK0{e1@Na0fiFe)af)|UEU8UCVIKAS<<$V2y zdvSL4f4=Q_!zs>^aJ=lL$UftnPa6;YQ2HGpZDo?F>G?U%S8DQ~GvY^ISVZiu+`ISD z{V8?npV#TkJe%uperMOCi+q1O(?5EyQQ8@ zc6b?!++6I(z4N!z9(IdGjUO~y>O5OmwW6oBcw7iwI!)u6fJWj09b2E?x%Pq+w@y9q zc;*3#ieJIUb%^je-;iRU#mDq$2Vv}5LjOVSLF=12Lg99mLhMNRCE`~&{ zOkbj;xcbiF2UAnOq`XXVbL-i_>|nOPmn}n7=&HbiN#B>Z&Fy-=OYVG!x55|hj}z+8 zNov$ad1yslWVy@KHiwgkTjX>2q&&8aX9bqmzP-KWvv)$*2|oMwy;qd>CQJ~y%yZyX z)n`GilAy9nrZOv~b2utCy=(qgj2smxMid^~-AizWR!|kr*|*Mp@>aA0mT9uAF4ZoVSdR<@M7BfuwF88757at$SSVtJM59*Doov znEi6by(hKxQ*tj($gQ$1Sf+pTq%fbst&cnSGY(rkU;Dc1`@clrXY=B$loI_N%N_+S zZgkw%{o)H-WU6os!^&0R;(Uml~}3j zeTqReEbf%3;3LuKlP9}g=+yhJGS^zDR<++;w`Ha1hE-eXG;#^eWbG zlFs{X@B|$#2?$^GQgLPYoJ#LI^Iq)AaX5c>=bNbet#Q7m{+fT1v3PwxDkwDh-K5)R ztUT;*u%CWZyw7ioiu0x3#N{hgyB;)ck)N_?!wmL|6<5yM#A-RkJeldaTB7G{RQ(rI z4%L_!liEDzt4;P~Ez%E4p8w^P$HK%1jn2gPC*pO^)=XlOJq&by!ttPu#g#YiHigC{d0-#rWgGfpR64Q*$2c<|}vJ za`@CR`SOkMko~*AD1_IZy??*9R{2%_+a9Jq1D(Ylt2J1jrSRIhr8MSR~+6_mac96+xzxkF8-Bn%__5Do{=o+4Pkc^DJJ|ZNu;R}fiAvSuCF#1~B0Oeun7n1|X(-7# zVKvEO?fZ3cyX*JV*ZnBD+it~mG-yIs(*t#_YVFX9Nhh=duikk6YleUR`+ITsY-@gQ zin^Qct&u1_Ld=p=W zY|-2p-v6cD=hd~FoWXkvUSI4f+Hq*lI__CtwdD3{6b44jWU0SfW5cCWaWZ*Eltw1s z{+|g=mHvX#7ANMdTCbrnr)B%vNo6J-DyLOdr?x6aoQ^26$TO9-EAjslcWqVczBM<$ zlxjt;@eE7onU{GZ@I>40=Fs1F-HaxQicb|g@hSAMQRAJwbBxU2HD#Kc1;1BpKi$i= ztyA%SjP`l48zfc6+p<+&RBsWn1cttzY;QU%l;lK7Dfe&Ai>u7oD>x&RN;{ zGa!&%vgOi~#VK72H$M#TD{IcNo)M!ur&s%nQjkHt;(M7+_JlI!^{r`2w)H0r9nIb> z*cz>KY2Wg1%{^E2&NA?P)v~nMc$)d?(Z@`;o&HsC_HA69?z=1}toh-R7qN0Vy>Wqa z-$kAKE@$@a!IFy-^Ss1Ati8?pSVVNe*@&rUuWj|*v!iO+=kwihcXfBmeNR4LaP9G~ zPtIpQURpiQ|5-@4*(>igT@v$b{R?|hKK-ga0;i_zt+<0&OxMOPhBq107c_vRc3W!O@kvTbU} zsVJw1v0PQX=hd!nd@P-MijUKTEt=0OuYfaViQ!SrIq9yeIA?!cmhEF-ZuR1U=O0^b z(}JJtTTajOJ*TyIpR~RGp86Q)geU#oM+~otxLHqFf3^N<**D&QRrRNB^8Ymi@HCp6 zpG$f9>2>_6sWq=-ejeNT%kp2q%eq4&?An^)ZBgZ9DiZa52f z?v8TN4_0W(+H&;F>aVLCFJ%?IPzoqZXc71Mz3hP9rR>(al}yR*R{mL&N)q`ul(`vg z`|>$VxZ?ZMuTP&ZuYZ2r{`C6>kqAruh4(J*G5>eww9Leb@S4%#xT^5~Z8f$(0+TmX>pQh^Czw^K1>25cxyVjkP zed5|orwKF8^**}!$tuae(dG14zU4NPo0=JZy8YWe|G)p0D<+0qFJ!e{>TB{mdbF%o zZ(01kA($`L`^uIlztfk=`GQ%*C>sX4?U-fKaDaWn5&lP) zXT5gg*rixl`{JhL@kO8Bx*VS&YsQ!$ky<|O|FoO4VngDuTV_ZiOn zvc&OVh)(RbN$HBp{H;v3rmtVfuRr^@UP9XZ`PR59n8_TAuk2sKiWA)o1O37*a+j@3+pG|=cwOKH8w(>PGZt?d z!`tS_n;t!5>E-Om{$IO7YipY)zhBSqeLVVvsLxrk z6#BRZRxz@Q^jUr0qjY`i zkK!->d+*S$ zs?)bV>57!({oFfy-Kx9GTRAj;{oZsz(bay7%OnNH%?y)cPA>lQ=LbW{!CNOKYS+Bq z^!mh%5Y5hT2DK+A{7g1A2n#%PW^T%#v&iYgy^t>viYqfBd}nT*dZU=Teoo(KN8yvw z8ounCUCwouotny?HD8nEQSad=@0NH!<8Q0;DZlhpbdhOr*Ljnc73Z8e!o>EQdasg^ zT+4hlX2+vNe3SMHtWeo@YQr?S^ix&pEmB8{`)8FtEbaPIYbDNm@uCDZZ?_LG{m%97(#V`MhwGXQ+)fD-d zWrd$TPGqy2XMJ}e|IXI3`=KnRO}DzQTv}N%{fyGh$+JJjvCO}gb7k`1PnPwQyc&J$ zdW#Qo&G}fTn58J~r1AJbNYU#l@8$08um8D?>4j%-la$?=#7}Q#I0wH@()4V$E}XwM zYt8J%(^Yg;s(nM>_gKp8FWi!Ke7A<6SMRR^$z~DZV=+?wfnUXpQ~frEtqVV#m)NTs z{$$UYjq$bb&EFsV9WNL6f0K2C&Wqa1^^cf4GTh%JDd?Oj?5>%`QtG?>?J}dQKMOUj ze=oP&+W0=>`lcxdj2#!gayxYJn?u46h2J|?PPUogFkx5uT-n6mMf2kK)&4lG=iZ@r zOjC8r`S2MVJ!fWqzUwBg?8f5Dxyquv;eGjRhDZ(-vumzleEbHv3(ZC3)~1PTrB-hC z*yvTCdv6|p|9SuU>vn9Ye^>qLoVQ=ZTgIu+H0@4UhrG<}QOJ0@%6n!F--l0u&lPH4 zXT{yC|NZ5Mc$rnEzQyi>kC%GX1&p(K|K5#?YrJ@|_-^(q@#$^TQo8P4PFej&^qbR~ z=a230+1u%-OWog}-+fal@8+Rr=jDGh&#>o<%-=MhtEYZhMWwyh#O?!(pYxXeVU)60 zbbRyVhv~KBMKhfbTt9hEuVm^bt<3tr6B;}!8}9CVwEDQx=YohQmBO9hC#lYryEZq= zb!BVqPWP(tE`duc$6DOP`VVKJea=8EV4ncd8=h z*$M`TlrVp8*7Q5Kt-kQ(zRZDp0*2*^pV>B zo^j(0l>n}-ojI-+Q6O*NQ{k)`=%>2l~HTaHZPJQHbmOb3IeDGfj2%HLkz8Ukgh1 zqIBTSE&&Kzle}U267n1LfvMirhGT{id#<+nAAi8f5qiF7*WJq^Vu|K8Eo+o|CY)5CByqEV zuT9CKfd7xLO|HM`JUiQ(nm?=C=GCuR$-rE#5U}yF@#$XXeJ(ml7q`ug_A5M`#kKp- zuDd&q*zZqYSn~4dWDmh@jR7&nCbQg}ZZ&7Sn>|aa`gAz${HH&g=3M&cuFbpsUg%c; zgEv;@O)Z$d*kG53OWlcxPUXpeAJwugGOFHDA{tWq_q)fGFBk>6AO91CWDW?$Ek z@LF7Fg6`Q*E&`VvQlxqQ`~8`}+CG1^vyoHB>dt4Y8aK{l*SNdsQ_#Z2JH&lT`j0(Q zEIE{EIn5{2i}9yRNBP7M&701V%j{D!HgtF-Zk^MVvnS|6%<(l_>m#-uC{aoBe_!0& zR4+aK*mo@nD_Kys}+#QMl5Hl}>NgdTVSkTl_84aIfvdD`ifqeySetIX8*E z>E5fRf5ap7n9)q;WWP#-IeRYT#@atr`LbwJ(hQbU7hP`T+o_-ZY;&-0*XD?Q-EHx1 zYW7S)N`bos73OgG&AmONQhXt={g%ZHj0PVxPVNvkyS~}($Eu+E-~Vq^Pk+0kP$&CG z=p)7y-A8;p#Ya`x1TRa}7%yGxv-OXe7c}g z@a2dEdI9oU-A``)XRUF8vL~DIB#sy-Tjg&B=^NNGcE~}D6J)n54=uk zo$#<{qof|2&x40gwsq+_ykYON>o|RPl10PJL%Qvzml!Siq#PXP_^|p!Zi@KotDFA9 zwTa^b_s5Wh60g>EPgOa#Bef%-FX`~~)zj*J6u53)H+N3YOwoTw4zUOt&(3f?C)&18 z)jP}kU4i73URSTZkC4GFnY$dbhJIfDCr!y}q_1ZRR@5=pG9XGBQ zv96BaTPLD@L*>_|BhPQl&Nnzx$yZq5vY=5eLuHfUg6FA86Qd0!<}s$0td+LA*l#;i z{Z~YXNukYC>7T~DF~1I{6t0Q2OJ~}eeBSJtocfM;PWR>F-p#vzcW-_DuWw(UKKy&@ zC}X_H`^+nQx8-~A9O#e{-qU0>Lp5d%_pCMCuZ$LEPU$`1DZ<%(q+^D&m+SJGmN5qL z6+eafvp;Gl83yh2nX|#|vh}2+A5Y4#UEi`R@$&5R`M=(_UjOE*6OgHK>FwsgS?8%I~|2<@vaOnnd+Xs$a%E`$`6S!A>42=6$_cXAsvf}?~ zt!z==o6Mn{w+?r0b`kVl>-%S|&ZHynl~>RFFLAqn0oM`jy)3*x`DGU`eD~s|ZCCIE zDU0QLj3w;rW<)URAF*v z<~wD()b&RqDvA1elN%)4zLkoonv+PFYwpg&3)x4_Z z>Mt*Am}>fGxk2pHRg<|4ejG5CHF;ASsQ%V;IfL2B(t9O4a@c>`FN@RubGKYT{5;<^ z^Un9zN}X-$D!xB``S9b@haaD3&#vcp$PL?cpjh68$+;t)FXe^tY3119XKgQ)Pu)?n zJh&<6Th}4R{aP`qcNz_&_wk&4 zdV)EHmeXBq&K}xy@k?BeT4%}6!fQh6nI@Ms*F0RAX{i4t-S}F0GPB8|30~U+j^uhz zXjrKAlJ|oC8MU6bD?W&Cd)sTfkGo8&C)dg|(axy;cIl!Unob5=*0x*KF|VI7-Ou}b zvzqC_69Fcwi=9QvBsLtbNYr$(+!QHb=_LQbo+EjRUW(qCzUk7Yky&4se&$jS^ZWKo z`_9_M$Jvrvw`=MwbM@rG8!_ToBlVD(W*W<;z^I@_kI7b9^SYA_lKvCFF)qmY(@046S)BBg2@w|`U3`A$->7V(ZV{@gP`K;CRK;^3q8*h9*Jx}sl>hHaA zM@tv&D+t@XTyeE>-LeyVne!R!9&Zu+;O*iY_po_SS;-`Ze~c10KJMpc*ld({N`Yzm zQ}3#@SgHD|Uz^uHT+Ld({$bjF;{&@}`>GeG?z^}Dfpqm(k?S4ne>PvS)?S_EYNdC+ zD8kPBqT~553*`DwY%XT8JuWK6y?B1ViH~l&eD03Tx{c9yekf%)AHF|3_Veq%r|lQU zZ=1RL`Ko@SKVN_UdJ%EGTz=lP(;i>WGxvnX-k2>`*<`6RaY?=H=U7IW7`{0@0%xtY z9(U!bN*m1Z^Am1JasAuZG-C~qj@SA40wtDGi>9dNmYczX^CAr@&P+7iS@L!3?^xrH zHXl#5#($DnBGG$9KFP;nfmeB~?M438^CX_UuihXbRi)}?@#;i{)XK%2{XC8jy*RuB zYJ(;Q`7>P!VJ#I?pHNhP{H)M#H^yFvt^~(r4FytJwRa*WoVIyszI%T`?84>kf`W;> zt$Las8hgKaneYiT_w+KpXt|UzDQPJqi?B0ZqkekAKs|^JMc85e)WVCmDc|E z*Q*sUX)COi3wwRz^{&d``dj=Dx0}4Y$=hPJ+2`ZD*WOAyT~8V8sa!POw_H$2__F^y zmaEcP4$*tBT(!0Cim>x5dR7#fv})(CcYXnTBmC~9iN6$oyLAQ2HOVuLrcYb8?zt5= zJ5c=Y+ov+s*17vnJzcft$kMRsv(Bxmx8J|AZvN)z`KBk<%uMUOe!KYEfoo6xO2*9V ze)rAV?&p!mFaFn5ti5h)|F`J>kJ$SfT9=Lf_Aqw(af>MNOsREd`FumfYVN%b?XW7O{$64dnpV>WsU+u3glOz{Ck*iJaFg0LZ?(O>h*w&+Ki*;K#=gEi6c2rY| z2r50h|NS?Wf0fOjqew{9JK*{=Z53+BYmBxLx#u znN=;Ha$nA9Iae-qe!1WdmIm*ay+6Hf=hoV$u+9+qvc}DFg|GBki^d9WNsTSB@4Y_x zcm}&?&WSWEW`8J|UG#`F?^W&Yr7x#VLRrmAT z%hz4k_|w#9mv(*QFnYH1sIAA=1oxdU3d8K{-1}J{I6qkXjYT;9C0{#i}^-6@}UsNGa#Pf!N*O;2MM57L0+{Ax8>EqHaG5$+oDo1XvP*gDdq$J({_wudv zHv|*fLN{5Q@M*Xx$KKzjaa@U1Qr98*6)-5-4(hN&Gz%Q)rtK_8^jlw%=BNGk@j~Rhkwo*vqOUQYkdx{nQCrd z8D0BkH>a=>w|Bp;y@!d3-xkTDk3VNmdDL^-VeMt5dP^b4?QaeK-YMSwzbia(bEf?J z_`2Gvf2pohcu#LvUdt4?lzq{HCkFlf>Ro4z&0k--q$TljVWp0&=TBzkknWB@1uvsE zlqnYkpE`GCiFfz*O%Lv>1&dF;(_K0@hjG43v~*UwvBR9+pG9n^6td4r@+N3*(a3RG ze{zMuhE)q^ZYrz~3*%j=vF!WYp39Tw=rw;$)Gt4?!t~pgjU|1%BnzjeyjwG~aj`?W z`F-xp{MJ*x8+21`6F6&?FYF0l;dyQL%)FC2lYU<1xV*9?%FSIEmrJwT&7$2n z`=U!#u3KM9(E7l9|F6Var7I8b&wg<@q0Z^bo7`u*S9e5oA9{0omSTN(mRg9l!QCsB zW-DtmtHOV8=LkLIrgKPGW7^65B+~=-cY7wa>dVaEHqWk|iS+|B^J?k9d;9PI{qtpq zS7I=)|Nm=QN^vg6#kq+f4-N;v*60hV|%XmX8K>f>1)31^R1=7rq$)InUd#M8tTn@citB3!un4= zQ~tOJM^532X)W1t?PWwstityV0YyE#(rcB)Uc1-7^%m^f>*u(B-CRGNvM^&)$xXi& z{j@EbFky3yK$O;N6ZeVMZ@>JVwQZv4#d9W)u2_a-&)dn7@VN?F4Lw8cY)d$V6eE;Mb%aQvRd8zxC^l?uwhR6xbg%Sk(HBV`|ZbY0szpY;wMS=XUu{b{Q-E z_qNtaZCrk(z~sw9|F$!acIqFUoA##8Iq1*h zTOE!yBAW_&S{W87-&?G(QR?aL_O-%}Avu5E|D3LBkz4!b&m48D;?ws0tc}&Tb3+d5 zJj*{Te|px@_*oq*eE)>xpFJivn0qplM_xAdkR zW^SS(nU9k%?^2lbc#Y$oy=ogdrNa+q*{5-?erVo0#b8&IM*ow-S4-xKdNItJz<;wX z;m_{Kh5PT?+TYRToOEQefZwI+xkn~Ux%m9auBQ6GhYdD;nRF$7z5a(Ur*9<-X1q=c ziJNqFCzHY)0gDOTr&-=N&i^}iM*sJgTfM6f?Q~?mH{<7hpS$M5_dht!o%xP2Y324q zXIf5Pyf{PW-h>6OJA>B$=)GZR_l-5mNdMxbLd9F#j|KG|&)a%3^qBIEzt*eHb`%A^ zyXnV%47I~GWccN<2w%($POU@@fsr&GM(pn}vtBcQ6 zd>b`lK5yBfy?xJf(YhqpE6ivuO2&$tIsFCf z1bLuCuTElHKY1Il?3CPC%X7#A`0M~c*kOYqB??R%~NeSVnExarp0P{Zb6^xA?BTPORs<qPz_ zqm!_~b{1>YyT#p)>*qzzn|HI%@}$J_7d3q|I2X=4)?1%A>*ej|yGze(68!Z_zmk7Z z!R;RzA5*3>Mb^y-pP&1A|H)aRoC~^UPTc?F{+>yFj=A^t{QBl4pYJYDU3~ZUcl-av5&vI3t*(E(lPy6b zf5PRWCr7l7tUGK|ys9Z}PEN>fui^=}w?y3OT=M;6^nxoN+&sFrfBO9S@88o|4@!L2 zPc}Qg)FN}&rKz7)+?Ph56!*Ea<;eMnYv%2pi%%R8Wd3Oy(fIm7?RVir7wqF6%b2pp zNa$Rh`gcnFE$_8;eYdx>>D|1}@4w$Jj z{x&@KDWtivgnd;N6YtrTEHRU&ylOPM%-EB&dA*%lV_~1m=TD-OV!EEbzZ`jORmv{w zLle(jvI=6nczv&@-Da(x_ZPBWeZ9TksOpyRi9Nf2uqED<`QsLwGLzw<;oFY)`dg#( z7cd&f+te>CkN>A*p0{}FYx&%?Z}aDcmaSj-qH=lt+0zj}zUdtJP$50TB7Kj`{p>%c zb{jq?-FW(OeRx?iL!wnx8CTnrXO-@^ex7T4+k5{nC(jjE*O>JMmmM0!`|6LowjO`n z()lU-;fEb!;^(s&KdrWXk-u`Gj}!CC{**6qS0h|M`cFQWRFV z;m^v%l{06~KB-orYq6&Ckbb%<$HQ~~)+Eilapn^1Y=K>C{onT||Nrsv_T%=@`DLdf z12-}R_BI9`nh_fOdNNb;_WGAWw-W#F#5pOSq_B>l@BK7P~L) zx^G*vFZz^HsH!vzU;3pGraL}6t~gum-RM>SJD4kVwrN%Q_m{`>=TCPGJ)!A!Y?{%F zz^*bDyTFZ$(}F(VI_U9XPGorSEw#PMzZ8663Po6Sueg zy}fPi-uhozZONezX1<=>(AA!LG<=6lTUpqlW7!vU$L8clk^|NsLj=1p?GYiuFSz2^{O||sxoZYcYlAD#P!@={Fx>9`TSou z)TQhW%;vrpV{E;_<>{)g{3NZq66K~+gxnPSy{d~#8ysHyA!~{AbcO2zNV~PuD@H;Wf z?~;#^^NNMqH9gydzSMJZu@}sF`~UyF9b3!o>vmQDKfOEN-fqtt)54g^^Ej>^Skp1N z-rewodG@z|{{;X4`SRu8ZL7Pt#3tOGnf`ObCX?yWUtWD*wmUf?@%E0#MYGRcQI_s? zxE3|-@uSBV&Ry?i{Aps>rF)-W%XLX_!|m1O|KDBzy*oba^~&w%{-*7%JDywrci*#} z%ciXV)A0F{_m8d#>ohJGd2V^a_ItLfpGn+*x%)Xs`OlZne}C<-l)!s#o*AV({_JF! zyvoZ+M&PD{Qo)i#Rj)V>vh!VfI^!;rd(X-BmU#**8;4zMJ#K8|e!b_rKVt zRHr=Y>;d}_r;~RSw0BEJ+}yAu#Id{K-DR12ZsCAK%Iq~)Eu(oV-9vlZ>ZeT-J2UzG zonsU7Jx$cVu|;O=+4tekUcG#?pZ>{{*PBQ&l%M3uy*l|N`&?s3MFstYq%4sGHG#{X z_#{XyXZ>g}|98*ZU2_Zse{H()Xr;-_>A@?uzy9;_u+bjbi3a8j_a?q5(oyVfKg2rg z44;tasz3GjC%(wxa5^^o&$FX)^Vbzd{BP1f_4Dn==c#|5-@V??Z?9|jJZOvBkExSf zidN*=9#u_|uwx5)yI51aZen3lvt5y(q?Sjsg!R0$l3HIcr>qOB$jYjD)#bi<^7$MGoELPrDl&%>HD_y|WihRO)L?ozJ;MdF=FjRA==x z^Y!Xa?E5{{SAJ(%Abu>oZ?5jiZ$7VnO$@qy#lp8ucTLGW{;>HOCuYy^<agaJyXB5`WRV zu}S!4q_gE_&e?tk>P`l4+Wg4My=#-BZTnw?uJmb(=0>Vle$M@I`|#t_SqpdlIkfXB z`-QjLu6RzjcP`p?O0aElwTOH_7x%Qxv>2ydKeh!<^nClKJ_V)>;xN2R+e7EI#bFkezxtj7N2n&3@uT$Y(X+aldK`Gj<{?DL=canT=&ciDES z+{}OB*`jzQGx)L}??YW#pU#?B?c4Xttz~4KDyng;C*@aBOh4+6v=3Z(d_ORp&0^6$=L-=efRh60xY z=e+qn4~}e^Ymq}eJb}j76z}JarbVZvG3$plKJ<2%_Wv4sHo|k z_Tb-C`*V)3ucT##%IoRn+HY4b?R+V^>(#@;xxaE_zO4=Ft+##+wUG*T5{&Z&hW!538()BskASg`Qn1- ziKlLY3(ol#{Vi5pX8Y~ zXTf4Md+X`D*jV#~Vf(EUf2Kv}PWja`;gVC( z$>vF~?Robw&#kmsp4%&MCg;`GrpVJa7A0SHMJi_9Pnh58sA4+T;){3d+AJ-``fcl$ zANgeded>fO21`$LYyK`f>uc^QoR<8w(bw+bXP4V=vpBc)&+F`y-IccU=YkHK_lsuz z^OCuuwd>BQZSrB#m$R#PU5TBvev12czQFFa=ifbA{X35(N3Om~;{Lk&HG7?V;vSi_ zAG|Is^(gM2o6lyGb!$znIb!Fv-t(T){dV@``jlzDbX0?x9k7iQMlpsQ&id-C6u6xU6o@ayf4C>QmOaJFUhm za%Fy}-Oo1KxM%IOJInpn9+-Xb%Bq`gajoUHq3MgOZEfrKRaZs`Su!TLO^9nLd8ur1 z^IpBX+Yjlfm92C9EIXVWZ|tAu^Y5<3`#d!x4ykX^-}g+so$$WC^SVp#mbYI5u7QHm z$orf^vLfs5iT*KV+pfIk%F%eM`*zyP`)UmgbyJ_2PE**FSQZgn+`35Q ziFovi%+)OL>W&?KC*(KoRSusr)4;r1;QHLhuTS4Sf4+SF^bDz#ijQuWH3SPPTdXv; z1uytw_3smNn^%Xl|9!EN8_aLs6uvJxbMT-w-^+hC|29~)gj)t4{l^|5)bqdIH+V+j z>zQUdx+)s|X8-&(C0bYi*!?i}o2%LMrT-TiN8O}op*XU6}FzNfafxlQ}4bj8?A zdWG|Wn@4t;Hdx`LZ%}`bRc_ zCcd=)oXeLT3e{Ye+_CL~#;iq_SMvB-S}j&yOyw#!4Z8W`_l;7OUG@)RA6Zn*S+vwQ zZ%*L3#YeXBq%E!9T#-6?qsiW{Woc_yPD_3DY|@&qOETFenPkp>$$PQwq}?O6KYSeG zMuGZB0At4bJ$wRwCdZcklD0o8v-YL+oi9uKHD+%A-6(7l6`cKzComCqLJDL!;iCgkxgj{1jt*D&xNnxl2=r+?O# z#2kLf-Jx69mEZBiySl#p9H&s&*X%SW@VIi>OU+9=x_S6!Bptty`F!8IE%m$W>ngwh z%Y3sj{L*=!-=F_)@=g@IzdDV7(~a*7+iJgGJo99-gLCq9SKCGl>u3A9nvN}6JnLnt z+L6uO2B&==WlVX++OEa@qW;byyBRBPI3#iDA1P)FJLPWGx8UfLqEp|G&9LoMxS4os zM*dOe+b>sH$@DL~6}fhe|MQT|tJ|u7ZkuG&{#rG>{e!*a8|IzdMe&mIp-V1niu&w` z_}-YO6&iGeMU|~^h3||78NrK>c5(f_In7BqUCYU(M%1u#{j%6YuG>U?B`q%3KW#ed z^xjeX+CFB6Bby)9?cD0QsmHOPMcDOEQl=|9_J~p=n%bg zVP<4r_qk_JdP2pcBo$2dzGtmoe(`NYSCQzlzwh(+PuABMWE zl3`J=&hVD;=q3J>E7O@c2*}GTGEt!pRHxN@aTEY@q|X_)(+mJ!}Yc{_hSzp+DkHr+h6A{-UGq3Z!zPn>u;;iYs zb(+S0ET+uQ*I0bJuwlQ*%_m1^9eMVu(0-~(_larieUH{1%l+nDBy!};p1l>Hr!Sg2 zzcW@caKptb&z7eJv->yitv_)xQgE-w>Z3X5PYT6tlX~>rS7qy^vgwo0bcO3bxISOb zZq0|+2D_gwS#MB$)S|HGh)+e^!zubfduBRi#9fZKYkpDe@%J?OUvnlIM=iSacb z@9q?h=E~Yd8)}xm*>sQ zh%qclHl(HUjNfm;O;^rX+b}GfJUjQO!aG*u`lpkczBhL?sH_Xwt?)OnjlbnbV#L8c z@0Q*?Qc>5E+R zCfTZ-Et2%Acm14_9+#aHXqKMuxI<=Q?^V&WU+k{@YY5y^*FOECpF+cF%aiJyrsp1B%bTcoSf_309#yBT!_yO)zugV{pINY)$M$7lorn1bJAz{<}Uf-X5_Ey@hDc$w8uRe)9eRVyvtjzLl zmO2y9G_RTA`{QlD#lNeMvn#dS70{t3d0yV`cu%SE_jkVDZBKqCY)qHBW^E<9c#iJj ze7zGBe#fvx7~Ng)Jo->k`-zs)dHGt`6Bow6i;uhJY3F8wg;gfb7qgw#F8+~w-^ z3R%@5iuWt5N_VbfJTAd!df0HJYLeS^5mvej^x3K$JUskwYw==q&>b*%04h2%=So>tAOGH;OW-~W8)&)aw0eav#I-)Ve{d@8Q9 zA+_k$J#SHqf{GRFo4wCV=fAMOw|9BH>XRn1RH*_(Z}!P&jQttsIUN$%`gYY%3&$;o zTNE`9J1+=dvT3Qxp_gA69{!k{lANH}rLpV9T#^m1sLikB zRBB#2iEn%mJ40G)?`jsQNp8~&wQfIJmg2jXZDW=4>!U07y$R}e`S`PoJ=$=!(9c)* zZrrb5r`;>@>D9Zq+s65}$ItWkd;7VXInS7pU&Vb!O2Iq-La6Ywh4dS~7-OZcvL)u$hAhMpIC~`j^zQ1iBx4qq6+xiH0WA>VeRR_Nc z80b9miVJ8Euoc}px1Pi5`hT4l>pZ4ESj{%*0; zdzYGY*sC+Dx*O#z-?c3E`8GYtjV{_-vKusSZul$U-km?^-PUat-yh%o9lx(`XLY^n zmxhm=5!Gj|iIlCH%~P1{|J~s?}dXq`i z3XeCNv{akAZ`=?1m6*ihzNcpe}nWFGz7!ze8jUE`@D_Tv4o%H_s? z3l4qR)A(ZNu`a*0pN`+1>s2wk(l=PKehHuP@<(RYe0O(xW;>giR&C##;&v^xV&40k zJIi8Cs;{1F3tuW>^sM=x+pK62Ij2pZZmftdSi+xbrL$&ouj9Vy*UMGAbcHyb9`MDU znHXxgLsdR~@5_>mYw?ZKK4vm&S)W_EapIu^J0=Hj)H3=VxWtaDcee6x-EWnD6>aYC zuc@w&6W(U|N@Y)RZq?HT?WaP_E<72(yS+~ zJ}Z)Q3Ma12e_AnPRxJPhGhV68nMdUHkMFB`+xyQ;PNqQdWttWL$&U*Qj&2 z?A~{<)Zrr6&pVNnVc0hF}vo;MGOC( z^S;>hFn>OM_w#9~Lyc1o-T2*X(CEbErkk#`^tQC^B_XlJQ}{F+x+d5bDzDC8V!vup zZG~rYz_h?$dRnH>-qlBc|CqdBJNG=dUp2*sCEhbD)fr?iG8lEKDJvU`D9qQJ@_L{6 zj6WG-q5e+@*@a^-ot0bu%%J(_!BI^34367y1_UZ$*Ua*LJL2&CzpA z^3w9^e{)5w(xZh}Jk;UyE7IwGUZKjO&~!&n`>x)~Nlr{bml)5KY73m=*|=!VoQrBk z`4btJ+*&1Av?SPAqg>P=BaYw8UtTVZQE`d*ce6)A{B?&f^gMO($Vy4M6)ekrfv2i? zQ}ofjPZzPLEnOJa>Qc(EUzg#jdA-3|Hi`PvAwh1OH|^~IX+?>vb{fvj5qY2Dq4wTl zUD*EMCuZ+g>xh2&e&f*8uWmk7{;H)H<5pMdKR6(_DN9J%Sbw?Wrdy6bLym(wbcwfFNqd7L@zy^ojIg;R6Ao^;>jo0sqQYI0@k zJzv}Qa6^N?aqIVN4qUM8q?uFY zC*IpIzvcHO#lE_VGUw#ehQaBIo-tcFM3a+~c~$nstxYByF&Edi*`*_&v$jQZKS*PFdj9 zcygCUFz2)c$Aq{-qni$LAra~(dfP5-O+IdS^kBaJ#gvr|_*)VRo#_t0<3 z!C_!>9gPb7oQtxA{-Ggy?*s>4Vs}^|suJGWs=%WV=8^6wIDxbbBw*TDxcXctH$EB3FooWbbnKGy;)|}JvpMZUO>+?^Z?3ceYKK|M$Vsd1Obd&DU3agL7bp1z~}Z`Hc^3tzQ&)p=fD?-_g4+{imd=-cXF zb)m_n*Y@=kn5C+J=9yff_Ml?n#{M}Uf0||8qI8|`=_!iz)$ zcNIF{;wY(W>Un?p@#DY0r!U>QW%E_@u==}Pd@SqsMyju0F8XnUUa9<<;B_Zc<5~_C z@jVgS@a|lQ^KrY<4)u-+y;G0PQgbko=h}bV;llTZuTs||8o3Snl2`OS^XaiQNUc^A z?=LP)y=ghu?eT=|k0zG7-J30GSG@aUZT+4dCu-i;+Asg6=fE7wi48K6h1uM7u?wRLnF+_S!3d*56q6k(+z->Qxp+HeH&Je{E>-jg@M3v3T|I zw%R;L-n-^WqY{>5LqpSk4Fii7+AoQ#y<`e?uU%p%c^&RZRq z_F1R=4o(!6xN+s5;)?4#-n;DjK>r2Ynhu zRB7M9ae497eNmxWL7OH$(^=)IX{oNIdcP<%hNo(Z$2Z?g&p4vY7fM*RHgB~0tkPo9 zGdWag`~t5{eWv~!wsT?* zM-96B7~H-wxZhxVn$#Vx&S9=*=u)2J)p_xw-01_-i@GOTK6L4eWjJ^88neaRVEzTp zomCC5r)_aJek3W8x0R3K-Ns!EtwA@KS6%5kW;fyMosANQ_e`)=xEthRw7Bo$YG#SN z*+OpD7#G?8^{BI*U#Ik~hd=&QU}gREw>yoF1-?0He(+aKaL5U{-v`2{^w(CkO-~8l zeIjL6$}^SuofAWfrb=YZ@@?kPI(A}Jx>Pqu=k?zgulJXqj}KdQCOEuk^SUQ#u_t49 zO^RF^E_ve1xhrdoLtp#+yfpLCm6?Z@8vpc8|8#BUo>H~@)|2O31&5@21*cDXD<2n9 zvaEjDIhDzbyc&m>TJQ8OFPi@DiT>S_U*D<3Urh3Rac|+RD)SpEeS0l!`!_pcp?!Z~#50B^ zmu{5zsV%ptJ91oK&7_uKf>-sEa>*vA>A#ZKNSy7Ts zi(>e{DM(xrwVtp1+%B>pY)kdSS5E`;-u(P~MZ7g#Uc$Sh$Dxupt47h-dautF7l{cH zS;>9c*W>g=Sl>K7G)r@@jmhVrl*;usb8@e%te9ck^k-pv%^cfH;ng3f_s3t;*V^q@ zZ)CZ>u}Sl!N{Hf&Am1d>h1;GTy_t1py`j-HjcQ(96#8pSAZ+$(-DEXF$>D%r? zW0_|kTa}qP#eC0wIq}gT{qW04calV}s)l>MxBO)98u2LO4o}UN?@6)>I=fGAbIy%r z&exG!ac@2g+YVQstToqnT$|eGwT@jSu`et7Kw&+9z=y*;y3*Fi0y@+hHgf*#Ac1 ziQ@M&b(exCt+Y=m?FtgOu>`n3k9QnbmL9(Q?bs1-5nrG7ylFgD&%M8`OxhZ@E3;y9 z{v!92#f1?%=}&d5OB0T@bEQ6(z1X5TKg4%W^VaRtjINy9CH2W>?`F%+s*T$%vsx|H z<{a%~Ghf#kaM+mTb>WLgdrv2Rnz8o0f)1_nw~r(yQ?6W+bMo=*wdWR3 zT^si;v~Sw8ATH0Rm$o*2d@*Zpq|SeaGlzK_`D14sexkBsRp+L;;nQaPt=cQ6E}B^% zcm8)v>dr6Gd&Imm`1jq8NUh)q@7W#tRB5#>e~^((s5aN^LnnWv<}5Ed=AII7<$5># z)MQgrTLtUwU8|ihHmXDir>1&oFfV2Z*4=k$54R@E);rO>Po1AKUw++pU*h1yoJ(B| zr4v~S9gh0H@$;DD^?IgeNEl~9gaM6)d1f6R-cb~H1Zx<5^dG% zEcU`j@sY+n!@^S5Uy7lB=B8w=KNvE7RifgouuZIQXL+1jHplpU;|fLHT9wslu1*tl z5|$;jEq2;efAb!<{RGu!iRVv^SJkLgh#rjSdDk_&Xj{n2bwX)J7tf8eN}su9;=X+y ziE+o=&v}csB=jumTrqq4O`GGVbNBo@uv|*c?M zH#d}zkDIqoM>uKb!|OF2O&`{UE>(Q}M)kFifQ2bnGJ9@v!^Qjp{kSaK-Bl7VLcEsO zzsj~$34M0=H|QLK_w_YZzfyVC+ssVfZj|T7gx-XP}FYA(h*Aevz<$KsRf0XTuKYBTN z(UiRm$;o#sy)zj5^*Mj>9ar}h_{%?Ub*n|GXMMBt2Wh*8sF>s0CVv+_KXGl%qlu5! z3I253GP&*j`uiW(^Y_cotNXi4M&$9-^A^!n+gcw@?_f&K>iH#M z=#R5F3QHX_>w8j^@&tc!{pv8CDpSxNY3Y#lrep}a zzV*E{C-lVumG2Ty(*?PwB~6~|P&_H&XxVAk#RBn)Qhf4_d`C@O-Y%=Tdf=$<#alPB zi<<5!Y`k|S@>GIV8IRVAg1f8t+wS|nV^Z_-i#C(I-8HYce)RE~uO_#$N9<*m{kgzh z8^yjp{9C#7SKR-GH`biu>DwEfejNY1b&uTanEGEz5?semswMyZaNF9=_|2E2P4hLA zq-U?%l{`VDp@>a!kF zSNU4AbKcwiv4K1~HKB$_c%$rOOxb1FGeaM3xvS^9p?Ljdk6&tMZwnkxeB;&q%)_j4 zu~K7<^OTVKV(BXJ`S0G_F)aD~FR{~k>Q})p9XCuP?`Y;ed8t25rI0~sqJpFe%bI7G zkAArl@S{v|Z@9{y=uLcB&}Ftz=F!D$*>EP~_!Dji@7HfDd==|pe|i?*u4J>l zx%bya7yjHT|9;LHwgfhd@TCf>zg;?xt7v>SoUNdI=vkM9WV z6kmHqN+FO*nQ@KQ9Y^)L`bjNYOKzW@eZ4v+v%ahB0rrhdm z3dgrkII>J~Z%{=_)sdOPI`;$BpD?jbtGF&B|J&r3(MGX1JXgF{Opq^~YX1IBVQq5v zwfpOWURay!2_Mc-`jq;z+yCuiqa!+<(6O{Qrp1HF~A1E(a~U zrSGyX-2POm@W)2mjf@3_QyflN+-=}#Tu|RMBP{)+Q;I3;>XOT50kgFK#9;mkXWW9KiAQ@oTU1 zvc*%4%a6WRsFHF@I_t-|b@k1wE3R?Hd=7ddYc3eR=tE!9hv(V7r(dpH$9~QxoN1*I z?~_Rr7bYZLp0Md!$&)=j%&vt((@que?v&HFERmh_wxx2NQS#F_(c+Q$`+4L)c3a*z z3AlaMaF(e+o!c6fN1l(DG@qLy!}{a-kE;i#r2Jw2rWW|*Zb{2b*}zu!O&uSf2kv>x zc3{Rgt4!VrCp45)_}h(mWO;vyboK3h^E0eEzt-#@Z~nvj^!Vv>dl+TX3a3f%BL|lXP2;PJ}bV~HP0)=d()EGsY@2WymbG}+l7U{UW?WINu93H z%P3N>YU6R_O8)a*6Mlw$vYo&-tMi8MGcPA&?E^;+T;}`}#P)O6Ip1HVdhIe+m1REz zo-dC&_4woG=5pb1ws+no3>V%Wkv*$b={eEjRKPV}Q6ZDVRnzi{U)x>Y$7i>?fA#g` zqFRw=y9Zn|`hP z?499Ly}D4?X|Frmfrk%IHaxjG;lhE{r!KvJ@afs%8$~&j7KICh&0}U|Z}+I!S?9u& zuP>rGsV%KE#Wg&qzCEdOOBcfi_GOD_7?~emzr^acs ze&G%;(=ux_ogL|-aqO|{|Me{4r9a$E6}^vZtk}~daA)PL>EW-MRjMRB@6SF^WBKQT zQk0~-%N`};{C(n&*9w>1pK_s~x_aePgBQ2X^j-ANZEv&n%<8pX+*n_js3&}aA!y<~ zp&z!l|7u3-CNwH$Z@Jf#-o50M_r{Ye6kC^!=SPK|b+}YV+D|?B!YT-!s21^NXg9(NY$}`!^4K zV~;P(-y`KBsP53sS>fQKC)CO+rmM)gC)jh5d0OES&;OIxAOG9letfFTe9uDfI_LU( zWh_b|3p1yD^wOHlbo1A@3*}~8Ien6HzrNn0-RQ&;_A&E^Mk)6#hCtSv?#F^;Qm6Yy zq}!b3%)iCB#^}hc0}YWLjQU4Uo^}$dRgL)t28Q z-a?a=A9RK09e0sQ-`jgRWsbA!f;Q3fX8+#1G|EY+|5I3R;Ik$tsbjnSX(z*nxtR|f z!^)LUuk;K3?U?q$<5QH2W0{9&vFGs~^-JfbGfhhK z*M9A}_IXA<%c3JQ&c|x0&79LF^fDrg>tJ5o>Q_Za1Cm~RV|w{a$=GE2QoW^HAKtj; z{C#mLTlj zJb5HCjIC31N68+O11Ie=T%xPB{7jc9@6lWnxOArej`lk<&3D(YQ?L*0^8U(uu21^S zjw2@heOrS*F}2`ZvCovQ@E8dWY3Bzq47d`SS8z`9oKaR3@V@)v~)3JZ_xMa>@$IQm>O@ zJ=`L_;*O{G23Cu8AD4Wa;Q!|gvxD@>mI-+_n>U#;ABdZA+(OesHQ2c5ROUCW)pK&? z7x}%pvA1BN)zVWt`o0~Qv?R>R&dXbK**syH_@a)d?^b?PIp*~=mhaE>M|rjNlONkX zwin4hIPsUMXXecR^K|ZdXnFqE%t*K5Wt*!Kvrgo#*T0A=H-qZ zd)I9UK3vJTp=iQFt22yYEY_A0>LD{td+YnN*;(o=pHJQU;?vZVS2l)E%b1t<@SBO; zo)f!T*0xoA|MK)-VQcrVTJsI>`S^=!UX&Z&o~Y9FI!kADmB#+hV(aH$T=lX3^TRz= z|7RC&TlL#;<<@^iz0f~nARhd4 zZFc?twte+`+`rEMsnolch5yddgU3{>t0kjWD;-pwac9Aw_6awavZ*QhIEFMm@_oEs z@}+9wUcW&7d$(rHI$ObAQn`VsPZ|Lw2uGk;%PKY7AcmgCbCv$l6MEzVz?aO|+rRE^hj zc6nLp9TT!hyLUzSYxO~eU4bjOmgRj2erED|n$hwj+dPh)DRbhSD#35<-C5dd@nq%7QQKK!JgguCvIw*CifiMspZ%yht-t znRxR{^6s|>#I+y!q|Yn8f9A82`o&vo*qp!r>VBS<X45 zwD86T7u`KWq(;cVVo?hk7;8~@rJ(be7LG~K-AQ~BWpONkhptBV~E_rFSws}Fvexgzb5 zf|^v5b)VF#o&V1m=iIqtp&xOuUV8a*h11+TH5EJ&T`yN{COaee-} z_Xmx0sy}`-QE{IYykO7Q27dFFJdW9dYxmwft{=m6eC@UPE7c;mcI|s;I)l@*Jjc+|Eu~PD62@}^x%k&@zM*Y*rE>E92jZw8e@z+i6 z55_b2zhu4KbK?O22T?9A=SN@bDmHhY74;IA)Q&A!b3^1&)!dJ7Ki?1E%oZSFSusO8 zdeMy#!RxFM70Q-}W->6z-%6e!wEOh&)0%!srdjP7O^B>d6evZj2w>uOa2=+F-yXTtIb-mhL zPWMv{%9?WPI2Y?(R4r54y>i=0_da!>e^uMK)Q=ju1=l;6?cRH`(@-MvhFnJPY0dGU;FFB%e$Yq^KvG+zgMhy#<1#$9REf~J?WJ< zB)dWuGyL}Wwer@cTVIuy+O6KH^+0dabPER8Y?T#?sXuRRSD)?NGVgn{Z2fP~__sNH zk5u~DD!&;S9f+I5UFvdvY7?_(%(geJVy|z0In zQh!$d#fhqA>71=hn>|)WS{>}WQ(FA9z|~5A<}7EqYmTjj6SV4mK0KUsrC2*bNYc_K zzfHTzIPjIm>`&h>h`-;rx~6r>+bJFO9AX&{W2>GXo2>Hv;$=q7kK0dJRxQ&xy!OPJ z)HQP%y#=2d{9K^5@VP_GTZa7r8UgP_^dX5O%!>{|ch#)p40>+}}SzLC*bKL7o^ z`bf#uox)p^wicLH94%Ss{5dQ6&OPDhHLa%;@9EoK_D|HEqMkiB+wa)x?VsNLJ^cB% z|8?!7k++HkUx$d5d{Yl^J3YVte^(#Y1ZtORj_4whF(&B&zFYjmk@3s68S}(PP z^J!sGJ-1Lp84#LJ#Oo$DF)cNA@mKQ(EQz)qHoOUJ`r%)aDhdAgVFOihu^w?F^aMH}}T zZ?LUxar*vN`uJ8arw{X1EoqdBHaA%%um8dA_u9^lH|?JE$WBq&>D9(r@n5m~H~-)1 ztaBLo>$kH_Y0%_6#60Vn#;qwSFDhf@w1yRsCL%Ib_Mrimuu{)pKR?Dd@sgI zJhuUv)4pZrQ5(8S-m3?K%H?`L{iOajw1!+)JEa9PSEA-7Xzb#G);4S`kot zDDDyStalZb2T!ux%sAzBFxB~;R?B?N-Hxf&U9XNDu%3QD>$`!lh4XHg=;9fFtBU+!lLhRz{tCI=ga*YT1rcWx3WrPbW;jcHQEy%B`i`XOGqgKRh+X zRNb%lP}_(92LqF;Q;ho@yqZgc=bo)g{u8oK+o zhT<l*Hs@#U+k;uIPS#ytZ~=sGfliK z9xcj=!lF`ff28+Ue%4+7g71jn*?$V$E%md`eBO~4nqVrbc4y*hrK-(Vb(UKcOnH?B zmY-3XeP@MAl=^N76PvT9r8V1`l|?IS*qNs1HQxNkB+C&zH`C^7oY09yA~#g4Z3Qya z>%N@eF0;mdvhoS)A15j@Np|L#-P`?L{(bld$CQY^A1mZHFZk!NhwoDO)8@>gt?p(M{(LzZ z!C%a;+IZ3+*XPW^rbPGnpi{Q*M0PG%FgfS#+0%Xh6t~4Z>Z`iBIj(-rTc2JDbJdQS zNhQ*AA3c3on8U%g(W$fn-?nayFvgvgg>XH4ww@4aJh zf2X$U``g5qr6(*--t^q=H);QZo4wmt8uU*ulhs%9zRzWA5!3OCd7_?Z%a&q=qda*o)`paDsp3HNcs@Sa@G%JkdOh|6}wl5d8YJ_&{-DI@l zHk+fZZP9nv-N-q(-ZuHOTX9Xz_kS-xPv5=%G{42vwudQfetj}NZ-s06Vm^IX?3a>n znDV~j^@d3b*+TobE4zOxTed<#d9_j5vfNo;q<&1hQ9k>D!avuVcRbUzR~YKA=n5=; z>9%@hG?Up1ar4v(b5BLMJ>`5i?PU6%ryK5avp76{{WR5TuBCf|z{|FJ@yS1@3LK4^ z{PEC2@k!5w_nc;aSFncr{gf@d>g$abT|FtImG*nik#Cu1{P%wN?YFVlVKy^2xNTD7 z^z7=ne=a9|J8T?|r(ddO&`6x4vP>?s?AYnn3@5uwAAk9zPnms$bHR$;p^KiW*b3)% zSZ;hW`K0#38ea>}Wp)x`H+}8)cq!DE^alOA=h1ur^0I}I$7arao^$AVpco(H?~i91 z92J$Mml|C>aqVvSOW#+^z1DW_jp2RecR?!A-gx8ukK3x{T;6bNca@Du*-{q&>f5mwB@(Tu5WnZzvwU@4onc66XX>Q!br5L9_ zc@J|zj=SE}4U&OxGiKFv%zFI!-Ht1l*Go>=yQqBEjHkNszL)y6S9+QBFF1K1z=iFA z*r7-PN48rmTGv0lVw3AxV)tgTgpsFM>mAO!SFZlOUteEQVc&Pd{@&j`zwWdu2Wh*` zH&o$fx=?lDU8eh5ttZAiKX1uVvspe{#p%Vo#u&D_DU&L$c+Fqq5ha>%cK2cd{t~;7 zW-Oayd?!E6dUQSGg+%im*7#MON>}-uCAQ_gx&2)AHD5e;jrH!*kZr70PPg6I9A8%S zM;Lt7TQw;vC~86deg&mD$4}4n6ZcwWzE#PN`+U!gCF+7{%NZwg+E~?^D4gq1_V?u~ zseU^1K;5JA6)8IpYjU5s*XzDh{2o{G`tXX`tCv~v#n1Teuv_`^bD0-xlj>f?oiAlw zHRq>n>6ATrAvNL~wVo}$_x{zf^UXYKJ`)fWa+ZRI(Y6zdMXcxf?U%mXt@WdMee2BUY}3S^ zS8b0|d~jPQSoh{6nNzFV_Z~`is9(f)Ur={Z|EW_!b?;Q}Z4k&m#CT}#ryJ(^aW60b z^%AL{voLYnvOBq!`SM?R0w-(#P_xft$(pt{ft~Nqx74dryCyfToyfOd_KR2aj+_Jm zz6-~5?%%v4efZP2$jW-Sn5Z}*&dE8i>jX6e1V z^|ia|>mtvJnVvoIX4%7IA8s9R`nNUo=f~U2{lDvfm;dMfeV^FnLsyt@mCZZxS(sN# zaTdqjiNXS3J*HeOetJhUO04&@YVqa}zFo8Ss&4*Mu}=E+gR8kQtT`t=1zt%z-ZZ(} z?j5^hYGj#zpcT)Aza3v=1LT&-mKtAk+tlH*=4>=;edkBDnDQ0oW&8;pd?kMlbM3j5 zIKz9d+RlV$0rm4EqW0hCKVQCo-Tn584F?Y%ViOHrwqDjeOwVFb=H8QArk&frmxDpc z^QY&uj!kVIVw^8rGqTm69y)$~uTZb}|66vyK2&}!651Wu`qM@$Z_1O>BU^vQ$Ij24 zyYBx@ZRe8bipfXo+eLqq%HsAgFhgw3LbV?dde0i>YV!HepZOc1G-PQ%+$6wlR*x7gP(biKbI}fB}Wh~2OD7YLrul@1OB~^!~ zY95MO>!HT>=^X2Q{&y__dp1td(wniR`(>0edn%3KF zkgi@c{T=gNotBWkE5|i=%_?X-;QZF-lUhmb?*(=r%&&jDbl)ep-}C#-D`)uy{x6iWd|Wf7cCpd=+HL=r$Di*=*2tfla`wQBhm68* z&sqhO^_Sl{nxpya&#UKO^7-Z8&0nWh=I;5?sQ&nw-zwkVbEG_u|H@mtvp#Cc^aqoD zCI%E&rT1-`?(5-vD!6mzjYlu`8#+p~98R`M53~EUMP2Lu1ryPmGOG5E>cZS&YhM_r zdY)IP(0%;IseQ*aTcO)~YUZ4)U39}u^-*Kuj7GoUy*~BYi@cs#xtLQ-bOtl&@zK=u}K==#A2zoUp^$ z?Cxo)??HBc&-cB$%>RD={Czbww*(U3&SKz6=zqUrcK*TS*?)U4ewZ`Ox}q~Q`cbrV zYDVltjT4`i9^a4=8nUZ+Pv;Mnt{*!jU;0_jWqltr`PH{yy|HWSmPcL86w{a6@9Q|x zs!q1gYz=$B!&T-aH;Rqo}`&V?s}8WSu$_-9F3o~@xklZJx_gt%@ZHV{1&rdXx?3YSvT}b4?}vS z^GDqTt6e+SypXRF^nNzmGf%E<(7lFKP#)Hit z{@g1IT3PDUzB_f-ao(Lk4wH|>FBbl|Y8`mG+=EL!9{ff9L zKiq!j>(+M^H17`DkS_4c*y9_|r7t`|^=yvy|9Ps|9)98}s%M*d{=kp(o6{%!Hs<&% z$+PI!ukb_ia(6Le}T-_5*FRvc!T7W{Ux zXAZyjDeJ;0?Y;BO{8FB&x8-pa@9))`-h3$hbF;|Ftk2C23ugR{t-Mv$@KX45^OoGR z5&SGGX0g^U+Q7iU>+)>ES_V;$r;qp4>}Rr9D|6=wJu~IAw&JDYqyIKcxfTEaP2KLD z|2NE9rL)lW@rgOpRf4a)5!iD-XG&M8+Q~DV-)$W3%w)^hsoj%jQ*q|=vCS7UuFv+; z660f)e^qc-+`?VD@5{#Dd*A+TuL@Y`+GETXuyiEl)`*rshi zb@+U6pTAV4)>+k?s=^0Tt0(0sRom^2*7Ocq%In-G&6s{>hDTq&+1|XOlaHUo*=<@H zxOslvihlwr-CWTRYDKyj>V;<{R8{*f-4UL{dilPJw(I`cdEH9e90d4X9n9C-Jmqjc zW@h+gsu_#OXO>&dbMj^^F5<88$V<83w$Gz}TivC%VRgSUpI(>MIr}Ja{__*(Hs);p zexi^~&+y^0=d!A?Kc`RD{BUe>&7S)IHQV=`NZXUKvfFXrll)gnJ=rH}=2=wNf6ZC% z^{zrVny+~Js?bHAD`h^p`L4ek#x!Yt-^$AyDi2KE^4ceN@t$>EpPs7*#H~I0Y)+S% z&}66M^Tp@w)hLN!u@bpt7oS(YJ4?D{UaEAhdDgk;>-A@IAI0l9eyrwj&(VG9Gv%yx z&7S(7Utd-xK=uZFJkF0&)Xp>SF$RQYvi^aaJ$Kx;lwnT3D&})*9b3-6@Kgo8wbgm`mp*uMUF*C)rE{gs``Rs? zt@6KkRK9JB3V50lw{y#{H|mo4ng2^_YA%_&_|y~Asi(`{I)yfA zoUDIi*z#_^^5y3T5+>DeS+ub4Xl>N?869T%lUME8{Nh{O(^Cw#t;@UD%$&$qut0J_ zt#-)dsg)-_g|p>5EaJS9cFO6Mz@~efL$sP)a;+EWzvpJo^!vwp*7vAPPWzqIpBq

0fvE}cZY$I2sDx7kjVfeJJ`)qwu`z2e( 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�alZg}y|WNEFNT&6Fb)IT&jcr5m@4dky-JiGDLmvzeDR~tMz z7WZt%y$2Vf#NSt5Tq-ATHnHr?H1GOf*Lu}78gozIpV+~^>8_w&)}lnc=tVxCkCm&( z`nYb;seg7LO>3dLdYjCBnvk=&}KT0u+gHxxA)G3qMMNY4n$S>$ReIM4X=-31BNPmVCBp9?#8C-%h5 z`tHTKn~m?=6e};E^4E6HUBka=&8R$h^4f8&~`1IVCq0=Go_O zigNTc?OJ$d_9?0GaG9k$jY3luS9on)dm(e--oSY&Z5^`ChaasIm_Els*X!jbDV01W zK?(akQLlOzZ?%+I)Uzpg+N0panXU$*f}DMK#7lI(uX#|{74&_f0B`F8mw!<|6n|~d z>l8oPF!hWJi*A_d!bJyW)QfGEU}w1a(tNtZHzxJ^!gu;JPhW7<-xi_R{q5wcL=Kee0h=BA??lIC5V z>TSVw@VKYHQ7(#tY@d$$s3MVbC%RCin9wc+7VE6ptRA^OeVAM<5Gri zOttxf?YH~-lys&)`^IF!Z0V{!UGY1UEK9W4MziTo-U(cgs>ZMHCd<=w6F{DNE7+Pmt-99kDEiobB^ rZmj)({`m3v`+ffJ`@?HL?_ON|J=@xfrFL9pf9u6NSS=UTaxwq_aEtN= diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-history.html b/homeassistant/components/frontend/www_static/panels/ha-panel-history.html index b665faaf2fd..5d1f6163383 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-history.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-history.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-history.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-history.html.gz index e8d34afeb3881be70a652a0f67c11d6162126ebd..4d7d1ec9bad4e30fc9190db079a57acc271691a8 100644 GIT binary patch delta 11878 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 literal 11873 zcmb2|=HSpvJRiZtoRO$okeHX6qnnXgT#{c@sh3fbo5S$7w!7^1u}Kfs2Xs7U)M-%4 zI9=x8D0RG3eO_mB{+rpecSo(|b1`$hBv{rty^hV(d* z&9@&fj;ykcSh892bnTaHEq9t@I3#Q&+OB57q0yJQ+4(I zx|;vt$LfA(mX;nom9g*C^3td$dY`Xd_q1G*Y}Vp*Uv>LBbIGHHG4^$Du6^XrZ`$ek zM`y)fn{zjxGj4kq^w9sMXz|{^A2+L?oV@(J`(ky)>Q_HggR`FW@A0%`ao8W3dh>on z&@Ricka)R#yWY>s_Abb&`yKg5Z>9L*O%YFx&21}w{*kn9QH$KG^_emC?B+!pci%iX zTK6LNPch5k@BjCCZStDED84#7F8%!78A*aiOY? zxeq@u{QJ+O5H`=hdv)qW`8O?>~-(haL3Bttd?E-Rhlyjob|==*I~R?WWQIpZ+PB9r(HMr+mo&(WEF zbFDPXX_jq~4V8>MvTBksDx#lfG2M;SP^g%_{?(RqH>#piTqO_I9bh~CMN2ckdDh*8 z$rB#>z9^rxbb6%;>xB(Pn|#tPyh{C2Q)w&_=^ngRZ^DMV`6`UP%*UKpf6-613Kp1~ z{wA&IKg;~nDUuKEqc$=MoGC4@n14BPZ^weKE2ZtE`{L#Ham??HxBFiuz;o=hbUu^u z9-q${CLGhvCwD(mTXE@rp_RC+WpkqADciIT5$iqA|18rvy@&THMVrfbga zam+URb>sM9XUk{TmN2SknKQ+#$>006Bs6S8!)c|ZH{VB{tL~j4^mD`S>SgzrZwNW* zdMqvdPj$!V*{a)biO*jnuIj+G?&dG0ng7Z>r-b$hUCRqxy|F8?>!?Oz&uT3ui7jkO zzaPGipY9oVw)>M-lx||@vJKok4k0;F503Z*aGW@M!zMCyYt)zNd%Nv?r+J)x$LV6| zq%HIGgQZ5Tw_5wGMgis4LrE(fI~Q~xdidkR>oE4^rHp6iubu8X_0f#QlNcW|{fHKP zqPU~+GUtlY^Y@->s>d`4y=FI)I5BJPwC6`fGL*Jd#J}12_7$I>ZNi}>hAipRj9be; zOq;mvSVnaFvUAPTT)y0t%FIqUyGlT>KCQ+2fW0jP*WTBkpRe7sNdI-xOrOiY%%tpc z-{1LNt`@!do%_b8QN5o_weRaJgA0#A0Du+~p#)Bmja_n+p@q^ad)WhD%~Cb}zES}{Kme3c?;{k&Uc ze(IaxO;0k9X6_vC#_@qB~7%FD9%TvS+_#C~(b zB;80R-X#;5J!>9la5HT8XD-cr&?FR=B=_m_<3$?T^#QtF=X?JsaG$*_bo0vX@5N`D zIjw6pUFNaaeM2yJOQN~QDHG03PnuHu3v4V5UhzjAQad9e)xh-B@$j#^$%`x)r9zhH zShW`wYpE>%Hc@x7(MrcTJI<#l8qVJ+{d$h2-P<|aSU%spxgb*H-tz9^59}t4{fASs z8}&*GJhm)dx&HH(UoG+>ywWl!djEMac%AZHlsL23h-0ewlQqkCoCsaIu^}evm)P&Q ztKPqSG%@3W*4d3le?0O+v^n;>3nkaL^{4&NjYw(?pYTO_*%mL!+S5(8Xq^tNkKH*J|oVUEl64cF|+q4JLON9!RZqZ7wlil^XS&Srn#xb zX43n2Fsytl^}PDkob3)Dq)xn5UGr=2iJ8UEw59GVx9eZZIScXLbD)(W!O5 zdFS(MUDhm}14(9kyr#`^TN*fZ&Cx&+!+85Ci+-6{-p;YHul!@t^Vq_D=>@IzVlVfU zg~}c`)VAcil2B8m%j<7ESD1HI#NqdjPs9>3`$`KdXKoBHja??bVS0?ac&Y6Cj|VRW zmGGN-@S{u!7aOY{yOH? zt!w;Wb>uR5@GIHn>TdF0y;35AS=b^qr2WL**x5(!+^BpKJz%&;#|w?ca}M-2NUk?GcNcxd-F;`&oj-P zU0cnr?0YO-x>Taz)*b#izCF2mmfme$Z>sF`Ob?if)ZO**+7ws2#qBmrlk1b8>gQxK zIGHQ1KJ7Z_`QG%^vu3yZca~TCeXg9vEHCabSLyVP`D^O*8klDu{-9hp*(9>S@_&Je zlk6;+W>kUE3}pUNm=`8QKeCG zrkzCJ>a+I$kL5jAeYcd+Klc3TM_w;o+-C0zkbk&rwNJo_bdKIV{?8*Wi+_2ZU|f7- zgT26_6*}D+i{5tXCV7@8{}9ia7_*#p(}hLHJ_zTV|D8KEz3oZUB0>4C2Ty)JRFL@V zoFMu`#?C1;y3^25*r37Wq}?TsMO#;#=9|4{yGHJ5nKg%^*S0)R;IzqqSpDZFhu)qQ z5=&nE`J=V-uj0D8ep9aij&+H~{wo>i0Qq_8T;W!f#i_aSBZ{(Tp}zkHG7VJ^6X|DReU zzfE#B^E!(>zL19BZ?;)m%I5!2yshwC_*Y)QZ5bz>?YwUs`DSd=a5(q#yQp@)z0m)l zDFu6W_GKIrWUe;J+4gNh#_POWj&>2@(&d{C)eDtcKh+GdE)aQZ=K@QQ+Gru%{K^6+IEZEW0n_-Vpq(ZBbhsveJqd? z_}TA&wCK?__q#6{!{nn4m0nEyD$;l{GxLx9f5*;GJl}eAm2{1NY>>;Wu+n)}tihzr zJaea=*}{a#scEO*EUy!tJvsC3)x6$L?j=jJ(k?iug}<%k`*U6L%}cJM_VaGpimEJp z2DTADCP>S-K$vi@`v?wi60O1KlX9nn0Y;t%l99T^i|Q> z!arWcU((v^P#eUZpm5rA(Y0`mC#^Bbt;vtMClvZf$wi!L^vOA~KKGDv{5tc@Qyjex zGiM0Zz1AgH*EW|`-}@&vr?aZy_Vx*XL(lb}H#_-BRq4mMot;A46yG2J zdi~+#Ydb1G{x-kgTqIWHHRnP9g%1J|@z)J2KGmJMyXw{EZE>5lAH1=a&G}Q%!v1z? zpW3OemEs-;r>TDCyY+j|-bW4^nGdbfKgn-y+Spo<_gL}KZ^5W~Zo@lwmrhNc)c$LG z0ZYF9kvGeyZQp3%{%OH0p6$g=k|Cjihua=~tVu|z5Nv+&H}Ec()7J~UY#LWST(*7w zwv6k}ZoQS;r=4;V>sNcT!u73MPW}Av!ACbI?K)&@`K0;hJne}AYfE`+B2qt9yv=RA zGnZep>38pS>GycphwS7~>wqJ!Ad(O$l&V9pF9PY4< ziQDuV7jyOj2M7E0#?zL>{Za2vJ+Xe##`HH6rm+8*zizqjX(j$knG+A+lnc2&y}4`6 ztK;YAIL?bPT)O6}$hwTe`r67GljP5@e!Q4;CH^w&?qk!u7BV`^zGJv_zjg7!&+_qn z{QD*MNZ4_+KfIjyBT1ld^MjioK0Iak_w$*%hS0t<^VrYVyI+;O)?z<>)zco;r57KW zH$T5{rT-y!&Q}2`=@#Wbohv`oo~Zv|a-u~@KcvjV(}3%b?@7h~_5Wrs?_bNT`0lm@ zhhK`IOq{$P-}>gm_wTo!XMgzhNBi{sE%r9;``a%o$h197V5#5tGwlcOU&)^O8ZKGC z#B+xWehBURxZm|h4%hwWiwQD3in-Db}zh|H&6@+27Kg@aMPamHMBDAL{Eb zyi_W&?O4@;@TU!7FBa_GRlBO# zh2Hu=)+pV{n%sI3e`jutiM-Z!{=%bQ|33e*Rk$SB`&R8nN$=L;uq_-{7x{d?A8>QA zPV3d3-{bF2{Ju17Ba;MgL`$H_>N@7G+H2d+g&k$%O1=Ks%c2?WE z9cLLtre`?x?D=AD;aJZu^gG4U%FgD?)Bg^uL>Jq+yeNOa=*!EKx&pThzK5G1aJn5B z;%j+8vRaBqWENM#jp>K~zYD#%ll zy4k+umflfTHIq9B7>@6l&eW;b$iBk-nZ)lJrxm??e`l&b%|GyqX>z`zqgCt$E;ByX zW%`X@4!v-4@Vm9Er$+SY)6}^-&8#BNm%XiF390bZnKo6Tsb$lxK6Va8&fxPb5dmKh85}}JvR}?Gsa~V8&0)>G&*^*h62BK0S6d_>eg61lC-0@2ovUhpx=uUx zT25)nPb1T-qVXGdUs`f{&V#3KW@)JBJ+^GrO8Dus^?bU2vr3wNqw&U=WJ8NZJf9~R z9tw)`^$4<`_#u0%z?y(Y=bAM;@9owuXrG>OcenTUCWnhL%`diO2ncZsU5MJ@k-0qM zjK}_SJjYT$U)`gT_06^C)8?nX>#sk&@!Lpj)`eLYgw0$94lO&-Ybf<%o^E@zWMc8@ z9Oo>%;{3zy=Ojz7tyjIK63&8Vkdz=WY**cY{njp4SWwYS18Q{{f4Ev}Q7 zeV08hvu|Zt<%593Mg|Nw7c8vEyD4(q-9>*v^snx_A6t~QJYp~DOIUu1d2&+9aCy?1hEw9V3o)Di_&$ zt5&SJJALDoM-jzrk79)RbpJe#HB5eCzDVkc@{ifaW<*?Mh&rJBTlCezdezUTPTB5% zHp~52jdo4z7S5uNK2^_O#Cp6=eqB5hfFv~hk{gn;Bt=C?+x|VNtDqCy9zkpfY zd}}o%J(SlK)^9zQFe|G4tjLRFzay4CWp{8EebI39kaF9k$+OjF{yttJvvbLGowxql z2|kk#?PI;)$hG|#ThQ*+Cj{RveZRO(>1^JHM32e0yA||r|1h-MW8b8(>a(zGM8@pj z(!28~INVMsu{+48I89`&th30WmoFw?+piI3@^5ok)TjObj{o0sqv#v+zElY>^?&Oo z_nh~eZMO6xkw&ocepXh z@_%pcp69iD4ze8Ie5eNyWee{|J2+~NvR%?*s!P>J~_B_4YC^+ctFt!#bC zhgX+){W~6WILkk3N1?N~(%hn}GV?%pkb#&;dP=D(q`Sar?G z1u=Eo)<$Nf)_j;yxJ34Gpr)I=vB|2p5?>!4vqlG{5w=YZlh<_C1%&Q z-8NcF6dld&SA26eVswzond1>#q|D$Gcl?><)}=W&eza{lQCD7CqO5CPXX$)dnNPo_x}BM=r!M3_J=nlwyUW}vgKvk^0h|ho!`-V&wV(ZT^XpS?Uz^3a__yizukTmLQp}5k;>`okisqEN#lVn4nZ~X-3!kJ#H#5=H2)dGWW})f>$YxY6Ir@5C41|X*x2SNy^MEyt{#Zw&1b&uCRKIj@dd8D`(gJi%8ym# zY-En!`HW*$j`h-96`_s@t@BgM*6Mv)nJ}Yiy=r)2+18nzrUpaJ~#KqZ*j4?zxMnQS*yDA=U>Md#s&R{CVydA@q2RBeAhf#mb!-fdX>RF zdlkNXn>cx8QW?{2Gp0fvxu2fzAHILSu`k3m=FZ)Z3mHzaupVlW4VCFUWpOk>^4d>! zPM)px`qTGy%+j7&^Ro5_n`}<3g+)ZzM#tl^?#01R#EvNx{yfXNEmx&(;#rYtDzn#R zH@sB7yl!u5q53Vu4Y{3vFKmdI`)1az`gu#kcO6$9uYm0@CRO0>BcFVt(Ts*VENq6t|V*%6n zRw~TRxV^+FzbJ6ilkJ?L4^9;u8ss`IsNO4aI{kKZ=pAR~w#RlS|0L8bk}Xi1DyXbE zZOvH=g%+!FS+Rcys{$X^diK|;7p|6La&7ke9lvO&!s>$4I$yT+c!>B;cHgUT{ccSC zTT$l{m&xZU&F0UGk4=x?d9bwV^99`_uU7iJmEcj1_0=0Vpl+H-Hc-f~Uv z^V7@1jvY1ETC{GN28tf#*g7RP?s}b8OU0wvpE+(NaDRFBy>x5P>c!tC{hIs1&x~&l zr(tPU(S{(N>pu&Q8%h@L+`oH|sqEh=$M^1fBc(L={<|;NUar!Y6UYmVwo&lWwBJAci!ZAApuACS%l?#Prh4(CqKi`!qUWR*om?UGPoVe8$<}7Y z6>gKibnqHai@(Op^%X@i7yGQZWq zj_eEjzjTFF`iglp%`Geas}d^MCLW~rX5!n~*KT+17n54_dX2fFoY;a%W@}u_6~ru- zHoa7sBXC^9>cu6YnriQjg7GIT3rbg<3uf^98p5^h%A*<5p6?Y}wnP+#|D3b^wsEA~ zp`Y!h0xi0E9NSNSQ#;~zZS}{yq90{1#dYal`x0K)J}qJ^*Q8l5Lske?q=>BfVkoSd zp?~@I9yM}Xk^X`+_3}KV?&ZuZkZGNJD{RlJYrG4L+Ws$a zu)QVptuV5`?bg)IEsG*@f1f)(`GC{3Use~y+)P&McY9>Loc#XXmfeTMuG!5Ao3)Vl z^4mn-%lkI8W%@tx-7jsX`!w@Y+r0XY=wFl9P15?x`)gTVlJ#uQ>Q^e8*s@>0-)bip zS#|Anj%lKqbBw3)6)N(9UKzo z50{u-WllD`kvV@3m+;k@TkU+`Y|Sju?^}JmfA%zY{$pSDR{gKv^Vhy@`z^z(Li$Id z1EM!<&P!fyCEIv6MSWe{no|C&Jc3cSPro_ueRAUW{`M8u_+N_(``x^`ZJ*-r^Ue!? z`8z1Qo*cD=KY!kpL&bkAmU%3x*8F3~B)Nn$G-vhQV^;gK_Q$KSs50|kHj@kEby~{y zD3oh%P_C8O9wxWR(b8K~8mDF4nkfA1@PdE)Kl{y{5_vyPcXLJVvHa^ZOeFXGt=T=( znyqoC-zJgWRozUnyASQ$6loJ)__%gpHJVVEA!NBT82W_|3y=$wgQr8I#*#@z=hUd_EX^EWfwOA?o7W);7^UAg+8)2x%o#wW25G3 zYrQCUZte@|FKXZZWcCuCwoB=v;@%%wyM7#SEt?_LZ+>gz1L5vV6YZ|`ii$t@ykG67 zmS#R<@x2Y*L4RtdPr1zcr*^B(<(_?pU*p3i8ioI*{P>zxx^q>)%r6slv)#^j|2X$M zGxkHg{lS-7Li>}0|9w6)eOuavkHpUOsUn6Hal|bd@@hY$&Xt(zfR(|y)AezO7^(2h0}$g z=Nd9|Ef!xq(fJ_0okh2qm+$*rW#&+Y! z%7`z#f8=MK{C3IzMD_}fd)nW`eDX|+Hb2&!@;Nqt;S*Nbu)ir*YwNU*R9>54R;Sgu z`6cH(BUjfD?tfADt2ee*sxB`7uJHH4JQr@BXS2_!eJK7gy|dh?;_pNKdk_8|Z~T2f z?f1RL*jT9?eJekL$ZN?&l#l9>|=a81u9QHhW<*B1qqmFL^<+is_4 zIKgpem*v@SN4}L5f0$!iy=Y&3d++~wPQRNPnAlZJbkBQKM${JBC_H>*J4-J)uezsg z@ph3PM<&Exo5Z-2?ZkD128kenm)RPpt?#6@-u36`ec7L7i|sVfe>r1D;t7YU*RK8R?=0B0!|}HF?roVelPtF{Z%T{O?vdJb zuK8N;ob~qEbGOagn&-9h_}bvlg|D~mb7<&)B(JokWa8mnTDciJm!&-a5iw1E5r2-G zRznE)tAKsw+>aKyY`frJaGPzlPS~_?tuxF2D85uR?|fos?DWI$bIgpQJ9m4h)Xq_w zda3G-@XXmqa~~C4x-Po1*G1>Y?>_Gzj4zlce?01bL^Hp0Qdii5<6jR(#4&#tJuH2& zwlGE`LZ+wx=D{7t-?K&99itM_pbcIZxAD)7tL*QIT<#GI3dQedF=wz4sPN zXDkY~Z)$Fn`e3Eo@L}#J=B>)A`PLhDD(L^U-e#z{>-@25y?^E3JloGi=G~sH4fGe|M~GGS?TZY8SkIv5%>~#qO%zHsh@?HsxQwfAq}j zxR!5yk+#zk?SrRsH*Wp-7>d=D@A z(3O~NkiIdzQepOYrAK$&f4T&HZfacU*VUWxyMF6+)o=m9)AJAccJ|pe_Zl5pC;WQT z?!Tf8t3EwCsBx5S>gx?6Wj6PFS4Ni|vOT#>^WIGNRORU>f-mayCavw7);nF+ zsmkKzyafd&JEw)D^y&yre^*kNSD2k;dRK3m+g0z~>NWp4RHB~FKb=yURI^idZSw-3 zs!J{siGeC>=XX0D+ma{LW^=Dyqd)58ZtJaU=GyErKGW(e@IcD)-qEN--+%ffbnS_D zI>$bj<&EB#wYi!%mTWt%lxXr@`{v{;9zIJH?<&~^Jw3JPRqAxU#V2m2y2e6z%7ySr4^ZhLk@w`}LXO={ss_n(hHU2%5(vf!{#vAex;ee*fZx$}zx)KBkT&2*8~ zYInBNJ{g|ugyxWwimyyQzHCx-;|R_Vn#ea{-r`Mm&n>rG%W>x(=={5;r)q2bCfB83 zUgzF2so0ox#lWlS$fo(8YOJM&GZ)UljJ7cU_Lb)-68XXU49p5dVzKdoIPB(^c` zv8E53(;Oq+b&Gt60IKEqhJ+PjB0F*k0yhcj)uz z#YZ}x9!z)tbZ%m{@#_Oy>n2!w*Q~mH)ZDdFH6UEf;L*K5hcjMvNlo4a34=bBS@N!?z7#Cazzl0S<+%oP5+P4>yQ*aP{s zpQ~4#yUdWbu*2Om_tESqANHLIINzNBc}u`2cDoRZMdCt+hVZKIXo^`Zn8|e|@1!0ZZEvi9FZnL-)zf1C2X8XtKDqID9rwC~T)IFxp8{W=Z3Rj(JG5cfRFd@D$$=+%+ypH(ZO zW-kA9={JwD%jau0dnfIY+8%23Nyl-S<;ET77eA5N7Gl?BV7Gs%W%0*S4IUT&wAtsk z@~WRWcG<9G@gk+~3H?1LYbI4hJaqV^Bf=&UeB|Td!;^~mo(l3$_1te5*);W%XwUhO zAE^=bJR$uDIoLhFS?*lhR2imH>LAu6k{>c-^PWX_%xC;mezucghGw*gWLv`Wj5#5# zZT|bK7QK7Nv%aQ(!YK`Zr*4M;%~L8DyCWn@EtnJMZH(InqBBjpmnzGG456%cCmO5J1vaY<}?J_;T z`2D`g)AQ^922P%?Bbm#d@;B(f?~*>})YQl+?;}E0r}wlizbts_%Hx&F{t=5F@tDt# zyvp;^w=#|8cCO%l)&G9n%Jy>{ixV{$iJG4eQ@9f-#noWwTrVVQJ7d~pDbYX42O8zA z-$tLx^Az&yofK1+!hg zwTf#GmfV@XjPF)zhoEif%o))k=^48=q;HP>QIy%h z+=BgOZ?%v8($cKccY^0k`JVOoN?v4)952u=he4nI)?y2Iw_NFb_>yNdb|2R?YNBZTZk=crM9HFc)Rd_mC zUi(VzpY@Srs>z=l;mbMq^>52N)e_>yX=q~hCh!c$ZvTWMqH|S$Oh32B#QEkl<98k> zU;Y-Z$=Z2VS(7RHUVv5k1)+5p4{`Fa%@EtX{Z%OYn<;X|2NwQ0;QlGB=y#?l!=bY; zxa1|izH^7gVbb;kTOVv;x$cxCx7$Tq@d@j!Ma)&o?y6l4 ze_7O7mheoUukMgwUo6N{zw)^9h6y&U_Yda(JJ%dJ`}47I&a9#fl}y#blc&8Gkf@b6 zIs7=3^{~SU)tRk%eRH;Kx*`1_bp6!Nich9xop58gEXFJD^ubI%F^ge8EIp6D*$ z-Y{u}Px3a%G8V^ZfVowtZiC$7b)J(00EYGR!CM zEGm>UN>B@u-K@!XYTvdGN;?ip1bXd>JK(+W_%gl^_ddS1K3!7w>W9g;Ltjo^7I^=t zP9rS!=+sFP7c#n;8Sl+BHMxCFx$>?>z`BRi-z+?w-qk6kW?XaG*W7#S-u#4qW1R@2 zFSP|{qz#q%Hf`D!bUkox7w_yBKc*$`@0)2d-|5e9@40DK=_h}9znd$3S}ZiuC4Q}H z4m10X1D8Ln`MCYCzWxI?bI->=f({A&n8E&k!r_F;Q)kE-+W7JtAAVnO_TfX{eb0Y( z?tJq59Ovou=cQficfEg}_H3E;$uJk$%CG0v-(pWxIreqRyB_xBpMR5#gv$hsIPNXm z+WlnOYnS9VZQm#H)TcY2=05-KTTiy~8f~{q(-{^f@`shT?>p7^-`v?MxT0en0|Nk2 CjX600 diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-map.html b/homeassistant/components/frontend/www_static/panels/ha-panel-map.html index f04929a0b2e..013f27cf9b9 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-map.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-map.html @@ -2,7 +2,7 @@ n.DomUtil.addClass(t,"leaflet-container"+(n.Browser.touch?" leaflet-touch":"")+(n.Browser.retina?" leaflet-retina":"")+(n.Browser.ielt9?" leaflet-oldie":"")+(n.Browser.safari?" leaflet-safari":"")+(this._fadeAnimated?" leaflet-fade-anim":""));var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane("mapPane",this._container),n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this.createPane("tilePane"),this.createPane("shadowPane"),this.createPane("overlayPane"),this.createPane("markerPane"),this.createPane("tooltipPane"),this.createPane("popupPane"),this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,"leaflet-zoom-hide"),n.DomUtil.addClass(t.shadowPane,"leaflet-zoom-hide"))},_resetView:function(t,e){n.DomUtil.setPosition(this._mapPane,new n.Point(0,0));var i=!this._loaded;this._loaded=!0,e=this._limitZoom(e),this.fire("viewprereset");var o=this._zoom!==e;this._moveStart(o)._move(t,e)._moveEnd(o),this.fire("viewreset"),i&&this.fire("load")},_moveStart:function(t){return t&&this.fire("zoomstart"),this.fire("movestart")},_move:function(t,e,n){e===i&&(e=this._zoom);var o=this._zoom!==e;return this._zoom=e,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(o||n&&n.pinch)&&this.fire("zoom",n),this.fire("move",n)},_moveEnd:function(t){return t&&this.fire("zoomend"),this.fire("moveend")},_stop:function(){return n.Util.cancelAnimFrame(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error("Set map center and zoom first.")},_initEvents:function(e){if(n.DomEvent){this._targets={},this._targets[n.stamp(this._container)]=this;var i=e?"off":"on";n.DomEvent[i](this._container,"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress",this._handleDOMEvent,this),this.options.trackResize&&n.DomEvent[i](t,"resize",this._onResize,this),n.Browser.any3d&&this.options.transform3DLimit&&this[i]("moveend",this._onMoveEnd)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,e){for(var i,o=[],s="mouseout"===e||"mouseover"===e,r=t.target||t.srcElement,a=!1;r;){if((i=this._targets[n.stamp(r)])&&("click"===e||"preclick"===e)&&!t._simulated&&this._draggableMoved(i)){a=!0;break}if(i&&i.listens(e,!0)){if(s&&!n.DomEvent._isExternalTarget(r,t))break;if(o.push(i),s)break}if(r===this._container)break;r=r.parentNode}return o.length||a||s||!n.DomEvent._isExternalTarget(r,t)||(o=[this]),o},_handleDOMEvent:function(t){if(this._loaded&&!n.DomEvent._skipped(t)){var e="keypress"===t.type&&13===t.keyCode?"click":t.type;"mousedown"===e&&n.DomUtil.preventOutline(t.target||t.srcElement),this._fireDOMEvent(t,e)}},_fireDOMEvent:function(t,e,i){if("click"===t.type){var o=n.Util.extend({},t);o.type="preclick",this._fireDOMEvent(o,o.type,i)}if(!t._stopped&&(i=(i||[]).concat(this._findEventTargets(t,e)),i.length)){var s=i[0];"contextmenu"===e&&s.listens(e,!0)&&n.DomEvent.preventDefault(t);var r={originalEvent:t};if("keypress"!==t.type){var a=s instanceof n.Marker;r.containerPoint=a?this.latLngToContainerPoint(s.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=a?s.getLatLng():this.layerPointToLatLng(r.layerPoint)}for(var h=0;h0?Math.round(t-e)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(e))},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom(),o=n.Browser.any3d?this.options.zoomSnap:1;return o&&(t=Math.round(t/o)*o),Math.max(e,Math.min(i,t))},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_tryAnimatedPan:function(t,e){var i=this._getCenterOffset(t)._floor();return!((e&&e.animate)!==!0&&!this.getSize().contains(i)||(this.panBy(i,e),0))},_createAnimProxy:function(){var t=this._proxy=n.DomUtil.create("div","leaflet-proxy leaflet-zoom-animated");this._panes.mapPane.appendChild(t),this.on("zoomanim",function(e){var i=n.DomUtil.TRANSFORM,o=t.style[i];n.DomUtil.setTransform(t,this.project(e.center,e.zoom),this.getZoomScale(e.zoom,1)),o===t.style[i]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on("load moveend",function(){var e=this.getCenter(),i=this.getZoom();n.DomUtil.setTransform(t,this.project(e,i),this.getZoomScale(i,1))},this)},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf("transform")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName("leaflet-zoom-animated").length},_tryAnimatedZoom:function(t,e,i){if(this._animatingZoom)return!0;if(i=i||{},!this._zoomAnimated||i.animate===!1||this._nothingToAnimate()||Math.abs(e-this._zoom)>this.options.zoomAnimationThreshold)return!1;var o=this.getZoomScale(e),s=this._getCenterOffset(t)._divideBy(1-1/o);return!(i.animate!==!0&&!this.getSize().contains(s)||(n.Util.requestAnimFrame(function(){this._moveStart(!0)._animateZoom(t,e,!0)},this),0))},_animateZoom:function(t,e,i,o){i&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=e,n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:e,noUpdate:o}),setTimeout(n.bind(this._onZoomTransitionEnd,this),250)},_onZoomTransitionEnd:function(){this._animatingZoom&&(n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),n.Util.requestAnimFrame(function(){this._moveEnd(!0)},this))}}),n.map=function(t,e){return new n.Map(t,e)},n.Layer=n.Evented.extend({options:{pane:"overlayPane",nonBubblingEvents:[],attribution:null},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[n.stamp(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[n.stamp(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var e=t.target;if(e.hasLayer(this)){if(this._map=e,this._zoomAnimated=e._zoomAnimated,this.getEvents){var i=this.getEvents();e.on(i,this),this.once("remove",function(){e.off(i,this)},this)}this.onAdd(e),this.getAttribution&&e.attributionControl&&e.attributionControl.addAttribution(this.getAttribution()),this.fire("add"),e.fire("layeradd",{layer:this})}}}),n.Map.include({addLayer:function(t){var e=n.stamp(t);return this._layers[e]?this:(this._layers[e]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t),this)},removeLayer:function(t){var e=n.stamp(t);return this._layers[e]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[e],this._loaded&&(this.fire("layerremove",{layer:t}),t.fire("remove")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&n.stamp(t)in this._layers},eachLayer:function(t,e){for(var i in this._layers)t.call(e,this._layers[i]);return this},_addLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[];for(var e=0,i=t.length;ethis._layersMaxZoom&&this.setZoom(this._layersMaxZoom),this.options.minZoom===i&&this._layersMinZoom&&this.getZoom()100&&o<500||t.target._simulatedClick&&!t._simulated?void n.DomEvent.stop(t):(n.DomEvent._lastClick=i,void e(t))}},n.DomEvent.addListener=n.DomEvent.on,n.DomEvent.removeListener=n.DomEvent.off,n.PosAnimation=n.Evented.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(t){var e=+new Date-this._startTime,i=1e3*this._duration;e1e-7;l++)e=r*Math.sin(h),e=Math.pow((1-e)/(1+e),r/2),u=Math.PI/2-2*Math.atan(a*e)-h,h+=u;return new n.LatLng(h*i,t.x*i/o)}},n.CRS.EPSG3395=n.extend({},n.CRS.Earth,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=.5/(Math.PI*n.Projection.Mercator.R);return new n.Transformation(t,.5,-t,.5)}()}),n.GridLayer=n.Layer.extend({options:{tileSize:256,opacity:1,updateWhenIdle:n.Browser.mobile,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:i,noWrap:!1,pane:"tilePane",className:"",keepBuffer:2},initialize:function(t){n.setOptions(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView(),this._update()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),n.DomUtil.remove(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=null},bringToFront:function(){return this._map&&(n.DomUtil.toFront(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(n.DomUtil.toBack(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllTiles(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=n.Util.throttle(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return e.createElement("div")},getTileSize:function(){var t=this.options.tileSize;return t instanceof n.Point?t:new n.Point(t,t)},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var e,i=this.getPane().children,n=-t(-(1/0),1/0),o=0,s=i.length;othis.options.maxZoom||io&&this._retainParent(s,r,a,o))},_retainChildren:function(t,e,i,o){for(var s=2*t;s<2*t+2;s++)for(var r=2*e;r<2*e+2;r++){var a=new n.Point(s,r);a.z=i+1;var h=this._tileCoordsToKey(a),l=this._tiles[h];l&&l.active?l.retain=!0:(l&&l.loaded&&(l.retain=!0),i+1this.options.maxZoom||this.options.minZoom!==i&&s1)return void this._setView(t,s);for(var m=a.min.y;m<=a.max.y;m++)for(var p=a.min.x;p<=a.max.x;p++){var f=new n.Point(p,m);if(f.z=this._tileZoom,this._isValidTile(f)){var g=this._tiles[this._tileCoordsToKey(f)];g?g.current=!0:l.push(f)}}if(l.sort(function(t,e){return t.distanceTo(h)-e.distanceTo(h)}),0!==l.length){this._loading||(this._loading=!0,this.fire("loading"));var v=e.createDocumentFragment();for(p=0;pi.max.x)||!e.wrapLat&&(t.yi.max.y))return!1}if(!this.options.bounds)return!0;var o=this._tileCoordsToBounds(t);return n.latLngBounds(this.options.bounds).overlaps(o)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToBounds:function(t){var e=this._map,i=this.getTileSize(),o=t.scaleBy(i),s=o.add(i),r=e.unproject(o,t.z),a=e.unproject(s,t.z),h=new n.LatLngBounds(r,a);return this.options.noWrap||e.wrapLatLngBounds(h),h},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var e=t.split(":"),i=new n.Point(+e[0],+e[1]);return i.z=+e[2],i},_removeTile:function(t){var e=this._tiles[t];e&&(n.DomUtil.remove(e.el),delete this._tiles[t],this.fire("tileunload",{tile:e.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){n.DomUtil.addClass(t,"leaflet-tile");var e=this.getTileSize();t.style.width=e.x+"px",t.style.height=e.y+"px",t.onselectstart=n.Util.falseFn,t.onmousemove=n.Util.falseFn,n.Browser.ielt9&&this.options.opacity<1&&n.DomUtil.setOpacity(t,this.options.opacity),n.Browser.android&&!n.Browser.android23&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,e){var i=this._getTilePos(t),o=this._tileCoordsToKey(t),s=this.createTile(this._wrapCoords(t),n.bind(this._tileReady,this,t));this._initTile(s),this.createTile.length<2&&n.Util.requestAnimFrame(n.bind(this._tileReady,this,t,null,s)),n.DomUtil.setPosition(s,i),this._tiles[o]={el:s,coords:t,current:!0},e.appendChild(s),this.fire("tileloadstart",{tile:s,coords:t})},_tileReady:function(t,e,i){if(this._map){e&&this.fire("tileerror",{error:e,tile:i,coords:t});var o=this._tileCoordsToKey(t);(i=this._tiles[o])&&(i.loaded=+new Date,this._map._fadeAnimated?(n.DomUtil.setOpacity(i.el,0),n.Util.cancelAnimFrame(this._fadeFrame),this._fadeFrame=n.Util.requestAnimFrame(this._updateOpacity,this)):(i.active=!0,this._pruneTiles()),e||(n.DomUtil.addClass(i.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:i.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),n.Browser.ielt9||!this._map._fadeAnimated?n.Util.requestAnimFrame(this._pruneTiles,this):setTimeout(n.bind(this._pruneTiles,this),250)))}},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var e=new n.Point(this._wrapX?n.Util.wrapNum(t.x,this._wrapX):t.x,this._wrapY?n.Util.wrapNum(t.y,this._wrapY):t.y);return e.z=t.z,e},_pxBoundsToTileRange:function(t){var e=this.getTileSize();return new n.Bounds(t.min.unscaleBy(e).floor(),t.max.unscaleBy(e).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}}),n.gridLayer=function(t){return new n.GridLayer(t)},n.TileLayer=n.GridLayer.extend({options:{minZoom:0,maxZoom:18,maxNativeZoom:null,minNativeZoom:null,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,e){this._url=t,e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomReverse?(e.zoomOffset--,e.minZoom++):(e.zoomOffset++,e.maxZoom--),e.minZoom=Math.max(0,e.minZoom)),"string"==typeof e.subdomains&&(e.subdomains=e.subdomains.split("")),n.Browser.android||this.on("tileunload",this._onTileRemove)},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},createTile:function(t,i){var o=e.createElement("img");return n.DomEvent.on(o,"load",n.bind(this._tileOnLoad,this,i,o)),n.DomEvent.on(o,"error",n.bind(this._tileOnError,this,i,o)),this.options.crossOrigin&&(o.crossOrigin=""),o.alt="",o.setAttribute("role","presentation"),o.src=this.getTileUrl(t),o},getTileUrl:function(t){var e={r:n.Browser.retina?"@2x":"",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var i=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=i),e["-y"]=i}return n.Util.template(this._url,n.extend(e,this.options))},_tileOnLoad:function(t,e){n.Browser.ielt9?setTimeout(n.bind(t,this,null,e),0):t(null,e)},_tileOnError:function(t,e,i){var n=this.options.errorTileUrl;n&&e.src!==n&&(e.src=n),t(i,e)},getTileSize:function(){var t=this._map,e=n.GridLayer.prototype.getTileSize.call(this),i=this._tileZoom+this.options.zoomOffset,o=this.options.minNativeZoom,s=this.options.maxNativeZoom;return null!==o&&is?e.divideBy(t.getZoomScale(s,i)).round():e},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,e=this.options.maxZoom,i=this.options.zoomReverse,n=this.options.zoomOffset,o=this.options.minNativeZoom,s=this.options.maxNativeZoom;return i&&(t=e-t),t+=n,null!==o&&ts?s:t},_getSubdomain:function(t){var e=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_abortLoading:function(){var t,e;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&(e=this._tiles[t].el,e.onload=n.Util.falseFn,e.onerror=n.Util.falseFn,e.complete||(e.src=n.Util.emptyImageUrl,n.DomUtil.remove(e)))}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",layers:"",styles:"",format:"image/jpeg",transparent:!1,version:"1.1.1"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);for(var o in e)o in this.options||(i[o]=e[o]);e=n.setOptions(this,e),i.width=i.height=e.tileSize*(e.detectRetina&&n.Browser.retina?2:1),this.wmsParams=i},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var e=this._wmsVersion>=1.3?"crs":"srs";this.wmsParams[e]=this._crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t){var e=this._tileCoordsToBounds(t),i=this._crs.project(e.getNorthWest()),o=this._crs.project(e.getSouthEast()),s=(this._wmsVersion>=1.3&&this._crs===n.CRS.EPSG4326?[o.y,i.x,i.y,o.x]:[i.x,o.y,o.x,i.y]).join(","),r=n.TileLayer.prototype.getTileUrl.call(this,t);return r+n.Util.getParamString(this.wmsParams,r,this.options.uppercase)+(this.options.uppercase?"&BBOX=":"&bbox=")+s},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.ImageOverlay=n.Layer.extend({options:{opacity:1,alt:"",interactive:!1,crossOrigin:!1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(n.DomUtil.addClass(this._image,"leaflet-interactive"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){n.DomUtil.remove(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&n.DomUtil.toFront(this._image),this},bringToBack:function(){return this._map&&n.DomUtil.toBack(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=t,this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t=this._image=n.DomUtil.create("img","leaflet-image-layer "+(this._zoomAnimated?"leaflet-zoom-animated":""));t.onselectstart=n.Util.falseFn,t.onmousemove=n.Util.falseFn,t.onload=n.bind(this.fire,this,"load"),this.options.crossOrigin&&(t.crossOrigin=""),t.src=this._url,t.alt=this.options.alt},_animateZoom:function(t){ var e=this._map.getZoomScale(t.zoom),i=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;n.DomUtil.setTransform(this._image,i,e)},_reset:function(){var t=this._image,e=new n.Bounds(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),i=e.getSize();n.DomUtil.setPosition(t,e.min),t.style.width=i.x+"px",t.style.height=i.y+"px"},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({initialize:function(t){n.setOptions(this,t)},createIcon:function(t){return this._createIcon("icon",t)},createShadow:function(t){return this._createIcon("shadow",t)},_createIcon:function(t,e){var i=this._getIconUrl(t);if(!i){if("icon"===t)throw new Error("iconUrl not set in Icon options (see the docs).");return null}var n=this._createImg(i,e&&"IMG"===e.tagName?e:null);return this._setIconStyles(n,t),n},_setIconStyles:function(t,e){var i=this.options,o=i[e+"Size"];"number"==typeof o&&(o=[o,o]);var s=n.point(o),r=n.point("shadow"===e&&i.shadowAnchor||i.iconAnchor||s&&s.divideBy(2,!0));t.className="leaflet-marker-"+e+" "+(i.className||""),r&&(t.style.marginLeft=-r.x+"px",t.style.marginTop=-r.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t,i){return i=i||e.createElement("img"),i.src=t,i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]||this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconUrl:"marker-icon.png",iconRetinaUrl:"marker-icon-2x.png",shadowUrl:"marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return n.Icon.Default.imagePath||(n.Icon.Default.imagePath=this._detectIconPath()),(this.options.imagePath||n.Icon.Default.imagePath)+n.Icon.prototype._getIconUrl.call(this,t)},_detectIconPath:function(){var t=n.DomUtil.create("div","leaflet-default-icon-path",e.body),i=n.DomUtil.getStyle(t,"background-image")||n.DomUtil.getStyle(t,"backgroundImage");return e.body.removeChild(t),0===i.indexOf("url")?i.replace(/^url\([\"\']?/,"").replace(/marker-icon\.png[\"\']?\)$/,""):""}}),n.Marker=n.Layer.extend({options:{icon:new n.Icon.Default,interactive:!0,draggable:!1,keyboard:!0,title:"",alt:"",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:"markerPane",nonBubblingEvents:["click","dblclick","mouseover","mouseout","contextmenu"]},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on("zoomanim",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),this._zoomAnimated&&t.off("zoomanim",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var e=this._latlng;return this._latlng=n.latLng(t),this.update(),this.fire("move",{oldLatLng:e,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e="leaflet-zoom-"+(this._zoomAnimated?"animated":"hide"),i=t.icon.createIcon(this._icon),o=!1;i!==this._icon&&(this._icon&&this._removeIcon(),o=!0,t.title&&(i.title=t.title),t.alt&&(i.alt=t.alt)),n.DomUtil.addClass(i,e),t.keyboard&&(i.tabIndex="0"),this._icon=i,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex});var s=t.icon.createShadow(this._shadow),r=!1;s!==this._shadow&&(this._removeShadow(),r=!0),s&&(n.DomUtil.addClass(s,e),s.alt=""),this._shadow=s,t.opacity<1&&this._updateOpacity(),o&&this.getPane().appendChild(this._icon),this._initInteraction(),s&&r&&this.getPane("shadowPane").appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),n.DomUtil.remove(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&n.DomUtil.remove(this._shadow),this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(e)},_initInteraction:function(){if(this.options.interactive&&(n.DomUtil.addClass(this._icon,"leaflet-interactive"),this.addInteractiveTarget(this._icon),n.Handler.MarkerDrag)){var t=this.options.draggable;this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new n.Handler.MarkerDrag(this),t&&this.dragging.enable()}},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;n.DomUtil.setOpacity(this._icon,t),this._shadow&&n.DomUtil.setOpacity(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor||[0,0]},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor||[0,0]}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:"leaflet-div-icon"},createIcon:function(t){var i=t&&"DIV"===t.tagName?t:e.createElement("div"),o=this.options;if(i.innerHTML=o.html!==!1?o.html:"",o.bgPos){var s=n.point(o.bgPos);i.style.backgroundPosition=-s.x+"px "+-s.y+"px"}return this._setIconStyles(i,"icon"),i},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.DivOverlay=n.Layer.extend({options:{offset:[0,7],className:"",pane:"popupPane"},initialize:function(t,e){n.setOptions(this,t),this._source=e},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&n.DomUtil.setOpacity(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&n.DomUtil.setOpacity(this._container,1),this.bringToFront()},onRemove:function(t){t._fadeAnimated?(n.DomUtil.setOpacity(this._container,0),this._removeTimeout=setTimeout(n.bind(n.DomUtil.remove,n.DomUtil,this._container),200)):n.DomUtil.remove(this._container)},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&n.DomUtil.toFront(this._container),this},bringToBack:function(){return this._map&&n.DomUtil.toBack(this._container),this},_updateContent:function(){if(this._content){var t=this._contentNode,e="function"==typeof this._content?this._content(this._source||this):this._content;if("string"==typeof e)t.innerHTML=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(e)}this.fire("contentupdate")}},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=n.point(this.options.offset),i=this._getAnchor();this._zoomAnimated?n.DomUtil.setPosition(this._container,t.add(i)):e=e.add(t).add(i);var o=this._containerBottom=-e.y,s=this._containerLeft=-Math.round(this._containerWidth/2)+e.x;this._container.style.bottom=o+"px",this._container.style.left=s+"px"}},_getAnchor:function(){return[0,0]}}),n.Popup=n.DivOverlay.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,className:""},openOn:function(t){return t.openPopup(this),this},onAdd:function(t){n.DivOverlay.prototype.onAdd.call(this,t),t.fire("popupopen",{popup:this}),this._source&&(this._source.fire("popupopen",{popup:this},!0),this._source instanceof n.Path||this._source.on("preclick",n.DomEvent.stopPropagation))},onRemove:function(t){n.DivOverlay.prototype.onRemove.call(this,t),t.fire("popupclose",{popup:this}),this._source&&(this._source.fire("popupclose",{popup:this},!0),this._source instanceof n.Path||this._source.off("preclick",n.DomEvent.stopPropagation))},getEvents:function(){var t=n.DivOverlay.prototype.getEvents.call(this);return("closeOnClick"in this.options?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t="leaflet-popup",e=this._container=n.DomUtil.create("div",t+" "+(this.options.className||"")+" leaflet-zoom-animated");if(this.options.closeButton){var i=this._closeButton=n.DomUtil.create("a",t+"-close-button",e);i.href="#close",i.innerHTML="×",n.DomEvent.on(i,"click",this._onCloseButtonClick,this)}var o=this._wrapper=n.DomUtil.create("div",t+"-content-wrapper",e);this._contentNode=n.DomUtil.create("div",t+"-content",o),n.DomEvent.disableClickPropagation(o).disableScrollPropagation(this._contentNode).on(o,"contextmenu",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",t+"-tip-container",e),this._tip=n.DomUtil.create("div",t+"-tip",this._tipContainer)},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,r="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,r)):n.DomUtil.removeClass(t,r),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),i=this._getAnchor();n.DomUtil.setPosition(this._container,e.add(i))},_adjustPan:function(){if(!(!this.options.autoPan||this._map._panAnim&&this._map._panAnim._inProgress)){var t=this._map,e=parseInt(n.DomUtil.getStyle(this._container,"marginBottom"),10)||0,i=this._container.offsetHeight+e,o=this._containerWidth,s=new n.Point(this._containerLeft,-i-this._containerBottom);s._add(n.DomUtil.getPosition(this._container));var r=t.layerPointToContainerPoint(s),a=n.point(this.options.autoPanPadding),h=n.point(this.options.autoPanPaddingTopLeft||a),l=n.point(this.options.autoPanPaddingBottomRight||a),u=t.getSize(),c=0,d=0;r.x+o+l.x>u.x&&(c=r.x+o-u.x+l.x),r.x-c-h.x<0&&(c=r.x-h.x),r.y+i+l.y>u.y&&(d=r.y+i-u.y+l.y),r.y-d-h.y<0&&(d=r.y-h.y),(c||d)&&t.fire("autopanstart").panBy([c,d])}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)},_getAnchor:function(){return n.point(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Map.include({openPopup:function(t,e,i){return t instanceof n.Popup||(t=new n.Popup(i).setContent(t)),e&&t.setLatLng(e),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),n.Layer.include({bindPopup:function(t,e){return t instanceof n.Popup?(n.setOptions(t,e),this._popup=t,t._source=this):(this._popup&&!e||(this._popup=new n.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,e){if(t instanceof n.Layer||(e=t,t=this),t instanceof n.FeatureGroup)for(var i in this._layers){t=this._layers[i];break}return e||(e=t.getCenter?t.getCenter():t.getLatLng()),this._popup&&this._map&&(this._popup._source=t,this._popup.update(),this._map.openPopup(this._popup,e)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var e=t.layer||t.target;if(this._popup&&this._map)return n.DomEvent.stop(t),e instanceof n.Path?void this.openPopup(t.layer||t.target,t.latlng):void(this._map.hasLayer(this._popup)&&this._popup._source===e?this.closePopup():this.openPopup(e,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Tooltip=n.DivOverlay.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){n.DivOverlay.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){n.DivOverlay.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=n.DivOverlay.prototype.getEvents.call(this);return n.Browser.touch&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=n.DomUtil.create("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var e=this._map,i=this._container,o=e.latLngToContainerPoint(e.getCenter()),s=e.layerPointToContainerPoint(t),r=this.options.direction,a=i.offsetWidth,h=i.offsetHeight,l=n.point(this.options.offset),u=this._getAnchor();"top"===r?t=t.add(n.point(-a/2+l.x,-h+l.y+u.y,!0)):"bottom"===r?t=t.subtract(n.point(a/2-l.x,-l.y,!0)):"center"===r?t=t.subtract(n.point(a/2+l.x,h/2-u.y+l.y,!0)):"right"===r||"auto"===r&&s.xh&&(s=r,h=a);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;ne&&(i.push(t[n]),o=n);return oe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,r=e.x,a=e.y,h=i.x-r,l=i.y-a,u=h*h+l*l;return u>0&&(s=((t.x-r)*h+(t.y-a)*l)/u,s>1?(r=i.x,a=i.y):s>0&&(r+=h*s,a+=l*s)),h=t.x-r,l=t.y-a,o?h*h+l*l:new n.Point(r,a)}},n.Polyline=n.Path.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,e){n.setOptions(this,e),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var e,i,o=1/0,s=null,r=n.LineUtil._sqClosestPointOnSegment,a=0,h=this._parts.length;ae)return r=(n-e)/i,this._map.layerPointToLatLng([s.x-r*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,e){return e=e||this._defaultShape(),t=n.latLng(t),e.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new n.LatLngBounds,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return n.Polyline._flat(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var e=[],i=n.Polyline._flat(t),o=0,s=t.length;o=2&&e[0]instanceof n.LatLng&&e[0].equals(e[i-1])&&e.pop(),e},_setLatLngs:function(t){n.Polyline.prototype._setLatLngs.call(this,t),n.Polyline._flat(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return n.Polyline._flat(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,e=this.options.weight,i=new n.Point(e,e);if(t=new n.Bounds(t.min.subtract(i),t.max.add(i)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t)){if(this.options.noClip)return void(this._parts=this._rings);for(var o,s=0,r=this._rings.length;s';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}(),n.SVG.include(n.Browser.vml?{_initContainer:function(){this._container=n.DomUtil.create("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(n.Renderer.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var e=t._container=n.SVG.create("shape");n.DomUtil.addClass(e,"leaflet-vml-shape "+(this.options.className||"")),e.coordsize="1 1",t._path=n.SVG.create("path"),e.appendChild(t._path),this._updateStyle(t),this._layers[n.stamp(t)]=t},_addPath:function(t){var e=t._container;this._container.appendChild(e),t.options.interactive&&t.addInteractiveTarget(e)},_removePath:function(t){var e=t._container;n.DomUtil.remove(e),t.removeInteractiveTarget(e),delete this._layers[n.stamp(t)]},_updateStyle:function(t){var e=t._stroke,i=t._fill,o=t.options,s=t._container;s.stroked=!!o.stroke,s.filled=!!o.fill,o.stroke?(e||(e=t._stroke=n.SVG.create("stroke")),s.appendChild(e),e.weight=o.weight+"px",e.color=o.color,e.opacity=o.opacity,o.dashArray?e.dashStyle=n.Util.isArray(o.dashArray)?o.dashArray.join(" "):o.dashArray.replace(/( *, *)/g," "):e.dashStyle="",e.endcap=o.lineCap.replace("butt","flat"),e.joinstyle=o.lineJoin):e&&(s.removeChild(e),t._stroke=null),o.fill?(i||(i=t._fill=n.SVG.create("fill")),s.appendChild(i),i.color=o.fillColor||o.color,i.opacity=o.fillOpacity):i&&(s.removeChild(i),t._fill=null)},_updateCircle:function(t){var e=t._point.round(),i=Math.round(t._radius),n=Math.round(t._radiusY||i);this._setPath(t,t._empty()?"M0 0":"AL "+e.x+","+e.y+" "+i+","+n+" 0,23592600")},_setPath:function(t,e){t._path.v=e},_bringToFront:function(t){n.DomUtil.toFront(t._container)},_bringToBack:function(t){n.DomUtil.toBack(t._container)}}:{}),n.Browser.vml&&(n.SVG.create=function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}()),n.Canvas=n.Renderer.extend({getEvents:function(){var t=n.Renderer.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){n.Renderer.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=e.createElement("canvas");n.DomEvent.on(t,"mousemove",n.Util.throttle(this._onMouseMove,32,this),this).on(t,"click dblclick mousedown mouseup contextmenu",this._onClick,this).on(t,"mouseout",this._handleMouseOut,this),this._ctx=t.getContext("2d")},_updatePaths:function(){if(!this._postponeUpdatePaths){var t;this._redrawBounds=null;for(var e in this._layers)t=this._layers[e],t._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){this._drawnLayers={},n.Renderer.prototype._update.call(this);var t=this._bounds,e=this._container,i=t.getSize(),o=n.Browser.retina?2:1;n.DomUtil.setPosition(e,t.min),e.width=o*i.x,e.height=o*i.y,e.style.width=i.x+"px",e.style.height=i.y+"px",n.Browser.retina&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire("update")}},_reset:function(){n.Renderer.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[n.stamp(t)]=t;var e=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=e),this._drawLast=e,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var e=t._order,i=e.next,o=e.prev;i?i.prev=o:this._drawLast=o,o?o.next=i:this._drawFirst=i,delete t._order,delete this._layers[n.stamp(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if(t.options.dashArray){var e,i=t.options.dashArray.split(","),n=[];for(e=0;et.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u||n.Polyline.prototype._containsPoint.call(this,t,!0)},n.CircleMarker.prototype._containsPoint=function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()},n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o,s=n.Util.isArray(t)?t:t.features;if(s){for(e=0,i=s.length;e1)return void(this._moved=!0);var o=i.touches&&1===i.touches.length?i.touches[0]:i,s=new n.Point(o.clientX,o.clientY),r=s.subtract(this._startPoint);(r.x||r.y)&&(Math.abs(r.x)+Math.abs(r.y)50&&(this._positions.shift(),this._times.shift())}this._map.fire("move",t).fire("drag",t)},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),e=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,e){return t-(t-e)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),e=this._offsetLimit;t.xe.max.x&&(t.x=this._viscousLimit(t.x,e.max.x)),t.y>e.max.y&&(t.y=this._viscousLimit(t.y,e.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,r=Math.abs(o+i)0?s:-s))-e;this._delta=0,this._startTime=null,r&&("center"===t.options.scrollWheelZoom?t.setZoom(e+r):t.setZoomAround(this._lastMousePos,e+r))}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msPointer?"MSPointerDown":n.Browser.pointer?"pointerdown":"touchstart",_touchend:n.Browser.msPointer?"MSPointerUp":n.Browser.pointer?"pointerup":"touchend",addDoubleTapListener:function(t,e,i){function o(t){var e;if(n.Browser.pointer){if(!n.Browser.edge||"mouse"===t.pointerType)return;e=n.DomEvent._pointersCount}else e=t.touches.length;if(!(e>1)){var i=Date.now(),o=i-(r||i);a=t.touches?t.touches[0]:t,h=o>0&&o<=l,r=i}}function s(t){if(h&&!a.cancelBubble){if(n.Browser.pointer){if(!n.Browser.edge||"mouse"===t.pointerType)return;var i,o,s={};for(o in a)i=a[o],s[o]=i&&i.bind?i.bind(a):i;a=s}a.type="dblclick",e(a),r=null}}var r,a,h=!1,l=250,u="_leaflet_",c=this._touchstart,d=this._touchend;return t[u+c+i]=o,t[u+d+i]=s,t[u+"dblclick"+i]=e,t.addEventListener(c,o,!1),t.addEventListener(d,s,!1),t.addEventListener("dblclick",e,!1),this},removeDoubleTapListener:function(t,e){var i="_leaflet_",o=t[i+this._touchstart+e],s=t[i+this._touchend+e],r=t[i+"dblclick"+e];return t.removeEventListener(this._touchstart,o,!1),t.removeEventListener(this._touchend,s,!1),n.Browser.edge||t.removeEventListener("dblclick",r,!1),this}}),n.extend(n.DomEvent,{POINTER_DOWN:n.Browser.msPointer?"MSPointerDown":"pointerdown",POINTER_MOVE:n.Browser.msPointer?"MSPointerMove":"pointermove",POINTER_UP:n.Browser.msPointer?"MSPointerUp":"pointerup",POINTER_CANCEL:n.Browser.msPointer?"MSPointerCancel":"pointercancel",TAG_WHITE_LIST:["INPUT","SELECT","OPTION"],_pointers:{},_pointersCount:0,addPointerListener:function(t,e,i,n){return"touchstart"===e?this._addPointerStart(t,i,n):"touchmove"===e?this._addPointerMove(t,i,n):"touchend"===e&&this._addPointerEnd(t,i,n),this},removePointerListener:function(t,e,i){var n=t["_leaflet_"+e+i];return"touchstart"===e?t.removeEventListener(this.POINTER_DOWN,n,!1):"touchmove"===e?t.removeEventListener(this.POINTER_MOVE,n,!1):"touchend"===e&&(t.removeEventListener(this.POINTER_UP,n,!1),t.removeEventListener(this.POINTER_CANCEL,n,!1)),this},_addPointerStart:function(t,i,o){var s=n.bind(function(t){if("mouse"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(this.TAG_WHITE_LIST.indexOf(t.target.tagName)<0))return;n.DomEvent.preventDefault(t)}this._handlePointer(t,i)},this);if(t["_leaflet_touchstart"+o]=s,t.addEventListener(this.POINTER_DOWN,s,!1),!this._pointerDocListener){var r=n.bind(this._globalPointerUp,this);e.documentElement.addEventListener(this.POINTER_DOWN,n.bind(this._globalPointerDown,this),!0),e.documentElement.addEventListener(this.POINTER_MOVE,n.bind(this._globalPointerMove,this),!0),e.documentElement.addEventListener(this.POINTER_UP,r,!0),e.documentElement.addEventListener(this.POINTER_CANCEL,r,!0),this._pointerDocListener=!0}},_globalPointerDown:function(t){this._pointers[t.pointerId]=t,this._pointersCount++},_globalPointerMove:function(t){this._pointers[t.pointerId]&&(this._pointers[t.pointerId]=t)},_globalPointerUp:function(t){delete this._pointers[t.pointerId],this._pointersCount--},_handlePointer:function(t,e){t.touches=[];for(var i in this._pointers)t.touches.push(this._pointers[i]);t.changedTouches=[t],e(t)},_addPointerMove:function(t,e,i){var o=n.bind(function(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons)&&this._handlePointer(t,e)},this);t["_leaflet_touchmove"+i]=o,t.addEventListener(this.POINTER_MOVE,o,!1)},_addPointerEnd:function(t,e,i){var o=n.bind(function(t){this._handlePointer(t,e)},this);t["_leaflet_touchend"+i]=o,t.addEventListener(this.POINTER_UP,o,!1),t.addEventListener(this.POINTER_CANCEL,o,!1)}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23,bounceAtZoomLimits:!0}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomUtil.addClass(this._map._container,"leaflet-touch-zoom"),n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomUtil.removeClass(this._map._container,"leaflet-touch-zoom"),n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToContainerPoint(t.touches[0]),s=i.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=i.getSize()._divideBy(2),this._startLatLng=i.containerPointToLatLng(this._centerPoint),"center"!==i.options.touchZoom&&(this._pinchStartLatLng=i.containerPointToLatLng(o.add(s)._divideBy(2))),this._startDist=o.distanceTo(s),this._startZoom=i.getZoom(),this._moved=!1,this._zooming=!0,i._stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var e=this._map,i=e.mouseEventToContainerPoint(t.touches[0]),o=e.mouseEventToContainerPoint(t.touches[1]),s=i.distanceTo(o)/this._startDist;if(this._zoom=e.getScaleZoom(s,this._startZoom),!e.options.bounceAtZoomLimits&&(this._zoome.getMaxZoom()&&s>1)&&(this._zoom=e._limitZoom(this._zoom)),"center"===e.options.touchZoom){if(this._center=this._startLatLng,1===s)return}else{var r=i._add(o)._divideBy(2)._subtract(this._centerPoint);if(1===s&&0===r.x&&0===r.y)return;this._center=e.unproject(e.project(this._pinchStartLatLng,this._zoom).subtract(r),this._zoom)}this._moved||(e._moveStart(!0),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest);var a=n.bind(e._move,e,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=n.Util.requestAnimFrame(a,this,!0),n.DomEvent.preventDefault(t)}},_onTouchEnd:function(){return this._moved&&this._zooming?(this._zooming=!1,n.Util.cancelAnimFrame(this._animRequest),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd),void(this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom)))):void(this._zooming=!1)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({tap:!0,tapTolerance:15}),n.Map.Tap=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onDown,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onDown,this)},_onDown:function(t){if(t.touches){if(n.DomEvent.preventDefault(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],o=i.target;this._startPos=this._newPos=new n.Point(i.clientX,i.clientY),o.tagName&&"a"===o.tagName.toLowerCase()&&n.DomUtil.addClass(o,"leaflet-active"),this._holdTimeout=setTimeout(n.bind(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent("contextmenu",i))},this),1e3),this._simulateEvent("mousedown",i),n.DomEvent.on(e,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),n.DomEvent.off(e,{touchmove:this._onMove,touchend:this._onUp},this), -this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],o=i.target;o&&o.tagName&&"a"===o.tagName.toLowerCase()&&n.DomUtil.removeClass(o,"leaflet-active"),this._simulateEvent("mouseup",i),this._isTapValid()&&this._simulateEvent("click",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var e=t.touches[0];this._newPos=new n.Point(e.clientX,e.clientY),this._simulateEvent("mousemove",e)},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o._simulated=!0,n.target._simulatedClick=!0,o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Browser.touch&&!n.Browser.pointer&&n.Map.addInitHook("addHandler","tap",n.Map.Tap),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_resetState:function(){this._moved=!1},_onMouseDown:function(t){return!(!t.shiftKey||1!==t.which&&1!==t.button)&&(this._resetState(),n.DomUtil.disableTextSelection(),n.DomUtil.disableImageDrag(),this._startPoint=this._map.mouseEventToContainerPoint(t),void n.DomEvent.on(e,{contextmenu:n.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this))},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=n.DomUtil.create("div","leaflet-zoom-box",this._container),n.DomUtil.addClass(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var e=new n.Bounds(this._point,this._startPoint),i=e.getSize();n.DomUtil.setPosition(this._box,e.min),this._box.style.width=i.x+"px",this._box.style.height=i.y+"px"},_finish:function(){this._moved&&(n.DomUtil.remove(this._box),n.DomUtil.removeClass(this._container,"leaflet-crosshair")),n.DomUtil.enableTextSelection(),n.DomUtil.enableImageDrag(),n.DomEvent.off(e,{contextmenu:n.DomEvent.stop,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){setTimeout(n.bind(this._resetState,this),0);var e=new n.LatLngBounds(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(e).fire("boxzoomend",{boxZoomBounds:e})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanDelta:80}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex="0"),n.DomEvent.on(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),n.DomEvent.off(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(!this._focused){var i=e.body,n=e.documentElement,o=i.scrollTop||n.scrollTop,s=i.scrollLeft||n.scrollLeft;this._map._container.focus(),t.scrollTo(s,o)}},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanDelta:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;e0&&t.screenY>0&&this._map.getContainer().focus()}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){function t(t,s){var r=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",r,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")},_clearControlPos:function(){n.DomUtil.remove(this._controlContainer)}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"-",zoomOutTitle:"Zoom out"},onAdd:function(t){var e="leaflet-control-zoom",i=n.DomUtil.create("div",e+" leaflet-bar"),o=this.options;return this._zoomInButton=this._createButton(o.zoomInText,o.zoomInTitle,e+"-in",i,this._zoomIn),this._zoomOutButton=this._createButton(o.zoomOutText,o.zoomOutTitle,e+"-out",i,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),i},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,e,i,o,s){var r=n.DomUtil.create("a",i,o);return r.innerHTML=t,r.href="#",r.title=e,r.setAttribute("role","button"),r.setAttribute("aria-label",e),n.DomEvent.on(r,"mousedown dblclick",n.DomEvent.stopPropagation).on(r,"click",n.DomEvent.stop).on(r,"click",s,this).on(r,"click",this._refocusOnMap,this),r},_updateDisabled:function(){var t=this._map,e="leaflet-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),(this._disabled||t._zoom===t.getMinZoom())&&n.DomUtil.addClass(this._zoomOutButton,e),(this._disabled||t._zoom===t.getMaxZoom())&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){t.attributionControl=this,this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent&&n.DomEvent.disableClickPropagation(this._container);for(var e in t._layers)t._layers[e].getAttribution&&this.addAttribution(t._layers[e].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" | ")}}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(new n.Control.Attribution).addTo(this)}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e+"-line",i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e,i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e,i))},_update:function(){var t=this._map,e=t.getSize().y/2,i=t.distance(t.containerPointToLatLng([0,e]),t.containerPointToLatLng([this.options.maxWidth,e]));this._updateScales(i)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var e=this._getRoundNum(t),i=e<1e3?e+" m":e/1e3+" km";this._updateScale(this._mScale,i,e/t)},_updateImperial:function(t){var e,i,n,o=3.2808399*t;o>5280?(e=o/5280,i=this._getRoundNum(e),this._updateScale(this._iScale,i+" mi",i/e)):(n=this._getRoundNum(o),this._updateScale(this._iScale,n+" ft",n/o))},_updateScale:function(t,e,i){t.style.width=Math.round(this.options.maxWidth*i)+"px",t.innerHTML=e},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,e,i,n){return i1,this._baseLayersList.style.display=t?"":"none"),this._separator.style.display=e&&t?"":"none",this},_onLayerChange:function(t){this._handlingClick||this._update();var e=this._getLayer(n.stamp(t.target)),i=e.overlay?"add"===t.type?"overlayadd":"overlayremove":"add"===t.type?"baselayerchange":null;i&&this._map.fire(i,e)},_createRadioElement:function(t,i){var n='",o=e.createElement("div");return o.innerHTML=n,o.firstChild},_addItem:function(t){var i,o=e.createElement("label"),s=this._map.hasLayer(t.layer);t.overlay?(i=e.createElement("input"),i.type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=s):i=this._createRadioElement("leaflet-base-layers",s),i.layerId=n.stamp(t.layer),n.DomEvent.on(i,"click",this._onInputClick,this);var r=e.createElement("span");r.innerHTML=" "+t.name;var a=e.createElement("div");return o.appendChild(a),a.appendChild(i),a.appendChild(r),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(o),this._checkDisabledLayers(),o},_onInputClick:function(){var t,e,i,n=this._form.getElementsByTagName("input"),o=[],s=[];this._handlingClick=!0;for(var r=n.length-1;r>=0;r--)t=n[r],e=this._getLayer(t.layerId).layer,i=this._map.hasLayer(e),t.checked&&!i?o.push(e):!t.checked&&i&&s.push(e);for(r=0;r=0;s--)t=n[s],e=this._getLayer(t.layerId).layer,t.disabled=e.options.minZoom!==i&&oe.options.maxZoom},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)}}(window,document)