5 Commits

Author SHA1 Message Date
Tony 2d55d7f9d1 Add Matter DALI support and enhance IPv6 handling
This commit fix DALI feedback on matter bridge.

- Introduced MatterLevelFeedback structure to manage DALI level feedback.
- Implemented MapDaliLevelToMatter function to map DALI levels to Matter states.
- Added MatterDaliAction and ResolveMatterDaliAction for handling DALI actions.
- Created MatterColorTemperatureWritePlan and ResolveMatterColorTemperatureWrites for color temperature management.
- Enhanced GatewayMatterBridge to handle DALI commands and transitions, including a new command task for processing DALI actions.
- Implemented factory reset functionality for clearing Matter-related NVS namespaces.
- Improved GatewayNetworkService to refresh Matter IPv6 addresses upon network events and ensure proper link-local address promotion.
- Added tests for new functionalities in gateway_matter_plan_test.cpp to validate DALI level mapping and action resolution.

Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-08-09 07:06:20 +08:00
Tony ca9e95e985 feat(gateway): Add Matter factory data handling and restart functionality
Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-08-08 09:23:06 +08:00
Tony 8505958b65 Implement Matter Endpoint Plan Logic and Unit Tests
- Added `gateway_matter_plan.cpp` to define the logic for building Matter endpoint plans, including functions for inferring capabilities and managing allocations based on channel configurations.
- Introduced helper functions to determine the type of Matter endpoints and color methods based on device capabilities.
- Created `gateway_matter_plan_test.cpp` to validate the functionality of the endpoint plan logic with various test cases, ensuring correct behavior for different configurations and address handling.

Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-08-08 08:36:42 +08:00
Tony bb3e9178fb feat(gateway_ble): Enhance BLE bridge with shared NimBLE support
This commit fixed BLE gateway coexistance with matter

- Added support for shared NimBLE functionality in the GatewayBleBridge class.
- Introduced methods for preparing and attaching shared NimBLE.
- Implemented advertising change handling for Matter integration.
- Updated CMakeLists.txt to require esp_matter.
- Enhanced device name refresh logic to accommodate shared BLE responses.
- Added new member variables to manage shared state and advertising status.

feat(gateway_matter): Integrate BLE callbacks for shared functionality

- Added BLE prepare and attach callbacks to GatewayMatterBridgeConfig.
- Implemented callback invocations during the start process of GatewayMatterBridge.
- Added handling for BLE advertising change events in MatterEvent.

fix(gateway_network): Guard against missing SoftAP support

