diff --git a/homeassistant/components/adguard/sensor.py b/homeassistant/components/adguard/sensor.py index e5618282a97..9d0d5245d80 100644 --- a/homeassistant/components/adguard/sensor.py +++ b/homeassistant/components/adguard/sensor.py @@ -11,6 +11,7 @@ from homeassistant.components.adguard.const import ( DOMAIN, ) from homeassistant.config_entries import ConfigEntry +from homeassistant.const import TIME_MILLISECONDS from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.typing import HomeAssistantType @@ -206,7 +207,7 @@ class AdGuardHomeAverageProcessingTimeSensor(AdGuardHomeSensor): "AdGuard Average Processing Speed", "mdi:speedometer", "average_speed", - "ms", + TIME_MILLISECONDS, ) async def _adguard_update(self) -> None: diff --git a/homeassistant/components/apcupsd/sensor.py b/homeassistant/components/apcupsd/sensor.py index 255eb1624ff..7947ba75999 100644 --- a/homeassistant/components/apcupsd/sensor.py +++ b/homeassistant/components/apcupsd/sensor.py @@ -6,7 +6,13 @@ import voluptuous as vol from homeassistant.components import apcupsd from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_RESOURCES, POWER_WATT, TEMP_CELSIUS +from homeassistant.const import ( + CONF_RESOURCES, + POWER_WATT, + TEMP_CELSIUS, + TIME_MINUTES, + TIME_SECONDS, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -84,8 +90,8 @@ SENSOR_TYPES = { SPECIFIC_UNITS = {"ITEMP": TEMP_CELSIUS} INFERRED_UNITS = { - " Minutes": "min", - " Seconds": "sec", + " Minutes": TIME_MINUTES, + " Seconds": TIME_SECONDS, " Percent": "%", " Volts": "V", " Ampere": "A", diff --git a/homeassistant/components/bitcoin/sensor.py b/homeassistant/components/bitcoin/sensor.py index 6a8651be6dc..cf2b76bf25f 100644 --- a/homeassistant/components/bitcoin/sensor.py +++ b/homeassistant/components/bitcoin/sensor.py @@ -6,7 +6,13 @@ from blockchain import exchangerates, statistics import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_CURRENCY, CONF_DISPLAY_OPTIONS +from homeassistant.const import ( + ATTR_ATTRIBUTION, + CONF_CURRENCY, + CONF_DISPLAY_OPTIONS, + TIME_MINUTES, + TIME_SECONDS, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -27,9 +33,9 @@ OPTION_TYPES = { "btc_mined": ["Mined", "BTC"], "trade_volume_usd": ["Trade volume", "USD"], "difficulty": ["Difficulty", None], - "minutes_between_blocks": ["Time between Blocks", "min"], + "minutes_between_blocks": ["Time between Blocks", TIME_MINUTES], "number_of_transactions": ["No. of Transactions", None], - "hash_rate": ["Hash rate", "PH/s"], + "hash_rate": ["Hash rate", f"PH/{TIME_SECONDS}"], "timestamp": ["Timestamp", None], "mined_blocks": ["Mined Blocks", None], "blocks_size": ["Block size", None], diff --git a/homeassistant/components/bizkaibus/sensor.py b/homeassistant/components/bizkaibus/sensor.py index 931fbbb834d..c58873473d5 100644 --- a/homeassistant/components/bizkaibus/sensor.py +++ b/homeassistant/components/bizkaibus/sensor.py @@ -6,7 +6,7 @@ from bizkaibus.bizkaibus import BizkaibusData import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -62,7 +62,7 @@ class BizkaibusSensor(Entity): @property def unit_of_measurement(self): """Return the unit of measurement of the sensor.""" - return "minutes" + return TIME_MINUTES def update(self): """Get the latest data from the webservice.""" diff --git a/homeassistant/components/bmw_connected_drive/sensor.py b/homeassistant/components/bmw_connected_drive/sensor.py index 3c40900bed8..7fb3da8b883 100644 --- a/homeassistant/components/bmw_connected_drive/sensor.py +++ b/homeassistant/components/bmw_connected_drive/sensor.py @@ -7,6 +7,7 @@ from homeassistant.const import ( CONF_UNIT_SYSTEM_IMPERIAL, LENGTH_KILOMETERS, LENGTH_MILES, + TIME_HOURS, VOLUME_GALLONS, VOLUME_LITERS, ) @@ -24,7 +25,7 @@ ATTR_TO_HA_METRIC = { "remaining_range_fuel": ["mdi:map-marker-distance", LENGTH_KILOMETERS], "max_range_electric": ["mdi:map-marker-distance", LENGTH_KILOMETERS], "remaining_fuel": ["mdi:gas-station", VOLUME_LITERS], - "charging_time_remaining": ["mdi:update", "h"], + "charging_time_remaining": ["mdi:update", TIME_HOURS], "charging_status": ["mdi:battery-charging", None], # No icon as this is dealt with directly as a special case in icon() "charging_level_hv": [None, "%"], @@ -37,7 +38,7 @@ ATTR_TO_HA_IMPERIAL = { "remaining_range_fuel": ["mdi:map-marker-distance", LENGTH_MILES], "max_range_electric": ["mdi:map-marker-distance", LENGTH_MILES], "remaining_fuel": ["mdi:gas-station", VOLUME_GALLONS], - "charging_time_remaining": ["mdi:update", "h"], + "charging_time_remaining": ["mdi:update", TIME_HOURS], "charging_status": ["mdi:battery-charging", None], # No icon as this is dealt with directly as a special case in icon() "charging_level_hv": [None, "%"], diff --git a/homeassistant/components/bom/sensor.py b/homeassistant/components/bom/sensor.py index bd57e20edaa..0981f1b0a86 100644 --- a/homeassistant/components/bom/sensor.py +++ b/homeassistant/components/bom/sensor.py @@ -20,6 +20,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, TEMP_CELSIUS, + TIME_HOURS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -59,7 +60,7 @@ SENSOR_TYPES = { "cloud_type_id": ["Cloud Type ID", None], "cloud_type": ["Cloud Type", None], "delta_t": ["Delta Temp C", TEMP_CELSIUS], - "gust_kmh": ["Wind Gust kmh", "km/h"], + "gust_kmh": ["Wind Gust kmh", f"km/{TIME_HOURS}"], "gust_kt": ["Wind Gust kt", "kt"], "air_temp": ["Air Temp C", TEMP_CELSIUS], "dewpt": ["Dew Point C", TEMP_CELSIUS], @@ -76,7 +77,7 @@ SENSOR_TYPES = { "vis_km": ["Visability km", "km"], "weather": ["Weather", None], "wind_dir": ["Wind Direction", None], - "wind_spd_kmh": ["Wind Speed kmh", "km/h"], + "wind_spd_kmh": ["Wind Speed kmh", f"km/{TIME_HOURS}"], "wind_spd_kt": ["Wind Speed kt", "kt"], } diff --git a/homeassistant/components/brother/const.py b/homeassistant/components/brother/const.py index fdb7cd82b9c..d3b7c5e2a78 100644 --- a/homeassistant/components/brother/const.py +++ b/homeassistant/components/brother/const.py @@ -1,4 +1,6 @@ """Constants for Brother integration.""" +from homeassistant.const import TIME_DAYS + ATTR_BELT_UNIT_REMAINING_LIFE = "belt_unit_remaining_life" ATTR_BLACK_INK_REMAINING = "black_ink_remaining" ATTR_BLACK_TONER_REMAINING = "black_toner_remaining" @@ -28,7 +30,6 @@ ATTR_YELLOW_TONER_REMAINING = "yellow_toner_remaining" DOMAIN = "brother" UNIT_PAGES = "p" -UNIT_DAYS = "days" UNIT_PERCENT = "%" PRINTER_TYPES = ["laser", "ink"] @@ -127,6 +128,6 @@ SENSOR_TYPES = { ATTR_UPTIME: { ATTR_ICON: "mdi:timer", ATTR_LABEL: ATTR_UPTIME.title(), - ATTR_UNIT: UNIT_DAYS, + ATTR_UNIT: TIME_DAYS, }, } diff --git a/homeassistant/components/buienradar/sensor.py b/homeassistant/components/buienradar/sensor.py index f642fc2e249..fa3e7fd343b 100644 --- a/homeassistant/components/buienradar/sensor.py +++ b/homeassistant/components/buienradar/sensor.py @@ -28,6 +28,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, TEMP_CELSIUS, + TIME_HOURS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -67,18 +68,18 @@ SENSOR_TYPES = { "humidity": ["Humidity", "%", "mdi:water-percent"], "temperature": ["Temperature", TEMP_CELSIUS, "mdi:thermometer"], "groundtemperature": ["Ground temperature", TEMP_CELSIUS, "mdi:thermometer"], - "windspeed": ["Wind speed", "km/h", "mdi:weather-windy"], + "windspeed": ["Wind speed", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windforce": ["Wind force", "Bft", "mdi:weather-windy"], "winddirection": ["Wind direction", None, "mdi:compass-outline"], "windazimuth": ["Wind direction azimuth", "°", "mdi:compass-outline"], "pressure": ["Pressure", "hPa", "mdi:gauge"], "visibility": ["Visibility", "km", None], - "windgust": ["Wind gust", "km/h", "mdi:weather-windy"], - "precipitation": ["Precipitation", "mm/h", "mdi:weather-pouring"], + "windgust": ["Wind gust", f"km/{TIME_HOURS}", "mdi:weather-windy"], + "precipitation": ["Precipitation", f"mm/{TIME_HOURS}", "mdi:weather-pouring"], "irradiance": ["Irradiance", "W/m2", "mdi:sunglasses"], "precipitation_forecast_average": [ "Precipitation forecast average", - "mm/h", + f"mm/{TIME_HOURS}", "mdi:weather-pouring", ], "precipitation_forecast_total": [ @@ -132,11 +133,11 @@ SENSOR_TYPES = { "windforce_3d": ["Wind force 3d", "Bft", "mdi:weather-windy"], "windforce_4d": ["Wind force 4d", "Bft", "mdi:weather-windy"], "windforce_5d": ["Wind force 5d", "Bft", "mdi:weather-windy"], - "windspeed_1d": ["Wind speed 1d", "km/h", "mdi:weather-windy"], - "windspeed_2d": ["Wind speed 2d", "km/h", "mdi:weather-windy"], - "windspeed_3d": ["Wind speed 3d", "km/h", "mdi:weather-windy"], - "windspeed_4d": ["Wind speed 4d", "km/h", "mdi:weather-windy"], - "windspeed_5d": ["Wind speed 5d", "km/h", "mdi:weather-windy"], + "windspeed_1d": ["Wind speed 1d", f"km/{TIME_HOURS}", "mdi:weather-windy"], + "windspeed_2d": ["Wind speed 2d", f"km/{TIME_HOURS}", "mdi:weather-windy"], + "windspeed_3d": ["Wind speed 3d", f"km/{TIME_HOURS}", "mdi:weather-windy"], + "windspeed_4d": ["Wind speed 4d", f"km/{TIME_HOURS}", "mdi:weather-windy"], + "windspeed_5d": ["Wind speed 5d", f"km/{TIME_HOURS}", "mdi:weather-windy"], "winddirection_1d": ["Wind direction 1d", None, "mdi:compass-outline"], "winddirection_2d": ["Wind direction 2d", None, "mdi:compass-outline"], "winddirection_3d": ["Wind direction 3d", None, "mdi:compass-outline"], diff --git a/homeassistant/components/cert_expiry/sensor.py b/homeassistant/components/cert_expiry/sensor.py index 3a76575dfdd..b4437ca5834 100644 --- a/homeassistant/components/cert_expiry/sensor.py +++ b/homeassistant/components/cert_expiry/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_NAME, CONF_PORT, EVENT_HOMEASSISTANT_START, + TIME_DAYS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -85,7 +86,7 @@ class SSLCertificate(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "days" + return TIME_DAYS @property def state(self): diff --git a/homeassistant/components/comfoconnect/sensor.py b/homeassistant/components/comfoconnect/sensor.py index 3e3507ea48d..1d189508960 100644 --- a/homeassistant/components/comfoconnect/sensor.py +++ b/homeassistant/components/comfoconnect/sensor.py @@ -31,6 +31,8 @@ from homeassistant.const import ( DEVICE_CLASS_TEMPERATURE, POWER_WATT, TEMP_CELSIUS, + TIME_DAYS, + TIME_HOURS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -156,14 +158,14 @@ SENSOR_TYPES = { ATTR_AIR_FLOW_SUPPLY: { ATTR_DEVICE_CLASS: None, ATTR_LABEL: "Supply airflow", - ATTR_UNIT: "m³/h", + ATTR_UNIT: f"m³/{TIME_HOURS}", ATTR_ICON: "mdi:fan", ATTR_ID: SENSOR_FAN_SUPPLY_FLOW, }, ATTR_AIR_FLOW_EXHAUST: { ATTR_DEVICE_CLASS: None, ATTR_LABEL: "Exhaust airflow", - ATTR_UNIT: "m³/h", + ATTR_UNIT: f"m³/{TIME_HOURS}", ATTR_ICON: "mdi:fan", ATTR_ID: SENSOR_FAN_EXHAUST_FLOW, }, @@ -177,7 +179,7 @@ SENSOR_TYPES = { ATTR_DAYS_TO_REPLACE_FILTER: { ATTR_DEVICE_CLASS: None, ATTR_LABEL: "Days to replace filter", - ATTR_UNIT: "days", + ATTR_UNIT: TIME_DAYS, ATTR_ICON: "mdi:calendar", ATTR_ID: SENSOR_DAYS_TO_REPLACE_FILTER, }, @@ -194,7 +196,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_RESOURCES, default=[]): vol.All( cv.ensure_list, [vol.In(SENSOR_TYPES)] - ), + ) } ) @@ -229,7 +231,7 @@ class ComfoConnectSensor(Entity): async def async_added_to_hass(self): """Register for sensor updates.""" _LOGGER.debug( - "Registering for sensor %s (%d)", self._sensor_type, self._sensor_id, + "Registering for sensor %s (%d)", self._sensor_type, self._sensor_id ) async_dispatcher_connect( self.hass, diff --git a/homeassistant/components/darksky/sensor.py b/homeassistant/components/darksky/sensor.py index 9f99b37a201..cecff626813 100644 --- a/homeassistant/components/darksky/sensor.py +++ b/homeassistant/components/darksky/sensor.py @@ -15,6 +15,8 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, CONF_SCAN_INTERVAL, + TIME_HOURS, + TIME_SECONDS, UNIT_UV_INDEX, ) import homeassistant.helpers.config_validation as cv @@ -99,11 +101,11 @@ SENSOR_TYPES = { ], "precip_intensity": [ "Precip Intensity", - "mm/h", + f"mm/{TIME_HOURS}", "in", - "mm/h", - "mm/h", - "mm/h", + f"mm/{TIME_HOURS}", + f"mm/{TIME_HOURS}", + f"mm/{TIME_HOURS}", "mdi:weather-rainy", ["currently", "minutely", "hourly", "daily"], ], @@ -159,9 +161,9 @@ SENSOR_TYPES = { ], "wind_speed": [ "Wind Speed", - "m/s", + f"m/{TIME_SECONDS}", "mph", - "km/h", + f"km/{TIME_HOURS}", "mph", "mph", "mdi:weather-windy", @@ -179,9 +181,9 @@ SENSOR_TYPES = { ], "wind_gust": [ "Wind Gust", - "m/s", + f"m/{TIME_SECONDS}", "mph", - "km/h", + f"km/{TIME_HOURS}", "mph", "mph", "mdi:weather-windy-variant", @@ -319,11 +321,11 @@ SENSOR_TYPES = { ], "precip_intensity_max": [ "Daily Max Precip Intensity", - "mm/h", + f"mm/{TIME_HOURS}", "in", - "mm/h", - "mm/h", - "mm/h", + f"mm/{TIME_HOURS}", + f"mm/{TIME_HOURS}", + f"mm/{TIME_HOURS}", "mdi:thermometer", ["daily"], ], diff --git a/homeassistant/components/derivative/sensor.py b/homeassistant/components/derivative/sensor.py index 5e68b268685..202c5885887 100644 --- a/homeassistant/components/derivative/sensor.py +++ b/homeassistant/components/derivative/sensor.py @@ -11,6 +11,10 @@ from homeassistant.const import ( CONF_SOURCE, STATE_UNAVAILABLE, STATE_UNKNOWN, + TIME_DAYS, + TIME_HOURS, + TIME_MINUTES, + TIME_SECONDS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -42,7 +46,12 @@ UNIT_PREFIXES = { } # SI Time prefixes -UNIT_TIME = {"s": 1, "min": 60, "h": 60 * 60, "d": 24 * 60 * 60} +UNIT_TIME = { + TIME_SECONDS: 1, + TIME_MINUTES: 60, + TIME_HOURS: 60 * 60, + TIME_DAYS: 24 * 60 * 60, +} ICON = "mdi:chart-line" @@ -55,7 +64,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Required(CONF_SOURCE): cv.entity_id, vol.Optional(CONF_ROUND_DIGITS, default=DEFAULT_ROUND): vol.Coerce(int), vol.Optional(CONF_UNIT_PREFIX, default=None): vol.In(UNIT_PREFIXES), - vol.Optional(CONF_UNIT_TIME, default="h"): vol.In(UNIT_TIME), + vol.Optional(CONF_UNIT_TIME, default=TIME_HOURS): vol.In(UNIT_TIME), vol.Optional(CONF_UNIT): cv.string, vol.Optional(CONF_TIME_WINDOW, default=DEFAULT_TIME_WINDOW): cv.time_period, } diff --git a/homeassistant/components/dsmr/sensor.py b/homeassistant/components/dsmr/sensor.py index 54c8e3e29b2..6ffc4a3106c 100644 --- a/homeassistant/components/dsmr/sensor.py +++ b/homeassistant/components/dsmr/sensor.py @@ -9,7 +9,12 @@ import serial import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_HOST, CONF_PORT, EVENT_HOMEASSISTANT_STOP +from homeassistant.const import ( + CONF_HOST, + CONF_PORT, + EVENT_HOMEASSISTANT_STOP, + TIME_HOURS, +) from homeassistant.core import CoreState import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -303,4 +308,4 @@ class DerivativeDSMREntity(DSMREntity): """Return the unit of measurement of this entity, per hour, if any.""" unit = self.get_dsmr_object_attr("unit") if unit: - return unit + "/h" + return f"{unit}/{TIME_HOURS}" diff --git a/homeassistant/components/dublin_bus_transport/sensor.py b/homeassistant/components/dublin_bus_transport/sensor.py index b517ecf6466..5de0b62a4a9 100644 --- a/homeassistant/components/dublin_bus_transport/sensor.py +++ b/homeassistant/components/dublin_bus_transport/sensor.py @@ -11,7 +11,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity import homeassistant.util.dt as dt_util @@ -109,7 +109,7 @@ class DublinPublicTransportSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/dyson/sensor.py b/homeassistant/components/dyson/sensor.py index 2fdd3cd6c1f..870086e7550 100644 --- a/homeassistant/components/dyson/sensor.py +++ b/homeassistant/components/dyson/sensor.py @@ -4,7 +4,7 @@ import logging from libpurecool.dyson_pure_cool import DysonPureCool from libpurecool.dyson_pure_cool_link import DysonPureCoolLink -from homeassistant.const import STATE_OFF, TEMP_CELSIUS +from homeassistant.const import STATE_OFF, TEMP_CELSIUS, TIME_HOURS from homeassistant.helpers.entity import Entity from . import DYSON_DEVICES @@ -12,7 +12,7 @@ from . import DYSON_DEVICES SENSOR_UNITS = { "air_quality": None, "dust": None, - "filter_life": "hours", + "filter_life": TIME_HOURS, "humidity": "%", } diff --git a/homeassistant/components/ebox/sensor.py b/homeassistant/components/ebox/sensor.py index f1221bd1e77..208ffb99543 100644 --- a/homeassistant/components/ebox/sensor.py +++ b/homeassistant/components/ebox/sensor.py @@ -17,6 +17,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_USERNAME, DATA_GIGABITS, + TIME_DAYS, ) from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv @@ -26,7 +27,6 @@ from homeassistant.util import Throttle _LOGGER = logging.getLogger(__name__) PRICE = "CAD" -DAYS = "days" PERCENT = "%" DEFAULT_NAME = "EBox" @@ -39,7 +39,7 @@ SENSOR_TYPES = { "usage": ["Usage", PERCENT, "mdi:percent"], "balance": ["Balance", PRICE, "mdi:square-inc-cash"], "limit": ["Data limit", DATA_GIGABITS, "mdi:download"], - "days_left": ["Days left", DAYS, "mdi:calendar-today"], + "days_left": ["Days left", TIME_DAYS, "mdi:calendar-today"], "before_offpeak_download": [ "Download before offpeak", DATA_GIGABITS, diff --git a/homeassistant/components/ebusd/const.py b/homeassistant/components/ebusd/const.py index ec097a153c9..10ed0b68e87 100644 --- a/homeassistant/components/ebusd/const.py +++ b/homeassistant/components/ebusd/const.py @@ -1,8 +1,12 @@ """Constants for ebus component.""" -from homeassistant.const import ENERGY_KILO_WATT_HOUR, PRESSURE_BAR, TEMP_CELSIUS +from homeassistant.const import ( + ENERGY_KILO_WATT_HOUR, + PRESSURE_BAR, + TEMP_CELSIUS, + TIME_SECONDS, +) DOMAIN = "ebusd" -TIME_SECONDS = "seconds" # SensorTypes from ebusdpy module : # 0='decimal', 1='time-schedule', 2='switch', 3='string', 4='value;status' diff --git a/homeassistant/components/entur_public_transport/sensor.py b/homeassistant/components/entur_public_transport/sensor.py index 2ecae21824e..156a0e601b4 100644 --- a/homeassistant/components/entur_public_transport/sensor.py +++ b/homeassistant/components/entur_public_transport/sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_NAME, CONF_SHOW_ON_MAP, + TIME_MINUTES, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -183,7 +184,7 @@ class EnturPublicTransportSensor(Entity): @property def unit_of_measurement(self) -> str: """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES @property def icon(self) -> str: diff --git a/homeassistant/components/fido/sensor.py b/homeassistant/components/fido/sensor.py index 9f2eeb9bd7c..951d13dadb4 100644 --- a/homeassistant/components/fido/sensor.py +++ b/homeassistant/components/fido/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_USERNAME, DATA_KILOBITS, + TIME_MINUTES, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -27,7 +28,6 @@ _LOGGER = logging.getLogger(__name__) PRICE = "CAD" MESSAGES = "messages" -MINUTES = "minutes" DEFAULT_NAME = "Fido" @@ -49,12 +49,12 @@ SENSOR_TYPES = { "text_int_used": ["International text used", MESSAGES, "mdi:message-alert"], "text_int_limit": ["International text limit", MESSAGES, "mdi:message-alert"], "text_int_remaining": ["International remaining", MESSAGES, "mdi:message-alert"], - "talk_used": ["Talk used", MINUTES, "mdi:cellphone"], - "talk_limit": ["Talk limit", MINUTES, "mdi:cellphone"], - "talk_remaining": ["Talk remaining", MINUTES, "mdi:cellphone"], - "other_talk_used": ["Other Talk used", MINUTES, "mdi:cellphone"], - "other_talk_limit": ["Other Talk limit", MINUTES, "mdi:cellphone"], - "other_talk_remaining": ["Other Talk remaining", MINUTES, "mdi:cellphone"], + "talk_used": ["Talk used", TIME_MINUTES, "mdi:cellphone"], + "talk_limit": ["Talk limit", TIME_MINUTES, "mdi:cellphone"], + "talk_remaining": ["Talk remaining", TIME_MINUTES, "mdi:cellphone"], + "other_talk_used": ["Other Talk used", TIME_MINUTES, "mdi:cellphone"], + "other_talk_limit": ["Other Talk limit", TIME_MINUTES, "mdi:cellphone"], + "other_talk_remaining": ["Other Talk remaining", TIME_MINUTES, "mdi:cellphone"], } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( diff --git a/homeassistant/components/fitbit/sensor.py b/homeassistant/components/fitbit/sensor.py index 5ddb63ef899..8c17e3b9c4c 100644 --- a/homeassistant/components/fitbit/sensor.py +++ b/homeassistant/components/fitbit/sensor.py @@ -11,7 +11,12 @@ import voluptuous as vol from homeassistant.components.http import HomeAssistantView from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_UNIT_SYSTEM +from homeassistant.const import ( + ATTR_ATTRIBUTION, + CONF_UNIT_SYSTEM, + TIME_MILLISECONDS, + TIME_MINUTES, +) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -48,14 +53,14 @@ FITBIT_RESOURCES_LIST = { "activities/elevation": ["Elevation", "", "walk"], "activities/floors": ["Floors", "floors", "walk"], "activities/heart": ["Resting Heart Rate", "bpm", "heart-pulse"], - "activities/minutesFairlyActive": ["Minutes Fairly Active", "minutes", "walk"], - "activities/minutesLightlyActive": ["Minutes Lightly Active", "minutes", "walk"], + "activities/minutesFairlyActive": ["Minutes Fairly Active", TIME_MINUTES, "walk"], + "activities/minutesLightlyActive": ["Minutes Lightly Active", TIME_MINUTES, "walk"], "activities/minutesSedentary": [ "Minutes Sedentary", - "minutes", + TIME_MINUTES, "seat-recline-normal", ], - "activities/minutesVeryActive": ["Minutes Very Active", "minutes", "run"], + "activities/minutesVeryActive": ["Minutes Very Active", TIME_MINUTES, "run"], "activities/steps": ["Steps", "steps", "walk"], "activities/tracker/activityCalories": ["Tracker Activity Calories", "cal", "fire"], "activities/tracker/calories": ["Tracker Calories", "cal", "fire"], @@ -64,22 +69,22 @@ FITBIT_RESOURCES_LIST = { "activities/tracker/floors": ["Tracker Floors", "floors", "walk"], "activities/tracker/minutesFairlyActive": [ "Tracker Minutes Fairly Active", - "minutes", + TIME_MINUTES, "walk", ], "activities/tracker/minutesLightlyActive": [ "Tracker Minutes Lightly Active", - "minutes", + TIME_MINUTES, "walk", ], "activities/tracker/minutesSedentary": [ "Tracker Minutes Sedentary", - "minutes", + TIME_MINUTES, "seat-recline-normal", ], "activities/tracker/minutesVeryActive": [ "Tracker Minutes Very Active", - "minutes", + TIME_MINUTES, "run", ], "activities/tracker/steps": ["Tracker Steps", "steps", "walk"], @@ -89,17 +94,21 @@ FITBIT_RESOURCES_LIST = { "devices/battery": ["Battery", None, None], "sleep/awakeningsCount": ["Awakenings Count", "times awaken", "sleep"], "sleep/efficiency": ["Sleep Efficiency", "%", "sleep"], - "sleep/minutesAfterWakeup": ["Minutes After Wakeup", "minutes", "sleep"], - "sleep/minutesAsleep": ["Sleep Minutes Asleep", "minutes", "sleep"], - "sleep/minutesAwake": ["Sleep Minutes Awake", "minutes", "sleep"], - "sleep/minutesToFallAsleep": ["Sleep Minutes to Fall Asleep", "minutes", "sleep"], + "sleep/minutesAfterWakeup": ["Minutes After Wakeup", TIME_MINUTES, "sleep"], + "sleep/minutesAsleep": ["Sleep Minutes Asleep", TIME_MINUTES, "sleep"], + "sleep/minutesAwake": ["Sleep Minutes Awake", TIME_MINUTES, "sleep"], + "sleep/minutesToFallAsleep": [ + "Sleep Minutes to Fall Asleep", + TIME_MINUTES, + "sleep", + ], "sleep/startTime": ["Sleep Start Time", None, "clock"], - "sleep/timeInBed": ["Sleep Time in Bed", "minutes", "hotel"], + "sleep/timeInBed": ["Sleep Time in Bed", TIME_MINUTES, "hotel"], } FITBIT_MEASUREMENTS = { "en_US": { - "duration": "ms", + "duration": TIME_MILLISECONDS, "distance": "mi", "elevation": "ft", "height": "in", @@ -110,7 +119,7 @@ FITBIT_MEASUREMENTS = { "battery": "", }, "en_GB": { - "duration": "milliseconds", + "duration": TIME_MILLISECONDS, "distance": "kilometers", "elevation": "meters", "height": "centimeters", @@ -121,7 +130,7 @@ FITBIT_MEASUREMENTS = { "battery": "", }, "metric": { - "duration": "milliseconds", + "duration": TIME_MILLISECONDS, "distance": "kilometers", "elevation": "meters", "height": "centimeters", diff --git a/homeassistant/components/foobot/sensor.py b/homeassistant/components/foobot/sensor.py index efb74e2cc9a..656631f0774 100644 --- a/homeassistant/components/foobot/sensor.py +++ b/homeassistant/components/foobot/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_TOKEN, CONF_USERNAME, TEMP_CELSIUS, + TIME_SECONDS, ) from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -30,7 +31,7 @@ ATTR_VOLATILE_ORGANIC_COMPOUNDS = "VOC" ATTR_FOOBOT_INDEX = "index" SENSOR_TYPES = { - "time": [ATTR_TIME, "s"], + "time": [ATTR_TIME, TIME_SECONDS], "pm": [ATTR_PM2_5, "µg/m3", "mdi:cloud"], "tmp": [ATTR_TEMPERATURE, TEMP_CELSIUS, "mdi:thermometer"], "hum": [ATTR_HUMIDITY, "%", "mdi:water-percent"], diff --git a/homeassistant/components/garmin_connect/const.py b/homeassistant/components/garmin_connect/const.py index b5faeab77b4..c01f11464a1 100644 --- a/homeassistant/components/garmin_connect/const.py +++ b/homeassistant/components/garmin_connect/const.py @@ -1,5 +1,5 @@ """Constants for the Garmin Connect integration.""" -from homeassistant.const import DEVICE_CLASS_TIMESTAMP +from homeassistant.const import DEVICE_CLASS_TIMESTAMP, TIME_MINUTES DOMAIN = "garmin_connect" ATTRIBUTION = "Data provided by garmin.com" @@ -52,20 +52,32 @@ GARMIN_ENTITY_LIST = { False, ], "wellnessKilocalories": ["Wellness KiloCalories", "kcal", "mdi:food", None, False], - "highlyActiveSeconds": ["Highly Active Time", "min", "mdi:fire", None, False], - "activeSeconds": ["Active Time", "min", "mdi:fire", None, True], - "sedentarySeconds": ["Sedentary Time", "min", "mdi:seat", None, True], - "sleepingSeconds": ["Sleeping Time", "min", "mdi:sleep", None, True], - "measurableAwakeDuration": ["Awake Duration", "min", "mdi:sleep", None, True], - "measurableAsleepDuration": ["Sleep Duration", "min", "mdi:sleep", None, True], - "floorsAscendedInMeters": ["Floors Ascended Mtr", "m", "mdi:stairs", None, False], - "floorsDescendedInMeters": [ - "Floors Descended Mtr", - "m", - "mdi:stairs", + "highlyActiveSeconds": [ + "Highly Active Time", + TIME_MINUTES, + "mdi:fire", None, False, ], + "activeSeconds": ["Active Time", TIME_MINUTES, "mdi:fire", None, True], + "sedentarySeconds": ["Sedentary Time", TIME_MINUTES, "mdi:seat", None, True], + "sleepingSeconds": ["Sleeping Time", TIME_MINUTES, "mdi:sleep", None, True], + "measurableAwakeDuration": [ + "Awake Duration", + TIME_MINUTES, + "mdi:sleep", + None, + True, + ], + "measurableAsleepDuration": [ + "Sleep Duration", + TIME_MINUTES, + "mdi:sleep", + None, + True, + ], + "floorsAscendedInMeters": ["Floors Ascended Mtr", "m", "mdi:stairs", None, False], + "floorsDescendedInMeters": ["Floors Descended Mtr", "m", "mdi:stairs", None, False], "floorsAscended": ["Floors Ascended", "floors", "mdi:stairs", None, True], "floorsDescended": ["Floors Descended", "floors", "mdi:stairs", None, True], "userFloorsAscendedGoal": [ @@ -97,46 +109,52 @@ GARMIN_ENTITY_LIST = { "averageStressLevel": ["Avg Stress Level", "", "mdi:flash-alert", None, True], "maxStressLevel": ["Max Stress Level", "", "mdi:flash-alert", None, True], "stressQualifier": ["Stress Qualifier", "", "mdi:flash-alert", None, False], - "stressDuration": ["Stress Duration", "min", "mdi:flash-alert", None, False], + "stressDuration": ["Stress Duration", TIME_MINUTES, "mdi:flash-alert", None, False], "restStressDuration": [ "Rest Stress Duration", - "min", + TIME_MINUTES, "mdi:flash-alert", None, True, ], "activityStressDuration": [ "Activity Stress Duration", - "min", + TIME_MINUTES, "mdi:flash-alert", None, True, ], "uncategorizedStressDuration": [ "Uncat. Stress Duration", - "min", + TIME_MINUTES, "mdi:flash-alert", None, True, ], "totalStressDuration": [ "Total Stress Duration", - "min", + TIME_MINUTES, + "mdi:flash-alert", + None, + True, + ], + "lowStressDuration": [ + "Low Stress Duration", + TIME_MINUTES, "mdi:flash-alert", None, True, ], - "lowStressDuration": ["Low Stress Duration", "min", "mdi:flash-alert", None, True], "mediumStressDuration": [ "Medium Stress Duration", - "min", + TIME_MINUTES, "mdi:flash-alert", None, True, ], "highStressDuration": [ "High Stress Duration", - "min", + TIME_MINUTES, "mdi:flash-alert", None, True, @@ -186,19 +204,25 @@ GARMIN_ENTITY_LIST = { ], "moderateIntensityMinutes": [ "Moderate Intensity", - "min", + TIME_MINUTES, "mdi:flash-alert", None, False, ], "vigorousIntensityMinutes": [ "Vigorous Intensity", - "min", + TIME_MINUTES, + "mdi:run-fast", + None, + False, + ], + "intensityMinutesGoal": [ + "Intensity Goal", + TIME_MINUTES, "mdi:run-fast", None, False, ], - "intensityMinutesGoal": ["Intensity Goal", "min", "mdi:run-fast", None, False], "bodyBatteryChargedValue": [ "Body Battery Charged", "%", diff --git a/homeassistant/components/google_travel_time/sensor.py b/homeassistant/components/google_travel_time/sensor.py index 3ee72928fc1..7f106bc7e3e 100644 --- a/homeassistant/components/google_travel_time/sensor.py +++ b/homeassistant/components/google_travel_time/sensor.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_MODE, CONF_NAME, EVENT_HOMEASSISTANT_START, + TIME_MINUTES, ) from homeassistant.helpers import location import homeassistant.helpers.config_validation as cv @@ -188,7 +189,7 @@ class GoogleTravelTimeSensor(Entity): self._hass = hass self._name = name self._options = options - self._unit_of_measurement = "min" + self._unit_of_measurement = TIME_MINUTES self._matrix = None self.valid_api_connection = True diff --git a/homeassistant/components/google_wifi/sensor.py b/homeassistant/components/google_wifi/sensor.py index 9d6f3ea3d58..9dfa26fab75 100644 --- a/homeassistant/components/google_wifi/sensor.py +++ b/homeassistant/components/google_wifi/sensor.py @@ -11,6 +11,7 @@ from homeassistant.const import ( CONF_MONITORED_CONDITIONS, CONF_NAME, STATE_UNKNOWN, + TIME_DAYS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -39,7 +40,7 @@ MONITORED_CONDITIONS = { "mdi:checkbox-marked-circle-outline", ], ATTR_NEW_VERSION: [["software", "updateNewVersion"], None, "mdi:update"], - ATTR_UPTIME: [["system", "uptime"], "days", "mdi:timelapse"], + ATTR_UPTIME: [["system", "uptime"], TIME_DAYS, "mdi:timelapse"], ATTR_LAST_RESTART: [["system", "uptime"], None, "mdi:restart"], ATTR_LOCAL_IP: [["wan", "localIpAddress"], None, "mdi:access-point-network"], ATTR_STATUS: [["wan", "online"], None, "mdi:google"], diff --git a/homeassistant/components/greeneye_monitor/__init__.py b/homeassistant/components/greeneye_monitor/__init__.py index dcd383a7463..697a96649ab 100644 --- a/homeassistant/components/greeneye_monitor/__init__.py +++ b/homeassistant/components/greeneye_monitor/__init__.py @@ -9,6 +9,9 @@ from homeassistant.const import ( CONF_PORT, CONF_TEMPERATURE_UNIT, EVENT_HOMEASSISTANT_STOP, + TIME_HOURS, + TIME_MINUTES, + TIME_SECONDS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.discovery import async_load_platform @@ -40,10 +43,6 @@ SENSOR_TYPE_VOLTAGE = "voltage_sensor" TEMPERATURE_UNIT_CELSIUS = "C" -TIME_UNIT_SECOND = "s" -TIME_UNIT_MINUTE = "min" -TIME_UNIT_HOUR = "h" - TEMPERATURE_SENSOR_SCHEMA = vol.Schema( {vol.Required(CONF_NUMBER): vol.Range(1, 8), vol.Required(CONF_NAME): cv.string} ) @@ -69,8 +68,8 @@ PULSE_COUNTER_SCHEMA = vol.Schema( vol.Required(CONF_NAME): cv.string, vol.Required(CONF_COUNTED_QUANTITY): cv.string, vol.Optional(CONF_COUNTED_QUANTITY_PER_PULSE, default=1.0): vol.Coerce(float), - vol.Optional(CONF_TIME_UNIT, default=TIME_UNIT_SECOND): vol.Any( - TIME_UNIT_SECOND, TIME_UNIT_MINUTE, TIME_UNIT_HOUR + vol.Optional(CONF_TIME_UNIT, default=TIME_SECONDS): vol.Any( + TIME_SECONDS, TIME_MINUTES, TIME_HOURS ), } ) diff --git a/homeassistant/components/greeneye_monitor/sensor.py b/homeassistant/components/greeneye_monitor/sensor.py index 2640c701f92..b88b2567750 100644 --- a/homeassistant/components/greeneye_monitor/sensor.py +++ b/homeassistant/components/greeneye_monitor/sensor.py @@ -1,7 +1,14 @@ """Support for the sensors in a GreenEye Monitor.""" import logging -from homeassistant.const import CONF_NAME, CONF_TEMPERATURE_UNIT, POWER_WATT +from homeassistant.const import ( + CONF_NAME, + CONF_TEMPERATURE_UNIT, + POWER_WATT, + TIME_HOURS, + TIME_MINUTES, + TIME_SECONDS, +) from homeassistant.helpers.entity import Entity from . import ( @@ -17,9 +24,6 @@ from . import ( SENSOR_TYPE_PULSE_COUNTER, SENSOR_TYPE_TEMPERATURE, SENSOR_TYPE_VOLTAGE, - TIME_UNIT_HOUR, - TIME_UNIT_MINUTE, - TIME_UNIT_SECOND, ) _LOGGER = logging.getLogger(__name__) @@ -235,11 +239,11 @@ class PulseCounter(GEMSensor): @property def _seconds_per_time_unit(self): """Return the number of seconds in the given display time unit.""" - if self._time_unit == TIME_UNIT_SECOND: + if self._time_unit == TIME_SECONDS: return 1 - if self._time_unit == TIME_UNIT_MINUTE: + if self._time_unit == TIME_MINUTES: return 60 - if self._time_unit == TIME_UNIT_HOUR: + if self._time_unit == TIME_HOURS: return 3600 @property diff --git a/homeassistant/components/here_travel_time/sensor.py b/homeassistant/components/here_travel_time/sensor.py index 316e73dc096..8113548b5ca 100644 --- a/homeassistant/components/here_travel_time/sensor.py +++ b/homeassistant/components/here_travel_time/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( CONF_UNIT_SYSTEM_IMPERIAL, CONF_UNIT_SYSTEM_METRIC, EVENT_HOMEASSISTANT_START, + TIME_MINUTES, ) from homeassistant.core import HomeAssistant, State, callback from homeassistant.helpers import location @@ -85,8 +86,6 @@ ATTR_DURATION_IN_TRAFFIC = "duration_in_traffic" ATTR_ORIGIN_NAME = "origin_name" ATTR_DESTINATION_NAME = "destination_name" -UNIT_OF_MEASUREMENT = "min" - SCAN_INTERVAL = timedelta(minutes=5) NO_ROUTE_ERROR_MESSAGE = "HERE could not find a route based on the input" @@ -209,7 +208,7 @@ class HERETravelTimeSensor(Entity): self._origin_entity_id = origin_entity_id self._destination_entity_id = destination_entity_id self._here_data = here_data - self._unit_of_measurement = UNIT_OF_MEASUREMENT + self._unit_of_measurement = TIME_MINUTES self._attrs = { ATTR_UNIT_SYSTEM: self._here_data.units, ATTR_MODE: self._here_data.travel_mode, diff --git a/homeassistant/components/history_stats/sensor.py b/homeassistant/components/history_stats/sensor.py index 3eb604b3957..0b1289ab05f 100644 --- a/homeassistant/components/history_stats/sensor.py +++ b/homeassistant/components/history_stats/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_STATE, CONF_TYPE, EVENT_HOMEASSISTANT_START, + TIME_HOURS, ) from homeassistant.core import callback from homeassistant.exceptions import TemplateError @@ -35,7 +36,7 @@ CONF_TYPE_COUNT = "count" CONF_TYPE_KEYS = [CONF_TYPE_TIME, CONF_TYPE_RATIO, CONF_TYPE_COUNT] DEFAULT_NAME = "unnamed statistics" -UNITS = {CONF_TYPE_TIME: "h", CONF_TYPE_RATIO: "%", CONF_TYPE_COUNT: ""} +UNITS = {CONF_TYPE_TIME: TIME_HOURS, CONF_TYPE_RATIO: "%", CONF_TYPE_COUNT: ""} ICON = "mdi:chart-line" ATTR_VALUE = "value" diff --git a/homeassistant/components/homematic/sensor.py b/homeassistant/components/homematic/sensor.py index bba8325650d..e7ab5ddfefc 100644 --- a/homeassistant/components/homematic/sensor.py +++ b/homeassistant/components/homematic/sensor.py @@ -8,6 +8,7 @@ from homeassistant.const import ( DEVICE_CLASS_TEMPERATURE, ENERGY_WATT_HOUR, POWER_WATT, + TIME_HOURS, ) from .const import ATTR_DISCOVER_DEVICES @@ -47,7 +48,7 @@ HM_UNIT_HA_CAST = { "LOWEST_ILLUMINATION": "lx", "HIGHEST_ILLUMINATION": "lx", "RAIN_COUNTER": "mm", - "WIND_SPEED": "km/h", + "WIND_SPEED": f"km/{TIME_HOURS}", "WIND_DIRECTION": "°", "WIND_DIRECTION_RANGE": "°", "SUNSHINEDURATION": "#", diff --git a/homeassistant/components/homematicip_cloud/sensor.py b/homeassistant/components/homematicip_cloud/sensor.py index d6a226a83dc..f38eea840c6 100644 --- a/homeassistant/components/homematicip_cloud/sensor.py +++ b/homeassistant/components/homematicip_cloud/sensor.py @@ -32,6 +32,7 @@ from homeassistant.const import ( DEVICE_CLASS_TEMPERATURE, POWER_WATT, TEMP_CELSIUS, + TIME_HOURS, ) from homeassistant.helpers.typing import HomeAssistantType @@ -332,7 +333,7 @@ class HomematicipWindspeedSensor(HomematicipGenericDevice): @property def unit_of_measurement(self) -> str: """Return the unit this state is expressed in.""" - return "km/h" + return f"km/{TIME_HOURS}" @property def device_state_attributes(self) -> Dict[str, Any]: diff --git a/homeassistant/components/huawei_lte/const.py b/homeassistant/components/huawei_lte/const.py index 6d699420283..41814d5ae10 100644 --- a/homeassistant/components/huawei_lte/const.py +++ b/homeassistant/components/huawei_lte/const.py @@ -8,8 +8,6 @@ DEFAULT_NOTIFY_SERVICE_NAME = DOMAIN UPDATE_SIGNAL = f"{DOMAIN}_update" UPDATE_OPTIONS_SIGNAL = f"{DOMAIN}_options_update" -UNIT_SECONDS = "s" - CONNECTION_TIMEOUT = 10 NOTIFY_SUPPRESS_TIMEOUT = 30 diff --git a/homeassistant/components/huawei_lte/sensor.py b/homeassistant/components/huawei_lte/sensor.py index 54c5441c6e2..8ca5e02dcdd 100644 --- a/homeassistant/components/huawei_lte/sensor.py +++ b/homeassistant/components/huawei_lte/sensor.py @@ -10,7 +10,7 @@ from homeassistant.components.sensor import ( DEVICE_CLASS_SIGNAL_STRENGTH, DOMAIN as SENSOR_DOMAIN, ) -from homeassistant.const import CONF_URL, DATA_BYTES, STATE_UNKNOWN +from homeassistant.const import CONF_URL, DATA_BYTES, STATE_UNKNOWN, TIME_SECONDS from . import HuaweiLteBaseEntity from .const import ( @@ -18,7 +18,6 @@ from .const import ( KEY_DEVICE_INFORMATION, KEY_DEVICE_SIGNAL, KEY_MONITORING_TRAFFIC_STATISTICS, - UNIT_SECONDS, ) _LOGGER = logging.getLogger(__name__) @@ -122,7 +121,7 @@ SENSOR_META = { exclude=re.compile(r"^showtraffic$", re.IGNORECASE) ), (KEY_MONITORING_TRAFFIC_STATISTICS, "CurrentConnectTime"): dict( - name="Current connection duration", unit=UNIT_SECONDS, icon="mdi:timer" + name="Current connection duration", unit=TIME_SECONDS, icon="mdi:timer" ), (KEY_MONITORING_TRAFFIC_STATISTICS, "CurrentDownload"): dict( name="Current connection download", unit=DATA_BYTES, icon="mdi:download" @@ -131,7 +130,7 @@ SENSOR_META = { name="Current connection upload", unit=DATA_BYTES, icon="mdi:upload" ), (KEY_MONITORING_TRAFFIC_STATISTICS, "TotalConnectTime"): dict( - name="Total connected duration", unit=UNIT_SECONDS, icon="mdi:timer" + name="Total connected duration", unit=TIME_SECONDS, icon="mdi:timer" ), (KEY_MONITORING_TRAFFIC_STATISTICS, "TotalDownload"): dict( name="Total download", unit=DATA_BYTES, icon="mdi:download" diff --git a/homeassistant/components/hydrawise/__init__.py b/homeassistant/components/hydrawise/__init__.py index 57ed29d9780..b8ed596d286 100644 --- a/homeassistant/components/hydrawise/__init__.py +++ b/homeassistant/components/hydrawise/__init__.py @@ -6,7 +6,12 @@ from hydrawiser.core import Hydrawiser from requests.exceptions import ConnectTimeout, HTTPError import voluptuous as vol -from homeassistant.const import ATTR_ATTRIBUTION, CONF_ACCESS_TOKEN, CONF_SCAN_INTERVAL +from homeassistant.const import ( + ATTR_ATTRIBUTION, + CONF_ACCESS_TOKEN, + CONF_SCAN_INTERVAL, + TIME_MINUTES, +) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send @@ -40,7 +45,7 @@ DEVICE_MAP = { "manual_watering": ["Manual Watering", "mdi:water-pump", "", ""], "next_cycle": ["Next Cycle", "mdi:calendar-clock", "", ""], "status": ["Status", "", "connectivity", ""], - "watering_time": ["Watering Time", "mdi:water-pump", "", "min"], + "watering_time": ["Watering Time", "mdi:water-pump", "", TIME_MINUTES], "rain_sensor": ["Rain Sensor", "", "moisture", ""], } diff --git a/homeassistant/components/integration/sensor.py b/homeassistant/components/integration/sensor.py index 560a7cbd33c..dea7a5083dc 100644 --- a/homeassistant/components/integration/sensor.py +++ b/homeassistant/components/integration/sensor.py @@ -10,6 +10,10 @@ from homeassistant.const import ( CONF_NAME, STATE_UNAVAILABLE, STATE_UNKNOWN, + TIME_DAYS, + TIME_HOURS, + TIME_MINUTES, + TIME_SECONDS, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -38,7 +42,12 @@ INTEGRATION_METHOD = [TRAPEZOIDAL_METHOD, LEFT_METHOD, RIGHT_METHOD] UNIT_PREFIXES = {None: 1, "k": 10 ** 3, "G": 10 ** 6, "T": 10 ** 9} # SI Time prefixes -UNIT_TIME = {"s": 1, "min": 60, "h": 60 * 60, "d": 24 * 60 * 60} +UNIT_TIME = { + TIME_SECONDS: 1, + TIME_MINUTES: 60, + TIME_HOURS: 60 * 60, + TIME_DAYS: 24 * 60 * 60, +} ICON = "mdi:chart-histogram" @@ -50,7 +59,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Required(CONF_SOURCE_SENSOR): cv.entity_id, vol.Optional(CONF_ROUND_DIGITS, default=DEFAULT_ROUND): vol.Coerce(int), vol.Optional(CONF_UNIT_PREFIX, default=None): vol.In(UNIT_PREFIXES), - vol.Optional(CONF_UNIT_TIME, default="h"): vol.In(UNIT_TIME), + vol.Optional(CONF_UNIT_TIME, default=TIME_HOURS): vol.In(UNIT_TIME), vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, vol.Optional(CONF_METHOD, default=TRAPEZOIDAL_METHOD): vol.In( INTEGRATION_METHOD diff --git a/homeassistant/components/irish_rail_transport/sensor.py b/homeassistant/components/irish_rail_transport/sensor.py index 883f4ed7b39..3bb7da52e22 100644 --- a/homeassistant/components/irish_rail_transport/sensor.py +++ b/homeassistant/components/irish_rail_transport/sensor.py @@ -6,7 +6,7 @@ from pyirishrail.pyirishrail import IrishRailRTPI import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -118,7 +118,7 @@ class IrishRailTransportSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/isy994/sensor.py b/homeassistant/components/isy994/sensor.py index a9746b004d0..563f292c489 100644 --- a/homeassistant/components/isy994/sensor.py +++ b/homeassistant/components/isy994/sensor.py @@ -3,7 +3,19 @@ import logging from typing import Callable from homeassistant.components.sensor import DOMAIN -from homeassistant.const import POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, UNIT_UV_INDEX +from homeassistant.const import ( + POWER_WATT, + TEMP_CELSIUS, + TEMP_FAHRENHEIT, + TIME_DAYS, + TIME_HOURS, + TIME_MILLISECONDS, + TIME_MINUTES, + TIME_MONTHS, + TIME_SECONDS, + TIME_YEARS, + UNIT_UV_INDEX, +) from homeassistant.helpers.typing import ConfigType from . import ISY994_NODES, ISY994_WEATHER, ISYDevice @@ -12,22 +24,22 @@ _LOGGER = logging.getLogger(__name__) UOM_FRIENDLY_NAME = { "1": "amp", - "3": "btu/h", + "3": f"btu/{TIME_HOURS}", "4": TEMP_CELSIUS, "5": "cm", "6": "ft³", - "7": "ft³/min", + "7": f"ft³/{TIME_MINUTES}", "8": "m³", - "9": "day", - "10": "days", + "9": TIME_DAYS, + "10": TIME_DAYS, "12": "dB", "13": "dB A", "14": "°", "16": "macroseismic", "17": TEMP_FAHRENHEIT, "18": "ft", - "19": "hour", - "20": "hours", + "19": TIME_HOURS, + "20": TIME_HOURS, "21": "abs. humidity (%)", "22": "rel. humidity (%)", "23": "inHg", @@ -47,24 +59,24 @@ UOM_FRIENDLY_NAME = { "37": "mercalli", "38": "m", "39": "m³/hr", - "40": "m/s", + "40": f"m/{TIME_SECONDS}", "41": "mA", - "42": "ms", + "42": TIME_MILLISECONDS, "43": "mV", - "44": "min", - "45": "min", + "44": TIME_MINUTES, + "45": TIME_MINUTES, "46": "mm/hr", - "47": "month", + "47": TIME_MONTHS, "48": "MPH", - "49": "m/s", + "49": f"m/{TIME_SECONDS}", "50": "ohm", "51": "%", "52": "lb", "53": "power factor", "54": "ppm", "55": "pulse count", - "57": "s", - "58": "s", + "57": TIME_SECONDS, + "58": TIME_SECONDS, "59": "seimens/m", "60": "body wave magnitude scale", "61": "Ricter scale", @@ -79,7 +91,7 @@ UOM_FRIENDLY_NAME = { "74": "W/m²", "75": "weekday", "76": "Wind Direction (°)", - "77": "year", + "77": TIME_YEARS, "82": "mm", "83": "km", "85": "ohm", diff --git a/homeassistant/components/juicenet/sensor.py b/homeassistant/components/juicenet/sensor.py index 9a0431ef2d8..67a04d39556 100644 --- a/homeassistant/components/juicenet/sensor.py +++ b/homeassistant/components/juicenet/sensor.py @@ -1,7 +1,7 @@ """Support for monitoring juicenet/juicepoint/juicebox based EVSE sensors.""" import logging -from homeassistant.const import ENERGY_WATT_HOUR, POWER_WATT, TEMP_CELSIUS +from homeassistant.const import ENERGY_WATT_HOUR, POWER_WATT, TEMP_CELSIUS, TIME_SECONDS from homeassistant.helpers.entity import Entity from . import DOMAIN, JuicenetDevice @@ -14,7 +14,7 @@ SENSOR_TYPES = { "voltage": ["Voltage", "V"], "amps": ["Amps", "A"], "watts": ["Watts", POWER_WATT], - "charge_time": ["Charge time", "s"], + "charge_time": ["Charge time", TIME_SECONDS], "energy_added": ["Energy added", ENERGY_WATT_HOUR], } diff --git a/homeassistant/components/lcn/services.py b/homeassistant/components/lcn/services.py index ba9d52b7721..1a5d4475b0e 100644 --- a/homeassistant/components/lcn/services.py +++ b/homeassistant/components/lcn/services.py @@ -7,6 +7,7 @@ from homeassistant.const import ( CONF_BRIGHTNESS, CONF_STATE, CONF_UNIT_OF_MEASUREMENT, + TIME_SECONDS, ) import homeassistant.helpers.config_validation as cv @@ -281,7 +282,7 @@ class SendKeys(LcnServiceCall): vol.Upper, vol.In(SENDKEYCOMMANDS) ), vol.Optional(CONF_TIME, default=0): vol.All(int, vol.Range(min=0)), - vol.Optional(CONF_TIME_UNIT, default="s"): vol.All( + vol.Optional(CONF_TIME_UNIT, default=TIME_SECONDS): vol.All( vol.Upper, vol.In(TIME_UNITS) ), } @@ -324,7 +325,7 @@ class LockKeys(LcnServiceCall): ), vol.Required(CONF_STATE): is_key_lock_states_string, vol.Optional(CONF_TIME, default=0): vol.All(int, vol.Range(min=0)), - vol.Optional(CONF_TIME_UNIT, default="s"): vol.All( + vol.Optional(CONF_TIME_UNIT, default=TIME_SECONDS): vol.All( vol.Upper, vol.In(TIME_UNITS) ), } diff --git a/homeassistant/components/lyft/sensor.py b/homeassistant/components/lyft/sensor.py index 1b90d66398e..d76fe9f0dc5 100644 --- a/homeassistant/components/lyft/sensor.py +++ b/homeassistant/components/lyft/sensor.py @@ -8,6 +8,7 @@ from lyft_rides.errors import APIError import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -88,7 +89,7 @@ class LyftSensor(Entity): if "lyft" not in self._name.lower(): self._name = f"Lyft{self._name}" if self._sensortype == "time": - self._unit_of_measurement = "min" + self._unit_of_measurement = TIME_MINUTES elif self._sensortype == "price": estimate = self._product["estimate"] if estimate is not None: diff --git a/homeassistant/components/meteo_france/const.py b/homeassistant/components/meteo_france/const.py index fae2000b19a..d797f610dca 100644 --- a/homeassistant/components/meteo_france/const.py +++ b/homeassistant/components/meteo_france/const.py @@ -1,6 +1,6 @@ """Meteo-France component constants.""" -from homeassistant.const import TEMP_CELSIUS +from homeassistant.const import TEMP_CELSIUS, TIME_HOURS, TIME_MINUTES DOMAIN = "meteo_france" PLATFORMS = ["sensor", "weather"] @@ -47,13 +47,13 @@ SENSOR_TYPES = { }, "wind_speed": { SENSOR_TYPE_NAME: "Wind Speed", - SENSOR_TYPE_UNIT: "km/h", + SENSOR_TYPE_UNIT: f"km/{TIME_HOURS}", SENSOR_TYPE_ICON: "mdi:weather-windy", SENSOR_TYPE_CLASS: None, }, "next_rain": { SENSOR_TYPE_NAME: "Next rain", - SENSOR_TYPE_UNIT: "min", + SENSOR_TYPE_UNIT: TIME_MINUTES, SENSOR_TYPE_ICON: "mdi:weather-rainy", SENSOR_TYPE_CLASS: None, }, diff --git a/homeassistant/components/minecraft_server/const.py b/homeassistant/components/minecraft_server/const.py index c3ab6615481..d86faf23a81 100644 --- a/homeassistant/components/minecraft_server/const.py +++ b/homeassistant/components/minecraft_server/const.py @@ -30,7 +30,6 @@ SCAN_INTERVAL = 60 SIGNAL_NAME_PREFIX = f"signal_{DOMAIN}" -UNIT_LATENCY_TIME = "ms" UNIT_PLAYERS_MAX = "players" UNIT_PLAYERS_ONLINE = "players" UNIT_PROTOCOL_VERSION = None diff --git a/homeassistant/components/minecraft_server/sensor.py b/homeassistant/components/minecraft_server/sensor.py index 0b37a7d979b..20f9e98e530 100644 --- a/homeassistant/components/minecraft_server/sensor.py +++ b/homeassistant/components/minecraft_server/sensor.py @@ -4,6 +4,7 @@ import logging from typing import Any, Dict from homeassistant.config_entries import ConfigEntry +from homeassistant.const import TIME_MILLISECONDS from homeassistant.helpers.typing import HomeAssistantType from . import MinecraftServer, MinecraftServerEntity @@ -20,7 +21,6 @@ from .const import ( NAME_PLAYERS_ONLINE, NAME_PROTOCOL_VERSION, NAME_VERSION, - UNIT_LATENCY_TIME, UNIT_PLAYERS_MAX, UNIT_PLAYERS_ONLINE, UNIT_PROTOCOL_VERSION, @@ -121,7 +121,7 @@ class MinecraftServerLatencyTimeSensor(MinecraftServerSensorEntity): server=server, type_name=NAME_LATENCY_TIME, icon=ICON_LATENCY_TIME, - unit=UNIT_LATENCY_TIME, + unit=TIME_MILLISECONDS, ) async def async_update(self) -> None: diff --git a/homeassistant/components/mvglive/sensor.py b/homeassistant/components/mvglive/sensor.py index da1db0e02aa..2ceca024a6f 100644 --- a/homeassistant/components/mvglive/sensor.py +++ b/homeassistant/components/mvglive/sensor.py @@ -7,7 +7,7 @@ import MVGLive import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -131,7 +131,7 @@ class MVGLiveSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES def update(self): """Get the latest data and update the state.""" diff --git a/homeassistant/components/netatmo/sensor.py b/homeassistant/components/netatmo/sensor.py index 818662ee69c..b5da37f012f 100644 --- a/homeassistant/components/netatmo/sensor.py +++ b/homeassistant/components/netatmo/sensor.py @@ -9,6 +9,7 @@ from homeassistant.const import ( DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, + TIME_HOURS, ) from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -66,10 +67,10 @@ SENSOR_TYPES = { "max_temp": ["Max Temp.", TEMP_CELSIUS, "mdi:thermometer", None], "windangle": ["Angle", "", "mdi:compass", None], "windangle_value": ["Angle Value", "º", "mdi:compass", None], - "windstrength": ["Wind Strength", "km/h", "mdi:weather-windy", None], + "windstrength": ["Wind Strength", f"km/{TIME_HOURS}", "mdi:weather-windy", None], "gustangle": ["Gust Angle", "", "mdi:compass", None], "gustangle_value": ["Gust Angle Value", "º", "mdi:compass", None], - "guststrength": ["Gust Strength", "km/h", "mdi:weather-windy", None], + "guststrength": ["Gust Strength", f"km/{TIME_HOURS}", "mdi:weather-windy", None], "reachable": ["Reachability", "", "mdi:signal", None], "rf_status": ["Radio", "", "mdi:signal", None], "rf_status_lvl": ["Radio_lvl", "", "mdi:signal", None], diff --git a/homeassistant/components/nmbs/sensor.py b/homeassistant/components/nmbs/sensor.py index 4865b0a9839..dfa43c35952 100644 --- a/homeassistant/components/nmbs/sensor.py +++ b/homeassistant/components/nmbs/sensor.py @@ -11,6 +11,7 @@ from homeassistant.const import ( ATTR_LONGITUDE, CONF_NAME, CONF_SHOW_ON_MAP, + TIME_MINUTES, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -184,7 +185,7 @@ class NMBSSensor(Entity): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/nut/sensor.py b/homeassistant/components/nut/sensor.py index bdf0eaafc99..96db220f5ea 100644 --- a/homeassistant/components/nut/sensor.py +++ b/homeassistant/components/nut/sensor.py @@ -18,6 +18,7 @@ from homeassistant.const import ( POWER_WATT, STATE_UNKNOWN, TEMP_CELSIUS, + TIME_SECONDS, ) from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv @@ -53,13 +54,13 @@ SENSOR_TYPES = { "ups.load": ["Load", "%", "mdi:gauge"], "ups.load.high": ["Overload Setting", "%", "mdi:gauge"], "ups.id": ["System identifier", "", "mdi:information-outline"], - "ups.delay.start": ["Load Restart Delay", "s", "mdi:timer"], - "ups.delay.reboot": ["UPS Reboot Delay", "s", "mdi:timer"], - "ups.delay.shutdown": ["UPS Shutdown Delay", "s", "mdi:timer"], - "ups.timer.start": ["Load Start Timer", "s", "mdi:timer"], - "ups.timer.reboot": ["Load Reboot Timer", "s", "mdi:timer"], - "ups.timer.shutdown": ["Load Shutdown Timer", "s", "mdi:timer"], - "ups.test.interval": ["Self-Test Interval", "s", "mdi:timer"], + "ups.delay.start": ["Load Restart Delay", TIME_SECONDS, "mdi:timer"], + "ups.delay.reboot": ["UPS Reboot Delay", TIME_SECONDS, "mdi:timer"], + "ups.delay.shutdown": ["UPS Shutdown Delay", TIME_SECONDS, "mdi:timer"], + "ups.timer.start": ["Load Start Timer", TIME_SECONDS, "mdi:timer"], + "ups.timer.reboot": ["Load Reboot Timer", TIME_SECONDS, "mdi:timer"], + "ups.timer.shutdown": ["Load Shutdown Timer", TIME_SECONDS, "mdi:timer"], + "ups.test.interval": ["Self-Test Interval", TIME_SECONDS, "mdi:timer"], "ups.test.result": ["Self-Test Result", "", "mdi:information-outline"], "ups.test.date": ["Self-Test Date", "", "mdi:calendar"], "ups.display.language": ["Language", "", "mdi:information-outline"], @@ -89,9 +90,13 @@ SENSOR_TYPES = { "battery.current": ["Battery Current", "A", "mdi:flash"], "battery.current.total": ["Total Battery Current", "A", "mdi:flash"], "battery.temperature": ["Battery Temperature", TEMP_CELSIUS, "mdi:thermometer"], - "battery.runtime": ["Battery Runtime", "s", "mdi:timer"], - "battery.runtime.low": ["Low Battery Runtime", "s", "mdi:timer"], - "battery.runtime.restart": ["Minimum Battery Runtime to Start", "s", "mdi:timer"], + "battery.runtime": ["Battery Runtime", TIME_SECONDS, "mdi:timer"], + "battery.runtime.low": ["Low Battery Runtime", TIME_SECONDS, "mdi:timer"], + "battery.runtime.restart": [ + "Minimum Battery Runtime to Start", + TIME_SECONDS, + "mdi:timer", + ], "battery.alarm.threshold": [ "Battery Alarm Threshold", "", @@ -189,8 +194,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): data.update(no_throttle=True) except data.pynuterror as err: _LOGGER.error( - "Failure while testing NUT status retrieval. Cannot continue setup: %s", - err, + "Failure while testing NUT status retrieval. Cannot continue setup: %s", err ) raise PlatformNotReady diff --git a/homeassistant/components/nzbget/sensor.py b/homeassistant/components/nzbget/sensor.py index 24ef18ab985..89d2c1c01da 100644 --- a/homeassistant/components/nzbget/sensor.py +++ b/homeassistant/components/nzbget/sensor.py @@ -1,7 +1,11 @@ """Monitor the NZBGet API.""" import logging -from homeassistant.const import DATA_MEGABYTES, DATA_RATE_MEGABYTES_PER_SECOND +from homeassistant.const import ( + DATA_MEGABYTES, + DATA_RATE_MEGABYTES_PER_SECOND, + TIME_MINUTES, +) from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity import Entity @@ -26,7 +30,7 @@ SENSOR_TYPES = { "post_job_count": ["PostJobCount", "Post Processing Jobs", "Jobs"], "post_paused": ["PostPaused", "Post Processing Paused", None], "remaining_size": ["RemainingSizeMB", "Queue Size", DATA_MEGABYTES], - "uptime": ["UpTimeSec", "Uptime", "min"], + "uptime": ["UpTimeSec", "Uptime", TIME_MINUTES], } diff --git a/homeassistant/components/octoprint/__init__.py b/homeassistant/components/octoprint/__init__.py index f73e525efe3..06a8ae44f1f 100644 --- a/homeassistant/components/octoprint/__init__.py +++ b/homeassistant/components/octoprint/__init__.py @@ -19,6 +19,7 @@ from homeassistant.const import ( CONF_SSL, CONTENT_TYPE_JSON, TEMP_CELSIUS, + TIME_SECONDS, ) from homeassistant.helpers import discovery import homeassistant.helpers.config_validation as cv @@ -71,8 +72,14 @@ SENSOR_TYPES = { "Temperatures": ["printer", "temperature", "*", TEMP_CELSIUS], "Current State": ["printer", "state", "text", None, "mdi:printer-3d"], "Job Percentage": ["job", "progress", "completion", "%", "mdi:file-percent"], - "Time Remaining": ["job", "progress", "printTimeLeft", "seconds", "mdi:clock-end"], - "Time Elapsed": ["job", "progress", "printTime", "seconds", "mdi:clock-start"], + "Time Remaining": [ + "job", + "progress", + "printTimeLeft", + TIME_SECONDS, + "mdi:clock-end", + ], + "Time Elapsed": ["job", "progress", "printTime", TIME_SECONDS, "mdi:clock-start"], } SENSOR_SCHEMA = vol.Schema( diff --git a/homeassistant/components/openevse/sensor.py b/homeassistant/components/openevse/sensor.py index 0ac655cd448..e0f21f6946d 100644 --- a/homeassistant/components/openevse/sensor.py +++ b/homeassistant/components/openevse/sensor.py @@ -11,6 +11,7 @@ from homeassistant.const import ( CONF_MONITORED_VARIABLES, ENERGY_KILO_WATT_HOUR, TEMP_CELSIUS, + TIME_MINUTES, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -19,7 +20,7 @@ _LOGGER = logging.getLogger(__name__) SENSOR_TYPES = { "status": ["Charging Status", None], - "charge_time": ["Charge Time Elapsed", "minutes"], + "charge_time": ["Charge Time Elapsed", TIME_MINUTES], "ambient_temp": ["Ambient Temperature", TEMP_CELSIUS], "ir_temp": ["IR Temperature", TEMP_CELSIUS], "rtc_temp": ["RTC Temperature", TEMP_CELSIUS], diff --git a/homeassistant/components/opentherm_gw/const.py b/homeassistant/components/opentherm_gw/const.py index bd9b372de33..580f9f7b1a4 100644 --- a/homeassistant/components/opentherm_gw/const.py +++ b/homeassistant/components/opentherm_gw/const.py @@ -1,7 +1,12 @@ """Constants for the opentherm_gw integration.""" import pyotgw.vars as gw_vars -from homeassistant.const import DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS +from homeassistant.const import ( + DEVICE_CLASS_TEMPERATURE, + TEMP_CELSIUS, + TIME_HOURS, + TIME_MINUTES, +) ATTR_GW_ID = "gateway_id" ATTR_LEVEL = "level" @@ -31,9 +36,8 @@ SERVICE_SET_OAT = "set_outside_temperature" SERVICE_SET_SB_TEMP = "set_setback_temperature" UNIT_BAR = "bar" -UNIT_HOUR = "h" UNIT_KW = "kW" -UNIT_L_MIN = "L/min" +UNIT_L_MIN = f"L/{TIME_MINUTES}" UNIT_PERCENT = "%" BINARY_SENSOR_INFO = { @@ -237,10 +241,10 @@ SENSOR_INFO = { gw_vars.DATA_CH_PUMP_STARTS: [None, None, "Central Heating Pump Starts {}"], gw_vars.DATA_DHW_PUMP_STARTS: [None, None, "Hot Water Pump Starts {}"], gw_vars.DATA_DHW_BURNER_STARTS: [None, None, "Hot Water Burner Starts {}"], - gw_vars.DATA_TOTAL_BURNER_HOURS: [None, UNIT_HOUR, "Total Burner Hours {}"], - gw_vars.DATA_CH_PUMP_HOURS: [None, UNIT_HOUR, "Central Heating Pump Hours {}"], - gw_vars.DATA_DHW_PUMP_HOURS: [None, UNIT_HOUR, "Hot Water Pump Hours {}"], - gw_vars.DATA_DHW_BURNER_HOURS: [None, UNIT_HOUR, "Hot Water Burner Hours {}"], + gw_vars.DATA_TOTAL_BURNER_HOURS: [None, TIME_HOURS, "Total Burner Hours {}"], + gw_vars.DATA_CH_PUMP_HOURS: [None, TIME_HOURS, "Central Heating Pump Hours {}"], + gw_vars.DATA_DHW_PUMP_HOURS: [None, TIME_HOURS, "Hot Water Pump Hours {}"], + gw_vars.DATA_DHW_BURNER_HOURS: [None, TIME_HOURS, "Hot Water Burner Hours {}"], gw_vars.DATA_MASTER_OT_VERSION: [None, None, "Thermostat OpenTherm Version {}"], gw_vars.DATA_SLAVE_OT_VERSION: [None, None, "Boiler OpenTherm Version {}"], gw_vars.DATA_MASTER_PRODUCT_TYPE: [None, None, "Thermostat Product Type {}"], diff --git a/homeassistant/components/openuv/sensor.py b/homeassistant/components/openuv/sensor.py index 2df62bcc09f..a375cfa10d7 100644 --- a/homeassistant/components/openuv/sensor.py +++ b/homeassistant/components/openuv/sensor.py @@ -1,6 +1,7 @@ """Support for OpenUV sensors.""" import logging +from homeassistant.const import TIME_MINUTES from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.util.dt import as_local, parse_datetime @@ -50,32 +51,32 @@ SENSORS = { TYPE_SAFE_EXPOSURE_TIME_1: ( "Skin Type 1 Safe Exposure Time", "mdi:timer", - "minutes", + TIME_MINUTES, ), TYPE_SAFE_EXPOSURE_TIME_2: ( "Skin Type 2 Safe Exposure Time", "mdi:timer", - "minutes", + TIME_MINUTES, ), TYPE_SAFE_EXPOSURE_TIME_3: ( "Skin Type 3 Safe Exposure Time", "mdi:timer", - "minutes", + TIME_MINUTES, ), TYPE_SAFE_EXPOSURE_TIME_4: ( "Skin Type 4 Safe Exposure Time", "mdi:timer", - "minutes", + TIME_MINUTES, ), TYPE_SAFE_EXPOSURE_TIME_5: ( "Skin Type 5 Safe Exposure Time", "mdi:timer", - "minutes", + TIME_MINUTES, ), TYPE_SAFE_EXPOSURE_TIME_6: ( "Skin Type 6 Safe Exposure Time", "mdi:timer", - "minutes", + TIME_MINUTES, ), } diff --git a/homeassistant/components/openweathermap/sensor.py b/homeassistant/components/openweathermap/sensor.py index 23f88f59aad..0fead516b7e 100644 --- a/homeassistant/components/openweathermap/sensor.py +++ b/homeassistant/components/openweathermap/sensor.py @@ -14,6 +14,7 @@ from homeassistant.const import ( CONF_NAME, TEMP_CELSIUS, TEMP_FAHRENHEIT, + TIME_SECONDS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -33,7 +34,7 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=120) SENSOR_TYPES = { "weather": ["Condition", None], "temperature": ["Temperature", None], - "wind_speed": ["Wind speed", "m/s"], + "wind_speed": ["Wind speed", f"m/{TIME_SECONDS}"], "wind_bearing": ["Wind bearing", "°"], "humidity": ["Humidity", "%"], "pressure": ["Pressure", "mbar"], diff --git a/homeassistant/components/raincloud/__init__.py b/homeassistant/components/raincloud/__init__.py index dd851c0b3e3..41fefbe8fca 100644 --- a/homeassistant/components/raincloud/__init__.py +++ b/homeassistant/components/raincloud/__init__.py @@ -11,6 +11,8 @@ from homeassistant.const import ( CONF_PASSWORD, CONF_SCAN_INTERVAL, CONF_USERNAME, + TIME_DAYS, + TIME_MINUTES, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send @@ -60,9 +62,9 @@ UNIT_OF_MEASUREMENT_MAP = { "is_watering": "", "manual_watering": "", "next_cycle": "", - "rain_delay": "days", + "rain_delay": TIME_DAYS, "status": "", - "watering_time": "min", + "watering_time": TIME_MINUTES, } BINARY_SENSORS = ["is_watering", "status"] diff --git a/homeassistant/components/rejseplanen/sensor.py b/homeassistant/components/rejseplanen/sensor.py index 419600ce562..8fdd1f2f858 100644 --- a/homeassistant/components/rejseplanen/sensor.py +++ b/homeassistant/components/rejseplanen/sensor.py @@ -12,7 +12,7 @@ import rjpl import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity import homeassistant.util.dt as dt_util @@ -130,7 +130,7 @@ class RejseplanenTransportSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/rmvtransport/sensor.py b/homeassistant/components/rmvtransport/sensor.py index 507e3c133cc..704bde67a5c 100644 --- a/homeassistant/components/rmvtransport/sensor.py +++ b/homeassistant/components/rmvtransport/sensor.py @@ -8,7 +8,7 @@ from RMVtransport.rmvtransport import RMVtransportApiConnectionError import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -177,7 +177,7 @@ class RMVDepartureSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES async def async_update(self): """Get the latest data and update the state.""" diff --git a/homeassistant/components/saj/sensor.py b/homeassistant/components/saj/sensor.py index 797780d562a..55c2371aabb 100644 --- a/homeassistant/components/saj/sensor.py +++ b/homeassistant/components/saj/sensor.py @@ -22,6 +22,7 @@ from homeassistant.const import ( POWER_WATT, TEMP_CELSIUS, TEMP_FAHRENHEIT, + TIME_HOURS, ) from homeassistant.core import CALLBACK_TYPE, callback from homeassistant.exceptions import PlatformNotReady @@ -34,13 +35,11 @@ _LOGGER = logging.getLogger(__name__) MIN_INTERVAL = 5 MAX_INTERVAL = 300 -UNIT_OF_MEASUREMENT_HOURS = "h" - INVERTER_TYPES = ["ethernet", "wifi"] SAJ_UNIT_MAPPINGS = { "": None, - "h": UNIT_OF_MEASUREMENT_HOURS, + "h": TIME_HOURS, "kg": MASS_KILOGRAMS, "kWh": ENERGY_KILO_WATT_HOUR, "W": POWER_WATT, diff --git a/homeassistant/components/speedtestdotnet/const.py b/homeassistant/components/speedtestdotnet/const.py index a08c9421c76..2fed2609fb3 100644 --- a/homeassistant/components/speedtestdotnet/const.py +++ b/homeassistant/components/speedtestdotnet/const.py @@ -1,12 +1,12 @@ """Consts used by Speedtest.net.""" -from homeassistant.const import DATA_RATE_MEGABITS_PER_SECOND +from homeassistant.const import DATA_RATE_MEGABITS_PER_SECOND, TIME_MILLISECONDS DOMAIN = "speedtestdotnet" DATA_UPDATED = f"{DOMAIN}_data_updated" SENSOR_TYPES = { - "ping": ["Ping", "ms"], + "ping": ["Ping", TIME_MILLISECONDS], "download": ["Download", DATA_RATE_MEGABITS_PER_SECOND], "upload": ["Upload", DATA_RATE_MEGABITS_PER_SECOND], } diff --git a/homeassistant/components/tellduslive/sensor.py b/homeassistant/components/tellduslive/sensor.py index 7d9f940f391..e3cb1e48c37 100644 --- a/homeassistant/components/tellduslive/sensor.py +++ b/homeassistant/components/tellduslive/sensor.py @@ -8,6 +8,8 @@ from homeassistant.const import ( DEVICE_CLASS_TEMPERATURE, POWER_WATT, TEMP_CELSIUS, + TIME_HOURS, + TIME_SECONDS, ) from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -36,11 +38,11 @@ SENSOR_TYPES = { DEVICE_CLASS_TEMPERATURE, ], SENSOR_TYPE_HUMIDITY: ["Humidity", "%", None, DEVICE_CLASS_HUMIDITY], - SENSOR_TYPE_RAINRATE: ["Rain rate", "mm/h", "mdi:water", None], + SENSOR_TYPE_RAINRATE: ["Rain rate", f"mm/{TIME_HOURS}", "mdi:water", None], SENSOR_TYPE_RAINTOTAL: ["Rain total", "mm", "mdi:water", None], SENSOR_TYPE_WINDDIRECTION: ["Wind direction", "", "", None], - SENSOR_TYPE_WINDAVERAGE: ["Wind average", "m/s", "", None], - SENSOR_TYPE_WINDGUST: ["Wind gust", "m/s", "", None], + SENSOR_TYPE_WINDAVERAGE: ["Wind average", f"m/{TIME_SECONDS}", "", None], + SENSOR_TYPE_WINDGUST: ["Wind gust", f"m/{TIME_SECONDS}", "", None], SENSOR_TYPE_UV: ["UV", "UV", "", None], SENSOR_TYPE_WATT: ["Power", POWER_WATT, "", None], SENSOR_TYPE_LUMINANCE: ["Luminance", "lx", None, DEVICE_CLASS_ILLUMINANCE], diff --git a/homeassistant/components/tmb/sensor.py b/homeassistant/components/tmb/sensor.py index 6d8bdc7eac7..8eb0673aa73 100644 --- a/homeassistant/components/tmb/sensor.py +++ b/homeassistant/components/tmb/sensor.py @@ -7,7 +7,7 @@ from tmb import IBus import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME +from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -72,7 +72,7 @@ class TMBSensor(Entity): self._stop = stop self._line = line.upper() self._name = name - self._unit = "minutes" + self._unit = TIME_MINUTES self._state = None @property diff --git a/homeassistant/components/trafikverket_weatherstation/sensor.py b/homeassistant/components/trafikverket_weatherstation/sensor.py index 802bb897b96..b57a24d0ced 100644 --- a/homeassistant/components/trafikverket_weatherstation/sensor.py +++ b/homeassistant/components/trafikverket_weatherstation/sensor.py @@ -17,6 +17,7 @@ from homeassistant.const import ( DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS, + TIME_SECONDS, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -71,7 +72,13 @@ SENSOR_TYPES = { "mdi:flag-triangle", None, ], - "wind_speed": ["Wind speed", "m/s", "windforce", "mdi:weather-windy", None], + "wind_speed": [ + "Wind speed", + f"m/{TIME_SECONDS}", + "windforce", + "mdi:weather-windy", + None, + ], "humidity": [ "Humidity", "%", diff --git a/homeassistant/components/transport_nsw/sensor.py b/homeassistant/components/transport_nsw/sensor.py index 7c6990de085..e877e2d2e43 100644 --- a/homeassistant/components/transport_nsw/sensor.py +++ b/homeassistant/components/transport_nsw/sensor.py @@ -6,7 +6,13 @@ from TransportNSW import TransportNSW import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION, ATTR_MODE, CONF_API_KEY, CONF_NAME +from homeassistant.const import ( + ATTR_ATTRIBUTION, + ATTR_MODE, + CONF_API_KEY, + CONF_NAME, + TIME_MINUTES, +) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -101,7 +107,7 @@ class TransportNSWSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/travisci/sensor.py b/homeassistant/components/travisci/sensor.py index ba698c2b64d..ffbe5239cc9 100644 --- a/homeassistant/components/travisci/sensor.py +++ b/homeassistant/components/travisci/sensor.py @@ -12,6 +12,7 @@ from homeassistant.const import ( CONF_API_KEY, CONF_MONITORED_CONDITIONS, CONF_SCAN_INTERVAL, + TIME_SECONDS, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -30,7 +31,7 @@ SCAN_INTERVAL = timedelta(seconds=30) # sensor_type [ description, unit, icon ] SENSOR_TYPES = { "last_build_id": ["Last Build ID", "", "mdi:account-card-details"], - "last_build_duration": ["Last Build Duration", "sec", "mdi:timelapse"], + "last_build_duration": ["Last Build Duration", TIME_SECONDS, "mdi:timelapse"], "last_build_finished_at": ["Last Build Finished At", "", "mdi:timetable"], "last_build_started_at": ["Last Build Started At", "", "mdi:timetable"], "last_build_state": ["Last Build State", "", "mdi:github-circle"], diff --git a/homeassistant/components/uk_transport/sensor.py b/homeassistant/components/uk_transport/sensor.py index 77b1c1a6f11..77929436283 100644 --- a/homeassistant/components/uk_transport/sensor.py +++ b/homeassistant/components/uk_transport/sensor.py @@ -7,7 +7,7 @@ import requests import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_MODE +from homeassistant.const import CONF_MODE, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle @@ -119,7 +119,7 @@ class UkTransportSensor(Entity): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/upnp/sensor.py b/homeassistant/components/upnp/sensor.py index db121678d93..fdb5bc5100a 100644 --- a/homeassistant/components/upnp/sensor.py +++ b/homeassistant/components/upnp/sensor.py @@ -1,6 +1,7 @@ """Support for UPnP/IGD Sensors.""" import logging +from homeassistant.const import TIME_SECONDS from homeassistant.core import callback from homeassistant.helpers import device_registry as dr from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -192,7 +193,7 @@ class PerSecondUPnPIGDSensor(UpnpSensor): @property def unit_of_measurement(self) -> str: """Return the unit of measurement of this entity, if any.""" - return f"{self.unit}/s" + return f"{self.unit}/{TIME_SECONDS}" def _is_overflowed(self, new_value) -> bool: """Check if value has overflowed.""" diff --git a/homeassistant/components/viaggiatreno/sensor.py b/homeassistant/components/viaggiatreno/sensor.py index ef05bcf2adb..783581a0755 100644 --- a/homeassistant/components/viaggiatreno/sensor.py +++ b/homeassistant/components/viaggiatreno/sensor.py @@ -7,7 +7,7 @@ import async_timeout import voluptuous as vol from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import ATTR_ATTRIBUTION +from homeassistant.const import ATTR_ATTRIBUTION, TIME_MINUTES import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -177,5 +177,5 @@ class ViaggiaTrenoSensor(Entity): self._unit = "" else: self._state = res.get("ritardo") - self._unit = "min" + self._unit = TIME_MINUTES self._icon = ICON diff --git a/homeassistant/components/waze_travel_time/sensor.py b/homeassistant/components/waze_travel_time/sensor.py index b9ca64c0970..0357825cb12 100644 --- a/homeassistant/components/waze_travel_time/sensor.py +++ b/homeassistant/components/waze_travel_time/sensor.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_UNIT_SYSTEM_IMPERIAL, CONF_UNIT_SYSTEM_METRIC, EVENT_HOMEASSISTANT_START, + TIME_MINUTES, ) from homeassistant.helpers import location import homeassistant.helpers.config_validation as cv @@ -167,7 +168,7 @@ class WazeTravelTime(Entity): @property def unit_of_measurement(self): """Return the unit of measurement.""" - return "min" + return TIME_MINUTES @property def icon(self): diff --git a/homeassistant/components/whois/sensor.py b/homeassistant/components/whois/sensor.py index dc9da1100f0..7ec5c3dac5e 100644 --- a/homeassistant/components/whois/sensor.py +++ b/homeassistant/components/whois/sensor.py @@ -6,7 +6,7 @@ import voluptuous as vol import whois from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import CONF_NAME +from homeassistant.const import CONF_NAME, TIME_DAYS import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -75,7 +75,7 @@ class WhoisSensor(Entity): @property def unit_of_measurement(self): """Return the unit of measurement to present the value in.""" - return "days" + return TIME_DAYS @property def state(self): diff --git a/homeassistant/components/withings/const.py b/homeassistant/components/withings/const.py index 856f50ce9ad..82081eee2fa 100644 --- a/homeassistant/components/withings/const.py +++ b/homeassistant/components/withings/const.py @@ -61,10 +61,9 @@ MEAS_WEIGHT_KG = "weight_kg" UOM_BEATS_PER_MINUTE = "bpm" UOM_BREATHS_PER_MINUTE = "br/m" UOM_FREQUENCY = "times" -UOM_METERS_PER_SECOND = "m/s" +UOM_METERS_PER_SECOND = f"m/{const.TIME_SECONDS}" UOM_MMHG = "mmhg" UOM_PERCENT = "%" UOM_LENGTH_M = const.LENGTH_METERS UOM_MASS_KG = const.MASS_KILOGRAMS -UOM_SECONDS = "seconds" UOM_TEMP_C = const.TEMP_CELSIUS diff --git a/homeassistant/components/withings/sensor.py b/homeassistant/components/withings/sensor.py index ea570569fa6..c690580ffa4 100644 --- a/homeassistant/components/withings/sensor.py +++ b/homeassistant/components/withings/sensor.py @@ -13,6 +13,7 @@ from withings_api.common import ( ) from homeassistant.config_entries import ConfigEntry +from homeassistant.const import TIME_SECONDS from homeassistant.core import HomeAssistant from homeassistant.helpers import config_entry_oauth2_flow from homeassistant.helpers.entity import Entity @@ -197,28 +198,28 @@ WITHINGS_ATTRIBUTES = [ const.MEAS_SLEEP_WAKEUP_DURATION_SECONDS, GetSleepSummaryField.WAKEUP_DURATION.value, "Wakeup time", - const.UOM_SECONDS, + TIME_SECONDS, "mdi:sleep-off", ), WithingsSleepSummaryAttribute( const.MEAS_SLEEP_LIGHT_DURATION_SECONDS, GetSleepSummaryField.LIGHT_SLEEP_DURATION.value, "Light sleep", - const.UOM_SECONDS, + TIME_SECONDS, "mdi:sleep", ), WithingsSleepSummaryAttribute( const.MEAS_SLEEP_DEEP_DURATION_SECONDS, GetSleepSummaryField.DEEP_SLEEP_DURATION.value, "Deep sleep", - const.UOM_SECONDS, + TIME_SECONDS, "mdi:sleep", ), WithingsSleepSummaryAttribute( const.MEAS_SLEEP_REM_DURATION_SECONDS, GetSleepSummaryField.REM_SLEEP_DURATION.value, "REM sleep", - const.UOM_SECONDS, + TIME_SECONDS, "mdi:sleep", ), WithingsSleepSummaryAttribute( @@ -232,14 +233,14 @@ WITHINGS_ATTRIBUTES = [ const.MEAS_SLEEP_TOSLEEP_DURATION_SECONDS, GetSleepSummaryField.DURATION_TO_SLEEP.value, "Time to sleep", - const.UOM_SECONDS, + TIME_SECONDS, "mdi:sleep", ), WithingsSleepSummaryAttribute( const.MEAS_SLEEP_TOWAKEUP_DURATION_SECONDS, GetSleepSummaryField.DURATION_TO_WAKEUP.value, "Time to wakeup", - const.UOM_SECONDS, + TIME_SECONDS, "mdi:sleep-off", ), WithingsSleepSummaryAttribute( diff --git a/homeassistant/components/wsdot/sensor.py b/homeassistant/components/wsdot/sensor.py index 5afa3a3efcf..6ee55aa387f 100644 --- a/homeassistant/components/wsdot/sensor.py +++ b/homeassistant/components/wsdot/sensor.py @@ -13,6 +13,7 @@ from homeassistant.const import ( CONF_API_KEY, CONF_ID, CONF_NAME, + TIME_MINUTES, ) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity @@ -137,7 +138,7 @@ class WashingtonStateTravelTimeSensor(WashingtonStateTransportSensor): @property def unit_of_measurement(self): """Return the unit this state is expressed in.""" - return "min" + return TIME_MINUTES def _parse_wsdot_timestamp(timestamp): diff --git a/homeassistant/components/yr/sensor.py b/homeassistant/components/yr/sensor.py index c9392561fc8..63fe4012fe5 100644 --- a/homeassistant/components/yr/sensor.py +++ b/homeassistant/components/yr/sensor.py @@ -22,6 +22,7 @@ from homeassistant.const import ( DEVICE_CLASS_TEMPERATURE, PRESSURE_HPA, TEMP_CELSIUS, + TIME_SECONDS, ) from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv @@ -41,8 +42,8 @@ SENSOR_TYPES = { "symbol": ["Symbol", None, None], "precipitation": ["Precipitation", "mm", None], "temperature": ["Temperature", TEMP_CELSIUS, DEVICE_CLASS_TEMPERATURE], - "windSpeed": ["Wind speed", "m/s", None], - "windGust": ["Wind gust", "m/s", None], + "windSpeed": ["Wind speed", f"m/{TIME_SECONDS}", None], + "windGust": ["Wind gust", f"m/{TIME_SECONDS}", None], "pressure": ["Pressure", PRESSURE_HPA, DEVICE_CLASS_PRESSURE], "windDirection": ["Wind direction", "°", None], "humidity": ["Humidity", "%", DEVICE_CLASS_HUMIDITY], diff --git a/homeassistant/components/zamg/sensor.py b/homeassistant/components/zamg/sensor.py index 44c216eb1be..6e96d28e176 100644 --- a/homeassistant/components/zamg/sensor.py +++ b/homeassistant/components/zamg/sensor.py @@ -17,6 +17,7 @@ from homeassistant.const import ( CONF_LONGITUDE, CONF_MONITORED_CONDITIONS, CONF_NAME, + TIME_HOURS, __version__, ) import homeassistant.helpers.config_validation as cv @@ -39,9 +40,14 @@ SENSOR_TYPES = { "pressure": ("Pressure", "hPa", "LDstat hPa", float), "pressure_sealevel": ("Pressure at Sea Level", "hPa", "LDred hPa", float), "humidity": ("Humidity", "%", "RF %", int), - "wind_speed": ("Wind Speed", "km/h", "WG km/h", float), + "wind_speed": ("Wind Speed", f"km/{TIME_HOURS}", f"WG km/{TIME_HOURS}", float), "wind_bearing": ("Wind Bearing", "°", "WR °", int), - "wind_max_speed": ("Top Wind Speed", "km/h", "WSG km/h", float), + "wind_max_speed": ( + "Top Wind Speed", + f"km/{TIME_HOURS}", + f"WSG km/{TIME_HOURS}", + float, + ), "wind_max_bearing": ("Top Wind Bearing", "°", "WSR °", int), "sun_last_hour": ("Sun Last Hour", "%", "SO %", int), "temperature": ("Temperature", "°C", "T °C", float), diff --git a/homeassistant/components/zha/core/channels/smartenergy.py b/homeassistant/components/zha/core/channels/smartenergy.py index b738b665e80..c7cad5e455d 100644 --- a/homeassistant/components/zha/core/channels/smartenergy.py +++ b/homeassistant/components/zha/core/channels/smartenergy.py @@ -3,6 +3,7 @@ import logging import zigpy.zcl.clusters.smartenergy as smartenergy +from homeassistant.const import TIME_HOURS, TIME_SECONDS from homeassistant.core import callback from .. import registries, typing as zha_typing @@ -76,18 +77,18 @@ class Metering(AttributeListeningChannel): unit_of_measure_map = { 0x00: "kW", - 0x01: "m³/h", - 0x02: "ft³/h", - 0x03: "ccf/h", - 0x04: "US gal/h", - 0x05: "IMP gal/h", - 0x06: "BTU/h", - 0x07: "l/h", + 0x01: f"m³/{TIME_HOURS}", + 0x02: f"ft³/{TIME_HOURS}", + 0x03: f"ccf/{TIME_HOURS}", + 0x04: f"US gal/{TIME_HOURS}", + 0x05: f"IMP gal/{TIME_HOURS}", + 0x06: f"BTU/{TIME_HOURS}", + 0x07: f"l/{TIME_HOURS}", 0x08: "kPa", 0x09: "kPa", - 0x0A: "mcf/h", + 0x0A: f"mcf/{TIME_HOURS}", 0x0B: "unitless", - 0x0C: "MJ/s", + 0x0C: f"MJ/{TIME_SECONDS}", } def __init__( diff --git a/homeassistant/const.py b/homeassistant/const.py index 50ce3e084b8..32dfac973a2 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -343,6 +343,17 @@ ENERGY_WATT_HOUR = "Wh" TEMP_CELSIUS = "°C" TEMP_FAHRENHEIT = "°F" +# Time units +TIME_MICROSECONDS = "μs" +TIME_MILLISECONDS = "ms" +TIME_SECONDS = "s" +TIME_MINUTES = "min" +TIME_HOURS = "h" +TIME_DAYS = "d" +TIME_WEEKS = "w" +TIME_MONTHS = "m" +TIME_YEARS = "y" + # Length units LENGTH_CENTIMETERS: str = "cm" LENGTH_METERS: str = "m" @@ -400,17 +411,17 @@ DATA_PEBIBYTES = "PiB" DATA_EXBIBYTES = "EiB" DATA_ZEBIBYTES = "ZiB" DATA_YOBIBYTES = "YiB" -DATA_RATE_BITS_PER_SECOND = f"{DATA_BITS}/s" -DATA_RATE_KILOBITS_PER_SECOND = f"{DATA_KILOBITS}/s" -DATA_RATE_MEGABITS_PER_SECOND = f"{DATA_MEGABITS}/s" -DATA_RATE_GIGABITS_PER_SECOND = f"{DATA_GIGABITS}/s" -DATA_RATE_BYTES_PER_SECOND = f"{DATA_BYTES}/s" -DATA_RATE_KILOBYTES_PER_SECOND = f"{DATA_KILOBYTES}/s" -DATA_RATE_MEGABYTES_PER_SECOND = f"{DATA_MEGABYTES}/s" -DATA_RATE_GIGABYTES_PER_SECOND = f"{DATA_GIGABYTES}/s" -DATA_RATE_KIBIBYTES_PER_SECOND = f"{DATA_KIBIBYTES}/s" -DATA_RATE_MEBIBYTES_PER_SECOND = f"{DATA_MEBIBYTES}/s" -DATA_RATE_GIBIBYTES_PER_SECOND = f"{DATA_GIBIBYTES}/s" +DATA_RATE_BITS_PER_SECOND = f"{DATA_BITS}/{TIME_SECONDS}" +DATA_RATE_KILOBITS_PER_SECOND = f"{DATA_KILOBITS}/{TIME_SECONDS}" +DATA_RATE_MEGABITS_PER_SECOND = f"{DATA_MEGABITS}/{TIME_SECONDS}" +DATA_RATE_GIGABITS_PER_SECOND = f"{DATA_GIGABITS}/{TIME_SECONDS}" +DATA_RATE_BYTES_PER_SECOND = f"{DATA_BYTES}/{TIME_SECONDS}" +DATA_RATE_KILOBYTES_PER_SECOND = f"{DATA_KILOBYTES}/{TIME_SECONDS}" +DATA_RATE_MEGABYTES_PER_SECOND = f"{DATA_MEGABYTES}/{TIME_SECONDS}" +DATA_RATE_GIGABYTES_PER_SECOND = f"{DATA_GIGABYTES}/{TIME_SECONDS}" +DATA_RATE_KIBIBYTES_PER_SECOND = f"{DATA_KIBIBYTES}/{TIME_SECONDS}" +DATA_RATE_MEBIBYTES_PER_SECOND = f"{DATA_MEBIBYTES}/{TIME_SECONDS}" +DATA_RATE_GIBIBYTES_PER_SECOND = f"{DATA_GIBIBYTES}/{TIME_SECONDS}" # #### SERVICES #### SERVICE_HOMEASSISTANT_STOP = "stop" diff --git a/tests/components/derivative/test_sensor.py b/tests/components/derivative/test_sensor.py index 9a26d2de5ce..dc160b283ad 100644 --- a/tests/components/derivative/test_sensor.py +++ b/tests/components/derivative/test_sensor.py @@ -2,6 +2,7 @@ from datetime import timedelta from unittest.mock import patch +from homeassistant.const import TIME_HOURS, TIME_MINUTES, TIME_SECONDS from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -79,7 +80,7 @@ async def test_dataSet1(hass): """Test derivative sensor state.""" await setup_tests( hass, - {"unit_time": "s"}, + {"unit_time": TIME_SECONDS}, times=[20, 30, 40, 50], values=[10, 30, 5, 0], expected_state=-0.5, @@ -89,30 +90,46 @@ async def test_dataSet1(hass): async def test_dataSet2(hass): """Test derivative sensor state.""" await setup_tests( - hass, {"unit_time": "s"}, times=[20, 30], values=[5, 0], expected_state=-0.5 + hass, + {"unit_time": TIME_SECONDS}, + times=[20, 30], + values=[5, 0], + expected_state=-0.5, ) async def test_dataSet3(hass): """Test derivative sensor state.""" state = await setup_tests( - hass, {"unit_time": "s"}, times=[20, 30], values=[5, 10], expected_state=0.5 + hass, + {"unit_time": TIME_SECONDS}, + times=[20, 30], + values=[5, 10], + expected_state=0.5, ) - assert state.attributes.get("unit_of_measurement") == "/s" + assert state.attributes.get("unit_of_measurement") == f"/{TIME_SECONDS}" async def test_dataSet4(hass): """Test derivative sensor state.""" await setup_tests( - hass, {"unit_time": "s"}, times=[20, 30], values=[5, 5], expected_state=0 + hass, + {"unit_time": TIME_SECONDS}, + times=[20, 30], + values=[5, 5], + expected_state=0, ) async def test_dataSet5(hass): """Test derivative sensor state.""" await setup_tests( - hass, {"unit_time": "s"}, times=[20, 30], values=[10, -10], expected_state=-2 + hass, + {"unit_time": TIME_SECONDS}, + times=[20, 30], + values=[10, -10], + expected_state=-2, ) @@ -137,7 +154,12 @@ async def test_data_moving_average_for_discrete_sensor(hass): times = list(range(0, 1800 + 30, 30)) config, entity_id = await _setup_sensor( - hass, {"time_window": {"seconds": time_window}, "unit_time": "min", "round": 1} + hass, + { + "time_window": {"seconds": time_window}, + "unit_time": TIME_MINUTES, + "round": 1, + }, ) # two minute window for time, value in zip(times, temperature_values): @@ -186,7 +208,7 @@ async def test_prefix(hass): # Testing a power sensor at 1000 Watts for 1hour = 0kW/h assert round(float(state.state), config["sensor"]["round"]) == 0.0 - assert state.attributes.get("unit_of_measurement") == "kW/h" + assert state.attributes.get("unit_of_measurement") == f"kW/{TIME_HOURS}" async def test_suffix(hass): @@ -198,7 +220,7 @@ async def test_suffix(hass): "source": "sensor.bytes_per_second", "round": 2, "unit_prefix": "k", - "unit_time": "s", + "unit_time": TIME_SECONDS, } } diff --git a/tests/components/dsmr/test_sensor.py b/tests/components/dsmr/test_sensor.py index c881f4b9168..e3d5e62f435 100644 --- a/tests/components/dsmr/test_sensor.py +++ b/tests/components/dsmr/test_sensor.py @@ -15,6 +15,7 @@ import pytest from homeassistant.bootstrap import async_setup_component from homeassistant.components.dsmr.sensor import DerivativeDSMREntity +from homeassistant.const import TIME_HOURS from tests.common import assert_setup_component @@ -140,7 +141,7 @@ async def test_derivative(): abs(entity.state - 0.033) < 0.00001 ), "state should be hourly usage calculated from first and second update" - assert entity.unit_of_measurement == "m3/h" + assert entity.unit_of_measurement == f"m3/{TIME_HOURS}" async def test_v4_meter(hass, mock_connection_factory): @@ -240,9 +241,7 @@ async def test_belgian_meter_low(hass, mock_connection_factory): config = {"platform": "dsmr", "dsmr_version": "5B"} - telegram = { - ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0002", "unit": ""}]), - } + telegram = {ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0002", "unit": ""}])} with assert_setup_component(1): await async_setup_component(hass, "sensor", {"sensor": config}) diff --git a/tests/components/dyson/test_sensor.py b/tests/components/dyson/test_sensor.py index 442ea913b46..e540d304731 100644 --- a/tests/components/dyson/test_sensor.py +++ b/tests/components/dyson/test_sensor.py @@ -8,7 +8,7 @@ from libpurecool.dyson_pure_cool_link import DysonPureCoolLink from homeassistant.components import dyson as dyson_parent from homeassistant.components.dyson import sensor as dyson -from homeassistant.const import STATE_OFF, TEMP_CELSIUS, TEMP_FAHRENHEIT +from homeassistant.const import STATE_OFF, TEMP_CELSIUS, TEMP_FAHRENHEIT, TIME_HOURS from homeassistant.helpers import discovery from homeassistant.setup import async_setup_component @@ -123,7 +123,7 @@ class DysonTest(unittest.TestCase): sensor.entity_id = "sensor.dyson_1" assert not sensor.should_poll assert sensor.state is None - assert sensor.unit_of_measurement == "hours" + assert sensor.unit_of_measurement == TIME_HOURS assert sensor.name == "Device_name Filter Life" assert sensor.entity_id == "sensor.dyson_1" sensor.on_message("message") @@ -135,7 +135,7 @@ class DysonTest(unittest.TestCase): sensor.entity_id = "sensor.dyson_1" assert not sensor.should_poll assert sensor.state == 100 - assert sensor.unit_of_measurement == "hours" + assert sensor.unit_of_measurement == TIME_HOURS assert sensor.name == "Device_name Filter Life" assert sensor.entity_id == "sensor.dyson_1" sensor.on_message("message") diff --git a/tests/components/here_travel_time/test_sensor.py b/tests/components/here_travel_time/test_sensor.py index 4456b256f6e..fcae8bd1f8c 100644 --- a/tests/components/here_travel_time/test_sensor.py +++ b/tests/components/here_travel_time/test_sensor.py @@ -28,6 +28,7 @@ from homeassistant.components.here_travel_time.sensor import ( ROUTE_MODE_FASTEST, ROUTE_MODE_SHORTEST, SCAN_INTERVAL, + TIME_MINUTES, TRAFFIC_MODE_DISABLED, TRAFFIC_MODE_ENABLED, TRAVEL_MODE_BICYCLE, @@ -36,7 +37,6 @@ from homeassistant.components.here_travel_time.sensor import ( TRAVEL_MODE_PUBLIC, TRAVEL_MODE_PUBLIC_TIME_TABLE, TRAVEL_MODE_TRUCK, - UNIT_OF_MEASUREMENT, ) from homeassistant.const import ATTR_ICON, EVENT_HOMEASSISTANT_START from homeassistant.setup import async_setup_component @@ -83,7 +83,7 @@ def _build_mock_url(origin, destination, modes, api_key, departure): def _assert_truck_sensor(sensor): """Assert that states and attributes are correct for truck_response.""" assert sensor.state == "14" - assert sensor.attributes.get("unit_of_measurement") == UNIT_OF_MEASUREMENT + assert sensor.attributes.get("unit_of_measurement") == TIME_MINUTES assert sensor.attributes.get(ATTR_ATTRIBUTION) is None assert sensor.attributes.get(ATTR_DURATION) == 13.533333333333333 @@ -177,7 +177,7 @@ async def test_car(hass, requests_mock_car_disabled_response): sensor = hass.states.get("sensor.test") assert sensor.state == "30" - assert sensor.attributes.get("unit_of_measurement") == UNIT_OF_MEASUREMENT + assert sensor.attributes.get("unit_of_measurement") == TIME_MINUTES assert sensor.attributes.get(ATTR_ATTRIBUTION) is None assert sensor.attributes.get(ATTR_DURATION) == 30.05 assert sensor.attributes.get(ATTR_DISTANCE) == 23.903 @@ -381,7 +381,7 @@ async def test_public_transport(hass, requests_mock_credentials_check): sensor = hass.states.get("sensor.test") assert sensor.state == "89" - assert sensor.attributes.get("unit_of_measurement") == UNIT_OF_MEASUREMENT + assert sensor.attributes.get("unit_of_measurement") == TIME_MINUTES assert sensor.attributes.get(ATTR_ATTRIBUTION) is None assert sensor.attributes.get(ATTR_DURATION) == 89.16666666666667 @@ -431,7 +431,7 @@ async def test_public_transport_time_table(hass, requests_mock_credentials_check sensor = hass.states.get("sensor.test") assert sensor.state == "80" - assert sensor.attributes.get("unit_of_measurement") == UNIT_OF_MEASUREMENT + assert sensor.attributes.get("unit_of_measurement") == TIME_MINUTES assert sensor.attributes.get(ATTR_ATTRIBUTION) is None assert sensor.attributes.get(ATTR_DURATION) == 79.73333333333333 @@ -481,7 +481,7 @@ async def test_pedestrian(hass, requests_mock_credentials_check): sensor = hass.states.get("sensor.test") assert sensor.state == "211" - assert sensor.attributes.get("unit_of_measurement") == UNIT_OF_MEASUREMENT + assert sensor.attributes.get("unit_of_measurement") == TIME_MINUTES assert sensor.attributes.get(ATTR_ATTRIBUTION) is None assert sensor.attributes.get(ATTR_DURATION) == 210.51666666666668 @@ -532,7 +532,7 @@ async def test_bicycle(hass, requests_mock_credentials_check): sensor = hass.states.get("sensor.test") assert sensor.state == "55" - assert sensor.attributes.get("unit_of_measurement") == UNIT_OF_MEASUREMENT + assert sensor.attributes.get("unit_of_measurement") == TIME_MINUTES assert sensor.attributes.get(ATTR_ATTRIBUTION) is None assert sensor.attributes.get(ATTR_DURATION) == 54.86666666666667 diff --git a/tests/components/homematicip_cloud/test_sensor.py b/tests/components/homematicip_cloud/test_sensor.py index 2ca36e228cc..e3b0f8dd366 100644 --- a/tests/components/homematicip_cloud/test_sensor.py +++ b/tests/components/homematicip_cloud/test_sensor.py @@ -20,6 +20,7 @@ from homeassistant.components.homematicip_cloud.sensor import ( ATTR_TEMPERATURE_OFFSET, ATTR_WIND_DIRECTION, ATTR_WIND_DIRECTION_VARIATION, + TIME_HOURS, ) from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, POWER_WATT, TEMP_CELSIUS @@ -284,7 +285,7 @@ async def test_hmip_windspeed_sensor(hass, default_mock_hap_factory): ) assert ha_state.state == "2.6" - assert ha_state.attributes[ATTR_UNIT_OF_MEASUREMENT] == "km/h" + assert ha_state.attributes[ATTR_UNIT_OF_MEASUREMENT] == f"km/{TIME_HOURS}" await async_manipulate_test_data(hass, hmip_device, "windSpeed", 9.4) ha_state = hass.states.get(entity_id) assert ha_state.state == "9.4" diff --git a/tests/components/integration/test_sensor.py b/tests/components/integration/test_sensor.py index c65ca720235..b598d7ddbc2 100644 --- a/tests/components/integration/test_sensor.py +++ b/tests/components/integration/test_sensor.py @@ -2,6 +2,7 @@ from datetime import timedelta from unittest.mock import patch +from homeassistant.const import TIME_SECONDS from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util @@ -181,7 +182,7 @@ async def test_suffix(hass): "source": "sensor.bytes_per_second", "round": 2, "unit_prefix": "k", - "unit_time": "s", + "unit_time": TIME_SECONDS, } } diff --git a/tests/components/yr/test_sensor.py b/tests/components/yr/test_sensor.py index 161a7cef66b..8161c8c0faa 100644 --- a/tests/components/yr/test_sensor.py +++ b/tests/components/yr/test_sensor.py @@ -3,6 +3,7 @@ from datetime import datetime from unittest.mock import patch from homeassistant.bootstrap import async_setup_component +from homeassistant.const import TIME_SECONDS import homeassistant.util.dt as dt_util from tests.common import assert_setup_component, load_fixture @@ -70,7 +71,7 @@ async def test_custom_setup(hass, aioclient_mock): assert state.state == "0.0" state = hass.states.get("sensor.yr_wind_speed") - assert state.attributes.get("unit_of_measurement") == "m/s" + assert state.attributes.get("unit_of_measurement") == f"m/{TIME_SECONDS}" assert state.state == "3.5" @@ -116,5 +117,5 @@ async def test_forecast_setup(hass, aioclient_mock): assert state.state == "0.0" state = hass.states.get("sensor.yr_wind_speed") - assert state.attributes.get("unit_of_measurement") == "m/s" + assert state.attributes.get("unit_of_measurement") == f"m/{TIME_SECONDS}" assert state.state == "3.6"