Home Assistant Unofficial Reference 2024.12.1
utils.py
Go to the documentation of this file.
1 """Helper functions for the SIA integration."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime, timedelta
6 from typing import Any
7 
8 from pysiaalarm import SIAEvent
9 from pysiaalarm.utils import MessageTypes
10 
11 from homeassistant.util.dt import utcnow
12 
13 from .const import (
14  ATTR_CODE,
15  ATTR_ID,
16  ATTR_MESSAGE,
17  ATTR_TIMESTAMP,
18  ATTR_ZONE,
19  KEY_ALARM,
20  SIA_HUB_ZONE,
21 )
22 
23 PING_INTERVAL_MARGIN = 30
24 
25 
27  entry_id: str,
28  port: int,
29  account: str,
30  zone: int,
31  entity_key: str,
32 ) -> tuple[str, str]:
33  """Return the unique_id and name for an entity."""
34  return (
35  (
36  f"{entry_id}_{account}_{zone}"
37  if entity_key == KEY_ALARM
38  else f"{entry_id}_{account}_{zone}_{entity_key}"
39  ),
40  (
41  f"{port} - {account} - {entity_key}"
42  if zone == SIA_HUB_ZONE
43  else f"{port} - {account} - zone {zone} - {entity_key}"
44  ),
45  )
46 
47 
48 def get_unavailability_interval(ping: int) -> float:
49  """Return the interval to the next unavailability check."""
50  return timedelta(minutes=ping, seconds=PING_INTERVAL_MARGIN).total_seconds()
51 
52 
53 def get_attr_from_sia_event(event: SIAEvent) -> dict[str, Any]:
54  """Create the attributes dict from a SIAEvent."""
55  timestamp = event.timestamp if event.timestamp else utcnow()
56  return {
57  ATTR_ZONE: event.ri,
58  ATTR_CODE: event.code,
59  ATTR_MESSAGE: event.message,
60  ATTR_ID: event.id,
61  ATTR_TIMESTAMP: timestamp.isoformat()
62  if isinstance(timestamp, datetime)
63  else timestamp,
64  }
65 
66 
67 def get_event_data_from_sia_event(event: SIAEvent) -> dict[str, Any]:
68  """Create a dict from the SIA Event for the HA Event."""
69  return {
70  "message_type": event.message_type.value
71  if isinstance(event.message_type, MessageTypes)
72  else event.message_type,
73  "receiver": event.receiver,
74  "line": event.line,
75  "account": event.account,
76  "sequence": event.sequence,
77  "content": event.content,
78  "ti": event.ti,
79  "id": event.id,
80  "ri": event.ri,
81  "code": event.code,
82  "message": event.message,
83  "x_data": event.x_data,
84  "timestamp": event.timestamp.isoformat()
85  if isinstance(event.timestamp, datetime)
86  else event.timestamp,
87  "event_qualifier": event.event_qualifier,
88  "event_type": event.event_type,
89  "partition": event.partition,
90  "extended_data": [
91  {
92  "identifier": xd.identifier,
93  "name": xd.name,
94  "description": xd.description,
95  "length": xd.length,
96  "characters": xd.characters,
97  "value": xd.value,
98  }
99  for xd in event.extended_data
100  ]
101  if event.extended_data is not None
102  else None,
103  "sia_code": {
104  "code": event.sia_code.code,
105  "type": event.sia_code.type,
106  "description": event.sia_code.description,
107  "concerns": event.sia_code.concerns,
108  }
109  if event.sia_code is not None
110  else None,
111  }
dict[str, Any] get_attr_from_sia_event(SIAEvent event)
Definition: utils.py:53
tuple[str, str] get_unique_id_and_name(str entry_id, int port, str account, int zone, str entity_key)
Definition: utils.py:32
dict[str, Any] get_event_data_from_sia_event(SIAEvent event)
Definition: utils.py:67
float get_unavailability_interval(int ping)
Definition: utils.py:48