# Local Agent

## Overview
**Test Suite for Smart Home with Matter** is a developer platform to support 3rd-party partners build products using the [Matter](https://buildwithmatter.com/) technology, which integrates with the Google Nest ecosystem.

To support partners in testing and certifying their products, **Test Suite for Smart Home with Matter** provides the tools and services to allow partners to comprehensively test their Matter products against the Google ecosystem in a scalable way.

Local Agent, one of the major components of Smart Home Partner Test Suite, is a software package which can be installed in the host machines at partners' laboratory. A local agent is required for running Auto test suite to command and control DUTs and perform Matter protocol operations at the testing site. Note that partners won't need to use local agent if they only aim to run Manual test suites.

In order to use local agent, partners will have to enable the Matter testability of their DUTs, please contact your **Google Developer Support**.

Note that this is not an officially supported Google product.


## Features

1. Registration: The linking process to link user's local agent to the backend.
2. Service Sync: Reporting status, polling RPC requests and sending RPC responses to the backend.
3. Device Control: Interacting with DUT for command and control, including collecting any available logs


## Set up

1. Clone the repo (at a desired place):
   ```
   $ git clone https://testsuite-smarthome-matter.googlesource.com/local-agent
   ```

2. Create a dedicated virtual environment for developing local agent if you don't have one:
   ```
   $ python3 -m venv <venv-name>
   ```

   ```Important```: Make sure you're running a python version ```>= 3.7```, otherwise some packages are not supported.

3. Activate the virtual environment:
   ```
   $ source <venv-name>/bin/activate
   ```

4. Install the local agent package in your virtual environment:
   ```
   $ cd /path/to/{repo-base}/local-agent
   $ pip install .
   ```

> For development, we might want to use `pip install -e .` for the last step.
> (See documentation of the "-e" option [here](https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-e))


## Usage

You should be running the Smart Home testsuite from the frontend web app to link and use the local agent.

1. On the web app's Test Plan page, you should see a ```Local Agent Setup``` button. Click on it, and if you haven’t linked your local agent before, you should see a linking code. Copy the linking code.

2. On your host machine, activate the virtual environment where you installed the local agent, and start the local agent by simply running ```$ local-agent```.

3. Once you’ve started your local agent, you should see a prompt that asks you for the linking code. Paste the linking code you copied from the web app. The local agent should start the linking process, and it will also start the device detection process, which should detect your DUTs that are connected to your host machine.
