From 76ff934bd34cb04cf3a028add2a7d6bb572b565f Mon Sep 17 00:00:00 2001
From: Fabian Affolter <mail@fabian-affolter.ch>
Date: Tue, 6 Dec 2016 15:49:59 +0100
Subject: [PATCH] Move details to docs, update doc strings, and use consts
 (#4777)

---
 homeassistant/components/sensor/zamg.py | 145 +++++++-----------------
 1 file changed, 38 insertions(+), 107 deletions(-)

diff --git a/homeassistant/components/sensor/zamg.py b/homeassistant/components/sensor/zamg.py
index d3d64690ef6..6bb9dd0748d 100644
--- a/homeassistant/components/sensor/zamg.py
+++ b/homeassistant/components/sensor/zamg.py
@@ -1,81 +1,38 @@
 """
 Sensor for data from Austrian "Zentralanstalt für Meteorologie und Geodynamik".
 
-This is a sensor for the Austrian weather service "Zentralanstalt für
-Meteorologie und Geodynamik" (aka ZAMG).
-
-The configuration should look like this:
-
-    - platform: zamg
-      station_id: 11035
-      monitored_conditions:
-        - temperature
-        - humidity
-        - pressure
-        - wind_speed
-        - precipitation
-
-Recognised conditions are:
-
-    pressure (Pressure at station level)
-    pressure_sealevel (Pressure at Sea Level)
-    humidity (Humidity)
-    wind_speed (Wind Speed)
-    wind_bearing (Wind Bearing)
-    wind_max_speed (Top Wind Speed)
-    wind_max_bearing (Top Wind Bearing)
-    sun_last_hour (Sun Last Hour Percentage)
-    temperature (Temperature)
-    precipitation (Precipitation)
-    dewpoint (Dew Point)
-
-The following stations are available in the data set:
-
-    11010   Linz/Hörsching
-    11012   Kremsmünster
-    11022   Retz
-    11035   Wien/Hohe Warte
-    11036   Wien/Schwechat
-    11101   Bregenz
-    11121   Innsbruck
-    11126   Patscherkofel
-    11130   Kufstein
-    11150   Salzburg
-    11155   Feuerkogel
-    11157   Aigen im Ennstal
-    11171   Mariazell
-    11190   Eisenstadt
-    11204   Lienz
+For more details about this platform, please refer to the documentation at
+https://home-assistant.io/components/sensor.zamg/
 """
-
 import csv
-from datetime import timedelta
 import logging
-import requests
+from datetime import timedelta
 
+import requests
 import voluptuous as vol
 
-from homeassistant.components.weather import (
-    ATTR_WEATHER_HUMIDITY, ATTR_WEATHER_ATTRIBUTION,
-    ATTR_WEATHER_PRESSURE, ATTR_WEATHER_TEMPERATURE,
-    ATTR_WEATHER_WIND_BEARING, ATTR_WEATHER_WIND_SPEED,
-)
 import homeassistant.helpers.config_validation as cv
+from homeassistant.components.weather import (
+    ATTR_WEATHER_HUMIDITY, ATTR_WEATHER_ATTRIBUTION, ATTR_WEATHER_PRESSURE,
+    ATTR_WEATHER_TEMPERATURE, ATTR_WEATHER_WIND_BEARING,
+    ATTR_WEATHER_WIND_SPEED)
 from homeassistant.const import (
-    CONF_MONITORED_CONDITIONS, CONF_NAME, __version__
-)
+    CONF_MONITORED_CONDITIONS, CONF_NAME, __version__)
 from homeassistant.helpers.entity import Entity
 from homeassistant.util import Throttle
 
-DEFAULT_NAME = 'zamg'
+ATTR_STATION = 'station'
+ATTR_UPDATED = 'updated'
 ATTRIBUTION = 'Data provided by ZAMG'
 
-# Data source only updates once per hour, so throttle to 30min to have
+CONF_STATION_ID = 'station_id'
+
+DEFAULT_NAME = 'zamg'
+
+# Data source only updates once per hour, so throttle to 30 min to have
 # reasonably recent data
 MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=30)
 
