Local quirk for ptvo-device do not updating measured values continuously

my local quirk for ptvo-device does not update continuously temperature, humidity and voltage values.

ptvo.info offers a configurable zigbee binaries for texas instruments cc2xxx-devices. This devices needs quirks in the most cases. For zigbee2mqtt, there is a js-generator to get a working device-script, but for zha I need to write the quirk by hand.

I used https://github.com/glcos/PTVOquirk as a guide, which seems to work only partially:

  • Entities Temperature, Humidity, Device Temperature are not shown after pairing, I have to restart HA once after pairing
  • the measured values stays a long time in “unknown” state
  • the measured values get updated with very long pauses - only once in every hour, I never see this behaviour with zigbee2mqtt
  • the Diagnostic Voltage power value is never updated - stays at “unknown”

my Device has following clusters:
Cluster 1: input gpio
Cluster 2: output gpio with pwm level
Cluster 3: output gpio
Cluster 4: Device Temperature
Cluster 5: Device supply voltage (no battery)
Cluster 6: Temperature and Humidity

ptvo configuration
Board type: CC2530
Device type: End device without routing
Manufacturer name: aerauliqa
Model ID: quantum-hr100
Update firmware's timestamp : 2022-05-08
Status LED: P15, Periodic (every 5 seconds)
Set default reporting interval (s): 60

Output pins:
P03: Output 2, PWM (Hardware, 128 kHz), External pull-up (Frequency: 30 Hz, Transition time (ms): 0, Linked input: Changes level)
P13: Output 3, GPIO, Pull-down (Role: Generic)
P06: Output 6, SI7021,HTU21,HDC1080,SHT20 (I2C SDA), External pull-up (Address (dec): 64)
P07: Output 7, I2C SCL, External pull-up

Input pins:
P10: Input 1, GPIO, Pull-down
P30: Input 4, Internal temperature
P31: Input 5, Source voltage

The Device Signature is an unique device_type, I considered in my quirk. The measured values were reported in a special form, I not found at other devices, so I choose the same solution as in https://github.com/glcos/PTVOquirk

Zigbee Device Signature
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=4447, maximum_buffer_size=80, maximum_incoming_transfer_size=160, server_mask=0, maximum_outgoing_transfer_size=160, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0xfffe",
      "in_clusters": [
        "0x0000",
        "0x0b05"
      ],
      "out_clusters": [
        "0x0000",
        "0x0012"
      ]
    },
    "2": {
      "profile_id": 260,
      "device_type": "0xfffe",
      "in_clusters": [
        "0x0006",
        "0x0008",
        "0x000c"
      ],
      "out_clusters": [
        "0x0006"
      ]
    },
    "3": {
      "profile_id": 260,
      "device_type": "0xfffe",
      "in_clusters": [
        "0x0006"
      ],
      "out_clusters": [
        "0x0006"
      ]
    },
    "4": {
      "profile_id": 260,
      "device_type": "0xfffe",
      "in_clusters": [
        "0x000c"
      ],
      "out_clusters": []
    },
    "5": {
      "profile_id": 260,
      "device_type": "0xfffe",
      "in_clusters": [
        "0x000c"
      ],
      "out_clusters": []
    },
    "6": {
      "profile_id": 260,
      "device_type": "0xfffe",
      "in_clusters": [
        "0x000c"
      ],
      "out_clusters": []
    }
  },
  "manufacturer": "aerauliqa",
  "model": "quantum-hr100",
  "class": "zigpy.device.Device"
}

What is wrong with my local quirk?

ptvo quirk
from zigpy.profiles import zha
from zigpy.quirks import CustomCluster, CustomDevice
from zhaquirks import Bus, LocalDataCluster
from zigpy.zcl.clusters.homeautomation import Diagnostic
from zigpy.zcl.clusters.general import Basic, BinaryInput, Identify, AnalogInput, OnOff, MultistateInput, LevelControl, DeviceTemperature, PowerConfiguration
from zigpy.zcl.clusters.measurement import RelativeHumidity, TemperatureMeasurement

from zhaquirks.const import (
    DEVICE_TYPE,
    ENDPOINTS,
    INPUT_CLUSTERS,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
)

DEV_TEMPERATURE_REPORTED = "dev_temperature_reported"
DEV_VOLTAGE_REPORTED = "dev_voltage_reported"
TEMPERATURE_REPORTED = "temperature_reported"
HUMIDITY_REPORTED = "humidity_reported"
PTVO_DEVICE = 0xfffe


