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```