From 3d4f2926e9de9d85deab3a6f084bc552e4a9a5d9 Mon Sep 17 00:00:00 2001 From: Eliseo Martelli Date: Sun, 27 Jan 2019 21:44:19 +0100 Subject: [PATCH] Add Iliad Italy (Mobile Telephony Provider) Sensor (#19645) * working state * Attrs * > requirements generated * linting * fixes * coveragerc * ordered imports and fixed auth * Added Throttle * moved throttle to decorator * remove scan interval * lower throttle * moved to scan interval * Add attribution --- .coveragerc | 1 + .../components/sensor/iliad_italy.py | 119 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 123 insertions(+) create mode 100644 homeassistant/components/sensor/iliad_italy.py diff --git a/.coveragerc b/.coveragerc index a4b27469039..2d4fb3f81a7 100644 --- a/.coveragerc +++ b/.coveragerc @@ -793,6 +793,7 @@ omit = homeassistant/components/sensor/hp_ilo.py homeassistant/components/sensor/htu21d.py homeassistant/components/sensor/upnp.py + homeassistant/components/sensor/iliad_italy.py homeassistant/components/sensor/imap_email_content.py homeassistant/components/sensor/imap.py homeassistant/components/sensor/influxdb.py diff --git a/homeassistant/components/sensor/iliad_italy.py b/homeassistant/components/sensor/iliad_italy.py new file mode 100644 index 00000000000..1e1e5077e80 --- /dev/null +++ b/homeassistant/components/sensor/iliad_italy.py @@ -0,0 +1,119 @@ +""" +Sensor to get Iliad Italy personal data. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.iliad_italy/ +""" +from datetime import timedelta +import logging + +import voluptuous as vol + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import ATTR_ATTRIBUTION, CONF_PASSWORD, CONF_USERNAME +from homeassistant.helpers.aiohttp_client import async_get_clientsession +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import Entity +import homeassistant.util.dt as dt_util + +REQUIREMENTS = ['aioiliad==0.1.1'] + +_LOGGER = logging.getLogger(__name__) + +ATTRIBUTION = "Data provided by Iliad Italy" + +ICON = 'mdi:phone' + +SCAN_INTERVAL = timedelta(minutes=10) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, +}) + + +async def async_setup_platform( + hass, conf, async_add_entities, discovery_info=None): + """Set up the Iliad Italy sensor platform.""" + from aioiliad import Iliad + iliad = Iliad(conf[CONF_USERNAME], conf[CONF_PASSWORD], + async_get_clientsession(hass), hass.loop) + await iliad.login() + + if not iliad.is_logged_in(): + _LOGGER.error("Check username and password") + return + + async_add_entities([IliadSensor(iliad)], True) + + +class IliadSensor(Entity): + """Representation of a Iliad Italy Sensor.""" + + def __init__(self, iliad): + """Initialize the Iliad Italy sensor.""" + from aioiliad.IliadData import IliadData + self._iliad = iliad + self._iliaddata = IliadData(self._iliad) + self._data = None + self._state = None + + @property + def name(self): + """Return the name of the sensor.""" + return "Iliad {}".format(self._data['info']['utente']) + + @property + def icon(self): + """Return the icon of the sensor.""" + return ICON + + @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 the sensor.""" + return '€' + + @property + def device_state_attributes(self): + """Return the state attributes of the sensor.""" + attr = { + ATTR_ATTRIBUTION: ATTRIBUTION, + 'next_renewal': + dt_util.utc_from_timestamp( + self._data['info']['rinnovo']).isoformat(), + 'italy_sent_sms': self._data['italy']['sms'], + 'italy_over_plan_sms': self._data['italy']['sms_extra'], + 'italy_sent_mms': self._data['italy']['mms'], + 'italy_over_plan_mms': self._data['italy']['mms_extra'], + 'italy_calls_seconds': self._data['italy']['chiamate'], + 'italy_over_plan_calls': self._data['italy']['chiamate_extra'], + 'italy_data': self._data['italy']['internet'], + 'italy_data_max': self._data['italy']['internet_max'], + 'italy_data_over_plan': self._data['italy']['internet_over'], + + 'abroad_sent_sms': self._data['estero']['sms'], + 'abroad_over_plan_sms': self._data['estero']['sms_extra'], + 'abroad_sent_mms': self._data['estero']['mms'], + 'abroad_over_plan_mms': self._data['estero']['mms_extra'], + 'abroad_calls_seconds': self._data['estero']['chiamate'], + 'abroad_over_plan_calls': self._data['estero']['chiamate_extra'], + 'abroad_data': self._data['estero']['internet'], + 'abroad_data_max': self._data['estero']['internet_max'], + 'abroad_data_over_plan': self._data['estero']['internet_over'], + } + return attr + + async def async_update(self): + """Update device state.""" + await self._iliaddata.update() + self._data = { + 'italy': self._iliaddata.get_italy(), + 'estero': self._iliaddata.get_estero(), + 'info': self._iliaddata.get_general_info() + } + self._state = self._data['info']['credito'].replace('€', '') diff --git a/requirements_all.txt b/requirements_all.txt index 9732bc8f0b9..32ce1905320 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -114,6 +114,9 @@ aiohttp_cors==0.7.0 # homeassistant.components.hue aiohue==1.8.0 +# homeassistant.components.sensor.iliad_italy +aioiliad==0.1.1 + # homeassistant.components.sensor.imap aioimaplib==0.7.13