예제 #1
0
    def __string_to_int(self, address: str) -> int:
        """
        Parse `address` as string to an integer and do some simple checks.

        Returns the integer representation of `address` if all checks are valid:
        * string matches against the regular expression
        * main, middle and sub are inside its range

        In any other case, we raise an `CouldNotParseAddress` exception.
        """
        match = self.ADDRESS_RE.match(address)
        if not match:
            raise CouldNotParseAddress(address)
        main = int(match.group("main"))
        middle = (int(match.group("middle"))
                  if match.group("middle") is not None else None)
        sub = int(match.group("sub"))
        if main > self.MAX_MAIN:
            raise CouldNotParseAddress(address)
        if middle is not None:
            if middle > self.MAX_MIDDLE:
                raise CouldNotParseAddress(address)
            if sub > self.MAX_SUB_LONG:
                raise CouldNotParseAddress(address)
        else:
            if sub > self.MAX_SUB_SHORT:
                raise CouldNotParseAddress(address)
        return ((main << 11) + (middle << 8) + sub if middle is not None else
                (main << 11) + sub)
예제 #2
0
파일: address.py 프로젝트: spacegaier/xknx
    def __init__(
        self,
        address: GroupAddressableType,
        levels: GroupAddressType = GroupAddressType.LONG,
    ) -> None:
        """Initialize Address class."""
        super().__init__()
        self.levels = levels

        if isinstance(address, GroupAddress):
            self.raw = address.raw
        elif isinstance(address, str):
            if address.isdigit():
                self.raw = int(address)
            else:
                self.raw = self.__string_to_int(address)
        elif isinstance(address, tuple) and len(address) == 2:
            self.raw = address_tuple_to_int(address)
        elif isinstance(address, int):
            self.raw = address
        elif address is None:
            self.raw = 0
        else:
            raise CouldNotParseAddress(address)

        if self.raw > 65535:
            raise CouldNotParseAddress(address)
예제 #3
0
파일: address.py 프로젝트: qvistgaard/xknx
 def _set_str_group_level2(self, parts):
     main = int(parts[0])
     sub = int(parts[1])
     if main > self.MAX_LEVEL2_1:
         raise CouldNotParseAddress(parts)
     if sub > self.MAX_LEVEL2_2:
         raise CouldNotParseAddress(parts)
     self.raw = (main << 11) + sub
     self.address_format = AddressFormat.LEVEL2
예제 #4
0
파일: address.py 프로젝트: qvistgaard/xknx
 def _set_str_group_level3(self, parts):
     main = int(parts[0])
     middle = int(parts[1])
     sub = int(parts[2])
     if main > self.MAX_LEVEL3_1:
         raise CouldNotParseAddress(parts)
     if middle > self.MAX_LEVEL3_2:
         raise CouldNotParseAddress(parts)
     if sub > self.MAX_LEVEL3_3:
         raise CouldNotParseAddress(parts)
     self.raw = (main << 11) + (middle << 8) + sub
     self.address_format = AddressFormat.LEVEL3
예제 #5
0
파일: address.py 프로젝트: qvistgaard/xknx
    def _set_str_group(self, address):
        parts = address.split("/")

        if any(not part.isdigit() for part in parts):
            raise CouldNotParseAddress(address)
        if len(parts) == 1:
            self._set_str_group_free(parts)
        elif len(parts) == 2:
            self._set_str_group_level2(parts)
        elif len(parts) == 3:
            self._set_str_group_level3(parts)
        else:
            raise CouldNotParseAddress(address)
예제 #6
0
    def __init__(self, address):
        """Initialize Address class."""
        super(PhysicalAddress, self).__init__()
        if isinstance(address, str):
            self.raw = self.__string_to_int(address)
        elif isinstance(address, tuple) and len(address) == 2:
            self.raw = address_tuple_to_int(address)
        elif isinstance(address, int):
            self.raw = address
        elif address is None:
            self.raw = 0
        else:
            raise CouldNotParseAddress(address)

        if isinstance(self.raw, int) and self.raw > 65535:
            raise CouldNotParseAddress(address)
예제 #7
0
파일: address.py 프로젝트: qvistgaard/xknx
 def _set_str_physical(self, address):
     parts = address.split(".")
     if any(not part.isdigit() for part in parts):
         raise CouldNotParseAddress(address)
     if len(parts) != 3:
         raise CouldNotParseAddress(address)
     main = int(parts[0])
     middle = int(parts[1])
     sub = int(parts[2])
     if main > self.MAX_PYHSICAL_1:
         raise CouldNotParseAddress(address)
     if middle > self.MAX_PYHSICAL_2:
         raise CouldNotParseAddress(address)
     if sub > self.MAX_PYHSICAL_3:
         raise CouldNotParseAddress(address)
     self.raw = (main << 12) + (middle << 8) + sub
     self.address_format = AddressFormat.LEVEL3
예제 #8
0
파일: address.py 프로젝트: qvistgaard/xknx
    def _set_tuple(self, address):
        if len(address) != 2 \
                or any(not isinstance(byte, int) for byte in address) \
                or any(byte < 0 for byte in address) \
                or any(byte > 255 for byte in address):
            raise CouldNotParseAddress(address)

        self._set_int(address[0] * 256 + address[1])