- Added compile-time checks to ensure SoftAP support is enabled before starting setup AP.

Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-08-08 03:17:05 +08:00
Tony 091079ab84 feat(gateway): Implement Matter-to-DALI bridge functionality
- Added support for Matter protocol in the gateway, enabling integration with DALI devices.
- Introduced new configuration options in sdkconfig.defaults for Matter bridge settings.
- Created CMakeLists.txt and idf_component.yml for the new gateway_matter component.
- Developed GatewayMatterBridge class to manage DALI device bindings and Matter interactions.
- Implemented methods for scanning DALI devices, handling attribute updates, and managing provisioning.
- Enhanced GatewayNetworkService to support Wi-Fi provisioning and select preferred network routes.

Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-08-02 10:02:56 +08:00
29 changed files with 5810 additions and 99 deletions
+147
View File
@@ -21,6 +21,7 @@ update as the project evolves:
- `gateway_ble/`: NimBLE GATT bridge for BLE transport parity on `FFF1`/`FFF2`/`FFF3`, including raw DALI notifications.
- `gateway_controller/`: Lua-compatible gateway command dispatcher, internal scene/group state, and notification fan-out.
- `gateway_network/`: HTTP `/info`, `/dali/cmd`, `/led/1`, `/led/0`, `/jq.js`, UDP port `2020` command/notify routing, Wi-Fi STA lifecycle, W5500 SPI Ethernet startup/teardown, ESP-Touch smartconfig, setup AP mode, ESP-NOW setup ingress, setup AP GPIO handling, and optional Wi-Fi reset GPIO handling for the native gateway.
- `gateway_matter/`: ESP-Matter 1.5.1 adapter that discovers DALI control gear, persists endpoint bindings in normal NVS, and exposes supported DALI lighting behavior through dynamic Matter endpoints.
- `gateway_runtime/`: persistent runtime state, command queueing, and device info services.
- `gateway_485_control/`: optional 485 control bridge at `9600 8N1`; disabled by default because UART0 must be moved off the ESP-IDF console first. C++ gateway commands on this raw multi-client bus use the session-scoped frame described below.
- `gateway_usb_setup/`: optional USB Serial/JTAG setup bridge; disabled by default so USB remains available for debug at boot.
@@ -93,6 +94,40 @@ gateway id: operation `0x00` reads the group and operation `0x01` writes group
## Ethernet control
Ethernet is the preferred default route whenever the W5500 has an address.
Wi-Fi remains a fallback; the gateway does not start Wi-Fi provisioning at
startup. `GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO` defaults to `-1`; assigning
a GPIO allows a long press to start ESP-Touch SmartConfig and reopen the Matter
commissioning window. The long-press duration and active level are configurable
beside the GPIO in `main/Kconfig.projbuild`.
The gateway creates an IPv6 link-local address whenever Ethernet or Wi-Fi joins
the link and enables IPv6 router-advertisement autoconfiguration. This is part
of the custom network owner rather than ESP-Matter's network commissioning
driver. Because the W5500 link can become usable after CHIP starts, the network
owner waits for the preferred link-local address and re-announces it after
CHIP's event handler is ready, and repeats that recovery after reconnects. The
resulting `IP_EVENT_GOT_IP6` event lets Apple Home and other Matter controllers
establish their normal operational CASE sessions after the commissioning
connection closes.
If a W5500 link leaves its deterministic MAC-derived link-local address in the
tentative state, the refresh task allows normal duplicate-address detection to
settle first and then promotes that address through ESP-IDF's public IPv6 API.
This keeps the operational CASE step reachable instead of allowing BLE/PASE and
NOC installation to succeed only for Apple Home to roll the temporary fabric
back when operational discovery times out.
Matter attribute callbacks never wait for physical DALI frames. On/off, level,
color-temperature, XY, and hue/saturation changes are coalesced by a dedicated
internal-RAM command task, which keeps CHIP acknowledgements and subscription
feedback responsive while a DALI transaction is in flight. Transition updates
from `MoveToColorTemperature` are collapsed at command ingress: the Matter
attribute transition and reports continue normally, while DALI receives the
final physical target once instead of every intermediate step. Native DT8
color-temperature endpoints send only the Tc sequence; the longer RGBWAF
sequence is reserved for extended-color endpoints whose configured physical
method requires it.
The network service accepts Lua-style raw gateway frames on UDP port `2020` and,
when enabled, TCP port `2020`. It also accepts JSON control frames on the same
ports:
@@ -112,6 +147,118 @@ Raw UDP, raw TCP, and UART0 session control all expand gateway target `255` to
all physical gateway ids and targets `128..254` to channels whose configured
gateway group matches the target.
## Matter-to-DALI development bridge
`GATEWAY_MATTER_SUPPORTED` enables the Matter bridge by default. It creates one
aggregator and owns a pool of 32 bridged DALI endpoints. ESP-Matter is configured
for 34 dynamic entries: the root, the aggregator, and the 32-slot DALI pool.
Every enabled channel receives a broadcast endpoint first, then cached non-empty
groups (including manually retained empty groups), explicitly included short
addresses, and automatic online short addresses in ascending order. Allocation
stops at 32 and reports every dropped target; this means the highest automatic
short addresses are removed first. Broadcast and group targets cannot be
disabled. On a single DALI channel, the pool can therefore retain broadcast,
all 16 groups, and 15 direct addresses when every group is present.
The portable DALI cache persists device-type masks and DT8 color-feature bits in
addition to group, scene, settings, and runtime state. The planner infers the
highest required multi-target capability in the order color, color temperature,
dimmer, then switch. DT8 feature bits select XY, RGBCW, or both. Per-channel
versioned configuration is stored in normal NVS by fixed channel index and can
override the automatic short-address policy, sparse direct-address inclusion,
and each broadcast/group type and color method. Existing direct-only bindings
are migrated to stable channel-index plus target-kind bindings. Reconciliation
retains unchanged endpoints and recreates one only when its Matter device type
changes.
Matter On/Off, Level Control, Color Control (mirek, XY, and hue/saturation
converted to equivalent DALI writes), Groups, Scenes, and Identify are the
only application clusters retained. Root-node commissioning, credentials,
descriptor, access-control, diagnostics, and the ESP-Matter internal Binding
manager are retained because the server requires them; unrelated device-type
clusters, Thread, OTA, and the Matter shell are excluded.
The checked-in ESP32-S3 profile uses only ESP-IDF 5.5.4-supported PSRAM paths:
CHIP, ESP-Matter, mDNS, TLS, NVS cache, Wi-Fi/lwIP allocations, and eligible BSS
prefer external RAM. The mDNS task and gateway-owned BACnet and on-demand DALI
operation stacks can use PSRAM with internal-RAM fallback. Tasks that write NVS,
change network settings, run the DALI PHY, or have timing/DMA constraints remain
in internal RAM; in particular, the Matter DALI scan stack stays internal because
the scan commits its discovered capabilities. Eligible non-ISR FreeRTOS code is
placed in flash to leave internal RAM headroom. This selective policy does not depend on
the unreleased global `FREERTOS_PLACE_TASK_STACKS_IN_EXT_RAM` option. Wi-Fi IRAM
throughput optimizations are disabled because Ethernet is the preferred data
path and Wi-Fi is retained as a provisioning and fallback path.
CHIP owns the single NimBLE controller and host while Matter is enabled. The
legacy `gateway_ble` transport registers its distinct FFF7 service in CHIP's
GATT database through ESP-Matter's extra-service hook, and adds the FFF7 UUID plus
gateway name to the Matter scan response. A passive GAP listener tracks gateway
subscriptions without replacing CHIP's callbacks. Matter commissioning
advertising and gateway BLE therefore coexist; after Matter advertising stops,
the gateway continues advertising from the same host. CHIP's BLE endpoint pool
matches NimBLE's four-connection capacity so a gateway client does not make
Matter commissioning advertising non-connectable. NimBLE also publishes the
standard GATT Database Hash so clients can invalidate the former standalone
gateway attribute table after firmware updates. USB, Ethernet, Wi-Fi,
KNX, Modbus, BACnet, and the portable DALI behavior remain in their existing
components. ESP-Matter's Ethernet platform path is compiled so
CHIP receives Ethernet address events, while its Ethernet Network Commissioning
driver stays disabled because wired Ethernet needs no credentials.
`CONFIG_CUSTOM_NETWORK_CONFIG` removes the root-node Network Commissioning
cluster and CHIP's Wi-Fi station platform. The gateway's station-only ESP-Touch
SmartConfig path starts only through the configured long-press button; it is
disabled at startup, and SoftAP support is compiled out. When both interfaces
have addresses, `gateway_network` selects Ethernet as the default route. The
project build also omits ESP-Matter's unused network-commissioning integration
source because the ESP32-S3 gateway's W5500 and Wi-Fi lifecycles remain owned by
`gateway_network`.
This configuration is development-only. The ESP-Matter factory, device
instance, DAC, and commissionable-data providers read the normal `nvs`
partition. Flash encryption, NVS encryption, and secure boot remain disabled
so credentials and state are visible during debugging. DaliMaster's ESP burner
uses the local `packages/matter_mfg_tool` package to generate a fresh P-256 test
DAC and ESP-IDF NVS v2 image, then inserts it at `0x9000`. The package hardcodes
the ESP-Matter test PAI signing key/certificate and Certification Declaration;
it does not invoke an external manufacturing executable. The burner reads a selected partition-table image
at `0x8000` and fills the declared normal NVS size (`0x14000` in the checked-in
4 MiB profile or `0x6000` in the 16 MiB default layout) so stale NVS pages are
erased. Each image contains the test VID/PID `FFF2/8001`, its unique test DAC
private key/certificate, PAI, certification declaration, passcode `20202021`,
and discriminator `3840`. Flashing that image replaces all existing normal NVS
data and must never be used for production hardware.
DaliMaster's Matter Gateway page uses the transport-independent bridge action
surface to read live Matter state, open or close the five-minute commissioning
window, configure endpoints, and rescan DALI control gear. `matter_status`
returns schema version, effective 32-slot capacity, candidates, saved
configuration, active and dropped allocations, target kind/address, inferred or
manual source, and the last partial-apply error. `matter_onboarding` returns the
live serial number, VID/PID, QR payload, and manual pairing code from the active
ESP-Matter factory providers; controllers must treat this response as sensitive
and DaliMaster keeps it only in page memory. `matter_config` applies a selected
channel patch, while `matter_config_reset` restores automatic selection.
`matter_open_commissioning`, `matter_close_commissioning`, `matter_rescan`,
`matter_config`, and `matter_config_reset` are POST actions. The development-only
`matter_factory_data` action validates and writes a compact test-factory payload
into `chip-factory` without erasing unrelated NVS state. It accepts only the
fixed `FFF2/8001` Matter Test PAA profile, verifies the embedded PAI and
Certification Declaration fingerprints, and verifies the DAC signature and
certificate SHA-256 before committing the DAC/private/public keys, PAI,
Certification Declaration, SPAKE2+ data, and device identity. Its response reports
`factoryData.restartRequired`; `matter_restart` schedules a delayed reboot so
the transport can deliver its response before ESP-Matter reloads the providers.
The confirmed `matter_factory_reset` action clears fabrics, operational
sessions, subscriptions, Matter attributes/counters, ESP-Matter bridge records,
and DaliMaster Matter endpoint bindings/configuration, then restarts. It erases
only runtime namespaces and deliberately preserves `chip-factory`, including
the DAC/private key, PAI, Certification Declaration, SPAKE2+ data, and device
identity.
These actions are available through the active
BLE/USB/IP/KNX/cloud bridge transport as well as the local HTTP `/bridge`
endpoint, so Matter setup does not require a working IP profile.
## Gateway operation protocol
Opcode `0x67` starts, aborts, and polls gateway-executed high-level DALI
+45 -1
View File
@@ -11,4 +11,48 @@ set(EXTRA_COMPONENT_DIRS
)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(gateway_app)
project(gateway_app)
# CHIP defaults its BLE endpoint pool to one even when NimBLE accepts more
# connections. The gateway service consumes a GAP connection without creating
# a CHIPoBLE endpoint, but CHIP still counts that connection when deciding
# whether commissioning advertising can remain connectable. Keep both targets
# on the same four-connection capacity so Matter and one gateway client can be
# active together.
if(CONFIG_GATEWAY_MATTER_SUPPORTED AND CONFIG_ENABLE_CHIPOBLE)
idf_component_get_property(esp_matter_lib espressif__esp_matter COMPONENT_LIB)
idf_component_get_property(gateway_ble_lib gateway_ble COMPONENT_LIB)
target_compile_definitions(
${esp_matter_lib} PRIVATE
BLE_LAYER_NUM_BLE_ENDPOINTS=${CONFIG_BT_NIMBLE_MAX_CONNECTIONS})
target_compile_definitions(
${gateway_ble_lib} PRIVATE
BLE_LAYER_NUM_BLE_ENDPOINTS=${CONFIG_BT_NIMBLE_MAX_CONNECTIONS})
endif()
# CONFIG_ENABLE_ETHERNET_TELEMETRY is ESP-Matter's switch for the CHIP
# Ethernet connectivity implementation. Its component also compiles the
# internal-EMAC commissioning driver unconditionally, even when that driver is
# disabled. ESP32-S3 has no internal EMAC and this gateway already owns its
# W5500, so omit only that unused source from the managed component target.
if(CONFIG_ENABLE_ETHERNET_TELEMETRY AND
NOT CONFIG_ETHERNET_NETWORK_COMMISSIONING_DRIVER)
idf_component_get_property(esp_matter_lib espressif__esp_matter COMPONENT_LIB)
get_target_property(esp_matter_sources ${esp_matter_lib} SOURCES)
list(FILTER esp_matter_sources EXCLUDE REGEX
"/NetworkCommissioningDriver_Ethernet\\.cpp$")
set_property(TARGET ${esp_matter_lib} PROPERTY SOURCES ${esp_matter_sources})
endif()
# ESP-Matter 1.5.1 still compiles this integration unit when
# CONFIG_CUSTOM_NETWORK_CONFIG has removed the Network Commissioning cluster.
# The unused unit then rejects a configuration with no CHIP commissioning
# driver. The gateway commissions Wi-Fi out-of-band via its long-press
# SmartConfig path, so omit the integration together with the cluster.
if(CONFIG_CUSTOM_NETWORK_CONFIG)
idf_component_get_property(esp_matter_lib espressif__esp_matter COMPONENT_LIB)
get_target_property(esp_matter_sources ${esp_matter_lib} SOURCES)
list(FILTER esp_matter_sources EXCLUDE REGEX
"/network_commissioning_integration\\.cpp$")
set_property(TARGET ${esp_matter_lib} PROPERTY SOURCES ${esp_matter_sources})
endif()
+354 -1
View File
@@ -1,4 +1,15 @@
dependencies:
espressif/cbor:
component_hash:
dad9ca860963e930366510a10b422b3125a4fb27b979712ed65efcbcd742de50
dependencies:
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com
type: service
version: 0.6.1~4
espressif/cjson:
component_hash:
e788323270d90738662d66fffa910bfe1fba019bba087f01557e70c40485b469
@@ -10,6 +21,180 @@ dependencies:
registry_url: https://components.espressif.com/
type: service
version: 1.7.19~2
espressif/esp-serial-flasher:
component_hash:
dcc42a16712a1a636509cf0bf90e14032d7f2141784b533613b267b6aa318d52
dependencies: []
source:
registry_url: https://components.espressif.com
type: service
version: 0.0.11
espressif/esp_delta_ota:
component_hash:
147161b602ef51e9f6649eb6d90c4d4ac3c94228cb264fa0e68be7877180462d
dependencies:
- name: idf
require: private
version: '>=4.3'
source:
registry_url: https://components.espressif.com
type: service
version: 1.1.4
espressif/esp_diag_data_store:
component_hash:
1967397300fbea608f688f71365b298a613eed48b694ee236cc60e6d06fda086
dependencies:
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.1.1
espressif/esp_diagnostics:
component_hash:
f91cd5bd3d6a9be134d7196bdecd5336825ab3fa37eab482647b07a6dabaa842
dependencies:
- name: espressif/rmaker_common
registry_url: https://components.espressif.com
require: private
version: ^1.5
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.3.4
espressif/esp_encrypted_img:
component_hash:
e5a065c140fbc6a69a1de4fa1731b7596cc34a4a50b57913b2dc34c9ad3a0a70
dependencies:
- name: idf
require: private
version: '>=4.4'
source:
registry_url: https://components.espressif.com
type: service
version: 2.3.0
espressif/esp_insights:
component_hash:
102d0a141d5123a5ebb827832f73fcc4135aefed6c38fca98e7b655bd18735c5
dependencies:
- name: espressif/cbor
registry_url: https://components.espressif.com
require: private
version: ~0.6
- name: espressif/esp_diag_data_store
registry_url: https://components.espressif.com
require: private
version: ~1.1.1
- name: espressif/esp_diagnostics
registry_url: https://components.espressif.com
require: private
version: '>=1.3.0'
- name: espressif/rmaker_common
registry_url: https://components.espressif.com
require: private
version: ^1.5
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.3.4
espressif/esp_matter:
component_hash:
d7db95c3fdd162a3a378f48c11257ded9fcdc59d18caa58d936a2cac327d1796
dependencies:
- name: espressif/esp_delta_ota
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=4.3
version: ^1.1.0
- name: espressif/esp_encrypted_img
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=4.4
version: 2.3.0
- name: espressif/esp_hosted
registry_url: https://components.espressif.com
require: private
rules:
- if: target in [esp32p4]
version: ~2
- name: espressif/esp_insights
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=5.0
- if: target != esp32h2
version: ^1.2.4
- name: espressif/esp_rcp_update
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=5.0
version: ~1.3.0
- name: espressif/esp_secure_cert_mgr
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=4.3
version: ^2.5.0
- name: espressif/esp_wifi_remote
registry_url: https://components.espressif.com
require: private
rules:
- if: target in [esp32p4]
version: ^0.7.0
- name: espressif/json_generator
registry_url: https://components.espressif.com
require: private
version: ~1.1.0
- name: espressif/json_parser
registry_url: https://components.espressif.com
require: private
version: ~1.0.0
- name: espressif/mdns
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=5.0
version: ^1.1.0
source:
registry_url: https://components.espressif.com/
type: service
version: 1.5.1
espressif/esp_rcp_update:
component_hash:
37f535edd527a45faeaad649c0c56af36e5399074e52d83f0990fce466844dde
dependencies:
- name: espressif/esp-serial-flasher
registry_url: https://components.espressif.com
require: private
version: ~0.0.0
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com
type: service
version: 1.3.1
espressif/esp_secure_cert_mgr:
component_hash:
0b83e150f48d6839f0a0a8753850be55a51cc298cfca7658f21d355d5f41dd67
dependencies:
- name: idf
require: private
version: '>=4.3'
source:
registry_url: https://components.espressif.com
type: service
version: 2.9.3
espressif/esp_tinyusb:
component_hash:
9a73a76a6bc17907f6e523342ff6b1e440023e8aac2c11f4691212106ec24e66
@@ -31,6 +216,50 @@ dependencies:
- esp32h4
- esp32s31
version: 2.2.1
espressif/jsmn:
component_hash:
d80350c41bbaa827c98a25b6072df00884e72f54885996fab4a4f0aebce6b6c3
dependencies:
- name: idf
require: private
version: '>=4.3'
source:
registry_url: https://components.espressif.com
type: service
version: 1.1.0
espressif/json_generator:
component_hash:
45033e1c199b13f1c8c1b544fb7d4e2df6a8e3071ebdcb1b22582b61a7974ff2
dependencies: []
source:
registry_url: https://components.espressif.com
type: service
version: 1.1.2
espressif/json_parser:
component_hash:
d74b81729ad06ec11ff5eb5b1b0d7df1d00e6027fc11471f4b139c70dcf1b1e4
dependencies:
- name: espressif/jsmn
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=5.0
version: ~1.1
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.3
espressif/mdns:
component_hash:
e81ca7a7f53ea34e78274df054da692c272e1315572876b237b1748e267c013b
dependencies:
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com
type: service
version: 1.11.3
espressif/mqtt:
component_hash:
ffdad5659706b4dc14bc63f8eb73ef765efa015bf7e9adf71c813d52a2dc9342
@@ -42,6 +271,129 @@ dependencies:
registry_url: https://components.espressif.com/
type: service
version: 1.0.0
espressif/rmaker_cmd_resp:
component_hash:
343ccd5d3a2789ecb241f9de5ac7f67fc39db126c1af139116a20c9a6e3669f3
dependencies:
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.0
espressif/rmaker_common:
component_hash:
276ee0baf9552805bf66a3e34a19cf38df6f5a7b167c47bf215b7196e03ef1fc
dependencies:
- name: espressif/mqtt
registry_url: https://components.espressif.com
require: private
rules:
- if: idf_version >=6.0.0
version: '*'
- name: espressif/rmaker_cmd_resp
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: espressif/rmaker_common_events
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: espressif/rmaker_console
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: espressif/rmaker_system_ctrl
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: espressif/rmaker_time_sync
registry_url: https://components.espressif.com
require: private
version: ^1.0.2
- name: espressif/rmaker_work_queue
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.8.5
espressif/rmaker_common_events:
component_hash:
ced95feff88c368e6306ff67ff3696ac76a5273de9fe1f907a7c115d4370fe6e
dependencies:
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.0
espressif/rmaker_console:
component_hash:
24af13dad8da5ca7219203f7d6f37e888246d5adc8910ea3e018fac84492ab9b
dependencies:
- name: espressif/rmaker_system_ctrl
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: espressif/rmaker_time_sync
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.0
espressif/rmaker_system_ctrl:
component_hash:
b4208fbc7e99b30fb1d272cbd30e578327079a6495499d12fb466b6c2fc0d899
dependencies:
- name: espressif/rmaker_common_events
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.0
espressif/rmaker_time_sync:
component_hash:
5797d2fcd903cad6e9142981e1d0602d7b5efa2c9197a72da8d2e05be7ef568b
dependencies:
- name: espressif/rmaker_common_events
registry_url: https://components.espressif.com
require: private
version: ^1.0.0
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.2
espressif/rmaker_work_queue:
component_hash:
7d2a9ee4e0343eb36e1816e987dde7babe892b99873c8dc5bae15e647a0e4028
dependencies:
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.0
espressif/tinyusb:
component_hash:
a72b7d67472914ab76309340fd50d578b31e310963d45ad0f81144bde3314752
@@ -65,9 +417,10 @@ dependencies:
version: 5.5.4
direct_dependencies:
- espressif/cjson
- espressif/esp_matter
- espressif/esp_tinyusb
- espressif/mqtt
- idf
manifest_hash: f0d438b2b6a63a6d50fc9bb059765c7ee2a95c05ac2541c179e9064331c07f0e
manifest_hash: fb55a359d8a152f0d34963a4f2b6c07f2e0120e4dd222dab1d9a780b952fec48
target: esp32s3
version: 2.0.0
+1 -1
View File
@@ -1,6 +1,6 @@
idf_component_register(
SRCS "app_main.cpp"
REQUIRES gateway_core gateway_controller gateway_network gateway_bridge gateway_cache dali_domain gateway_runtime gateway_ble gateway_usb_setup gateway_tridonic_hid gateway_485_control gateway_knx log
REQUIRES gateway_core gateway_controller gateway_network gateway_bridge gateway_cache dali_domain gateway_runtime gateway_ble gateway_matter gateway_usb_setup gateway_tridonic_hid gateway_485_control gateway_knx log
)
set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17)
+81 -1
View File
@@ -1594,12 +1594,22 @@ config GATEWAY_DALI_BAUDRATE
config GATEWAY_CONTROLLER_TASK_STACK_SIZE
int "Gateway controller task stack bytes"
range 6144 24576
default 12288
default 10240
help
Stack used by the gateway command controller. BLE bridge transport
requests are decoded in this task and may execute JSON-heavy bridge
management actions such as KNX programming-mode changes.
config GATEWAY_PREFER_PSRAM_TASK_STACKS
bool "Prefer PSRAM for supported gateway task stacks"
depends on SPIRAM && FREERTOS_TASK_CREATE_ALLOW_EXT_MEM
default y
help
Moves only gateway tasks that do not write flash or require DMA-capable
stacks to PSRAM, with an internal-RAM fallback if PSRAM allocation
fails. Cache, settings, Matter scan, network configuration, DALI PHY,
and other flash- or timing-sensitive tasks remain in internal RAM.
endmenu
menu "Connectivity Startup"
@@ -1658,6 +1668,76 @@ config GATEWAY_START_SMARTCONFIG_ENABLED
help
Starts ESP-Touch provisioning at boot. Disabled by default so Wi-Fi stays off unless configured.
menu "Matter-to-DALI Bridge"
config GATEWAY_MATTER_SUPPORTED
bool "Enable ESP-Matter DALI bridge"
default y
help
Builds the development Matter bridge and dynamically binds discovered
DALI control gear. ESP-Matter owns NimBLE while this option is enabled,
so the legacy gateway BLE GATT transport is not started in this build.
config GATEWAY_MATTER_MAX_BRIDGED_DEVICES
int "Maximum bridged DALI endpoints"
depends on GATEWAY_MATTER_SUPPORTED
range 1 82
default 32
help
Limits bridged DALI broadcast, group, and short-address endpoints.
Matter root and aggregator endpoints are additional to this count. The
32-slot default fits broadcast plus all 16 DALI groups and leaves 15
automatic or explicitly included short-address endpoints.
config GATEWAY_MATTER_SCAN_START_DELAY_MS
int "DALI discovery startup delay ms"
depends on GATEWAY_MATTER_SUPPORTED
range 0 30000
default 2000
config GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS
int "Delay between discovered DALI addresses ms"
depends on GATEWAY_MATTER_SUPPORTED
range 0 1000
default 20
config GATEWAY_MATTER_SCAN_TASK_STACK_SIZE
int "Matter DALI scan task stack bytes"
depends on GATEWAY_MATTER_SUPPORTED
range 8192 32768
default 8192
help
This task performs NVS commits and therefore intentionally remains in
internal RAM even when supported gateway task stacks prefer PSRAM.
config GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO
int "Matter Wi-Fi provisioning button GPIO"
depends on GATEWAY_MATTER_SUPPORTED && GATEWAY_SMARTCONFIG_SUPPORTED
range -1 48
default -1
help
Long-press GPIO that starts Wi-Fi SmartConfig and reopens the Matter
commissioning window. Set to -1 to leave this development path disabled.
config GATEWAY_MATTER_WIFI_PROVISION_BUTTON_ACTIVE_LOW
bool "Matter Wi-Fi provisioning button is active low"
depends on GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO >= 0
default y
config GATEWAY_MATTER_WIFI_PROVISION_LONG_PRESS_MS
int "Matter Wi-Fi provisioning long press ms"
depends on GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO >= 0
range 1000 15000
default 5000
config GATEWAY_MATTER_BUTTON_TASK_STACK_SIZE
int "Matter provisioning button task stack bytes"
depends on GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO >= 0
range 3072 8192
default 4096
endmenu
config GATEWAY_SMARTCONFIG_TIMEOUT_SEC
int "ESP-Touch smartconfig timeout seconds"
depends on GATEWAY_SMARTCONFIG_SUPPORTED
+201 -3
View File
@@ -4,17 +4,21 @@
#include "gateway_cache.hpp"
#include "gateway_controller.hpp"
#include "gateway_core.hpp"
#include "gateway_matter.hpp"
#include "gateway_network.hpp"
#include "gateway_runtime.hpp"
#include "gateway_485_control.hpp"
#include "gateway_usb_setup.hpp"
#include "gateway_tridonic_hid.hpp"
#include "esp_heap_caps.h"
#include "esp_log.h"
#include "esp_system.h"
#include "sdkconfig.h"
#include <algorithm>
#include <array>
#include <atomic>
#include <cstdio>
#include <cstdint>
#include <memory>
@@ -74,6 +78,34 @@
#define CONFIG_GATEWAY_BUTTON_TASK_STACK_SIZE 8192
#endif
#ifndef CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO
#define CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO -1
#endif
#ifndef CONFIG_GATEWAY_MATTER_MAX_BRIDGED_DEVICES
#define CONFIG_GATEWAY_MATTER_MAX_BRIDGED_DEVICES 32
#endif
#ifndef CONFIG_GATEWAY_MATTER_SCAN_START_DELAY_MS
#define CONFIG_GATEWAY_MATTER_SCAN_START_DELAY_MS 2000
#endif
#ifndef CONFIG_GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS
#define CONFIG_GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS 20
#endif
#ifndef CONFIG_GATEWAY_MATTER_SCAN_TASK_STACK_SIZE
#define CONFIG_GATEWAY_MATTER_SCAN_TASK_STACK_SIZE 8192
#endif
#ifndef CONFIG_GATEWAY_MATTER_WIFI_PROVISION_LONG_PRESS_MS
#define CONFIG_GATEWAY_MATTER_WIFI_PROVISION_LONG_PRESS_MS 5000
#endif
#ifndef CONFIG_GATEWAY_MATTER_BUTTON_TASK_STACK_SIZE
#define CONFIG_GATEWAY_MATTER_BUTTON_TASK_STACK_SIZE 4096
#endif
#ifndef CONFIG_GATEWAY_USB_SETUP_CHANNEL_INDEX
#define CONFIG_GATEWAY_USB_SETUP_CHANNEL_INDEX 0
#endif
@@ -357,6 +389,18 @@ constexpr bool kBleSupported = true;
constexpr bool kBleSupported = false;
#endif
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
constexpr bool kMatterSupported = true;
#else
constexpr bool kMatterSupported = false;
#endif
#ifdef CONFIG_GATEWAY_PREFER_PSRAM_TASK_STACKS
constexpr bool kPreferPsramTaskStacks = true;
#else
constexpr bool kPreferPsramTaskStacks = false;
#endif
#ifdef CONFIG_GATEWAY_START_BLE_ENABLED
constexpr bool kBleStartupEnabled = true;
#else
@@ -563,6 +607,8 @@ std::unique_ptr<gateway::GatewayCache> s_cache;
std::unique_ptr<gateway::GatewayController> s_controller;
std::unique_ptr<gateway::GatewayBridgeService> s_bridge;
std::unique_ptr<gateway::GatewayNetworkService> s_network;
std::unique_ptr<gateway::GatewayMatterBridge> s_matter_bridge;
std::atomic_bool s_matter_factory_reset_scheduled{false};
std::unique_ptr<gateway::GatewayBleBridge> s_ble_bridge;
std::unique_ptr<gateway::Gateway485ControlBridge> s_uart0_control_bridge;
std::unique_ptr<gateway::GatewayUsbSetupBridge> s_usb_setup_bridge;
@@ -1002,6 +1048,20 @@ bool HasConfiguredDaliChannel(const std::vector<gateway::DaliChannelInfo>& chann
});
}
void LogHeapSnapshot(const char* phase) {
ESP_LOGI(kTag,
"heap %s internal_free=%u internal_largest=%u psram_free=%u psram_largest=%u",
phase,
static_cast<unsigned>(heap_caps_get_free_size(MALLOC_CAP_INTERNAL |
MALLOC_CAP_8BIT)),
static_cast<unsigned>(heap_caps_get_largest_free_block(
MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)),
static_cast<unsigned>(heap_caps_get_free_size(MALLOC_CAP_SPIRAM |
MALLOC_CAP_8BIT)),
static_cast<unsigned>(heap_caps_get_largest_free_block(
MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)));
}
} // namespace
extern "C" void app_main(void) {
@@ -1111,6 +1171,7 @@ extern "C" void app_main(void) {
gateway::GatewayControllerConfig controller_config;
controller_config.task_stack_size =
static_cast<uint32_t>(CONFIG_GATEWAY_CONTROLLER_TASK_STACK_SIZE);
controller_config.operation_task_stack_in_psram = kPreferPsramTaskStacks;
const bool network_transport_supported = profile.enable_wifi || profile.enable_eth;
controller_config.setup_supported = true;
controller_config.ble_supported = profile.enable_ble;
@@ -1198,6 +1259,7 @@ extern "C" void app_main(void) {
static_cast<uint32_t>(CONFIG_GATEWAY_BRIDGE_BACNET_TASK_STACK_SIZE);
bridge_config.bacnet_task_priority =
static_cast<UBaseType_t>(CONFIG_GATEWAY_BRIDGE_BACNET_TASK_PRIORITY);
bridge_config.bacnet_task_stack_in_psram = kPreferPsramTaskStacks;
if (kKnxBridgeSupported) {
gateway::GatewayKnxConfig default_knx;
default_knx.dali_router_enabled = true;
@@ -1290,6 +1352,90 @@ extern "C" void app_main(void) {
}
return s_network->gatewaySettingsCloudResponse(request);
};
bridge_config.matter_status_getter = [](std::optional<uint8_t> gateway_id) {
if (!kMatterSupported) {
return gateway::GatewayBridgeHttpResponse{
ESP_OK, "{\"matter\":{\"supported\":false,\"enabled\":false,\"started\":false}}"};
}
if (s_matter_bridge == nullptr) {
return gateway::GatewayBridgeHttpResponse{
ESP_ERR_INVALID_STATE,
"{\"status\":\"error\",\"error\":\"Matter bridge is not ready\"}"};
}
return gateway::GatewayBridgeHttpResponse{ESP_OK,
s_matter_bridge->statusJson(gateway_id)};
};
bridge_config.matter_onboarding_getter = []() {
if (!kMatterSupported || s_matter_bridge == nullptr) {
return gateway::GatewayBridgeHttpResponse{
ESP_ERR_NOT_SUPPORTED,
"{\"status\":\"error\",\"error\":\"Matter bridge is not available\"}"};
}
return gateway::GatewayBridgeHttpResponse{ESP_OK,
s_matter_bridge->onboardingJson()};
};
bridge_config.matter_action_handler = [](std::string_view action,
std::optional<uint8_t> gateway_id,
std::string_view body) {
if (!kMatterSupported || s_matter_bridge == nullptr) {
return gateway::GatewayBridgeHttpResponse{
ESP_ERR_NOT_SUPPORTED,
"{\"status\":\"error\",\"error\":\"Matter bridge is not available\"}"};
}
esp_err_t err = ESP_ERR_INVALID_ARG;
if (action == "matter_open_commissioning") {
err = s_matter_bridge->openCommissioningWindow();
} else if (action == "matter_close_commissioning") {
err = s_matter_bridge->closeCommissioningWindow();
} else if (action == "matter_rescan") {
err = s_matter_bridge->rescanDaliDevices();
} else if (action == "matter_config" && gateway_id.has_value()) {
err = s_matter_bridge->applyConfiguration(*gateway_id, body);
} else if (action == "matter_config_reset" && gateway_id.has_value()) {
err = s_matter_bridge->resetConfiguration(*gateway_id);
} else if (action == "matter_factory_data") {
err = s_matter_bridge->installFactoryData(body);
} else if (action == "matter_factory_reset") {
if (s_matter_factory_reset_scheduled.exchange(true)) {
err = ESP_ERR_INVALID_STATE;
} else {
err = s_matter_bridge->prepareFactoryReset(body);
if (err == ESP_OK) {
const BaseType_t created = xTaskCreate(
[](void*) {
vTaskDelay(pdMS_TO_TICKS(750));
const esp_err_t reset_err = esp_matter::factory_reset();
if (reset_err != ESP_OK) {
ESP_LOGE(kTag, "Matter factory reset failed: %s",
esp_err_to_name(reset_err));
s_matter_factory_reset_scheduled.store(false);
}
vTaskDelete(nullptr);
},
"matter_factory_reset", 4096, nullptr, 3, nullptr);
if (created != pdPASS) err = ESP_ERR_NO_MEM;
}
if (err != ESP_OK) {
s_matter_factory_reset_scheduled.store(false);
}
}
} else if (action == "matter_restart") {
const BaseType_t created = xTaskCreate(
[](void*) {
vTaskDelay(pdMS_TO_TICKS(750));
esp_restart();
},
"matter_restart", 2048, nullptr, 3, nullptr);
err = created == pdPASS ? ESP_OK : ESP_ERR_NO_MEM;
}
if (err != ESP_OK) {
const std::string message = std::string("{\"status\":\"error\",\"error\":\"") +
esp_err_to_name(err) + "\"}";
return gateway::GatewayBridgeHttpResponse{err, message};
}
return gateway::GatewayBridgeHttpResponse{ESP_OK,
s_matter_bridge->statusJson(gateway_id)};
};
bridge_config.knx_gateway_snapshot_provider = []() {
gateway::GatewayKnxGatewaySnapshot out;
if (s_controller == nullptr) {
@@ -1457,13 +1603,65 @@ extern "C" void app_main(void) {
ESP_ERROR_CHECK(s_network->start());
}
if (profile.enable_ble) {
s_ble_bridge = std::make_unique<gateway::GatewayBleBridge>(
*s_controller, *s_runtime, *s_dali_domain);
}
if (kMatterSupported) {
gateway::GatewayMatterBridgeConfig matter_config;
matter_config.enabled = true;
matter_config.max_bridged_devices = CONFIG_GATEWAY_MATTER_MAX_BRIDGED_DEVICES;
matter_config.scan_start_delay_ms = CONFIG_GATEWAY_MATTER_SCAN_START_DELAY_MS;
matter_config.scan_address_delay_ms = CONFIG_GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS;
matter_config.scan_task_stack_size = CONFIG_GATEWAY_MATTER_SCAN_TASK_STACK_SIZE;
matter_config.wifi_provision_button_gpio =
CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO;
#ifdef CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_ACTIVE_LOW
matter_config.wifi_provision_button_active_low = true;
#else
matter_config.wifi_provision_button_active_low = false;
#endif
matter_config.wifi_provision_long_press_ms =
CONFIG_GATEWAY_MATTER_WIFI_PROVISION_LONG_PRESS_MS;
matter_config.button_task_stack_size = CONFIG_GATEWAY_MATTER_BUTTON_TASK_STACK_SIZE;
matter_config.wifi_provisioning_callback = []() {
return s_network != nullptr ? s_network->startWifiProvisioning()
: ESP_ERR_NOT_SUPPORTED;
};
if (s_ble_bridge != nullptr) {
matter_config.ble_prepare_callback = []() {
return s_ble_bridge->prepareSharedNimble();
};
matter_config.ble_attach_callback = []() {
return s_ble_bridge->attachSharedNimble();
};
matter_config.ble_advertising_changed_callback = [](bool advertising) {
s_ble_bridge->handleMatterAdvertisingChange(advertising);
};
}
s_matter_bridge =
std::make_unique<gateway::GatewayMatterBridge>(*s_dali_domain, matter_config);
LogHeapSnapshot("before Matter");
const esp_err_t matter_err = s_matter_bridge->start();
LogHeapSnapshot("after Matter");
ESP_ERROR_CHECK(matter_err);
if (s_network != nullptr) {
// gateway_network starts before CHIP and may not have a live link yet.
// Wait for a preferred link-local address, then replay it after CHIP has
// registered its event handler so operational Matter discovery starts.
s_network->refreshMatterIpv6();
}
}
// ESP-Matter needs several contiguous internal allocations for the CHIP
// event queue and event-loop task. Start it before the allocation-heavy KNX
// bridge to avoid fragmenting that reserved heap.
if (s_bridge != nullptr) {
ESP_ERROR_CHECK(s_bridge->start());
}
if (profile.enable_ble) {
s_ble_bridge = std::make_unique<gateway::GatewayBleBridge>(*s_controller, *s_runtime,
*s_dali_domain);
if (s_ble_bridge != nullptr && !kMatterSupported) {
ESP_ERROR_CHECK(s_ble_bridge->start());
}
+660 -33
View File
@@ -711,7 +711,8 @@ CONFIG_GATEWAY_CACHE_OUTSIDE_BUS_FIRST=y
# end of Gateway Cache
# CONFIG_GATEWAY_ENABLE_DALI_BUS is not set
CONFIG_GATEWAY_CONTROLLER_TASK_STACK_SIZE=12288
CONFIG_GATEWAY_CONTROLLER_TASK_STACK_SIZE=10240
CONFIG_GATEWAY_PREFER_PSRAM_TASK_STACKS=y
# end of DALI Settings
#
@@ -725,6 +726,18 @@ CONFIG_GATEWAY_ESPNOW_SETUP_SUPPORTED=y
CONFIG_GATEWAY_SMARTCONFIG_SUPPORTED=y
# CONFIG_GATEWAY_START_ESPNOW_SETUP_ENABLED is not set
# CONFIG_GATEWAY_START_SMARTCONFIG_ENABLED is not set
#
# Matter-to-DALI Bridge
#
CONFIG_GATEWAY_MATTER_SUPPORTED=y
CONFIG_GATEWAY_MATTER_MAX_BRIDGED_DEVICES=82
CONFIG_GATEWAY_MATTER_SCAN_START_DELAY_MS=2000
CONFIG_GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS=20
CONFIG_GATEWAY_MATTER_SCAN_TASK_STACK_SIZE=8192
CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO=-1
# end of Matter-to-DALI Bridge
CONFIG_GATEWAY_SMARTCONFIG_TIMEOUT_SEC=60
CONFIG_GATEWAY_ETHERNET_SUPPORTED=y
CONFIG_GATEWAY_START_ETHERNET_ENABLED=y
@@ -1010,8 +1023,15 @@ CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256
CONFIG_BT_NIMBLE_ATT_MAX_PREP_ENTRIES=64
CONFIG_BT_NIMBLE_GATT_MAX_PROCS=4
# CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER is not set
# CONFIG_BT_NIMBLE_GATT_CACHING is not set
# CONFIG_BT_NIMBLE_INCL_SVC_DISCOVERY is not set
CONFIG_BT_NIMBLE_GATT_CACHING=y
# CONFIG_BT_NIMBLE_GATT_CACHING_INCLUDE_SERVICES is not set
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_CONNS=4
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_SVCS=8
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_INCL_SVCS=4
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_CHRS=16
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_DSCS=16
# CONFIG_BT_NIMBLE_GATT_CACHING_DISABLE_AUTO is not set
# CONFIG_BT_NIMBLE_GATT_CACHING_ASSOC_ENABLE is not set
# end of GATT / ATT
#
@@ -1118,7 +1138,7 @@ CONFIG_BT_NIMBLE_SVC_GAP_PPCP_SUPERVISION_TMO=0
#
# Extra Features
#
# CONFIG_BT_NIMBLE_DYNAMIC_SERVICE is not set
CONFIG_BT_NIMBLE_DYNAMIC_SERVICE=y
# CONFIG_BT_NIMBLE_BLUFI_ENABLE is not set
# CONFIG_BT_NIMBLE_ENC_ADV_DATA is not set
# CONFIG_BT_NIMBLE_ADV_UUID_CONCAT is not set
@@ -1444,6 +1464,7 @@ CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y
# Common ESP-related
#
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
# end of Common ESP-related
#
@@ -1532,7 +1553,6 @@ CONFIG_RMT_OBJ_CACHE_SAFE=y
#
# ESP-Driver:SPI Configurations
#
# CONFIG_SPI_MASTER_IN_IRAM is not set
CONFIG_SPI_MASTER_ISR_IN_IRAM=y
# CONFIG_SPI_SLAVE_IN_IRAM is not set
CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
@@ -1865,15 +1885,14 @@ CONFIG_SPIRAM_SPEED=80
CONFIG_SPIRAM_BOOT_HW_INIT=y
CONFIG_SPIRAM_BOOT_INIT=y
CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
# CONFIG_SPIRAM_USE_MEMMAP is not set
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
CONFIG_SPIRAM_USE_MALLOC=y
CONFIG_SPIRAM_MEMTEST=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=512
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65535
# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set
# end of SPI RAM config
# end of ESP PSRAM
@@ -2023,10 +2042,10 @@ CONFIG_ESP_TIMER_IMPL_SYSTIMER=y
CONFIG_ESP_WIFI_ENABLED=y
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32
CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16
CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32
# CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER is not set
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER=y
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=1
@@ -2036,18 +2055,18 @@ CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP_WIFI_TX_BA_WIN=6
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP_WIFI_RX_BA_WIN=6
CONFIG_ESP_WIFI_NVS_ENABLED=y
# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set
# CONFIG_ESP_WIFI_NVS_ENABLED is not set
# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 is not set
CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1=y
CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752
CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32
CONFIG_ESP_WIFI_IRAM_OPT=y
# CONFIG_ESP_WIFI_IRAM_OPT is not set
# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set
CONFIG_ESP_WIFI_RX_IRAM_OPT=y
# CONFIG_ESP_WIFI_RX_IRAM_OPT is not set
CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y
CONFIG_ESP_WIFI_ENABLE_SAE_PK=y
CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y
CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y
CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y
# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50
@@ -2058,7 +2077,7 @@ CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15
CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y
# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set
CONFIG_ESP_WIFI_GMAC_SUPPORT=y
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
# CONFIG_ESP_WIFI_SOFTAP_SUPPORT is not set
# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set
CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y
@@ -2069,7 +2088,6 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y
# CONFIG_ESP_WIFI_MBO_SUPPORT is not set
# CONFIG_ESP_WIFI_DPP_SUPPORT is not set
# CONFIG_ESP_WIFI_11R_SUPPORT is not set
# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set
#
# WPS Configuration Options
@@ -2198,7 +2216,7 @@ CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y
CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y
# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set
CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y
# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set
CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y
# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set
# end of Port
@@ -2304,8 +2322,9 @@ CONFIG_LOG_IN_IRAM=y
CONFIG_LWIP_ENABLE=y
CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
CONFIG_LWIP_TCPIP_TASK_PRIO=18
# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set
# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set
CONFIG_LWIP_TCPIP_CORE_LOCKING=y
# CONFIG_LWIP_TCPIP_CORE_LOCKING_INPUT is not set
CONFIG_LWIP_CHECK_THREAD_SAFETY=y
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
# CONFIG_LWIP_L2_TO_L3_COPY is not set
# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
@@ -2358,9 +2377,11 @@ CONFIG_LWIP_AUTOIP_MAX_CONFLICTS=9
CONFIG_LWIP_AUTOIP_RATE_LIMIT_INTERVAL=20
CONFIG_LWIP_IPV4=y
CONFIG_LWIP_IPV6=y
# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
CONFIG_LWIP_IPV6_AUTOCONFIG=y
CONFIG_LWIP_IPV6_NUM_ADDRESSES=3
# CONFIG_LWIP_IPV6_FORWARD is not set
CONFIG_LWIP_IPV6_RDNSS_MAX_DNS_SERVERS=0
# CONFIG_LWIP_IPV6_DHCP6 is not set
CONFIG_LWIP_NETIF_STATUS_CALLBACK=y
CONFIG_LWIP_NETIF_LOOPBACK=y
CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
@@ -2388,6 +2409,7 @@ CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
# CONFIG_LWIP_WND_SCALE is not set
CONFIG_LWIP_TCP_RTO_TIME=1500
# end of TCP
@@ -2492,8 +2514,8 @@ CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y
# mbedTLS
#
# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set
# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set
CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
@@ -2621,7 +2643,7 @@ CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set
# CONFIG_MBEDTLS_POLY1305_C is not set
# CONFIG_MBEDTLS_CHACHA20_C is not set
# CONFIG_MBEDTLS_HKDF_C is not set
CONFIG_MBEDTLS_HKDF_C=y
# CONFIG_MBEDTLS_THREADING_C is not set
CONFIG_MBEDTLS_ERROR_STRINGS=y
CONFIG_MBEDTLS_FS_IO=y
@@ -2969,6 +2991,513 @@ CONFIG_CJSON_NESTING_LIMIT=1000
CONFIG_CJSON_CIRCULAR_LIMIT=10000
# end of cJSON
#
# ESP serial flasher
#
CONFIG_SERIAL_FLASHER_MD5_ENABLED=y
CONFIG_SERIAL_FLASHER_RESET_HOLD_TIME_MS=100
CONFIG_SERIAL_FLASHER_BOOT_HOLD_TIME_MS=50
# end of ESP serial flasher
#
# Diagnostics data store
#
CONFIG_DIAG_DATA_STORE_RTC=y
# CONFIG_DIAG_DATA_STORE_RAM is not set
# CONFIG_DIAG_DATA_STORE_FLASH is not set
# CONFIG_DIAG_DATA_STORE_DBG_PRINTS is not set
CONFIG_DIAG_DATA_STORE_REPORTING_WATERMARK_PERCENT=80
#
# RTC Store
#
CONFIG_RTC_STORE_DATA_SIZE=6144
CONFIG_RTC_STORE_CRITICAL_DATA_SIZE=4096
# end of RTC Store
# end of Diagnostics data store
#
# Diagnostics
#
CONFIG_DIAG_LOG_MSG_ARG_FORMAT_TLV=y
# CONFIG_DIAG_LOG_MSG_ARG_FORMAT_STRING is not set
CONFIG_DIAG_LOG_MSG_ARG_MAX_SIZE=64
CONFIG_DIAG_LOG_DROP_WIFI_LOGS=y
# CONFIG_DIAG_ENABLE_WRAP_LOG_FUNCTIONS is not set
CONFIG_DIAG_ENABLE_METRICS=y
CONFIG_DIAG_METRICS_MAX_COUNT=20
CONFIG_DIAG_ENABLE_HEAP_METRICS=y
CONFIG_DIAG_HEAP_POLLING_INTERVAL=30
CONFIG_DIAG_ENABLE_WIFI_METRICS=y
CONFIG_DIAG_WIFI_POLLING_INTERVAL=30
CONFIG_DIAG_ENABLE_VARIABLES=y
CONFIG_DIAG_VARIABLES_MAX_COUNT=20
CONFIG_DIAG_ENABLE_NETWORK_VARIABLES=y
# CONFIG_DIAG_MORE_NETWORK_VARS is not set
# CONFIG_DIAG_USE_EXTERNAL_LOG_WRAP is not set
# end of Diagnostics
#
# ESP Insights
#
# CONFIG_ESP_INSIGHTS_ENABLED is not set
# CONFIG_ESP_INSIGHTS_TRANSPORT_MQTT is not set
CONFIG_ESP_INSIGHTS_TRANSPORT_HTTPS=y
CONFIG_ESP_INSIGHTS_TRANSPORT_HTTPS_HOST="https://client.insights.espressif.com"
CONFIG_ESP_INSIGHTS_CLOUD_POST_MIN_INTERVAL_SEC=60
CONFIG_ESP_INSIGHTS_CLOUD_POST_MAX_INTERVAL_SEC=240
CONFIG_ESP_INSIGHTS_META_VERSION_10=y
# end of ESP Insights
#
# CHIP Core
#
#
# General Options
#
CONFIG_MAX_EXCHANGE_CONTEXTS=8
CONFIG_MAX_FABRICS=5
CONFIG_MAX_UNSOLICITED_MESSAGE_HANDLERS=8
# CONFIG_ENABLE_PW_RPC is not set
CONFIG_USE_MINIMAL_MDNS=y
# CONFIG_ENABLE_CHIP_SHELL is not set
# CONFIG_ENABLE_CHIP_CONTROLLER_BUILD is not set
# CONFIG_DISABLE_IPV4 is not set
# CONFIG_DISABLE_READ_CLIENT is not set
CONFIG_ENABLE_PERSIST_SUBSCRIPTIONS=y
# CONFIG_BUILD_CHIP_TESTS is not set
CONFIG_DISPATCH_EVENT_LONG_DISPATCH_TIME_WARNING_THRESHOLD_MS=700
# CONFIG_CHIP_LOG_FILTERING is not set
# CONFIG_CHIP_SYSTEM_CONFIG_POOL_USE_HEAP is not set
CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC=1
CONFIG_MAX_GROUPS_PER_FABRIC_PER_ENDPOINT=4
CONFIG_MAX_GROUP_KEYS_PER_FABRIC=3
# CONFIG_CHIP_DEVICE_ENABLE_DYNAMIC_SERVER is not set
# CONFIG_CHIP_MEM_ALLOC_MODE_INTERNAL is not set
CONFIG_CHIP_MEM_ALLOC_MODE_EXTERNAL=y
# CONFIG_CHIP_MEM_ALLOC_MODE_DEFAULT is not set
# end of General Options
#
# Networking Options
#
CONFIG_NUM_TCP_ENDPOINTS=8
CONFIG_NUM_UDP_ENDPOINTS=8
CONFIG_ENABLE_ENDPOINT_QUEUE_FILTER=y
CONFIG_USE_TCPIP_CORE_LOCK_FOR_THREAD_SAFETY=y
# CONFIG_USE_LWIP_PBUF_RAM_PACKETBUFFER is not set
# end of Networking Options
#
# System Options
#
CONFIG_NUM_TIMERS=32
# CONFIG_ENABLE_OTA_REQUESTOR is not set
CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
# CONFIG_ENABLE_SNTP_TIME_SYNC is not set
# end of System Options
#
# Security Options
#
#
# Debugging
#
# CONFIG_SECURITY_TEST_MODE is not set
# end of Debugging
# end of Security Options
# end of CHIP Core
#
# CHIP Device Layer
#
#
# General Options
#
CONFIG_CHIP_PROJECT_CONFIG=""
CONFIG_CHIP_TASK_STACK_SIZE=16384
CONFIG_CHIP_TASK_PRIORITY=1
CONFIG_MAX_EVENT_QUEUE_SIZE=40
# CONFIG_ENABLE_EXTENDED_DISCOVERY is not set
# CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE is not set
# CONFIG_ENABLE_BG_EVENT_PROCESSING is not set
# end of General Options
#
# Device Identification Options
#
CONFIG_DEVICE_VENDOR_ID=0xFFF2
CONFIG_DEVICE_PRODUCT_ID=0x8001
CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION=0
CONFIG_DEVICE_SOFTWARE_VERSION_NUMBER=0
CONFIG_DEVICE_TYPE=0
# end of Device Identification Options
#
# WiFi Station Options
#
# CONFIG_ENABLE_WIFI_STATION is not set
# end of WiFi Station Options
#
# BLE Options
#
CONFIG_ENABLE_CHIPOBLE=y
CONFIG_BLE_DEVICE_NAME_PREFIX="MATTER-"
CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN=40
CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX=40
CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN=800
CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX=800
# CONFIG_CHIPOBLE_SINGLE_CONNECTION is not set
CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART=0
# CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING is not set
# end of BLE Options
#
# Ethernet Options
#
CONFIG_GPIO_RANGE_MIN=0
CONFIG_GPIO_RANGE_MAX=48
CONFIG_ETH_MDC_GPIO=23
CONFIG_ETH_MDIO_GPIO=18
CONFIG_ETH_PHY_RST_GPIO=5
CONFIG_ETH_PHY_ADDR=1
# end of Ethernet Options
#
# Commissioning options
#
# CONFIG_ENABLE_ROTATING_DEVICE_ID is not set
CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER=y
CONFIG_ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER=y
# CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER is not set
# CONFIG_ENABLE_ESP32_LOCATIONCAPABILITY is not set
# CONFIG_SEC_CERT_DAC_PROVIDER is not set
# CONFIG_ENABLE_SET_CERT_DECLARATION_API is not set
# end of Commissioning options
#
# Diagnostics Options
#
# CONFIG_ENABLE_ESP_DIAGNOSTICS is not set
# end of Diagnostics Options
#
# Testing Options
#
CONFIG_USE_TEST_SERIAL_NUMBER="TEST_SN"
# CONFIG_ENABLE_TEST_SETUP_PARAMS is not set
# CONFIG_TEST_EVENT_TRIGGER_ENABLED is not set
# end of Testing Options
#
# Network Telemetry Options
#
# CONFIG_ENABLE_WIFI_TELEMETRY is not set
# CONFIG_ENABLE_THREAD_TELEMETRY is not set
# CONFIG_ENABLE_THREAD_TELEMETRY_FULL is not set
# CONFIG_ENABLE_TUNNEL_TELEMETRY is not set
CONFIG_ENABLE_ETHERNET_TELEMETRY=y
# end of Network Telemetry Options
#
# Event Logging Options
#
CONFIG_EVENT_LOGGING_CRIT_BUFFER_SIZE=4096
CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE=1024
CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE=1024
CONFIG_CHIP_CONFIG_IM_PRETTY_PRINT=y
CONFIG_CHIP_LOG_DEFAULT_LEVEL_EQUALS_LOG_DEFAULT_LEVEL=y
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_NONE is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_ERROR is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_PROGRESS is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_DETAIL is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_AUTOMATION is not set
CONFIG_CHIP_LOG_DEFAULT_LEVEL=3
# end of Event Logging Options
# CONFIG_CHIP_ENABLE_BDX_LOG_TRANSFER is not set
#
# Matter OTA Image
#
# CONFIG_CHIP_OTA_IMAGE_BUILD is not set
# end of Matter OTA Image
#
# External Platform
#
# CONFIG_CHIP_ENABLE_EXTERNAL_PLATFORM is not set
# end of External Platform
#
# Matter Manufacturing Options
#
CONFIG_CHIP_FACTORY_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_CHIP_CONFIG_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_CHIP_COUNTERS_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_CHIP_KVS_NAMESPACE_PARTITION_LABEL="nvs"
# end of Matter Manufacturing Options
#
# Commissioning Window Options
#
CONFIG_CHIP_DISCOVERY_TIMEOUT_SECS=900
# end of Commissioning Window Options
#
# Enable ESP32 as a BLE Commissioner
#
# CONFIG_ENABLE_ESP32_BLE_CONTROLLER is not set
# end of Enable ESP32 as a BLE Commissioner
#
# Enable BLE Extended Announcement
#
# CONFIG_ENABLE_BLE_EXT_ANNOUNCEMENT is not set
# end of Enable BLE Extended Announcement
#
# Message Reliable Protocol Options
#
CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL_FOR_WIFI_ETHERNET=300
CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL_FOR_WIFI_ETHERNET=500
CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST_FOR_WIFI_ETHERNET=0
CONFIG_MRP_MAX_RETRANS=4
# end of Message Reliable Protocol Options
#
# Matter TCP transport options
#
# CONFIG_ENABLE_TCP_TRANSPORT is not set
# end of Matter TCP transport options
#
# Network Commissioning Driver Endpoint Id
#
# CONFIG_ETHERNET_NETWORK_COMMISSIONING_DRIVER is not set
# end of Network Commissioning Driver Endpoint Id
#
# Cluster Configuration Options
#
# CONFIG_ENABLE_ACCESS_RESTRICTIONS is not set
# end of Cluster Configuration Options
# end of CHIP Device Layer
#
# ESP Matter
#
CONFIG_ESP_MATTER_MAX_DEVICE_TYPE_COUNT=5
CONFIG_ESP_MATTER_ATTRIBUTE_BUFFER_LARGEST=259
CONFIG_ESP_MATTER_NVS_PART_NAME="nvs"
CONFIG_ESP_MATTER_DEFERRED_ATTR_PERSISTENCE_TIME_MS=3000
# CONFIG_EXAMPLE_DAC_PROVIDER is not set
CONFIG_FACTORY_PARTITION_DAC_PROVIDER=y
# CONFIG_CUSTOM_DAC_PROVIDER is not set
CONFIG_FACTORY_COMMISSIONABLE_DATA_PROVIDER=y
# CONFIG_SEC_CERT_COMMISSIONABLE_DATA_PROVIDER is not set
# CONFIG_CUSTOM_COMMISSIONABLE_DATA_PROVIDER is not set
# CONFIG_EXAMPLE_DEVICE_INSTANCE_INFO_PROVIDER is not set
CONFIG_FACTORY_DEVICE_INSTANCE_INFO_PROVIDER=y
# CONFIG_SEC_CERT_DEVICE_INSTANCE_INFO_PROVIDER is not set
# CONFIG_CUSTOM_DEVICE_INSTANCE_INFO_PROVIDER is not set
CONFIG_NONE_DEVICE_INFO_PROVIDER=y
# CONFIG_CUSTOM_DEVICE_INFO_PROVIDER is not set
CONFIG_ESP_MATTER_MAX_DYNAMIC_ENDPOINT_COUNT=84
CONFIG_ESP_MATTER_MODE_SELECT_CLUSTER_ENDPOINT_COUNT=0
CONFIG_ESP_MATTER_TEMPERATURE_CONTROL_CLUSTER_ENDPOINT_COUNT=0
CONFIG_ESP_MATTER_SCENES_TABLE_SIZE=16
CONFIG_ESP_MATTER_BINDING_TABLE_SIZE=10
# CONFIG_ESP_MATTER_MEM_ALLOC_MODE_INTERNAL is not set
CONFIG_ESP_MATTER_MEM_ALLOC_MODE_EXTERNAL=y
# CONFIG_ESP_MATTER_MEM_ALLOC_MODE_DEFAULT is not set
CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y
CONFIG_ESP_MATTER_ENABLE_MATTER_SERVER=y
# CONFIG_ESP_MATTER_ENABLE_OPENTHREAD is not set
CONFIG_CUSTOM_NETWORK_CONFIG=y
#
# Select Supported Matter Clusters
#
CONFIG_SUPPORT_ACCESS_CONTROL_CLUSTER=y
# CONFIG_SUPPORT_ACCOUNT_LOGIN_CLUSTER is not set
# CONFIG_SUPPORT_ACTIONS_CLUSTER is not set
# CONFIG_SUPPORT_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER is not set
CONFIG_SUPPORT_ADMINISTRATOR_COMMISSIONING_CLUSTER=y
# CONFIG_SUPPORT_AIR_QUALITY_CLUSTER is not set
# CONFIG_SUPPORT_APPLICATION_BASIC_CLUSTER is not set
# CONFIG_SUPPORT_APPLICATION_LAUNCHER_CLUSTER is not set
# CONFIG_SUPPORT_AUDIO_OUTPUT_CLUSTER is not set
CONFIG_SUPPORT_BASIC_INFORMATION_CLUSTER=y
CONFIG_SUPPORT_BINDING_CLUSTER=y
# CONFIG_SUPPORT_BOOLEAN_STATE_CLUSTER is not set
# CONFIG_SUPPORT_BOOLEAN_STATE_CONFIGURATION_CLUSTER is not set
CONFIG_SUPPORT_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER=y
# CONFIG_SUPPORT_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_CHANNEL_CLUSTER is not set
# CONFIG_SUPPORT_CHIME_CLUSTER is not set
# CONFIG_SUPPORT_CLOSURE_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_CLOSURE_DIMENSION_CLUSTER is not set
CONFIG_SUPPORT_COLOR_CONTROL_CLUSTER=y
# CONFIG_SUPPORT_COMMISSIONER_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_COMMODITY_METERING_CLUSTER is not set
# CONFIG_SUPPORT_COMMODITY_PRICE_CLUSTER is not set
# CONFIG_SUPPORT_COMMODITY_TARIFF_CLUSTER is not set
# CONFIG_SUPPORT_CONTENT_LAUNCHER_CLUSTER is not set
# CONFIG_SUPPORT_CONTENT_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_CONTENT_APP_OBSERVER_CLUSTER is not set
CONFIG_SUPPORT_DESCRIPTOR_CLUSTER=y
# CONFIG_SUPPORT_DEVICE_ENERGY_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER is not set
# CONFIG_SUPPORT_DIAGNOSTIC_LOGS_CLUSTER is not set
# CONFIG_SUPPORT_DISHWASHER_ALARM_CLUSTER is not set
# CONFIG_SUPPORT_DISHWASHER_MODE_CLUSTER is not set
# CONFIG_SUPPORT_ELECTRICAL_GRID_CONDITIONS_CLUSTER is not set
# CONFIG_SUPPORT_GROUPCAST_CLUSTER is not set
# CONFIG_SUPPORT_METER_IDENTIFICATION_CLUSTER is not set
# CONFIG_SUPPORT_MICROWAVE_OVEN_MODE_CLUSTER is not set
# CONFIG_SUPPORT_DOOR_LOCK_CLUSTER is not set
# CONFIG_SUPPORT_ECOSYSTEM_INFORMATION_CLUSTER is not set
# CONFIG_SUPPORT_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_ELECTRICAL_POWER_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_ENERGY_EVSE_CLUSTER is not set
# CONFIG_SUPPORT_ENERGY_EVSE_MODE_CLUSTER is not set
# CONFIG_SUPPORT_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_ENERGY_PREFERENCE_CLUSTER is not set
# CONFIG_SUPPORT_FAN_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_FAULT_INJECTION_CLUSTER is not set
# CONFIG_SUPPORT_FIXED_LABEL_CLUSTER is not set
# CONFIG_SUPPORT_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
CONFIG_SUPPORT_GENERAL_COMMISSIONING_CLUSTER=y
CONFIG_SUPPORT_GENERAL_DIAGNOSTICS_CLUSTER=y
CONFIG_SUPPORT_GROUPS_CLUSTER=y
# CONFIG_SUPPORT_HEPA_FILTER_MONITORING_CLUSTER is not set
CONFIG_SUPPORT_GROUP_KEY_MANAGEMENT_CLUSTER=y
# CONFIG_SUPPORT_ICD_MANAGEMENT_CLUSTER is not set
CONFIG_SUPPORT_IDENTIFY_CLUSTER=y
# CONFIG_SUPPORT_JOINT_FABRIC_DATASTORE_CLUSTER is not set
# CONFIG_SUPPORT_JOINT_FABRIC_ADMINISTRATOR_CLUSTER is not set
# CONFIG_SUPPORT_KEYPAD_INPUT_CLUSTER is not set
# CONFIG_SUPPORT_LAUNDRY_WASHER_MODE_CLUSTER is not set
CONFIG_SUPPORT_LEVEL_CONTROL_CLUSTER=y
# CONFIG_SUPPORT_LOCALIZATION_CONFIGURATION_CLUSTER is not set
# CONFIG_SUPPORT_LOW_POWER_CLUSTER is not set
# CONFIG_SUPPORT_MEDIA_INPUT_CLUSTER is not set
# CONFIG_SUPPORT_MEDIA_PLAYBACK_CLUSTER is not set
# CONFIG_SUPPORT_MICROWAVE_OVEN_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_MESSAGES_CLUSTER is not set
# CONFIG_SUPPORT_MODE_SELECT_CLUSTER is not set
# CONFIG_SUPPORT_NETWORK_COMMISSIONING_CLUSTER is not set
# CONFIG_SUPPORT_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PUSH_AV_STREAM_TRANSPORT_CLUSTER is not set
# CONFIG_SUPPORT_SAMPLE_MEI_CLUSTER is not set
# CONFIG_SUPPORT_OCCUPANCY_SENSING_CLUSTER is not set
CONFIG_SUPPORT_ON_OFF_CLUSTER=y
# CONFIG_SUPPORT_POWER_TOPOLOGY_CLUSTER is not set
CONFIG_SUPPORT_OPERATIONAL_CREDENTIALS_CLUSTER=y
# CONFIG_SUPPORT_OPERATIONAL_STATE_CLUSTER is not set
# CONFIG_SUPPORT_OPERATIONAL_STATE_OVEN_CLUSTER is not set
# CONFIG_SUPPORT_OPERATIONAL_STATE_RVC_CLUSTER is not set
# CONFIG_SUPPORT_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER is not set
# CONFIG_SUPPORT_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER is not set
# CONFIG_SUPPORT_OVEN_MODE_CLUSTER is not set
# CONFIG_SUPPORT_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PM10_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PM1_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_POWER_SOURCE_CLUSTER is not set
# CONFIG_SUPPORT_POWER_SOURCE_CONFIGURATION_CLUSTER is not set
# CONFIG_SUPPORT_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_RADON_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_REFRIGERATOR_ALARM_CLUSTER is not set
# CONFIG_SUPPORT_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER is not set
# CONFIG_SUPPORT_RVC_CLEAN_MODE_CLUSTER is not set
# CONFIG_SUPPORT_RVC_RUN_MODE_CLUSTER is not set
CONFIG_SUPPORT_SCENES_CLUSTER=y
# CONFIG_SUPPORT_SERVICE_AREA_CLUSTER is not set
# CONFIG_SUPPORT_SMOKE_CO_ALARM_CLUSTER is not set
# CONFIG_SUPPORT_SOFTWARE_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_SOIL_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_SWITCH_CLUSTER is not set
# CONFIG_SUPPORT_TARGET_NAVIGATOR_CLUSTER is not set
# CONFIG_SUPPORT_TEMPERATURE_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_THERMOSTAT_CLUSTER is not set
# CONFIG_SUPPORT_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER is not set
# CONFIG_SUPPORT_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_THREAD_NETWORK_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_THREAD_NETWORK_DIRECTORY_CLUSTER is not set
# CONFIG_SUPPORT_TIME_FORMAT_LOCALIZATION_CLUSTER is not set
# CONFIG_SUPPORT_TIME_SYNCHRONIZATION_CLUSTER is not set
# CONFIG_SUPPORT_TIMER_CLUSTER is not set
# CONFIG_SUPPORT_TLS_CERTIFICATE_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_TLS_CLIENT_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_UNIT_LOCALIZATION_CLUSTER is not set
# CONFIG_SUPPORT_UNIT_TESTING_CLUSTER is not set
# CONFIG_SUPPORT_USER_LABEL_CLUSTER is not set
# CONFIG_SUPPORT_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_WAKE_ON_LAN_CLUSTER is not set
# CONFIG_SUPPORT_LAUNDRY_WASHER_CONTROLS_CLUSTER is not set
# CONFIG_SUPPORT_LAUNDRY_DRYER_CONTROLS_CLUSTER is not set
# CONFIG_SUPPORT_WEB_RTC_TRANSPORT_PROVIDER_CLUSTER is not set
# CONFIG_SUPPORT_WEB_RTC_TRANSPORT_REQUESTOR_CLUSTER is not set
# CONFIG_SUPPORT_WIFI_NETWORK_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_WIFI_NETWORK_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_WINDOW_COVERING_CLUSTER is not set
# CONFIG_SUPPORT_WATER_HEATER_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_WATER_HEATER_MODE_CLUSTER is not set
# CONFIG_SUPPORT_ZONE_MANAGEMENT_CLUSTER is not set
# end of Select Supported Matter Clusters
# end of ESP Matter
#
# ESP Matter Bridge
#
CONFIG_ESP_MATTER_AGGREGATOR_ENDPOINT_COUNT=1
CONFIG_ESP_MATTER_BRIDGE_INFO_PART_NAME="nvs"
# end of ESP Matter Bridge
#
# ESP Matter Console
#
CONFIG_ESP_MATTER_CONSOLE_TASK_STACK=2048
CONFIG_ESP_MATTER_CONSOLE_MAX_COMMANDS=10
# end of ESP Matter Console
#
# ESP Matter Controller
#
# CONFIG_ESP_MATTER_CONTROLLER_ENABLE is not set
# end of ESP Matter Controller
#
# ESP Matter OTA Provider
#
# CONFIG_ESP_MATTER_OTA_PROVIDER_ENABLED is not set
# end of ESP Matter OTA Provider
#
# OpenThread RCP Update
#
# CONFIG_AUTO_UPDATE_RCP is not set
# CONFIG_CREATE_OTA_IMAGE_WITH_RCP_FW is not set
# end of OpenThread RCP Update
#
# ESP Secure Cert Manager
#
CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=y
# CONFIG_ESP_SECURE_CERT_SUPPORT_LEGACY_FORMATS is not set
# CONFIG_ESP_SECURE_CERT_WRITE_ENABLE_LOGGING is not set
# end of ESP Secure Cert Manager
#
# TinyUSB Stack
#
@@ -3056,6 +3585,55 @@ CONFIG_TINYUSB_VENDOR_COUNT=0
# end of Vendor Specific Interface
# end of TinyUSB Stack
#
# jsmn
#
# CONFIG_JSMN_PARENT_LINKS is not set
# CONFIG_JSMN_STRICT is not set
# CONFIG_JSMN_STATIC is not set
# end of jsmn
#
# mDNS
#
CONFIG_MDNS_MAX_INTERFACES=3
CONFIG_MDNS_MAX_SERVICES=10
CONFIG_MDNS_TASK_PRIORITY=1
CONFIG_MDNS_ACTION_QUEUE_LEN=16
CONFIG_MDNS_TASK_STACK_SIZE=4096
# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set
CONFIG_MDNS_TASK_AFFINITY_CPU0=y
# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set
CONFIG_MDNS_TASK_AFFINITY=0x0
#
# MDNS Memory Configuration
#
CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM=y
# CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL is not set
CONFIG_MDNS_MEMORY_ALLOC_SPIRAM=y
# CONFIG_MDNS_MEMORY_ALLOC_INTERNAL is not set
# CONFIG_MDNS_MEMORY_CUSTOM_IMPL is not set
# end of MDNS Memory Configuration
CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000
CONFIG_MDNS_TIMER_PERIOD_MS=100
# CONFIG_MDNS_NETWORKING_SOCKET is not set
# CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES is not set
# CONFIG_MDNS_ENABLE_DEBUG_PRINTS is not set
CONFIG_MDNS_ENABLE_CONSOLE_CLI=y
# CONFIG_MDNS_RESPOND_REVERSE_QUERIES is not set
CONFIG_MDNS_MULTIPLE_INSTANCE=y
#
# MDNS Predefined interfaces
#
CONFIG_MDNS_PREDEF_NETIF_STA=y
CONFIG_MDNS_PREDEF_NETIF_AP=y
CONFIG_MDNS_PREDEF_NETIF_ETH=y
# end of MDNS Predefined interfaces
# end of mDNS
#
# ESP-MQTT Configurations
#
@@ -3073,6 +3651,55 @@ CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED=y
CONFIG_MQTT_USE_CORE_1=y
# CONFIG_MQTT_CUSTOM_OUTBOX is not set
# end of ESP-MQTT Configurations
#
# ESP RainMaker Command-Response
#
CONFIG_ESP_RMAKER_MAX_COMMANDS=10
# end of ESP RainMaker Command-Response
#
# ESP RainMaker Common
#
CONFIG_ESP_RMAKER_LIB_ESP_MQTT=y
# CONFIG_ESP_RMAKER_LIB_AWS_IOT is not set
CONFIG_ESP_RMAKER_MQTT_GLUE_LIB=1
CONFIG_ESP_RMAKER_MQTT_PORT_443=y
# CONFIG_ESP_RMAKER_MQTT_PORT_8883 is not set
CONFIG_ESP_RMAKER_MQTT_PORT=1
# CONFIG_ESP_RMAKER_MQTT_PERSISTENT_SESSION is not set
CONFIG_ESP_RMAKER_MQTT_SEND_USERNAME=y
CONFIG_ESP_RMAKER_MQTT_PRODUCT_NAME="RMDev"
CONFIG_ESP_RMAKER_MQTT_PRODUCT_VERSION="1x0"
CONFIG_ESP_RMAKER_MQTT_PRODUCT_SKU="EX00"
CONFIG_ESP_RMAKER_MQTT_USE_CERT_BUNDLE=y
CONFIG_ESP_RMAKER_MAX_MQTT_SUBSCRIPTIONS=10
CONFIG_ESP_RMAKER_MQTT_KEEP_ALIVE_INTERVAL=120
CONFIG_ESP_RMAKER_FACTORY_PARTITION_NAME="fctry"
CONFIG_ESP_RMAKER_FACTORY_NAMESPACE="rmaker_creds"
# end of ESP RainMaker Common
#
# ESP RainMaker Console
#
CONFIG_ESP_RMAKER_CONSOLE_ENABLED=y
CONFIG_ESP_RMAKER_CONSOLE_TASK_STACK=4096
CONFIG_ESP_RMAKER_CONSOLE_TASK_PRIORITY=5
# end of ESP RainMaker Console
#
# ESP RainMaker Time Sync
#
CONFIG_ESP_RMAKER_DEF_TIMEZONE="Asia/Shanghai"
CONFIG_ESP_RMAKER_SNTP_SERVER_NAME="pool.ntp.org"
# end of ESP RainMaker Time Sync
#
# ESP RainMaker Work Queue
#
CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_STACK=5120
CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_PRIORITY=5
# end of ESP RainMaker Work Queue
# end of Component config
# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set
@@ -3230,22 +3857,23 @@ CONFIG_TIMER_TASK_STACK_SIZE=3584
CONFIG_ESP32_WIFI_ENABLED=y
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0
CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16
CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=32
# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP32_WIFI_TX_BA_WIN=6
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP32_WIFI_RX_BA_WIN=6
CONFIG_ESP32_WIFI_NVS_ENABLED=y
# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set
# CONFIG_ESP32_WIFI_NVS_ENABLED is not set
# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set
CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y
CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
CONFIG_ESP32_WIFI_IRAM_OPT=y
CONFIG_ESP32_WIFI_RX_IRAM_OPT=y
# CONFIG_ESP32_WIFI_IRAM_OPT is not set
# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set
CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y
CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y
CONFIG_WPA_MBEDTLS_CRYPTO=y
@@ -3256,7 +3884,6 @@ CONFIG_WPA_MBEDTLS_TLS_CLIENT=y
# CONFIG_WPA_MBO_SUPPORT is not set
# CONFIG_WPA_DPP_SUPPORT is not set
# CONFIG_WPA_11R_SUPPORT is not set
# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set
# CONFIG_WPA_WPS_STRICT is not set
# CONFIG_WPA_DEBUG_PRINT is not set
# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set
+220
View File
@@ -20,3 +20,223 @@ CONFIG_GATEWAY_START_ETHERNET_ENABLED=y
CONFIG_GATEWAY_ETHERNET_IGNORE_INIT_FAILURE=y
CONFIG_GATEWAY_KNX_DATA_SECURE_SUPPORTED=y
CONFIG_TINYUSB_HID_COUNT=1
# Matter-to-DALI development bridge. CHIP owns the single NimBLE host while the
# Matter commissioning and legacy gateway GATT services share its database.
# Wired Ethernet remains the default route and Wi-Fi starts only when provisioned.
CONFIG_GATEWAY_MATTER_SUPPORTED=y
CONFIG_GATEWAY_MATTER_MAX_BRIDGED_DEVICES=32
CONFIG_GATEWAY_MATTER_SCAN_START_DELAY_MS=2000
CONFIG_GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS=20
CONFIG_GATEWAY_MATTER_SCAN_TASK_STACK_SIZE=8192
CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO=-1
CONFIG_ESP_MATTER_ENABLE_MATTER_SERVER=y
CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y
CONFIG_ESP_MATTER_ENABLE_OPENTHREAD=n
# Keep the large CHIP core, ESP-Matter data model, mDNS state, TLS allocations,
# and NVS cache in PSRAM so the internal heap retains contiguous blocks for
# event queues and radio/DMA allocations. Only stable, explicitly supported
# task stacks are moved; flash-writing tasks remain in internal RAM.
CONFIG_CHIP_MEM_ALLOC_MODE_EXTERNAL=y
CONFIG_ESP_MATTER_MEM_ALLOC_MODE_EXTERNAL=y
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM=y
CONFIG_MDNS_MEMORY_ALLOC_SPIRAM=y
CONFIG_NVS_ALLOCATE_CACHE_IN_SPIRAM=y
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=512
CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM=y
CONFIG_GATEWAY_PREFER_PSRAM_TASK_STACKS=y
# Ethernet is the normal data path and Wi-Fi is a provisioning/fallback path,
# so trade Wi-Fi peak throughput for substantial internal instruction RAM.
CONFIG_ESP_WIFI_IRAM_OPT=n
CONFIG_ESP_WIFI_RX_IRAM_OPT=n
# This stable IDF 5.5 option moves eligible FreeRTOS code out of IRAM. ISR
# functions remain in IRAM because the separate ISR option is not enabled.
CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y
# Preserve enough internal/DMA-capable RAM for gateway Wi-Fi RX buffers when
# ESP-Touch is requested; app_main starts Matter before the allocation-heavy
# KNX bridge so CHIP can obtain its queue and event-loop stack first.
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65535
CONFIG_ESP_MATTER_MAX_DYNAMIC_ENDPOINT_COUNT=34
CONFIG_ESP_MATTER_AGGREGATOR_ENDPOINT_COUNT=1
CONFIG_ESP_MATTER_NVS_PART_NAME="nvs"
CONFIG_ESP_MATTER_BRIDGE_INFO_PART_NAME="nvs"
CONFIG_CUSTOM_NETWORK_CONFIG=y
CONFIG_LWIP_IPV6=y
CONFIG_LWIP_IPV6_AUTOCONFIG=y
# Matter uses the already-configured W5500 interface under CustomNetworkConfig.
# gateway_network owns Wi-Fi station credentials and starts ESP-Touch
# SmartConfig only after the button is held; CHIP must not initialize Wi-Fi.
CONFIG_ENABLE_WIFI_STATION=n
CONFIG_ESP_WIFI_NVS_ENABLED=n
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
CONFIG_ENABLE_CHIPOBLE=y
CONFIG_CHIPOBLE_SINGLE_CONNECTION=n
CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=n
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=4
# Publish the standard GATT Database Hash so CoreBluetooth can invalidate a
# cached pre-Matter gateway attribute table after firmware updates.
CONFIG_BT_NIMBLE_GATT_CACHING=y
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_CONNS=4
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_SVCS=8
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_INCL_SVCS=4
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_CHRS=16
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_DSCS=16
CONFIG_ENABLE_CHIP_SHELL=n
CONFIG_MBEDTLS_HKDF_C=y
CONFIG_DEVICE_VENDOR_ID=0xFFF2
CONFIG_DEVICE_PRODUCT_ID=0x8001
CONFIG_TEST_EVENT_TRIGGER_ENABLED=n
CONFIG_ENABLE_WIFI_TELEMETRY=n
# Despite its legacy name, this option enables CHIP's ESP32 Ethernet platform
# event handling. Ethernet itself is initialized by gateway_network; the CHIP
# Ethernet commissioning driver only supports the internal EMAC, not W5500.
CONFIG_ENABLE_ETHERNET_TELEMETRY=y
CONFIG_ETHERNET_NETWORK_COMMISSIONING_DRIVER=n
# Development factory providers read the burner-supplied test DAC, PAI, CD,
# and commissioning data from the ordinary unencrypted NVS partition.
CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER=y
CONFIG_ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER=y
CONFIG_FACTORY_PARTITION_DAC_PROVIDER=y
CONFIG_FACTORY_COMMISSIONABLE_DATA_PROVIDER=y
CONFIG_FACTORY_DEVICE_INSTANCE_INFO_PROVIDER=y
CONFIG_NONE_DEVICE_INFO_PROVIDER=y
CONFIG_ENABLE_TEST_SETUP_PARAMS=n
CONFIG_CHIP_FACTORY_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_SECURE_FLASH_ENC_ENABLED=n
# Compile only the clusters needed by the root node and DALI light endpoints.
CONFIG_SUPPORT_ACCESS_CONTROL_CLUSTER=y
CONFIG_SUPPORT_ACCOUNT_LOGIN_CLUSTER=n
CONFIG_SUPPORT_ACTIONS_CLUSTER=n
CONFIG_SUPPORT_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER=n
CONFIG_SUPPORT_ADMINISTRATOR_COMMISSIONING_CLUSTER=y
CONFIG_SUPPORT_AIR_QUALITY_CLUSTER=n
CONFIG_SUPPORT_APPLICATION_BASIC_CLUSTER=n
CONFIG_SUPPORT_APPLICATION_LAUNCHER_CLUSTER=n
CONFIG_SUPPORT_AUDIO_OUTPUT_CLUSTER=n
CONFIG_SUPPORT_BASIC_INFORMATION_CLUSTER=y
CONFIG_SUPPORT_BINDING_CLUSTER=y
CONFIG_SUPPORT_BOOLEAN_STATE_CLUSTER=n
CONFIG_SUPPORT_BOOLEAN_STATE_CONFIGURATION_CLUSTER=n
CONFIG_SUPPORT_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER=y
CONFIG_SUPPORT_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_CHANNEL_CLUSTER=n
CONFIG_SUPPORT_CHIME_CLUSTER=n
CONFIG_SUPPORT_CLOSURE_CONTROL_CLUSTER=n
CONFIG_SUPPORT_CLOSURE_DIMENSION_CLUSTER=n
CONFIG_SUPPORT_COLOR_CONTROL_CLUSTER=y
CONFIG_SUPPORT_COMMISSIONER_CONTROL_CLUSTER=n
CONFIG_SUPPORT_COMMODITY_METERING_CLUSTER=n
CONFIG_SUPPORT_COMMODITY_PRICE_CLUSTER=n
CONFIG_SUPPORT_COMMODITY_TARIFF_CLUSTER=n
CONFIG_SUPPORT_CONTENT_LAUNCHER_CLUSTER=n
CONFIG_SUPPORT_CONTENT_CONTROL_CLUSTER=n
CONFIG_SUPPORT_CONTENT_APP_OBSERVER_CLUSTER=n
CONFIG_SUPPORT_DESCRIPTOR_CLUSTER=y
CONFIG_SUPPORT_DEVICE_ENERGY_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER=n
CONFIG_SUPPORT_DIAGNOSTIC_LOGS_CLUSTER=n
CONFIG_SUPPORT_DISHWASHER_ALARM_CLUSTER=n
CONFIG_SUPPORT_DISHWASHER_MODE_CLUSTER=n
CONFIG_SUPPORT_ELECTRICAL_GRID_CONDITIONS_CLUSTER=n
CONFIG_SUPPORT_GROUPCAST_CLUSTER=n
CONFIG_SUPPORT_METER_IDENTIFICATION_CLUSTER=n
CONFIG_SUPPORT_MICROWAVE_OVEN_MODE_CLUSTER=n
CONFIG_SUPPORT_DOOR_LOCK_CLUSTER=n
CONFIG_SUPPORT_ECOSYSTEM_INFORMATION_CLUSTER=n
CONFIG_SUPPORT_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_ELECTRICAL_POWER_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_ENERGY_EVSE_CLUSTER=n
CONFIG_SUPPORT_ENERGY_EVSE_MODE_CLUSTER=n
CONFIG_SUPPORT_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER=n
CONFIG_SUPPORT_ENERGY_PREFERENCE_CLUSTER=n
CONFIG_SUPPORT_FAN_CONTROL_CLUSTER=n
CONFIG_SUPPORT_FAULT_INJECTION_CLUSTER=n
CONFIG_SUPPORT_FIXED_LABEL_CLUSTER=n
CONFIG_SUPPORT_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_GENERAL_COMMISSIONING_CLUSTER=y
CONFIG_SUPPORT_GENERAL_DIAGNOSTICS_CLUSTER=y
CONFIG_SUPPORT_GROUPS_CLUSTER=y
CONFIG_SUPPORT_HEPA_FILTER_MONITORING_CLUSTER=n
CONFIG_SUPPORT_GROUP_KEY_MANAGEMENT_CLUSTER=y
CONFIG_SUPPORT_ICD_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_IDENTIFY_CLUSTER=y
CONFIG_SUPPORT_JOINT_FABRIC_DATASTORE_CLUSTER=n
CONFIG_SUPPORT_JOINT_FABRIC_ADMINISTRATOR_CLUSTER=n
CONFIG_SUPPORT_KEYPAD_INPUT_CLUSTER=n
CONFIG_SUPPORT_LAUNDRY_WASHER_MODE_CLUSTER=n
CONFIG_SUPPORT_LEVEL_CONTROL_CLUSTER=y
CONFIG_SUPPORT_LOCALIZATION_CONFIGURATION_CLUSTER=n
CONFIG_SUPPORT_LOW_POWER_CLUSTER=n
CONFIG_SUPPORT_MEDIA_INPUT_CLUSTER=n
CONFIG_SUPPORT_MEDIA_PLAYBACK_CLUSTER=n
CONFIG_SUPPORT_MICROWAVE_OVEN_CONTROL_CLUSTER=n
CONFIG_SUPPORT_MESSAGES_CLUSTER=n
CONFIG_SUPPORT_MODE_SELECT_CLUSTER=n
CONFIG_SUPPORT_NETWORK_COMMISSIONING_CLUSTER=n
CONFIG_SUPPORT_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_PUSH_AV_STREAM_TRANSPORT_CLUSTER=n
CONFIG_SUPPORT_SAMPLE_MEI_CLUSTER=n
CONFIG_SUPPORT_OCCUPANCY_SENSING_CLUSTER=n
CONFIG_SUPPORT_ON_OFF_CLUSTER=y
CONFIG_SUPPORT_POWER_TOPOLOGY_CLUSTER=n
CONFIG_SUPPORT_OPERATIONAL_CREDENTIALS_CLUSTER=y
CONFIG_SUPPORT_OPERATIONAL_STATE_CLUSTER=n
CONFIG_SUPPORT_OPERATIONAL_STATE_OVEN_CLUSTER=n
CONFIG_SUPPORT_OPERATIONAL_STATE_RVC_CLUSTER=n
CONFIG_SUPPORT_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER=n
CONFIG_SUPPORT_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER=n
CONFIG_SUPPORT_OVEN_MODE_CLUSTER=n
CONFIG_SUPPORT_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_PM10_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_PM1_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_POWER_SOURCE_CLUSTER=n
CONFIG_SUPPORT_POWER_SOURCE_CONFIGURATION_CLUSTER=n
CONFIG_SUPPORT_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER=n
CONFIG_SUPPORT_RADON_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_REFRIGERATOR_ALARM_CLUSTER=n
CONFIG_SUPPORT_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER=n
CONFIG_SUPPORT_RVC_CLEAN_MODE_CLUSTER=n
CONFIG_SUPPORT_RVC_RUN_MODE_CLUSTER=n
CONFIG_SUPPORT_SCENES_CLUSTER=y
CONFIG_SUPPORT_SERVICE_AREA_CLUSTER=n
CONFIG_SUPPORT_SMOKE_CO_ALARM_CLUSTER=n
CONFIG_SUPPORT_SOFTWARE_DIAGNOSTICS_CLUSTER=n
CONFIG_SUPPORT_SOIL_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_SWITCH_CLUSTER=n
CONFIG_SUPPORT_TARGET_NAVIGATOR_CLUSTER=n
CONFIG_SUPPORT_TEMPERATURE_CONTROL_CLUSTER=n
CONFIG_SUPPORT_THERMOSTAT_CLUSTER=n
CONFIG_SUPPORT_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER=n
CONFIG_SUPPORT_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_THREAD_NETWORK_DIAGNOSTICS_CLUSTER=n
CONFIG_SUPPORT_THREAD_NETWORK_DIRECTORY_CLUSTER=n
CONFIG_SUPPORT_TIME_FORMAT_LOCALIZATION_CLUSTER=n
CONFIG_SUPPORT_TIME_SYNCHRONIZATION_CLUSTER=n
CONFIG_SUPPORT_TIMER_CLUSTER=n
CONFIG_SUPPORT_TLS_CERTIFICATE_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_TLS_CLIENT_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER=n
CONFIG_SUPPORT_UNIT_LOCALIZATION_CLUSTER=n
CONFIG_SUPPORT_UNIT_TESTING_CLUSTER=n
CONFIG_SUPPORT_USER_LABEL_CLUSTER=n
CONFIG_SUPPORT_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER=n
CONFIG_SUPPORT_WAKE_ON_LAN_CLUSTER=n
CONFIG_SUPPORT_LAUNDRY_WASHER_CONTROLS_CLUSTER=n
CONFIG_SUPPORT_LAUNDRY_DRYER_CONTROLS_CLUSTER=n
CONFIG_SUPPORT_WEB_RTC_TRANSPORT_PROVIDER_CLUSTER=n
CONFIG_SUPPORT_WEB_RTC_TRANSPORT_REQUESTOR_CLUSTER=n
CONFIG_SUPPORT_WIFI_NETWORK_DIAGNOSTICS_CLUSTER=n
CONFIG_SUPPORT_WIFI_NETWORK_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_WINDOW_COVERING_CLUSTER=n
CONFIG_SUPPORT_WATER_HEATER_MANAGEMENT_CLUSTER=n
CONFIG_SUPPORT_WATER_HEATER_MODE_CLUSTER=n
CONFIG_SUPPORT_ZONE_MANAGEMENT_CLUSTER=n
+750 -25
View File
@@ -691,6 +691,12 @@ CONFIG_GATEWAY_CHANNEL1_NATIVE_BAUDRATE=1200
#
# end of Gateway Channel 16
#
# DALI Part 103 Application Controller
#
# CONFIG_GATEWAY_DALI_103_APPLICATION_CONTROLLER_ENABLED is not set
# end of DALI Part 103 Application Controller
#
# Gateway Cache
#
@@ -705,7 +711,8 @@ CONFIG_GATEWAY_CACHE_OUTSIDE_BUS_FIRST=y
# end of Gateway Cache
# CONFIG_GATEWAY_ENABLE_DALI_BUS is not set
CONFIG_GATEWAY_CONTROLLER_TASK_STACK_SIZE=12288
CONFIG_GATEWAY_CONTROLLER_TASK_STACK_SIZE=10240
CONFIG_GATEWAY_PREFER_PSRAM_TASK_STACKS=y
# end of DALI Settings
#
@@ -719,6 +726,18 @@ CONFIG_GATEWAY_ESPNOW_SETUP_SUPPORTED=y
CONFIG_GATEWAY_SMARTCONFIG_SUPPORTED=y
# CONFIG_GATEWAY_START_ESPNOW_SETUP_ENABLED is not set
# CONFIG_GATEWAY_START_SMARTCONFIG_ENABLED is not set
#
# Matter-to-DALI Bridge
#
CONFIG_GATEWAY_MATTER_SUPPORTED=y
CONFIG_GATEWAY_MATTER_MAX_BRIDGED_DEVICES=32
CONFIG_GATEWAY_MATTER_SCAN_START_DELAY_MS=2000
CONFIG_GATEWAY_MATTER_SCAN_ADDRESS_DELAY_MS=20
CONFIG_GATEWAY_MATTER_SCAN_TASK_STACK_SIZE=8192
CONFIG_GATEWAY_MATTER_WIFI_PROVISION_BUTTON_GPIO=-1
# end of Matter-to-DALI Bridge
CONFIG_GATEWAY_SMARTCONFIG_TIMEOUT_SEC=60
CONFIG_GATEWAY_ETHERNET_SUPPORTED=y
CONFIG_GATEWAY_START_ETHERNET_ENABLED=y
@@ -843,6 +862,7 @@ CONFIG_GATEWAY_BRIDGE_BACNET_TASK_PRIORITY=5
#
CONFIG_GATEWAY_USB_STARTUP_DEBUG_JTAG=y
# CONFIG_GATEWAY_USB_STARTUP_SETUP_SERIAL is not set
# CONFIG_GATEWAY_USB_STARTUP_TRIDONIC_HID is not set
# end of USB Setup
#
@@ -858,6 +878,10 @@ CONFIG_GATEWAY_NETWORK_HTTP_ENABLED=y
CONFIG_GATEWAY_NETWORK_HTTP_PORT=80
CONFIG_GATEWAY_NETWORK_UDP_ROUTER_ENABLED=y
CONFIG_GATEWAY_NETWORK_UDP_PORT=2020
CONFIG_GATEWAY_NETWORK_TCP_CONTROL_ENABLED=y
CONFIG_GATEWAY_NETWORK_TCP_CONTROL_PORT=2020
CONFIG_GATEWAY_NETWORK_TCP_CONTROL_TASK_STACK_SIZE=4096
CONFIG_GATEWAY_NETWORK_TCP_CONTROL_TASK_PRIORITY=4
CONFIG_GATEWAY_STATUS_LED_GPIO=-1
CONFIG_GATEWAY_BOOT_BUTTON_GPIO=0
CONFIG_GATEWAY_BOOT_BUTTON_ACTIVE_LOW=y
@@ -999,8 +1023,15 @@ CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256
CONFIG_BT_NIMBLE_ATT_MAX_PREP_ENTRIES=64
CONFIG_BT_NIMBLE_GATT_MAX_PROCS=4
# CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER is not set
# CONFIG_BT_NIMBLE_GATT_CACHING is not set
# CONFIG_BT_NIMBLE_INCL_SVC_DISCOVERY is not set
CONFIG_BT_NIMBLE_GATT_CACHING=y
# CONFIG_BT_NIMBLE_GATT_CACHING_INCLUDE_SERVICES is not set
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_CONNS=4
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_SVCS=8
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_INCL_SVCS=4
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_CHRS=16
CONFIG_BT_NIMBLE_GATT_CACHING_MAX_DSCS=16
# CONFIG_BT_NIMBLE_GATT_CACHING_DISABLE_AUTO is not set
# CONFIG_BT_NIMBLE_GATT_CACHING_ASSOC_ENABLE is not set
# end of GATT / ATT
#
@@ -1107,7 +1138,7 @@ CONFIG_BT_NIMBLE_SVC_GAP_PPCP_SUPERVISION_TMO=0
#
# Extra Features
#
# CONFIG_BT_NIMBLE_DYNAMIC_SERVICE is not set
CONFIG_BT_NIMBLE_DYNAMIC_SERVICE=y
# CONFIG_BT_NIMBLE_BLUFI_ENABLE is not set
# CONFIG_BT_NIMBLE_ENC_ADV_DATA is not set
# CONFIG_BT_NIMBLE_ADV_UUID_CONCAT is not set
@@ -1433,6 +1464,7 @@ CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y
# Common ESP-related
#
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
# end of Common ESP-related
#
@@ -1521,7 +1553,6 @@ CONFIG_RMT_OBJ_CACHE_SAFE=y
#
# ESP-Driver:SPI Configurations
#
# CONFIG_SPI_MASTER_IN_IRAM is not set
CONFIG_SPI_MASTER_ISR_IN_IRAM=y
# CONFIG_SPI_SLAVE_IN_IRAM is not set
CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
@@ -1854,15 +1885,14 @@ CONFIG_SPIRAM_SPEED=80
CONFIG_SPIRAM_BOOT_HW_INIT=y
CONFIG_SPIRAM_BOOT_INIT=y
CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
# CONFIG_SPIRAM_USE_MEMMAP is not set
# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set
CONFIG_SPIRAM_USE_MALLOC=y
CONFIG_SPIRAM_MEMTEST=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=512
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65535
# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set
# end of SPI RAM config
# end of ESP PSRAM
@@ -2012,10 +2042,10 @@ CONFIG_ESP_TIMER_IMPL_SYSTIMER=y
CONFIG_ESP_WIFI_ENABLED=y
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1
CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32
CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16
CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32
# CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER is not set
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER=y
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=1
@@ -2025,18 +2055,18 @@ CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP_WIFI_TX_BA_WIN=6
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP_WIFI_RX_BA_WIN=6
CONFIG_ESP_WIFI_NVS_ENABLED=y
# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set
# CONFIG_ESP_WIFI_NVS_ENABLED is not set
# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 is not set
CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1=y
CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752
CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32
CONFIG_ESP_WIFI_IRAM_OPT=y
# CONFIG_ESP_WIFI_IRAM_OPT is not set
# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set
CONFIG_ESP_WIFI_RX_IRAM_OPT=y
# CONFIG_ESP_WIFI_RX_IRAM_OPT is not set
CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y
CONFIG_ESP_WIFI_ENABLE_SAE_PK=y
CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y
CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y
CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y
# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50
@@ -2047,7 +2077,7 @@ CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15
CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y
# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set
CONFIG_ESP_WIFI_GMAC_SUPPORT=y
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
# CONFIG_ESP_WIFI_SOFTAP_SUPPORT is not set
# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set
CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y
@@ -2058,7 +2088,6 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y
# CONFIG_ESP_WIFI_MBO_SUPPORT is not set
# CONFIG_ESP_WIFI_DPP_SUPPORT is not set
# CONFIG_ESP_WIFI_11R_SUPPORT is not set
# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set
#
# WPS Configuration Options
@@ -2187,7 +2216,7 @@ CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y
CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y
# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set
CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y
# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set
CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y
# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set
# end of Port
@@ -2293,8 +2322,9 @@ CONFIG_LOG_IN_IRAM=y
CONFIG_LWIP_ENABLE=y
CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
CONFIG_LWIP_TCPIP_TASK_PRIO=18
# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set
# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set
CONFIG_LWIP_TCPIP_CORE_LOCKING=y
# CONFIG_LWIP_TCPIP_CORE_LOCKING_INPUT is not set
CONFIG_LWIP_CHECK_THREAD_SAFETY=y
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
# CONFIG_LWIP_L2_TO_L3_COPY is not set
# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
@@ -2377,6 +2407,7 @@ CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
# CONFIG_LWIP_WND_SCALE is not set
CONFIG_LWIP_TCP_RTO_TIME=1500
# end of TCP
@@ -2481,8 +2512,8 @@ CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y
# mbedTLS
#
# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set
# CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC is not set
CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
@@ -2610,7 +2641,7 @@ CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set
# CONFIG_MBEDTLS_POLY1305_C is not set
# CONFIG_MBEDTLS_CHACHA20_C is not set
# CONFIG_MBEDTLS_HKDF_C is not set
CONFIG_MBEDTLS_HKDF_C=y
# CONFIG_MBEDTLS_THREADING_C is not set
CONFIG_MBEDTLS_ERROR_STRINGS=y
CONFIG_MBEDTLS_FS_IO=y
@@ -2919,13 +2950,15 @@ CONFIG_DALI_CUSTOM_HALF_BIT_TIME_X100_US=0
CONFIG_DALI_TX_STOP_CONDITION_US=0
CONFIG_DALI_RX_STOP_CONDITION_US=0
CONFIG_DALI_QUERY_RESPONSE_TIMEOUT_MS=30
CONFIG_DALI_DOUBLE_SEND_DELAY_MS=20
CONFIG_DALI_DOUBLE_SEND_DELAY_MS=30
CONFIG_DALI_FORWARD_ACTIVITY_WAIT_MS=20
CONFIG_DALI_FORWARD_AFTER_BACKWARD_WAIT_MS=10
CONFIG_DALI_FORWARD_MAX_WAIT_MS=50
CONFIG_DALI_BACKWARD_IDLE_TIMEOUT_MS=10
CONFIG_DALI_BUS_POWER_CHECK_INTERVAL_MS=500
CONFIG_DALI_BUS_FAIL_EVENT_DELAY_MS=45
CONFIG_DALI_BUS_ABNORMAL_REPORT_INTERVAL_MS=3000
CONFIG_DALI_BUS_RESET_PULSE_MS=10
# CONFIG_DALI_LOG_LEVEL_NONE is not set
# CONFIG_DALI_LOG_LEVEL_ERROR is not set
# CONFIG_DALI_LOG_LEVEL_WARN is not set
@@ -2956,6 +2989,649 @@ CONFIG_CJSON_NESTING_LIMIT=1000
CONFIG_CJSON_CIRCULAR_LIMIT=10000
# end of cJSON
#
# ESP serial flasher
#
CONFIG_SERIAL_FLASHER_MD5_ENABLED=y
CONFIG_SERIAL_FLASHER_RESET_HOLD_TIME_MS=100
CONFIG_SERIAL_FLASHER_BOOT_HOLD_TIME_MS=50
# end of ESP serial flasher
#
# Diagnostics data store
#
CONFIG_DIAG_DATA_STORE_RTC=y
# CONFIG_DIAG_DATA_STORE_RAM is not set
# CONFIG_DIAG_DATA_STORE_FLASH is not set
# CONFIG_DIAG_DATA_STORE_DBG_PRINTS is not set
CONFIG_DIAG_DATA_STORE_REPORTING_WATERMARK_PERCENT=80
#
# RTC Store
#
CONFIG_RTC_STORE_DATA_SIZE=6144
CONFIG_RTC_STORE_CRITICAL_DATA_SIZE=4096
# end of RTC Store
# end of Diagnostics data store
#
# Diagnostics
#
CONFIG_DIAG_LOG_MSG_ARG_FORMAT_TLV=y
# CONFIG_DIAG_LOG_MSG_ARG_FORMAT_STRING is not set
CONFIG_DIAG_LOG_MSG_ARG_MAX_SIZE=64
CONFIG_DIAG_LOG_DROP_WIFI_LOGS=y
# CONFIG_DIAG_ENABLE_WRAP_LOG_FUNCTIONS is not set
CONFIG_DIAG_ENABLE_METRICS=y
CONFIG_DIAG_METRICS_MAX_COUNT=20
CONFIG_DIAG_ENABLE_HEAP_METRICS=y
CONFIG_DIAG_HEAP_POLLING_INTERVAL=30
CONFIG_DIAG_ENABLE_WIFI_METRICS=y
CONFIG_DIAG_WIFI_POLLING_INTERVAL=30
CONFIG_DIAG_ENABLE_VARIABLES=y
CONFIG_DIAG_VARIABLES_MAX_COUNT=20
CONFIG_DIAG_ENABLE_NETWORK_VARIABLES=y
# CONFIG_DIAG_MORE_NETWORK_VARS is not set
# CONFIG_DIAG_USE_EXTERNAL_LOG_WRAP is not set
# end of Diagnostics
#
# ESP Insights
#
# CONFIG_ESP_INSIGHTS_ENABLED is not set
# CONFIG_ESP_INSIGHTS_TRANSPORT_MQTT is not set
CONFIG_ESP_INSIGHTS_TRANSPORT_HTTPS=y
CONFIG_ESP_INSIGHTS_TRANSPORT_HTTPS_HOST="https://client.insights.espressif.com"
CONFIG_ESP_INSIGHTS_CLOUD_POST_MIN_INTERVAL_SEC=60
CONFIG_ESP_INSIGHTS_CLOUD_POST_MAX_INTERVAL_SEC=240
CONFIG_ESP_INSIGHTS_META_VERSION_10=y
# end of ESP Insights
#
# CHIP Core
#
#
# General Options
#
CONFIG_MAX_EXCHANGE_CONTEXTS=8
CONFIG_MAX_FABRICS=5
CONFIG_MAX_UNSOLICITED_MESSAGE_HANDLERS=8
# CONFIG_ENABLE_PW_RPC is not set
CONFIG_USE_MINIMAL_MDNS=y
# CONFIG_ENABLE_CHIP_SHELL is not set
# CONFIG_ENABLE_CHIP_CONTROLLER_BUILD is not set
# CONFIG_DISABLE_IPV4 is not set
# CONFIG_DISABLE_READ_CLIENT is not set
CONFIG_ENABLE_PERSIST_SUBSCRIPTIONS=y
# CONFIG_BUILD_CHIP_TESTS is not set
CONFIG_DISPATCH_EVENT_LONG_DISPATCH_TIME_WARNING_THRESHOLD_MS=700
# CONFIG_CHIP_LOG_FILTERING is not set
# CONFIG_CHIP_SYSTEM_CONFIG_POOL_USE_HEAP is not set
CONFIG_MAX_GROUP_ENDPOINTS_PER_FABRIC=1
CONFIG_MAX_GROUPS_PER_FABRIC_PER_ENDPOINT=4
CONFIG_MAX_GROUP_KEYS_PER_FABRIC=3
# CONFIG_CHIP_DEVICE_ENABLE_DYNAMIC_SERVER is not set
# CONFIG_CHIP_MEM_ALLOC_MODE_INTERNAL is not set
CONFIG_CHIP_MEM_ALLOC_MODE_EXTERNAL=y
# CONFIG_CHIP_MEM_ALLOC_MODE_DEFAULT is not set
# end of General Options
#
# Networking Options
#
CONFIG_NUM_TCP_ENDPOINTS=8
CONFIG_NUM_UDP_ENDPOINTS=8
CONFIG_ENABLE_ENDPOINT_QUEUE_FILTER=y
CONFIG_USE_TCPIP_CORE_LOCK_FOR_THREAD_SAFETY=y
# CONFIG_USE_LWIP_PBUF_RAM_PACKETBUFFER is not set
# end of Networking Options
#
# System Options
#
CONFIG_NUM_TIMERS=32
# CONFIG_ENABLE_OTA_REQUESTOR is not set
CONFIG_CHIP_ENABLE_PAIRING_AUTOSTART=y
# CONFIG_ENABLE_SNTP_TIME_SYNC is not set
# end of System Options
#
# Security Options
#
#
# Debugging
#
# CONFIG_SECURITY_TEST_MODE is not set
# end of Debugging
# end of Security Options
# end of CHIP Core
#
# CHIP Device Layer
#
#
# General Options
#
CONFIG_CHIP_PROJECT_CONFIG=""
CONFIG_CHIP_TASK_STACK_SIZE=8192
CONFIG_CHIP_TASK_PRIORITY=1
CONFIG_MAX_EVENT_QUEUE_SIZE=40
# CONFIG_ENABLE_EXTENDED_DISCOVERY is not set
# CONFIG_ENABLE_COMMISSIONABLE_DEVICE_TYPE is not set
# CONFIG_ENABLE_BG_EVENT_PROCESSING is not set
# end of General Options
#
# Device Identification Options
#
CONFIG_DEVICE_VENDOR_ID=0xFFF2
CONFIG_DEVICE_PRODUCT_ID=0x8001
CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION=0
CONFIG_DEVICE_SOFTWARE_VERSION_NUMBER=0
CONFIG_DEVICE_TYPE=0
# end of Device Identification Options
#
# WiFi Station Options
#
# CONFIG_ENABLE_WIFI_STATION is not set
# end of WiFi Station Options
#
# BLE Options
#
CONFIG_ENABLE_CHIPOBLE=y
CONFIG_BLE_DEVICE_NAME_PREFIX="MATTER-"
CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN=40
CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX=40
CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN=800
CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX=800
# CONFIG_CHIPOBLE_SINGLE_CONNECTION is not set
CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART=0
# CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING is not set
# end of BLE Options
#
# Ethernet Options
#
CONFIG_GPIO_RANGE_MIN=0
CONFIG_GPIO_RANGE_MAX=48
CONFIG_ETH_MDC_GPIO=23
CONFIG_ETH_MDIO_GPIO=18
CONFIG_ETH_PHY_RST_GPIO=5
CONFIG_ETH_PHY_ADDR=1
# end of Ethernet Options
#
# Commissioning options
#
# CONFIG_ENABLE_ROTATING_DEVICE_ID is not set
CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER=y
CONFIG_ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER=y
# CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER is not set
# CONFIG_ENABLE_ESP32_LOCATIONCAPABILITY is not set
# CONFIG_SEC_CERT_DAC_PROVIDER is not set
# CONFIG_ENABLE_SET_CERT_DECLARATION_API is not set
# end of Commissioning options
#
# Diagnostics Options
#
# CONFIG_ENABLE_ESP_DIAGNOSTICS is not set
# end of Diagnostics Options
#
# Testing Options
#
CONFIG_USE_TEST_SERIAL_NUMBER="TEST_SN"
# CONFIG_ENABLE_TEST_SETUP_PARAMS is not set
# CONFIG_TEST_EVENT_TRIGGER_ENABLED is not set
# end of Testing Options
#
# Network Telemetry Options
#
# CONFIG_ENABLE_WIFI_TELEMETRY is not set
# CONFIG_ENABLE_THREAD_TELEMETRY is not set
# CONFIG_ENABLE_THREAD_TELEMETRY_FULL is not set
# CONFIG_ENABLE_TUNNEL_TELEMETRY is not set
CONFIG_ENABLE_ETHERNET_TELEMETRY=y
# end of Network Telemetry Options
#
# Event Logging Options
#
CONFIG_EVENT_LOGGING_CRIT_BUFFER_SIZE=4096
CONFIG_EVENT_LOGGING_INFO_BUFFER_SIZE=1024
CONFIG_EVENT_LOGGING_DEBUG_BUFFER_SIZE=1024
CONFIG_CHIP_CONFIG_IM_PRETTY_PRINT=y
CONFIG_CHIP_LOG_DEFAULT_LEVEL_EQUALS_LOG_DEFAULT_LEVEL=y
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_NONE is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_ERROR is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_PROGRESS is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_DETAIL is not set
# CONFIG_CHIP_LOG_DEFAULT_LEVEL_AUTOMATION is not set
CONFIG_CHIP_LOG_DEFAULT_LEVEL=3
# end of Event Logging Options
# CONFIG_CHIP_ENABLE_BDX_LOG_TRANSFER is not set
#
# Matter OTA Image
#
# CONFIG_CHIP_OTA_IMAGE_BUILD is not set
# end of Matter OTA Image
#
# External Platform
#
# CONFIG_CHIP_ENABLE_EXTERNAL_PLATFORM is not set
# end of External Platform
#
# Matter Manufacturing Options
#
CONFIG_CHIP_FACTORY_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_CHIP_CONFIG_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_CHIP_COUNTERS_NAMESPACE_PARTITION_LABEL="nvs"
CONFIG_CHIP_KVS_NAMESPACE_PARTITION_LABEL="nvs"
# end of Matter Manufacturing Options
#
# Commissioning Window Options
#
CONFIG_CHIP_DISCOVERY_TIMEOUT_SECS=900
# end of Commissioning Window Options
#
# Enable ESP32 as a BLE Commissioner
#
# CONFIG_ENABLE_ESP32_BLE_CONTROLLER is not set
# end of Enable ESP32 as a BLE Commissioner
#
# Enable BLE Extended Announcement
#
# CONFIG_ENABLE_BLE_EXT_ANNOUNCEMENT is not set
# end of Enable BLE Extended Announcement
#
# Message Reliable Protocol Options
#
CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL_FOR_WIFI_ETHERNET=300
CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL_FOR_WIFI_ETHERNET=500
CONFIG_MRP_RETRY_INTERVAL_SENDER_BOOST_FOR_WIFI_ETHERNET=0
CONFIG_MRP_MAX_RETRANS=4
# end of Message Reliable Protocol Options
#
# Matter TCP transport options
#
# CONFIG_ENABLE_TCP_TRANSPORT is not set
# end of Matter TCP transport options
#
# Network Commissioning Driver Endpoint Id
#
# CONFIG_ETHERNET_NETWORK_COMMISSIONING_DRIVER is not set
# end of Network Commissioning Driver Endpoint Id
#
# Cluster Configuration Options
#
# CONFIG_ENABLE_ACCESS_RESTRICTIONS is not set
# end of Cluster Configuration Options
# end of CHIP Device Layer
#
# ESP Matter
#
CONFIG_ESP_MATTER_MAX_DEVICE_TYPE_COUNT=5
CONFIG_ESP_MATTER_ATTRIBUTE_BUFFER_LARGEST=259
CONFIG_ESP_MATTER_NVS_PART_NAME="nvs"
CONFIG_ESP_MATTER_DEFERRED_ATTR_PERSISTENCE_TIME_MS=3000
# CONFIG_EXAMPLE_DAC_PROVIDER is not set
CONFIG_FACTORY_PARTITION_DAC_PROVIDER=y
# CONFIG_CUSTOM_DAC_PROVIDER is not set
CONFIG_FACTORY_COMMISSIONABLE_DATA_PROVIDER=y
# CONFIG_SEC_CERT_COMMISSIONABLE_DATA_PROVIDER is not set
# CONFIG_CUSTOM_COMMISSIONABLE_DATA_PROVIDER is not set
# CONFIG_EXAMPLE_DEVICE_INSTANCE_INFO_PROVIDER is not set
CONFIG_FACTORY_DEVICE_INSTANCE_INFO_PROVIDER=y
# CONFIG_SEC_CERT_DEVICE_INSTANCE_INFO_PROVIDER is not set
# CONFIG_CUSTOM_DEVICE_INSTANCE_INFO_PROVIDER is not set
CONFIG_NONE_DEVICE_INFO_PROVIDER=y
# CONFIG_CUSTOM_DEVICE_INFO_PROVIDER is not set
CONFIG_ESP_MATTER_MAX_DYNAMIC_ENDPOINT_COUNT=84
CONFIG_ESP_MATTER_MODE_SELECT_CLUSTER_ENDPOINT_COUNT=0
CONFIG_ESP_MATTER_TEMPERATURE_CONTROL_CLUSTER_ENDPOINT_COUNT=0
CONFIG_ESP_MATTER_SCENES_TABLE_SIZE=16
CONFIG_ESP_MATTER_BINDING_TABLE_SIZE=10
# CONFIG_ESP_MATTER_MEM_ALLOC_MODE_INTERNAL is not set
CONFIG_ESP_MATTER_MEM_ALLOC_MODE_EXTERNAL=y
# CONFIG_ESP_MATTER_MEM_ALLOC_MODE_DEFAULT is not set
CONFIG_ESP_MATTER_ENABLE_DATA_MODEL=y
CONFIG_ESP_MATTER_ENABLE_MATTER_SERVER=y
# CONFIG_ESP_MATTER_ENABLE_OPENTHREAD is not set
CONFIG_CUSTOM_NETWORK_CONFIG=y
#
# Select Supported Matter Clusters
#
CONFIG_SUPPORT_ACCESS_CONTROL_CLUSTER=y
# CONFIG_SUPPORT_ACCOUNT_LOGIN_CLUSTER is not set
# CONFIG_SUPPORT_ACTIONS_CLUSTER is not set
# CONFIG_SUPPORT_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER is not set
CONFIG_SUPPORT_ADMINISTRATOR_COMMISSIONING_CLUSTER=y
# CONFIG_SUPPORT_AIR_QUALITY_CLUSTER is not set
# CONFIG_SUPPORT_APPLICATION_BASIC_CLUSTER is not set
# CONFIG_SUPPORT_APPLICATION_LAUNCHER_CLUSTER is not set
# CONFIG_SUPPORT_AUDIO_OUTPUT_CLUSTER is not set
CONFIG_SUPPORT_BASIC_INFORMATION_CLUSTER=y
CONFIG_SUPPORT_BINDING_CLUSTER=y
# CONFIG_SUPPORT_BOOLEAN_STATE_CLUSTER is not set
# CONFIG_SUPPORT_BOOLEAN_STATE_CONFIGURATION_CLUSTER is not set
CONFIG_SUPPORT_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER=y
# CONFIG_SUPPORT_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_CHANNEL_CLUSTER is not set
# CONFIG_SUPPORT_CHIME_CLUSTER is not set
# CONFIG_SUPPORT_CLOSURE_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_CLOSURE_DIMENSION_CLUSTER is not set
CONFIG_SUPPORT_COLOR_CONTROL_CLUSTER=y
# CONFIG_SUPPORT_COMMISSIONER_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_COMMODITY_METERING_CLUSTER is not set
# CONFIG_SUPPORT_COMMODITY_PRICE_CLUSTER is not set
# CONFIG_SUPPORT_COMMODITY_TARIFF_CLUSTER is not set
# CONFIG_SUPPORT_CONTENT_LAUNCHER_CLUSTER is not set
# CONFIG_SUPPORT_CONTENT_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_CONTENT_APP_OBSERVER_CLUSTER is not set
CONFIG_SUPPORT_DESCRIPTOR_CLUSTER=y
# CONFIG_SUPPORT_DEVICE_ENERGY_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER is not set
# CONFIG_SUPPORT_DIAGNOSTIC_LOGS_CLUSTER is not set
# CONFIG_SUPPORT_DISHWASHER_ALARM_CLUSTER is not set
# CONFIG_SUPPORT_DISHWASHER_MODE_CLUSTER is not set
# CONFIG_SUPPORT_ELECTRICAL_GRID_CONDITIONS_CLUSTER is not set
# CONFIG_SUPPORT_GROUPCAST_CLUSTER is not set
# CONFIG_SUPPORT_METER_IDENTIFICATION_CLUSTER is not set
# CONFIG_SUPPORT_MICROWAVE_OVEN_MODE_CLUSTER is not set
# CONFIG_SUPPORT_DOOR_LOCK_CLUSTER is not set
# CONFIG_SUPPORT_ECOSYSTEM_INFORMATION_CLUSTER is not set
# CONFIG_SUPPORT_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_ELECTRICAL_POWER_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_ENERGY_EVSE_CLUSTER is not set
# CONFIG_SUPPORT_ENERGY_EVSE_MODE_CLUSTER is not set
# CONFIG_SUPPORT_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_ENERGY_PREFERENCE_CLUSTER is not set
# CONFIG_SUPPORT_FAN_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_FAULT_INJECTION_CLUSTER is not set
# CONFIG_SUPPORT_FIXED_LABEL_CLUSTER is not set
# CONFIG_SUPPORT_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
CONFIG_SUPPORT_GENERAL_COMMISSIONING_CLUSTER=y
CONFIG_SUPPORT_GENERAL_DIAGNOSTICS_CLUSTER=y
CONFIG_SUPPORT_GROUPS_CLUSTER=y
# CONFIG_SUPPORT_HEPA_FILTER_MONITORING_CLUSTER is not set
CONFIG_SUPPORT_GROUP_KEY_MANAGEMENT_CLUSTER=y
# CONFIG_SUPPORT_ICD_MANAGEMENT_CLUSTER is not set
CONFIG_SUPPORT_IDENTIFY_CLUSTER=y
# CONFIG_SUPPORT_JOINT_FABRIC_DATASTORE_CLUSTER is not set
# CONFIG_SUPPORT_JOINT_FABRIC_ADMINISTRATOR_CLUSTER is not set
# CONFIG_SUPPORT_KEYPAD_INPUT_CLUSTER is not set
# CONFIG_SUPPORT_LAUNDRY_WASHER_MODE_CLUSTER is not set
CONFIG_SUPPORT_LEVEL_CONTROL_CLUSTER=y
# CONFIG_SUPPORT_LOCALIZATION_CONFIGURATION_CLUSTER is not set
# CONFIG_SUPPORT_LOW_POWER_CLUSTER is not set
# CONFIG_SUPPORT_MEDIA_INPUT_CLUSTER is not set
# CONFIG_SUPPORT_MEDIA_PLAYBACK_CLUSTER is not set
# CONFIG_SUPPORT_MICROWAVE_OVEN_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_MESSAGES_CLUSTER is not set
# CONFIG_SUPPORT_MODE_SELECT_CLUSTER is not set
# CONFIG_SUPPORT_NETWORK_COMMISSIONING_CLUSTER is not set
# CONFIG_SUPPORT_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PUSH_AV_STREAM_TRANSPORT_CLUSTER is not set
# CONFIG_SUPPORT_SAMPLE_MEI_CLUSTER is not set
# CONFIG_SUPPORT_OCCUPANCY_SENSING_CLUSTER is not set
CONFIG_SUPPORT_ON_OFF_CLUSTER=y
# CONFIG_SUPPORT_POWER_TOPOLOGY_CLUSTER is not set
CONFIG_SUPPORT_OPERATIONAL_CREDENTIALS_CLUSTER=y
# CONFIG_SUPPORT_OPERATIONAL_STATE_CLUSTER is not set
# CONFIG_SUPPORT_OPERATIONAL_STATE_OVEN_CLUSTER is not set
# CONFIG_SUPPORT_OPERATIONAL_STATE_RVC_CLUSTER is not set
# CONFIG_SUPPORT_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER is not set
# CONFIG_SUPPORT_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER is not set
# CONFIG_SUPPORT_OVEN_MODE_CLUSTER is not set
# CONFIG_SUPPORT_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PM10_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PM1_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_POWER_SOURCE_CLUSTER is not set
# CONFIG_SUPPORT_POWER_SOURCE_CONFIGURATION_CLUSTER is not set
# CONFIG_SUPPORT_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_RADON_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_REFRIGERATOR_ALARM_CLUSTER is not set
# CONFIG_SUPPORT_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER is not set
# CONFIG_SUPPORT_RVC_CLEAN_MODE_CLUSTER is not set
# CONFIG_SUPPORT_RVC_RUN_MODE_CLUSTER is not set
CONFIG_SUPPORT_SCENES_CLUSTER=y
# CONFIG_SUPPORT_SERVICE_AREA_CLUSTER is not set
# CONFIG_SUPPORT_SMOKE_CO_ALARM_CLUSTER is not set
# CONFIG_SUPPORT_SOFTWARE_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_SOIL_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_SWITCH_CLUSTER is not set
# CONFIG_SUPPORT_TARGET_NAVIGATOR_CLUSTER is not set
# CONFIG_SUPPORT_TEMPERATURE_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_THERMOSTAT_CLUSTER is not set
# CONFIG_SUPPORT_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER is not set
# CONFIG_SUPPORT_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_THREAD_NETWORK_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_THREAD_NETWORK_DIRECTORY_CLUSTER is not set
# CONFIG_SUPPORT_TIME_FORMAT_LOCALIZATION_CLUSTER is not set
# CONFIG_SUPPORT_TIME_SYNCHRONIZATION_CLUSTER is not set
# CONFIG_SUPPORT_TIMER_CLUSTER is not set
# CONFIG_SUPPORT_TLS_CERTIFICATE_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_TLS_CLIENT_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER is not set
# CONFIG_SUPPORT_UNIT_LOCALIZATION_CLUSTER is not set
# CONFIG_SUPPORT_UNIT_TESTING_CLUSTER is not set
# CONFIG_SUPPORT_USER_LABEL_CLUSTER is not set
# CONFIG_SUPPORT_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER is not set
# CONFIG_SUPPORT_WAKE_ON_LAN_CLUSTER is not set
# CONFIG_SUPPORT_LAUNDRY_WASHER_CONTROLS_CLUSTER is not set
# CONFIG_SUPPORT_LAUNDRY_DRYER_CONTROLS_CLUSTER is not set
# CONFIG_SUPPORT_WEB_RTC_TRANSPORT_PROVIDER_CLUSTER is not set
# CONFIG_SUPPORT_WEB_RTC_TRANSPORT_REQUESTOR_CLUSTER is not set
# CONFIG_SUPPORT_WIFI_NETWORK_DIAGNOSTICS_CLUSTER is not set
# CONFIG_SUPPORT_WIFI_NETWORK_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_WINDOW_COVERING_CLUSTER is not set
# CONFIG_SUPPORT_WATER_HEATER_MANAGEMENT_CLUSTER is not set
# CONFIG_SUPPORT_WATER_HEATER_MODE_CLUSTER is not set
# CONFIG_SUPPORT_ZONE_MANAGEMENT_CLUSTER is not set
# end of Select Supported Matter Clusters
# end of ESP Matter
#
# ESP Matter Bridge
#
CONFIG_ESP_MATTER_AGGREGATOR_ENDPOINT_COUNT=1
CONFIG_ESP_MATTER_BRIDGE_INFO_PART_NAME="nvs"
# end of ESP Matter Bridge
#
# ESP Matter Console
#
CONFIG_ESP_MATTER_CONSOLE_TASK_STACK=2048
CONFIG_ESP_MATTER_CONSOLE_MAX_COMMANDS=10
# end of ESP Matter Console
#
# ESP Matter Controller
#
# CONFIG_ESP_MATTER_CONTROLLER_ENABLE is not set
# end of ESP Matter Controller
#
# ESP Matter OTA Provider
#
# CONFIG_ESP_MATTER_OTA_PROVIDER_ENABLED is not set
# end of ESP Matter OTA Provider
#
# OpenThread RCP Update
#
# CONFIG_AUTO_UPDATE_RCP is not set
# CONFIG_CREATE_OTA_IMAGE_WITH_RCP_FW is not set
# end of OpenThread RCP Update
#
# ESP Secure Cert Manager
#
CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=y
# CONFIG_ESP_SECURE_CERT_SUPPORT_LEGACY_FORMATS is not set
# CONFIG_ESP_SECURE_CERT_WRITE_ENABLE_LOGGING is not set
# end of ESP Secure Cert Manager
#
# TinyUSB Stack
#
CONFIG_TINYUSB_DEBUG_LEVEL=1
#
# TinyUSB DCD
#
# CONFIG_TINYUSB_MODE_SLAVE is not set
CONFIG_TINYUSB_MODE_DMA=y
# end of TinyUSB DCD
#
# TinyUSB callbacks
#
# CONFIG_TINYUSB_SUSPEND_CALLBACK is not set
# CONFIG_TINYUSB_RESUME_CALLBACK is not set
# end of TinyUSB callbacks
#
# Descriptor configuration
#
#
# You can provide your custom descriptors via tinyusb_driver_install()
#
CONFIG_TINYUSB_DESC_USE_ESPRESSIF_VID=y
CONFIG_TINYUSB_DESC_USE_DEFAULT_PID=y
CONFIG_TINYUSB_DESC_BCD_DEVICE=0x0100
CONFIG_TINYUSB_DESC_MANUFACTURER_STRING="Espressif Systems"
CONFIG_TINYUSB_DESC_PRODUCT_STRING="Espressif Device"
CONFIG_TINYUSB_DESC_SERIAL_STRING="123456"
# end of Descriptor configuration
#
# Mass Storage Class (MSC)
#
# CONFIG_TINYUSB_MSC_ENABLED is not set
# end of Mass Storage Class (MSC)
#
# Communication Device Class (CDC)
#
# CONFIG_TINYUSB_CDC_ENABLED is not set
# end of Communication Device Class (CDC)
#
# Musical Instrument Digital Interface (MIDI)
#
CONFIG_TINYUSB_MIDI_COUNT=0
# end of Musical Instrument Digital Interface (MIDI)
#
# Human Interface Device Class (HID)
#
CONFIG_TINYUSB_HID_COUNT=1
# end of Human Interface Device Class (HID)
#
# Device Firmware Upgrade (DFU)
#
# CONFIG_TINYUSB_DFU_MODE_DFU is not set
# CONFIG_TINYUSB_DFU_MODE_DFU_RUNTIME is not set
CONFIG_TINYUSB_DFU_MODE_NONE=y
# end of Device Firmware Upgrade (DFU)
#
# Bluetooth Host Class (BTH)
#
# CONFIG_TINYUSB_BTH_ENABLED is not set
# end of Bluetooth Host Class (BTH)
#
# Network driver (ECM/NCM/RNDIS)
#
# CONFIG_TINYUSB_NET_MODE_ECM_RNDIS is not set
# CONFIG_TINYUSB_NET_MODE_NCM is not set
CONFIG_TINYUSB_NET_MODE_NONE=y
# end of Network driver (ECM/NCM/RNDIS)
#
# Vendor Specific Interface
#
CONFIG_TINYUSB_VENDOR_COUNT=0
# end of Vendor Specific Interface
# end of TinyUSB Stack
#
# jsmn
#
# CONFIG_JSMN_PARENT_LINKS is not set
# CONFIG_JSMN_STRICT is not set
# CONFIG_JSMN_STATIC is not set
# end of jsmn
#
# mDNS
#
CONFIG_MDNS_MAX_INTERFACES=3
CONFIG_MDNS_MAX_SERVICES=10
CONFIG_MDNS_TASK_PRIORITY=1
CONFIG_MDNS_ACTION_QUEUE_LEN=16
CONFIG_MDNS_TASK_STACK_SIZE=4096
# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set
CONFIG_MDNS_TASK_AFFINITY_CPU0=y
# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set
CONFIG_MDNS_TASK_AFFINITY=0x0
#
# MDNS Memory Configuration
#
CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM=y
# CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL is not set
CONFIG_MDNS_MEMORY_ALLOC_SPIRAM=y
# CONFIG_MDNS_MEMORY_ALLOC_INTERNAL is not set
# CONFIG_MDNS_MEMORY_CUSTOM_IMPL is not set
# end of MDNS Memory Configuration
CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000
CONFIG_MDNS_TIMER_PERIOD_MS=100
# CONFIG_MDNS_NETWORKING_SOCKET is not set
# CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES is not set
# CONFIG_MDNS_ENABLE_DEBUG_PRINTS is not set
CONFIG_MDNS_ENABLE_CONSOLE_CLI=y
# CONFIG_MDNS_RESPOND_REVERSE_QUERIES is not set
CONFIG_MDNS_MULTIPLE_INSTANCE=y
#
# MDNS Predefined interfaces
#
CONFIG_MDNS_PREDEF_NETIF_STA=y
CONFIG_MDNS_PREDEF_NETIF_AP=y
CONFIG_MDNS_PREDEF_NETIF_ETH=y
# end of MDNS Predefined interfaces
# end of mDNS
#
# ESP-MQTT Configurations
#
@@ -2973,6 +3649,55 @@ CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED=y
CONFIG_MQTT_USE_CORE_1=y
# CONFIG_MQTT_CUSTOM_OUTBOX is not set
# end of ESP-MQTT Configurations
#
# ESP RainMaker Command-Response
#
CONFIG_ESP_RMAKER_MAX_COMMANDS=10
# end of ESP RainMaker Command-Response
#
# ESP RainMaker Common
#
CONFIG_ESP_RMAKER_LIB_ESP_MQTT=y
# CONFIG_ESP_RMAKER_LIB_AWS_IOT is not set
CONFIG_ESP_RMAKER_MQTT_GLUE_LIB=1
CONFIG_ESP_RMAKER_MQTT_PORT_443=y
# CONFIG_ESP_RMAKER_MQTT_PORT_8883 is not set
CONFIG_ESP_RMAKER_MQTT_PORT=1
# CONFIG_ESP_RMAKER_MQTT_PERSISTENT_SESSION is not set
CONFIG_ESP_RMAKER_MQTT_SEND_USERNAME=y
CONFIG_ESP_RMAKER_MQTT_PRODUCT_NAME="RMDev"
CONFIG_ESP_RMAKER_MQTT_PRODUCT_VERSION="1x0"
CONFIG_ESP_RMAKER_MQTT_PRODUCT_SKU="EX00"
CONFIG_ESP_RMAKER_MQTT_USE_CERT_BUNDLE=y
CONFIG_ESP_RMAKER_MAX_MQTT_SUBSCRIPTIONS=10
CONFIG_ESP_RMAKER_MQTT_KEEP_ALIVE_INTERVAL=120
CONFIG_ESP_RMAKER_FACTORY_PARTITION_NAME="fctry"
CONFIG_ESP_RMAKER_FACTORY_NAMESPACE="rmaker_creds"
# end of ESP RainMaker Common
#
# ESP RainMaker Console
#
CONFIG_ESP_RMAKER_CONSOLE_ENABLED=y
CONFIG_ESP_RMAKER_CONSOLE_TASK_STACK=4096
CONFIG_ESP_RMAKER_CONSOLE_TASK_PRIORITY=5
# end of ESP RainMaker Console
#
# ESP RainMaker Time Sync
#
CONFIG_ESP_RMAKER_DEF_TIMEZONE="Asia/Shanghai"
CONFIG_ESP_RMAKER_SNTP_SERVER_NAME="pool.ntp.org"
# end of ESP RainMaker Time Sync
#
# ESP RainMaker Work Queue
#
CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_STACK=5120
CONFIG_ESP_RMAKER_WORK_QUEUE_TASK_PRIORITY=5
# end of ESP RainMaker Work Queue
# end of Component config
# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set
@@ -190,6 +190,9 @@ class DaliDomainService {
bool logarithmic_curve = false) const;
bool setColTempRaw(uint8_t gateway_id, int short_address, int mirek) const;
bool setColTemp(uint8_t gateway_id, int short_address, int kelvin) const;
// Accepts a DALI logical target (short address 0-63, group 64-79, or
// broadcast 127). Callers must not construct encoded command addresses.
bool setColourXY(uint8_t gateway_id, int logical_target, int x, int y) const;
bool setColourRaw(uint8_t gateway_id, int raw_addr, int x, int y) const;
bool setColourRGB(uint8_t gateway_id, int short_address, int r, int g, int b) const;
bool setColourRGBW(uint8_t gateway_id, int short_address, int r, int g, int b, int w) const;
@@ -1528,6 +1528,19 @@ bool DaliDomainService::setColTemp(uint8_t gateway_id, int short_address, int ke
return channel->dali->dt8.setColorTemperature(short_address, kelvin);
}
bool DaliDomainService::setColourXY(uint8_t gateway_id, int logical_target, int x,
int y) const {
const auto* channel = findChannelByGateway(gateway_id);
if (channel == nullptr || channel->dali == nullptr || logical_target < 0 ||
!((logical_target <= 79) || logical_target == 127)) {
return false;
}
markBusActivity(gateway_id);
const double normalized_x = std::clamp(x, 0, 65535) / 65535.0;
const double normalized_y = std::clamp(y, 0, 65535) / 65535.0;
return channel->dali->dt8.setColour(logical_target, normalized_x, normalized_y);
}
bool DaliDomainService::setColourRaw(uint8_t gateway_id, int raw_addr, int x, int y) const {
const auto* channel = findChannelByGateway(gateway_id);
if (channel == nullptr || channel->dali == nullptr) {
@@ -23,6 +23,7 @@ struct GatewayBacnetServerConfig {
uint16_t udp_port{47808};
uint32_t task_stack_size{8192};
UBaseType_t task_priority{5};
bool task_stack_in_psram{false};
};
struct GatewayBacnetObjectBinding {
@@ -2,7 +2,9 @@
#include "gateway_bacnet_stack_port.h"
#include "esp_heap_caps.h"
#include "esp_log.h"
#include "freertos/idf_additions.h"
#include "freertos/semphr.h"
#include <algorithm>
@@ -318,9 +320,21 @@ esp_err_t GatewayBacnetServer::startStackLocked(const GatewayBacnetServerConfig&
return ESP_FAIL;
}
const BaseType_t created = xTaskCreate(&GatewayBacnetServer::TaskEntry, "gw_bacnet_ip",
active_config_.task_stack_size, this,
active_config_.task_priority, &task_handle_);
BaseType_t created = pdFAIL;
if (active_config_.task_stack_in_psram) {
created = xTaskCreateWithCaps(
&GatewayBacnetServer::TaskEntry, "gw_bacnet_ip",
active_config_.task_stack_size, this, active_config_.task_priority,
&task_handle_, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
if (created != pdPASS) {
ESP_LOGW(kTag, "PSRAM BACnet stack allocation failed; using internal RAM");
}
}
if (created != pdPASS) {
created = xTaskCreate(&GatewayBacnetServer::TaskEntry, "gw_bacnet_ip",
active_config_.task_stack_size, this,
active_config_.task_priority, &task_handle_);
}
if (created != pdPASS) {
task_handle_ = nullptr;
gateway_bacnet_stack_cleanup();
+2 -1
View File
@@ -2,6 +2,7 @@ idf_component_register(
SRCS "src/gateway_ble.cpp"
INCLUDE_DIRS "include"
REQUIRES gateway_controller gateway_runtime dali_domain bt esp_timer freertos log nvs_flash
PRIV_REQUIRES esp_matter
)
set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17)
+11 -1
View File
@@ -24,6 +24,9 @@ class GatewayBleBridge {
DaliDomainService& dali_domain);
esp_err_t start();
esp_err_t prepareSharedNimble();
esp_err_t attachSharedNimble();
void handleMatterAdvertisingChange(bool advertising);
void handleSync();
int handleGapEvent(struct ble_gap_event* event);
int handleAccess(uint16_t conn_handle, uint16_t attr_handle,
@@ -32,7 +35,9 @@ class GatewayBleBridge {
private:
static constexpr uint16_t kInvalidConnectionHandle = 0xffff;
esp_err_t prepare();
esp_err_t initNimble();
esp_err_t configureSharedScanResponse();
void refreshDeviceName();
void setEnabled(bool enabled);
void startAdvertising();
@@ -48,9 +53,14 @@ class GatewayBleBridge {
GatewayController& controller_;
GatewayRuntime& runtime_;
DaliDomainService& dali_domain_;
bool prepared_{false};
bool started_{false};
bool synced_{false};
bool enabled_{false};
bool shared_nimble_{false};
bool gap_listener_registered_{false};
bool matter_advertising_{false};
bool gateway_advertising_{false};
uint8_t own_addr_type_{0};
uint16_t conn_handle_{kInvalidConnectionHandle};
std::string device_name_;
@@ -60,4 +70,4 @@ class GatewayBleBridge {
int64_t last_notify_at_us_{0};
};
} // namespace gateway
} // namespace gateway
+240 -20
View File
@@ -7,11 +7,13 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_check.h"
#include "esp_log.h"
#include "esp_timer.h"
#include "host/ble_gap.h"
#include "host/ble_gatt.h"
#include "host/ble_hs.h"
#include "host/ble_hs_adv.h"
#include "host/ble_store.h"
#include "host/util/util.h"
#include "nimble/ble.h"
@@ -21,12 +23,28 @@
#include "services/gatt/ble_svc_gatt.h"
#include "store/config/ble_store_config.h"
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
#include "lib/support/Span.h"
#include "platform/CHIPDeviceLayer.h"
#include "platform/ESP32/BLEManagerImpl.h"
#endif
#include <algorithm>
#include <iterator>
namespace {
constexpr const char* kTag = "gateway_ble";
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
// Matter owns the standard CHIPoBLE 0xFFF6 service. Keep the gateway on a
// distinct primary service so mobile GATT clients never resolve the wrong
// duplicate service while both protocols share CHIP's NimBLE host.
constexpr uint16_t kServiceUuid = 0xFFF7;
#else
// Preserve the established standalone gateway BLE profile when CHIP is not
// present in the firmware.
constexpr uint16_t kServiceUuid = 0xFFF6;
#endif
constexpr uint16_t kChannel1Uuid = 0xFFF1;
constexpr uint16_t kChannel2Uuid = 0xFFF2;
constexpr uint16_t kGatewayUuid = 0xFFF3;
@@ -34,9 +52,11 @@ constexpr int64_t kGenericDedupeWindowUs = 120000;
constexpr size_t kGatewayCharacteristicIndex = 2;
constexpr int kGatewayNotifyAllocationAttempts = 6;
constexpr TickType_t kGatewayNotifyRetryDelayTicks = pdMS_TO_TICKS(20);
constexpr size_t kLegacyAdvertisingDataMaxLength = 31;
gateway::GatewayBleBridge* s_active_bridge = nullptr;
uint16_t s_value_handles[3] = {0, 0, 0};
struct ble_gap_event_listener s_gap_listener;
int GapEvent(struct ble_gap_event* event, void* arg);
int AccessCharacteristic(uint16_t conn_handle, uint16_t attr_handle,
@@ -181,6 +201,25 @@ esp_err_t GatewayBleBridge::start() {
return ESP_OK;
}
shared_nimble_ = false;
const esp_err_t prepare_err = prepare();
if (prepare_err != ESP_OK) return prepare_err;
const esp_err_t err = initNimble();
if (err != ESP_OK) {
s_active_bridge = nullptr;
return err;
}
started_ = true;
ESP_LOGI(kTag, "BLE bridge started host=standalone enabled=%d name=%s", enabled_,
device_name_.c_str());
return ESP_OK;
}
esp_err_t GatewayBleBridge::prepare() {
if (prepared_) return ESP_OK;
s_active_bridge = this;
enabled_ = runtime_.bleEnabled();
refreshDeviceName();
@@ -191,15 +230,126 @@ esp_err_t GatewayBleBridge::start() {
controller_.addGatewayNameSink([this](uint8_t) { refreshDeviceName(); });
dali_domain_.addRawFrameSink([this](const DaliRawFrame& frame) { handleDaliRawFrame(frame); });
const esp_err_t err = initNimble();
if (err != ESP_OK) {
s_active_bridge = nullptr;
return err;
prepared_ = true;
return ESP_OK;
}
esp_err_t GatewayBleBridge::prepareSharedNimble() {
#ifndef CONFIG_GATEWAY_MATTER_SUPPORTED
return ESP_ERR_NOT_SUPPORTED;
#else
if (started_) return shared_nimble_ ? ESP_OK : ESP_ERR_INVALID_STATE;
ESP_RETURN_ON_ERROR(prepare(), kTag, "failed to prepare shared BLE bridge");
shared_nimble_ = true;
std::vector<struct ble_gatt_svc_def> services{kGattServices[0]};
const CHIP_ERROR service_err =
chip::DeviceLayer::Internal::BLEMgrImpl().ConfigureExtraServices(services, false);
if (service_err != CHIP_NO_ERROR) {
ESP_LOGE(kTag, "failed to add gateway GATT service to CHIP: %s",
service_err.AsString());
return ESP_FAIL;
}
ESP_RETURN_ON_ERROR(configureSharedScanResponse(), kTag,
"failed to configure shared BLE scan response");
return ESP_OK;
#endif
}
esp_err_t GatewayBleBridge::attachSharedNimble() {
#ifndef CONFIG_GATEWAY_MATTER_SUPPORTED
return ESP_ERR_NOT_SUPPORTED;
#else
if (started_) return shared_nimble_ ? ESP_OK : ESP_ERR_INVALID_STATE;
if (!prepared_ || !shared_nimble_ || !ble_hs_synced()) return ESP_ERR_INVALID_STATE;
const int listener_err =
ble_gap_event_listener_register(&s_gap_listener, GapEvent, this);
if (listener_err != 0 && listener_err != BLE_HS_EALREADY) {
ESP_LOGE(kTag, "failed to register shared GAP listener rc=%d", listener_err);
return ESP_FAIL;
}
gap_listener_registered_ = true;
started_ = true;
// The CHIP advertising-change event is posted asynchronously. ESP-Matter
// can therefore already be advertising before MatterEvent has delivered
// the notification to us. Seed the shared state from CHIP before handleSync
// decides whether the gateway needs its fallback advertisement.
matter_advertising_ =
chip::DeviceLayer::ConnectivityMgr().IsBLEAdvertisingEnabled() ||
chip::DeviceLayer::ConnectivityMgr().IsBLEAdvertising();
handleSync();
uint16_t service_handle = 0;
const int service_err = ble_gatts_find_svc(&kServiceUuidDef.u, &service_handle);
if (service_err != 0 || service_handle == 0) {
ESP_LOGE(kTag, "shared gateway GATT service is unavailable rc=%d handle=%u",
service_err, service_handle);
return ESP_FAIL;
}
const ble_uuid_t* characteristic_uuids[] = {
&kChannel1UuidDef.u,
&kChannel2UuidDef.u,
&kGatewayUuidDef.u,
};
for (size_t index = 0; index < std::size(characteristic_uuids); ++index) {
uint16_t definition_handle = 0;
uint16_t value_handle = 0;
const int characteristic_err =
ble_gatts_find_chr(&kServiceUuidDef.u, characteristic_uuids[index],
&definition_handle, &value_handle);
if (characteristic_err != 0 || definition_handle == 0 || value_handle == 0) {
ESP_LOGE(kTag,
"shared gateway GATT characteristic missing index=%u rc=%d def=%u val=%u",
static_cast<unsigned>(index), characteristic_err,
definition_handle, value_handle);
return ESP_FAIL;
}
s_value_handles[index] = value_handle;
ESP_LOGI(kTag, "shared gateway characteristic index=%u def=%u val=%u",
static_cast<unsigned>(index), definition_handle, value_handle);
}
ESP_LOGI(kTag,
"BLE bridge started host=CHIP shared=1 enabled=%d name=%s service=0x%04x handle=%u",
enabled_, device_name_.c_str(), kServiceUuid, service_handle);
return ESP_OK;
#endif
}
esp_err_t GatewayBleBridge::configureSharedScanResponse() {
#ifndef CONFIG_GATEWAY_MATTER_SUPPORTED
return ESP_ERR_NOT_SUPPORTED;
#else
if (!enabled_) {
chip::DeviceLayer::Internal::BLEMgrImpl().ClearScanResponseData();
return ESP_OK;
}
started_ = true;
ESP_LOGI(kTag, "BLE bridge started enabled=%d name=%s", enabled_, device_name_.c_str());
std::vector<uint8_t> scan_response{
3,
BLE_HS_ADV_TYPE_COMP_UUIDS16,
static_cast<uint8_t>(kServiceUuid & 0xff),
static_cast<uint8_t>((kServiceUuid >> 8) & 0xff),
};
const size_t max_name_length =
kLegacyAdvertisingDataMaxLength - scan_response.size() - 2;
const size_t name_length = std::min(device_name_.size(), max_name_length);
scan_response.push_back(static_cast<uint8_t>(name_length + 1));
scan_response.push_back(name_length == device_name_.size()
? BLE_HS_ADV_TYPE_COMP_NAME
: BLE_HS_ADV_TYPE_INCOMP_NAME);
scan_response.insert(scan_response.end(), device_name_.begin(),
device_name_.begin() + name_length);
const CHIP_ERROR err =
chip::DeviceLayer::Internal::BLEMgrImpl().ConfigureScanResponseData(
chip::ByteSpan(scan_response.data(), scan_response.size()));
if (err != CHIP_NO_ERROR) {
ESP_LOGE(kTag, "failed to configure CHIP scan response: %s", err.AsString());
return ESP_FAIL;
}
return ESP_OK;
#endif
}
esp_err_t GatewayBleBridge::initNimble() {
@@ -268,6 +418,25 @@ void GatewayBleBridge::refreshDeviceName() {
return;
}
if (shared_nimble_) {
if (configureSharedScanResponse() != ESP_OK) {
ESP_LOGW(kTag, "failed to refresh shared BLE scan response");
}
if (matter_advertising_) {
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
const CHIP_ERROR err =
chip::DeviceLayer::ConnectivityMgr().SetBLEAdvertisingEnabled(true);
if (err != CHIP_NO_ERROR) {
ESP_LOGW(kTag, "failed to refresh Matter BLE advertising: %s", err.AsString());
}
#endif
} else if (enabled_ && conn_handle_ == kInvalidConnectionHandle) {
stopAdvertising();
startAdvertising();
}
return;
}
#if CONFIG_BT_NIMBLE_GAP_SERVICE
const int rc = ble_svc_gap_device_name_set(device_name_.c_str());
if (rc != 0) {
@@ -283,13 +452,28 @@ void GatewayBleBridge::refreshDeviceName() {
void GatewayBleBridge::setEnabled(bool enabled) {
enabled_ = enabled;
if (shared_nimble_ && !enabled_) {
if (configureSharedScanResponse() != ESP_OK) {
ESP_LOGW(kTag, "failed to remove gateway BLE scan response");
}
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
if (matter_advertising_) {
const CHIP_ERROR err =
chip::DeviceLayer::ConnectivityMgr().SetBLEAdvertisingEnabled(true);
if (err != CHIP_NO_ERROR) {
ESP_LOGW(kTag, "failed to refresh Matter BLE advertising: %s", err.AsString());
}
}
#endif
}
if (!synced_) {
return;
}
if (enabled_) {
refreshDeviceName();
if (conn_handle_ == kInvalidConnectionHandle) {
if (conn_handle_ == kInvalidConnectionHandle &&
(!shared_nimble_ || !matter_advertising_)) {
startAdvertising();
}
return;
@@ -305,7 +489,15 @@ void GatewayBleBridge::setEnabled(bool enabled) {
}
void GatewayBleBridge::startAdvertising() {
if (!enabled_ || ble_gap_adv_active()) {
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
if (shared_nimble_ &&
(matter_advertising_ ||
chip::DeviceLayer::ConnectivityMgr().IsBLEAdvertising())) {
matter_advertising_ = true;
return;
}
#endif
if (!enabled_ || gateway_advertising_ || ble_gap_adv_active()) {
return;
}
@@ -333,16 +525,33 @@ void GatewayBleBridge::startAdvertising() {
rc = ble_gap_adv_start(own_addr_type_, nullptr, BLE_HS_FOREVER, &params, GapEvent, this);
if (rc != 0) {
ESP_LOGE(kTag, "failed to start BLE advertising rc=%d", rc);
return;
}
gateway_advertising_ = true;
ESP_LOGI(kTag, "gateway BLE advertising started service=0x%04x", kServiceUuid);
}
void GatewayBleBridge::stopAdvertising() {
if (!ble_gap_adv_active()) {
if ((shared_nimble_ && !gateway_advertising_) || !ble_gap_adv_active()) {
return;
}
const int rc = ble_gap_adv_stop();
if (rc != 0) {
ESP_LOGW(kTag, "failed to stop BLE advertising rc=%d", rc);
return;
}
gateway_advertising_ = false;
}
void GatewayBleBridge::handleMatterAdvertisingChange(bool advertising) {
if (!shared_nimble_) return;
matter_advertising_ = advertising;
if (advertising) {
gateway_advertising_ = false;
return;
}
if (started_ && enabled_ && conn_handle_ == kInvalidConnectionHandle) {
startAdvertising();
}
}
@@ -479,6 +688,7 @@ int GatewayBleBridge::handleGapEvent(struct ble_gap_event* event) {
switch (event->type) {
case BLE_GAP_EVENT_CONNECT:
if (event->connect.status == 0) {
if (shared_nimble_) return 0;
conn_handle_ = event->connect.conn_handle;
notify_enabled_.fill(false);
last_notify_payload_.clear();
@@ -496,28 +706,37 @@ int GatewayBleBridge::handleGapEvent(struct ble_gap_event* event) {
ESP_LOGW(kTag, "ble_gap_update_params rc=%d", rc);
}
ESP_LOGI(kTag, "BLE client connected handle=%u", conn_handle_);
} else if (enabled_) {
} else if (enabled_ && (!shared_nimble_ || !matter_advertising_)) {
startAdvertising();
}
return 0;
case BLE_GAP_EVENT_DISCONNECT:
conn_handle_ = kInvalidConnectionHandle;
notify_enabled_.fill(false);
last_notify_payload_.clear();
last_notify_at_us_ = 0;
if (enabled_) {
case BLE_GAP_EVENT_DISCONNECT: {
const bool gateway_connection =
event->disconnect.conn.conn_handle == conn_handle_;
if (gateway_connection) {
conn_handle_ = kInvalidConnectionHandle;
notify_enabled_.fill(false);
last_notify_payload_.clear();
last_notify_at_us_ = 0;
}
if (enabled_ && (!shared_nimble_ || !matter_advertising_)) {
startAdvertising();
}
ESP_LOGI(kTag, "BLE client disconnected reason=%d", event->disconnect.reason);
if (gateway_connection || !shared_nimble_) {
ESP_LOGI(kTag, "BLE client disconnected reason=%d", event->disconnect.reason);
}
return 0;
}
case BLE_GAP_EVENT_ADV_COMPLETE:
if (enabled_ && conn_handle_ == kInvalidConnectionHandle) {
gateway_advertising_ = false;
if (!shared_nimble_ && enabled_ && conn_handle_ == kInvalidConnectionHandle) {
startAdvertising();
}
return 0;
case BLE_GAP_EVENT_SUBSCRIBE: {
const int index = characteristicIndex(event->subscribe.attr_handle);
if (index >= 0 && event->subscribe.conn_handle == conn_handle_) {
if (index >= 0) {
conn_handle_ = event->subscribe.conn_handle;
notify_enabled_[index] = event->subscribe.cur_notify != 0;
}
return 0;
@@ -527,12 +746,13 @@ int GatewayBleBridge::handleGapEvent(struct ble_gap_event* event) {
}
}
int GatewayBleBridge::handleAccess(uint16_t, uint16_t attr_handle,
int GatewayBleBridge::handleAccess(uint16_t conn_handle, uint16_t attr_handle,
struct ble_gatt_access_ctxt* ctxt) {
const int index = characteristicIndex(attr_handle);
if (index < 0) {
return BLE_ATT_ERR_UNLIKELY;
}
conn_handle_ = conn_handle;
switch (ctxt->op) {
case BLE_GATT_ACCESS_OP_READ_CHR:
@@ -45,6 +45,7 @@ struct GatewayBridgeServiceConfig {
std::vector<int> reserved_uart_ports;
uint32_t bacnet_task_stack_size{8192};
UBaseType_t bacnet_task_priority{5};
bool bacnet_task_stack_in_psram{false};
uint32_t knx_task_stack_size{12288};
UBaseType_t knx_task_priority{5};
std::optional<GatewayKnxConfig> default_knx_config;
@@ -52,6 +53,10 @@ struct GatewayBridgeServiceConfig {
std::function<GatewayBridgeHttpResponse()> gateway_settings_getter;
std::function<GatewayBridgeHttpResponse(std::string_view)> gateway_settings_setter;
std::function<std::string(std::string_view)> gateway_settings_cloud_handler;
std::function<GatewayBridgeHttpResponse(std::optional<uint8_t>)> matter_status_getter;
std::function<GatewayBridgeHttpResponse()> matter_onboarding_getter;
std::function<GatewayBridgeHttpResponse(std::string_view, std::optional<uint8_t>,
std::string_view)> matter_action_handler;
GatewayKnxGatewaySnapshotProvider knx_gateway_snapshot_provider;
GatewayKnxGatewayCommandTransactor knx_gateway_command_transactor;
};
@@ -2066,6 +2066,7 @@ struct GatewayBridgeService::ChannelRuntime {
}
config.task_stack_size = service_config.bacnet_task_stack_size;
config.task_priority = service_config.bacnet_task_priority;
config.task_stack_in_psram = service_config.bacnet_task_stack_in_psram;
if (bacnet_server_config.has_value()) {
config.device_instance = bacnet_server_config->deviceInstance;
config.local_address = bacnet_server_config->localAddress;
@@ -4636,6 +4637,18 @@ GatewayBridgeHttpResponse GatewayBridgeService::handleGet(
}
return config_.gateway_settings_getter();
}
if (action == "matter_status") {
if (!config_.matter_status_getter) {
return ErrorResponse(ESP_ERR_NOT_SUPPORTED, "Matter status is not available");
}
return config_.matter_status_getter(gateway_id);
}
if (action == "matter_onboarding") {
if (!config_.matter_onboarding_getter) {
return ErrorResponse(ESP_ERR_NOT_SUPPORTED, "Matter onboarding is not available");
}
return config_.matter_onboarding_getter();
}
if (action == "status" && !gateway_id.has_value()) {
cJSON* root = cJSON_CreateObject();
@@ -4814,6 +4827,16 @@ GatewayBridgeHttpResponse GatewayBridgeService::handlePost(
}
return config_.gateway_settings_setter(body);
}
if (action == "matter_open_commissioning" ||
action == "matter_close_commissioning" || action == "matter_rescan" ||
action == "matter_config" || action == "matter_config_reset" ||
action == "matter_factory_data" || action == "matter_factory_reset" ||
action == "matter_restart") {
if (!config_.matter_action_handler) {
return ErrorResponse(ESP_ERR_NOT_SUPPORTED, "Matter control is not available");
}
return config_.matter_action_handler(action, gateway_id, body);
}
if (!gateway_id.has_value()) {
return ErrorResponse(ESP_ERR_INVALID_ARG, "gateway id is required");
}
@@ -27,6 +27,7 @@ class GatewayRuntime;
struct GatewayControllerConfig {
uint32_t task_stack_size{12288};
UBaseType_t task_priority{5};
bool operation_task_stack_in_psram{false};
int color_temperature_min{2000};
int color_temperature_max{6500};
bool setup_supported{true};
@@ -187,6 +188,7 @@ class GatewayController {
struct GatewayOperationTaskContext {
GatewayController* controller{nullptr};
bool external_stack{false};
uint8_t gateway_id{0};
uint8_t request_id{0};
uint16_t operation_id{0};
@@ -1,8 +1,10 @@
#include "gateway_controller.hpp"
#include "dali_domain.hpp"
#include "esp_heap_caps.h"
#include "esp_log.h"
#include "esp_system.h"
#include "freertos/idf_additions.h"
#include "gateway_bridge.hpp"
#include "gateway_runtime.hpp"
@@ -924,14 +926,20 @@ void GatewayController::TaskEntry(void* arg) {
void GatewayController::OperationTaskEntry(void* arg) {
auto* context = static_cast<GatewayOperationTaskContext*>(arg);
if (context == nullptr || context->controller == nullptr) {
delete context;
if (context == nullptr) {
vTaskDelete(nullptr);
return;
}
context->controller->runOperationTask(context);
const bool external_stack = context->external_stack;
if (context->controller != nullptr) {
context->controller->runOperationTask(context);
}
delete context;
vTaskDelete(nullptr);
if (external_stack) {
vTaskDeleteWithCaps(nullptr);
} else {
vTaskDelete(nullptr);
}
}
void GatewayController::taskLoop() {
@@ -2495,9 +2503,21 @@ bool GatewayController::startOperation(uint8_t gateway_id, uint8_t request_id,
context->request_id = request_id;
context->operation_id = operation_id;
context->fields = std::move(fields);
const BaseType_t created = xTaskCreate(&GatewayController::OperationTaskEntry, "gateway_op",
config_.task_stack_size, context,
config_.task_priority, nullptr);
BaseType_t created = pdFAIL;
if (config_.operation_task_stack_in_psram) {
created = xTaskCreateWithCaps(
&GatewayController::OperationTaskEntry, "gateway_op", config_.task_stack_size,
context, config_.task_priority, nullptr, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
context->external_stack = created == pdPASS;
if (created != pdPASS) {
ESP_LOGW(kTag, "PSRAM operation stack allocation failed; using internal RAM");
}
}
if (created != pdPASS) {
created = xTaskCreate(&GatewayController::OperationTaskEntry, "gateway_op",
config_.task_stack_size, context,
config_.task_priority, nullptr);
}
if (created != pdPASS) {
delete context;
{
+7
View File
@@ -0,0 +1,7 @@
idf_component_register(
SRCS "src/gateway_matter.cpp" "src/gateway_matter_plan.cpp"
INCLUDE_DIRS "include"
REQUIRES dali_domain esp_driver_gpio esp_matter freertos json log mbedtls nvs_flash
)
set_property(TARGET ${COMPONENT_LIB} PROPERTY CXX_STANDARD 17)
@@ -0,0 +1,4 @@
dependencies:
espressif/esp_matter: "1.5.1"
idf:
version: "==5.5.4"
@@ -0,0 +1,168 @@
#pragma once
#include <atomic>
#include <cstddef>
#include <cstdint>
#include <functional>
#include <memory>
#include <mutex>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
#include "dali_domain.hpp"
#include "gateway_matter_plan.hpp"
#include "esp_err.h"
#include "esp_matter.h"
#include "esp_matter_bridge.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "system/SystemLayer.h"
namespace gateway {
struct GatewayMatterBridgeConfig {
bool enabled{false};
size_t max_bridged_devices{32};
uint32_t scan_start_delay_ms{2000};
uint32_t scan_address_delay_ms{20};
uint32_t scan_task_stack_size{8192};
UBaseType_t scan_task_priority{3};
uint32_t command_task_stack_size{6144};
UBaseType_t command_task_priority{4};
int wifi_provision_button_gpio{-1};
bool wifi_provision_button_active_low{true};
uint32_t wifi_provision_long_press_ms{5000};
uint32_t button_task_stack_size{4096};
UBaseType_t button_task_priority{2};
std::function<esp_err_t()> wifi_provisioning_callback;
std::function<esp_err_t()> ble_prepare_callback;
std::function<esp_err_t()> ble_attach_callback;
std::function<void(bool)> ble_advertising_changed_callback;
};
// ESP-Matter adapter for the platform-neutral DALI domain. Each discovered
// control gear becomes a persistent dynamic endpoint under one aggregator.
class GatewayMatterBridge {
public:
GatewayMatterBridge(DaliDomainService& dali_domain,
GatewayMatterBridgeConfig config = {});
~GatewayMatterBridge() = default;
esp_err_t start();
esp_err_t openCommissioningWindow();
esp_err_t closeCommissioningWindow();
esp_err_t rescanDaliDevices();
esp_err_t applyConfiguration(uint8_t gateway_id, std::string_view patch);
esp_err_t resetConfiguration(uint8_t gateway_id);
esp_err_t prepareFactoryReset(std::string_view payload);
esp_err_t installFactoryData(std::string_view payload);
std::string statusJson(std::optional<uint8_t> gateway_id = std::nullopt) const;
std::string onboardingJson() const;
private:
enum class PendingColorAction : uint8_t {
none = 0,
temperature = 1,
xy = 2,
hueSaturation = 3,
};
struct Binding {
GatewayMatterBridge* owner{nullptr};
uint8_t channel_index{0};
uint8_t gateway_id{0};
MatterTargetKind target_kind{MatterTargetKind::shortAddress};
uint8_t target_address{0};
MatterEndpointType endpoint_type{MatterEndpointType::switchLight};
std::optional<MatterColorMethod> color_method;
uint16_t dali_device_type_mask{0};
uint32_t matter_device_type{0};
uint16_t endpoint_id{0};
uint16_t current_x{32768};
uint16_t current_y{32768};
uint8_t current_level{254};
uint8_t current_hue{0};
uint8_t current_saturation{0};
bool current_on{true};
std::optional<bool> pending_on;
std::optional<uint8_t> pending_level;
std::optional<uint16_t> pending_color_temperature;
std::optional<uint16_t> color_temperature_transition_target;
TickType_t color_temperature_transition_deadline{0};
PendingColorAction pending_color_action{PendingColorAction::none};
bool suppress_attribute_write{false};
esp_matter_bridge::device_t* matter_device{nullptr};
};
struct StatusWork;
static esp_err_t AttributeUpdate(esp_matter::attribute::callback_type_t type,
uint16_t endpoint_id, uint32_t cluster_id,
uint32_t attribute_id,
esp_matter_attr_val_t* value, void* private_data);
static esp_err_t Identify(esp_matter::identification::callback_type_t type,
uint16_t endpoint_id, uint8_t effect_id,
uint8_t effect_variant, void* private_data);
static esp_err_t MoveToColorTemperatureCommand(
const chip::app::ConcreteCommandPath& command_path,
chip::TLV::TLVReader& tlv_data, void* opaque_ptr);
static esp_err_t AddDeviceType(esp_matter::endpoint_t* endpoint,
uint32_t device_type_id, void* private_data);
static void MatterEvent(const chip::DeviceLayer::ChipDeviceEvent* event,
intptr_t argument);
static void ScanTaskEntry(void* argument);
static void CommandTaskEntry(void* argument);
static void ButtonTaskEntry(void* argument);
static void ApplyStatusWork(intptr_t argument);
static void OpenCommissioningWindowWork(intptr_t argument);
static void CloseCommissioningWindowWork(intptr_t argument);
esp_err_t handleAttributeUpdate(Binding& binding, uint32_t cluster_id,
uint32_t attribute_id,
const esp_matter_attr_val_t& value);
esp_err_t initializeBridgeStorage();
esp_err_t resumeBindings();
esp_err_t loadConfigurations();
esp_err_t storeConfiguration(const MatterChannelConfiguration& configuration) const;
esp_err_t configureProvisioningButton();
void scanDaliDevices();
void commandTaskLoop();
esp_err_t reconcileEndpoints();
void buttonTaskLoop();
void handleStatusUpdate(const DaliGatewayStatusUpdate& update);
Binding* findBinding(const MatterTarget& target) const;
Binding* findBinding(uint16_t endpoint_id) const;
esp_err_t createBinding(const MatterEndpointAllocation& allocation,
uint16_t device_type_mask, uint8_t initial_level = 0);
void configureColorCommandCallbacks(Binding& binding);
esp_err_t removeBinding(size_t index);
esp_err_t storeBinding(const Binding& binding) const;
std::unique_ptr<Binding> readBinding(uint16_t endpoint_id) const;
void updateMatterLevel(Binding& binding, uint8_t level);
esp_err_t scheduleDaliAction(Binding& binding);
void applyPendingDaliActions();
void requestWifiProvisioning();
DaliDomainService& dali_domain_;
GatewayMatterBridgeConfig config_;
esp_matter::node_t* node_{nullptr};
uint16_t aggregator_endpoint_id_{0};
mutable std::mutex bindings_mutex_;
std::vector<std::unique_ptr<Binding>> bindings_;
std::vector<MatterChannelConfiguration> configurations_;
MatterEndpointPlan endpoint_plan_;
std::string last_apply_error_;
TaskHandle_t scan_task_{nullptr};
TaskHandle_t command_task_{nullptr};
TaskHandle_t button_task_{nullptr};
bool started_{false};
std::atomic_bool scan_in_progress_{false};
std::atomic_bool ble_advertising_{false};
std::atomic_bool commissioning_window_open_{false};
std::atomic_uint8_t fabric_count_{0};
std::atomic_bool factory_restart_required_{false};
};
} // namespace gateway
@@ -0,0 +1,123 @@
#pragma once
#include <array>
#include <cstddef>
#include <cstdint>
#include <optional>
#include <string>
#include <vector>
namespace gateway {
enum class MatterTargetKind : uint8_t { shortAddress = 0, group = 1, broadcast = 2 };
enum class MatterEndpointType : uint8_t { switchLight = 0, dimmer = 1, colorTemperature = 2, color = 3 };
enum class MatterColorMethod : uint8_t { xy = 0, rgbcw = 1, both = 2 };
enum class MatterAddressOverride : uint8_t { automatic = 0, include = 1, exclude = 2 };
struct MatterTarget {
uint8_t channel_index{0};
uint8_t gateway_id{0};
MatterTargetKind kind{MatterTargetKind::shortAddress};
uint8_t address{0};
bool sameIdentity(const MatterTarget& other) const {
return channel_index == other.channel_index && kind == other.kind && address == other.address;
}
};
struct MatterEndpointOverride {
std::optional<MatterEndpointType> type;
std::optional<MatterColorMethod> color_method;
bool manual() const { return type.has_value() || color_method.has_value(); }
};
struct MatterChannelConfiguration {
uint8_t channel_index{0};
bool automatic_short_addresses{true};
std::array<MatterAddressOverride, 64> short_address_overrides{};
MatterEndpointOverride broadcast;
std::array<MatterEndpointOverride, 16> groups{};
};
struct MatterAddressCandidate {
bool online{false};
bool group_mask_known{false};
uint16_t group_mask{0};
std::optional<uint16_t> dali_device_type_mask;
std::optional<uint8_t> dt8_color_type_features;
};
struct MatterChannelCandidates {
uint8_t channel_index{0};
uint8_t gateway_id{0};
std::array<MatterAddressCandidate, 64> addresses{};
};
struct MatterEndpointAllocation {
MatterTarget target;
MatterEndpointType type{MatterEndpointType::switchLight};
std::optional<MatterColorMethod> color_method;
bool type_is_manual{false};
bool color_method_is_manual{false};
bool explicitly_included{false};
};
struct MatterDroppedAllocation {
MatterEndpointAllocation allocation;
std::string reason;
};
struct MatterEndpointPlan {
size_t capacity{0};
std::vector<MatterEndpointAllocation> active;
std::vector<MatterDroppedAllocation> dropped;
};
struct MatterLevelFeedback {
bool on{false};
std::optional<uint8_t> current_level;
};
enum class MatterDaliActionKind : uint8_t { none = 0, off = 1, setLevel = 2 };
struct MatterDaliAction {
MatterDaliActionKind kind{MatterDaliActionKind::none};
uint8_t level{254};
};
struct MatterColorTemperatureWritePlan {
bool native_temperature{false};
bool rgbcw{false};
};
MatterEndpointPlan BuildMatterEndpointPlan(
const std::vector<MatterChannelCandidates>& candidates,
const std::vector<MatterChannelConfiguration>& configurations,
size_t capacity);
// Matter CurrentLevel is nullable and constrained to 1..254. DALI level zero
// therefore updates OnOff only and must retain the last nonzero Matter level.
MatterLevelFeedback MapDaliLevelToMatter(uint8_t level);
// A single Matter command can update OnOff and CurrentLevel several times as
// the standard level-control server applies its on/off effect. Resolve the
// settled values to one DALI action so an Off command cannot finish with a
// restored CurrentLevel frame that turns the light back on.
MatterDaliAction ResolveMatterDaliAction(std::optional<bool> requested_on,
std::optional<uint8_t> requested_level,
bool settled_on,
uint8_t retained_level);
// Temperature-only endpoints represent native DALI DT8 Tc gear and must not
// also receive the much longer RGBWAF sequence. Extended-color endpoints keep
// following their configured physical color method.
MatterColorTemperatureWritePlan ResolveMatterColorTemperatureWrites(
MatterEndpointType endpoint_type,
std::optional<MatterColorMethod> color_method);
const char* MatterTargetKindName(MatterTargetKind kind);
const char* MatterEndpointTypeName(MatterEndpointType type);
const char* MatterColorMethodName(MatterColorMethod method);
} // namespace gateway
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,248 @@
#include "gateway_matter_plan.hpp"
#include <algorithm>
namespace gateway {
namespace {
constexpr uint16_t kDt8Mask = 1U << 8;
constexpr uint16_t kDt7Mask = 1U << 7;
struct InferredCapability {
MatterEndpointType type{MatterEndpointType::switchLight};
bool has_xy{false};
bool has_rgbcw{false};
bool usable{false};
};
const MatterChannelConfiguration* FindConfiguration(
const std::vector<MatterChannelConfiguration>& configurations,
uint8_t channel_index) {
const auto found = std::find_if(
configurations.begin(), configurations.end(),
[channel_index](const auto& item) { return item.channel_index == channel_index; });
return found == configurations.end() ? nullptr : &*found;
}
InferredCapability InferAddress(const MatterAddressCandidate& address) {
InferredCapability result;
if (!address.dali_device_type_mask.has_value()) return result;
result.usable = true;
const uint16_t mask = *address.dali_device_type_mask;
if ((mask & kDt8Mask) != 0) {
const uint8_t features = address.dt8_color_type_features.value_or(0);
result.has_xy = (features & 0x01) != 0;
result.has_rgbcw = ((features >> 5) & 0x07) != 0;
if (result.has_xy || result.has_rgbcw) {
result.type = MatterEndpointType::color;
} else if ((features & 0x02) != 0) {
result.type = MatterEndpointType::colorTemperature;
} else {
result.type = MatterEndpointType::dimmer;
}
} else if ((mask & ~kDt7Mask) != 0) {
result.type = MatterEndpointType::dimmer;
}
return result;
}
MatterEndpointAllocation InferMultiTarget(
const MatterChannelCandidates& channel, MatterTargetKind kind, uint8_t address,
const MatterEndpointOverride& override) {
MatterEndpointAllocation allocation;
allocation.target = {channel.channel_index, channel.gateway_id, kind, address};
bool any_member = false;
bool has_xy = false;
bool has_rgbcw = false;
for (const auto& member : channel.addresses) {
const uint8_t group = kind == MatterTargetKind::group
? static_cast<uint8_t>(address - 64)
: 0;
const bool included = kind == MatterTargetKind::broadcast ||
(member.group_mask_known &&
(member.group_mask & (1U << group)) != 0);
if (!included) continue;
any_member = true;
const auto inferred = InferAddress(member);
if (static_cast<uint8_t>(inferred.type) > static_cast<uint8_t>(allocation.type)) {
allocation.type = inferred.type;
}
has_xy = has_xy || inferred.has_xy;
has_rgbcw = has_rgbcw || inferred.has_rgbcw;
}
if (override.type.has_value()) {
allocation.type = *override.type;
allocation.type_is_manual = true;
}
if (allocation.type == MatterEndpointType::color) {
if (override.color_method.has_value()) {
allocation.color_method = *override.color_method;
allocation.color_method_is_manual = true;
} else if (has_xy && has_rgbcw) {
allocation.color_method = MatterColorMethod::both;
} else if (has_xy) {
allocation.color_method = MatterColorMethod::xy;
} else if (has_rgbcw) {
allocation.color_method = MatterColorMethod::rgbcw;
} else if (!any_member || override.manual()) {
allocation.color_method = MatterColorMethod::both;
} else {
allocation.color_method = MatterColorMethod::both;
}
}
return allocation;
}
MatterEndpointAllocation InferShortAddress(
const MatterChannelCandidates& channel, uint8_t address, bool explicitly_included) {
MatterEndpointAllocation allocation;
allocation.target = {channel.channel_index, channel.gateway_id,
MatterTargetKind::shortAddress, address};
allocation.explicitly_included = explicitly_included;
const auto inferred = InferAddress(channel.addresses[address]);
allocation.type = inferred.type;
if (inferred.type == MatterEndpointType::color) {
allocation.color_method = inferred.has_xy && inferred.has_rgbcw
? MatterColorMethod::both
: (inferred.has_xy ? MatterColorMethod::xy
: MatterColorMethod::rgbcw);
}
return allocation;
}
void AppendWithinCapacity(MatterEndpointPlan* plan,
const MatterEndpointAllocation& allocation) {
if (plan->active.size() < plan->capacity) {
plan->active.push_back(allocation);
} else {
plan->dropped.push_back({allocation, "capacity"});
}
}
} // namespace
MatterEndpointPlan BuildMatterEndpointPlan(
const std::vector<MatterChannelCandidates>& raw_candidates,
const std::vector<MatterChannelConfiguration>& configurations,
size_t capacity) {
auto candidates = raw_candidates;
std::sort(candidates.begin(), candidates.end(), [](const auto& a, const auto& b) {
return a.channel_index < b.channel_index;
});
MatterEndpointPlan plan;
plan.capacity = capacity;
// Broadcasts and retained groups are deliberately allocated across every
// channel before any short address can consume the shared pool.
for (const auto& channel : candidates) {
const auto* config = FindConfiguration(configurations, channel.channel_index);
const MatterEndpointOverride empty;
AppendWithinCapacity(&plan, InferMultiTarget(
channel, MatterTargetKind::broadcast, 127,
config == nullptr ? empty : config->broadcast));
}
for (const auto& channel : candidates) {
const auto* config = FindConfiguration(configurations, channel.channel_index);
for (uint8_t group = 0; group < 16; ++group) {
const bool cached_non_empty = std::any_of(
channel.addresses.begin(), channel.addresses.end(), [group](const auto& address) {
return address.group_mask_known && (address.group_mask & (1U << group)) != 0;
});
const MatterEndpointOverride empty;
const auto& override = config == nullptr ? empty : config->groups[group];
if (!cached_non_empty && !override.manual()) continue;
AppendWithinCapacity(&plan,
InferMultiTarget(channel, MatterTargetKind::group,
static_cast<uint8_t>(64 + group), override));
}
}
for (const auto& channel : candidates) {
const auto* config = FindConfiguration(configurations, channel.channel_index);
if (config == nullptr) continue;
for (uint8_t address = 0; address < 64; ++address) {
if (config->short_address_overrides[address] == MatterAddressOverride::include) {
AppendWithinCapacity(&plan, InferShortAddress(channel, address, true));
}
}
}
for (const auto& channel : candidates) {
const auto* config = FindConfiguration(configurations, channel.channel_index);
const bool automatic_enabled = config == nullptr || config->automatic_short_addresses;
if (!automatic_enabled) continue;
for (uint8_t address = 0; address < 64; ++address) {
const auto mode = config == nullptr ? MatterAddressOverride::automatic
: config->short_address_overrides[address];
if (mode != MatterAddressOverride::automatic || !channel.addresses[address].online) {
continue;
}
AppendWithinCapacity(&plan, InferShortAddress(channel, address, false));
}
}
return plan;
}
MatterLevelFeedback MapDaliLevelToMatter(uint8_t level) {
MatterLevelFeedback feedback;
feedback.on = level > 0 && level <= 254;
if (feedback.on) feedback.current_level = level;
return feedback;
}
MatterDaliAction ResolveMatterDaliAction(std::optional<bool> requested_on,
std::optional<uint8_t> requested_level,
bool settled_on,
uint8_t retained_level) {
if (requested_on.has_value() && !*requested_on) {
return {MatterDaliActionKind::off, retained_level};
}
if (requested_on.has_value() && *requested_on) {
return {MatterDaliActionKind::setLevel,
requested_level.value_or(retained_level)};
}
if (requested_level.has_value() && settled_on) {
return {MatterDaliActionKind::setLevel, *requested_level};
}
return {};
}
MatterColorTemperatureWritePlan ResolveMatterColorTemperatureWrites(
MatterEndpointType endpoint_type,
std::optional<MatterColorMethod> color_method) {
if (endpoint_type == MatterEndpointType::colorTemperature) {
return {true, false};
}
const MatterColorMethod method =
color_method.value_or(MatterColorMethod::both);
return {method != MatterColorMethod::rgbcw,
method != MatterColorMethod::xy};
}
const char* MatterTargetKindName(MatterTargetKind kind) {
switch (kind) {
case MatterTargetKind::shortAddress: return "shortAddress";
case MatterTargetKind::group: return "group";
case MatterTargetKind::broadcast: return "broadcast";
}
return "shortAddress";
}
const char* MatterEndpointTypeName(MatterEndpointType type) {
switch (type) {
case MatterEndpointType::switchLight: return "switch";
case MatterEndpointType::dimmer: return "dimmer";
case MatterEndpointType::colorTemperature: return "colorTemperature";
case MatterEndpointType::color: return "color";
}
return "switch";
}
const char* MatterColorMethodName(MatterColorMethod method) {
switch (method) {
case MatterColorMethod::xy: return "xy";
case MatterColorMethod::rgbcw: return "rgbcw";
case MatterColorMethod::both: return "both";
}
return "both";
}
} // namespace gateway
@@ -0,0 +1,120 @@
#include "gateway_matter_plan.hpp"
#include <cassert>
using namespace gateway;
MatterChannelCandidates Channel(uint8_t index) {
MatterChannelCandidates channel;
channel.channel_index = index;
channel.gateway_id = static_cast<uint8_t>(10 + index);
return channel;
}
int main() {
{
auto channel = Channel(0);
channel.addresses[1].group_mask_known = true;
channel.addresses[1].group_mask = 1U << 2;
channel.addresses[1].dali_device_type_mask = 1U << 8;
channel.addresses[1].dt8_color_type_features = 0x23;
const auto plan = BuildMatterEndpointPlan({channel}, {}, 64);
assert(plan.active.size() == 2);
assert(plan.active[0].target.kind == MatterTargetKind::broadcast);
assert(plan.active[1].target.address == 66);
assert(plan.active[1].type == MatterEndpointType::color);
assert(plan.active[1].color_method == MatterColorMethod::both);
}
{
auto channel = Channel(0);
MatterChannelConfiguration config;
config.channel_index = 0;
config.groups[4].type = MatterEndpointType::color;
const auto plan = BuildMatterEndpointPlan({channel}, {config}, 64);
assert(plan.active.size() == 2);
assert(plan.active[1].target.address == 68);
assert(plan.active[1].type_is_manual);
assert(plan.active[1].color_method == MatterColorMethod::both);
}
{
auto channel = Channel(0);
channel.addresses[7].online = true;
MatterChannelConfiguration config;
config.channel_index = 0;
config.automatic_short_addresses = false;
config.short_address_overrides[9] = MatterAddressOverride::include;
const auto plan = BuildMatterEndpointPlan({channel}, {config}, 64);
assert(plan.active.size() == 2);
assert(plan.active[1].target.address == 9);
assert(plan.active[1].explicitly_included);
}
{
auto channel1 = Channel(1);
auto channel0 = Channel(0);
channel0.addresses[0].online = true;
channel1.addresses[0].online = true;
const auto plan = BuildMatterEndpointPlan({channel1, channel0}, {}, 64);
assert(plan.active[0].target.channel_index == 0);
assert(plan.active[1].target.channel_index == 1);
assert(plan.active[2].target.channel_index == 0);
assert(plan.active[3].target.channel_index == 1);
}
{
auto channel = Channel(0);
for (auto& address : channel.addresses) address.online = true;
const auto plan = BuildMatterEndpointPlan({channel}, {}, 32);
assert(plan.active.size() == 32);
assert(plan.dropped.size() == 33);
assert(plan.active.back().target.address == 30);
assert(plan.dropped.front().allocation.target.address == 31);
assert(plan.dropped.front().reason == "capacity");
}
{
const auto off = MapDaliLevelToMatter(0);
assert(!off.on);
assert(!off.current_level.has_value());
const auto on = MapDaliLevelToMatter(137);
assert(on.on);
assert(on.current_level == 137);
const auto invalid = MapDaliLevelToMatter(255);
assert(!invalid.on);
assert(!invalid.current_level.has_value());
}
{
// Matter's instantaneous Off effect visits level 1, switches OnOff off,
// then restores CurrentLevel. The settled action must still be only OFF.
const auto off = ResolveMatterDaliAction(false, 254, false, 254);
assert(off.kind == MatterDaliActionKind::off);
const auto on = ResolveMatterDaliAction(true, 254, true, 254);
assert(on.kind == MatterDaliActionKind::setLevel);
assert(on.level == 254);
const auto level_while_off =
ResolveMatterDaliAction(std::nullopt, 137, false, 137);
assert(level_while_off.kind == MatterDaliActionKind::none);
const auto level_while_on =
ResolveMatterDaliAction(std::nullopt, 137, true, 137);
assert(level_while_on.kind == MatterDaliActionKind::setLevel);
assert(level_while_on.level == 137);
}
{
const auto temperature_only = ResolveMatterColorTemperatureWrites(
MatterEndpointType::colorTemperature, std::nullopt);
assert(temperature_only.native_temperature);
assert(!temperature_only.rgbcw);
const auto xy = ResolveMatterColorTemperatureWrites(
MatterEndpointType::color, MatterColorMethod::xy);
assert(xy.native_temperature);
assert(!xy.rgbcw);
const auto rgbcw = ResolveMatterColorTemperatureWrites(
MatterEndpointType::color, MatterColorMethod::rgbcw);
assert(!rgbcw.native_temperature);
assert(rgbcw.rgbcw);
const auto both = ResolveMatterColorTemperatureWrites(
MatterEndpointType::color, MatterColorMethod::both);
assert(both.native_temperature);
assert(both.rgbcw);
}
}
@@ -1,6 +1,7 @@
#pragma once
#include <array>
#include <atomic>
#include <cstdint>
#include <optional>
#include <string>
@@ -89,6 +90,13 @@ class GatewayNetworkService {
GatewayBridgeService* bridge_service = nullptr);
esp_err_t start();
// Enables the opt-in Wi-Fi provisioning path used by physical adapters such
// as the Matter commissioning button. Ethernet remains the preferred route.
esp_err_t startWifiProvisioning();
// Re-announces IPv6 after the Matter server has registered its ESP event
// handler. The network service starts first, so the initial link event may
// otherwise predate CHIP startup.
void refreshMatterIpv6();
// Physical adapter for the Part 103 IDENTIFY DEVICE action. The DALI core
// remains hardware-independent and invokes this only through the app wiring.
void identify();
@@ -104,6 +112,7 @@ class GatewayNetworkService {
static void TcpControlTaskEntry(void* arg);
static void BootButtonTaskEntry(void* arg);
static void IdentifyTaskEntry(void* arg);
static void MatterIpv6RefreshTaskEntry(void* arg);
static esp_err_t HandleInfoGet(httpd_req_t* req);
static esp_err_t HandleCommandGet(httpd_req_t* req);
static esp_err_t HandleCommandPost(httpd_req_t* req);
@@ -141,6 +150,10 @@ class GatewayNetworkService {
void tcpControlTaskLoop();
void bootButtonTaskLoop();
void identifyTaskLoop();
void matterIpv6RefreshTaskLoop();
void scheduleMatterIpv6Refresh();
esp_err_t promoteMatterIpv6LinkLocal(esp_netif_t* netif,
const char* interface_name);
void handleNetworkControlBytes(const uint8_t* data, size_t len);
std::optional<std::string> handleJsonControlFrame(const uint8_t* data, size_t len);
bool enqueueControlFrameForTargets(const std::vector<uint8_t>& frame);
@@ -157,11 +170,13 @@ class GatewayNetworkService {
void handleEspNowReceive(const esp_now_recv_info_t* info, const uint8_t* data, int data_len);
void handleSetupUartFrame(int setup_id, const std::vector<uint8_t>& frame);
void handleDaliRawFrame(const DaliRawFrame& frame);
esp_err_t ensureMatterIpv6(esp_netif_t* netif, const char* interface_name);
std::string deviceInfoJson() const;
std::string deviceInfoDoubleEncodedJson() const;
std::string gatewaySnapshotJson();
esp_err_t sendBridgeResponse(httpd_req_t* req, bool post);
void setStatusLed(bool on);
void selectPreferredDefaultNetwork();
GatewayController& controller_;
GatewayRuntime& runtime_;
@@ -192,6 +207,10 @@ class GatewayNetworkService {
TaskHandle_t identify_task_handle_{nullptr};
TaskHandle_t udp_task_handle_{nullptr};
TaskHandle_t tcp_control_task_handle_{nullptr};
std::atomic_bool matter_event_handlers_ready_{false};
std::atomic_bool matter_ipv6_refresh_running_{false};
std::atomic_bool ethernet_link_up_{false};
std::atomic_bool wifi_station_connected_{false};
int udp_socket_{-1};
int tcp_control_socket_{-1};
int tcp_control_client_socket_{-1};
@@ -31,6 +31,11 @@
#include <utility>
#include <vector>
#if CONFIG_GATEWAY_MATTER_SUPPORTED && \
(!CONFIG_LWIP_IPV6 || !CONFIG_LWIP_IPV6_AUTOCONFIG)
#error "Matter gateway builds require IPv6 and IPv6 autoconfiguration"
#endif
namespace gateway {
namespace {
@@ -40,6 +45,11 @@ constexpr const char* kSetupApSsid = "LAMMIN_Gateway";
constexpr size_t kUdpBufferSize = 1024;
constexpr size_t kTcpControlBufferSize = 512;
constexpr uint8_t kEspNowBroadcastMac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
constexpr TickType_t kMatterIpv6RefreshInterval = pdMS_TO_TICKS(500);
constexpr int kMatterIpv6RefreshAttempts = 150;
constexpr int kMatterIpv6PromotionChecks = 3;
#endif
GatewayNetworkService* s_espnow_service = nullptr;
@@ -483,6 +493,176 @@ esp_err_t GatewayNetworkService::start() {
return ESP_OK;
}
esp_err_t GatewayNetworkService::startWifiProvisioning() {
if (!config_.wifi_supported || !config_.smartconfig_enabled) {
return ESP_ERR_NOT_SUPPORTED;
}
config_.wifi_enabled = true;
return startSmartconfig();
}
void GatewayNetworkService::refreshMatterIpv6() {
matter_event_handlers_ready_.store(true, std::memory_order_release);
scheduleMatterIpv6Refresh();
}
void GatewayNetworkService::scheduleMatterIpv6Refresh() {
#ifndef CONFIG_GATEWAY_MATTER_SUPPORTED
return;
#else
if (!matter_event_handlers_ready_.load(std::memory_order_acquire) ||
matter_ipv6_refresh_running_.exchange(true, std::memory_order_acq_rel)) {
return;
}
const BaseType_t created =
xTaskCreate(MatterIpv6RefreshTaskEntry, "matter_ipv6", 3072, this, 3,
nullptr);
if (created != pdPASS) {
matter_ipv6_refresh_running_.store(false, std::memory_order_release);
ESP_LOGE(kTag, "failed to start Matter IPv6 refresh task");
}
#endif
}
void GatewayNetworkService::MatterIpv6RefreshTaskEntry(void* arg) {
static_cast<GatewayNetworkService*>(arg)->matterIpv6RefreshTaskLoop();
}
void GatewayNetworkService::matterIpv6RefreshTaskLoop() {
#ifdef CONFIG_GATEWAY_MATTER_SUPPORTED
bool ethernet_requested = false;
bool wifi_requested = false;
bool ethernet_promoted = false;
bool wifi_promoted = false;
int ethernet_pending_checks = 0;
int wifi_pending_checks = 0;
for (int attempt = 0; attempt < kMatterIpv6RefreshAttempts; ++attempt) {
const auto announce = [this](esp_netif_t* netif,
const char* interface_name,
bool* requested,
bool* promoted,
int* pending_checks) {
if (!*requested) {
const esp_err_t err = ensureMatterIpv6(netif, interface_name);
if (err != ESP_OK) return false;
*requested = true;
*pending_checks = 0;
ESP_LOGI(kTag, "requested %s Matter IPv6 link-local address",
interface_name);
}
esp_ip6_addr_t address{};
if (esp_netif_get_ip6_linklocal(netif, &address) != ESP_OK) {
++*pending_checks;
if (*pending_checks >= kMatterIpv6PromotionChecks && !*promoted) {
const esp_err_t err =
promoteMatterIpv6LinkLocal(netif, interface_name);
if (err == ESP_OK) *promoted = true;
}
return false;
}
ip_event_got_ip6_t event{};
event.esp_netif = netif;
event.ip_index = 0;
event.ip6_info.ip = address;
const esp_err_t err = esp_event_post(
IP_EVENT, IP_EVENT_GOT_IP6, &event, sizeof(event),
kMatterIpv6RefreshInterval);
if (err != ESP_OK) {
ESP_LOGW(kTag, "failed to announce %s Matter IPv6 address: %s",
interface_name, esp_err_to_name(err));
return false;
}
ESP_LOGI(kTag, "announced %s Matter IPv6 " IPV6STR,
interface_name, IPV62STR(address));
return true;
};
const bool ethernet_connected =
ethernet_link_up_.load(std::memory_order_acquire);
const bool wifi_connected =
wifi_station_connected_.load(std::memory_order_acquire);
bool ethernet_ready = !ethernet_connected;
bool wifi_ready = !wifi_connected;
if (ethernet_connected) {
ethernet_ready = announce(eth_netif_, "Ethernet", &ethernet_requested,
&ethernet_promoted,
&ethernet_pending_checks);
} else {
ethernet_requested = false;
ethernet_promoted = false;
ethernet_pending_checks = 0;
}
if (wifi_connected) {
wifi_ready = announce(wifi_sta_netif_, "Wi-Fi", &wifi_requested,
&wifi_promoted, &wifi_pending_checks);
} else {
wifi_requested = false;
wifi_promoted = false;
wifi_pending_checks = 0;
}
if ((ethernet_connected || wifi_connected) && ethernet_ready && wifi_ready) {
break;
}
vTaskDelay(kMatterIpv6RefreshInterval);
}
#endif
matter_ipv6_refresh_running_.store(false, std::memory_order_release);
vTaskDelete(nullptr);
}
esp_err_t GatewayNetworkService::promoteMatterIpv6LinkLocal(
esp_netif_t* netif, const char* interface_name) {
uint8_t mac[6] = {};
esp_err_t err = esp_netif_get_mac(netif, mac);
if (err != ESP_OK) {
ESP_LOGW(kTag, "failed to read %s MAC for Matter IPv6: %s",
interface_name, esp_err_to_name(err));
return err;
}
char address_text[48] = {};
std::snprintf(address_text, sizeof(address_text),
"fe80::%02x%02x:%02xff:fe%02x:%02x%02x",
static_cast<unsigned>(mac[0] ^ 0x02),
static_cast<unsigned>(mac[1]),
static_cast<unsigned>(mac[2]),
static_cast<unsigned>(mac[3]),
static_cast<unsigned>(mac[4]),
static_cast<unsigned>(mac[5]));
esp_ip6_addr_t address{};
err = esp_netif_str_to_ip6(address_text, &address);
if (err != ESP_OK) {
ESP_LOGW(kTag, "failed to parse %s Matter IPv6 address %s: %s",
interface_name, address_text, esp_err_to_name(err));
return err;
}
err = esp_netif_add_ip6_address(netif, address, true);
if (err != ESP_OK) {
ESP_LOGW(kTag, "failed to promote %s Matter IPv6 address %s: %s",
interface_name, address_text, esp_err_to_name(err));
return err;
}
ESP_LOGW(kTag,
"%s Matter IPv6 DAD did not settle; promoted MAC-derived address %s",
interface_name, address_text);
return ESP_OK;
}
esp_err_t GatewayNetworkService::ensureMatterIpv6(
esp_netif_t* netif, const char* interface_name) {
if (netif == nullptr || !esp_netif_is_netif_up(netif)) {
return ESP_ERR_INVALID_STATE;
}
const esp_err_t err = esp_netif_create_ip6_linklocal(netif);
if (err != ESP_OK) {
ESP_LOGW(kTag, "failed to create %s Matter IPv6 address: %s",
interface_name, esp_err_to_name(err));
}
return err;
}
void GatewayNetworkService::identify() {
if (config_.status_led_gpio < 0) {
ESP_LOGI(kTag, "Part 103 identity requested; no status LED is configured");
@@ -548,6 +728,18 @@ esp_err_t GatewayNetworkService::startEthernet() {
stopEthernet();
return err;
}
err = esp_event_handler_register(IP_EVENT, IP_EVENT_GOT_IP6,
&GatewayNetworkService::HandleEthernetEvent, this);
if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
ESP_LOGE(kTag, "failed to register Ethernet IPv6 event handler: %s",
esp_err_to_name(err));
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
IP_EVENT, IP_EVENT_ETH_GOT_IP, &GatewayNetworkService::HandleEthernetEvent));
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
ETH_EVENT, ESP_EVENT_ANY_ID, &GatewayNetworkService::HandleEthernetEvent));
stopEthernet();
return err;
}
ethernet_event_handlers_registered_ = true;
}
@@ -701,6 +893,8 @@ esp_err_t GatewayNetworkService::probeEthernetStartup() {
void GatewayNetworkService::stopEthernet() {
if (ethernet_event_handlers_registered_) {
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
IP_EVENT, IP_EVENT_GOT_IP6, &GatewayNetworkService::HandleEthernetEvent));
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
IP_EVENT, IP_EVENT_ETH_GOT_IP, &GatewayNetworkService::HandleEthernetEvent));
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
@@ -760,7 +954,13 @@ esp_err_t GatewayNetworkService::startWifi() {
setup_ap_started_ = false;
if (wifi_sta_netif_ == nullptr) {
wifi_sta_netif_ = esp_netif_create_default_wifi_sta();
// ESP-Matter can initialize the default station netif before the optional
// long-press provisioning path is entered. Reuse it when present instead
// of trying to create a second WIFI_STA_DEF netif.
wifi_sta_netif_ = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
if (wifi_sta_netif_ == nullptr) {
wifi_sta_netif_ = esp_netif_create_default_wifi_sta();
}
if (wifi_sta_netif_ == nullptr) {
ESP_LOGE(kTag, "failed to create default Wi-Fi STA netif");
return ESP_ERR_NO_MEM;
@@ -788,6 +988,17 @@ esp_err_t GatewayNetworkService::startWifi() {
ESP_LOGE(kTag, "failed to register IP event handler: %s", esp_err_to_name(err));
return err;
}
err = esp_event_handler_register(IP_EVENT, IP_EVENT_GOT_IP6,
&GatewayNetworkService::HandleWifiEvent, this);
if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
ESP_LOGE(kTag, "failed to register Wi-Fi IPv6 event handler: %s",
esp_err_to_name(err));
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
IP_EVENT, IP_EVENT_STA_GOT_IP, &GatewayNetworkService::HandleWifiEvent));
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_event_handler_unregister(
WIFI_EVENT, ESP_EVENT_ANY_ID, &GatewayNetworkService::HandleWifiEvent));
return err;
}
wifi_event_handlers_registered_ = true;
}
@@ -834,6 +1045,10 @@ esp_err_t GatewayNetworkService::startWifi() {
}
esp_err_t GatewayNetworkService::startSetupAp() {
#if !defined(CONFIG_ESP_WIFI_SOFTAP_SUPPORT)
ESP_LOGW(kTag, "setup AP requested but SoftAP support is compiled out");
return ESP_ERR_NOT_SUPPORTED;
#else
stopSmartconfig();
if (wifi_ap_netif_ == nullptr) {
wifi_ap_netif_ = esp_netif_create_default_wifi_ap();
@@ -900,6 +1115,7 @@ esp_err_t GatewayNetworkService::startSetupAp() {
controller_.setWirelessSetupMode(true);
ESP_LOGI(kTag, "setup AP started ssid=%s ip=192.168.3.1", kSetupApSsid);
return ESP_OK;
#endif
}
esp_err_t GatewayNetworkService::startSmartconfig() {
@@ -1260,6 +1476,7 @@ void GatewayNetworkService::handleEthernetEvent(esp_event_base_t event_base, int
}
if (event_id == ETHERNET_EVENT_CONNECTED) {
ethernet_link_up_.store(true, std::memory_order_release);
uint8_t mac[6] = {};
if (handle != nullptr && esp_eth_ioctl(handle, ETH_CMD_G_MAC_ADDR, mac) == ESP_OK) {
const std::string mac_hex = MacToHex(mac);
@@ -1270,11 +1487,19 @@ void GatewayNetworkService::handleEthernetEvent(esp_event_base_t event_base, int
} else {
ESP_LOGI(kTag, "Ethernet link up");
}
ensureMatterIpv6(eth_netif_, "Ethernet");
scheduleMatterIpv6Refresh();
return;
}
if (event_id == ETHERNET_EVENT_DISCONNECTED ||
event_id == ETHERNET_EVENT_STOP) {
ethernet_link_up_.store(false, std::memory_order_release);
}
if (event_id == ETHERNET_EVENT_DISCONNECTED) {
runtime_.clearEthernetIp();
selectPreferredDefaultNetwork();
ESP_LOGI(kTag, "Ethernet link down");
return;
}
@@ -1286,6 +1511,7 @@ void GatewayNetworkService::handleEthernetEvent(esp_event_base_t event_base, int
if (event_id == ETHERNET_EVENT_STOP) {
runtime_.clearEthernetIp();
selectPreferredDefaultNetwork();
ESP_LOGI(kTag, "Ethernet driver stopped");
}
return;
@@ -1302,7 +1528,17 @@ void GatewayNetworkService::handleEthernetEvent(esp_event_base_t event_base, int
}
info.ip = ip;
runtime_.setEthernetInfo(std::move(info));
selectPreferredDefaultNetwork();
ESP_LOGI(kTag, "Ethernet got IP %s", ip);
return;
}
if (event_base == IP_EVENT && event_id == IP_EVENT_GOT_IP6 &&
event_data != nullptr) {
auto* event = static_cast<ip_event_got_ip6_t*>(event_data);
if (event->esp_netif != eth_netif_) return;
ESP_LOGI(kTag, "Ethernet got Matter IPv6 " IPV6STR,
IPV62STR(event->ip6_info.ip));
}
}
@@ -1356,7 +1592,15 @@ void GatewayNetworkService::handleWifiEvent(esp_event_base_t event_base, int32_t
return;
}
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED) {
wifi_station_connected_.store(true, std::memory_order_release);
ensureMatterIpv6(wifi_sta_netif_, "Wi-Fi");
scheduleMatterIpv6Refresh();
return;
}
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
wifi_station_connected_.store(false, std::memory_order_release);
auto info = runtime_.deviceInfo();
if (info.wlan.has_value()) {
const bool has_credentials = !info.wlan->ssid.empty();
@@ -1381,7 +1625,37 @@ void GatewayNetworkService::handleWifiEvent(esp_event_base_t event_base, int32_t
wireless.mac = MacToHex(mac);
}
runtime_.setWirelessInfo(std::move(wireless));
selectPreferredDefaultNetwork();
ESP_LOGI(kTag, "Wi-Fi got IP %s", ip);
return;
}
if (event_base == IP_EVENT && event_id == IP_EVENT_GOT_IP6 &&
event_data != nullptr) {
auto* event = static_cast<ip_event_got_ip6_t*>(event_data);
if (event->esp_netif != wifi_sta_netif_) return;
ESP_LOGI(kTag, "Wi-Fi got Matter IPv6 " IPV6STR,
IPV62STR(event->ip6_info.ip));
}
}
void GatewayNetworkService::selectPreferredDefaultNetwork() {
const auto info = runtime_.deviceInfo();
esp_netif_t* preferred = nullptr;
const char* name = nullptr;
if (eth_netif_ != nullptr && info.eth.has_value() && !info.eth->ip.empty()) {
preferred = eth_netif_;
name = "Ethernet";
} else if (wifi_sta_netif_ != nullptr && info.wlan.has_value() && !info.wlan->ip.empty()) {
preferred = wifi_sta_netif_;
name = "Wi-Fi";
}
if (preferred == nullptr) return;
const esp_err_t err = esp_netif_set_default_netif(preferred);
if (err != ESP_OK) {
ESP_LOGW(kTag, "failed to prefer %s route: %s", name, esp_err_to_name(err));
} else {
ESP_LOGI(kTag, "%s is the preferred default route", name);
}
}
@@ -1890,7 +2164,7 @@ void GatewayNetworkService::handleWifiControl(uint8_t mode) {
return;
}
if (mode == 100) {
ESP_ERROR_CHECK_WITHOUT_ABORT(startSmartconfig());
ESP_ERROR_CHECK_WITHOUT_ABORT(startWifiProvisioning());
return;
}
if (mode == 1) {