From 63968b48efaac5764c59fe6215978d7715133418 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Sun, 30 Jun 2019 21:49:29 -0400 Subject: [PATCH 01/12] Add support for French --- .../environment_canada/manifest.json | 2 +- .../components/environment_canada/sensor.py | 91 +++++++++++++------ requirements_all.txt | 2 +- 3 files changed, 64 insertions(+), 31 deletions(-) diff --git a/homeassistant/components/environment_canada/manifest.json b/homeassistant/components/environment_canada/manifest.json index ea809238499199..19c5c80b9e2500 100644 --- a/homeassistant/components/environment_canada/manifest.json +++ b/homeassistant/components/environment_canada/manifest.json @@ -3,7 +3,7 @@ "name": "Environment Canada", "documentation": "https://www.home-assistant.io/components/environment_canada", "requirements": [ - "env_canada==0.0.10" + "env_canada==0.0.14" ], "dependencies": [], "codeowners": [ diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index c0b78cd4f3509b..8cada911d1a87d 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -28,42 +28,67 @@ CONF_ATTRIBUTION = "Data provided by Environment Canada" CONF_STATION = 'station' +CONF_LANGUAGE = 'language' MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=10) SENSOR_TYPES = { - 'temperature': {'name': 'Temperature', + 'temperature': {'english': 'Temperature', + 'french': 'Température', 'unit': TEMP_CELSIUS}, - 'dewpoint': {'name': 'Dew Point', + 'dewpoint': {'english': 'Dew Point', + 'french': 'Point de rosée', 'unit': TEMP_CELSIUS}, - 'wind_chill': {'name': 'Wind Chill', + 'wind_chill': {'english': 'Wind Chill', + 'french': 'Refroidissement éolien', 'unit': TEMP_CELSIUS}, - 'humidex': {'name': 'Humidex', + 'humidex': {'english': 'Humidex', + 'french': 'Humidex', 'unit': TEMP_CELSIUS}, - 'pressure': {'name': 'Pressure', + 'pressure': {'english': 'Pressure', + 'french': 'Pression', 'unit': 'kPa'}, - 'tendency': {'name': 'Tendency'}, - 'humidity': {'name': 'Humidity', + 'tendency': {'english': 'Tendency', + 'french': 'Tendance'}, + 'humidity': {'english': 'Humidity', + 'french': 'Humidité', 'unit': '%'}, - 'visibility': {'name': 'Visibility', + 'visibility': {'english': 'Visibility', + 'french': 'Visibilité', 'unit': 'km'}, - 'condition': {'name': 'Condition'}, - 'wind_speed': {'name': 'Wind Speed', + 'condition': {'english': 'Condition', + 'french': 'Condition'}, + 'wind_speed': {'english': 'Wind Speed', + 'french': 'Vitesse de vent', 'unit': 'km/h'}, - 'wind_gust': {'name': 'Wind Gust', + 'wind_gust': {'english': 'Wind Gust', + 'french': 'Rafale de vent', 'unit': 'km/h'}, - 'wind_dir': {'name': 'Wind Direction'}, - 'high_temp': {'name': 'High Temperature', + 'wind_dir': {'english': 'Wind Direction', + 'french': 'Direction de vent'}, + 'high_temp': {'english': 'High Temperature', + 'french': 'Haute température', 'unit': TEMP_CELSIUS}, - 'low_temp': {'name': 'Low Temperature', + 'low_temp': {'english': 'Low Temperature', + 'french': 'Basse température', 'unit': TEMP_CELSIUS}, - 'pop': {'name': 'Chance of Precip.', + 'pop': {'english': 'Chance of Precip.', + 'french': 'Probabilité d\'averses', 'unit': '%'}, - 'warnings': {'name': 'Warnings'}, - 'watches': {'name': 'Watches'}, - 'advisories': {'name': 'Advisories'}, - 'statements': {'name': 'Statements'}, - 'endings': {'name': 'Ended'} + 'forecast_period': {'english': 'Forecast Period', + 'french': 'Période de prévision'}, + 'text_summary': {'english': 'Text Summary', + 'french': 'Résumé textuel'}, + 'warnings': {'english': 'Warnings', + 'french': 'Alertes'}, + 'watches': {'english': 'Watches', + 'french': 'Veilles'}, + 'advisories': {'english': 'Advisories', + 'french': 'Avis'}, + 'statements': {'english': 'Statements', + 'french': 'Bulletins'}, + 'endings': {'english': 'Ended', + 'french': 'Terminé'} } @@ -83,6 +108,8 @@ def validate_station(station): vol.Optional(CONF_STATION): validate_station, vol.Inclusive(CONF_LATITUDE, 'latlon'): cv.latitude, vol.Inclusive(CONF_LONGITUDE, 'latlon'): cv.longitude, + vol.Optional(CONF_LANGUAGE, default='english'): + vol.In(['english', 'french']) }) @@ -91,15 +118,21 @@ def setup_platform(hass, config, add_devices, discovery_info=None): from env_canada import ECData if config.get(CONF_STATION): - ec_data = ECData(station_id=config[CONF_STATION]) + ec_data = ECData(station_id=config[CONF_STATION], + language=config.get(CONF_LANGUAGE)) elif config.get(CONF_LATITUDE) and config.get(CONF_LONGITUDE): ec_data = ECData(coordinates=(config[CONF_LATITUDE], - config[CONF_LONGITUDE])) + config[CONF_LONGITUDE]), + language=config.get(CONF_LANGUAGE)) else: ec_data = ECData(coordinates=(hass.config.latitude, - hass.config.longitude)) + hass.config.longitude), + language=config.get(CONF_LANGUAGE)) - add_devices([ECSensor(sensor_type, ec_data, config.get(CONF_NAME)) + add_devices([ECSensor(sensor_type, + ec_data, + config.get(CONF_NAME), + config.get(CONF_LANGUAGE)) for sensor_type in config[CONF_MONITORED_CONDITIONS]], True) @@ -107,22 +140,22 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class ECSensor(Entity): """Implementation of an Environment Canada sensor.""" - def __init__(self, sensor_type, ec_data, platform_name): + def __init__(self, sensor_type, ec_data, platform_name, language): """Initialize the sensor.""" self.sensor_type = sensor_type self.ec_data = ec_data self.platform_name = platform_name self._state = None self._attr = None + self.language = language @property def name(self): """Return the name of the sensor.""" + name = SENSOR_TYPES[self.sensor_type][self.language] if self.platform_name is None: - return SENSOR_TYPES[self.sensor_type]['name'] - - return ' '.join([self.platform_name, - SENSOR_TYPES[self.sensor_type]['name']]) + return name + return ' '.join([self.platform_name, name]) @property def state(self): diff --git a/requirements_all.txt b/requirements_all.txt index ecadcb46ba365f..0753c78c64d84f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -430,7 +430,7 @@ enocean==0.50 enturclient==0.2.0 # homeassistant.components.environment_canada -env_canada==0.0.10 +env_canada==0.0.14 # homeassistant.components.envirophat # envirophat==0.0.6 From daa507fde2d7910c6e95b8b4dd4b793e3add60e5 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Tue, 2 Jul 2019 00:36:03 -0400 Subject: [PATCH 02/12] Move labels to env_canada --- .../environment_canada/manifest.json | 2 +- .../components/environment_canada/sensor.py | 130 +++++++----------- .../components/environment_canada/weather.py | 30 ++-- requirements_all.txt | 2 +- 4 files changed, 70 insertions(+), 94 deletions(-) diff --git a/homeassistant/components/environment_canada/manifest.json b/homeassistant/components/environment_canada/manifest.json index 19c5c80b9e2500..92dae702cb13f9 100644 --- a/homeassistant/components/environment_canada/manifest.json +++ b/homeassistant/components/environment_canada/manifest.json @@ -3,7 +3,7 @@ "name": "Environment Canada", "documentation": "https://www.home-assistant.io/components/environment_canada", "requirements": [ - "env_canada==0.0.14" + "env_canada==0.0.16" ], "dependencies": [], "codeowners": [ diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index 8cada911d1a87d..349d84ce8c4859 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -32,64 +32,31 @@ MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=10) -SENSOR_TYPES = { - 'temperature': {'english': 'Temperature', - 'french': 'Température', - 'unit': TEMP_CELSIUS}, - 'dewpoint': {'english': 'Dew Point', - 'french': 'Point de rosée', - 'unit': TEMP_CELSIUS}, - 'wind_chill': {'english': 'Wind Chill', - 'french': 'Refroidissement éolien', - 'unit': TEMP_CELSIUS}, - 'humidex': {'english': 'Humidex', - 'french': 'Humidex', - 'unit': TEMP_CELSIUS}, - 'pressure': {'english': 'Pressure', - 'french': 'Pression', - 'unit': 'kPa'}, - 'tendency': {'english': 'Tendency', - 'french': 'Tendance'}, - 'humidity': {'english': 'Humidity', - 'french': 'Humidité', - 'unit': '%'}, - 'visibility': {'english': 'Visibility', - 'french': 'Visibilité', - 'unit': 'km'}, - 'condition': {'english': 'Condition', - 'french': 'Condition'}, - 'wind_speed': {'english': 'Wind Speed', - 'french': 'Vitesse de vent', - 'unit': 'km/h'}, - 'wind_gust': {'english': 'Wind Gust', - 'french': 'Rafale de vent', - 'unit': 'km/h'}, - 'wind_dir': {'english': 'Wind Direction', - 'french': 'Direction de vent'}, - 'high_temp': {'english': 'High Temperature', - 'french': 'Haute température', - 'unit': TEMP_CELSIUS}, - 'low_temp': {'english': 'Low Temperature', - 'french': 'Basse température', - 'unit': TEMP_CELSIUS}, - 'pop': {'english': 'Chance of Precip.', - 'french': 'Probabilité d\'averses', - 'unit': '%'}, - 'forecast_period': {'english': 'Forecast Period', - 'french': 'Période de prévision'}, - 'text_summary': {'english': 'Text Summary', - 'french': 'Résumé textuel'}, - 'warnings': {'english': 'Warnings', - 'french': 'Alertes'}, - 'watches': {'english': 'Watches', - 'french': 'Veilles'}, - 'advisories': {'english': 'Advisories', - 'french': 'Avis'}, - 'statements': {'english': 'Statements', - 'french': 'Bulletins'}, - 'endings': {'english': 'Ended', - 'french': 'Terminé'} -} +SENSOR_TYPES = [ + 'temperature', + 'dewpoint', + 'wind_chill', + 'humidex', + 'pressure', + 'tendency', + 'humidity', + 'visibility', + 'condition', + 'wind_speed', + 'wind_gust', + 'wind_dir', + 'wind_bearing', + 'forecast_period', + 'text_summary', + 'high_temp', + 'low_temp', + 'pop', + 'warnings', + 'watches', + 'advisories', + 'statements', + 'endings' +] def validate_station(station): @@ -104,12 +71,12 @@ def validate_station(station): PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES)): vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), + vol.Required(CONF_LANGUAGE, default='english'): + vol.In(['english', 'french']), vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_STATION): validate_station, vol.Inclusive(CONF_LATITUDE, 'latlon'): cv.latitude, vol.Inclusive(CONF_LONGITUDE, 'latlon'): cv.longitude, - vol.Optional(CONF_LANGUAGE, default='english'): - vol.In(['english', 'french']) }) @@ -131,8 +98,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices([ECSensor(sensor_type, ec_data, - config.get(CONF_NAME), - config.get(CONF_LANGUAGE)) + config.get(CONF_NAME)) for sensor_type in config[CONF_MONITORED_CONDITIONS]], True) @@ -140,22 +106,23 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class ECSensor(Entity): """Implementation of an Environment Canada sensor.""" - def __init__(self, sensor_type, ec_data, platform_name, language): + def __init__(self, sensor_type, ec_data, platform_name): """Initialize the sensor.""" self.sensor_type = sensor_type self.ec_data = ec_data self.platform_name = platform_name self._state = None self._attr = None - self.language = language + self._data = None + self._name = None + self._unit = None @property def name(self): """Return the name of the sensor.""" - name = SENSOR_TYPES[self.sensor_type][self.language] if self.platform_name is None: - return name - return ' '.join([self.platform_name, name]) + return self._name + return ' '.join([self.platform_name, self._name]) @property def state(self): @@ -170,7 +137,7 @@ def device_state_attributes(self): @property def unit_of_measurement(self): """Return the units of measurement.""" - return SENSOR_TYPES[self.sensor_type].get('unit') + return self._unit @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): @@ -178,22 +145,31 @@ def update(self): self.ec_data.update() self.ec_data.conditions.update(self.ec_data.alerts) + conditions = self.ec_data.conditions + sensor_data = conditions.get(self.sensor_type) + self._attr = {} + self._name = sensor_data.get('label') + value = sensor_data.get('value') - sensor_data = self.ec_data.conditions.get(self.sensor_type) - if isinstance(sensor_data, list): + if isinstance(value, list): self._state = ' | '.join([str(s.get('title')) - for s in sensor_data]) + for s in value]) self._attr.update({ ATTR_DETAIL: ' | '.join([str(s.get('detail')) - for s in sensor_data]), + for s in value]), ATTR_TIME: ' | '.join([str(s.get('date')) - for s in sensor_data]) + for s in value]) }) else: - self._state = sensor_data + self._state = value + + if sensor_data.get('unit') == 'C': + self._unit = TEMP_CELSIUS + else: + self._unit = sensor_data.get('unit') - timestamp = self.ec_data.conditions.get('timestamp') + timestamp = self.ec_data.conditions.get('timestamp').get('value') if timestamp: updated_utc = datetime.datetime.strptime(timestamp, '%Y%m%d%H%M%S') updated_local = dt.as_local(updated_utc).isoformat() @@ -205,7 +181,7 @@ def update(self): self._attr.update({ ATTR_ATTRIBUTION: CONF_ATTRIBUTION, ATTR_UPDATED: updated_local, - ATTR_LOCATION: self.ec_data.conditions.get('location'), - ATTR_STATION: self.ec_data.conditions.get('station'), + ATTR_LOCATION: conditions.get('location').get('value'), + ATTR_STATION: conditions.get('station').get('value'), ATTR_HIDDEN: hidden }) diff --git a/homeassistant/components/environment_canada/weather.py b/homeassistant/components/environment_canada/weather.py index 0589a23445ec5f..ff5534aeb8a502 100644 --- a/homeassistant/components/environment_canada/weather.py +++ b/homeassistant/components/environment_canada/weather.py @@ -96,13 +96,13 @@ def name(self): """Return the name of the weather entity.""" if self.platform_name: return self.platform_name - return self.ec_data.conditions['location'] + return self.ec_data.conditions.get('location').get('value') @property def temperature(self): """Return the temperature.""" - if self.ec_data.conditions.get('temperature'): - return float(self.ec_data.conditions['temperature']) + if self.ec_data.conditions.get('temperature').get('value'): + return float(self.ec_data.conditions['temperature']['value']) return None @property @@ -113,45 +113,45 @@ def temperature_unit(self): @property def humidity(self): """Return the humidity.""" - if self.ec_data.conditions.get('humidity'): - return float(self.ec_data.conditions['humidity']) + if self.ec_data.conditions.get('humidity').get('value'): + return float(self.ec_data.conditions['humidity']['value']) return None @property def wind_speed(self): """Return the wind speed.""" - if self.ec_data.conditions.get('wind_speed'): - return float(self.ec_data.conditions['wind_speed']) + if self.ec_data.conditions.get('wind_speed').get('value'): + return float(self.ec_data.conditions['wind_speed']['value']) return None @property def wind_bearing(self): """Return the wind bearing.""" - if self.ec_data.conditions.get('wind_bearing'): - return float(self.ec_data.conditions['wind_bearing']) + if self.ec_data.conditions.get('wind_bearing').get('value'): + return float(self.ec_data.conditions['wind_bearing']['value']) return None @property def pressure(self): """Return the pressure.""" - if self.ec_data.conditions.get('pressure'): - return 10 * float(self.ec_data.conditions['pressure']) + if self.ec_data.conditions.get('pressure').get('value'): + return 10 * float(self.ec_data.conditions['pressure']['value']) return None @property def visibility(self): """Return the visibility.""" - if self.ec_data.conditions.get('visibility'): - return float(self.ec_data.conditions['visibility']) + if self.ec_data.conditions.get('visibility').get('value'): + return float(self.ec_data.conditions['visibility']['value']) return None @property def condition(self): """Return the weather condition.""" - icon_code = self.ec_data.conditions.get('icon_code') + icon_code = self.ec_data.conditions.get('icon_code').get('value') if icon_code: return icon_code_to_condition(int(icon_code)) - condition = self.ec_data.conditions.get('condition') + condition = self.ec_data.conditions.get('condition').get('value') if condition: return condition return 'Condition not observed' diff --git a/requirements_all.txt b/requirements_all.txt index 0753c78c64d84f..ec2b9612fa2bef 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -430,7 +430,7 @@ enocean==0.50 enturclient==0.2.0 # homeassistant.components.environment_canada -env_canada==0.0.14 +env_canada==0.0.16 # homeassistant.components.envirophat # envirophat==0.0.6 From 3dae2dbe3e50020127cb59f495849e4984b7b5ef Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Sat, 6 Jul 2019 14:05:15 -0400 Subject: [PATCH 03/12] Bump env_canada to 0.0.17, change update frequency to 1 minute --- homeassistant/components/environment_canada/manifest.json | 2 +- homeassistant/components/environment_canada/sensor.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/environment_canada/manifest.json b/homeassistant/components/environment_canada/manifest.json index 92dae702cb13f9..a01eb59e19152b 100644 --- a/homeassistant/components/environment_canada/manifest.json +++ b/homeassistant/components/environment_canada/manifest.json @@ -3,7 +3,7 @@ "name": "Environment Canada", "documentation": "https://www.home-assistant.io/components/environment_canada", "requirements": [ - "env_canada==0.0.16" + "env_canada==0.0.17" ], "dependencies": [], "codeowners": [ diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index 349d84ce8c4859..f6617d58319836 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -30,7 +30,7 @@ CONF_STATION = 'station' CONF_LANGUAGE = 'language' -MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=10) +MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=1) SENSOR_TYPES = [ 'temperature', From 2df1e17eb423533125431680e8c305616aa38e3e Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Sat, 6 Jul 2019 14:10:16 -0400 Subject: [PATCH 04/12] Update requirements_all.txt --- requirements_all.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_all.txt b/requirements_all.txt index ec2b9612fa2bef..387b39794db8ab 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -430,7 +430,7 @@ enocean==0.50 enturclient==0.2.0 # homeassistant.components.environment_canada -env_canada==0.0.16 +env_canada==0.0.17 # homeassistant.components.envirophat # envirophat==0.0.6 From 900b4509d97bf82fd7f46a27813a6933eabb3230 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Sat, 6 Jul 2019 16:14:45 -0400 Subject: [PATCH 05/12] Set entity IDs separate from labels --- homeassistant/components/environment_canada/sensor.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index f6617d58319836..7e27bb87df4155 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -110,19 +110,22 @@ def __init__(self, sensor_type, ec_data, platform_name): """Initialize the sensor.""" self.sensor_type = sensor_type self.ec_data = ec_data - self.platform_name = platform_name self._state = None self._attr = None self._data = None self._name = None self._unit = None + if platform_name: + self.entity_id = 'sensor.' + '_'.join([platform_name, sensor_type]) + else: + self.entity_id = 'sensor.' + sensor_type + + @property def name(self): """Return the name of the sensor.""" - if self.platform_name is None: - return self._name - return ' '.join([self.platform_name, self._name]) + return self._name @property def state(self): From 042431edfb276873195a6efe9b92fa8746e1e6b6 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Sat, 6 Jul 2019 16:27:27 -0400 Subject: [PATCH 06/12] Flake error --- homeassistant/components/environment_canada/sensor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index 7e27bb87df4155..bed5ea98fbd2fc 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -121,7 +121,6 @@ def __init__(self, sensor_type, ec_data, platform_name): else: self.entity_id = 'sensor.' + sensor_type - @property def name(self): """Return the name of the sensor.""" From 73dde7999a7d3ca0fc30b4d7cca868743f7f3432 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Tue, 9 Jul 2019 21:32:19 -0400 Subject: [PATCH 07/12] Remove monitored conditions --- .../environment_canada/manifest.json | 2 +- .../components/environment_canada/sensor.py | 42 ++++--------------- .../components/environment_canada/weather.py | 4 +- requirements_all.txt | 2 +- 4 files changed, 12 insertions(+), 38 deletions(-) diff --git a/homeassistant/components/environment_canada/manifest.json b/homeassistant/components/environment_canada/manifest.json index a01eb59e19152b..42c419ba015358 100644 --- a/homeassistant/components/environment_canada/manifest.json +++ b/homeassistant/components/environment_canada/manifest.json @@ -3,7 +3,7 @@ "name": "Environment Canada", "documentation": "https://www.home-assistant.io/components/environment_canada", "requirements": [ - "env_canada==0.0.17" + "env_canada==0.0.18" ], "dependencies": [], "codeowners": [ diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index bed5ea98fbd2fc..ef9e28f865078c 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -12,8 +12,8 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( - CONF_MONITORED_CONDITIONS, TEMP_CELSIUS, CONF_NAME, CONF_LATITUDE, - CONF_LONGITUDE, ATTR_ATTRIBUTION, ATTR_LOCATION, ATTR_HIDDEN) + TEMP_CELSIUS, CONF_NAME, CONF_LATITUDE, CONF_LONGITUDE, ATTR_ATTRIBUTION, + ATTR_LOCATION, ATTR_HIDDEN) from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle import homeassistant.util.dt as dt @@ -32,32 +32,6 @@ MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=1) -SENSOR_TYPES = [ - 'temperature', - 'dewpoint', - 'wind_chill', - 'humidex', - 'pressure', - 'tendency', - 'humidity', - 'visibility', - 'condition', - 'wind_speed', - 'wind_gust', - 'wind_dir', - 'wind_bearing', - 'forecast_period', - 'text_summary', - 'high_temp', - 'low_temp', - 'pop', - 'warnings', - 'watches', - 'advisories', - 'statements', - 'endings' -] - def validate_station(station): """Check that the station ID is well-formed.""" @@ -69,8 +43,6 @@ def validate_station(station): PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Required(CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES)): - vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]), vol.Required(CONF_LANGUAGE, default='english'): vol.In(['english', 'french']), vol.Optional(CONF_NAME): cv.string, @@ -96,10 +68,11 @@ def setup_platform(hass, config, add_devices, discovery_info=None): hass.config.longitude), language=config.get(CONF_LANGUAGE)) + sensor_list = list(ec_data.conditions.keys()) + list(ec_data.alerts.keys()) add_devices([ECSensor(sensor_type, ec_data, config.get(CONF_NAME)) - for sensor_type in config[CONF_MONITORED_CONDITIONS]], + for sensor_type in sensor_list], True) @@ -148,6 +121,7 @@ def update(self): self.ec_data.conditions.update(self.ec_data.alerts) conditions = self.ec_data.conditions + metadata = self.ec_data.metadata sensor_data = conditions.get(self.sensor_type) self._attr = {} @@ -171,7 +145,7 @@ def update(self): else: self._unit = sensor_data.get('unit') - timestamp = self.ec_data.conditions.get('timestamp').get('value') + timestamp = metadata.get('timestamp') if timestamp: updated_utc = datetime.datetime.strptime(timestamp, '%Y%m%d%H%M%S') updated_local = dt.as_local(updated_utc).isoformat() @@ -183,7 +157,7 @@ def update(self): self._attr.update({ ATTR_ATTRIBUTION: CONF_ATTRIBUTION, ATTR_UPDATED: updated_local, - ATTR_LOCATION: conditions.get('location').get('value'), - ATTR_STATION: conditions.get('station').get('value'), + ATTR_LOCATION: metadata.get('location'), + ATTR_STATION: metadata.get('station'), ATTR_HIDDEN: hidden }) diff --git a/homeassistant/components/environment_canada/weather.py b/homeassistant/components/environment_canada/weather.py index ff5534aeb8a502..06b111ef13e8e5 100644 --- a/homeassistant/components/environment_canada/weather.py +++ b/homeassistant/components/environment_canada/weather.py @@ -96,7 +96,7 @@ def name(self): """Return the name of the weather entity.""" if self.platform_name: return self.platform_name - return self.ec_data.conditions.get('location').get('value') + return self.ec_data.metadata.get('location') @property def temperature(self): @@ -154,7 +154,7 @@ def condition(self): condition = self.ec_data.conditions.get('condition').get('value') if condition: return condition - return 'Condition not observed' + return '' @property def forecast(self): diff --git a/requirements_all.txt b/requirements_all.txt index 387b39794db8ab..3114b0f734bd06 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -430,7 +430,7 @@ enocean==0.50 enturclient==0.2.0 # homeassistant.components.environment_canada -env_canada==0.0.17 +env_canada==0.0.18 # homeassistant.components.envirophat # envirophat==0.0.6 From f5a5fe2ae8f4d0ecfecbe09e332235f71599466c Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Thu, 11 Jul 2019 23:43:28 -0400 Subject: [PATCH 08/12] Use next hourly forecast for missing conditions --- .../components/environment_canada/weather.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/environment_canada/weather.py b/homeassistant/components/environment_canada/weather.py index 06b111ef13e8e5..6aa672e2f20d0c 100644 --- a/homeassistant/components/environment_canada/weather.py +++ b/homeassistant/components/environment_canada/weather.py @@ -103,6 +103,8 @@ def temperature(self): """Return the temperature.""" if self.ec_data.conditions.get('temperature').get('value'): return float(self.ec_data.conditions['temperature']['value']) + if self.ec_data.hourly_forecasts[0].get('temperature'): + return float(self.ec_data.hourly_forecasts[0]['temperature']) return None @property @@ -148,12 +150,15 @@ def visibility(self): @property def condition(self): """Return the weather condition.""" - icon_code = self.ec_data.conditions.get('icon_code').get('value') + icon_code = None + + if self.ec_data.conditions.get('icon_code').get('value'): + icon_code = self.ec_data.conditions['icon_code']['value'] + elif self.ec_data.hourly_forecasts[0].get('icon_code'): + icon_code = self.ec_data.hourly_forecasts[0]['icon_code'] + if icon_code: return icon_code_to_condition(int(icon_code)) - condition = self.ec_data.conditions.get('condition').get('value') - if condition: - return condition return '' @property From 62aaa6bf0deae5e758566527d51ec1e278ed9906 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Fri, 12 Jul 2019 00:17:57 -0400 Subject: [PATCH 09/12] Switch sensors to unique_id --- .../components/environment_canada/sensor.py | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index ef9e28f865078c..eea10385872f39 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -12,7 +12,7 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( - TEMP_CELSIUS, CONF_NAME, CONF_LATITUDE, CONF_LONGITUDE, ATTR_ATTRIBUTION, + TEMP_CELSIUS, CONF_LATITUDE, CONF_LONGITUDE, ATTR_ATTRIBUTION, ATTR_LOCATION, ATTR_HIDDEN) from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -45,7 +45,6 @@ def validate_station(station): PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_LANGUAGE, default='english'): vol.In(['english', 'french']), - vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_STATION): validate_station, vol.Inclusive(CONF_LATITUDE, 'latlon'): cv.latitude, vol.Inclusive(CONF_LONGITUDE, 'latlon'): cv.longitude, @@ -70,8 +69,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): sensor_list = list(ec_data.conditions.keys()) + list(ec_data.alerts.keys()) add_devices([ECSensor(sensor_type, - ec_data, - config.get(CONF_NAME)) + ec_data) for sensor_type in sensor_list], True) @@ -79,20 +77,21 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class ECSensor(Entity): """Implementation of an Environment Canada sensor.""" - def __init__(self, sensor_type, ec_data, platform_name): + def __init__(self, sensor_type, ec_data): """Initialize the sensor.""" self.sensor_type = sensor_type self.ec_data = ec_data + + self._unique_id = None + self._name = None self._state = None self._attr = None - self._data = None - self._name = None self._unit = None - if platform_name: - self.entity_id = 'sensor.' + '_'.join([platform_name, sensor_type]) - else: - self.entity_id = 'sensor.' + sensor_type + @property + def unique_id(self) -> str: + """Return the unique ID of the sensor""" + return self._unique_id @property def name(self): @@ -124,6 +123,7 @@ def update(self): metadata = self.ec_data.metadata sensor_data = conditions.get(self.sensor_type) + self._unique_id = '-'.join([metadata['location'], self.sensor_type]) self._attr = {} self._name = sensor_data.get('label') value = sensor_data.get('value') @@ -152,7 +152,9 @@ def update(self): else: updated_local = None - hidden = bool(self._state is None or self._state == '') + hidden = bool(self._state is None or + self._state == '' or + self.sensor_type == 'icon_code') self._attr.update({ ATTR_ATTRIBUTION: CONF_ATTRIBUTION, From eb7085a8a1ef97af126d639040741ec800d6d8f6 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Fri, 12 Jul 2019 00:22:35 -0400 Subject: [PATCH 10/12] Flake error --- homeassistant/components/environment_canada/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index eea10385872f39..672cc0bc3587c7 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -90,7 +90,7 @@ def __init__(self, sensor_type, ec_data): @property def unique_id(self) -> str: - """Return the unique ID of the sensor""" + """Return the unique ID of the sensor.""" return self._unique_id @property From 505c5d6a89f05f2c25bbb5eb1f01d742d62a4239 Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Fri, 12 Jul 2019 20:34:20 -0400 Subject: [PATCH 11/12] Requested changes --- .../components/environment_canada/sensor.py | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index 672cc0bc3587c7..c9e3aa9829d0fd 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -4,7 +4,7 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.environment_canada/ """ -import datetime +from datetime import datetime, timedelta import logging import re @@ -13,10 +13,9 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import ( TEMP_CELSIUS, CONF_LATITUDE, CONF_LONGITUDE, ATTR_ATTRIBUTION, - ATTR_LOCATION, ATTR_HIDDEN) + ATTR_LOCATION) from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle -import homeassistant.util.dt as dt import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) @@ -30,7 +29,7 @@ CONF_STATION = 'station' CONF_LANGUAGE = 'language' -MIN_TIME_BETWEEN_UPDATES = datetime.timedelta(minutes=1) +MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1) def validate_station(station): @@ -51,7 +50,7 @@ def validate_station(station): }) -def setup_platform(hass, config, add_devices, discovery_info=None): +def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the Environment Canada sensor.""" from env_canada import ECData @@ -68,10 +67,11 @@ def setup_platform(hass, config, add_devices, discovery_info=None): language=config.get(CONF_LANGUAGE)) sensor_list = list(ec_data.conditions.keys()) + list(ec_data.alerts.keys()) - add_devices([ECSensor(sensor_type, - ec_data) - for sensor_type in sensor_list], - True) + sensor_list.remove('icon_code') + add_entities([ECSensor(sensor_type, + ec_data) + for sensor_type in sensor_list], + True) class ECSensor(Entity): @@ -123,7 +123,8 @@ def update(self): metadata = self.ec_data.metadata sensor_data = conditions.get(self.sensor_type) - self._unique_id = '-'.join([metadata['location'], self.sensor_type]) + self._unique_id = '{}-{}'.format(metadata['location'], + self.sensor_type) self._attr = {} self._name = sensor_data.get('label') value = sensor_data.get('value') @@ -147,19 +148,14 @@ def update(self): timestamp = metadata.get('timestamp') if timestamp: - updated_utc = datetime.datetime.strptime(timestamp, '%Y%m%d%H%M%S') - updated_local = dt.as_local(updated_utc).isoformat() + updated_utc = datetime.strptime(timestamp, + '%Y%m%d%H%M%S').isoformat() else: - updated_local = None - - hidden = bool(self._state is None or - self._state == '' or - self.sensor_type == 'icon_code') + updated_utc = None self._attr.update({ ATTR_ATTRIBUTION: CONF_ATTRIBUTION, - ATTR_UPDATED: updated_local, + ATTR_UPDATED: updated_utc, ATTR_LOCATION: metadata.get('location'), ATTR_STATION: metadata.get('station'), - ATTR_HIDDEN: hidden }) From 9ce3752daff68ac049061437b31cb9b7571a487e Mon Sep 17 00:00:00 2001 From: michaeldavie Date: Sat, 13 Jul 2019 08:03:54 -0400 Subject: [PATCH 12/12] Simplify setting location parameters --- homeassistant/components/environment_canada/camera.py | 10 +++------- homeassistant/components/environment_canada/sensor.py | 9 +++------ homeassistant/components/environment_canada/weather.py | 8 +++----- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/environment_canada/camera.py b/homeassistant/components/environment_canada/camera.py index 18a88129e1dd01..7a42c770841cf2 100755 --- a/homeassistant/components/environment_canada/camera.py +++ b/homeassistant/components/environment_canada/camera.py @@ -45,14 +45,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if config.get(CONF_STATION): radar_object = ECRadar(station_id=config[CONF_STATION], precip_type=config.get(CONF_PRECIP_TYPE)) - elif config.get(CONF_LATITUDE) and config.get(CONF_LONGITUDE): - radar_object = ECRadar(coordinates=(config[CONF_LATITUDE], - config[CONF_LONGITUDE]), - precip_type=config.get(CONF_PRECIP_TYPE)) else: - radar_object = ECRadar(coordinates=(hass.config.latitude, - hass.config.longitude), - precip_type=config.get(CONF_PRECIP_TYPE)) + lat = config.get(CONF_LATITUDE, hass.config.latitude) + lon = config.get(CONF_LONGITUDE, hass.config.longitude) + radar_object = ECRadar(coordinates=(lat, lon)) add_devices([ECCamera(radar_object, config.get(CONF_NAME))], True) diff --git a/homeassistant/components/environment_canada/sensor.py b/homeassistant/components/environment_canada/sensor.py index c9e3aa9829d0fd..9bfb205f4e54c8 100755 --- a/homeassistant/components/environment_canada/sensor.py +++ b/homeassistant/components/environment_canada/sensor.py @@ -57,13 +57,10 @@ def setup_platform(hass, config, add_entities, discovery_info=None): if config.get(CONF_STATION): ec_data = ECData(station_id=config[CONF_STATION], language=config.get(CONF_LANGUAGE)) - elif config.get(CONF_LATITUDE) and config.get(CONF_LONGITUDE): - ec_data = ECData(coordinates=(config[CONF_LATITUDE], - config[CONF_LONGITUDE]), - language=config.get(CONF_LANGUAGE)) else: - ec_data = ECData(coordinates=(hass.config.latitude, - hass.config.longitude), + lat = config.get(CONF_LATITUDE, hass.config.latitude) + lon = config.get(CONF_LONGITUDE, hass.config.longitude) + ec_data = ECData(coordinates=(lat, lon), language=config.get(CONF_LANGUAGE)) sensor_list = list(ec_data.conditions.keys()) + list(ec_data.alerts.keys()) diff --git a/homeassistant/components/environment_canada/weather.py b/homeassistant/components/environment_canada/weather.py index 6aa672e2f20d0c..0be659138fbad9 100644 --- a/homeassistant/components/environment_canada/weather.py +++ b/homeassistant/components/environment_canada/weather.py @@ -67,12 +67,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Environment Canada weather.""" if config.get(CONF_STATION): ec_data = ECData(station_id=config[CONF_STATION]) - elif config.get(CONF_LATITUDE) and config.get(CONF_LONGITUDE): - ec_data = ECData(coordinates=(config[CONF_LATITUDE], - config[CONF_LONGITUDE])) else: - ec_data = ECData(coordinates=(hass.config.latitude, - hass.config.longitude)) + lat = config.get(CONF_LATITUDE, hass.config.latitude) + lon = config.get(CONF_LONGITUDE, hass.config.longitude) + ec_data = ECData(coordinates=(lat, lon)) add_devices([ECWeather(ec_data, config)])