Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor platform for Brottsplatskartan information."""
2 
3 from __future__ import annotations
4 
5 from collections import defaultdict
6 from datetime import timedelta
7 from typing import Literal
8 
9 from brottsplatskartan import ATTRIBUTION, BrottsplatsKartan
10 
11 from homeassistant.components.sensor import SensorEntity
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .const import CONF_APP_ID, CONF_AREA, DOMAIN, LOGGER
19 
20 SCAN_INTERVAL = timedelta(minutes=30)
21 
22 
24  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
25 ) -> None:
26  """Set up the Brottsplatskartan sensor entry."""
27 
28  area = entry.data.get(CONF_AREA)
29  latitude = entry.data.get(CONF_LATITUDE)
30  longitude = entry.data.get(CONF_LONGITUDE)
31  app = entry.data[CONF_APP_ID]
32  name = entry.title
33 
34  bpk = BrottsplatsKartan(
35  app=app, areas=[area] if area else None, latitude=latitude, longitude=longitude
36  )
37 
38  async_add_entities([BrottsplatskartanSensor(bpk, name, entry.entry_id, area)], True)
39 
40 
42  """Representation of a Brottsplatskartan Sensor."""
43 
44  _attr_attribution = ATTRIBUTION
45  _attr_has_entity_name = True
46  _attr_name = None
47 
48  def __init__(
49  self, bpk: BrottsplatsKartan, name: str, entry_id: str, area: str | None
50  ) -> None:
51  """Initialize the Brottsplatskartan sensor."""
52  self._brottsplatskartan_brottsplatskartan = bpk
53  self._area_area = area
54  self._attr_unique_id_attr_unique_id = entry_id
55  self._attr_device_info_attr_device_info = DeviceInfo(
56  entry_type=DeviceEntryType.SERVICE,
57  identifiers={(DOMAIN, entry_id)},
58  manufacturer="Brottsplatskartan",
59  name=name,
60  )
61 
62  def update(self) -> None:
63  """Update device state."""
64 
65  incident_counts: defaultdict[str, int] = defaultdict(int)
66  get_incidents: dict[str, list] | Literal[False] = (
67  self._brottsplatskartan_brottsplatskartan.get_incidents()
68  )
69 
70  if get_incidents is False:
71  LOGGER.debug("Problems fetching incidents")
72  return
73 
74  if self._area_area:
75  incidents = get_incidents.get(self._area_area) or []
76  else:
77  incidents = get_incidents.get("latlng") or []
78 
79  for incident in incidents:
80  if (incident_type := incident.get("title_type")) is not None:
81  incident_counts[incident_type] += 1
82 
83  self._attr_extra_state_attributes_attr_extra_state_attributes = incident_counts
84  self._attr_native_value_attr_native_value = len(incidents)
None __init__(self, BrottsplatsKartan bpk, str name, str entry_id, str|None area)
Definition: sensor.py:50
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:25