Home Assistant Unofficial Reference 2024.12.1
base.py
Go to the documentation of this file.
1 """Base class for fritzbox_callmonitor entities."""
2 
3 from __future__ import annotations
4 
5 from contextlib import suppress
6 from datetime import timedelta
7 import logging
8 import re
9 
10 from fritzconnection.lib.fritzphonebook import FritzPhonebook
11 
12 from homeassistant.util import Throttle
13 
14 from .const import REGEX_NUMBER, UNKNOWN_NAME
15 
16 _LOGGER = logging.getLogger(__name__)
17 
18 # Return cached results if phonebook was downloaded less then this time ago.
19 MIN_TIME_PHONEBOOK_UPDATE = timedelta(hours=6)
20 
21 
23  """Connects to a FritzBox router and downloads its phone book."""
24 
25  fph: FritzPhonebook
26  phonebook_dict: dict[str, list[str]]
27  number_dict: dict[str, str]
28 
29  def __init__(
30  self,
31  host: str,
32  username: str,
33  password: str,
34  phonebook_id: int | None = None,
35  prefixes: list[str] | None = None,
36  ) -> None:
37  """Initialize the class."""
38  self.hosthost = host
39  self.usernameusername = username
40  self.passwordpassword = password
41  self.phonebook_idphonebook_id = phonebook_id
42  self.prefixesprefixes = prefixes
43 
44  def init_phonebook(self) -> None:
45  """Establish a connection to the FRITZ!Box and check if phonebook_id is valid."""
46  self.fphfph = FritzPhonebook(
47  address=self.hosthost,
48  user=self.usernameusername,
49  password=self.passwordpassword,
50  )
51  self.update_phonebookupdate_phonebook()
52 
53  @Throttle(MIN_TIME_PHONEBOOK_UPDATE)
54  def update_phonebook(self) -> None:
55  """Update the phone book dictionary."""
56  if self.phonebook_idphonebook_id is None:
57  return
58 
59  self.phonebook_dictphonebook_dict = self.fphfph.get_all_names(self.phonebook_idphonebook_id)
60  self.number_dictnumber_dict = {
61  re.sub(REGEX_NUMBER, "", nr): name
62  for name, nrs in self.phonebook_dictphonebook_dict.items()
63  for nr in nrs
64  }
65  _LOGGER.debug("Fritz!Box phone book successfully updated")
66 
67  def get_phonebook_ids(self) -> list[int]:
68  """Return list of phonebook ids."""
69  return self.fphfph.phonebook_ids # type: ignore[no-any-return]
70 
71  def get_name(self, number: str) -> str:
72  """Return a name for a given phone number."""
73  number = re.sub(REGEX_NUMBER, "", str(number))
74 
75  with suppress(KeyError):
76  return self.number_dictnumber_dict[number]
77 
78  if not self.prefixesprefixes:
79  return UNKNOWN_NAME
80 
81  for prefix in self.prefixesprefixes:
82  with suppress(KeyError):
83  return self.number_dictnumber_dict[prefix + number]
84  with suppress(KeyError):
85  return self.number_dictnumber_dict[prefix + number.lstrip("0")]
86 
87  return UNKNOWN_NAME
None __init__(self, str host, str username, str password, int|None phonebook_id=None, list[str]|None prefixes=None)
Definition: base.py:36