Skip to content

Commit

Permalink
Update esp-matter, Matter SDK and add debug example (#7)
Browse files Browse the repository at this point in the history
* Update esp-matter and Matter SDK, add new examples

* Update README.md
  • Loading branch information
Yacubane committed Dec 7, 2022
1 parent ee0fb90 commit 67177c5
Show file tree
Hide file tree
Showing 59 changed files with 1,442 additions and 1,955 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,23 @@ This projects aims at possibility to easily launch Matter internet-of-things pro
5. Run example sketch

## Example usage
Please look at [examples](https://github.com/jakubdybczak/esp32-arduino-matter/tree/master/examples). You can test integration with Android and Matter controller by downloading compiled [CHIPTool](https://drive.google.com/drive/folders/1NXqfbRzBQRWCH4VWJQwQSO6KKYeIH7VK) for Android.
Please look at [examples](https://github.com/jakubdybczak/esp32-arduino-matter/tree/master/examples).

## Limitations
* Library only works on base ESP32 (with experimental support for ESP32-S3, ESP32-C3).
* There is no possibility to change vendor/product ID as this value is pre-compiled.
* There is no known possibility to change setup PIN.
* This library comes with precompiled NimBLE, because default Bluedroid shipped with arduino-esp32 takes too much RAM memory.
* As of 06 Nov 2022, this library does not work with Google Home as this app is compatible with older version of Matter. You can test this library with CHIPTool.
* Matter Controllers such as Apple Home, Google Home, Smarthings and other might not have full support of all device types.

## Versions
This project is currently build based on these projects:

| Project | Tag/Commit Hash |
| ------------- | ------------- |
| [Espressif's esp-idf](https://github.com/espressif/esp-idf) | 4.4.2</br>Arduino IDE ESP32 board @ 2.0.5</br>PlatformIO espressif platform @ 5.2.0 |
| [Espressif's SDK for Matter](https://github.com/espressif/esp-matter) | e7c70721 |
| [Matter](https://github.com/project-chip/connectedhomeip) | 87bee4de |
| [Espressif's SDK for Matter](https://github.com/espressif/esp-matter) | a0f13786 |
| [Matter](https://github.com/project-chip/connectedhomeip) | 7c2353bb |

## Enabling C++17 on Arduino IDE
1. Find `platform.txt` for ESP32 board. Location of this file is platform depended.
Expand All @@ -52,4 +52,4 @@ This project is currently build based on these projects:
Please look [here](https://github.com/jakubdybczak/esp32-arduino-matter-builder).

## Future and possibilities
* Creating more user-friendly wrapper API.
* Creating more user-friendly wrapper API.
140 changes: 140 additions & 0 deletions examples/Debug/Debug.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
#include "Matter.h"
#include <app/server/OnboardingCodesUtil.h>
using namespace chip;
using namespace chip::app::Clusters;
using namespace esp_matter;
using namespace esp_matter::endpoint;

/**
This program presents example many Matter devices and should be used only
for debug purposes (for example checking which devices types are supported)
Keep in mind that it IS NOT POSSIBLE to run all those endpoints due to
out of memory. There is need to manually comment out endpoints!
Running about 4-5 endpoints at the same time should work.
*/

static void on_device_event(const ChipDeviceEvent *event, intptr_t arg) {}
static esp_err_t on_identification(identification::callback_type_t type, uint16_t endpoint_id,
uint8_t effect_id, void *priv_data) {
return ESP_OK;
}

static esp_err_t on_attribute_update(attribute::callback_type_t type, uint16_t endpoint_id, uint32_t cluster_id,
uint32_t attribute_id, esp_matter_attr_val_t *val, void *priv_data) {
if (type == attribute::PRE_UPDATE) {
Serial.print("Update on endpoint: ");
Serial.print(endpoint_id);
Serial.print(" cluster: ");
Serial.print(cluster_id);
Serial.print(" attribute: ");
Serial.println(attribute_id);
}
return ESP_OK;
}

void print_endpoint_info(String clusterName, endpoint_t *endpoint) {
uint16_t endpoint_id = endpoint::get_id(endpoint);
Serial.print(clusterName);
Serial.print(" has endpoint: ");
Serial.println(endpoint_id);
}

void setup() {
Serial.begin(115200);

esp_log_level_set("*", ESP_LOG_DEBUG);

node::config_t node_config;
node_t *node = node::create(&node_config, on_attribute_update, on_identification);

endpoint_t *endpoint;
cluster_t *cluster;

// !!!
// USE ONLY ABOUT 4 ENDPOINTS TO AVOID OUT OF MEMORY ERRORS
// !!!

on_off_light::config_t light_config;
endpoint = on_off_light::create(node, &light_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("on_off_light", endpoint);

dimmable_light::config_t dimmable_light_config;
endpoint = dimmable_light::create(node, &dimmable_light_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("dimmable_light", endpoint);

color_temperature_light::config_t color_temperature_light_config;
endpoint = color_temperature_light::create(node, &color_temperature_light_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("color_temperature_light", endpoint);

extended_color_light::config_t extended_color_light_config;
endpoint = extended_color_light::create(node, &extended_color_light_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("extended_color_light", endpoint);

generic_switch::config_t generic_switch_config;
generic_switch_config.switch_cluster.current_position = 1;
generic_switch_config.switch_cluster.number_of_positions = 3;
endpoint = generic_switch::create(node, &generic_switch_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("generic_switch", endpoint);

on_off_plugin_unit::config_t on_off_plugin_unit_config;
on_off_plugin_unit_config.on_off.on_off = true;
endpoint = on_off_plugin_unit::create(node, &on_off_plugin_unit_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("on_off_plugin_unit", endpoint);

dimmable_plugin_unit::config_t dimmable_plugin_unit_config;
endpoint = dimmable_plugin_unit::create(node, &dimmable_plugin_unit_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("dimmable_plugin_unit", endpoint);

fan::config_t fan_config;
endpoint = fan::create(node, &fan_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("fan", endpoint);

thermostat::config_t thermostat_config;
thermostat_config.thermostat.local_temperature = 19;
endpoint = thermostat::create(node, &thermostat_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("thermostat", endpoint);

door_lock::config_t door_lock_config;
door_lock_config.door_lock.lock_state = 1;
endpoint = door_lock::create(node, &door_lock_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("door_lock", endpoint);

window_covering_device::config_t window_covering_device_config;
endpoint = window_covering_device::create(node, &window_covering_device_config, ENDPOINT_FLAG_NONE, NULL);
cluster = cluster::get(endpoint, WindowCovering::Id);
cluster::window_covering::feature::lift::config_t lift;
cluster::window_covering::feature::tilt::config_t tilt;
cluster::window_covering::feature::position_aware_lift::config_t position_aware_lift;
cluster::window_covering::feature::position_aware_tilt::config_t position_aware_tilt;
cluster::window_covering::feature::absolute_position::config_t absolute_position;
cluster::window_covering::feature::lift::add(cluster, &lift);
cluster::window_covering::feature::tilt::add(cluster, &tilt);
cluster::window_covering::feature::position_aware_lift::add(cluster, &position_aware_lift);
cluster::window_covering::feature::position_aware_tilt::add(cluster, &position_aware_tilt);
cluster::window_covering::feature::absolute_position::add(cluster, &absolute_position);
print_endpoint_info("window_covering_device", endpoint);

temperature_sensor::config_t temperature_sensor_config;
temperature_sensor_config.temperature_measurement.measured_value = 22;
endpoint = temperature_sensor::create(node, &temperature_sensor_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("temperature_sensor", endpoint);

occupancy_sensor::config_t occupancy_sensor_config;
occupancy_sensor_config.occupancy_sensing.occupancy = 1;
endpoint = occupancy_sensor::create(node, &occupancy_sensor_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("occupancy_sensor", endpoint);

contact_sensor::config_t contact_sensor_config;
contact_sensor_config.boolean_state.state_value = true;
endpoint = contact_sensor::create(node, &contact_sensor_config, ENDPOINT_FLAG_NONE, NULL);
print_endpoint_info("contact_sensor", endpoint);

esp_matter::start(on_device_event);

PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
}

void loop() {

}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ attribute_t *attribute_ref_1;
attribute_t *attribute_ref_2;

// There is possibility to listen for various device events, related for example
// to setup process Leaved as empty for simplicity
// to setup process. Leaved as empty for simplicity.
static void on_device_event(const ChipDeviceEvent *event, intptr_t arg) {}
static esp_err_t on_identification(identification::callback_type_t type,
uint16_t endpoint_id, uint8_t effect_id,
Expand Down Expand Up @@ -88,8 +88,7 @@ void setup() {
endpoint_t *endpoint_2 = on_off_plugin_unit::create(node, &plugin_unit_config,
ENDPOINT_FLAG_NONE, NULL);

// Save on/off attribute reference. It will be used to read attribute value
// later.
// Save on/off attribute reference. It will be used to read attribute value later.
attribute_ref_1 =
attribute::get(cluster::get(endpoint_1, CLUSTER_ID), ATTRIBUTE_ID);
attribute_ref_2 =
Expand Down Expand Up @@ -139,4 +138,4 @@ void loop() {
set_onoff_attribute_value(&onoff_value, plugin_unit_endpoint_id_2);
}
}
}
}
1 change: 1 addition & 0 deletions src/ConfigurationManagerImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImp
CHIP_ERROR GetProductLabel(char * buf, size_t bufSize) override;
CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize);
CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override;
CHIP_ERROR GetLocationCapability(uint8_t & location) override;
static ConfigurationManagerImpl & GetDefaultInstance();

private:
Expand Down
1 change: 1 addition & 0 deletions src/ESP32Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ class ESP32Config
static const Key kConfigKey_SupportedCalTypes;
static const Key kConfigKey_SupportedLocaleSize;
static const Key kConfigKey_RotatingDevIdUniqueId;
static const Key kConfigKey_LocationCapability;

// CHIP Config keys
static const Key kConfigKey_ServiceConfig;
Expand Down
Loading

0 comments on commit 67177c5

Please sign in to comment.