# 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/{repo-base}
   ```

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

5. Install Pigweed python packages in your virtual environment:
Important: one of [Gazoo Device Manager](https://github.com/google/gazoo-device)'s dependencies, [Pigweed](https://pigweed.dev/), is not available on PyPI yet. You will have to manually download and install Pigweed wheels in your virtual environment. You can use the [snippet scripts on Github](https://github.com/google/gazoo-device#install) for downloading and installation.


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

2. 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.

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

4. 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.
