예제 #1
0
async def bind_ieee(app, listener, ieee, cmd, data, service):
    from zigpy import types as t
    from zigpy.zdo.types import MultiAddress

    if ieee is None or not data:
        LOGGER.error("missing ieee")
        return
    LOGGER.debug("running 'bind ieee' command: %s", service)
    src_dev = app.get_device(ieee=ieee)
    dst_ieee = t.EUI64([t.uint8_t(p, base=16) for p in data.split(':')])
    dst_dev = app.get_device(ieee=dst_ieee)

    zdo = src_dev.zdo
    src_clusters = [6, 8, 768]

    for src_cluster in src_clusters:
        src_endpoints = [
            ep_id for ep_id, ep in src_dev.endpoints.items()
            if ep_id != 0 and src_cluster in ep.out_clusters
        ]
        LOGGER.debug("0x%04x: got the %s endpoints for %s cluster",
                     src_dev.nwk, src_endpoints, src_cluster)

        if not src_endpoints:
            LOGGER.debug("0x%04x: skipping %s cluster as non present",
                         src_dev.nwk, src_cluster)
            continue
        dst_addr = MultiAddress()
        dst_addr.addrmode = t.uint8_t(3)
        dst_addr.ieee = dst_dev.ieee

        # find dest ep
        dst_epid = None
        for ep_id, ep in dst_dev.endpoints.items():
            if ep_id == 0:
                continue
            if src_cluster in ep.in_clusters:
                dst_epid = ep_id
                break
        if not dst_epid:
            continue
        dst_addr.endpoint = t.uint8_t(dst_epid)

        for src_ep in src_endpoints:
            LOGGER.debug(
                "0x%04x: binding %s, ep: %s, cluster: %s to %s dev %s ep",
                src_dev.nwk, str(src_dev.ieee), src_ep, src_cluster,
                str(dst_dev.ieee), dst_epid)
            res = await zdo.request(ZDOCmd.Bind_req, src_dev.ieee, src_ep,
                                    src_cluster, dst_addr)
            LOGGER.debug("0x%04x: binding ieee %s: %s",
                         src_dev.nwk, str(dst_dev.ieee), res)
예제 #2
0
async def bind_ieee(app, listener, ieee, cmd, data, service, params,
                    event_data):
    from zigpy import types as t
    from zigpy.zdo.types import MultiAddress

    if ieee is None or not data:
        LOGGER.error("missing ieee")
        return
    LOGGER.debug("running 'bind ieee' command: %s", service)
    src_dev = app.get_device(ieee=ieee)

    dst_dev = await u.get_device(app, listener, data)

    zdo = src_dev.zdo
    src_out_clusters = [
        0x0006,  # OnOff
        0x0008,  # Level
        0x0300,  # Color Control
    ]

    src_in_clusters = [
        0x0402,  # Temperature
    ]

    # TODO: Filter according to params[p.CLUSTER_ID]

    results = {}

    for src_out_cluster in src_out_clusters:
        src_endpoints = [
            ep_id for ep_id, ep in src_dev.endpoints.items()
            if ep_id != 0 and src_out_cluster in ep.out_clusters
        ]
        LOGGER.debug(
            "0x%04x: got the %s endpoints for %s cluster",
            src_dev.nwk,
            src_endpoints,
            src_out_cluster,
        )

        if not src_endpoints:
            LOGGER.debug(
                "0x%04x: skipping %0x04X cluster as non present",
                src_dev.nwk,
                src_out_cluster,
            )
            continue
        dst_addr = MultiAddress()
        dst_addr.addrmode = t.uint8_t(3)
        dst_addr.ieee = dst_dev.ieee

        # find dest ep
        dst_epid = None
        for ep_id, ep in dst_dev.endpoints.items():
            if ep_id == 0:
                continue
            if src_out_cluster in ep.in_clusters:
                dst_epid = ep_id
                break
        if not dst_epid:
            continue
        dst_addr.endpoint = t.uint8_t(dst_epid)

        for src_ep in src_endpoints:
            LOGGER.debug(
                "0x%04x: binding %s, ep: %s, cluster: 0x%04X to %s dev %s ep",
                src_dev.nwk,
                str(src_dev.ieee),
                src_ep,
                src_out_cluster,
                str(dst_dev.ieee),
                dst_epid,
            )
            res = await zdo.request(
                ZDOCmd.Bind_req,
                src_dev.ieee,
                src_ep,
                src_out_cluster,
                dst_addr,
            )
            LOGGER.debug(
                "0x%04x: binding ieee %s: %s",
                src_dev.nwk,
                str(dst_dev.ieee),
                res,
            )

    for src_in_cluster in src_in_clusters:
        src_endpoints = [
            ep_id for ep_id, ep in src_dev.endpoints.items()
            if ep_id != 0 and src_in_cluster in ep.in_clusters
        ]
        LOGGER.debug(
            "0x%04x: got the %s endpoints for %s cluster",
            src_dev.nwk,
            src_endpoints,
            src_in_cluster,
        )

        if not src_endpoints:
            LOGGER.debug(
                "0x%04x: skipping %0x04X cluster as non present",
                src_dev.nwk,
                src_in_cluster,
            )
            continue
        dst_addr = MultiAddress()
        dst_addr.addrmode = t.uint8_t(3)
        dst_addr.ieee = dst_dev.ieee

        # find dest ep
        dst_epid = None
        for ep_id, ep in dst_dev.endpoints.items():
            if ep_id == 0:
                continue
            if src_in_cluster in ep.out_clusters:
                dst_epid = ep_id
                break
        if not dst_epid:
            continue
        dst_addr.endpoint = t.uint8_t(dst_epid)

        for src_ep in src_endpoints:
            LOGGER.debug(
                "0x%04x: binding %s, ep: %s, cluster: 0x%04X to %s dev %s ep",
                src_dev.nwk,
                str(src_dev.ieee),
                src_ep,
                src_in_cluster,
                str(dst_dev.ieee),
                dst_epid,
            )
            if src_ep not in results:
                results[src_ep] = []

            bind_result = {
                "src_endpoint_id": src_ep,
                "dst_endpoint_id": dst_epid,
                "cluster_id": src_in_cluster,
            }
            res = await zdo.request(ZDOCmd.Bind_req, src_dev.ieee, src_ep,
                                    src_in_cluster, dst_addr)
            bind_result["result"] = res
            results[src_ep] = bind_result
            LOGGER.debug(
                "0x%04x: binding ieee %s: %s",
                src_dev.nwk,
                str(dst_dev.ieee),
                res,
            )

    event_data["result"] = results