From 4fb1937f659e6cfcc29ff99bed60bdd854cdbc20 Mon Sep 17 00:00:00 2001 From: Farid Date: Wed, 24 Jul 2019 01:14:41 +0200 Subject: [PATCH] Suez water (#23844) * Add suez water sensor * flake8 test * pylint test * edition to fix flake8 and pylint issues * edition to be okay with the musts * Added a blank line to __init.py__ for flake8 * added blank line for flake8 * changer scan interval from 10 to 720 minutes * use of pysuez * bug fix and isort * use of pysuez * fixed flake8 and pylint errors * update requirements_all.txt * added a method to test login/password befire adding device * flake8 edition * update requirements_all.txt * add of .coveragerc file with untested files * update of .coveragerc * Update homeassistant/components/suez_water/__init__.py Co-Authored-By: Fabian Affolter * Update homeassistant/components/suez_water/sensor.py Co-Authored-By: Fabian Affolter * Update homeassistant/components/suez_water/sensor.py Co-Authored-By: Fabian Affolter * Update homeassistant/components/suez_water/sensor.py Co-Authored-By: Fabian Affolter * Update homeassistant/components/suez_water/sensor.py Co-Authored-By: Fabian Affolter * Update homeassistant/components/suez_water/sensor.py Co-Authored-By: Fabian Affolter * bug fix in check credentials * flake8 and pylint fixes * fix codeowner * update requirements_all.txt * Sorted suez_water line * edition to answer comments from @MartinHjelmare on #23844 * Attribute keys formatting to lowercase snakecase, name and icon constants returned directly, and remove of attribute. Update of . * pylint edition * correction wrong keys in client attributes * remove of unnedeed return and move add_entities --- .coveragerc | 1 + CODEOWNERS | 1 + .../components/suez_water/__init__.py | 1 + .../components/suez_water/manifest.json | 8 ++ homeassistant/components/suez_water/sensor.py | 128 ++++++++++++++++++ requirements_all.txt | 3 + 6 files changed, 142 insertions(+) create mode 100644 homeassistant/components/suez_water/__init__.py create mode 100644 homeassistant/components/suez_water/manifest.json create mode 100644 homeassistant/components/suez_water/sensor.py diff --git a/.coveragerc b/.coveragerc index e5a969bdf23..ac3baed48b0 100644 --- a/.coveragerc +++ b/.coveragerc @@ -590,6 +590,7 @@ omit = homeassistant/components/stiebel_eltron/* homeassistant/components/streamlabswater/* homeassistant/components/stride/notify.py + homeassistant/components/suez_water/* homeassistant/components/supervisord/sensor.py homeassistant/components/swiss_hydrological_data/sensor.py homeassistant/components/swiss_public_transport/sensor.py diff --git a/CODEOWNERS b/CODEOWNERS index d04610b8e51..7acd04ea366 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -247,6 +247,7 @@ homeassistant/components/sql/* @dgomes homeassistant/components/statistics/* @fabaff homeassistant/components/stiebel_eltron/* @fucm homeassistant/components/stream/* @hunterjm +homeassistant/components/suez_water/* @ooii homeassistant/components/sun/* @Swamp-Ig homeassistant/components/supla/* @mwegrzynek homeassistant/components/swiss_hydrological_data/* @fabaff diff --git a/homeassistant/components/suez_water/__init__.py b/homeassistant/components/suez_water/__init__.py new file mode 100644 index 00000000000..a2d07a8d0a4 --- /dev/null +++ b/homeassistant/components/suez_water/__init__.py @@ -0,0 +1 @@ +"""France Suez Water integration.""" diff --git a/homeassistant/components/suez_water/manifest.json b/homeassistant/components/suez_water/manifest.json new file mode 100644 index 00000000000..8ee3de2d77f --- /dev/null +++ b/homeassistant/components/suez_water/manifest.json @@ -0,0 +1,8 @@ +{ + "domain": "suez_water", + "name": "Suez Water Consumption Sensor", + "documentation": "https://www.home-assistant.io/components/suez_water", + "dependencies": [], + "codeowners": ["@ooii"], + "requirements": ["pysuez==0.1.17"] +} diff --git a/homeassistant/components/suez_water/sensor.py b/homeassistant/components/suez_water/sensor.py new file mode 100644 index 00000000000..cc6db4290e5 --- /dev/null +++ b/homeassistant/components/suez_water/sensor.py @@ -0,0 +1,128 @@ +"""Sensor for Suez Water Consumption data.""" +from datetime import timedelta +import logging + +import voluptuous as vol + +from pysuez.client import PySuezError +from pysuez import SuezClient + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, VOLUME_LITERS +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import Entity + +_LOGGER = logging.getLogger(__name__) +CONF_COUNTER_ID = 'counter_id' + +SCAN_INTERVAL = timedelta(hours=12) + +COMPONENT_ICON = 'mdi:water-pump' +COMPONENT_NAME = "Suez Water Client" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + vol.Required(CONF_COUNTER_ID): cv.string, +}) + + +def setup_platform(hass, config, add_entities, discovery_info=None): + """Set up the sensor platform.""" + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + counter_id = config[CONF_COUNTER_ID] + try: + client = SuezClient( + username, password, counter_id) + + if not client.check_credentials(): + _LOGGER.warning("Wrong username and/or password") + return + + except PySuezError: + _LOGGER.warning("Unable to create Suez Client") + return + + add_entities([SuezSensor(client)], True) + + +class SuezSensor(Entity): + """Representation of a Sensor.""" + + def __init__(self, client): + """Initialize the data object.""" + self._attributes = {} + self._state = None + self._available = None + self.client = client + + @property + def name(self): + """Return the name of the sensor.""" + return COMPONENT_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.""" + return VOLUME_LITERS + + @property + def device_state_attributes(self): + """Return the state attributes.""" + return self._attributes + + @property + def icon(self): + """Return the icon of the sensor.""" + return COMPONENT_ICON + + def _fetch_data(self): + """Fetch latest data from Suez.""" + try: + self.client.update() + # _state holds the volume of consumed water during previous day + self._state = self.client.state + self._available = True + self._attributes[ + 'attribution'] = self.client.attributes[ + 'attribution'] + self._attributes['this_month_consumption'] = {} + for item in self.client.attributes['thisMonthConsumption']: + self._attributes['this_month_consumption'][ + item] = self.client.attributes[ + 'thisMonthConsumption'][item] + self._attributes['previous_month_consumption'] = {} + for item in self.client.attributes['previousMonthConsumption']: + self._attributes['previous_month_consumption'][ + item] = self.client.attributes[ + 'previousMonthConsumption'][item] + self._attributes[ + 'highest_monthly_consumption'] = self.client.attributes[ + 'highestMonthlyConsumption'] + self._attributes[ + 'last_year_overall'] = self.client.attributes[ + 'lastYearOverAll'] + self._attributes[ + 'this_year_overall'] = self.client.attributes[ + 'thisYearOverAll'] + self._attributes['history'] = {} + for item in self.client.attributes['history']: + self._attributes[ + 'history'][item] = self.client.attributes[ + 'history'][item] + + except PySuezError: + self._available = False + _LOGGER.warning("Unable to fetch data") + + def update(self): + """Return the latest collected data from Linky.""" + self._fetch_data() + _LOGGER.debug( + "Suez data state is: %s.", self._state) diff --git a/requirements_all.txt b/requirements_all.txt index ec907210152..b66d1999a0d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1401,6 +1401,9 @@ pystiebeleltron==0.0.1.dev2 # homeassistant.components.stride pystride==0.1.7 +# homeassistant.components.suez_water +pysuez==0.1.17 + # homeassistant.components.supla pysupla==0.0.3