Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d55d7f9d1 | |||
| ca9e95e985 | |||
| 8505958b65 | |||
| bb3e9178fb | |||
| 091079ab84 |
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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,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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, ¶ms, 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;
|
||||
{
|
||||
|
||||
@@ -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", ðernet_requested,
|
||||
ðernet_promoted,
|
||||
ðernet_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) {
|
||||
|
||||
Reference in New Issue
Block a user