# CHIP Ameba All Clusters Example

A prototype application that demonstrates device commissioning and cluster
control.

---

-   [CHIP Ameba All Clusters Example](#chip-ameba-all-clusters-example)
    -   [Supported Device](#supported-device)
    -   [Building the Example Application](#building-the-example-application)
    -   [Commissioning and cluster control](#commissioning-and-cluster-control)
        -   [Commissioning](#commissioning)
            -   [BLE mode](#ble-mode)
            -   [IP mode](#ip-mode)
        -   [Cluster control](#cluster-control)
    -   [Running RPC Console](#running-rpc-console)

---

## Supported Device

The CHIP demo application is supported on
[Ameba RTL8722DM Board](https://www.amebaiot.com/en/amebad).

## Building the Example Application

-   Pull docker image:

          ```
          $ docker pull connectedhomeip/chip-build-ameba:latest
          ```

-   Run docker container:

          ```
          $ docker run -it -v ${CHIP_DIR}:/root/chip connectedhomeip/chip-build-ameba:latest
          ```

-   Setup build environment:

          ```
          $ source ./scripts/bootstrap.sh
          ```

-   To build the demo application:

          ```
          $ ./scripts/build/build_examples.py --target ameba-amebad-all-clusters build
          ```

    The output image files are stored in
    `out/ameba-amebad-all-clusters/asdk/image` folder.

    The bootloader image files are stored in
    `out/ameba-amebad-all-clusters/asdk/bootloader` folder.

-   After building the application, **Ameba Image Tool** is used to flash it to
    Ameba board.

1. Connect your device via USB and open Ameba Image Tool.
2. Select correct serial port and set baudrate as **115200**.
3. Browse and add the corresponding image files in the Flash Download list to
   the correct locations
4. Click **Download** button.

## Commissioning and Cluster Control

## Commissioning

There are two commissioning modes supported by Ameba platform:

### BLE mode

1. In "connectedhomeip/config/ameba/args.gni"

    - Set `chip_config_network_layer_ble = true`

2. In `connectedhomeip/src/platform/Ameba/CHIPDevicePlatformConfig.h`

    - Set `#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1`

3. Build and Flash
4. The all-clusters example will run automatically after booting the Ameba
   board.
5. Test with
   [Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool)

### IP mode

1. In `connectedhomeip/config/ameba/args.gni`

    - Set `chip_config_network_layer_ble = false`

2. In `connectedhomeip/src/platform/Ameba/CHIPDevicePlatformConfig.h`

    - Set `#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 0`

3. Build and Flash
4. The all-clusters example will run automatically after booting the Ameba
   board.
5. Connect to AP using `ATW0, ATW1, ATWC` commands
6. Test with
   [Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool)

## Cluster Control

After successful commissioning, use the OnOff cluster command to control the
OnOff attribute. This allows you to toggle a parameter implemented by the device
to be On or Off.

-   Via
    [Chip-Tool](https://github.com/project-chip/connectedhomeip/tree/master/examples/chip-tool#using-the-client-to-send-matter-commands)

          ```
          $ ./chip-tool onoff on ${NODE_ID_TO_ASSIGN} 1
          $ ./chip-tool onoff off ${NODE_ID_TO_ASSIGN} 1
          ```

## Running RPC Console

-   Connect a USB-TTL Adapter as shown below

            ```
            Ameba         USB-TTL
            A19           TX
            A18           RX
            GND           GND
            ```

-   Build the
    [chip-rpc console](https://github.com/project-chip/connectedhomeip/tree/master/examples/common/pigweed/rpc_console)

-   As part of building the example with RPCs enabled the chip_rpc python
    interactive console is installed into your venv. The python wheel files are
    also created in the output folder: out/debug/chip_rpc_console_wheels. To
    install the wheel files without rebuilding:

            ```
            $ pip3 install out/debug/chip_rpc_console_wheels/*.whl
            ```

-   Launch the chip-rpc console after resetting Ameba board

            ```
            $ chip-console --device /dev/tty<port connected to USB-TTL adapter> -b 115200
            ```

-   Get and Set lighting directly using the RPC console

            ```python
            rpcs.chip.rpc.Lighting.Get()
            rpcs.chip.rpc.Lighting.Set(on=True, level=128, color=protos.chip.rpc.LightingColor(hue=5, saturation=5))
            ```