class PtvoAnalogInputInputCluster(CustomCluster, AnalogInput):
    """Analog input cluster, used to relay temperature and humidity to Ptvo cluster."""

    cluster_id = AnalogInput.cluster_id

    def __init__(self, *args, **kwargs):
        """Init."""
        self._current_state = {}
        self._current_value = 0
        super().__init__(*args, **kwargs)

    def _update_attribute(self, attrid, value):
        super()._update_attribute(attrid, value)
        if value is not None:
            if attrid == 85:
                self._current_value = value * 100

            if attrid == 28:
                if value == "C":
                    t_value = self._current_value
                    self.endpoint.device.dev_temperature_bus.listener_event(DEV_TEMPERATURE_REPORTED, t_value)

                if value == "V":
                    v_value = self._current_value
                    self.endpoint.device.dev_voltage_bus.listener_event(DEV_VOLTAGE_REPORTED, v_value)

                if value == "%,40":
                    h_value = self._current_value
                    self.endpoint.device.humidity_bus.listener_event(HUMIDITY_REPORTED, h_value)

                if value == "C,40":
                    t_value = self._current_value
                    self.endpoint.device.temperature_bus.listener_event(TEMPERATURE_REPORTED, t_value)


class DevTemperatureMeasurementCluster(LocalDataCluster, DeviceTemperature):
    """Device temperature measurement cluster to receive reports that are sent to the analog cluster."""

    cluster_id = DeviceTemperature.cluster_id
    MEASURED_VALUE_ID = 0x0000

    def __init__(self, *args, **kwargs):
        """Init."""
        super().__init__(*args, **kwargs)
        self.endpoint.device.dev_temperature_bus.add_listener(self)

    def dev_temperature_reported(self, value):
        """Dev Temperature reported."""
        self._update_attribute(self.MEASURED_VALUE_ID, value)


class DevVoltageMeasurementCluster(LocalDataCluster, PowerConfiguration):
    """Devic voltage measurement cluster to receive reports that are sent to the analog cluster."""

    cluster_id = PowerConfiguration.cluster_id
    VOLTAGE_ID = 0x0000

    def __init__(self, *args, **kwargs):
        """Init."""
        super().__init__(*args, **kwargs)
        self.endpoint.device.dev_voltage_bus.add_listener(self)

    def dev_voltage_reported(self, value):
        """Dev Voltage reported."""
        self._update_attribute(self.VOLTAGE_ID, value)


class HumidityMeasurementCluster(LocalDataCluster, RelativeHumidity):
    """Humidity measurement cluster to receive reports that are sent to the analog cluster."""

    cluster_id = RelativeHumidity.cluster_id
    MEASURED_VALUE_ID = 0x0000

    def __init__(self, *args, **kwargs):
        """Init."""
        super().__init__(*args, **kwargs)
        self.endpoint.device.humidity_bus.add_listener(self)

    def humidity_reported(self, value):
        """Humidity reported."""
        self._update_attribute(self.MEASURED_VALUE_ID, value)


class TemperatureMeasurementCluster(LocalDataCluster, TemperatureMeasurement):
    """Temperature measurement cluster to receive reports that are sent to the analog cluster."""

    cluster_id = TemperatureMeasurement.cluster_id
    MEASURED_VALUE_ID = 0x0000

    def __init__(self, *args, **kwargs):
        """Init."""
        super().__init__(*args, **kwargs)
        self.endpoint.device.temperature_bus.add_listener(self)

    def temperature_reported(self, value):
        """Temperature reported."""
        self._update_attribute(self.MEASURED_VALUE_ID, value)


