Skip to content

Commit

Permalink
Merged dev
Browse files Browse the repository at this point in the history
  • Loading branch information
mdeweerd committed Oct 31, 2023
2 parents 51133d8 + 64c483f commit 4e1b255
Show file tree
Hide file tree
Showing 14 changed files with 119 additions and 50 deletions.
11 changes: 10 additions & 1 deletion custom_components/zha_toolkit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from homeassistant.components.zha.core.gateway import ZHAGateway
from homeassistant.util import dt as dt_util
from zigpy import types as t
from zigpy.exceptions import DeliveryError

from . import params as PARDEFS
from . import utils as u
Expand Down Expand Up @@ -813,7 +814,15 @@ async def toolkit_service(service):
u.get_hass(zha_gw).bus.fire(params[p.EVT_DONE], event_data)

if handler_exception is not None:
raise handler_exception
LOGGER.error(
"Exception '%s' for service call with data '%r'",
handler_exception,
event_data,
)
if params[p.FAIL_EXCEPTION] or not isinstance(
handler_exception, DeliveryError
):
raise handler_exception

if not event_data["success"] and params[p.FAIL_EXCEPTION]:
raise Exception("Success expected, but failed")
Expand Down
6 changes: 3 additions & 3 deletions custom_components/zha_toolkit/_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ async def user_sinope_write_test(

ieee = t.EUI64.deserialize(b"\xae\x09\x01\x00\x40\x91\x0b\x50")[0]

dev = app.get_device(ieee)
dev = u.get_device(app, listener, ieee)

cluster = dev.endpoints[1].thermostat

Expand Down Expand Up @@ -82,7 +82,7 @@ async def user_zigpy_deconz(
LOGGER.debug("Getting model from iris: %s", service)

ieee = t.EUI64(b"\x00\x0d\x6f\x00\x0f\x3a\xf6\xa6")
dev = app.get_device(ieee=ieee)
dev = u.get_device(app, listener, ieee)

cluster = dev.endpoints[2].basic
res = await cluster.read_attributes(
Expand All @@ -99,7 +99,7 @@ async def user_tuya_magic(
to try to get 'normal' behavior.
"""

dev = app.get_device(ieee)
dev = u.get_device(app, listener, ieee)
basic_cluster = dev.endpoints[1].in_clusters[0]

# The magic spell is needed only once.
Expand Down
10 changes: 5 additions & 5 deletions custom_components/zha_toolkit/binds.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ async def bind_group(
LOGGER.error("missing ieee")
return

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)

# Get tries
tries = params[p.TRIES]
Expand Down Expand Up @@ -171,7 +171,7 @@ async def unbind_group(
LOGGER.error("missing data (destination ieee)")
return

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)

group_id = u.str2int(data)

Expand Down Expand Up @@ -237,7 +237,7 @@ async def bind_ieee(
if ieee is None:
raise ValueError("'ieee' required")

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)
if data in [0, False, "0", None]:
# when command_data is set to 0 or false, bind to coordinator
data = app.ieee
Expand Down Expand Up @@ -428,7 +428,7 @@ async def binds_remove_all(
if ieee is None:
LOGGER.error("missing ieee")
return
src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)
zdo = src_dev.zdo

# Get target ieee filter
Expand Down Expand Up @@ -581,7 +581,7 @@ async def binds_get(
if ieee is None:
LOGGER.error("missing ieee")
return
src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)
zdo = src_dev.zdo

# Get tries
Expand Down
14 changes: 7 additions & 7 deletions custom_components/zha_toolkit/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ async def get_groups(
LOGGER.error("missing ieee")
return

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)

groups: dict[int, dict[str, Any]] = {}
endpoint_id = params[p.EP_ID]
Expand Down Expand Up @@ -65,7 +65,7 @@ async def add_group(
if ieee is None or not data:
raise ValueError("ieee and command_data required")

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)

group_id = u.str2int(data)
endpoint_id = params[p.EP_ID]
Expand Down Expand Up @@ -104,7 +104,7 @@ async def remove_group(
if ieee is None or not data:
raise ValueError("ieee and command_data required")

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)

group_id = u.str2int(data)
endpoint_id = params[p.EP_ID]
Expand Down Expand Up @@ -139,7 +139,7 @@ async def remove_all_groups(
if ieee is None:
return

src_dev = app.get_device(ieee=ieee)
src_dev = u.get_device(app, listener, ieee)
endpoint_id = params[p.EP_ID]
result = []

Expand All @@ -165,7 +165,7 @@ async def add_to_group(
LOGGER.error("invalid arguments for subscribe_group()")
return

dev = app.get_device(ieee=ieee)
dev = u.get_device(app, listener, ieee)

grp_id = u.str2int(data)
endpoint_id = params[p.EP_ID]
Expand Down Expand Up @@ -194,7 +194,7 @@ async def remove_from_group(
if data is None or ieee is None:
raise ValueError("ieee and command_data required")

dev = app.get_device(ieee)
dev = u.get_device(app, listener, ieee)

grp_id = u.str2int(data)
endpoint_id = params[p.EP_ID]
Expand Down Expand Up @@ -228,7 +228,7 @@ async def get_zll_groups(
LOGGER.error("missing ieee")
return

dev = app.get_device(ieee=ieee)
dev = u.get_device(app, listener, ieee)

clusters = [
ep.in_clusters[LightLink.cluster_id]
Expand Down
21 changes: 16 additions & 5 deletions custom_components/zha_toolkit/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ async def handle_join(
LOGGER.debug("Provide 'ieee' parameter for %s", cmd)
raise ValueError("ieee parameter missing")

dev = app.get_device(ieee=ieee)
dev = await u.get_device(app, listener, ieee)

if data is None:
if dev is None:
Expand Down Expand Up @@ -111,7 +111,7 @@ async def misc_reinitialize(
LOGGER.debug(msg)
raise ValueError(ieee)

dev = app.get_device(ieee=ieee)
dev = await u.get_device(app, listener, ieee)
LOGGER.debug(f"{ieee!r} - Set initialisations=False, call handle_join")
# dev.has_non_zdo_endpoints = False # Force rescan
# Can't set: dev.non_zdo_endpoints = False # Force rescan
Expand All @@ -136,7 +136,7 @@ async def rejoin(app, listener, ieee, cmd, data, service, params, event_data):
LOGGER.error("missing ieee")
return
LOGGER.debug("running 'rejoin' command: %s", service)
src = app.get_device(ieee=ieee)
src = await u.get_device(app, listener, ieee)

if data is None:
await app.permit()
Expand Down Expand Up @@ -221,7 +221,13 @@ async def misc_settime(
tz._utc_transition_times, utc_time # type:ignore[union-attr]
)

if index is not None:
if index is None:
event_data["success"] = False
event_data[
"msg"
] = "misc_settime expects DST changes, needs update if None"

try:
if (
tz._utc_transition_times[index] # type:ignore[union-attr]
.replace(tzinfo=pytz.UTC)
Expand Down Expand Up @@ -264,7 +270,7 @@ async def misc_settime(
)
LOGGER.debug(f"UTC OFFSET: {utc_offset} DST OFFSET: {dst_shift}")

dev = app.get_device(ieee=ieee)
dev = await u.get_device(app, listener, ieee)
params[p.CLUSTER_ID] = 0x000A # Time Cluster
cluster = u.get_cluster_from_params(dev, params, event_data)

Expand Down Expand Up @@ -307,3 +313,8 @@ async def misc_settime(
read_resp[1],
)
u.record_read_data(read_resp, cluster, params, listener)

event_data["success"] = True
except DeliveryError as e:
event_data["success"] = False
event_data["msg"] = f"{e!r}"
2 changes: 1 addition & 1 deletion custom_components/zha_toolkit/neighbours.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ async def get_routes_and_neighbours(
return

LOGGER.debug("Getting routes and neighbours: %s", service)
device = app.get_device(ieee=ieee)
device = u.get_device(app, listener, ieee)
event_data["result"] = await _routes_and_neighbours(device, listener)

ieee_tail = "".join([f"{o:02X}" for o in device.ieee])
Expand Down
2 changes: 1 addition & 1 deletion custom_components/zha_toolkit/ota.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ async def ota_notify(

LOGGER.debug("running 'image_notify' command: %s", service)

device = app.get_device(ieee=ieee)
device = u.get_device(app, listener, ieee)

cluster = None
for epid, ep in device.endpoints.items():
Expand Down
2 changes: 1 addition & 1 deletion custom_components/zha_toolkit/scan_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ async def scan_device(

LOGGER.debug("Running 'scan_device'")

device = app.get_device(ieee)
device = u.get_device(app, listener, ieee)

endpoints = params[p.EP_ID]
manf = params[p.MANF]
Expand Down
2 changes: 1 addition & 1 deletion custom_components/zha_toolkit/tuya.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ async def tuya_magic(
Send 'magic spell' sequence to device to try to get 'normal' behavior.
"""

dev = app.get_device(ieee)
dev = u.get_device(app, listener, ieee)
basic_cluster = dev.endpoints[1].in_clusters[0]

# The magic spell is needed only once.
Expand Down
45 changes: 28 additions & 17 deletions custom_components/zha_toolkit/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ def get_radio_version(app):
# Reference can be entity, device, or IEEE address
async def get_ieee(app, listener, ref):
# pylint: disable=too-many-return-statements
# LOGGER.debug("Type IEEE: %s", type(ref))
# LOGGER.error("######### Get IEEE: %s %r", type(ref), ref)
if isinstance(ref, str):
# Check if valid ref address
if ref.count(":") == 7:
Expand Down Expand Up @@ -287,14 +287,6 @@ async def get_ieee(app, listener, ref):
get_hass(listener)
)
)
# LOGGER.debug("registry %s",entity_registry)
registry_entity = entity_registry.async_get(ref)
LOGGER.debug("registry_entity %s", registry_entity)
if registry_entity is None:
return None
if registry_entity.platform != "zha":
LOGGER.error("Not a ZHA device : '%s'", ref)
return None

device_registry = (
# Deprecated >= 2022.6.0
Expand All @@ -306,23 +298,42 @@ async def get_ieee(app, listener, ref):
get_hass(listener)
)
)
registry_device = device_registry.async_get(registry_entity.device_id)
LOGGER.debug("registry_device %s", registry_device)
registry_device = device_registry.async_get(ref)

if registry_device is None:
# LOGGER.debug("registry %s",entity_registry)
registry_entity = entity_registry.async_get(ref)
if registry_entity is None:
LOGGER.error("No device found for '%s'", ref)
return None
if registry_entity.platform != "zha":
LOGGER.error("Not a ZHA device : '%s'", ref)
return None

LOGGER.debug("Found registry_entity %r", registry_entity)
registry_device = device_registry.async_get(
registry_entity.device_id
)

LOGGER.debug("Found registry_device %r", registry_device)
for identifier in registry_device.identifiers:
if identifier[0] == "zha":
return t.EUI64.convert(identifier[1])

LOGGER.error("Not a ZHA device : '%s'", ref)
return None

# Other type, suppose it's already an EUI64
return ref


# Get a zigbee device instance for the reference.
# Reference can be entity, device, or IEEE address
async def get_device(app, listener, reference):
# Method is called get
"""
Get a zigbee device instance for the reference.
Reference can be entity, device, or IEEE address
"""
ieee = await get_ieee(app, listener, reference)
LOGGER.debug("IEEE for get_device: %s", ieee)
LOGGER.debug("IEEE for get_device: %s %s", reference, ieee)
return app.get_device(ieee)


Expand Down Expand Up @@ -724,12 +735,12 @@ def attr_encode(attr_val_in, attr_type): # noqa C901
# With length byte after serialisation:
# compare_val = t.LVBytes(attr_val_in)

attr_obj = data_type(compare_val)
attr_obj = f.TypeValue(attr_type, data_type(compare_val))
# Not using : attr_obj = data_type(attr_type, compare_val)
# which may add extra bytes
else:
compare_val = data_type(str2int(attr_val_in))
attr_obj = data_type(attr_type, compare_val)
attr_obj = f.TypeValue(attr_type, compare_val)
LOGGER.debug(
"Converted %s to %s - will compare to %s - Type: 0x%02X",
attr_val_in,
Expand Down
6 changes: 3 additions & 3 deletions custom_components/zha_toolkit/zcl_attr.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ async def my_read_reporting_configuration_multiple(
async def conf_report_read(
app, listener, ieee, cmd, data, service, params, event_data
):
dev = app.get_device(ieee=ieee)
dev = await u.get_device(app, listener, ieee)
cluster = u.get_cluster_from_params(dev, params, event_data)

if False: # pylint: disable=using-constant-test
Expand Down Expand Up @@ -250,7 +250,7 @@ async def conf_report_read(
async def conf_report(
app, listener, ieee, cmd, data, service, params, event_data
):
dev = app.get_device(ieee=ieee)
dev = await u.get_device(app, listener, ieee)

cluster = u.get_cluster_from_params(dev, params, event_data)

Expand Down Expand Up @@ -318,7 +318,7 @@ async def attr_write( # noqa: C901
):
success = True

dev = app.get_device(ieee=ieee)
dev = await u.get_device(app, listener, ieee)
cluster = u.get_cluster_from_params(dev, params, event_data)

# Prepare read and write lists
Expand Down
2 changes: 1 addition & 1 deletion custom_components/zha_toolkit/zcl_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ async def zcl_cmd(app, listener, ieee, cmd, data, service, params, event_data):
LOGGER.error(msg)
raise Exception(msg)

dev = app.get_device(ieee=ieee)
dev = u.get_device(app, listener, ieee)
# The next line will also update the endpoint if it is not set
cluster = u.get_cluster_from_params(dev, params, event_data)

Expand Down
Loading

0 comments on commit 4e1b255

Please sign in to comment.