1 """Constants for the ISY Platform."""
5 from pyisy.constants
import PROP_ON_LEVEL, PROP_RAMP_RATE
20 CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
21 CONCENTRATION_PARTS_PER_MILLION,
27 REVOLUTIONS_PER_MINUTE,
30 SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
42 UnitOfElectricCurrent,
43 UnitOfElectricPotential,
61 _LOGGER = logging.getLogger(__package__)
65 MANUFACTURER =
"Universal Devices, Inc"
67 CONF_NETWORK =
"network"
68 CONF_IGNORE_STRING =
"ignore_string"
69 CONF_SENSOR_STRING =
"sensor_string"
70 CONF_VAR_SENSOR_STRING =
"variable_sensor_string"
72 CONF_RESTORE_LIGHT_STATE =
"restore_light_state"
74 DEFAULT_IGNORE_STRING =
"{IGNORE ME}"
75 DEFAULT_SENSOR_STRING =
"sensor"
76 DEFAULT_RESTORE_LIGHT_STATE =
False
77 DEFAULT_TLS_VERSION = 1.1
78 DEFAULT_PROGRAM_STRING =
"HA."
79 DEFAULT_VAR_SENSOR_STRING =
"HA."
81 KEY_ACTIONS =
"actions"
85 Platform.BINARY_SENSOR,
94 NODE_AUX_PROP_PLATFORMS = [
100 PROGRAM_PLATFORMS = [
101 Platform.BINARY_SENSOR,
107 ROOT_NODE_PLATFORMS = [Platform.BUTTON]
108 VARIABLE_PLATFORMS = [Platform.NUMBER, Platform.SENSOR]
113 *NODE_AUX_PROP_PLATFORMS,
115 *ROOT_NODE_PLATFORMS,
119 SUPPORTED_BIN_SENS_CLASSES = [
"moisture",
"opening",
"motion",
"climate"]
123 ISY_GROUP_PLATFORM = Platform.SWITCH
125 ISY_CONF_UUID =
"uuid"
126 ISY_CONF_NAME =
"name"
127 ISY_CONF_MODEL =
"model"
128 ISY_CONF_FIRMWARE =
"firmware"
130 ISY_CONN_PORT =
"port"
131 ISY_CONN_ADDRESS =
"addr"
135 FILTER_STATES =
"states"
136 FILTER_NODE_DEF_ID =
"node_def_id"
137 FILTER_INSTEON_TYPE =
"insteon_type"
138 FILTER_ZWAVE_CAT =
"zwave_cat"
141 SUBNODE_CLIMATE_COOL = 2
142 SUBNODE_CLIMATE_HEAT = 3
143 SUBNODE_DUSK_DAWN = 2
144 SUBNODE_EZIO2X4_SENSORS = [9, 10, 11, 12]
145 SUBNODE_FANLINC_LIGHT = 1
146 SUBNODE_HEARTBEAT = 4
147 SUBNODE_IOLINC_RELAY = 2
148 SUBNODE_LOW_BATTERY = 3
149 SUBNODE_MOTION_DISABLED = (13, 19)
151 SUBNODE_TAMPER = (10, 16)
154 TYPE_CATEGORY_CONTROLLERS =
"0."
155 TYPE_CATEGORY_DIMMABLE =
"1."
156 TYPE_CATEGORY_SWITCHED =
"2."
157 TYPE_CATEGORY_IRRIGATION =
"4."
158 TYPE_CATEGORY_CLIMATE =
"5."
159 TYPE_CATEGORY_POOL_CTL =
"6."
160 TYPE_CATEGORY_SENSOR_ACTUATORS =
"7."
161 TYPE_CATEGORY_ENERGY_MGMT =
"9."
162 TYPE_CATEGORY_COVER =
"14."
163 TYPE_CATEGORY_LOCK =
"15."
164 TYPE_CATEGORY_SAFETY =
"16."
165 TYPE_CATEGORY_X10 =
"113."
167 TYPE_EZIO2X4 =
"7.3.255."
168 TYPE_INSTEON_MOTION = (
"16.1.",
"16.22.")
171 UDN_UUID_PREFIX =
"uuid:"
172 ISY_URL_POSTFIX =
"/desc"
173 EVENTS_SUFFIX =
"_ISYSUB"
176 UOM_ISYV4_DEGREES =
"degrees"
177 UOM_ISYV4_NONE =
"n/a"
180 UOM_ISY_FAHRENHEIT = 2
182 UOM_8_BIT_RANGE =
"100"
184 UOM_DOUBLE_TEMP =
"101"
185 UOM_HVAC_ACTIONS =
"66"
186 UOM_HVAC_MODE_GENERIC =
"67"
187 UOM_HVAC_MODE_INSTEON =
"98"
191 UOM_PERCENTAGE =
"51"
197 NODE_FILTERS: dict[Platform, dict[str, list[str]]] = {
198 Platform.BINARY_SENSOR: {
199 FILTER_UOM: [UOM_ON_OFF],
201 FILTER_NODE_DEF_ID: [
211 FILTER_INSTEON_TYPE: [
214 TYPE_CATEGORY_SAFETY,
216 FILTER_ZWAVE_CAT: ([
"104",
"112",
"138", *map(str, range(148, 180))]),
224 *map(str, range(3, 11)),
225 *map(str, range(12, 51)),
226 *map(str, range(52, 66)),
227 *map(str, range(69, 78)),
229 *map(str, range(82, 97)),
233 FILTER_NODE_DEF_ID: [
241 FILTER_INSTEON_TYPE: [
"0.16.",
"0.17.",
"0.18.",
"9.0.",
"9.7."],
242 FILTER_ZWAVE_CAT: ([
"118",
"143", *map(str, range(180, 186))]),
246 FILTER_STATES: [
"locked",
"unlocked"],
247 FILTER_NODE_DEF_ID: [
"DoorLock"],
248 FILTER_INSTEON_TYPE: [TYPE_CATEGORY_LOCK,
"4.64."],
249 FILTER_ZWAVE_CAT: [
"111"],
253 FILTER_STATES: [
"off",
"low",
"med",
"high"],
254 FILTER_NODE_DEF_ID: [
"FanLincMotor"],
255 FILTER_INSTEON_TYPE: [
"1.46."],
256 FILTER_ZWAVE_CAT: [],
259 FILTER_UOM: [UOM_BARRIER],
260 FILTER_STATES: [
"open",
"closed",
"closing",
"opening",
"stopped"],
261 FILTER_NODE_DEF_ID: [
"DimmerMotorSwitch_ADV"],
262 FILTER_INSTEON_TYPE: [TYPE_CATEGORY_COVER],
263 FILTER_ZWAVE_CAT: [
"106",
"107"],
267 FILTER_STATES: [
"on",
"off",
"%"],
268 FILTER_NODE_DEF_ID: [
269 "BallastRelayLampSwitch",
270 "BallastRelayLampSwitch_ADV",
273 "DimmerLampSwitch_ADV",
275 "DimmerSwitchOnly_ADV",
279 FILTER_INSTEON_TYPE: [TYPE_CATEGORY_DIMMABLE],
280 FILTER_ZWAVE_CAT: [
"109",
"119"],
284 FILTER_STATES: [
"on",
"off"],
285 FILTER_NODE_DEF_ID: [
288 "AlertModuleSiren_ADV",
296 "RelayLampSwitch_ADV",
297 "RelaySwitchOnlyPlusQuery",
298 "RelaySwitchOnlyPlusQuery_ADV",
303 FILTER_INSTEON_TYPE: [
304 TYPE_CATEGORY_SWITCHED,
310 FILTER_ZWAVE_CAT: [
"121",
"122",
"123",
"137",
"141",
"147"],
313 FILTER_UOM: [UOM_ON_OFF],
314 FILTER_STATES: [
"heating",
"cooling",
"idle",
"fan_only",
"off"],
315 FILTER_NODE_DEF_ID: [
"TempLinc",
"Thermostat"],
316 FILTER_INSTEON_TYPE: [
"4.8", TYPE_CATEGORY_CLIMATE],
317 FILTER_ZWAVE_CAT: [
"140"],
320 NODE_AUX_FILTERS: dict[str, Platform] = {
321 PROP_ON_LEVEL: Platform.NUMBER,
322 PROP_RAMP_RATE: Platform.SELECT,
325 UOM_FRIENDLY_NAME = {
326 "1": UnitOfElectricCurrent.AMPERE,
328 "3": UnitOfPower.BTU_PER_HOUR,
329 "4": UnitOfTemperature.CELSIUS,
330 "5": UnitOfLength.CENTIMETERS,
331 "6": UnitOfVolume.CUBIC_FEET,
332 "7": UnitOfVolumeFlowRate.CUBIC_FEET_PER_MINUTE,
333 "8": UnitOfVolume.CUBIC_METERS,
334 "9": UnitOfTime.DAYS,
335 "10": UnitOfTime.DAYS,
336 "12": UnitOfSoundPressure.DECIBEL,
337 "13": UnitOfSoundPressure.WEIGHTED_DECIBEL_A,
339 "16":
"macroseismic",
340 "17": UnitOfTemperature.FAHRENHEIT,
341 "18": UnitOfLength.FEET,
342 "19": UnitOfTime.HOURS,
343 "20": UnitOfTime.HOURS,
346 "23": UnitOfPressure.INHG,
347 "24": UnitOfVolumetricFlux.INCHES_PER_HOUR,
348 UOM_INDEX: UOM_INDEX,
349 "26": UnitOfTemperature.KELVIN,
351 "28": UnitOfMass.KILOGRAMS,
353 "30": UnitOfPower.KILO_WATT,
354 "31": UnitOfPressure.KPA,
355 "32": UnitOfSpeed.KILOMETERS_PER_HOUR,
356 "33": UnitOfEnergy.KILO_WATT_HOUR,
358 "35": UnitOfVolume.LITERS,
361 "38": UnitOfLength.METERS,
362 "39": UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
363 "40": UnitOfSpeed.METERS_PER_SECOND,
364 "41": UnitOfElectricCurrent.MILLIAMPERE,
365 "42": UnitOfTime.MILLISECONDS,
366 "43": UnitOfElectricPotential.MILLIVOLT,
367 "44": UnitOfTime.MINUTES,
368 "45": UnitOfTime.MINUTES,
369 "46": UnitOfVolumetricFlux.MILLIMETERS_PER_HOUR,
370 "47": UnitOfTime.MONTHS,
371 "48": UnitOfSpeed.MILES_PER_HOUR,
372 "49": UnitOfSpeed.METERS_PER_SECOND,
374 UOM_PERCENTAGE: PERCENTAGE,
375 "52": UnitOfMass.POUNDS,
377 "54": CONCENTRATION_PARTS_PER_MILLION,
379 "57": UnitOfTime.SECONDS,
380 "58": UnitOfTime.SECONDS,
388 "69": UnitOfVolume.GALLONS,
390 "72": UnitOfElectricPotential.VOLT,
391 "73": UnitOfPower.WATT,
392 "74": UnitOfIrradiance.WATTS_PER_SQUARE_METER,
395 "77": UnitOfTime.YEARS,
396 "82": UnitOfLength.MILLIMETERS,
397 "83": UnitOfLength.KILOMETERS,
400 "87": f
"{UnitOfVolume.CUBIC_METERS}/{UnitOfVolume.CUBIC_METERS}",
401 "88":
"Water activity",
402 "89": REVOLUTIONS_PER_MINUTE,
403 "90": UnitOfFrequency.HERTZ,
405 "92": f
"{DEGREE} South",
407 UOM_DOUBLE_TEMP: UOM_DOUBLE_TEMP,
409 "103": CURRENCY_DOLLAR,
410 "104": CURRENCY_CENT,
411 "105": UnitOfLength.INCHES,
412 "106": UnitOfVolumetricFlux.MILLIMETERS_PER_DAY,
421 "116": UnitOfLength.MILES,
422 "117": UnitOfPressure.MBAR,
423 "118": UnitOfPressure.HPA,
424 "119": UnitOfEnergy.WATT_HOUR,
425 "120": UnitOfVolumetricFlux.INCHES_PER_DAY,
426 "122": CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
427 "123": f
"bq/{UnitOfVolume.CUBIC_METERS}",
428 "124": f
"pCi/{UnitOfVolume.LITERS}",
431 "127": UnitOfPressure.MMHG,
434 "130": f
"{UnitOfVolume.LITERS}/{UnitOfTime.HOURS}",
435 "131": SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
437 "133": UnitOfFrequency.KILOHERTZ,
438 "134": f
"{UnitOfLength.METERS}/{UnitOfTime.SECONDS}²",
439 "135": UnitOfApparentPower.VOLT_AMPERE,
440 "136": UnitOfReactivePower.VOLT_AMPERE_REACTIVE,
442 "138": UnitOfPressure.PSI,
444 "140": f
"{UnitOfMass.MILLIGRAMS}/{UnitOfVolume.LITERS}",
446 "142": f
"{UnitOfVolume.GALLONS}/{UnitOfTime.SECONDS}",
453 0: LockState.UNLOCKED,
454 100: LockState.LOCKED,
459 1:
"master code changed",
460 2:
"tamper code entry limit",
461 3:
"escutcheon removed",
462 4:
"key/manually locked",
463 5:
"locked by touch",
464 6:
"key/manually unlocked",
465 7:
"remote locking jammed bolt",
466 8:
"remotely locked",
467 9:
"remotely unlocked",
468 10:
"deadbolt jammed",
469 11:
"battery too low to operate",
470 12:
"critical low battery",
472 14:
"automatically locked",
473 15:
"automatic locking jammed bolt",
474 16:
"remotely power cycled",
475 17:
"lock handling complete",
479 22:
"jammed bolt by locking with keypad",
480 23:
"locked by keypad",
481 24:
"unlocked by keypad",
482 25:
"keypad attempt outside schedule",
483 26:
"hardware failure",
487 0: HVACAction.IDLE.value,
488 1: HVACAction.HEATING.value,
489 2: HVACAction.COOLING.value,
490 3: HVACAction.FAN.value,
491 4: HVACAction.HEATING.value,
492 5: HVACAction.COOLING.value,
494 6: HVACAction.IDLE.value,
495 7: HVACAction.HEATING.value,
496 8: HVACAction.HEATING.value,
497 9: HVACAction.COOLING.value,
498 10: HVACAction.HEATING.value,
499 11: HVACAction.HEATING.value,
501 UOM_HVAC_MODE_GENERIC: {
502 0: HVACMode.OFF.value,
503 1: HVACMode.HEAT.value,
504 2: HVACMode.COOL.value,
505 3: HVACMode.AUTO.value,
508 6: HVACMode.FAN_ONLY.value,
510 8: HVACMode.DRY.value,
512 10:
"auto changeover",
513 11:
"energy save heat",
514 12:
"energy save cool",
516 14: HVACMode.AUTO.value,
517 15: HVACMode.AUTO.value,
518 16: HVACMode.AUTO.value,
528 7:
"humidity circulation",
530 "78": {0: STATE_OFF, 100: STATE_ON},
531 "79": {0: STATE_OPEN, 100: STATE_CLOSED},
538 5:
"humidity circulation",
539 6:
"right/left circulation",
540 7:
"up/down circulation",
541 8:
"quiet circulation",
543 "84": {0: SERVICE_LOCK, 1: SERVICE_UNLOCK},
546 2:
"ac mains disconnected",
547 3:
"ac mains reconnected",
548 4:
"surge detection",
549 5:
"volt drop or drift",
550 6:
"over current detected",
551 7:
"over voltage detected",
552 8:
"over load detected",
554 10:
"replace battery soon",
555 11:
"replace battery now",
556 12:
"battery is charging",
557 13:
"battery is fully charged",
558 14:
"charge battery soon",
559 15:
"charge battery now",
562 1:
"program started",
563 2:
"program in progress",
564 3:
"program completed",
565 4:
"replace main filter",
566 5:
"failure to set target temperature",
567 6:
"supplying water",
568 7:
"water supply failure",
570 9:
"boiling failure",
572 11:
"washing failure",
574 13:
"rinsing failure",
576 15:
"draining failure",
578 17:
"spinning failure",
580 19:
"drying failure",
582 21:
"compressor failure",
588 4:
"posture changed",
589 5:
"sitting on edge of bed",
593 2:
"slightly polluted",
594 3:
"moderately polluted",
595 4:
"highly polluted",
605 b: f
"{b} %" for a, b
in enumerate(
list(range(1, 100)))
608 UOM_HVAC_MODE_INSTEON: {
609 0: HVACMode.OFF.value,
610 1: HVACMode.HEAT.value,
611 2: HVACMode.COOL.value,
612 3: HVACMode.HEAT_COOL.value,
613 4: HVACMode.FAN_ONLY.value,
614 5: HVACMode.AUTO.value,
615 6: HVACMode.AUTO.value,
616 7: HVACMode.AUTO.value,
618 UOM_FAN_MODES: {7: FAN_ON, 8: FAN_AUTO},
627 7:
"triple press on",
628 8:
"triple press off",
647 HVACMode.HEAT:
"heat",
648 HVACMode.COOL:
"cool",
649 HVACMode.HEAT_COOL:
"auto",
650 HVACMode.FAN_ONLY:
"fan_only",
651 HVACMode.AUTO:
"program_auto",
654 HA_FAN_TO_ISY = {FAN_ON:
"on", FAN_AUTO:
"auto"}
656 BINARY_SENSOR_DEVICE_TYPES_ISY = {
657 BinarySensorDeviceClass.MOISTURE: [
"16.8.",
"16.13.",
"16.14."],
658 BinarySensorDeviceClass.OPENING: [
667 BinarySensorDeviceClass.MOTION: [
"16.1.",
"16.4.",
"16.5.",
"16.3.",
"16.22."],
670 BINARY_SENSOR_DEVICE_TYPES_ZWAVE = {
671 BinarySensorDeviceClass.SAFETY: [
"137",
"172",
"176",
"177",
"178"],
672 BinarySensorDeviceClass.SMOKE: [
"138",
"156"],
673 BinarySensorDeviceClass.PROBLEM: [
"148",
"149",
"157",
"158",
"164",
"174",
"175"],
674 BinarySensorDeviceClass.GAS: [
"150",
"151"],
675 BinarySensorDeviceClass.SOUND: [
"153"],
676 BinarySensorDeviceClass.COLD: [
"152",
"168"],
677 BinarySensorDeviceClass.HEAT: [
"154",
"166",
"167"],
678 BinarySensorDeviceClass.MOISTURE: [
"159",
"169"],
679 BinarySensorDeviceClass.DOOR: [
"160"],
680 BinarySensorDeviceClass.BATTERY: [
"162"],
681 BinarySensorDeviceClass.MOTION: [
"155"],
682 BinarySensorDeviceClass.VIBRATION: [
"173"],
688 SCHEME_HTTPS =
"https"