Home Assistant Unofficial Reference 2024.12.1
const.py
Go to the documentation of this file.
1 """Constants for the Fronius integration."""
2 
3 from enum import StrEnum
4 from typing import Final, NamedTuple, TypedDict
5 
6 from homeassistant.helpers.device_registry import DeviceInfo
7 from homeassistant.helpers.typing import StateType
8 
9 DOMAIN: Final = "fronius"
10 
11 type SolarNetId = str
12 SOLAR_NET_DISCOVERY_NEW: Final = "fronius_discovery_new"
13 SOLAR_NET_ID_POWER_FLOW: SolarNetId = "power_flow"
14 SOLAR_NET_ID_SYSTEM: SolarNetId = "system"
15 SOLAR_NET_RESCAN_TIMER: Final = 60
16 
17 
18 class FroniusConfigEntryData(TypedDict):
19  """ConfigEntry for the Fronius integration."""
20 
21  host: str
22  is_logger: bool
23 
24 
25 class FroniusDeviceInfo(NamedTuple):
26  """Information about a Fronius inverter device."""
27 
28  device_info: DeviceInfo
29  solar_net_id: SolarNetId
30  unique_id: str
31 
32 
33 class InverterStatusCodeOption(StrEnum):
34  """Status codes for Fronius inverters."""
35 
36  # these are keys for state translations - so snake_case is used
37  STARTUP = "startup"
38  RUNNING = "running"
39  STANDBY = "standby"
40  BOOTLOADING = "bootloading"
41  ERROR = "error"
42  IDLE = "idle"
43  READY = "ready"
44  SLEEPING = "sleeping"
45  UNKNOWN = "unknown"
46  INVALID = "invalid"
47 
48 
49 _INVERTER_STATUS_CODES: Final[dict[int, InverterStatusCodeOption]] = {
50  0: InverterStatusCodeOption.STARTUP,
51  1: InverterStatusCodeOption.STARTUP,
52  2: InverterStatusCodeOption.STARTUP,
53  3: InverterStatusCodeOption.STARTUP,
54  4: InverterStatusCodeOption.STARTUP,
55  5: InverterStatusCodeOption.STARTUP,
56  6: InverterStatusCodeOption.STARTUP,
57  7: InverterStatusCodeOption.RUNNING,
58  8: InverterStatusCodeOption.STANDBY,
59  9: InverterStatusCodeOption.BOOTLOADING,
60  10: InverterStatusCodeOption.ERROR,
61  11: InverterStatusCodeOption.IDLE,
62  12: InverterStatusCodeOption.READY,
63  13: InverterStatusCodeOption.SLEEPING,
64  255: InverterStatusCodeOption.UNKNOWN,
65 }
66 
67 
68 def get_inverter_status_message(code: StateType) -> InverterStatusCodeOption:
69  """Return a status message for a given status code."""
70  return _INVERTER_STATUS_CODES.get(code, InverterStatusCodeOption.INVALID) # type: ignore[arg-type]
71 
72 
73 class MeterLocationCodeOption(StrEnum):
74  """Meter location codes for Fronius meters."""
75 
76  # these are keys for state translations - so snake_case is used
77  FEED_IN = "feed_in"
78  CONSUMPTION_PATH = "consumption_path"
79  GENERATOR = "external_generator"
80  EXT_BATTERY = "external_battery"
81  SUBLOAD = "subload"
82 
83 
84 def get_meter_location_description(code: StateType) -> MeterLocationCodeOption | None:
85  """Return a location_description for a given location code."""
86  match int(code): # type: ignore[arg-type]
87  case 0:
88  return MeterLocationCodeOption.FEED_IN
89  case 1:
90  return MeterLocationCodeOption.CONSUMPTION_PATH
91  case 3:
92  return MeterLocationCodeOption.GENERATOR
93  case 4:
94  return MeterLocationCodeOption.EXT_BATTERY
95  case _ as _code if 256 <= _code <= 511:
96  return MeterLocationCodeOption.SUBLOAD
97  return None
98 
99 
100 class OhmPilotStateCodeOption(StrEnum):
101  """OhmPilot state codes for Fronius inverters."""
102 
103  # these are keys for state translations - so snake_case is used
104  UP_AND_RUNNING = "up_and_running"
105  KEEP_MINIMUM_TEMPERATURE = "keep_minimum_temperature"
106  LEGIONELLA_PROTECTION = "legionella_protection"
107  CRITICAL_FAULT = "critical_fault"
108  FAULT = "fault"
109  BOOST_MODE = "boost_mode"
110 
111 
112 _OHMPILOT_STATE_CODES: Final[dict[int, OhmPilotStateCodeOption]] = {
113  0: OhmPilotStateCodeOption.UP_AND_RUNNING,
114  1: OhmPilotStateCodeOption.KEEP_MINIMUM_TEMPERATURE,
115  2: OhmPilotStateCodeOption.LEGIONELLA_PROTECTION,
116  3: OhmPilotStateCodeOption.CRITICAL_FAULT,
117  4: OhmPilotStateCodeOption.FAULT,
118  5: OhmPilotStateCodeOption.BOOST_MODE,
119 }
120 
121 
122 def get_ohmpilot_state_message(code: StateType) -> OhmPilotStateCodeOption | None:
123  """Return a status message for a given status code."""
124  return _OHMPILOT_STATE_CODES.get(code) # type: ignore[arg-type]
OhmPilotStateCodeOption|None get_ohmpilot_state_message(StateType code)
Definition: const.py:122
InverterStatusCodeOption get_inverter_status_message(StateType code)
Definition: const.py:68
MeterLocationCodeOption|None get_meter_location_description(StateType code)
Definition: const.py:84