Add and use more unit constants (#32122)

* Add and use speed constants

* Add and use meter based volume and area constants

* Add and use more mass unit constants

* Add and use concentration unit constants

* Add and use watts per square meter constant

* Use more time constants

* Use more data constants
pull/32167/head
Ville Skyttä 2020-02-25 03:52:14 +02:00 committed by GitHub
parent c98f50115d
commit 496bd3dddf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 422 additions and 177 deletions

View File

@ -2,6 +2,7 @@
from homeassistant.const import ( from homeassistant.const import (
ATTR_ATTRIBUTION, ATTR_ATTRIBUTION,
ATTR_DEVICE_CLASS, ATTR_DEVICE_CLASS,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONF_NAME, CONF_NAME,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_PRESSURE, DEVICE_CLASS_PRESSURE,
@ -27,14 +28,13 @@ ATTR_LABEL = "label"
ATTR_UNIT = "unit" ATTR_UNIT = "unit"
HUMI_PERCENT = "%" HUMI_PERCENT = "%"
VOLUME_MICROGRAMS_PER_CUBIC_METER = "µg/m³"
SENSOR_TYPES = { SENSOR_TYPES = {
ATTR_API_PM1: { ATTR_API_PM1: {
ATTR_DEVICE_CLASS: None, ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:blur", ATTR_ICON: "mdi:blur",
ATTR_LABEL: ATTR_API_PM1, ATTR_LABEL: ATTR_API_PM1,
ATTR_UNIT: VOLUME_MICROGRAMS_PER_CUBIC_METER, ATTR_UNIT: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
}, },
ATTR_API_HUMIDITY: { ATTR_API_HUMIDITY: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY, ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,

View File

@ -11,6 +11,9 @@ from homeassistant.const import (
ATTR_ATTRIBUTION, ATTR_ATTRIBUTION,
ATTR_LATITUDE, ATTR_LATITUDE,
ATTR_LONGITUDE, ATTR_LONGITUDE,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
CONF_API_KEY, CONF_API_KEY,
CONF_LATITUDE, CONF_LATITUDE,
CONF_LONGITUDE, CONF_LONGITUDE,
@ -37,10 +40,6 @@ CONF_COUNTRY = "country"
DEFAULT_ATTRIBUTION = "Data provided by AirVisual" DEFAULT_ATTRIBUTION = "Data provided by AirVisual"
DEFAULT_SCAN_INTERVAL = timedelta(minutes=10) DEFAULT_SCAN_INTERVAL = timedelta(minutes=10)
MASS_PARTS_PER_MILLION = "ppm"
MASS_PARTS_PER_BILLION = "ppb"
VOLUME_MICROGRAMS_PER_CUBIC_METER = "µg/m3"
SENSOR_TYPE_LEVEL = "air_pollution_level" SENSOR_TYPE_LEVEL = "air_pollution_level"
SENSOR_TYPE_AQI = "air_quality_index" SENSOR_TYPE_AQI = "air_quality_index"
SENSOR_TYPE_POLLUTANT = "main_pollutant" SENSOR_TYPE_POLLUTANT = "main_pollutant"
@ -70,12 +69,12 @@ POLLUTANT_LEVEL_MAPPING = [
] ]
POLLUTANT_MAPPING = { POLLUTANT_MAPPING = {
"co": {"label": "Carbon Monoxide", "unit": MASS_PARTS_PER_MILLION}, "co": {"label": "Carbon Monoxide", "unit": CONCENTRATION_PARTS_PER_MILLION},
"n2": {"label": "Nitrogen Dioxide", "unit": MASS_PARTS_PER_BILLION}, "n2": {"label": "Nitrogen Dioxide", "unit": CONCENTRATION_PARTS_PER_BILLION},
"o3": {"label": "Ozone", "unit": MASS_PARTS_PER_BILLION}, "o3": {"label": "Ozone", "unit": CONCENTRATION_PARTS_PER_BILLION},
"p1": {"label": "PM10", "unit": VOLUME_MICROGRAMS_PER_CUBIC_METER}, "p1": {"label": "PM10", "unit": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER},
"p2": {"label": "PM2.5", "unit": VOLUME_MICROGRAMS_PER_CUBIC_METER}, "p2": {"label": "PM2.5", "unit": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER},
"s2": {"label": "Sulfur Dioxide", "unit": MASS_PARTS_PER_BILLION}, "s2": {"label": "Sulfur Dioxide", "unit": CONCENTRATION_PARTS_PER_BILLION},
} }
SENSOR_LOCALES = {"cn": "Chinese", "us": "U.S."} SENSOR_LOCALES = {"cn": "Chinese", "us": "U.S."}

View File

@ -10,8 +10,10 @@ from homeassistant.config_entries import SOURCE_IMPORT
from homeassistant.const import ( from homeassistant.const import (
ATTR_LOCATION, ATTR_LOCATION,
ATTR_NAME, ATTR_NAME,
CONCENTRATION_PARTS_PER_MILLION,
CONF_API_KEY, CONF_API_KEY,
EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_STOP,
SPEED_MILES_PER_HOUR,
) )
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.exceptions import ConfigEntryNotReady
@ -147,7 +149,7 @@ SENSOR_TYPES = {
TYPE_BATT8: ("Battery 8", None, TYPE_BINARY_SENSOR, "battery"), TYPE_BATT8: ("Battery 8", None, TYPE_BINARY_SENSOR, "battery"),
TYPE_BATT9: ("Battery 9", None, TYPE_BINARY_SENSOR, "battery"), TYPE_BATT9: ("Battery 9", None, TYPE_BINARY_SENSOR, "battery"),
TYPE_BATTOUT: ("Battery", None, TYPE_BINARY_SENSOR, "battery"), TYPE_BATTOUT: ("Battery", None, TYPE_BINARY_SENSOR, "battery"),
TYPE_CO2: ("co2", "ppm", TYPE_SENSOR, None), TYPE_CO2: ("co2", CONCENTRATION_PARTS_PER_MILLION, TYPE_SENSOR, None),
TYPE_DAILYRAININ: ("Daily Rain", "in", TYPE_SENSOR, None), TYPE_DAILYRAININ: ("Daily Rain", "in", TYPE_SENSOR, None),
TYPE_DEWPOINT: ("Dew Point", "°F", TYPE_SENSOR, "temperature"), TYPE_DEWPOINT: ("Dew Point", "°F", TYPE_SENSOR, "temperature"),
TYPE_EVENTRAININ: ("Event Rain", "in", TYPE_SENSOR, None), TYPE_EVENTRAININ: ("Event Rain", "in", TYPE_SENSOR, None),
@ -166,7 +168,7 @@ SENSOR_TYPES = {
TYPE_HUMIDITY: ("Humidity", "%", TYPE_SENSOR, "humidity"), TYPE_HUMIDITY: ("Humidity", "%", TYPE_SENSOR, "humidity"),
TYPE_HUMIDITYIN: ("Humidity In", "%", TYPE_SENSOR, "humidity"), TYPE_HUMIDITYIN: ("Humidity In", "%", TYPE_SENSOR, "humidity"),
TYPE_LASTRAIN: ("Last Rain", None, TYPE_SENSOR, "timestamp"), TYPE_LASTRAIN: ("Last Rain", None, TYPE_SENSOR, "timestamp"),
TYPE_MAXDAILYGUST: ("Max Gust", "mph", TYPE_SENSOR, None), TYPE_MAXDAILYGUST: ("Max Gust", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_MONTHLYRAININ: ("Monthly Rain", "in", TYPE_SENSOR, None), TYPE_MONTHLYRAININ: ("Monthly Rain", "in", TYPE_SENSOR, None),
TYPE_RELAY10: ("Relay 10", None, TYPE_BINARY_SENSOR, "connectivity"), TYPE_RELAY10: ("Relay 10", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY1: ("Relay 1", None, TYPE_BINARY_SENSOR, "connectivity"), TYPE_RELAY1: ("Relay 1", None, TYPE_BINARY_SENSOR, "connectivity"),
@ -217,12 +219,12 @@ SENSOR_TYPES = {
TYPE_WEEKLYRAININ: ("Weekly Rain", "in", TYPE_SENSOR, None), TYPE_WEEKLYRAININ: ("Weekly Rain", "in", TYPE_SENSOR, None),
TYPE_WINDDIR: ("Wind Dir", "°", TYPE_SENSOR, None), TYPE_WINDDIR: ("Wind Dir", "°", TYPE_SENSOR, None),
TYPE_WINDDIR_AVG10M: ("Wind Dir Avg 10m", "°", TYPE_SENSOR, None), TYPE_WINDDIR_AVG10M: ("Wind Dir Avg 10m", "°", TYPE_SENSOR, None),
TYPE_WINDDIR_AVG2M: ("Wind Dir Avg 2m", "mph", TYPE_SENSOR, None), TYPE_WINDDIR_AVG2M: ("Wind Dir Avg 2m", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_WINDGUSTDIR: ("Gust Dir", "°", TYPE_SENSOR, None), TYPE_WINDGUSTDIR: ("Gust Dir", "°", TYPE_SENSOR, None),
TYPE_WINDGUSTMPH: ("Wind Gust", "mph", TYPE_SENSOR, None), TYPE_WINDGUSTMPH: ("Wind Gust", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_WINDSPDMPH_AVG10M: ("Wind Avg 10m", "mph", TYPE_SENSOR, None), TYPE_WINDSPDMPH_AVG10M: ("Wind Avg 10m", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_WINDSPDMPH_AVG2M: ("Wind Avg 2m", "mph", TYPE_SENSOR, None), TYPE_WINDSPDMPH_AVG2M: ("Wind Avg 2m", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_WINDSPEEDMPH: ("Wind Speed", "mph", TYPE_SENSOR, None), TYPE_WINDSPEEDMPH: ("Wind Speed", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_YEARLYRAININ: ("Yearly Rain", "in", TYPE_SENSOR, None), TYPE_YEARLYRAININ: ("Yearly Rain", "in", TYPE_SENSOR, None),
} }

View File

@ -6,6 +6,7 @@ import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import ( from homeassistant.const import (
ATTR_ATTRIBUTION, ATTR_ATTRIBUTION,
CONCENTRATION_PARTS_PER_MILLION,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
@ -30,7 +31,7 @@ SENSOR_TYPES = {
"signal_strength": ["Signal Strength", None, "signal"], "signal_strength": ["Signal Strength", None, "signal"],
"temperature": ["Temperature", TEMP_CELSIUS, "thermometer"], "temperature": ["Temperature", TEMP_CELSIUS, "thermometer"],
"humidity": ["Humidity", "%", "water-percent"], "humidity": ["Humidity", "%", "water-percent"],
"air_quality": ["Air Quality", "ppm", "biohazard"], "air_quality": ["Air Quality", CONCENTRATION_PARTS_PER_MILLION, "biohazard"],
} }
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(

View File

@ -8,6 +8,9 @@ from python_awair import AwairClient
import voluptuous as vol import voluptuous as vol
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
CONF_ACCESS_TOKEN, CONF_ACCESS_TOKEN,
CONF_DEVICES, CONF_DEVICES,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
@ -50,29 +53,29 @@ SENSOR_TYPES = {
}, },
"CO2": { "CO2": {
"device_class": DEVICE_CLASS_CARBON_DIOXIDE, "device_class": DEVICE_CLASS_CARBON_DIOXIDE,
"unit_of_measurement": "ppm", "unit_of_measurement": CONCENTRATION_PARTS_PER_MILLION,
"icon": "mdi:periodic-table-co2", "icon": "mdi:periodic-table-co2",
}, },
"VOC": { "VOC": {
"device_class": DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS, "device_class": DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS,
"unit_of_measurement": "ppb", "unit_of_measurement": CONCENTRATION_PARTS_PER_BILLION,
"icon": "mdi:cloud", "icon": "mdi:cloud",
}, },
# Awair docs don't actually specify the size they measure for 'dust', # Awair docs don't actually specify the size they measure for 'dust',
# but 2.5 allows the sensor to show up in HomeKit # but 2.5 allows the sensor to show up in HomeKit
"DUST": { "DUST": {
"device_class": DEVICE_CLASS_PM2_5, "device_class": DEVICE_CLASS_PM2_5,
"unit_of_measurement": "µg/m3", "unit_of_measurement": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
"icon": "mdi:cloud", "icon": "mdi:cloud",
}, },
"PM25": { "PM25": {
"device_class": DEVICE_CLASS_PM2_5, "device_class": DEVICE_CLASS_PM2_5,
"unit_of_measurement": "µg/m3", "unit_of_measurement": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
"icon": "mdi:cloud", "icon": "mdi:cloud",
}, },
"PM10": { "PM10": {
"device_class": DEVICE_CLASS_PM10, "device_class": DEVICE_CLASS_PM10,
"unit_of_measurement": "µg/m3", "unit_of_measurement": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
"icon": "mdi:cloud", "icon": "mdi:cloud",
}, },
"score": { "score": {

View File

@ -19,8 +19,8 @@ from homeassistant.const import (
CONF_LONGITUDE, CONF_LONGITUDE,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
SPEED_KILOMETERS_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_HOURS,
) )
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@ -59,7 +59,7 @@ SENSOR_TYPES = {
"cloud_type_id": ["Cloud Type ID", None], "cloud_type_id": ["Cloud Type ID", None],
"cloud_type": ["Cloud Type", None], "cloud_type": ["Cloud Type", None],
"delta_t": ["Delta Temp C", TEMP_CELSIUS], "delta_t": ["Delta Temp C", TEMP_CELSIUS],
"gust_kmh": ["Wind Gust kmh", f"km/{TIME_HOURS}"], "gust_kmh": ["Wind Gust kmh", SPEED_KILOMETERS_PER_HOUR],
"gust_kt": ["Wind Gust kt", "kt"], "gust_kt": ["Wind Gust kt", "kt"],
"air_temp": ["Air Temp C", TEMP_CELSIUS], "air_temp": ["Air Temp C", TEMP_CELSIUS],
"dewpt": ["Dew Point C", TEMP_CELSIUS], "dewpt": ["Dew Point C", TEMP_CELSIUS],
@ -76,7 +76,7 @@ SENSOR_TYPES = {
"vis_km": ["Visability km", "km"], "vis_km": ["Visability km", "km"],
"weather": ["Weather", None], "weather": ["Weather", None],
"wind_dir": ["Wind Direction", None], "wind_dir": ["Wind Direction", None],
"wind_spd_kmh": ["Wind Speed kmh", f"km/{TIME_HOURS}"], "wind_spd_kmh": ["Wind Speed kmh", SPEED_KILOMETERS_PER_HOUR],
"wind_spd_kt": ["Wind Speed kt", "kt"], "wind_spd_kt": ["Wind Speed kt", "kt"],
} }

View File

@ -27,6 +27,8 @@ from homeassistant.const import (
CONF_LONGITUDE, CONF_LONGITUDE,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
IRRADIATION_WATTS_PER_SQUARE_METER,
SPEED_KILOMETERS_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_HOURS, TIME_HOURS,
) )
@ -68,15 +70,15 @@ SENSOR_TYPES = {
"humidity": ["Humidity", "%", "mdi:water-percent"], "humidity": ["Humidity", "%", "mdi:water-percent"],
"temperature": ["Temperature", TEMP_CELSIUS, "mdi:thermometer"], "temperature": ["Temperature", TEMP_CELSIUS, "mdi:thermometer"],
"groundtemperature": ["Ground temperature", TEMP_CELSIUS, "mdi:thermometer"], "groundtemperature": ["Ground temperature", TEMP_CELSIUS, "mdi:thermometer"],
"windspeed": ["Wind speed", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windspeed": ["Wind speed", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"windforce": ["Wind force", "Bft", "mdi:weather-windy"], "windforce": ["Wind force", "Bft", "mdi:weather-windy"],
"winddirection": ["Wind direction", None, "mdi:compass-outline"], "winddirection": ["Wind direction", None, "mdi:compass-outline"],
"windazimuth": ["Wind direction azimuth", "°", "mdi:compass-outline"], "windazimuth": ["Wind direction azimuth", "°", "mdi:compass-outline"],
"pressure": ["Pressure", "hPa", "mdi:gauge"], "pressure": ["Pressure", "hPa", "mdi:gauge"],
"visibility": ["Visibility", "km", None], "visibility": ["Visibility", "km", None],
"windgust": ["Wind gust", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windgust": ["Wind gust", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"precipitation": ["Precipitation", f"mm/{TIME_HOURS}", "mdi:weather-pouring"], "precipitation": ["Precipitation", f"mm/{TIME_HOURS}", "mdi:weather-pouring"],
"irradiance": ["Irradiance", "W/m2", "mdi:sunglasses"], "irradiance": ["Irradiance", IRRADIATION_WATTS_PER_SQUARE_METER, "mdi:sunglasses"],
"precipitation_forecast_average": [ "precipitation_forecast_average": [
"Precipitation forecast average", "Precipitation forecast average",
f"mm/{TIME_HOURS}", f"mm/{TIME_HOURS}",
@ -133,11 +135,11 @@ SENSOR_TYPES = {
"windforce_3d": ["Wind force 3d", "Bft", "mdi:weather-windy"], "windforce_3d": ["Wind force 3d", "Bft", "mdi:weather-windy"],
"windforce_4d": ["Wind force 4d", "Bft", "mdi:weather-windy"], "windforce_4d": ["Wind force 4d", "Bft", "mdi:weather-windy"],
"windforce_5d": ["Wind force 5d", "Bft", "mdi:weather-windy"], "windforce_5d": ["Wind force 5d", "Bft", "mdi:weather-windy"],
"windspeed_1d": ["Wind speed 1d", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windspeed_1d": ["Wind speed 1d", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"windspeed_2d": ["Wind speed 2d", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windspeed_2d": ["Wind speed 2d", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"windspeed_3d": ["Wind speed 3d", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windspeed_3d": ["Wind speed 3d", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"windspeed_4d": ["Wind speed 4d", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windspeed_4d": ["Wind speed 4d", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"windspeed_5d": ["Wind speed 5d", f"km/{TIME_HOURS}", "mdi:weather-windy"], "windspeed_5d": ["Wind speed 5d", SPEED_KILOMETERS_PER_HOUR, "mdi:weather-windy"],
"winddirection_1d": ["Wind direction 1d", None, "mdi:compass-outline"], "winddirection_1d": ["Wind direction 1d", None, "mdi:compass-outline"],
"winddirection_2d": ["Wind direction 2d", None, "mdi:compass-outline"], "winddirection_2d": ["Wind direction 2d", None, "mdi:compass-outline"],
"winddirection_3d": ["Wind direction 3d", None, "mdi:compass-outline"], "winddirection_3d": ["Wind direction 3d", None, "mdi:compass-outline"],

View File

@ -15,8 +15,10 @@ from homeassistant.const import (
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
SPEED_KILOMETERS_PER_HOUR,
SPEED_METERS_PER_SECOND,
SPEED_MILES_PER_HOUR,
TIME_HOURS, TIME_HOURS,
TIME_SECONDS,
UNIT_UV_INDEX, UNIT_UV_INDEX,
) )
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -161,11 +163,11 @@ SENSOR_TYPES = {
], ],
"wind_speed": [ "wind_speed": [
"Wind Speed", "Wind Speed",
f"m/{TIME_SECONDS}", SPEED_METERS_PER_SECOND,
"mph", SPEED_MILES_PER_HOUR,
f"km/{TIME_HOURS}", SPEED_KILOMETERS_PER_HOUR,
"mph", SPEED_MILES_PER_HOUR,
"mph", SPEED_MILES_PER_HOUR,
"mdi:weather-windy", "mdi:weather-windy",
["currently", "hourly", "daily"], ["currently", "hourly", "daily"],
], ],
@ -181,11 +183,11 @@ SENSOR_TYPES = {
], ],
"wind_gust": [ "wind_gust": [
"Wind Gust", "Wind Gust",
f"m/{TIME_SECONDS}", SPEED_METERS_PER_SECOND,
"mph", SPEED_MILES_PER_HOUR,
f"km/{TIME_HOURS}", SPEED_KILOMETERS_PER_HOUR,
"mph", SPEED_MILES_PER_HOUR,
"mph", SPEED_MILES_PER_HOUR,
"mdi:weather-windy-variant", "mdi:weather-windy-variant",
["currently", "hourly", "daily"], ["currently", "hourly", "daily"],
], ],

View File

@ -1,5 +1,7 @@
"""Definitions for DSMR Reader sensors added to MQTT.""" """Definitions for DSMR Reader sensors added to MQTT."""
from homeassistant.const import VOLUME_CUBIC_METERS
def dsmr_transform(value): def dsmr_transform(value):
"""Transform DSMR version value to right format.""" """Transform DSMR version value to right format."""
@ -79,7 +81,7 @@ DEFINITIONS = {
"dsmr/reading/extra_device_delivered": { "dsmr/reading/extra_device_delivered": {
"name": "Gas meter usage", "name": "Gas meter usage",
"icon": "mdi:fire", "icon": "mdi:fire",
"unit": "m3", "unit": VOLUME_CUBIC_METERS,
}, },
"dsmr/reading/phase_voltage_l1": { "dsmr/reading/phase_voltage_l1": {
"name": "Current voltage L1", "name": "Current voltage L1",
@ -99,12 +101,12 @@ DEFINITIONS = {
"dsmr/consumption/gas/delivered": { "dsmr/consumption/gas/delivered": {
"name": "Gas usage", "name": "Gas usage",
"icon": "mdi:fire", "icon": "mdi:fire",
"unit": "m3", "unit": VOLUME_CUBIC_METERS,
}, },
"dsmr/consumption/gas/currently_delivered": { "dsmr/consumption/gas/currently_delivered": {
"name": "Current gas usage", "name": "Current gas usage",
"icon": "mdi:fire", "icon": "mdi:fire",
"unit": "m3", "unit": VOLUME_CUBIC_METERS,
}, },
"dsmr/consumption/gas/read_at": { "dsmr/consumption/gas/read_at": {
"name": "Gas meter read", "name": "Gas meter read",
@ -159,7 +161,7 @@ DEFINITIONS = {
"dsmr/day-consumption/gas": { "dsmr/day-consumption/gas": {
"name": "Gas usage", "name": "Gas usage",
"icon": "mdi:counter", "icon": "mdi:counter",
"unit": "m3", "unit": VOLUME_CUBIC_METERS,
}, },
"dsmr/day-consumption/gas_cost": { "dsmr/day-consumption/gas_cost": {
"name": "Gas cost", "name": "Gas cost",

View File

@ -3,6 +3,7 @@ import logging
from homeassistant.components.sensor import ENTITY_ID_FORMAT from homeassistant.components.sensor import ENTITY_ID_FORMAT
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_PARTS_PER_MILLION,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
@ -20,8 +21,13 @@ SENSOR_TYPES = {
None, None,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
], ],
"com.fibaro.smokeSensor": ["Smoke", "ppm", "mdi:fire", None], "com.fibaro.smokeSensor": [
"CO2": ["CO2", "ppm", "mdi:cloud", None], "Smoke",
CONCENTRATION_PARTS_PER_MILLION,
"mdi:fire",
None,
],
"CO2": ["CO2", CONCENTRATION_PARTS_PER_MILLION, "mdi:cloud", None],
"com.fibaro.humiditySensor": ["Humidity", "%", None, DEVICE_CLASS_HUMIDITY], "com.fibaro.humiditySensor": ["Humidity", "%", None, DEVICE_CLASS_HUMIDITY],
"com.fibaro.lightSensor": ["Light", "lx", None, DEVICE_CLASS_ILLUMINANCE], "com.fibaro.lightSensor": ["Light", "lx", None, DEVICE_CLASS_ILLUMINANCE],
} }

View File

@ -14,6 +14,8 @@ from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import ( from homeassistant.const import (
ATTR_ATTRIBUTION, ATTR_ATTRIBUTION,
CONF_UNIT_SYSTEM, CONF_UNIT_SYSTEM,
MASS_KILOGRAMS,
MASS_MILLIGRAMS,
TIME_MILLISECONDS, TIME_MILLISECONDS,
TIME_MINUTES, TIME_MINUTES,
) )
@ -115,7 +117,7 @@ FITBIT_MEASUREMENTS = {
"weight": "lbs", "weight": "lbs",
"body": "in", "body": "in",
"liquids": "fl. oz.", "liquids": "fl. oz.",
"blood glucose": "mg/dL", "blood glucose": f"{MASS_MILLIGRAMS}/dL",
"battery": "", "battery": "",
}, },
"en_GB": { "en_GB": {
@ -134,7 +136,7 @@ FITBIT_MEASUREMENTS = {
"distance": "kilometers", "distance": "kilometers",
"elevation": "meters", "elevation": "meters",
"height": "centimeters", "height": "centimeters",
"weight": "kilograms", "weight": MASS_KILOGRAMS,
"body": "centimeters", "body": "centimeters",
"liquids": "milliliters", "liquids": "milliliters",
"blood glucose": "mmol/L", "blood glucose": "mmol/L",

View File

@ -10,6 +10,9 @@ import voluptuous as vol
from homeassistant.const import ( from homeassistant.const import (
ATTR_TEMPERATURE, ATTR_TEMPERATURE,
ATTR_TIME, ATTR_TIME,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
CONF_TOKEN, CONF_TOKEN,
CONF_USERNAME, CONF_USERNAME,
TEMP_CELSIUS, TEMP_CELSIUS,
@ -32,11 +35,19 @@ ATTR_FOOBOT_INDEX = "index"
SENSOR_TYPES = { SENSOR_TYPES = {
"time": [ATTR_TIME, TIME_SECONDS], "time": [ATTR_TIME, TIME_SECONDS],
"pm": [ATTR_PM2_5, "µg/m3", "mdi:cloud"], "pm": [ATTR_PM2_5, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, "mdi:cloud"],
"tmp": [ATTR_TEMPERATURE, TEMP_CELSIUS, "mdi:thermometer"], "tmp": [ATTR_TEMPERATURE, TEMP_CELSIUS, "mdi:thermometer"],
"hum": [ATTR_HUMIDITY, "%", "mdi:water-percent"], "hum": [ATTR_HUMIDITY, "%", "mdi:water-percent"],
"co2": [ATTR_CARBON_DIOXIDE, "ppm", "mdi:periodic-table-co2"], "co2": [
"voc": [ATTR_VOLATILE_ORGANIC_COMPOUNDS, "ppb", "mdi:cloud"], ATTR_CARBON_DIOXIDE,
CONCENTRATION_PARTS_PER_MILLION,
"mdi:periodic-table-co2",
],
"voc": [
ATTR_VOLATILE_ORGANIC_COMPOUNDS,
CONCENTRATION_PARTS_PER_BILLION,
"mdi:cloud",
],
"allpollu": [ATTR_FOOBOT_INDEX, "%", "mdi:percent"], "allpollu": [ATTR_FOOBOT_INDEX, "%", "mdi:percent"],
} }

View File

@ -1,7 +1,11 @@
"""Support for Homekit sensors.""" """Support for Homekit sensors."""
from aiohomekit.model.characteristics import CharacteristicsTypes from aiohomekit.model.characteristics import CharacteristicsTypes
from homeassistant.const import DEVICE_CLASS_BATTERY, TEMP_CELSIUS from homeassistant.const import (
CONCENTRATION_PARTS_PER_MILLION,
DEVICE_CLASS_BATTERY,
TEMP_CELSIUS,
)
from homeassistant.core import callback from homeassistant.core import callback
from . import KNOWN_DEVICES, HomeKitEntity from . import KNOWN_DEVICES, HomeKitEntity
@ -13,7 +17,6 @@ CO2_ICON = "mdi:periodic-table-co2"
UNIT_PERCENT = "%" UNIT_PERCENT = "%"
UNIT_LUX = "lux" UNIT_LUX = "lux"
UNIT_CO2 = "ppm"
class HomeKitHumiditySensor(HomeKitEntity): class HomeKitHumiditySensor(HomeKitEntity):
@ -149,7 +152,7 @@ class HomeKitCarbonDioxideSensor(HomeKitEntity):
@property @property
def unit_of_measurement(self): def unit_of_measurement(self):
"""Return units for the sensor.""" """Return units for the sensor."""
return UNIT_CO2 return CONCENTRATION_PARTS_PER_MILLION
def _update_carbon_dioxide_level(self, value): def _update_carbon_dioxide_level(self, value):
self._state = value self._state = value

View File

@ -8,7 +8,8 @@ from homeassistant.const import (
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
ENERGY_WATT_HOUR, ENERGY_WATT_HOUR,
POWER_WATT, POWER_WATT,
TIME_HOURS, SPEED_KILOMETERS_PER_HOUR,
VOLUME_CUBIC_METERS,
) )
from .const import ATTR_DISCOVER_DEVICES from .const import ATTR_DISCOVER_DEVICES
@ -39,8 +40,8 @@ HM_UNIT_HA_CAST = {
"CURRENT": "mA", "CURRENT": "mA",
"VOLTAGE": "V", "VOLTAGE": "V",
"ENERGY_COUNTER": ENERGY_WATT_HOUR, "ENERGY_COUNTER": ENERGY_WATT_HOUR,
"GAS_POWER": "m3", "GAS_POWER": VOLUME_CUBIC_METERS,
"GAS_ENERGY_COUNTER": "m3", "GAS_ENERGY_COUNTER": VOLUME_CUBIC_METERS,
"LUX": "lx", "LUX": "lx",
"ILLUMINATION": "lx", "ILLUMINATION": "lx",
"CURRENT_ILLUMINATION": "lx", "CURRENT_ILLUMINATION": "lx",
@ -48,7 +49,7 @@ HM_UNIT_HA_CAST = {
"LOWEST_ILLUMINATION": "lx", "LOWEST_ILLUMINATION": "lx",
"HIGHEST_ILLUMINATION": "lx", "HIGHEST_ILLUMINATION": "lx",
"RAIN_COUNTER": "mm", "RAIN_COUNTER": "mm",
"WIND_SPEED": f"km/{TIME_HOURS}", "WIND_SPEED": SPEED_KILOMETERS_PER_HOUR,
"WIND_DIRECTION": "°", "WIND_DIRECTION": "°",
"WIND_DIRECTION_RANGE": "°", "WIND_DIRECTION_RANGE": "°",
"SUNSHINEDURATION": "#", "SUNSHINEDURATION": "#",

View File

@ -31,8 +31,8 @@ from homeassistant.const import (
DEVICE_CLASS_POWER, DEVICE_CLASS_POWER,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
POWER_WATT, POWER_WATT,
SPEED_KILOMETERS_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_HOURS,
) )
from homeassistant.helpers.typing import HomeAssistantType from homeassistant.helpers.typing import HomeAssistantType
@ -333,7 +333,7 @@ class HomematicipWindspeedSensor(HomematicipGenericDevice):
@property @property
def unit_of_measurement(self) -> str: def unit_of_measurement(self) -> str:
"""Return the unit this state is expressed in.""" """Return the unit this state is expressed in."""
return f"km/{TIME_HOURS}" return SPEED_KILOMETERS_PER_HOUR
@property @property
def device_state_attributes(self) -> Dict[str, Any]: def device_state_attributes(self) -> Dict[str, Any]:

View File

@ -4,7 +4,11 @@ from typing import Callable
from homeassistant.components.sensor import DOMAIN from homeassistant.components.sensor import DOMAIN
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_PARTS_PER_MILLION,
POWER_WATT, POWER_WATT,
SPEED_KILOMETERS_PER_HOUR,
SPEED_METERS_PER_SECOND,
SPEED_MILES_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
TIME_DAYS, TIME_DAYS,
@ -51,7 +55,7 @@ UOM_FRIENDLY_NAME = {
"29": "kV", "29": "kV",
"30": "kW", "30": "kW",
"31": "kPa", "31": "kPa",
"32": "KPH", "32": SPEED_KILOMETERS_PER_HOUR,
"33": "kWH", "33": "kWH",
"34": "liedu", "34": "liedu",
"35": "l", "35": "l",
@ -59,7 +63,7 @@ UOM_FRIENDLY_NAME = {
"37": "mercalli", "37": "mercalli",
"38": "m", "38": "m",
"39": "m³/hr", "39": "m³/hr",
"40": f"m/{TIME_SECONDS}", "40": SPEED_METERS_PER_SECOND,
"41": "mA", "41": "mA",
"42": TIME_MILLISECONDS, "42": TIME_MILLISECONDS,
"43": "mV", "43": "mV",
@ -67,13 +71,13 @@ UOM_FRIENDLY_NAME = {
"45": TIME_MINUTES, "45": TIME_MINUTES,
"46": "mm/hr", "46": "mm/hr",
"47": TIME_MONTHS, "47": TIME_MONTHS,
"48": "MPH", "48": SPEED_MILES_PER_HOUR,
"49": f"m/{TIME_SECONDS}", "49": SPEED_METERS_PER_SECOND,
"50": "ohm", "50": "ohm",
"51": "%", "51": "%",
"52": "lb", "52": "lb",
"53": "power factor", "53": "power factor",
"54": "ppm", "54": CONCENTRATION_PARTS_PER_MILLION,
"55": "pulse count", "55": "pulse count",
"57": TIME_SECONDS, "57": TIME_SECONDS,
"58": TIME_SECONDS, "58": TIME_SECONDS,

View File

@ -2,6 +2,13 @@
from datetime import timedelta from datetime import timedelta
from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
)
DOMAIN = "kaiterra" DOMAIN = "kaiterra"
DISPATCHER_KAITERRA = "kaiterra_update" DISPATCHER_KAITERRA = "kaiterra_update"
@ -44,7 +51,16 @@ ATTR_AQI_LEVEL = "air_quality_index_level"
ATTR_AQI_POLLUTANT = "air_quality_index_pollutant" ATTR_AQI_POLLUTANT = "air_quality_index_pollutant"
AVAILABLE_AQI_STANDARDS = ["us", "cn", "in"] AVAILABLE_AQI_STANDARDS = ["us", "cn", "in"]
AVAILABLE_UNITS = ["x", "%", "C", "F", "mg/m³", "µg/m³", "ppm", "ppb"] AVAILABLE_UNITS = [
"x",
"%",
"C",
"F",
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_MILLION,
CONCENTRATION_PARTS_PER_BILLION,
]
AVAILABLE_DEVICE_TYPES = ["laseregg", "sensedge"] AVAILABLE_DEVICE_TYPES = ["laseregg", "sensedge"]
CONF_AQI_STANDARD = "aqi_standard" CONF_AQI_STANDARD = "aqi_standard"

View File

@ -7,6 +7,7 @@ import voluptuous as vol
from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.config_entries import SOURCE_IMPORT
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
CONF_SENSORS, CONF_SENSORS,
@ -39,18 +40,20 @@ SENSOR_TEMPERATURE = "temperature"
TOPIC_UPDATE = f"{DOMAIN}_data_update" TOPIC_UPDATE = f"{DOMAIN}_data_update"
VOLUME_MICROGRAMS_PER_CUBIC_METER = "µg/m3"
SENSORS = { SENSORS = {
SENSOR_TEMPERATURE: ["Temperature", "mdi:thermometer", TEMP_CELSIUS], SENSOR_TEMPERATURE: ["Temperature", "mdi:thermometer", TEMP_CELSIUS],
SENSOR_HUMIDITY: ["Humidity", "mdi:water-percent", "%"], SENSOR_HUMIDITY: ["Humidity", "mdi:water-percent", "%"],
SENSOR_PRESSURE: ["Pressure", "mdi:arrow-down-bold", "Pa"], SENSOR_PRESSURE: ["Pressure", "mdi:arrow-down-bold", "Pa"],
SENSOR_PRESSURE_AT_SEALEVEL: ["Pressure at sealevel", "mdi:download", "Pa"], SENSOR_PRESSURE_AT_SEALEVEL: ["Pressure at sealevel", "mdi:download", "Pa"],
SENSOR_PM10: ["PM10", "mdi:thought-bubble", VOLUME_MICROGRAMS_PER_CUBIC_METER], SENSOR_PM10: [
"PM10",
"mdi:thought-bubble",
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
],
SENSOR_PM2_5: [ SENSOR_PM2_5: [
"PM2.5", "PM2.5",
"mdi:thought-bubble-outline", "mdi:thought-bubble-outline",
VOLUME_MICROGRAMS_PER_CUBIC_METER, CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
], ],
} }

View File

@ -1,6 +1,6 @@
"""Meteo-France component constants.""" """Meteo-France component constants."""
from homeassistant.const import TEMP_CELSIUS, TIME_HOURS, TIME_MINUTES from homeassistant.const import SPEED_KILOMETERS_PER_HOUR, TEMP_CELSIUS, TIME_MINUTES
DOMAIN = "meteo_france" DOMAIN = "meteo_france"
PLATFORMS = ["sensor", "weather"] PLATFORMS = ["sensor", "weather"]
@ -47,7 +47,7 @@ SENSOR_TYPES = {
}, },
"wind_speed": { "wind_speed": {
SENSOR_TYPE_NAME: "Wind Speed", SENSOR_TYPE_NAME: "Wind Speed",
SENSOR_TYPE_UNIT: f"km/{TIME_HOURS}", SENSOR_TYPE_UNIT: SPEED_KILOMETERS_PER_HOUR,
SENSOR_TYPE_ICON: "mdi:weather-windy", SENSOR_TYPE_ICON: "mdi:weather-windy",
SENSOR_TYPE_CLASS: None, SENSOR_TYPE_CLASS: None,
}, },

View File

@ -13,6 +13,7 @@ from homeassistant.const import (
CONF_LONGITUDE, CONF_LONGITUDE,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
SPEED_MILES_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
) )
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -64,9 +65,9 @@ SENSOR_TYPES = {
"weather": ["Weather", None], "weather": ["Weather", None],
"temperature": ["Temperature", TEMP_CELSIUS], "temperature": ["Temperature", TEMP_CELSIUS],
"feels_like_temperature": ["Feels Like Temperature", TEMP_CELSIUS], "feels_like_temperature": ["Feels Like Temperature", TEMP_CELSIUS],
"wind_speed": ["Wind Speed", "mph"], "wind_speed": ["Wind Speed", SPEED_MILES_PER_HOUR],
"wind_direction": ["Wind Direction", None], "wind_direction": ["Wind Direction", None],
"wind_gust": ["Wind Gust", "mph"], "wind_gust": ["Wind Gust", SPEED_MILES_PER_HOUR],
"visibility": ["Visibility", None], "visibility": ["Visibility", None],
"visibility_distance": ["Visibility Distance", "km"], "visibility_distance": ["Visibility Distance", "km"],
"uv": ["UV", None], "uv": ["UV", None],

View File

@ -8,6 +8,7 @@ import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import ( from homeassistant.const import (
ATTR_TEMPERATURE, ATTR_TEMPERATURE,
CONCENTRATION_PARTS_PER_MILLION,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
@ -28,7 +29,10 @@ ATTR_CO2_CONCENTRATION = "co2_concentration"
SENSOR_TEMPERATURE = "temperature" SENSOR_TEMPERATURE = "temperature"
SENSOR_CO2 = "co2" SENSOR_CO2 = "co2"
SENSOR_TYPES = {SENSOR_TEMPERATURE: ["Temperature", None], SENSOR_CO2: ["CO2", "ppm"]} SENSOR_TYPES = {
SENSOR_TEMPERATURE: ["Temperature", None],
SENSOR_CO2: ["CO2", CONCENTRATION_PARTS_PER_MILLION],
}
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{ {
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,

View File

@ -3,6 +3,7 @@ from homeassistant.components import mysensors
from homeassistant.components.sensor import DOMAIN from homeassistant.components.sensor import DOMAIN
from homeassistant.const import ( from homeassistant.const import (
ENERGY_KILO_WATT_HOUR, ENERGY_KILO_WATT_HOUR,
MASS_KILOGRAMS,
POWER_WATT, POWER_WATT,
TEMP_CELSIUS, TEMP_CELSIUS,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
@ -20,7 +21,7 @@ SENSORS = {
"V_WIND": [None, "mdi:weather-windy"], "V_WIND": [None, "mdi:weather-windy"],
"V_GUST": [None, "mdi:weather-windy"], "V_GUST": [None, "mdi:weather-windy"],
"V_DIRECTION": ["°", "mdi:compass"], "V_DIRECTION": ["°", "mdi:compass"],
"V_WEIGHT": ["kg", "mdi:weight-kilogram"], "V_WEIGHT": [MASS_KILOGRAMS, "mdi:weight-kilogram"],
"V_DISTANCE": ["m", "mdi:ruler"], "V_DISTANCE": ["m", "mdi:ruler"],
"V_IMPEDANCE": ["ohm", None], "V_IMPEDANCE": ["ohm", None],
"V_WATT": [POWER_WATT, None], "V_WATT": [POWER_WATT, None],

View File

@ -5,11 +5,12 @@ import logging
import pyatmo import pyatmo
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_PARTS_PER_MILLION,
DEVICE_CLASS_BATTERY, DEVICE_CLASS_BATTERY,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
SPEED_KILOMETERS_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_HOURS,
) )
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from homeassistant.util import Throttle from homeassistant.util import Throttle
@ -53,7 +54,7 @@ SENSOR_TYPES = {
"mdi:thermometer", "mdi:thermometer",
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
], ],
"co2": ["CO2", "ppm", "mdi:periodic-table-co2", None], "co2": ["CO2", CONCENTRATION_PARTS_PER_MILLION, "mdi:periodic-table-co2", None],
"pressure": ["Pressure", "mbar", "mdi:gauge", None], "pressure": ["Pressure", "mbar", "mdi:gauge", None],
"noise": ["Noise", "dB", "mdi:volume-high", None], "noise": ["Noise", "dB", "mdi:volume-high", None],
"humidity": ["Humidity", "%", "mdi:water-percent", DEVICE_CLASS_HUMIDITY], "humidity": ["Humidity", "%", "mdi:water-percent", DEVICE_CLASS_HUMIDITY],
@ -67,10 +68,20 @@ SENSOR_TYPES = {
"max_temp": ["Max Temp.", TEMP_CELSIUS, "mdi:thermometer", None], "max_temp": ["Max Temp.", TEMP_CELSIUS, "mdi:thermometer", None],
"windangle": ["Angle", "", "mdi:compass", None], "windangle": ["Angle", "", "mdi:compass", None],
"windangle_value": ["Angle Value", "º", "mdi:compass", None], "windangle_value": ["Angle Value", "º", "mdi:compass", None],
"windstrength": ["Wind Strength", f"km/{TIME_HOURS}", "mdi:weather-windy", None], "windstrength": [
"Wind Strength",
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
None,
],
"gustangle": ["Gust Angle", "", "mdi:compass", None], "gustangle": ["Gust Angle", "", "mdi:compass", None],
"gustangle_value": ["Gust Angle Value", "º", "mdi:compass", None], "gustangle_value": ["Gust Angle Value", "º", "mdi:compass", None],
"guststrength": ["Gust Strength", f"km/{TIME_HOURS}", "mdi:weather-windy", None], "guststrength": [
"Gust Strength",
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
None,
],
"reachable": ["Reachability", "", "mdi:signal", None], "reachable": ["Reachability", "", "mdi:signal", None],
"rf_status": ["Radio", "", "mdi:signal", None], "rf_status": ["Radio", "", "mdi:signal", None],
"rf_status_lvl": ["Radio_lvl", "", "mdi:signal", None], "rf_status_lvl": ["Radio_lvl", "", "mdi:signal", None],

View File

@ -12,9 +12,9 @@ from homeassistant.const import (
CONF_API_KEY, CONF_API_KEY,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
SPEED_METERS_PER_SECOND,
TEMP_CELSIUS, TEMP_CELSIUS,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
TIME_SECONDS,
) )
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@ -34,7 +34,7 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=120)
SENSOR_TYPES = { SENSOR_TYPES = {
"weather": ["Condition", None], "weather": ["Condition", None],
"temperature": ["Temperature", None], "temperature": ["Temperature", None],
"wind_speed": ["Wind speed", f"m/{TIME_SECONDS}"], "wind_speed": ["Wind speed", SPEED_METERS_PER_SECOND],
"wind_bearing": ["Wind bearing", "°"], "wind_bearing": ["Wind bearing", "°"],
"humidity": ["Humidity", "%"], "humidity": ["Humidity", "%"],
"pressure": ["Pressure", "mbar"], "pressure": ["Pressure", "mbar"],

View File

@ -5,7 +5,7 @@ from pmsensor import serial_pm as pm
import voluptuous as vol import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_NAME from homeassistant.const import CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONF_NAME
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@ -79,7 +79,7 @@ class ParticulateMatterSensor(Entity):
@property @property
def unit_of_measurement(self): def unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any.""" """Return the unit of measurement of this entity, if any."""
return "µg/m³" return CONCENTRATION_MICROGRAMS_PER_CUBIC_METER
def update(self): def update(self):
"""Read from sensor and update the state.""" """Read from sensor and update the state."""

View File

@ -2,7 +2,7 @@
from datetime import timedelta from datetime import timedelta
import logging import logging
from homeassistant.const import ENERGY_KILO_WATT_HOUR, POWER_WATT from homeassistant.const import ENERGY_KILO_WATT_HOUR, POWER_WATT, VOLUME_CUBIC_METERS
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from . import DATA_SMAPPEE from . import DATA_SMAPPEE
@ -43,8 +43,20 @@ SENSOR_TYPES = {
ENERGY_KILO_WATT_HOUR, ENERGY_KILO_WATT_HOUR,
"consumption", "consumption",
], ],
"water_sensor_1": ["Water Sensor 1", "mdi:water", "water", "m3", "value1"], "water_sensor_1": [
"water_sensor_2": ["Water Sensor 2", "mdi:water", "water", "m3", "value2"], "Water Sensor 1",
"mdi:water",
"water",
VOLUME_CUBIC_METERS,
"value1",
],
"water_sensor_2": [
"Water Sensor 2",
"mdi:water",
"water",
VOLUME_CUBIC_METERS,
"value2",
],
"water_sensor_temperature": [ "water_sensor_temperature": [
"Water Sensor Temperature", "Water Sensor Temperature",
"mdi:temperature-celsius", "mdi:temperature-celsius",

View File

@ -5,6 +5,7 @@ from typing import Optional, Sequence
from pysmartthings import Attribute, Capability from pysmartthings import Attribute, Capability
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_PARTS_PER_MILLION,
DEVICE_CLASS_BATTERY, DEVICE_CLASS_BATTERY,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
@ -42,13 +43,23 @@ CAPABILITY_TO_SENSORS = {
Map(Attribute.body_weight_measurement, "Body Weight", MASS_KILOGRAMS, None) Map(Attribute.body_weight_measurement, "Body Weight", MASS_KILOGRAMS, None)
], ],
Capability.carbon_dioxide_measurement: [ Capability.carbon_dioxide_measurement: [
Map(Attribute.carbon_dioxide, "Carbon Dioxide Measurement", "ppm", None) Map(
Attribute.carbon_dioxide,
"Carbon Dioxide Measurement",
CONCENTRATION_PARTS_PER_MILLION,
None,
)
], ],
Capability.carbon_monoxide_detector: [ Capability.carbon_monoxide_detector: [
Map(Attribute.carbon_monoxide, "Carbon Monoxide Detector", None, None) Map(Attribute.carbon_monoxide, "Carbon Monoxide Detector", None, None)
], ],
Capability.carbon_monoxide_measurement: [ Capability.carbon_monoxide_measurement: [
Map(Attribute.carbon_monoxide_level, "Carbon Monoxide Measurement", "ppm", None) Map(
Attribute.carbon_monoxide_level,
"Carbon Monoxide Measurement",
CONCENTRATION_PARTS_PER_MILLION,
None,
)
], ],
Capability.dishwasher_operating_state: [ Capability.dishwasher_operating_state: [
Map(Attribute.machine_state, "Dishwasher Machine State", None, None), Map(Attribute.machine_state, "Dishwasher Machine State", None, None),
@ -82,12 +93,17 @@ CAPABILITY_TO_SENSORS = {
Map( Map(
Attribute.equivalent_carbon_dioxide_measurement, Attribute.equivalent_carbon_dioxide_measurement,
"Equivalent Carbon Dioxide Measurement", "Equivalent Carbon Dioxide Measurement",
"ppm", CONCENTRATION_PARTS_PER_MILLION,
None, None,
) )
], ],
Capability.formaldehyde_measurement: [ Capability.formaldehyde_measurement: [
Map(Attribute.formaldehyde_level, "Formaldehyde Measurement", "ppm", None) Map(
Attribute.formaldehyde_level,
"Formaldehyde Measurement",
CONCENTRATION_PARTS_PER_MILLION,
None,
)
], ],
Capability.illuminance_measurement: [ Capability.illuminance_measurement: [
Map(Attribute.illuminance, "Illuminance", "lux", DEVICE_CLASS_ILLUMINANCE) Map(Attribute.illuminance, "Illuminance", "lux", DEVICE_CLASS_ILLUMINANCE)
@ -203,7 +219,12 @@ CAPABILITY_TO_SENSORS = {
Capability.three_axis: [], Capability.three_axis: [],
Capability.tv_channel: [Map(Attribute.tv_channel, "Tv Channel", None, None)], Capability.tv_channel: [Map(Attribute.tv_channel, "Tv Channel", None, None)],
Capability.tvoc_measurement: [ Capability.tvoc_measurement: [
Map(Attribute.tvoc_level, "Tvoc Measurement", "ppm", None) Map(
Attribute.tvoc_level,
"Tvoc Measurement",
CONCENTRATION_PARTS_PER_MILLION,
None,
)
], ],
Capability.ultraviolet_index: [ Capability.ultraviolet_index: [
Map(Attribute.ultraviolet_index, "Ultraviolet Index", None, None) Map(Attribute.ultraviolet_index, "Ultraviolet Index", None, None)

View File

@ -7,9 +7,9 @@ from homeassistant.const import (
DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_ILLUMINANCE,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
POWER_WATT, POWER_WATT,
SPEED_METERS_PER_SECOND,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_HOURS, TIME_HOURS,
TIME_SECONDS,
) )
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -41,8 +41,8 @@ SENSOR_TYPES = {
SENSOR_TYPE_RAINRATE: ["Rain rate", f"mm/{TIME_HOURS}", "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_RAINTOTAL: ["Rain total", "mm", "mdi:water", None],
SENSOR_TYPE_WINDDIRECTION: ["Wind direction", "", "", None], SENSOR_TYPE_WINDDIRECTION: ["Wind direction", "", "", None],
SENSOR_TYPE_WINDAVERAGE: ["Wind average", f"m/{TIME_SECONDS}", "", None], SENSOR_TYPE_WINDAVERAGE: ["Wind average", SPEED_METERS_PER_SECOND, "", None],
SENSOR_TYPE_WINDGUST: ["Wind gust", f"m/{TIME_SECONDS}", "", None], SENSOR_TYPE_WINDGUST: ["Wind gust", SPEED_METERS_PER_SECOND, "", None],
SENSOR_TYPE_UV: ["UV", "UV", "", None], SENSOR_TYPE_UV: ["UV", "UV", "", None],
SENSOR_TYPE_WATT: ["Power", POWER_WATT, "", None], SENSOR_TYPE_WATT: ["Power", POWER_WATT, "", None],
SENSOR_TYPE_LUMINANCE: ["Luminance", "lx", None, DEVICE_CLASS_ILLUMINANCE], SENSOR_TYPE_LUMINANCE: ["Luminance", "lx", None, DEVICE_CLASS_ILLUMINANCE],

View File

@ -16,8 +16,8 @@ from homeassistant.const import (
CONF_NAME, CONF_NAME,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
SPEED_METERS_PER_SECOND,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_SECONDS,
) )
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -74,7 +74,7 @@ SENSOR_TYPES = {
], ],
"wind_speed": [ "wind_speed": [
"Wind speed", "Wind speed",
f"m/{TIME_SECONDS}", SPEED_METERS_PER_SECOND,
"windforce", "windforce",
"mdi:weather-windy", "mdi:weather-windy",
None, None,

View File

@ -1,7 +1,7 @@
"""Support for UPnP/IGD Sensors.""" """Support for UPnP/IGD Sensors."""
import logging import logging
from homeassistant.const import TIME_SECONDS from homeassistant.const import DATA_BYTES, DATA_KIBIBYTES, TIME_SECONDS
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -19,15 +19,15 @@ PACKETS_RECEIVED = "packets_received"
PACKETS_SENT = "packets_sent" PACKETS_SENT = "packets_sent"
SENSOR_TYPES = { SENSOR_TYPES = {
BYTES_RECEIVED: {"name": "bytes received", "unit": "bytes"}, BYTES_RECEIVED: {"name": "bytes received", "unit": DATA_BYTES},
BYTES_SENT: {"name": "bytes sent", "unit": "bytes"}, BYTES_SENT: {"name": "bytes sent", "unit": DATA_BYTES},
PACKETS_RECEIVED: {"name": "packets received", "unit": "packets"}, PACKETS_RECEIVED: {"name": "packets received", "unit": "packets"},
PACKETS_SENT: {"name": "packets sent", "unit": "packets"}, PACKETS_SENT: {"name": "packets sent", "unit": "packets"},
} }
IN = "received" IN = "received"
OUT = "sent" OUT = "sent"
KBYTE = 1024 KIBIBYTE = 1024
async def async_setup_platform( async def async_setup_platform(
@ -226,7 +226,7 @@ class KBytePerSecondUPnPIGDSensor(PerSecondUPnPIGDSensor):
@property @property
def unit(self) -> str: def unit(self) -> str:
"""Get unit we are measuring in.""" """Get unit we are measuring in."""
return "kB" return DATA_KIBIBYTES
async def _async_fetch_value(self) -> float: async def _async_fetch_value(self) -> float:
"""Fetch value from device.""" """Fetch value from device."""
@ -241,7 +241,7 @@ class KBytePerSecondUPnPIGDSensor(PerSecondUPnPIGDSensor):
if self._state is None: if self._state is None:
return None return None
return format(float(self._state / KBYTE), ".1f") return format(float(self._state / KIBIBYTE), ".1f")
class PacketsPerSecondUPnPIGDSensor(PerSecondUPnPIGDSensor): class PacketsPerSecondUPnPIGDSensor(PerSecondUPnPIGDSensor):

View File

@ -59,11 +59,9 @@ MEAS_TEMP_C = "temperature_c"
MEAS_WEIGHT_KG = "weight_kg" MEAS_WEIGHT_KG = "weight_kg"
UOM_BEATS_PER_MINUTE = "bpm" UOM_BEATS_PER_MINUTE = "bpm"
UOM_BREATHS_PER_MINUTE = "br/m" UOM_BREATHS_PER_MINUTE = f"br/{const.TIME_MINUTES}"
UOM_FREQUENCY = "times" UOM_FREQUENCY = "times"
UOM_METERS_PER_SECOND = f"m/{const.TIME_SECONDS}"
UOM_MMHG = "mmhg" UOM_MMHG = "mmhg"
UOM_PERCENT = "%" UOM_PERCENT = "%"
UOM_LENGTH_M = const.LENGTH_METERS UOM_LENGTH_M = const.LENGTH_METERS
UOM_MASS_KG = const.MASS_KILOGRAMS
UOM_TEMP_C = const.TEMP_CELSIUS UOM_TEMP_C = const.TEMP_CELSIUS

View File

@ -13,7 +13,7 @@ from withings_api.common import (
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import TIME_SECONDS from homeassistant.const import MASS_KILOGRAMS, SPEED_METERS_PER_SECOND, TIME_SECONDS
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_entry_oauth2_flow from homeassistant.helpers import config_entry_oauth2_flow
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@ -87,35 +87,35 @@ WITHINGS_ATTRIBUTES = [
const.MEAS_WEIGHT_KG, const.MEAS_WEIGHT_KG,
MeasureType.WEIGHT, MeasureType.WEIGHT,
"Weight", "Weight",
const.UOM_MASS_KG, MASS_KILOGRAMS,
"mdi:weight-kilogram", "mdi:weight-kilogram",
), ),
WithingsMeasureAttribute( WithingsMeasureAttribute(
const.MEAS_FAT_MASS_KG, const.MEAS_FAT_MASS_KG,
MeasureType.FAT_MASS_WEIGHT, MeasureType.FAT_MASS_WEIGHT,
"Fat Mass", "Fat Mass",
const.UOM_MASS_KG, MASS_KILOGRAMS,
"mdi:weight-kilogram", "mdi:weight-kilogram",
), ),
WithingsMeasureAttribute( WithingsMeasureAttribute(
const.MEAS_FAT_FREE_MASS_KG, const.MEAS_FAT_FREE_MASS_KG,
MeasureType.FAT_FREE_MASS, MeasureType.FAT_FREE_MASS,
"Fat Free Mass", "Fat Free Mass",
const.UOM_MASS_KG, MASS_KILOGRAMS,
"mdi:weight-kilogram", "mdi:weight-kilogram",
), ),
WithingsMeasureAttribute( WithingsMeasureAttribute(
const.MEAS_MUSCLE_MASS_KG, const.MEAS_MUSCLE_MASS_KG,
MeasureType.MUSCLE_MASS, MeasureType.MUSCLE_MASS,
"Muscle Mass", "Muscle Mass",
const.UOM_MASS_KG, MASS_KILOGRAMS,
"mdi:weight-kilogram", "mdi:weight-kilogram",
), ),
WithingsMeasureAttribute( WithingsMeasureAttribute(
const.MEAS_BONE_MASS_KG, const.MEAS_BONE_MASS_KG,
MeasureType.BONE_MASS, MeasureType.BONE_MASS,
"Bone Mass", "Bone Mass",
const.UOM_MASS_KG, MASS_KILOGRAMS,
"mdi:weight-kilogram", "mdi:weight-kilogram",
), ),
WithingsMeasureAttribute( WithingsMeasureAttribute(
@ -188,7 +188,7 @@ WITHINGS_ATTRIBUTES = [
const.MEAS_PWV, const.MEAS_PWV,
MeasureType.PULSE_WAVE_VELOCITY, MeasureType.PULSE_WAVE_VELOCITY,
"Pulse Wave Velocity", "Pulse Wave Velocity",
const.UOM_METERS_PER_SECOND, SPEED_METERS_PER_SECOND,
None, None,
), ),
WithingsSleepStateAttribute( WithingsSleepStateAttribute(

View File

@ -17,10 +17,13 @@ from homeassistant.const import (
CONF_LATITUDE, CONF_LATITUDE,
CONF_LONGITUDE, CONF_LONGITUDE,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
IRRADIATION_WATTS_PER_SQUARE_METER,
LENGTH_FEET, LENGTH_FEET,
LENGTH_INCHES, LENGTH_INCHES,
LENGTH_KILOMETERS, LENGTH_KILOMETERS,
LENGTH_MILES, LENGTH_MILES,
SPEED_KILOMETERS_PER_HOUR,
SPEED_MILES_PER_HOUR,
TEMP_CELSIUS, TEMP_CELSIUS,
TEMP_FAHRENHEIT, TEMP_FAHRENHEIT,
) )
@ -421,7 +424,10 @@ SENSOR_TYPES = {
"Station ID", "station_id", "mdi:home" "Station ID", "station_id", "mdi:home"
), ),
"solarradiation": WUCurrentConditionsSensorConfig( "solarradiation": WUCurrentConditionsSensorConfig(
"Solar Radiation", "solarradiation", "mdi:weather-sunny", "w/m2" "Solar Radiation",
"solarradiation",
"mdi:weather-sunny",
IRRADIATION_WATTS_PER_SQUARE_METER,
), ),
"temperature_string": WUCurrentConditionsSensorConfig( "temperature_string": WUCurrentConditionsSensorConfig(
"Temperature Summary", "temperature_string", "mdi:thermometer" "Temperature Summary", "temperature_string", "mdi:thermometer"
@ -455,16 +461,16 @@ SENSOR_TYPES = {
"Wind Direction", "wind_dir", "mdi:weather-windy" "Wind Direction", "wind_dir", "mdi:weather-windy"
), ),
"wind_gust_kph": WUCurrentConditionsSensorConfig( "wind_gust_kph": WUCurrentConditionsSensorConfig(
"Wind Gust", "wind_gust_kph", "mdi:weather-windy", "kph" "Wind Gust", "wind_gust_kph", "mdi:weather-windy", SPEED_KILOMETERS_PER_HOUR
), ),
"wind_gust_mph": WUCurrentConditionsSensorConfig( "wind_gust_mph": WUCurrentConditionsSensorConfig(
"Wind Gust", "wind_gust_mph", "mdi:weather-windy", "mph" "Wind Gust", "wind_gust_mph", "mdi:weather-windy", SPEED_MILES_PER_HOUR
), ),
"wind_kph": WUCurrentConditionsSensorConfig( "wind_kph": WUCurrentConditionsSensorConfig(
"Wind Speed", "wind_kph", "mdi:weather-windy", "kph" "Wind Speed", "wind_kph", "mdi:weather-windy", SPEED_KILOMETERS_PER_HOUR
), ),
"wind_mph": WUCurrentConditionsSensorConfig( "wind_mph": WUCurrentConditionsSensorConfig(
"Wind Speed", "wind_mph", "mdi:weather-windy", "mph" "Wind Speed", "wind_mph", "mdi:weather-windy", SPEED_MILES_PER_HOUR
), ),
"wind_string": WUCurrentConditionsSensorConfig( "wind_string": WUCurrentConditionsSensorConfig(
"Wind Summary", "wind_string", "mdi:weather-windy" "Wind Summary", "wind_string", "mdi:weather-windy"
@ -738,52 +744,132 @@ SENSOR_TYPES = {
device_class="temperature", device_class="temperature",
), ),
"wind_gust_1d_kph": WUDailySimpleForecastSensorConfig( "wind_gust_1d_kph": WUDailySimpleForecastSensorConfig(
"Max. Wind Today", 0, "maxwind", "kph", "kph", "mdi:weather-windy" "Max. Wind Today",
0,
"maxwind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_2d_kph": WUDailySimpleForecastSensorConfig( "wind_gust_2d_kph": WUDailySimpleForecastSensorConfig(
"Max. Wind Tomorrow", 1, "maxwind", "kph", "kph", "mdi:weather-windy" "Max. Wind Tomorrow",
1,
"maxwind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_3d_kph": WUDailySimpleForecastSensorConfig( "wind_gust_3d_kph": WUDailySimpleForecastSensorConfig(
"Max. Wind in 3 Days", 2, "maxwind", "kph", "kph", "mdi:weather-windy" "Max. Wind in 3 Days",
2,
"maxwind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_4d_kph": WUDailySimpleForecastSensorConfig( "wind_gust_4d_kph": WUDailySimpleForecastSensorConfig(
"Max. Wind in 4 Days", 3, "maxwind", "kph", "kph", "mdi:weather-windy" "Max. Wind in 4 Days",
3,
"maxwind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_1d_mph": WUDailySimpleForecastSensorConfig( "wind_gust_1d_mph": WUDailySimpleForecastSensorConfig(
"Max. Wind Today", 0, "maxwind", "mph", "mph", "mdi:weather-windy" "Max. Wind Today",
0,
"maxwind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_2d_mph": WUDailySimpleForecastSensorConfig( "wind_gust_2d_mph": WUDailySimpleForecastSensorConfig(
"Max. Wind Tomorrow", 1, "maxwind", "mph", "mph", "mdi:weather-windy" "Max. Wind Tomorrow",
1,
"maxwind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_3d_mph": WUDailySimpleForecastSensorConfig( "wind_gust_3d_mph": WUDailySimpleForecastSensorConfig(
"Max. Wind in 3 Days", 2, "maxwind", "mph", "mph", "mdi:weather-windy" "Max. Wind in 3 Days",
2,
"maxwind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_gust_4d_mph": WUDailySimpleForecastSensorConfig( "wind_gust_4d_mph": WUDailySimpleForecastSensorConfig(
"Max. Wind in 4 Days", 3, "maxwind", "mph", "mph", "mdi:weather-windy" "Max. Wind in 4 Days",
3,
"maxwind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_1d_kph": WUDailySimpleForecastSensorConfig( "wind_1d_kph": WUDailySimpleForecastSensorConfig(
"Avg. Wind Today", 0, "avewind", "kph", "kph", "mdi:weather-windy" "Avg. Wind Today",
0,
"avewind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_2d_kph": WUDailySimpleForecastSensorConfig( "wind_2d_kph": WUDailySimpleForecastSensorConfig(
"Avg. Wind Tomorrow", 1, "avewind", "kph", "kph", "mdi:weather-windy" "Avg. Wind Tomorrow",
1,
"avewind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_3d_kph": WUDailySimpleForecastSensorConfig( "wind_3d_kph": WUDailySimpleForecastSensorConfig(
"Avg. Wind in 3 Days", 2, "avewind", "kph", "kph", "mdi:weather-windy" "Avg. Wind in 3 Days",
2,
"avewind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_4d_kph": WUDailySimpleForecastSensorConfig( "wind_4d_kph": WUDailySimpleForecastSensorConfig(
"Avg. Wind in 4 Days", 3, "avewind", "kph", "kph", "mdi:weather-windy" "Avg. Wind in 4 Days",
3,
"avewind",
SPEED_KILOMETERS_PER_HOUR,
SPEED_KILOMETERS_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_1d_mph": WUDailySimpleForecastSensorConfig( "wind_1d_mph": WUDailySimpleForecastSensorConfig(
"Avg. Wind Today", 0, "avewind", "mph", "mph", "mdi:weather-windy" "Avg. Wind Today",
0,
"avewind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_2d_mph": WUDailySimpleForecastSensorConfig( "wind_2d_mph": WUDailySimpleForecastSensorConfig(
"Avg. Wind Tomorrow", 1, "avewind", "mph", "mph", "mdi:weather-windy" "Avg. Wind Tomorrow",
1,
"avewind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_3d_mph": WUDailySimpleForecastSensorConfig( "wind_3d_mph": WUDailySimpleForecastSensorConfig(
"Avg. Wind in 3 Days", 2, "avewind", "mph", "mph", "mdi:weather-windy" "Avg. Wind in 3 Days",
2,
"avewind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"wind_4d_mph": WUDailySimpleForecastSensorConfig( "wind_4d_mph": WUDailySimpleForecastSensorConfig(
"Avg. Wind in 4 Days", 3, "avewind", "mph", "mph", "mdi:weather-windy" "Avg. Wind in 4 Days",
3,
"avewind",
SPEED_MILES_PER_HOUR,
SPEED_MILES_PER_HOUR,
"mdi:weather-windy",
), ),
"precip_1d_mm": WUDailySimpleForecastSensorConfig( "precip_1d_mm": WUDailySimpleForecastSensorConfig(
"Precipitation Intensity Today", 0, "qpf_allday", "mm", "mm", "mdi:umbrella" "Precipitation Intensity Today", 0, "qpf_allday", "mm", "mm", "mdi:umbrella"

View File

@ -5,7 +5,12 @@ from miio import AirQualityMonitor, Device, DeviceException
import voluptuous as vol import voluptuous as vol
from homeassistant.components.air_quality import PLATFORM_SCHEMA, AirQualityEntity from homeassistant.components.air_quality import PLATFORM_SCHEMA, AirQualityEntity
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_TOKEN from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONF_HOST,
CONF_NAME,
CONF_TOKEN,
)
from homeassistant.exceptions import NoEntitySpecifiedError, PlatformNotReady from homeassistant.exceptions import NoEntitySpecifiedError, PlatformNotReady
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -88,7 +93,7 @@ class AirMonitorB1(AirQualityEntity):
self._device = device self._device = device
self._unique_id = unique_id self._unique_id = unique_id
self._icon = "mdi:cloud" self._icon = "mdi:cloud"
self._unit_of_measurement = "μg/m3" self._unit_of_measurement = CONCENTRATION_MICROGRAMS_PER_CUBIC_METER
self._available = None self._available = None
self._air_quality_index = None self._air_quality_index = None
self._carbon_dioxide = None self._carbon_dioxide = None

View File

@ -21,8 +21,8 @@ from homeassistant.const import (
DEVICE_CLASS_PRESSURE, DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
PRESSURE_HPA, PRESSURE_HPA,
SPEED_METERS_PER_SECOND,
TEMP_CELSIUS, TEMP_CELSIUS,
TIME_SECONDS,
) )
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -42,8 +42,8 @@ SENSOR_TYPES = {
"symbol": ["Symbol", None, None], "symbol": ["Symbol", None, None],
"precipitation": ["Precipitation", "mm", None], "precipitation": ["Precipitation", "mm", None],
"temperature": ["Temperature", TEMP_CELSIUS, DEVICE_CLASS_TEMPERATURE], "temperature": ["Temperature", TEMP_CELSIUS, DEVICE_CLASS_TEMPERATURE],
"windSpeed": ["Wind speed", f"m/{TIME_SECONDS}", None], "windSpeed": ["Wind speed", SPEED_METERS_PER_SECOND, None],
"windGust": ["Wind gust", f"m/{TIME_SECONDS}", None], "windGust": ["Wind gust", SPEED_METERS_PER_SECOND, None],
"pressure": ["Pressure", PRESSURE_HPA, DEVICE_CLASS_PRESSURE], "pressure": ["Pressure", PRESSURE_HPA, DEVICE_CLASS_PRESSURE],
"windDirection": ["Wind direction", "°", None], "windDirection": ["Wind direction", "°", None],
"humidity": ["Humidity", "%", DEVICE_CLASS_HUMIDITY], "humidity": ["Humidity", "%", DEVICE_CLASS_HUMIDITY],

View File

@ -17,7 +17,7 @@ from homeassistant.const import (
CONF_LONGITUDE, CONF_LONGITUDE,
CONF_MONITORED_CONDITIONS, CONF_MONITORED_CONDITIONS,
CONF_NAME, CONF_NAME,
TIME_HOURS, SPEED_KILOMETERS_PER_HOUR,
__version__, __version__,
) )
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
@ -40,12 +40,17 @@ SENSOR_TYPES = {
"pressure": ("Pressure", "hPa", "LDstat hPa", float), "pressure": ("Pressure", "hPa", "LDstat hPa", float),
"pressure_sealevel": ("Pressure at Sea Level", "hPa", "LDred hPa", float), "pressure_sealevel": ("Pressure at Sea Level", "hPa", "LDred hPa", float),
"humidity": ("Humidity", "%", "RF %", int), "humidity": ("Humidity", "%", "RF %", int),
"wind_speed": ("Wind Speed", f"km/{TIME_HOURS}", f"WG km/{TIME_HOURS}", float), "wind_speed": (
"Wind Speed",
SPEED_KILOMETERS_PER_HOUR,
f"WG {SPEED_KILOMETERS_PER_HOUR}",
float,
),
"wind_bearing": ("Wind Bearing", "°", "WR °", int), "wind_bearing": ("Wind Bearing", "°", "WR °", int),
"wind_max_speed": ( "wind_max_speed": (
"Top Wind Speed", "Top Wind Speed",
f"km/{TIME_HOURS}", SPEED_KILOMETERS_PER_HOUR,
f"WSG km/{TIME_HOURS}", f"WSG {SPEED_KILOMETERS_PER_HOUR}",
float, float,
), ),
"wind_max_bearing": ("Top Wind Bearing", "°", "WSR °", int), "wind_max_bearing": ("Top Wind Bearing", "°", "WSR °", int),

View File

@ -375,13 +375,19 @@ PRESSURE_PSI: str = "psi"
# Volume units # Volume units
VOLUME_LITERS: str = "L" VOLUME_LITERS: str = "L"
VOLUME_MILLILITERS: str = "mL" VOLUME_MILLILITERS: str = "mL"
VOLUME_CUBIC_METERS = f"{LENGTH_METERS}³"
VOLUME_GALLONS: str = "gal" VOLUME_GALLONS: str = "gal"
VOLUME_FLUID_OUNCE: str = "fl. oz." VOLUME_FLUID_OUNCE: str = "fl. oz."
# Area units
AREA_SQUARE_METERS = f"{LENGTH_METERS}²"
# Mass units # Mass units
MASS_GRAMS: str = "g" MASS_GRAMS: str = "g"
MASS_KILOGRAMS: str = "kg" MASS_KILOGRAMS: str = "kg"
MASS_MILLIGRAMS = "mg"
MASS_MICROGRAMS = "µg"
MASS_OUNCES: str = "oz" MASS_OUNCES: str = "oz"
MASS_POUNDS: str = "lb" MASS_POUNDS: str = "lb"
@ -389,6 +395,20 @@ MASS_POUNDS: str = "lb"
# UV Index units # UV Index units
UNIT_UV_INDEX: str = "UV index" UNIT_UV_INDEX: str = "UV index"
# Irradiation units
IRRADIATION_WATTS_PER_SQUARE_METER = f"{POWER_WATT}/{AREA_SQUARE_METERS}"
# Concentration units
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER = f"{MASS_MICROGRAMS}/{VOLUME_CUBIC_METERS}"
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER = f"{MASS_MILLIGRAMS}/{VOLUME_CUBIC_METERS}"
CONCENTRATION_PARTS_PER_MILLION = "ppm"
CONCENTRATION_PARTS_PER_BILLION = "ppb"
# Speed units
SPEED_METERS_PER_SECOND = f"{LENGTH_METERS}/{TIME_SECONDS}"
SPEED_KILOMETERS_PER_HOUR = f"{LENGTH_KILOMETERS}/{TIME_HOURS}"
SPEED_MILES_PER_HOUR = "mph"
# Data units # Data units
DATA_BITS = "bit" DATA_BITS = "bit"
DATA_KILOBITS = "kbit" DATA_KILOBITS = "kbit"

View File

@ -16,6 +16,9 @@ from homeassistant.components.awair.sensor import (
) )
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import ( from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_TEMPERATURE,
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
@ -183,7 +186,7 @@ async def test_awair_co2(hass):
sensor = hass.states.get("sensor.awair_co2") sensor = hass.states.get("sensor.awair_co2")
assert sensor.state == "612" assert sensor.state == "612"
assert sensor.attributes["device_class"] == DEVICE_CLASS_CARBON_DIOXIDE assert sensor.attributes["device_class"] == DEVICE_CLASS_CARBON_DIOXIDE
assert sensor.attributes["unit_of_measurement"] == "ppm" assert sensor.attributes["unit_of_measurement"] == CONCENTRATION_PARTS_PER_MILLION
async def test_awair_voc(hass): async def test_awair_voc(hass):
@ -193,7 +196,7 @@ async def test_awair_voc(hass):
sensor = hass.states.get("sensor.awair_voc") sensor = hass.states.get("sensor.awair_voc")
assert sensor.state == "1012" assert sensor.state == "1012"
assert sensor.attributes["device_class"] == DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS assert sensor.attributes["device_class"] == DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS
assert sensor.attributes["unit_of_measurement"] == "ppb" assert sensor.attributes["unit_of_measurement"] == CONCENTRATION_PARTS_PER_BILLION
async def test_awair_dust(hass): async def test_awair_dust(hass):
@ -205,7 +208,10 @@ async def test_awair_dust(hass):
sensor = hass.states.get("sensor.awair_pm2_5") sensor = hass.states.get("sensor.awair_pm2_5")
assert sensor.state == "6.2" assert sensor.state == "6.2"
assert sensor.attributes["device_class"] == DEVICE_CLASS_PM2_5 assert sensor.attributes["device_class"] == DEVICE_CLASS_PM2_5
assert sensor.attributes["unit_of_measurement"] == "µg/m3" assert (
sensor.attributes["unit_of_measurement"]
== CONCENTRATION_MICROGRAMS_PER_CUBIC_METER
)
async def test_awair_unsupported_sensors(hass): async def test_awair_unsupported_sensors(hass):

View File

@ -15,7 +15,7 @@ import pytest
from homeassistant.bootstrap import async_setup_component from homeassistant.bootstrap import async_setup_component
from homeassistant.components.dsmr.sensor import DerivativeDSMREntity from homeassistant.components.dsmr.sensor import DerivativeDSMREntity
from homeassistant.const import TIME_HOURS from homeassistant.const import TIME_HOURS, VOLUME_CUBIC_METERS
from tests.common import assert_setup_component from tests.common import assert_setup_component
@ -67,7 +67,7 @@ async def test_default_setup(hass, mock_connection_factory):
GAS_METER_READING: MBusObject( GAS_METER_READING: MBusObject(
[ [
{"value": datetime.datetime.fromtimestamp(1551642213)}, {"value": datetime.datetime.fromtimestamp(1551642213)},
{"value": Decimal(745.695), "unit": "m3"}, {"value": Decimal(745.695), "unit": VOLUME_CUBIC_METERS},
] ]
), ),
} }
@ -101,7 +101,7 @@ async def test_default_setup(hass, mock_connection_factory):
# check if gas consumption is parsed correctly # check if gas consumption is parsed correctly
gas_consumption = hass.states.get("sensor.gas_consumption") gas_consumption = hass.states.get("sensor.gas_consumption")
assert gas_consumption.state == "745.695" assert gas_consumption.state == "745.695"
assert gas_consumption.attributes.get("unit_of_measurement") == "m3" assert gas_consumption.attributes.get("unit_of_measurement") == VOLUME_CUBIC_METERS
async def test_derivative(): async def test_derivative():
@ -119,7 +119,7 @@ async def test_derivative():
"1.0.0": MBusObject( "1.0.0": MBusObject(
[ [
{"value": datetime.datetime.fromtimestamp(1551642213)}, {"value": datetime.datetime.fromtimestamp(1551642213)},
{"value": Decimal(745.695), "unit": "m3"}, {"value": Decimal(745.695), "unit": VOLUME_CUBIC_METERS},
] ]
) )
} }
@ -131,7 +131,7 @@ async def test_derivative():
"1.0.0": MBusObject( "1.0.0": MBusObject(
[ [
{"value": datetime.datetime.fromtimestamp(1551642543)}, {"value": datetime.datetime.fromtimestamp(1551642543)},
{"value": Decimal(745.698), "unit": "m3"}, {"value": Decimal(745.698), "unit": VOLUME_CUBIC_METERS},
] ]
) )
} }
@ -141,7 +141,7 @@ async def test_derivative():
abs(entity.state - 0.033) < 0.00001 abs(entity.state - 0.033) < 0.00001
), "state should be hourly usage calculated from first and second update" ), "state should be hourly usage calculated from first and second update"
assert entity.unit_of_measurement == f"m3/{TIME_HOURS}" assert entity.unit_of_measurement == f"{VOLUME_CUBIC_METERS}/{TIME_HOURS}"
async def test_v4_meter(hass, mock_connection_factory): async def test_v4_meter(hass, mock_connection_factory):
@ -160,7 +160,7 @@ async def test_v4_meter(hass, mock_connection_factory):
HOURLY_GAS_METER_READING: MBusObject( HOURLY_GAS_METER_READING: MBusObject(
[ [
{"value": datetime.datetime.fromtimestamp(1551642213)}, {"value": datetime.datetime.fromtimestamp(1551642213)},
{"value": Decimal(745.695), "unit": "m3"}, {"value": Decimal(745.695), "unit": VOLUME_CUBIC_METERS},
] ]
), ),
ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0001", "unit": ""}]), ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0001", "unit": ""}]),
@ -185,7 +185,7 @@ async def test_v4_meter(hass, mock_connection_factory):
# check if gas consumption is parsed correctly # check if gas consumption is parsed correctly
gas_consumption = hass.states.get("sensor.gas_consumption") gas_consumption = hass.states.get("sensor.gas_consumption")
assert gas_consumption.state == "745.695" assert gas_consumption.state == "745.695"
assert gas_consumption.attributes.get("unit_of_measurement") == "m3" assert gas_consumption.attributes.get("unit_of_measurement") == VOLUME_CUBIC_METERS
async def test_belgian_meter(hass, mock_connection_factory): async def test_belgian_meter(hass, mock_connection_factory):
@ -204,7 +204,7 @@ async def test_belgian_meter(hass, mock_connection_factory):
BELGIUM_HOURLY_GAS_METER_READING: MBusObject( BELGIUM_HOURLY_GAS_METER_READING: MBusObject(
[ [
{"value": datetime.datetime.fromtimestamp(1551642213)}, {"value": datetime.datetime.fromtimestamp(1551642213)},
{"value": Decimal(745.695), "unit": "m3"}, {"value": Decimal(745.695), "unit": VOLUME_CUBIC_METERS},
] ]
), ),
ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0001", "unit": ""}]), ELECTRICITY_ACTIVE_TARIFF: CosemObject([{"value": "0001", "unit": ""}]),
@ -229,7 +229,7 @@ async def test_belgian_meter(hass, mock_connection_factory):
# check if gas consumption is parsed correctly # check if gas consumption is parsed correctly
gas_consumption = hass.states.get("sensor.gas_consumption") gas_consumption = hass.states.get("sensor.gas_consumption")
assert gas_consumption.state == "745.695" assert gas_consumption.state == "745.695"
assert gas_consumption.attributes.get("unit_of_measurement") == "m3" assert gas_consumption.attributes.get("unit_of_measurement") == VOLUME_CUBIC_METERS
async def test_belgian_meter_low(hass, mock_connection_factory): async def test_belgian_meter_low(hass, mock_connection_factory):

View File

@ -8,7 +8,12 @@ import pytest
from homeassistant.components.foobot import sensor as foobot from homeassistant.components.foobot import sensor as foobot
import homeassistant.components.sensor as sensor import homeassistant.components.sensor as sensor
from homeassistant.const import TEMP_CELSIUS from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
TEMP_CELSIUS,
)
from homeassistant.exceptions import PlatformNotReady from homeassistant.exceptions import PlatformNotReady
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -33,11 +38,11 @@ async def test_default_setup(hass, aioclient_mock):
assert await async_setup_component(hass, sensor.DOMAIN, {"sensor": VALID_CONFIG}) assert await async_setup_component(hass, sensor.DOMAIN, {"sensor": VALID_CONFIG})
metrics = { metrics = {
"co2": ["1232.0", "ppm"], "co2": ["1232.0", CONCENTRATION_PARTS_PER_MILLION],
"temperature": ["21.1", TEMP_CELSIUS], "temperature": ["21.1", TEMP_CELSIUS],
"humidity": ["49.5", "%"], "humidity": ["49.5", "%"],
"pm2_5": ["144.8", "µg/m3"], "pm2_5": ["144.8", CONCENTRATION_MICROGRAMS_PER_CUBIC_METER],
"voc": ["340.7", "ppb"], "voc": ["340.7", CONCENTRATION_PARTS_PER_BILLION],
"index": ["138.9", "%"], "index": ["138.9", "%"],
} }

View File

@ -20,10 +20,14 @@ from homeassistant.components.homematicip_cloud.sensor import (
ATTR_TEMPERATURE_OFFSET, ATTR_TEMPERATURE_OFFSET,
ATTR_WIND_DIRECTION, ATTR_WIND_DIRECTION,
ATTR_WIND_DIRECTION_VARIATION, ATTR_WIND_DIRECTION_VARIATION,
TIME_HOURS,
) )
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, POWER_WATT, TEMP_CELSIUS from homeassistant.const import (
ATTR_UNIT_OF_MEASUREMENT,
POWER_WATT,
SPEED_KILOMETERS_PER_HOUR,
TEMP_CELSIUS,
)
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from .helper import async_manipulate_test_data, get_and_check_entity_basics from .helper import async_manipulate_test_data, get_and_check_entity_basics
@ -285,7 +289,7 @@ async def test_hmip_windspeed_sensor(hass, default_mock_hap_factory):
) )
assert ha_state.state == "2.6" assert ha_state.state == "2.6"
assert ha_state.attributes[ATTR_UNIT_OF_MEASUREMENT] == f"km/{TIME_HOURS}" assert ha_state.attributes[ATTR_UNIT_OF_MEASUREMENT] == SPEED_KILOMETERS_PER_HOUR
await async_manipulate_test_data(hass, hmip_device, "windSpeed", 9.4) await async_manipulate_test_data(hass, hmip_device, "windSpeed", 9.4)
ha_state = hass.states.get(entity_id) ha_state = hass.states.get(entity_id)
assert ha_state.state == "9.4" assert ha_state.state == "9.4"

View File

@ -4,7 +4,7 @@ from unittest.mock import DEFAULT, Mock, patch
import homeassistant.components.mhz19.sensor as mhz19 import homeassistant.components.mhz19.sensor as mhz19
from homeassistant.components.sensor import DOMAIN from homeassistant.components.sensor import DOMAIN
from homeassistant.const import TEMP_FAHRENHEIT from homeassistant.const import CONCENTRATION_PARTS_PER_MILLION, TEMP_FAHRENHEIT
from homeassistant.setup import setup_component from homeassistant.setup import setup_component
from tests.common import assert_setup_component, get_test_home_assistant from tests.common import assert_setup_component, get_test_home_assistant
@ -100,7 +100,7 @@ class TestMHZ19Sensor(unittest.TestCase):
assert "name: CO2" == sensor.name assert "name: CO2" == sensor.name
assert 1000 == sensor.state assert 1000 == sensor.state
assert "ppm" == sensor.unit_of_measurement assert CONCENTRATION_PARTS_PER_MILLION == sensor.unit_of_measurement
assert sensor.should_poll assert sensor.should_poll
assert {"temperature": 24} == sensor.device_state_attributes assert {"temperature": 24} == sensor.device_state_attributes

View File

@ -5,7 +5,11 @@ from homeassistant import setup
from homeassistant.components import climate, sensor from homeassistant.components import climate, sensor
from homeassistant.components.demo.sensor import DemoSensor from homeassistant.components.demo.sensor import DemoSensor
import homeassistant.components.prometheus as prometheus import homeassistant.components.prometheus as prometheus
from homeassistant.const import DEVICE_CLASS_POWER, ENERGY_KILO_WATT_HOUR from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
DEVICE_CLASS_POWER,
ENERGY_KILO_WATT_HOUR,
)
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -47,7 +51,12 @@ async def prometheus_client(loop, hass, hass_client):
await sensor4.async_update_ha_state() await sensor4.async_update_ha_state()
sensor5 = DemoSensor( sensor5 = DemoSensor(
None, "SPS30 PM <1µm Weight concentration", 3.7069, None, "µg/m³", None None,
"SPS30 PM <1µm Weight concentration",
3.7069,
None,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
None,
) )
sensor5.hass = hass sensor5.hass = hass
sensor5.entity_id = "sensor.sps30_pm_1um_weight_concentration" sensor5.entity_id = "sensor.sps30_pm_1um_weight_concentration"

View File

@ -3,7 +3,7 @@ from datetime import datetime
from unittest.mock import patch from unittest.mock import patch
from homeassistant.bootstrap import async_setup_component from homeassistant.bootstrap import async_setup_component
from homeassistant.const import TIME_SECONDS from homeassistant.const import SPEED_METERS_PER_SECOND
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from tests.common import assert_setup_component, load_fixture from tests.common import assert_setup_component, load_fixture
@ -71,7 +71,7 @@ async def test_custom_setup(hass, aioclient_mock):
assert state.state == "0.0" assert state.state == "0.0"
state = hass.states.get("sensor.yr_wind_speed") state = hass.states.get("sensor.yr_wind_speed")
assert state.attributes.get("unit_of_measurement") == f"m/{TIME_SECONDS}" assert state.attributes.get("unit_of_measurement") == SPEED_METERS_PER_SECOND
assert state.state == "3.5" assert state.state == "3.5"
@ -117,5 +117,5 @@ async def test_forecast_setup(hass, aioclient_mock):
assert state.state == "0.0" assert state.state == "0.0"
state = hass.states.get("sensor.yr_wind_speed") state = hass.states.get("sensor.yr_wind_speed")
assert state.attributes.get("unit_of_measurement") == f"m/{TIME_SECONDS}" assert state.attributes.get("unit_of_measurement") == SPEED_METERS_PER_SECOND
assert state.state == "3.6" assert state.state == "3.6"