1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
"""
Extends the AlarmDecoder class to include helper methods for HomeAssistant
"""
import asyncio
from alarmdecoder.decoder import AlarmDecoder
from alarmdecoder.panels import DSC, ADEMCO as HONEYWELL
ARM_HOME = "arm_home"
ARM_AWAY = "arm_away"
ARM_NIGHT = "arm_night"
class AdExt(AlarmDecoder):
"""
Extended AlarmDecoder class
"""
def __init__(self, device, ignore_message_states=False, ignore_lrr_states=True):
super().__init__(device, ignore_message_states, ignore_lrr_states)
self._event = asyncio.Event()
def _handle_version(self, data):
super()._handle_version(data)
self._event.set()
async def is_init(self):
return (await self._event.wait())
def _get_arm_sequence(
self, arm_mode, code, code_arm_required, auto_bypass, alt_night_mode=False,
):
"""
Returns arming sequences based on panel brand & config settings
"""
arming_sequences = {
HONEYWELL: {
"code": {
ARM_HOME: f"{code!s}3",
ARM_AWAY: f"{code!s}2",
ARM_NIGHT: f"{code!s}33" if alt_night_mode else f"{code!s}7",
},
"nocode": {
ARM_HOME: "#3",
ARM_AWAY: "#2",
ARM_NIGHT: f"{code!s}33" if alt_night_mode else "#7",
},
},
DSC: {
"code": {
ARM_HOME: str(code),
ARM_AWAY: str(code),
ARM_NIGHT: f"*9{code!s}" if alt_night_mode else str(code),
},
"nocode": {
ARM_HOME: chr(4) * 3,
ARM_AWAY: chr(5) * 3,
ARM_NIGHT: f"*9{code!s}" if alt_night_mode else chr(4) * 3,
},
},
}
brand = self.mode
if code_arm_required and not code:
return ""
if alt_night_mode and arm_mode == ARM_NIGHT and not code:
return ""
auto_bypass_code = (
f"{code!s}6#" if auto_bypass and brand == HONEYWELL and code else ""
)
code_key = "code" if code_arm_required else "nocode"
return auto_bypass_code + arming_sequences[brand][code_key][arm_mode]
def _arm_panel(self, arm_mode, **kwargs):
arm_sequence = self._get_arm_sequence(arm_mode, **kwargs)
if arm_sequence:
return self.send(arm_sequence)
def arm_night(
self, code=None, code_arm_required=True, alt_night_mode=False, auto_bypass=False
):
"""Arms an alarm panel in night mode"""
arm_mode = ARM_NIGHT
return self._arm_panel(
arm_mode,
code=code,
code_arm_required=code_arm_required,
alt_night_mode=alt_night_mode,
auto_bypass=auto_bypass,
)
def arm_home(self, code=None, code_arm_required=True, auto_bypass=False):
"""Arms an alarm panel in home/stay mode"""
arm_mode = ARM_HOME
return self._arm_panel(
arm_mode,
code=code,
code_arm_required=code_arm_required,
auto_bypass=auto_bypass,
)
def arm_away(self, code=None, code_arm_required=True, auto_bypass=False):
"""Arms an alarm panel in away mode"""
arm_mode = ARM_AWAY
return self._arm_panel(
arm_mode,
code=code,
code_arm_required=code_arm_required,
auto_bypass=auto_bypass,
)
|