async def form_network(self): nwk = self.config[zigpy.config.CONF_NWK] pan_id = nwk[zigpy.config.CONF_NWK_PAN_ID] if pan_id is None: pan_id = int.from_bytes(os.urandom(2), byteorder="little") extended_pan_id = nwk[zigpy.config.CONF_NWK_EXTENDED_PAN_ID] if extended_pan_id is None: extended_pan_id = t.EmberEUI64([t.uint8_t(0)] * 8) hashed_tclk = self._ezsp.ezsp_version > 4 initial_security_state = bellows.zigbee.util.zha_security( nwk, controller=True, hashed_tclk=hashed_tclk) v = await self._ezsp.setInitialSecurityState(initial_security_state) assert v[0] == t.EmberStatus.SUCCESS # TODO: Better check parameters = t.EmberNetworkParameters() parameters.panId = t.EmberPanId(pan_id) parameters.extendedPanId = extended_pan_id parameters.radioTxPower = t.uint8_t(8) parameters.radioChannel = t.uint8_t(nwk[zigpy.config.CONF_NWK_CHANNEL]) parameters.joinMethod = t.EmberJoinMethod.USE_MAC_ASSOCIATION parameters.nwkManagerId = t.EmberNodeId(0) parameters.nwkUpdateId = t.uint8_t( nwk[zigpy.config.CONF_NWK_UPDATE_ID]) parameters.channels = nwk[zigpy.config.CONF_NWK_CHANNELS] await self._ezsp.formNetwork(parameters) await self._ezsp.setValue( self._ezsp.types.EzspValueId.VALUE_STACK_TOKEN_WRITING, 1)
async def form_network(self, channel=15, pan_id=None, extended_pan_id=None): channel = t.uint8_t(channel) if pan_id is None: pan_id = t.uint16_t.from_bytes(os.urandom(2), 'little') pan_id = t.uint16_t(pan_id) if extended_pan_id is None: extended_pan_id = t.fixed_list(8, t.uint8_t)([t.uint8_t(0)] * 8) initial_security_state = bellows.zigbee.util.zha_security( controller=True) v = await self._ezsp.setInitialSecurityState(initial_security_state) assert v[0] == t.EmberStatus.SUCCESS # TODO: Better check parameters = t.EmberNetworkParameters() parameters.panId = pan_id parameters.extendedPanId = extended_pan_id parameters.radioTxPower = t.uint8_t(8) parameters.radioChannel = channel parameters.joinMethod = t.EmberJoinMethod.USE_MAC_ASSOCIATION parameters.nwkManagerId = t.EmberNodeId(0) parameters.nwkUpdateId = t.uint8_t(0) parameters.channels = t.uint32_t(0) await self._ezsp.formNetwork(parameters) await self._ezsp.setValue(t.EzspValueId.VALUE_STACK_TOKEN_WRITING, 1)
def test_ember_network_params_to_network_info(): """Coverage for Ember Network param to zigpy network information converter.""" network_params = t.EmberNetworkParameters( t.ExtendedPanId.convert("ff:7b:aa:bb:cc:dd:ee:ff"), panId=0xD539, radioTxPower=8, radioChannel=20, joinMethod=t.EmberJoinMethod.USE_MAC_ASSOCIATION, nwkManagerId=0x1234, nwkUpdateId=22, channels=t.Channels.ALL_CHANNELS, ) network_info = network_params.zigpy_network_information assert network_info.extended_pan_id == t.ExtendedPanId.convert( "ff:7b:aa:bb:cc:dd:ee:ff") assert network_info.pan_id == zt.PanId(0xD539) assert network_info.nwk_update_id == 22 assert network_info.nwk_manager_id == zt.NWK(0x1234) assert network_info.channel == 20
async def _form_network(ezsp, backup_data): """Form network.""" network = t.EmberNetworkParameters( panId=backup_data[ATTR_PAN_ID], extendedPanId=backup_data[ATTR_EXT_PAN_ID], radioTxPower=backup_data[ATTR_RADIO_TX_PWR], radioChannel=backup_data[ATTR_RADIO_CHANNEL], joinMethod=t.EmberJoinMethod.USE_MAC_ASSOCIATION, nwkManagerId=0x0000, nwkUpdateId=backup_data[ATTR_NWK_UPDATE_ID], channels=backup_data[ATTR_CHANNELS], ) (status,) = await ezsp.formNetwork(network) LOGGER.debug("Form network: %s", status) assert status == t.EmberStatus.NETWORK_UP await _update_nwk_id(ezsp, backup_data[ATTR_NWK_UPDATE_ID]) (status,) = await ezsp.setValue(ezsp.types.EzspValueId.VALUE_STACK_TOKEN_WRITING, 1) LOGGER.debug("Set token writing: %s", status) assert status == t.EmberStatus.SUCCESS
def join(ctx, channels, pan_id, extended_pan_id): """Join an existing ZigBee network as an end device""" def cb(fut, frame_name, response): if frame_name == 'stackStatusHandler': fut.set_result(response) s = yield from util.setup(ctx.obj['device'], ctx.obj['baudrate']) channel = None if len(channels) != 1: if pan_id or extended_pan_id: raise click.BadOptionUsage( "Specify exactly one channel to join a specific network") else: channel = t.uint8_t(channels[0]) if not (pan_id or extended_pan_id): scan_type = t.EzspNetworkScanType.ACTIVE_SCAN channel_mask = util.channel_mask(channels) click.echo("PAN not provided, scanning channels %s..." % (' '.join(map(str, channels)), )) v = yield from s.startScan(scan_type, channel_mask, 3) networks = [n[0] for n in v if n[0].allowingJoin] if len(networks) == 0: click.echo("No joinable networks found") return 1 if len(networks) > 1: click.echo("Multiple joinable networks found. Refusing to pick.") return 1 network = networks[0] pan_id = network.panId extended_pan_id = network.extendedPanId channel = network.channel click.echo("Found network %s %s on channel %s" % ( pan_id, extended_pan_id, channel, )) if pan_id is None: pan_id = t.uint16_t(0) else: pan_id = t.uint16_t(pan_id) if isinstance(extended_pan_id, str): extended_pan_id = util.parse_epan(extended_pan_id) if extended_pan_id is None: extended_pan_id = t.fixed_list(8, t.uint8_t)([t.uint8_t(0)] * 8) v = yield from util.network_init(s) if v[0] == t.EmberStatus.SUCCESS: LOGGER.debug("Network was up, leaving...") v = yield from s.leaveNetwork() util.check(v[0], "Failure leaving network: %s" % (v[0], )) yield from asyncio.sleep(1) # TODO initial_security_state = zutil.zha_security() v = yield from s.setInitialSecurityState(initial_security_state) util.check(v[0], "Setting security state failed: %s" % (v[0], )) parameters = t.EmberNetworkParameters() parameters.extendedPanId = extended_pan_id parameters.panId = pan_id parameters.radioTxPower = t.uint8_t(8) parameters.radioChannel = t.uint8_t(channel) parameters.joinMethod = t.EmberJoinMethod.USE_MAC_ASSOCIATION parameters.nwkManagerId = t.EmberNodeId(0) parameters.nwkUpdateId = t.uint8_t(0) parameters.channels = t.uint32_t(0) click.echo(parameters) fut = asyncio.Future() cbid = s.add_callback(functools.partial(cb, fut)) v = yield from s.joinNetwork(t.EmberNodeType.END_DEVICE, parameters) util.check(v[0], "Joining network failed: %s" % (v[0], )) v = yield from fut click.echo(v) s.remove_callback(cbid) s.close()
def form(ctx, channel, pan_id, extended_pan_id): """Create a new ZigBee network""" s = yield from util.setup(ctx.obj['device'], util.print_cb) v = yield from util.networkInit(s) if v[0] == t.EmberStatus.SUCCESS: LOGGER.debug("Network was up, leaving...") v = yield from s.leaveNetwork() util.check(v[0], "Failure leaving network: %s" % (v[0], )) yield from asyncio.sleep(1) # TODO initial_security_state = util.zha_security(controller=True) v = yield from s.setInitialSecurityState(initial_security_state) util.check(v[0], "Setting security state failed: %s" % (v[0], )) yield from util.basic_tc_permits(s) if channel: channel = t.uint8_t(channel) else: channel = t.uint8_t(17) if extended_pan_id: extended_pan_id = util.parse_epan(extended_pan_id) else: extended_pan_id = t.fixed_list(8, t.uint8_t)([t.uint8_t(0)] * 8) if pan_id: pan_id = t.uint16_t(pan_id) else: pan_id = t.uint16_t.from_bytes(os.urandom(2), 'little') parameters = t.EmberNetworkParameters() parameters.panId = pan_id parameters.extendedPanId = extended_pan_id parameters.radioTxPower = t.uint8_t(8) parameters.radioChannel = channel parameters.joinMethod = t.EmberJoinMethod.USE_MAC_ASSOCIATION parameters.nwkManagerId = t.EmberNodeId(0) parameters.nwkUpdateId = t.uint8_t(0) parameters.channels = t.uint32_t(0) click.echo(parameters) LOGGER.info("Forming network ...") fut = asyncio.Future() def cb(fut, frame_name, response): if frame_name == 'stackStatusHandler': fut.set_result(response) s.add_callback(functools.partial(cb, fut)) v = yield from s.formNetwork(parameters) util.check(v[0], "Failed to form network: %s" % (v[0], )) v = yield from fut util.check( v[0], "Network didn't come up after form", t.EmberStatus.NETWORK_UP, ) yield from s.setValue(t.EzspValueId.VALUE_STACK_TOKEN_WRITING, 1) yield from asyncio.sleep(0.1) s.close()