class QuantumHr100(CustomDevice):
    """PTVO Temperature."""

    def __init__(self, *args, **kwargs):
        """Init device."""
        self.dev_temperature_bus = Bus()
        self.dev_voltage_bus = Bus()
        self.temperature_bus = Bus()
        self.humidity_bus = Bus()
        super().__init__(*args, **kwargs)

    signature = {
        MODELS_INFO: [("aerauliqa", "quantum-hr100")],
        ENDPOINTS: {
            # <SimpleDescriptor endpoint=1 profile=260 device_type=65534
            # device_version=1
            # input_clusters=[0x0000, 0x0b05]
            # output_clusters=[0x0000, 0x0012]>
            1: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: PTVO_DEVICE,
                INPUT_CLUSTERS: [Basic.cluster_id, Diagnostic.cluster_id],
                OUTPUT_CLUSTERS: [Basic.cluster_id, MultistateInput.cluster_id],
            },
            # <SimpleDescriptor endpoint=2 profile=260 device_type=65534
            # device_version=1
            # input_clusters=[0x0006, 0x0008, 0x000c]
            # output_clusters=[0x0006]>
            2: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: PTVO_DEVICE,
                INPUT_CLUSTERS: [
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    AnalogInput.cluster_id,
                ],
                OUTPUT_CLUSTERS: [OnOff.cluster_id],
            },
            # <SimpleDescriptor endpoint=3 profile=260 device_type=65534
            # device_version=1
            # input_clusters=[0x0006]
            # output_clusters=[0x0006]>
            3: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: PTVO_DEVICE,
                INPUT_CLUSTERS: [OnOff.cluster_id],
                OUTPUT_CLUSTERS: [OnOff.cluster_id],
            },
            # <SimpleDescriptor endpoint=4 profile=260 device_type=65534
            # device_version=1
            # input_clusters=[0x000c]
            # output_clusters=[]>
            4: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: PTVO_DEVICE,
                INPUT_CLUSTERS: [AnalogInput.cluster_id],
                OUTPUT_CLUSTERS: [],
            },
            # <SimpleDescriptor endpoint=5 profile=260 device_type=65534
            # device_version=1
            # input_clusters=[0x000c]
            # output_clusters=[]>
            5: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: PTVO_DEVICE,
                INPUT_CLUSTERS: [AnalogInput.cluster_id],
                OUTPUT_CLUSTERS: [],
            },
            # <SimpleDescriptor endpoint=6 profile=260 device_type=65534
            # device_version=1
            # input_clusters=[0x000c]
            # output_clusters=[]>
            6: {
                PROFILE_ID: zha.PROFILE_ID,
                DEVICE_TYPE: PTVO_DEVICE,
                INPUT_CLUSTERS: [AnalogInput.cluster_id],
                OUTPUT_CLUSTERS: [],
            }
        }
    }

    replacement = {
        ENDPOINTS: {
           1: {
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    Diagnostic.cluster_id,
                ],
                OUTPUT_CLUSTERS: [Basic.cluster_id, MultistateInput.cluster_id],
            },
            2: {
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    AnalogInput.cluster_id,
                ],
                OUTPUT_CLUSTERS: [OnOff.cluster_id],
            },
            3: {
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    OnOff.cluster_id,
                ],
                OUTPUT_CLUSTERS: [OnOff.cluster_id],
            },
            4: {
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    PtvoAnalogInputInputCluster,
                    DevTemperatureMeasurementCluster,
                ],
                OUTPUT_CLUSTERS: [],
            },
            5: {
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    PtvoAnalogInputInputCluster,
                    DevVoltageMeasurementCluster,
                ],
                OUTPUT_CLUSTERS: [],
            },
            6: {
                DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT,
                INPUT_CLUSTERS: [
                    PtvoAnalogInputInputCluster,
                    TemperatureMeasurementCluster,
                    HumidityMeasurementCluster,
                ],
                OUTPUT_CLUSTERS: [],
            },
        }
    }

my HA is at the last version:

  • Home Assistant Core 2022.6.6
  • Home Assistant Supervisor 2022.05.3
  • Home Assistant OS 8.2