예제 #9
0
    def __init__(self, address: str | InternalGroupAddress) -> None:
        """Initialize InternalGroupAddress class."""
        self.address: str

        if isinstance(address, InternalGroupAddress):
            self.address = address.address
            return
        if not isinstance(address, str):
            raise CouldNotParseAddress(address)

        prefix_length = 1
        if len(address) < 2 or not address[0].lower() == "i":
            raise CouldNotParseAddress(address)
        if address[1] in "-_":
            prefix_length = 2

        self.address = address[prefix_length:].strip()
        if not self.address:
            raise CouldNotParseAddress(address)
예제 #10
0
    def __string_to_int(self, address: str) -> int:
        """
        Parse `address` as string to an integer and do some simple checks.

        Returns the integer representation of `address` if all checks are valid:
        * string matches against the regular expression
        * area, main and line are inside its range

        In any other case, we raise an `CouldNotParseAddress` exception.
        """
        match = self.ADDRESS_RE.match(address)
        if not match:
            raise CouldNotParseAddress(address)
        area = int(match.group("area"))
        main = int(match.group("main"))
        line = int(match.group("line"))
        if area > self.MAX_AREA or main > self.MAX_MAIN or line > self.MAX_LINE:
            raise CouldNotParseAddress(address)
        return (area << 12) + (main << 8) + line
예제 #11
0
    def __init__(self, address, levels=GroupAddressType.LONG):
        """Initialize Address class."""
        super(GroupAddress, self).__init__()
        self.levels = levels

        if isinstance(address, str) and not address.isdigit():
            self.raw = self.__string_to_int(address)
        elif isinstance(address, str) and address.isdigit():
            self.raw = int(address)
        elif isinstance(address, tuple) and len(address) == 2:
            self.raw = address_tuple_to_int(address)
        elif isinstance(address, int):
            self.raw = address
        elif address is None:
            self.raw = 0
        else:
            raise CouldNotParseAddress(address)

        if isinstance(self.raw, int) and self.raw > 65535:
            raise CouldNotParseAddress(address)
예제 #12
0
    def __init__(self, address: IndividualAddressableType) -> None:
        """Initialize IndividualAddress class."""
        super().__init__()
        if isinstance(address, IndividualAddress):
            self.raw = address.raw
        elif isinstance(address, str):
            if address.isdigit():
                self.raw = int(address)
            else:
                self.raw = self.__string_to_int(address)
        elif isinstance(address, tuple) and len(address) == 2:
            self.raw = address_tuple_to_int(address)
        elif isinstance(address, int):
            self.raw = address
        elif address is None:
            self.raw = 0
        else:
            raise CouldNotParseAddress(address)

        if self.raw > 65535:
            raise CouldNotParseAddress(address)
예제 #13
0
파일: address.py 프로젝트: mielune/xknx
    def __init__(self, address: Union[object, str, int, tuple]) -> None:
        """Initialize Address class."""
        super().__init__()
        if isinstance(address, PhysicalAddress):
            self.raw: int = address.raw
        elif isinstance(address, str):
            if address.isdigit():
                self.raw: int = int(address)  # type: ignore
            else:
                self.raw: int = self.__string_to_int(address)  # type: ignore
        elif isinstance(address, tuple) and len(address) == 2:
            self.raw: int = address_tuple_to_int(address)  # type: ignore
        elif isinstance(address, int):
            self.raw: int = address  # type: ignore
        elif address is None:
            self.raw: int = 0  # type: ignore
        else:
            raise CouldNotParseAddress(address)

        if self.raw > 65535:
            raise CouldNotParseAddress(address)
예제 #14
0
def address_tuple_to_int(address: tuple[int, int]) -> int:
    """
    Convert the tuple `address` to an integer.

    Valid values inside the `address` tuple are:
    * Positive Numbers between 0 and 255 (binary)
    """
    if (any(not isinstance(byte, int) for byte in address)
            or any(byte < 0 for byte in address)
            or any(byte > 255 for byte in address)):
        raise CouldNotParseAddress(address)
    return int(address[0] * 256 + address[1])
예제 #15
0
 def test_could_not_parse_address_exception(self):
     """Test string representation of CouldNotParseAddress exception."""
     exception = CouldNotParseAddress(address='1/2/1000')
     self.assertEqual(str(exception),
                      '<CouldNotParseAddress address="1/2/1000" />')
예제 #16
0
파일: address.py 프로젝트: qvistgaard/xknx
 def _set_int(self, raw):
     if not isinstance(raw, int):
         raise CouldNotParseAddress(raw)
     if raw > 65535:
         raise CouldNotParseAddress(raw)
     self.raw = raw
예제 #17
0
    CouldNotParseTelegram,
    DeviceIllegalValue,
    XKNXException,
)


@pytest.mark.parametrize(
    "base,equal,diff",
    [
        (
            ConversionError("desc1"),
            ConversionError("desc1"),
            ConversionError("desc2"),
        ),
        (
            CouldNotParseAddress(123),
            CouldNotParseAddress(123),
            CouldNotParseAddress(321),
        ),
        (
            CouldNotParseKNXIP("desc1"),
            CouldNotParseKNXIP("desc1"),
            CouldNotParseKNXIP("desc2"),
        ),
        (
            CouldNotParseTelegram("desc", arg1=1, arg2=2),
            CouldNotParseTelegram("desc", arg1=1, arg2=2),
            CouldNotParseTelegram("desc", arg1=2, arg2=1),
        ),
        (
            DeviceIllegalValue("value1", "desc"),