# Path: beacontools/const.py
# CJ_MANUFACTURER_ID = b"\x72\x04"
# 
# CJ_TEMPHUM_TYPE = 0x10fe
# 
# Path: beacontools/utils.py
# def is_valid_mac(mac):
#     """"Returns True if the given argument matches RE_MAC_ADDR, otherwise False"""
#     return RE_MAC_ADDR.match(mac) is not None


from .const import CJ_MANUFACTURER_ID, CJ_TEMPHUM_TYPE
from .utils import is_valid_mac
        super().__init__()
        if identifier is None and protocol_version is None:
            raise ValueError("EstimoteFilter needs at least one argument set")
        if identifier is not None:
            self.properties['identifier'] = identifier
        if protocol_version is not None:
            self.properties['protocol_version'] = protocol_version


class ExposureNotificationFilter(DeviceFilter):
    """Filter for specific exposure notification identifier."""

    def __init__(self, identifier):
        """Initialize filter."""
        super().__init__()
        if identifier is None:
            raise ValueError("ExposureNotificationFilter needs identifier to be set")
        self.properties['identifier'] = identifier


class BtAddrFilter(DeviceFilter):
    """Filter by bluetooth address."""

    def __init__(self, bt_addr):
        """Initialize filter."""
        super().__init__()
        try:
            bt_addr = bt_addr.lower()
        except AttributeError as exc:
            raise ValueError("bt_addr({}) wasn't a string".format(bt_addr)) from exc

# Path: beacontools/const.py
# CJ_MANUFACTURER_ID = b"\x72\x04"
# 
# CJ_TEMPHUM_TYPE = 0x10fe
# 
# Path: beacontools/utils.py
# def is_valid_mac(mac):
#     """"Returns True if the given argument matches RE_MAC_ADDR, otherwise False"""
#     return RE_MAC_ADDR.match(mac) is not None


# Path: beacontools/device_filters.py
from .const import CJ_MANUFACTURER_ID, CJ_TEMPHUM_TYPE
from .utils import is_valid_mac

        super().__init__()
        if identifier is None and protocol_version is None:
            raise ValueError("EstimoteFilter needs at least one argument set")
        if identifier is not None:
            self.properties['identifier'] = identifier
        if protocol_version is not None:
            self.properties['protocol_version'] = protocol_version


class ExposureNotificationFilter(DeviceFilter):
    """Filter for specific exposure notification identifier."""

    def __init__(self, identifier):
        """Initialize filter."""
        super().__init__()
        if identifier is None:
            raise ValueError("ExposureNotificationFilter needs identifier to be set")
        self.properties['identifier'] = identifier


class BtAddrFilter(DeviceFilter):
    """Filter by bluetooth address."""

    def __init__(self, bt_addr):
        """Initialize filter."""
        super().__init__()
        try:
            bt_addr = bt_addr.lower()
        except AttributeError as exc:
            raise ValueError("bt_addr({}) wasn't a string".format(bt_addr)) from exc

        if not is_valid_mac(bt_addr):