<filename>homeassistant/components/nws/sensor.py<gh_stars>10-100
"""Sensors for National Weather Service (NWS)."""
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import (
    ATTR_ATTRIBUTION,
    ATTR_DEVICE_CLASS,
    CONF_LATITUDE,
    CONF_LONGITUDE,
    LENGTH_KILOMETERS,
    LENGTH_METERS,
    LENGTH_MILES,
    PERCENTAGE,
    PRESSURE_INHG,
    PRESSURE_PA,
    SPEED_MILES_PER_HOUR,
    TEMP_CELSIUS,
)
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.distance import convert as convert_distance
from homeassistant.util.dt import utcnow
from homeassistant.util.pressure import convert as convert_pressure

from . import base_unique_id
from .const import (
    ATTR_ICON,
    ATTR_LABEL,
    ATTR_UNIT,
    ATTR_UNIT_CONVERT,
    ATTRIBUTION,
    CONF_STATION,
    COORDINATOR_OBSERVATION,
    DOMAIN,
    NWS_DATA,
    OBSERVATION_VALID_TIME,
    SENSOR_TYPES,
)

PARALLEL_UPDATES = 0


async def async_setup_entry(hass, entry, async_add_entities):
    """Set up the NWS weather platform."""
    hass_data = hass.data[DOMAIN][entry.entry_id]
    station = entry.data[CONF_STATION]

    entities = []
    for sensor_type, sensor_data in SENSOR_TYPES.items():
        if hass.config.units.is_metric:
            unit = sensor_data[ATTR_UNIT]
        else:
            unit = sensor_data[ATTR_UNIT_CONVERT]
        entities.append(
            NWSSensor(
                entry.data,
                hass_data,
                sensor_type,
                station,
                sensor_data[ATTR_LABEL],
                sensor_data[ATTR_ICON],
                sensor_data[ATTR_DEVICE_CLASS],
                unit,
            ),
        )

    async_add_entities(entities, False)


class NWSSensor(CoordinatorEntity, SensorEntity):
    """An NWS Sensor Entity."""

    def __init__(
        self,
        entry_data,
        hass_data,
        sensor_type,
        station,
        label,
        icon,
        device_class,
        unit,
    ):
        """Initialise the platform with a data instance."""
        super().__init__(hass_data[COORDINATOR_OBSERVATION])
        self._nws = hass_data[NWS_DATA]
        self._latitude = entry_data[CONF_LATITUDE]
        self._longitude = entry_data[CONF_LONGITUDE]
        self._type = sensor_type
        self._station = station
        self._label = label
        self._icon = icon
        self._device_class = device_class
        self._unit = unit

    @property
    def state(self):
        """Return the state."""
        value = self._nws.observation.get(self._type)
        if value is None:
            return None
        if self._unit == SPEED_MILES_PER_HOUR:
            return round(convert_distance(value, LENGTH_KILOMETERS, LENGTH_MILES))
        if self._unit == LENGTH_MILES:
            return round(convert_distance(value, LENGTH_METERS, LENGTH_MILES))
        if self._unit == PRESSURE_INHG:
            return round(convert_pressure(value, PRESSURE_PA, PRESSURE_INHG), 2)
        if self._unit == TEMP_CELSIUS:
            return round(value, 1)
        if self._unit == PERCENTAGE:
            return round(value)
        return value

    @property
    def icon(self):
        """Return the icon."""
        return self._icon

    @property
    def device_class(self):
        """Return the device class."""
        return self._device_class

    @property
    def unit_of_measurement(self):
        """Return the unit the value is expressed in."""
        return self._unit

    @property
    def device_state_attributes(self):
        """Return the attribution."""
        return {ATTR_ATTRIBUTION: ATTRIBUTION}

    @property
    def name(self):
        """Return the name of the station."""
        return f"{self._station} {self._label}"

    @property
    def unique_id(self):
        """Return a unique_id for this entity."""
        return f"{base_unique_id(self._latitude, self._longitude)}_{self._type}"

    @property
    def available(self):
        """Return if state is available."""
        if self.coordinator.last_update_success_time:
            last_success_time = (
                utcnow() - self.coordinator.last_update_success_time
                < OBSERVATION_VALID_TIME
            )
        else:
            last_success_time = False
        return self.coordinator.last_update_success or last_success_time

    @property
    def entity_registry_enabled_default(self) -> bool:
        """Return if the entity should be enabled when first added to the entity registry."""
        return False