-CONF_STATION_ID = "station_id"
-
 VALID_STATION_IDS = (
     '11010', '11012', '11022', '11035', '11036', '11101', '11121', '11126',
     '11130', '11150', '11155', '11157', '11171', '11190', '11204'
@@ -102,41 +59,37 @@ SENSOR_TYPES = {
 }
 
 PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({
-    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
-    vol.Required(CONF_STATION_ID):
-        vol.All(cv.string, vol.In(VALID_STATION_IDS)),
     vol.Required(CONF_MONITORED_CONDITIONS):
         vol.All(cv.ensure_list, [vol.In(SENSOR_TYPES)]),
+    vol.Required(CONF_STATION_ID):
+        vol.All(cv.string, vol.In(VALID_STATION_IDS)),
+    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
 })
 
 
 def setup_platform(hass, config, add_devices, discovery_info=None):
-    """Setup platform."""
+    """Set up the ZAMG sensor platform."""
     station_id = config.get(CONF_STATION_ID)
     name = config.get(CONF_NAME)
 
     logger = logging.getLogger(__name__)
     probe = ZamgData(station_id=station_id, logger=logger)
 
-    sensors = [ZAMGWeather(probe, variable, name)
+    sensors = [ZamgSensor(probe, variable, name)
                for variable in config[CONF_MONITORED_CONDITIONS]]
 
     add_devices(sensors, True)
 
 
-class ZAMGWeather(Entity):
-    """
-    I am a weather wrapper for a specific station and a specific attribute.
-
-    Multiple instances (one for each condition) will refer to the same
-    probe, so things will only get fetched once.
-    """
+class ZamgSensor(Entity):
+    """Implementation of a ZAMG sensor."""
 
     def __init__(self, probe, variable, name):
-        """Init condition sensor."""
+        """Initialize the sensor."""
         self.probe = probe
         self.client_name = name
         self.variable = variable
+        self.update()
 
     def update(self):
         """Delegate update to probe."""
@@ -144,17 +97,17 @@ class ZAMGWeather(Entity):
 
     @property
     def name(self):
-        """Build name of sensor."""
+        """Return the name of the sensor."""
         return '{} {}'.format(self.client_name, self.variable)
 
     @property
     def state(self):
-        """Return state."""
+        """Return the state of the sensor."""
         return self.probe.get_data(self.variable)
 
     @property
     def unit_of_measurement(self):
-        """Unit of measurement."""
+        """Return the unit of measurement of this entity, if any."""
         return SENSOR_TYPES[self.variable][1]
 
     @property
@@ -162,38 +115,22 @@ class ZAMGWeather(Entity):
         """Return the state attributes."""
         return {
             ATTR_WEATHER_ATTRIBUTION: ATTRIBUTION,
-            "station": self.probe.get_data('station_name'),
-            "updated": "%s %s" % (self.probe.get_data('update_date'),
-                                  self.probe.get_data('update_time'))
+            ATTR_STATION: self.probe.get_data('station_name'),
+            ATTR_UPDATED: '{} {}'.format(self.probe.get_data('update_date'),
+                                         self.probe.get_data('update_time')),
         }
 
 
 class ZamgData(object):
-    """
-    I represent weather data for a specific site.
-
-    From the web site:
-
-    Sie beinhalten neben Stationsnummer, Stationsname, Seehöhe der Station,
-    Messdatum und Messzeit (Lokalzeit) die meteorologischen Messwerte von
-    Temperatur, Taupunkt, relative Luftfeuchtigkeit, Richtung und
-    Geschwindigkeit des Windmittels und der Windspitze, Niederschlagssumme
-    der letzten Stunde, Luftdruck reduziert auf Meeresniveau und Luftdruck
-    auf Stationsniveau sowie die Sonnenscheindauer der letzten Stunde (in
-    Prozent). Die Messstationen, die diese Daten liefern, sind über das
-    Bundesgebiet verteilt und beinhalten alle Landeshauptstädte sowie
-    die wichtigsten Bergstationen.
-    """
-
-    API_URL = "http://www.zamg.ac.at/ogd/"
+    """The class for handling the data retrieval."""
 
+    API_URL = 'http://www.zamg.ac.at/ogd/'
     API_FIELDS = {
         v[2]: (k, v[3])
         for k, v in SENSOR_TYPES.items()
     }
-
     API_HEADERS = {
-        'User-Agent': 'home-assistant.zamg/' + __version__,
+        'User-Agent': '{} {}'.format('home-assistant.zamg/', __version__),
     }
 
     def __init__(self, logger, station_id):
@@ -204,15 +141,10 @@ class ZamgData(object):
 
     @Throttle(MIN_TIME_BETWEEN_UPDATES)
     def update(self):
-        """
-        Update data set.
-
-        Fetch a new data set from the zamg server, parse it and
-        update internal state accordingly
-        """
+        """Get the latest data from ZAMG."""
         try:
-            response = requests.get(self.API_URL,
-                                    headers=self.API_HEADERS, timeout=15)
+            response = requests.get(
+                self.API_URL, headers=self.API_HEADERS, timeout=15)
         except requests.exceptions.RequestException:
             self._logger.exception("While fetching data from server")
             return
@@ -224,8 +156,7 @@ class ZamgData(object):
 
         content_type = response.headers.get('Content-Type', 'whatever')
         if content_type != 'text/csv':
-            self._logger.error("Expected text/csv but got %s",
-                               content_type)
+            self._logger.error("Expected text/csv but got %s", content_type)
             return
 
         response.encoding = 'UTF8'
-- 
GitLab