Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for Nightscout sensors."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 from typing import Any
8 
9 from aiohttp import ClientError
10 from py_nightscout import Api as NightscoutAPI
11 
12 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
13 from homeassistant.config_entries import ConfigEntry
14 from homeassistant.const import ATTR_DATE, UnitOfBloodGlucoseConcentration
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .const import ATTR_DELTA, ATTR_DEVICE, ATTR_DIRECTION, DOMAIN
19 
20 SCAN_INTERVAL = timedelta(minutes=1)
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 DEFAULT_NAME = "Blood Glucose"
25 
26 
28  hass: HomeAssistant,
29  entry: ConfigEntry,
30  async_add_entities: AddEntitiesCallback,
31 ) -> None:
32  """Set up the Glucose Sensor."""
33  api = hass.data[DOMAIN][entry.entry_id]
34  async_add_entities([NightscoutSensor(api, "Blood Sugar", entry.unique_id)], True)
35 
36 
38  """Implementation of a Nightscout sensor."""
39 
40  _attr_device_class = SensorDeviceClass.BLOOD_GLUCOSE_CONCENTRATION
41  _attr_native_unit_of_measurement = (
42  UnitOfBloodGlucoseConcentration.MILLIGRAMS_PER_DECILITER
43  )
44  _attr_icon = "mdi:cloud-question"
45 
46  def __init__(self, api: NightscoutAPI, name: str, unique_id: str | None) -> None:
47  """Initialize the Nightscout sensor."""
48  self.apiapi = api
49  self._attr_unique_id_attr_unique_id = unique_id
50  self._attr_name_attr_name = name
51  self._attr_extra_state_attributes_attr_extra_state_attributes: dict[str, Any] = {}
52 
53  async def async_update(self) -> None:
54  """Fetch the latest data from Nightscout REST API and update the state."""
55  try:
56  values = await self.apiapi.get_sgvs()
57  except (ClientError, TimeoutError, OSError) as error:
58  _LOGGER.error("Error fetching data. Failed with %s", error)
59  self._attr_available_attr_available = False
60  return
61 
62  self._attr_available_attr_available = True
63  self._attr_extra_state_attributes_attr_extra_state_attributes = {}
64  self._attr_native_value_attr_native_value = None
65  if values:
66  value = values[0]
67  self._attr_extra_state_attributes_attr_extra_state_attributes = {
68  ATTR_DEVICE: value.device,
69  ATTR_DATE: value.date,
70  ATTR_DELTA: value.delta,
71  ATTR_DIRECTION: value.direction,
72  }
73  self._attr_native_value_attr_native_value = value.sgv
74  self._attr_icon_attr_icon_attr_icon = self._parse_icon_parse_icon(value.direction)
75  else:
76  self._attr_available_attr_available = False
77  _LOGGER.warning("Empty reply found when expecting JSON data")
78 
79  def _parse_icon(self, direction: str) -> str:
80  """Update the icon based on the direction attribute."""
81  switcher = {
82  "Flat": "mdi:arrow-right",
83  "SingleDown": "mdi:arrow-down",
84  "FortyFiveDown": "mdi:arrow-bottom-right",
85  "DoubleDown": "mdi:chevron-triple-down",
86  "SingleUp": "mdi:arrow-up",
87  "FortyFiveUp": "mdi:arrow-top-right",
88  "DoubleUp": "mdi:chevron-triple-up",
89  }
90  return switcher.get(direction, "mdi:cloud-question")
None __init__(self, NightscoutAPI api, str name, str|None unique_id)
Definition: sensor.py:46
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:31