blob: e7ebba5b3e18cd825cdd0c7cd3b0269ddb0a6b40 [file] [log] [blame] [view]
# Matter Python REPL
The Matter Python REPL is a native IPython shell environment loaded with a
Python-wrapped version of the C++ Matter stack to permit interacting as a
controller to other Matter-compliant devices.
You can interact with the REPL in a one of three ways:
1. Through an IPython shell built from source
2. Through a locally built 'REPL Playground', which is a Jupyter Lab environment
that supports launching both a native IPython shell as well as Guide
Notebooks.
3. Through a cloud-hosted REPL Playground that has pre-built versions of the
REPL that can be interacted with through a browser.
This guide provides instructions on how to utilize its various features.
###
## Source files
You can find source files of the Python CHIP Controller tool in the
`src/controller/python` directory.
The tool uses the generic CHIP Device Controller library, available in the
`src/controller` directory.
## Building
Please follow the instructions
[here](./python_chip_controller_building.md#building-and-installing) to build
the Python virtual environment.
### Building for `arm64` e.g. for Raspberry Pi
Matter code relies on code generation for cluster-specific data types and
callbacks. A subset of code generation is done at compile time by `zap-cli`. ZAP
is generally installed as a third-party tool via CIPD during the build
environment bootstrap. However, zap packages are currently NOT available for
`arm64` (like when compiling on Raspberry PI.). In this case, you have 2
choices.
1. You could check out zap from source as described in
[Code Generation - Installing zap and environment variables](https://github.com/project-chip/connectedhomeip/blob/master/docs/code_generation.md#Installing-zap-and-environment-variables)
and proceed with the
[instructions](./python_chip_controller_building.md#building-and-installing)
to build the Python virtual environment.
2. When compile-time code generation is not desirable, then pre-generated output
code can be used. To understand about code generation and pre-generating
matter code see.
[Code generation - Pre-generation](https://github.com/project-chip/connectedhomeip/blob/master/docs/code_generation.md#Pre-generation).
To build and install the Python CHIP controller with pre-generated files use
the -z argument that points to the directory of pre-generated code:
```
scripts/build_python.sh -m platform -i out/python_env -z "/some/pregen/dir"
```
> Note: To get more details about available build configurations, run the
> following command: `scripts/build_python.sh --help`
## Launching the REPL
1. Activate the Python virtual environment:
```
source out/python_env/bin/activate
```
2. Launch the REPL.
```
sudo out/python_env/bin/chip-repl
```
> By default, the REPL points to `/tmp/repl-storage.json` for persistent
> storage. You can over-ride that location by passing in `--storagepath <path>`
> to the above invocation.
## REPL Playground
The REPL playground is a Jupyter Lab instance that allows you to interact with
the REPL from a web browser (or a Jupyter Notebook client of your choice!). It
contains the entire REPL encapsulated as an IPython kernel.
### Locally Hosted
The locally hosted version requires you to follow the build instructions below
to initially setup your Python environment.
Then:
1. Install
[Jupyter Lab](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html)
(not within the virtualenv!)
```
pip3 install jupyterlab ipykernel
```
2. Install the [Python LSP](https://github.com/jupyter-lsp/jupyterlab-lsp)
extension for better code autocompletion in the playground.
```
pip3 install jupyterlab-lsp
pip3 install python-lsp-server
```
3. Every virtual env needs to be installed as a 'kernel' in Jupyter Lab. To do
so, activate the virtual env and run:
```
python -m ipykernel install <name-for-your-kernel>
```
4. Navigate to the SDK root folder and launch Jupyter Lab (not from within
virtual env!)
```
jupyter-lab
```
This will automatically launch the playground on your browser.
5. (Optional) To enable live code completions, in the Jupyter Lab Interface, go
to "Settings" "Advanced Settings Editor" "Code Completion". In the "User
Preferences" section, add the following:
```
{
"continuousHinting": true,
"showDocumentation": true,
"theme": 'material'
}
```
Now, when you type, it should auto complete functions/objects/etc.
For more details, go to the
[Python LSP](https://github.com/jupyter-lsp/jupyterlab-lsp) page.
### Cloud Hosted
A pre-built version of the REPL playground is made available through the cloud.
This is ideal if you're new to the REPL and want to try it out without having to
follow the build and launch instructions below. You can also use this to
prototype various bits of logic in Python as well as interact with
all-clusters-app from a browser.
The playground can be accessed [here](http://35.236.121.59/).
> **NOTE:** You have to create a user ID when accessing the above for the first
> time (password can be blank). That creates a sandboxed environment for you to
> play in. There-after, you'll always be re-directed straight to the Jupyter Lab
> landing page.
> **NOTE:** The sandbox is temporary. After an hour of inactivity, the sandbox
> is deleted and your saved contents will be lost.
For more information on Jupyter Lab, check out
[these](https://jupyterlab.readthedocs.io/en/stable/user/interface.html) docs.
### IPython REPL
Going through the above isn't terribly useful, since all you'll be able to do is
launch the REPL environment itself through the IPython shell.
To launch the IPython REPL, launch "matter-env" from the "Console" tab in the
Launcher.
### Guide Notebooks
A number of Jupyter Notebooks have been written that serve as both guides for
interacting with the REPL _as well as_ being launchable directly into the
cloud-hosted playground.
The following icon is present at the top of applicable guides that can be
launched into the playground:
![Launch playground icon](https://i.ibb.co/hR3yWsC/launch-playground.png")
<br></br>
## Guides
[REPL Basics](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_REPL_Intro.ipynb)
[Using the IM](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_Basic_Interactions.ipynb)
[Multi Fabric Commissioning](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_Multi_Fabric_Commissioning.ipynb)
[Access Control](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_Access_Control.ipynb)
## Testing
We also provide `mobile-device-test.py` for testing your accessories, you can
run it manually or using a wrapper script.
### Usage
mobile-device-test.py provides the following options for running the tests:
```
--controller-nodeid INTEGER NodeId of the controller.
--device-nodeid INTEGER NodeId of the device.
-a, --address TEXT Skip commissionee discovery, commission the
device with the IP directly.
-t, --timeout INTEGER The program will return with timeout after
specified seconds.
--discriminator INTEGER Discriminator of the device.
--setup-pin INTEGER Setup pincode of the device.
--enable-test TEXT The tests to be executed. By default, all
tests will be executed, use this option to
run a specific set of tests. Use --print-
test-list for a list of applicable tests.
--disable-test TEXT The tests to be excluded from the set of
enabled tests. Use --print-test-list for a
list of applicable tests.
--log-level [ERROR|WARN|INFO|DEBUG]
The log level of the test.
--log-format TEXT Override logging format
--print-test-list Print a list of test cases and test sets
that can be toggled via --enable-test and
--disable-test, then exit
--help Show this message and exit.
```
By default, all tests will be executed, however, you can exclude one or more
tests or only include a few tests if you want.
For example, if you are working for commissioning, then you may want to exclude
the data model test cases by adding `--disable-test datamodel` to disable all
data model tests.
Some tests provides the option to exclude them. For example, you can use
`--disable-test ClusterObjectTests.TestTimedRequestTimeout` to exclude the
"TestTimedRequestTimeout" test case.
It is recommended to use the test wrapper to run mobile-device-test.py, for
example, you can run:
```
./scripts/tests/run_python_test.py --app chip-all-clusters-app --factoryreset
```
It provides some extra options, for example:
```
optional arguments:
-h, --help show this help message and exit
--app APP Path to local application to use, omit to use external apps.
--factoryreset Remove app config and repl configs (/tmp/chip* and /tmp/repl*) before running the tests.
--app-args APP_ARGS The extra parameters passed to the device side app.
--script SCRIPT Path to the test script to use, omit to use the default test script (mobile-device-test.py).
--script-args SCRIPT_ARGS Arguments for the REPL test script
```
You can pass your own flags for mobile-device-test.py by appending them to the
command line with two dashes, for example:
```
./scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-no-ble-no-wifi-tsan-clang/chip-all-clusters-app --factoryreset --script-args "-t 90 --disable-test ClusterObjectTests.TestTimedRequestTimeout"
```
will pass `-t 90 --disable-test ClusterObjectTests.TestTimedRequestTimeout` to
`mobile-device-test.py`