Hallo, ich versuche mich gerade an der Espressif-IDF in Kombination mit VS Code, alternativ zum Arduino IDE und könnte dabei etwas Starthilfe gebrauchen…
Ich habe “Visual Studio Code” unter Windows 11 installiert, es kommt den von mir verwendeten JetBrains IDEs recht nahe und stellt ansich kein Problem dar.
Das Espressif-IDF SDK ist da schon ne andere Hausnummer. Das habe ich laut mit dem VSCode-Plugin runtergeladen und installiert und es auch irgendwie mal geschafft das Blink-Beispiel zu flashen.
Nun möchte ich einen Zigbee-Node (ZED) bauen welcher per PWM eine einfarbige LED an einem GPIO an/aus und dimmen kann. Farbe benötige ich nicht dazu.
Grundlegend muss ich einen Node bauen der sich dann später im HA mittels Z2M einbettet. Soweit ich das verstanden habe muss man dafür bestimmte “Cluster” bereitstellen. Für die LED AN/AUS kommt wohl das “On/Off Cluster”, für die Helligkeitssteuerung das “Level Cluster” in Frage. Darüber hinaus braucht es wohl auch noch ein paar grundlegende Parameter die im “Basic Cluster” enthalten sind (Wie heißt mein Node, welcher Typ ist er, welche Stromversorgung hat er, etc.). In der ersten Kommunikation mit HA, dem “Interview” übermittelt der Zigbee-Node seine Eigenschaften ans HA und dieses stellt dann entsprechende Bedienelemente/Anzeigen zur Verfügung.
Wie fange ich da jetzt an die Dinge zu verstehen? Ich finde viel Information im Netz und über KI Bots aber das bringt mich alles nicht weiter, weil die teils falsch oder mit anderen Versionen arbeiten.
Also versuche ich zunächst das Light-Beispiel zu verstehen, was schonmal daran scheitert das die Beispiele Fehler enthalten, z.B. wird in der main/CMakeLists.txt auf die ZCL-Utility verwiesen, die es in dem angegebenen Pfad garnicht gibt:
idf_component_register(
SRC_DIRS "." "../../../common/zcl_utility/src"
INCLUDE_DIRS "." "../../../common/zcl_utility/include"
PRIV_REQUIRES nvs_flash esp_driver_uart ieee802154
)
Die befindet sich im Examples Verzeichnis (bei mir unter %USERPROFILE%\esp\v5.5.1\esp-idf\examples\zigbee). Korrigiert man den Pfad, bzw. importiert man dieses Unterverzeichnis in sein Projekt, klappt es auch mit dem Compile.
Dann aber erkenne ich das das Beispiel die LED-Strip Library verwendet um die On-Board WS8211 RGB-LED anzusteuern, für ein plumpes on/off… ich aber möchte nur einen GPIO ansteuern, den dann aber mit PWM.
Aber weiter zum Verständnis des Code und der Zigbee Cluster. In “main/esp_zb_light.c” findet man die Initialisierungs-Routine die from Zigbee-Framework aufgerufen wird:
static void esp_zb_task(void *pvParameters)
{
/* initialize Zigbee stack */
esp_zb_cfg_t zb_nwk_cfg = ESP_ZB_ZED_CONFIG();
esp_zb_init(&zb_nwk_cfg);
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();
esp_zb_ep_list_t *esp_zb_on_off_light_ep = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg);
zcl_basic_manufacturer_info_t info = {
.manufacturer_name = ESP_MANUFACTURER_NAME,
.model_identifier = ESP_MODEL_IDENTIFIER,
};
esp_zcl_utility_add_ep_basic_manufacturer_info(esp_zb_on_off_light_ep, HA_ESP_LIGHT_ENDPOINT, &info);
esp_zb_device_register(esp_zb_on_off_light_ep);
esp_zb_core_action_handler_register(zb_action_handler);
esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK);
ESP_ERROR_CHECK(esp_zb_start(false));
esp_zb_stack_main_loop();
}
Zunächst wohl die grundlegende Initialisierung eines Zigbee Endgerätes (ZED):
esp_zb_cfg_t zb_nwk_cfg = ESP_ZB_ZED_CONFIG();
esp_zb_init(&zb_nwk_cfg);
Hier wird es interessant. Es wird eine Variable “light_cfg” vom Typ “esp_zb_on_off_light_cfg_t” erzeugt und über die Funktion “ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG()” mit Inhalt befüllt:
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();
Die Datei “esp_zigbee_type.h” definiert diesen Typ
typedef struct esp_zb_on_off_light_cfg_s {
esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */
esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */
esp_zb_groups_cluster_cfg_t groups_cfg; /*!< Groups cluster configuration, @ref esp_zb_groups_cluster_cfg_s */
esp_zb_scenes_cluster_cfg_t scenes_cfg; /*!< Scenes cluster configuration, @ref esp_zb_scenes_cluster_cfg_s */
esp_zb_on_off_cluster_cfg_t on_off_cfg; /*!< On off cluster configuration, @ref esp_zb_on_off_cluster_cfg_s */
} esp_zb_on_off_light_cfg_t;
und die Funktion (eher ein Makro, kommt aus “esp_zigbee_ha_standard.h”) befüllt die Member des Structs mit:
/**
* @brief Zigbee HA standard on-off light device default config value.
*
*/
#define ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG() \
{ \
.basic_cfg = \
{ \
.zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \
.power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \
}, \
.identify_cfg = \
{ \
.identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \
}, \
.groups_cfg = \
{ \
.groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \
}, \
.scenes_cfg = \
{ \
.scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \
.current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \
.current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \
.scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \
.name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \
}, \
.on_off_cfg = \
{ \
.on_off = ESP_ZB_ZCL_ON_OFF_ON_OFF_DEFAULT_VALUE, \
}, \
}
Anstelle also zu wissen was ein “Light” Zigbee-Node so alles an Cluster bereitstellen muss um in HA ordentlich zu arbeiten, ist das hier in eine Funktion gegossen. Vermutlich könnte man diesen Einzeiler auf in Einzelne Kommandos auflösen die jeden Cluster separat definiert. Hier enthalten ist:
- Basic Cluster
- Identify Cluster
- Groups Cluster
- Screnes Cluster
- On/Off Cluster







