Home Assistant Unofficial Reference 2024.12.1
const.py
Go to the documentation of this file.
1 """Constants for the Shelly integration."""
2 
3 from __future__ import annotations
4 
5 from enum import StrEnum
6 from logging import Logger, getLogger
7 import re
8 from typing import Final
9 
10 from aioshelly.const import (
11  MODEL_BULB,
12  MODEL_BULB_RGBW,
13  MODEL_BUTTON1,
14  MODEL_BUTTON1_V2,
15  MODEL_DIMMER,
16  MODEL_DIMMER_2,
17  MODEL_DUO,
18  MODEL_DW,
19  MODEL_DW_2,
20  MODEL_GAS,
21  MODEL_HT,
22  MODEL_MOTION,
23  MODEL_MOTION_2,
24  MODEL_RGBW2,
25  MODEL_VALVE,
26  MODEL_VINTAGE_V2,
27  MODEL_WALL_DISPLAY,
28 )
29 
30 from homeassistant.components.number import NumberMode
31 
32 DOMAIN: Final = "shelly"
33 
34 LOGGER: Logger = getLogger(__package__)
35 
36 CONF_COAP_PORT: Final = "coap_port"
37 FIRMWARE_PATTERN: Final = re.compile(r"^(\d{8})")
38 
39 # max BLOCK light transition time in milliseconds (min=0)
40 BLOCK_MAX_TRANSITION_TIME_MS: Final = 5000
41 
42 # min RPC light transition time in seconds (max=10800, limited by light entity to 6553)
43 RPC_MIN_TRANSITION_TIME_SEC = 0.5
44 
45 RGBW_MODELS: Final = (
46  MODEL_BULB,
47  MODEL_RGBW2,
48 )
49 
50 MOTION_MODELS: Final = (
51  MODEL_MOTION,
52  MODEL_MOTION_2,
53 )
54 
55 MODELS_SUPPORTING_LIGHT_TRANSITION: Final = (
56  MODEL_DUO,
57  MODEL_BULB_RGBW,
58  MODEL_DIMMER,
59  MODEL_DIMMER_2,
60  MODEL_RGBW2,
61  MODEL_VINTAGE_V2,
62 )
63 
64 MODELS_SUPPORTING_LIGHT_EFFECTS: Final = (
65  MODEL_BULB,
66  MODEL_BULB_RGBW,
67  MODEL_RGBW2,
68 )
69 
70 MODELS_WITH_WRONG_SLEEP_PERIOD: Final = (
71  MODEL_DW,
72  MODEL_DW_2,
73  MODEL_HT,
74 )
75 
76 # Bulbs that support white & color modes
77 DUAL_MODE_LIGHT_MODELS: Final = (
78  MODEL_BULB,
79  MODEL_BULB_RGBW,
80 )
81 
82 # Refresh interval for REST sensors
83 REST_SENSORS_UPDATE_INTERVAL: Final = 60
84 
85 # Refresh interval for RPC polling sensors
86 RPC_SENSORS_POLLING_INTERVAL: Final = 60
87 
88 CONF_SLEEP_PERIOD: Final = "sleep_period"
89 
90 # Multiplier used to calculate the "update_interval" for shelly devices.
91 UPDATE_PERIOD_MULTIPLIER: Final = 2.2
92 
93 # Reconnect interval for GEN2 devices
94 RPC_RECONNECT_INTERVAL = 60
95 
96 # Shelly Air - Maximum work hours before lamp replacement
97 SHAIR_MAX_WORK_HOURS: Final = 9000
98 
99 # Map Shelly input events
100 INPUTS_EVENTS_DICT: Final = {
101  "S": "single",
102  "SS": "double",
103  "SSS": "triple",
104  "L": "long",
105  "SL": "single_long",
106  "LS": "long_single",
107 }
108 
109 # List of battery devices that maintain a permanent WiFi connection
110 BATTERY_DEVICES_WITH_PERMANENT_CONNECTION: Final = [
111  MODEL_MOTION,
112  MODEL_MOTION_2,
113  MODEL_VALVE,
114 ]
115 
116 # Button/Click events for Block & RPC devices
117 EVENT_SHELLY_CLICK: Final = "shelly.click"
118 
119 ATTR_CLICK_TYPE: Final = "click_type"
120 ATTR_CHANNEL: Final = "channel"
121 ATTR_DEVICE: Final = "device"
122 ATTR_GENERATION: Final = "generation"
123 CONF_SUBTYPE: Final = "subtype"
124 ATTR_BETA: Final = "beta"
125 CONF_OTA_BETA_CHANNEL: Final = "ota_beta_channel"
126 
127 BASIC_INPUTS_EVENTS_TYPES: Final = {"single", "long"}
128 
129 SHBTN_INPUTS_EVENTS_TYPES: Final = {"single", "double", "triple", "long"}
130 
131 RPC_INPUTS_EVENTS_TYPES: Final = {
132  "btn_down",
133  "btn_up",
134  "single_push",
135  "double_push",
136  "triple_push",
137  "long_push",
138 }
139 
140 BLOCK_INPUTS_EVENTS_TYPES: Final = {
141  "single",
142  "double",
143  "triple",
144  "long",
145  "single_long",
146  "long_single",
147 }
148 
149 SHIX3_1_INPUTS_EVENTS_TYPES = BLOCK_INPUTS_EVENTS_TYPES
150 
151 INPUTS_EVENTS_SUBTYPES: Final = {
152  "button": 1,
153  "button1": 1,
154  "button2": 2,
155  "button3": 3,
156  "button4": 4,
157 }
158 
159 SHBTN_MODELS: Final = [MODEL_BUTTON1, MODEL_BUTTON1_V2]
160 
161 STANDARD_RGB_EFFECTS: Final = {
162  0: "Off",
163  1: "Meteor Shower",
164  2: "Gradual Change",
165  3: "Flash",
166 }
167 
168 SHBLB_1_RGB_EFFECTS: Final = {
169  0: "Off",
170  1: "Meteor Shower",
171  2: "Gradual Change",
172  3: "Flash",
173  4: "Breath",
174  5: "On/Off Gradual",
175  6: "Red/Green Change",
176 }
177 
178 SHTRV_01_TEMPERATURE_SETTINGS: Final = {
179  "min": 4,
180  "max": 31,
181  "step": 0.5,
182  "default": 20.0,
183 }
184 RPC_THERMOSTAT_SETTINGS: Final = {
185  "min": 5,
186  "max": 35,
187  "step": 0.5,
188 }
189 
190 # Kelvin value for colorTemp
191 KELVIN_MAX_VALUE: Final = 6500
192 KELVIN_MIN_VALUE_WHITE: Final = 2700
193 KELVIN_MIN_VALUE_COLOR: Final = 3000
194 
195 # Sleep period
196 BLOCK_WRONG_SLEEP_PERIOD = 21600
197 BLOCK_EXPECTED_SLEEP_PERIOD = 43200
198 
199 UPTIME_DEVIATION: Final = 5
200 
201 # Time to wait before reloading entry upon device config change
202 ENTRY_RELOAD_COOLDOWN = 60
203 
204 SHELLY_GAS_MODELS = [MODEL_GAS]
205 
206 CONF_BLE_SCANNER_MODE = "ble_scanner_mode"
207 
208 
209 class BLEScannerMode(StrEnum):
210  """BLE scanner mode."""
211 
212  DISABLED = "disabled"
213  ACTIVE = "active"
214  PASSIVE = "passive"
215 
216 
217 MAX_PUSH_UPDATE_FAILURES = 5
218 PUSH_UPDATE_ISSUE_ID = "push_update_{unique}"
219 
220 NOT_CALIBRATED_ISSUE_ID = "not_calibrated_{unique}"
221 
222 FIRMWARE_UNSUPPORTED_ISSUE_ID = "firmware_unsupported_{unique}"
223 
224 GAS_VALVE_OPEN_STATES = ("opening", "opened")
225 
226 OTA_BEGIN = "ota_begin"
227 OTA_ERROR = "ota_error"
228 OTA_PROGRESS = "ota_progress"
229 OTA_SUCCESS = "ota_success"
230 
231 GEN1_RELEASE_URL = "https://shelly-api-docs.shelly.cloud/gen1/#changelog"
232 GEN2_RELEASE_URL = "https://shelly-api-docs.shelly.cloud/gen2/changelog/"
233 DEVICES_WITHOUT_FIRMWARE_CHANGELOG = (
234  MODEL_WALL_DISPLAY,
235  MODEL_MOTION,
236  MODEL_MOTION_2,
237  MODEL_VALVE,
238 )
239 
240 CONF_GEN = "gen"
241 
242 VIRTUAL_COMPONENTS_MAP = {
243  "binary_sensor": {"types": ["boolean"], "modes": ["label"]},
244  "number": {"types": ["number"], "modes": ["field", "slider"]},
245  "select": {"types": ["enum"], "modes": ["dropdown"]},
246  "sensor": {"types": ["enum", "number", "text"], "modes": ["label"]},
247  "switch": {"types": ["boolean"], "modes": ["toggle"]},
248  "text": {"types": ["text"], "modes": ["field"]},
249 }
250 
251 VIRTUAL_NUMBER_MODE_MAP = {
252  "field": NumberMode.BOX,
253  "slider": NumberMode.SLIDER,
254 }
255 
256 
257 API_WS_URL = "/api/shelly/ws"
258 
259 COMPONENT_ID_PATTERN = re.compile(r"[a-z\d]+:\d+")