mirror of
https://github.com/home-assistant/core.git
synced 2025-07-26 06:37:52 +00:00
Add "UV Index" to IPMA (#100383)
* Bump pyipma to 3.0.7 * Add uv index sensor to IPMA
This commit is contained in:
parent
5541181969
commit
4066f657d3
@ -6,5 +6,5 @@
|
|||||||
"documentation": "https://www.home-assistant.io/integrations/ipma",
|
"documentation": "https://www.home-assistant.io/integrations/ipma",
|
||||||
"iot_class": "cloud_polling",
|
"iot_class": "cloud_polling",
|
||||||
"loggers": ["geopy", "pyipma"],
|
"loggers": ["geopy", "pyipma"],
|
||||||
"requirements": ["pyipma==3.0.6"]
|
"requirements": ["pyipma==3.0.7"]
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,8 @@ import logging
|
|||||||
|
|
||||||
from pyipma.api import IPMA_API
|
from pyipma.api import IPMA_API
|
||||||
from pyipma.location import Location
|
from pyipma.location import Location
|
||||||
|
from pyipma.rcm import RCM
|
||||||
|
from pyipma.uv import UV
|
||||||
|
|
||||||
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
|
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
@ -33,19 +35,32 @@ class IPMASensorEntityDescription(SensorEntityDescription, IPMARequiredKeysMixin
|
|||||||
"""Describes IPMA sensor entity."""
|
"""Describes IPMA sensor entity."""
|
||||||
|
|
||||||
|
|
||||||
async def async_retrive_rcm(location: Location, api: IPMA_API) -> int | None:
|
async def async_retrieve_rcm(location: Location, api: IPMA_API) -> int | None:
|
||||||
"""Retrieve RCM."""
|
"""Retrieve RCM."""
|
||||||
fire_risk = await location.fire_risk(api)
|
fire_risk: RCM = await location.fire_risk(api)
|
||||||
if fire_risk:
|
if fire_risk:
|
||||||
return fire_risk.rcm
|
return fire_risk.rcm
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
async def async_retrieve_uvi(location: Location, api: IPMA_API) -> int | None:
|
||||||
|
"""Retrieve UV."""
|
||||||
|
uv_risk: UV = await location.uv_risk(api)
|
||||||
|
if uv_risk:
|
||||||
|
return round(uv_risk.iUv)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
SENSOR_TYPES: tuple[IPMASensorEntityDescription, ...] = (
|
SENSOR_TYPES: tuple[IPMASensorEntityDescription, ...] = (
|
||||||
IPMASensorEntityDescription(
|
IPMASensorEntityDescription(
|
||||||
key="rcm",
|
key="rcm",
|
||||||
translation_key="fire_risk",
|
translation_key="fire_risk",
|
||||||
value_fn=async_retrive_rcm,
|
value_fn=async_retrieve_rcm,
|
||||||
|
),
|
||||||
|
IPMASensorEntityDescription(
|
||||||
|
key="uvi",
|
||||||
|
translation_key="uv_index",
|
||||||
|
value_fn=async_retrieve_uvi,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -81,7 +96,7 @@ class IPMASensor(SensorEntity, IPMADevice):
|
|||||||
|
|
||||||
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
||||||
async def async_update(self) -> None:
|
async def async_update(self) -> None:
|
||||||
"""Update Fire risk."""
|
"""Update sensors."""
|
||||||
async with asyncio.timeout(10):
|
async with asyncio.timeout(10):
|
||||||
self._attr_native_value = await self.entity_description.value_fn(
|
self._attr_native_value = await self.entity_description.value_fn(
|
||||||
self._location, self._api
|
self._location, self._api
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
"sensor": {
|
"sensor": {
|
||||||
"fire_risk": {
|
"fire_risk": {
|
||||||
"name": "Fire risk"
|
"name": "Fire risk"
|
||||||
|
},
|
||||||
|
"uv_index": {
|
||||||
|
"name": "UV index"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1764,7 +1764,7 @@ pyinsteon==1.5.1
|
|||||||
pyintesishome==1.8.0
|
pyintesishome==1.8.0
|
||||||
|
|
||||||
# homeassistant.components.ipma
|
# homeassistant.components.ipma
|
||||||
pyipma==3.0.6
|
pyipma==3.0.7
|
||||||
|
|
||||||
# homeassistant.components.ipp
|
# homeassistant.components.ipp
|
||||||
pyipp==0.14.4
|
pyipp==0.14.4
|
||||||
|
@ -1325,7 +1325,7 @@ pyicloud==1.0.0
|
|||||||
pyinsteon==1.5.1
|
pyinsteon==1.5.1
|
||||||
|
|
||||||
# homeassistant.components.ipma
|
# homeassistant.components.ipma
|
||||||
pyipma==3.0.6
|
pyipma==3.0.7
|
||||||
|
|
||||||
# homeassistant.components.ipp
|
# homeassistant.components.ipp
|
||||||
pyipp==0.14.4
|
pyipp==0.14.4
|
||||||
|
@ -27,6 +27,14 @@ class MockLocation:
|
|||||||
)
|
)
|
||||||
return RCM("some place", 3, (0, 0))
|
return RCM("some place", 3, (0, 0))
|
||||||
|
|
||||||
|
async def uv_risk(self, api):
|
||||||
|
"""Mock UV Index."""
|
||||||
|
UV = namedtuple(
|
||||||
|
"UV",
|
||||||
|
["idPeriodo", "intervaloHora", "data", "globalIdLocal", "iUv"],
|
||||||
|
)
|
||||||
|
return UV(0, "0", datetime.now(), 0, 5.7)
|
||||||
|
|
||||||
async def observation(self, api):
|
async def observation(self, api):
|
||||||
"""Mock Observation."""
|
"""Mock Observation."""
|
||||||
Observation = namedtuple(
|
Observation = namedtuple(
|
||||||
|
@ -10,10 +10,7 @@ from tests.common import MockConfigEntry
|
|||||||
async def test_ipma_fire_risk_create_sensors(hass):
|
async def test_ipma_fire_risk_create_sensors(hass):
|
||||||
"""Test creation of fire risk sensors."""
|
"""Test creation of fire risk sensors."""
|
||||||
|
|
||||||
with patch(
|
with patch("pyipma.location.Location.get", return_value=MockLocation()):
|
||||||
"pyipma.location.Location.get",
|
|
||||||
return_value=MockLocation(),
|
|
||||||
):
|
|
||||||
entry = MockConfigEntry(domain="ipma", data=ENTRY_CONFIG)
|
entry = MockConfigEntry(domain="ipma", data=ENTRY_CONFIG)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(entry.entry_id)
|
await hass.config_entries.async_setup(entry.entry_id)
|
||||||
@ -22,3 +19,17 @@ async def test_ipma_fire_risk_create_sensors(hass):
|
|||||||
state = hass.states.get("sensor.hometown_fire_risk")
|
state = hass.states.get("sensor.hometown_fire_risk")
|
||||||
|
|
||||||
assert state.state == "3"
|
assert state.state == "3"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_ipma_uv_index_create_sensors(hass):
|
||||||
|
"""Test creation of uv index sensors."""
|
||||||
|
|
||||||
|
with patch("pyipma.location.Location.get", return_value=MockLocation()):
|
||||||
|
entry = MockConfigEntry(domain="ipma", data=ENTRY_CONFIG)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
await hass.config_entries.async_setup(entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("sensor.hometown_uv_index")
|
||||||
|
|
||||||
|
assert state.state == "6"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user