""" homeassistant.components.sensor.neurio_energy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Monitors home energy use as measured by an neurio hub using its official API. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.neurio_energy/ """ import logging import requests.exceptions from homeassistant.helpers.entity import Entity REQUIREMENTS = ['neurio==0.2.10'] _LOGGER = logging.getLogger(__name__) ICON = 'mdi:flash' def setup_platform(hass, config, add_devices, discovery_info=None): """ Sets up the Neurio sensor. """ api_key = config.get("api_key") api_secret = config.get("api_secret") sensor_id = config.get("sensor_id") if not api_key and not api_secret: _LOGGER.error( "Configuration Error" "Please make sure you have configured your api key and api secret") return None if not sensor_id: import neurio neurio_tp = neurio.TokenProvider(key=api_key, secret=api_secret) neurio_client = neurio.Client(token_provider=neurio_tp) user_info = neurio_client.get_user_information() _LOGGER.warning('Sensor ID auto-detected, set api_sensor_id: "%s"', user_info["locations"][0]["sensors"][0]["sensorId"]) sensor_id = user_info["locations"][0]["sensors"][0]["sensorId"] dev = [] dev.append(NeurioEnergy(api_key, api_secret, sensor_id)) add_devices(dev) # pylint: disable=too-many-instance-attributes class NeurioEnergy(Entity): """ Implements an Neurio energy. """ # pylint: disable=too-many-arguments def __init__(self, api_key, api_secret, sensor_id): self._name = "Energy Usage" self.api_key = api_key self.api_secret = api_secret self.sensor_id = sensor_id self._state = None self._unit_of_measurement = "W" @property def name(self): """ Returns the name. """ return self._name @property def state(self): """ Returns the state of the device. """ return self._state @property def unit_of_measurement(self): """ Unit of measurement of this entity, if any. """ return self._unit_of_measurement @property def icon(self): """ Icon to use in the frontend, if any. """ return ICON def update(self): """ Gets the Neurio monitor data from the web service. """ import neurio try: neurio_tp = neurio.TokenProvider(key=self.api_key, secret=self.api_secret) neurio_client = neurio.Client(token_provider=neurio_tp) sample = neurio_client.get_samples_live_last( sensor_id=self.sensor_id) self._state = sample['consumptionPower'] except (requests.exceptions.RequestException, ValueError): _LOGGER.warning('Could not update status for %s', self.name)