Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for displaying the number of result on Shodan.io."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 
8 import shodan
9 import voluptuous as vol
10 
12  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
13  SensorEntity,
14 )
15 from homeassistant.const import CONF_API_KEY, CONF_NAME
16 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
20 
21 _LOGGER = logging.getLogger(__name__)
22 
23 CONF_QUERY = "query"
24 
25 DEFAULT_NAME = "Shodan Sensor"
26 
27 SCAN_INTERVAL = timedelta(minutes=15)
28 
29 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
30  {
31  vol.Required(CONF_API_KEY): cv.string,
32  vol.Required(CONF_QUERY): cv.string,
33  vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
34  }
35 )
36 
37 
39  hass: HomeAssistant,
40  config: ConfigType,
41  add_entities: AddEntitiesCallback,
42  discovery_info: DiscoveryInfoType | None = None,
43 ) -> None:
44  """Set up the Shodan sensor."""
45  api_key = config[CONF_API_KEY]
46  name = config[CONF_NAME]
47  query = config[CONF_QUERY]
48 
49  data = ShodanData(shodan.Shodan(api_key), query)
50  try:
51  data.update()
52  except shodan.exception.APIError as error:
53  _LOGGER.warning("Unable to connect to Shodan.io: %s", error)
54  return
55 
56  add_entities([ShodanSensor(data, name)], True)
57 
58 
60  """Representation of the Shodan sensor."""
61 
62  _attr_attribution = "Data provided by Shodan"
63  _attr_icon = "mdi:tooltip-text"
64  _attr_native_unit_of_measurement = "Hits"
65 
66  def __init__(self, data: ShodanData, name: str) -> None:
67  """Initialize the Shodan sensor."""
68  self.datadata = data
69  self._attr_name_attr_name = name
70 
71  def update(self) -> None:
72  """Get the latest data and updates the states."""
73  data = self.datadata.update()
74  self._attr_native_value_attr_native_value = data["total"]
75 
76 
77 class ShodanData:
78  """Get the latest data and update the states."""
79 
80  def __init__(self, api: shodan.Shodan, query: str) -> None:
81  """Initialize the data object."""
82  self._api_api = api
83  self._query_query = query
84 
85  def update(self):
86  """Get the latest data from shodan.io."""
87  return self._api_api.count(self._query_query)
None __init__(self, shodan.Shodan api, str query)
Definition: sensor.py:80
None __init__(self, ShodanData data, str name)
Definition: sensor.py:66
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:43