Home Assistant Unofficial Reference 2024.12.1
util.py
Go to the documentation of this file.
1 """Support for displaying collected data over SNMP."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from pysnmp.hlapi.asyncio import (
8  CommunityData,
9  ContextData,
10  ObjectIdentity,
11  ObjectType,
12  SnmpEngine,
13  Udp6TransportTarget,
14  UdpTransportTarget,
15  UsmUserData,
16 )
17 from pysnmp.hlapi.asyncio.cmdgen import lcd, vbProcessor
18 from pysnmp.smi.builder import MibBuilder
19 
20 from homeassistant.const import EVENT_HOMEASSISTANT_STOP
21 from homeassistant.core import Event, HomeAssistant, callback
22 from homeassistant.helpers.singleton import singleton
23 
24 DATA_SNMP_ENGINE = "snmp_engine"
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 type CommandArgsType = tuple[
29  SnmpEngine,
30  UsmUserData | CommunityData,
31  UdpTransportTarget | Udp6TransportTarget,
32  ContextData,
33 ]
34 
35 
36 type RequestArgsType = tuple[
37  SnmpEngine,
38  UsmUserData | CommunityData,
39  UdpTransportTarget | Udp6TransportTarget,
40  ContextData,
41  ObjectType,
42 ]
43 
44 
46  hass: HomeAssistant,
47  auth_data: UsmUserData | CommunityData,
48  target: UdpTransportTarget | Udp6TransportTarget,
49 ) -> CommandArgsType:
50  """Create command arguments.
51 
52  The ObjectType needs to be created dynamically by the caller.
53  """
54  engine = await async_get_snmp_engine(hass)
55  return (engine, auth_data, target, ContextData())
56 
57 
59  hass: HomeAssistant,
60  auth_data: UsmUserData | CommunityData,
61  target: UdpTransportTarget | Udp6TransportTarget,
62  object_id: str,
63 ) -> RequestArgsType:
64  """Create request arguments.
65 
66  The same ObjectType is used for all requests.
67  """
68  engine, auth_data, target, context_data = await async_create_command_cmd_args(
69  hass, auth_data, target
70  )
71  object_type = ObjectType(ObjectIdentity(object_id))
72  return (engine, auth_data, target, context_data, object_type)
73 
74 
75 @singleton(DATA_SNMP_ENGINE)
76 async def async_get_snmp_engine(hass: HomeAssistant) -> SnmpEngine:
77  """Get the SNMP engine."""
78  engine = await hass.async_add_executor_job(_get_snmp_engine)
79 
80  @callback
81  def _async_shutdown_listener(ev: Event) -> None:
82  _LOGGER.debug("Unconfiguring SNMP engine")
83  lcd.unconfigure(engine, None)
84 
85  hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_shutdown_listener)
86  return engine
87 
88 
89 def _get_snmp_engine() -> SnmpEngine:
90  """Return a cached instance of SnmpEngine."""
91  engine = SnmpEngine()
92  mib_controller = vbProcessor.getMibViewController(engine)
93  # Actually load the MIBs from disk so we do
94  # not do it in the event loop
95  builder: MibBuilder = mib_controller.mibBuilder
96  if "PYSNMP-MIB" not in builder.mibSymbols:
97  builder.loadModules()
98  return engine
SnmpEngine async_get_snmp_engine(HomeAssistant hass)
Definition: util.py:76
SnmpEngine _get_snmp_engine()
Definition: util.py:89
RequestArgsType async_create_request_cmd_args(HomeAssistant hass, UsmUserData|CommunityData auth_data, UdpTransportTarget|Udp6TransportTarget target, str object_id)
Definition: util.py:63
CommandArgsType async_create_command_cmd_args(HomeAssistant hass, UsmUserData|CommunityData auth_data, UdpTransportTarget|Udp6TransportTarget target)
Definition: util.py:49