diff --git a/.coveragerc b/.coveragerc index ac97522450f7bf861cd3dc0802b3c71b04a98161..51ca1df2c1f338616533da55473e5e4eda8e7136 100644 --- a/.coveragerc +++ b/.coveragerc @@ -133,6 +133,7 @@ omit = homeassistant/components/binary_sensor/concord232.py homeassistant/components/binary_sensor/flic.py homeassistant/components/binary_sensor/hikvision.py + homeassistant/components/binary_sensor/iss.py homeassistant/components/binary_sensor/rest.py homeassistant/components/browser.py homeassistant/components/camera/amcrest.py @@ -303,7 +304,6 @@ omit = homeassistant/components/sensor/hddtemp.py homeassistant/components/sensor/hp_ilo.py homeassistant/components/sensor/hydroquebec.py - homeassistant/components/sensor/iss.py homeassistant/components/sensor/imap.py homeassistant/components/sensor/imap_email_content.py homeassistant/components/sensor/influxdb.py diff --git a/homeassistant/components/sensor/iss.py b/homeassistant/components/binary_sensor/iss.py similarity index 56% rename from homeassistant/components/sensor/iss.py rename to homeassistant/components/binary_sensor/iss.py index 6d9cf4b71069093d6bcc0f0bedf62e421d85d7bb..b4182557878cb1f10a3520765a53b9d73190ecbc 100644 --- a/homeassistant/components/sensor/iss.py +++ b/homeassistant/components/binary_sensor/iss.py @@ -5,34 +5,39 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.iss/ """ import logging -from datetime import timedelta, datetime +from datetime import timedelta + import requests import voluptuous as vol -from homeassistant.util import Throttle -from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import (CONF_NAME) -from homeassistant.helpers.entity import Entity + import homeassistant.helpers.config_validation as cv +from homeassistant.components.binary_sensor import ( + BinarySensorDevice, PLATFORM_SCHEMA) +from homeassistant.const import (CONF_NAME, ATTR_LONGITUDE, ATTR_LATITUDE) +from homeassistant.util import Throttle REQUIREMENTS = ['pyiss==1.0.1'] _LOGGER = logging.getLogger(__name__) -ATTR_ISS_VISIBLE = 'visible' ATTR_ISS_NEXT_RISE = 'next_rise' ATTR_ISS_NUMBER_PEOPLE_SPACE = 'number_of_people_in_space' +CONF_SHOW_ON_MAP = 'show_on_map' + DEFAULT_NAME = 'ISS' +DEFAULT_SENSOR_CLASS = 'visible' + MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_SHOW_ON_MAP, default=False): cv.boolean, }) def setup_platform(hass, config, add_devices, discovery_info=None): - """Setup the ISS sensor.""" - # Validate the configuration + """Set up the ISS sensor.""" if None in (hass.config.latitude, hass.config.longitude): _LOGGER.error("Latitude or longitude not set in Home Assistant config") return False @@ -45,75 +50,74 @@ def setup_platform(hass, config, add_devices, discovery_info=None): return False name = config.get(CONF_NAME) + show_on_map = config.get(CONF_SHOW_ON_MAP) - sensors = [] - sensors.append(IssSensor(iss_data, name)) - - add_devices(sensors, True) + add_devices([IssBinarySensor(iss_data, name, show_on_map)], True) -class IssSensor(Entity): - """Implementation of a ISS sensor.""" +class IssBinarySensor(BinarySensorDevice): + """Implementation of the ISS binary sensor.""" - def __init__(self, iss_data, name): + def __init__(self, iss_data, name, show): """Initialize the sensor.""" self.iss_data = iss_data self._state = None - self._attributes = {} - self._client_name = name - self._name = ATTR_ISS_VISIBLE - self._unit_of_measurement = None - self._icon = 'mdi:eye' + self._name = name + self._show_on_map = show + self.update() @property def name(self): """Return the name of the sensor.""" - return '{} {}'.format(self._client_name, self._name) + return self._name @property - def state(self): - """Return the state of the sensor.""" - return self._state + def is_on(self): + """Return true if the binary sensor is on.""" + return self.iss_data.is_above if self.iss_data else False @property - def device_state_attributes(self): - """Return the state attributes.""" - return self._attributes - - @property - def unit_of_measurement(self): - """Return the unit of measurement of this entity, if any.""" - return self._unit_of_measurement + def sensor_class(self): + """Return the class of this sensor.""" + return DEFAULT_SENSOR_CLASS @property - def icon(self): - """Icon to use in the frontend, if any.""" - return self._icon + def device_state_attributes(self): + """Return the state attributes.""" + if self.iss_data: + attrs = { + ATTR_ISS_NUMBER_PEOPLE_SPACE: + self.iss_data.number_of_people_in_space, + ATTR_ISS_NEXT_RISE: self.iss_data.next_rise, + } + if self._show_on_map: + attrs[ATTR_LONGITUDE] = self.iss_data.position.get('longitude') + attrs[ATTR_LATITUDE] = self.iss_data.position.get('latitude') + else: + attrs['long'] = self.iss_data.position.get('longitude') + attrs['lat'] = self.iss_data.position.get('latitude') + return attrs def update(self): """Get the latest data from ISS API and updates the states.""" - self._state = self.iss_data.is_above - - self._attributes[ATTR_ISS_NUMBER_PEOPLE_SPACE] = \ - self.iss_data.number_of_people_in_space - delta = self.iss_data.next_rise - datetime.utcnow() - self._attributes[ATTR_ISS_NEXT_RISE] = int(delta.total_seconds() / 60) + self.iss_data.update() class IssData(object): - """Get data from the ISS.""" + """Get data from the ISS API.""" def __init__(self, latitude, longitude): """Initialize the data object.""" self.is_above = None self.next_rise = None self.number_of_people_in_space = None + self.position = None self.latitude = latitude self.longitude = longitude @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): - """Get the latest data from the ISS.""" + """Get the latest data from the ISS API.""" import pyiss try: @@ -121,7 +125,7 @@ class IssData(object): self.is_above = iss.is_ISS_above(self.latitude, self.longitude) self.next_rise = iss.next_rise(self.latitude, self.longitude) self.number_of_people_in_space = iss.number_of_people_in_space() - _LOGGER.error(self.next_rise.tzinfo) + self.position = iss.current_location() except requests.exceptions.HTTPError as error: _LOGGER.error(error) return False diff --git a/requirements_all.txt b/requirements_all.txt index 7ba42c209f452957817dfd62f8a5105677fe27fc..bd86bd9e38f524b052d6dbdf7679b58ce13ff46b 100755 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -443,7 +443,7 @@ pyhomematic==0.1.20 # homeassistant.components.device_tracker.icloud pyicloud==0.9.1 -# homeassistant.components.sensor.iss +# homeassistant.components.binary_sensor.iss pyiss==1.0.1 # homeassistant.components.sensor.lastfm