diff --git a/.coveragerc b/.coveragerc index 94722666c05b6904622fb07dca4a6f7691609e60..cf7a5a2cd9c3a60cbea56295ce8c5284b2bb4c01 100644 --- a/.coveragerc +++ b/.coveragerc @@ -640,6 +640,7 @@ omit = homeassistant/components/sensor/plex.py homeassistant/components/sensor/pocketcasts.py homeassistant/components/sensor/pollen.py + homeassistant/components/sensor/postnl.py homeassistant/components/sensor/pushbullet.py homeassistant/components/sensor/pvoutput.py homeassistant/components/sensor/pyload.py diff --git a/homeassistant/components/sensor/postnl.py b/homeassistant/components/sensor/postnl.py new file mode 100644 index 0000000000000000000000000000000000000000..c38f58b791611c57772944d359c24c45dcd36a76 --- /dev/null +++ b/homeassistant/components/sensor/postnl.py @@ -0,0 +1,110 @@ +""" +Sensor for PostNL packages. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.postnl/ +""" +from datetime import timedelta +import logging + +import voluptuous as vol + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import ( + ATTR_ATTRIBUTION, CONF_NAME, CONF_PASSWORD, CONF_USERNAME) +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import Entity +from homeassistant.util import Throttle + +REQUIREMENTS = ['postnl_api==1.0.1'] + +_LOGGER = logging.getLogger(__name__) + +ATTRIBUTION = 'Information provided by PostNL' + +DEFAULT_NAME = 'postnl' + +ICON = 'mdi:package-variant-closed' + +MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=30) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the PostNL sensor platform.""" + from postnl_api import PostNL_API, UnauthorizedException + + username = config.get(CONF_USERNAME) + password = config.get(CONF_PASSWORD) + name = config.get(CONF_NAME) + + try: + api = PostNL_API(username, password) + + except UnauthorizedException: + _LOGGER.exception("Can't connect to the PostNL webservice") + return + + add_devices([PostNLSensor(api, name)], True) + + +class PostNLSensor(Entity): + """Representation of a PostNL sensor.""" + + def __init__(self, api, name): + """Initialize the PostNL sensor.""" + self._name = name + self._attributes = None + self._state = None + self._api = api + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + @property + def unit_of_measurement(self): + """Return the unit of measurement of this entity, if any.""" + return 'package(s)' + + @property + def device_state_attributes(self): + """Return the state attributes.""" + return self._attributes + + @property + def icon(self): + """Icon to use in the frontend.""" + return ICON + + @Throttle(MIN_TIME_BETWEEN_UPDATES) + def update(self): + """Update device state.""" + shipments = self._api.get_relevant_shipments() + status_counts = {} + + for shipment in shipments: + status = shipment['status']['formatted']['short'] + status = self._api.parse_datetime(status, '%d-%m-%Y', '%H:%M') + + name = shipment['settings']['title'] + status_counts[name] = status + + self._attributes = { + ATTR_ATTRIBUTION: ATTRIBUTION, + **status_counts + } + + self._state = len(status_counts) diff --git a/requirements_all.txt b/requirements_all.txt index 16f6001d576a3b6bee29f1febec16b4d55591ca8..1283011d7ac61cd3d57659d983752881012a41a2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -632,6 +632,9 @@ pmsensor==0.4 # homeassistant.components.sensor.pocketcasts pocketcasts==0.1 +# homeassistant.components.sensor.postnl +postnl_api==1.0.1 + # homeassistant.components.climate.proliphix proliphix==0.4.1