ptvo zigbee log
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Received ZCL frame: b'\x08\x05\nU\x009\x00\x00\xc8Ao\x00\x18\xe1\x1c\x00B\x01C'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True), tsn=5, command_id=10, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Decoded ZCL frame: PtvoAnalogInputInputCluster:Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=25.0)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|64|32|1: 225>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='C'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Received command 0x0A (TSN 5): Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=25.0)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|64|32|1: 225>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='C'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Attribute report received: present_value=25.0, status_flags=<bitmap8.128|64|32|1: 225>, description='C'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=5, command_id=<GeneralCommand.Default_Response: 11>, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:4:0x000c] Sending reply: Default_Response(command_id=10, status=<Status.SUCCESS: 0>)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Received ZCL frame: b'\x08\x06\nU\x009\\\x8fR@o\x00\x18\xe1\x1c\x00B\x01V'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True), tsn=6, command_id=10, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Decoded ZCL frame: PtvoAnalogInputInputCluster:Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=3.2899999618530273)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|64|32|1: 225>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='V'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Received command 0x0A (TSN 6): Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=3.2899999618530273)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|64|32|1: 225>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='V'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Attribute report received: present_value=3.2899999618530273, status_flags=<bitmap8.128|64|32|1: 225>, description='V'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=6, command_id=<GeneralCommand.Default_Response: 11>, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:5:0x000c] Sending reply: Default_Response(command_id=10, status=<Status.SUCCESS: 0>)
2022-06-16 11:29:55 DEBUG (MainThread) [bellows.ezsp.protocol] Send command sendUnicast: (<EmberOutgoingMessageType.OUTGOING_DIRECT: 0>, 0x68A3, EmberApsFrame(profileId=260, clusterId=6, sourceEndpoint=3, destinationEndpoint=3, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY|APS_OPTION_RETRY: 320>, groupId=0, sequence=3), 8, b'\x18\x03\x0b\n\x00')
2022-06-16 11:29:55 DEBUG (MainThread) [bellows.ezsp.protocol] Send command sendUnicast: (<EmberOutgoingMessageType.OUTGOING_DIRECT: 0>, 0x68A3, EmberApsFrame(profileId=260, clusterId=12, sourceEndpoint=2, destinationEndpoint=2, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY|APS_OPTION_RETRY: 320>, groupId=0, sequence=4), 9, b'\x18\x04\x0b\n\x00')
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Received ZCL frame: b'\x08\x07\nU\x009\xcd\xccRBo\x00\x18\x9f\x1c\x00B\x04%,40'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True), tsn=7, command_id=10, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Decoded ZCL frame: PtvoAnalogInputInputCluster:Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=52.70000076293945)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|16|8|4|2|1: 159>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='%,40'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Received command 0x0A (TSN 7): Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=52.70000076293945)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|16|8|4|2|1: 159>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='%,40'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Attribute report received: present_value=52.70000076293945, status_flags=<bitmap8.128|16|8|4|2|1: 159>, description='%,40'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=7, command_id=<GeneralCommand.Default_Response: 11>, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Sending reply: Default_Response(command_id=10, status=<Status.SUCCESS: 0>)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Received ZCL frame: b'\x08\x08\nU\x009H\xe1\xc8Ao\x00\x18\xe1\x1c\x00B\x04C,40'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, is_reply=1, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True), tsn=8, command_id=10, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Decoded ZCL frame: PtvoAnalogInputInputCluster:Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=25.110000610351562)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|64|32|1: 225>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='C,40'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Received command 0x0A (TSN 8): Report_Attributes(attribute_reports=[Attribute(attrid=0x0055, value=TypeValue(type=Single, value=25.110000610351562)), Attribute(attrid=0x006F, value=TypeValue(type=bitmap8, value=<bitmap8.128|64|32|1: 225>)), Attribute(attrid=0x001C, value=TypeValue(type=CharacterString, value='C,40'))])
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Attribute report received: present_value=25.110000610351562, status_flags=<bitmap8.128|64|32|1: 225>, description='C,40'
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, is_reply=1, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True), tsn=8, command_id=<GeneralCommand.Default_Response: 11>, *is_reply=True)
2022-06-16 11:29:55 DEBUG (MainThread) [zigpy.zcl] [0x68A3:6:0x000c] Sending reply: Default_Response(command_id=10, status=<Status.SUCCESS: 0>)
2022-06-16 11:29:55 DEBUG (MainThread) [bellows.ezsp.protocol] Send command sendUnicast: (<EmberOutgoingMessageType.OUTGOING_DIRECT: 0>, 0x68A3, EmberApsFrame(profileId=260, clusterId=12, sourceEndpoint=4, destinationEndpoint=4, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY|APS_OPTION_RETRY: 320>, groupId=0, sequence=5), 10, b'\x18\x05\x0b\n\x00')
2022-06-16 11:29:56 DEBUG (MainThread) [bellows.ezsp.protocol] Send command sendUnicast: (<EmberOutgoingMessageType.OUTGOING_DIRECT: 0>, 0x68A3, EmberApsFrame(profileId=260, clusterId=12, sourceEndpoint=5, destinationEndpoint=5, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY|APS_OPTION_RETRY: 320>, groupId=0, sequence=6), 11, b'\x18\x06\x0b\n\x00')
2022-06-16 11:29:56 DEBUG (MainThread) [bellows.ezsp.protocol] Send command sendUnicast: (<EmberOutgoingMessageType.OUTGOING_DIRECT: 0>, 0x68A3, EmberApsFrame(profileId=260, clusterId=12, sourceEndpoint=6, destinationEndpoint=6, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY|APS_OPTION_RETRY: 320>, groupId=0, sequence=7), 12, b'\x18\x07\x0b\n\x00')
2022-06-16 11:29:56 DEBUG (MainThread) [bellows.ezsp.protocol] Send command sendUnicast: (<EmberOutgoingMessageType.OUTGOING_DIRECT: 0>, 0x68A3, EmberApsFrame(profileId=260, clusterId=12, sourceEndpoint=6, destinationEndpoint=6, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY|APS_OPTION_RETRY: 320>, groupId=0, sequence=8), 13, b'\x18\x08\x0b\n\x00')
2022-06-16 11:31:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:31:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:32:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:32:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:33:33 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:33:33 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:34:48 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:34:48 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:36:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:36:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:37:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:37:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:38:33 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:38:33 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:39:48 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:39:48 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:41:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:41:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:42:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:42:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:43:33 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:43:33 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:44:48 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:44:48 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:46:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:46:03 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False
2022-06-16 11:47:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Device seen - marking the device available and resetting counter
2022-06-16 11:47:18 DEBUG (MainThread) [homeassistant.components.zha.core.device] [0x68A3](quantum-hr100): Update device availability -  device available: True - new availability: True - changed: False```