File: adext.py

package info (click to toggle)
python-adext 0.4.3-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 112 kB
  • sloc: python: 240; makefile: 4
file content (113 lines) | stat: -rw-r--r-- 3,565 bytes parent folder | download
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,
        )