<filename>homeassistant/components/nws/sensor.py<gh_stars>10-100
"""Sensors for National Weather Service (NWS)."""
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import (
    ATTR_ATTRIBUTION,
    ATTR_DEVICE_CLASS,
    CONF_LATITUDE,
    CONF_LONGITUDE,
    LENGTH_KILOMETERS,
    LENGTH_METERS,
    LENGTH_MILES,
    PERCENTAGE,
    PRESSURE_INHG,
    PRESSURE_PA,
    SPEED_MILES_PER_HOUR,
    TEMP_CELSIUS,
)
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.distance import convert as convert_distance
from homeassistant.util.dt import utcnow
from homeassistant.util.pressure import convert as convert_pressure

from . import base_unique_id
from .const import (
    ATTR_ICON,
    ATTR_LABEL,
    ATTR_UNIT,
    ATTR_UNIT_CONVERT,
    ATTRIBUTION,
    CONF_STATION,
    COORDINATOR_OBSERVATION,
    DOMAIN,
    NWS_DATA,
    OBSERVATION_VALID_TIME,
    SENSOR_TYPES,
)

PARALLEL_UPDATES = 0


async def async_setup_entry(hass, entry, async_add_entities):
    """Set up the NWS weather platform."""
    hass_data = hass.data[DOMAIN][entry.entry_id]
    station = entry.data[CONF_STATION]

    entities = []
    for sensor_type, sensor_data in SENSOR_TYPES.items():
        if hass.config.units.is_metric:
            unit = sensor_data[ATTR_UNIT]
        else:
            unit = sensor_data[ATTR_UNIT_CONVERT]
        entities.append(
            NWSSensor(
                entry.data,
                hass_data,
                sensor_type,
                station,
                sensor_data[ATTR_LABEL],
                sensor_data[ATTR_ICON],
                sensor_data[ATTR_DEVICE_CLASS],
                unit,
            ),
        )

    async_add_entities(entities, False)


class NWSSensor(CoordinatorEntity, SensorEntity):
    """An NWS Sensor Entity."""

    def __init__(
        self,
        entry_data,
        hass_data,
        sensor_type,
        station,
        label,
        icon,
        device_class,
        unit,
    ):
        """Initialise the platform with a data instance."""
        super().__init__(hass_data[COORDINATOR_OBSERVATION])
        self._nws = hass_data[NWS_DATA]
        self._latitude = entry_data[CONF_LATITUDE]
        self._longitude = entry_data[CONF_LONGITUDE]
        self._type = sensor_type
        self._station = station
        self._label = label
        self._icon = icon
        self._device_class = device_class
        self._unit = unit

    @property
    def state(self):
        """Return the state."""
        value = self._nws.observation.get(self._type)
        if value is None:
            return None
        if self._unit == SPEED_MILES_PER_HOUR:
            return round(convert_distance(value, LENGTH_KILOMETERS, LENGTH_MILES))
        if self._unit == LENGTH_MILES:
            return round(convert_distance(value, LENGTH_METERS, LENGTH_MILES))
        if self._unit == PRESSURE_INHG:
            return round(convert_pressure(value, PRESSURE_PA, PRESSURE_INHG), 2)
        if self._unit == TEMP_CELSIUS:
            return round(value, 1)
        if self._unit == PERCENTAGE:
            return round(value)
        return value

    @property
    def icon(self):
        """Return the icon."""
        return self._icon

    @property
    def device_class(self):
        """Return the device class."""
        return self._device_class

    @property
    def unit_of_measurement(self):
        """Return the unit the value is expressed in."""
        return self._unit

    @property
    def device_state_attributes(self):
        """Return the attribution."""
        return {ATTR_ATTRIBUTION: ATTRIBUTION}

    @property
    def name(self):
        """Return the name of the station."""
        return f"{self._station} {self._label}"

    @property
    def unique_id(self):
        """Return a unique_id for this entity."""
        return f"{base_unique_id(self._latitude, self._longitude)}_{self._type}"

    @property
    def available(self):
        """Return if state is available."""
        if self.coordinator.last_update_success_time:
            last_success_time = (
                utcnow() - self.coordinator.last_update_success_time
                < OBSERVATION_VALID_TIME
            )
        else:
            last_success_time = False
        return self.coordinator.last_update_success or last_success_time

    @property
    def entity_registry_enabled_default(self) -> bool:
        """Return if the entity should be enabled when first added to the entity registry."""
        return False

Sensors for National Weather Service (NWS). Set up the NWS weather platform. An NWS Sensor Entity. Initialise the platform with a data instance. Return the state. Return the icon. Return the device class. Return the unit the value is expressed in. Return the attribution. Return the name of the station. Return a unique_id for this entity. Return if state is available. Return if the entity should be enabled when first added to the entity registry.