Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for monitoring the contents of a folder."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import glob
7 import logging
8 import os
9 
10 import voluptuous as vol
11 
13  PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
14  SensorDeviceClass,
15  SensorEntity,
16 )
17 from homeassistant.const import UnitOfInformation
18 from homeassistant.core import HomeAssistant
20 from homeassistant.helpers.entity_platform import AddEntitiesCallback
21 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 CONF_FOLDER_PATHS = "folder"
26 CONF_FILTER = "filter"
27 DEFAULT_FILTER = "*"
28 
29 SCAN_INTERVAL = timedelta(minutes=1)
30 
31 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
32  {
33  vol.Required(CONF_FOLDER_PATHS): cv.isdir,
34  vol.Optional(CONF_FILTER, default=DEFAULT_FILTER): cv.string,
35  }
36 )
37 
38 
39 def get_files_list(folder_path: str, filter_term: str) -> list[str]:
40  """Return the list of files, applying filter."""
41  query = folder_path + filter_term
42  return glob.glob(query)
43 
44 
45 def get_size(files_list: list[str]) -> int:
46  """Return the sum of the size in bytes of files in the list."""
47  size_list = [os.stat(f).st_size for f in files_list if os.path.isfile(f)]
48  return sum(size_list)
49 
50 
52  hass: HomeAssistant,
53  config: ConfigType,
54  add_entities: AddEntitiesCallback,
55  discovery_info: DiscoveryInfoType | None = None,
56 ) -> None:
57  """Set up the folder sensor."""
58  path: str = config[CONF_FOLDER_PATHS]
59 
60  if not hass.config.is_allowed_path(path):
61  _LOGGER.error("Folder %s is not valid or allowed", path)
62  else:
63  folder = Folder(path, config[CONF_FILTER])
64  add_entities([folder], True)
65 
66 
68  """Representation of a folder."""
69 
70  _attr_device_class = SensorDeviceClass.DATA_SIZE
71  _attr_icon = "mdi:folder"
72  _attr_native_unit_of_measurement = UnitOfInformation.MEGABYTES
73 
74  def __init__(self, folder_path: str, filter_term: str) -> None:
75  """Initialize the data object."""
76  folder_path = os.path.join(folder_path, "") # If no trailing / add it
77  self._folder_path_folder_path = folder_path # Need to check its a valid path
78  self._filter_term_filter_term = filter_term
79  self._attr_name_attr_name = os.path.split(os.path.split(folder_path)[0])[1]
80 
81  def update(self) -> None:
82  """Update the sensor."""
83  files_list = get_files_list(self._folder_path_folder_path, self._filter_term_filter_term)
84  number_of_files = len(files_list)
85  size = get_size(files_list)
86 
87  self._attr_native_value_attr_native_value = round(size / 1e6, 2)
88  self._attr_extra_state_attributes_attr_extra_state_attributes = {
89  "path": self._folder_path_folder_path,
90  "filter": self._filter_term_filter_term,
91  "number_of_files": number_of_files,
92  "bytes": size,
93  "file_list": files_list,
94  }
None __init__(self, str folder_path, str filter_term)
Definition: sensor.py:74
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: sensor.py:56
int get_size(list[str] files_list)
Definition: sensor.py:45
list[str] get_files_list(str folder_path, str filter_term)
Definition: sensor.py:39
def add_entities(account, async_add_entities, tracked)
Definition: sensor.py:40