Open ruediger218 opened 4 months ago
esp32c6
esp32c6 dev module
no
v3.0.1
arduino ide
windows 11
80mhz
yes
115200
Problem with the HA_temperature_sensor example - can't set a value which is shown in zigbee2mqtt as temperature i'm using in zigbee2mqtt the following definition:
const fz = require('zigbee-herdsman-converters/converters/fromZigbee'); const tz = require('zigbee-herdsman-converters/converters/toZigbee'); const exposes = require('zigbee-herdsman-converters/lib/exposes'); const e = exposes.presets;
const device = { zigbeeModel: ['cc2538.router.v2'], model: 'cc2538.router.v2', vendor: 'jethome', description: 'zigbee router cc2538 with temperature sensor', fromZigbee: [fz.ignore_basic_report, fz.device_temperature], toZigbee: [], exposes: [e.device_temperature(), e.linkquality()], };
module.exports = device;
/* test: temperatursensor auf esp32c6 example sketch https://github.com/espressif/esp-zigbee-sdk/tree/main/examples/esp_zigbee_HA_sample/HA_temperature_sensor für die device config von zigbee2mqtt https://github.com/jethome-ru/zigbee-firmware/tree/master/ti/router/cc2538_cc2592 */ #define ARDUINO #include "esp_zb_temperature_sensor.h" //#include "temp_sensor_driver.h" //#include "switch_driver.h" #ifndef ZIGBEE_MODE_ED #error "Zigbee end device mode is not selected in Tools->Zigbee mode" #endif #include "esp_zigbee_core.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #define ZB_ENABLE_HA #define ZB_ENABLE_ZCL #define ZB_ENABLE_ZGP #include "zboss_api.h" #include "zcl/zb_zcl_common.h" //include "zboss_api_zcl.h" //#include "zboss_api.h" //#include "zboss_api_buf.h" #include "zb_scheduler.h" #include "ha/esp_zigbee_ha_standard.h" /* Default End Device config */ #define ESP_ZB_ZED_CONFIG() \ { \ .esp_zb_role = ESP_ZB_DEVICE_TYPE_ED, .install_code_policy = INSTALLCODE_POLICY_ENABLE, \ .nwk_cfg = { \ .zed_cfg = \ { \ .ed_timeout = ED_AGING_TIMEOUT, \ .keep_alive = ED_KEEP_ALIVE, \ }, \ }, \ } #define ESP_ZB_DEFAULT_RADIO_CONFIG() \ { .radio_mode = ZB_RADIO_MODE_NATIVE, } #define ESP_ZB_DEFAULT_HOST_CONFIG() \ { .host_connection_mode = ZB_HOST_CONNECTION_MODE_NONE, } /* Zigbee configuration */ #define INSTALLCODE_POLICY_ENABLE false /* enable the install code policy for security */ #define ED_AGING_TIMEOUT ESP_ZB_ED_AGING_TIMEOUT_64MIN #define ED_KEEP_ALIVE 3000 /* 3000 millisecond */ #define HA_ESP_LIGHT_ENDPOINT 10 /* esp light bulb device endpoint, used to process light controlling commands */ #define HA_COLOR_DIMMABLE_LIGHT_ENDPOINT 10 /* esp light switch device endpoint */ #define ESP_ZB_PRIMARY_CHANNEL_MASK ESP_ZB_TRANSCEIVER_ALL_CHANNELS_MASK /* Zigbee primary channel mask use in the example */ static const char *TAG = "ESP_ZB_TEMP_SENSOR"; static int16_t zb_temperature_to_s16(float temp) { return (int16_t)(temp * 100); } /*static switch_func_pair_t button_func_pair[] = { {GPIO_INPUT_IO_TOGGLE_SWITCH, SWITCH_ONOFF_TOGGLE_CONTROL} };*/ /*static void esp_app_buttons_handler(switch_func_pair_t *button_func_pair) { if (button_func_pair->func == SWITCH_ONOFF_TOGGLE_CONTROL) { // Send report attributes command esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID; report_attr_cmd.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; report_attr_cmd.zcl_basic_cmd.src_endpoint = HA_ESP_SENSOR_ENDPOINT; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); Serial.print("Send 'report attributes' command"); } }*/ static void esp_app_temp_sensor_handler(float temperature) { Serial.print("set temp: "); Serial.println(temperature); int16_t measured_value = zb_temperature_to_s16(temperature); /* Update temperature sensor measured value */ esp_zb_lock_acquire(portMAX_DELAY); int send_status = esp_zb_zcl_set_attribute_val(HA_ESP_SENSOR_ENDPOINT, ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, &measured_value, false); Serial.print("result: "); Serial.println(send_status); esp_zb_lock_release(); // Send report attributes command esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID; report_attr_cmd.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT; report_attr_cmd.zcl_basic_cmd.src_endpoint = HA_ESP_SENSOR_ENDPOINT; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); Serial.println("Send 'report attributes' command"); } static void bdb_start_top_level_commissioning_cb(uint8_t mode_mask) { ESP_ERROR_CHECK(esp_zb_bdb_start_top_level_commissioning(mode_mask)); } static esp_err_t deferred_driver_init(void) { /* temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(ESP_TEMP_SENSOR_MIN_VALUE, ESP_TEMP_SENSOR_MAX_VALUE); ESP_RETURN_ON_ERROR(temp_sensor_driver_init(&temp_sensor_config, ESP_TEMP_SENSOR_UPDATE_INTERVAL, esp_app_temp_sensor_handler), TAG, "Failed to initialize temperature sensor"); ESP_RETURN_ON_FALSE(switch_driver_init(button_func_pair, PAIR_SIZE(button_func_pair), esp_app_buttons_handler), ESP_FAIL, TAG, "Failed to initialize switch driver"); */ return ESP_OK; } void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) { uint32_t *p_sg_p = signal_struct->p_app_signal; esp_err_t err_status = signal_struct->esp_err_status; int sig_type = *p_sg_p; switch (sig_type) { case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP: Serial.println("Initialize Zigbee stack"); esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_INITIALIZATION); break; case ESP_ZB_BDB_SIGNAL_DEVICE_FIRST_START: case ESP_ZB_BDB_SIGNAL_DEVICE_REBOOT: if (err_status == ESP_OK) { Serial.println("Deferred driver initialization"); Serial.println("Device started up in factory-reset mode"); if (esp_zb_bdb_is_factory_new()) { Serial.println("Start network steering"); esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING); } else { Serial.println("Device rebooted"); } } else { /* commissioning failed */ Serial.println("Failed to initialize Zigbee stack"); } break; case ESP_ZB_BDB_SIGNAL_STEERING: if (err_status == ESP_OK) { esp_zb_ieee_addr_t extended_pan_id; esp_zb_get_extended_pan_id(extended_pan_id); Serial.println("Joined network successfully"); } else { Serial.println("Network steering was not successful"); esp_zb_scheduler_alarm((esp_zb_callback_t)bdb_start_top_level_commissioning_cb, ESP_ZB_BDB_MODE_NETWORK_STEERING, 1000); } break; default: //ESP_LOGI(TAG, "ZDO signal: %s (0x%x), status: %s", esp_zb_zdo_signal_to_string(sig_type), sig_type, // esp_err_to_name(err_status)); break; } } char modelid[] = {16, 'c', 'c', '2', '5', '3', '8', '.', 'r', 'o', 'u', 't', 'e', 'r', '.', 'v', '2'}; char manufname[] = {7, 'j', 'e', 't', 'h', 'o', 'm', 'e'}; static esp_zb_cluster_list_t *custom_temperature_sensor_clusters_create(esp_zb_temperature_sensor_cfg_t *temperature_sensor) { esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); esp_zb_attribute_list_t *basic_cluster = esp_zb_basic_cluster_create(&(temperature_sensor->basic_cfg)); ESP_ERROR_CHECK(esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, manufname)); ESP_ERROR_CHECK(esp_zb_basic_cluster_add_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, modelid)); ESP_ERROR_CHECK(esp_zb_cluster_list_add_basic_cluster(cluster_list, basic_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE)); ESP_ERROR_CHECK(esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(&(temperature_sensor->identify_cfg)), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE)); ESP_ERROR_CHECK(esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY), ESP_ZB_ZCL_CLUSTER_CLIENT_ROLE)); ESP_ERROR_CHECK(esp_zb_cluster_list_add_temperature_meas_cluster(cluster_list, esp_zb_temperature_meas_cluster_create(&(temperature_sensor->temp_meas_cfg)), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE)); return cluster_list; } static esp_zb_ep_list_t *custom_temperature_sensor_ep_create(uint8_t endpoint_id, esp_zb_temperature_sensor_cfg_t *temperature_sensor) { esp_zb_ep_list_t *ep_list = esp_zb_ep_list_create(); esp_zb_endpoint_config_t endpoint_config = { .endpoint = endpoint_id, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID, .app_device_version = 0 }; esp_zb_ep_list_add_ep(ep_list, custom_temperature_sensor_clusters_create(temperature_sensor), endpoint_config); return ep_list; } 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); /* Create customized temperature sensor endpoint */ esp_zb_temperature_sensor_cfg_t sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG(); /* Set (Min|Max)MeasuredValure */ sensor_cfg.temp_meas_cfg.min_value = zb_temperature_to_s16(ESP_TEMP_SENSOR_MIN_VALUE); sensor_cfg.temp_meas_cfg.max_value = zb_temperature_to_s16(ESP_TEMP_SENSOR_MAX_VALUE); esp_zb_ep_list_t *esp_zb_sensor_ep = custom_temperature_sensor_ep_create(HA_ESP_SENSOR_ENDPOINT, &sensor_cfg); /* Register the device */ esp_zb_device_register(esp_zb_sensor_ep); /* Config the reporting info */ esp_zb_zcl_reporting_info_t reporting_info; reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, reporting_info.ep = HA_ESP_SENSOR_ENDPOINT, reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID, reporting_info.u.send_info.min_interval = 1, reporting_info.u.send_info.max_interval = 0, reporting_info.u.send_info.def_min_interval = 1, reporting_info.u.send_info.def_max_interval = 0, reporting_info.u.send_info.delta.u16 = 100, reporting_info.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, esp_zb_zcl_update_reporting_info(&reporting_info); esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK); ESP_ERROR_CHECK(esp_zb_start(false)); esp_zb_main_loop_iteration(); } /********************* Arduino functions **************************/ void setup() { Serial.begin(115200); // set default RX/TX pin because nothing was defined in the call // Init Zigbee Serial.println("Zigbee init"); esp_zb_platform_config_t config = { .radio_config = ESP_ZB_DEFAULT_RADIO_CONFIG(), .host_config = ESP_ZB_DEFAULT_HOST_CONFIG(), }; ESP_ERROR_CHECK(esp_zb_platform_config(&config)); // Start Zigbee task xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL); } void testwerte_update() { esp_app_temp_sensor_handler(44.0); } void loop() { static long last_millis=0; static int first=1; //empty, zigbee running in task if ((millis() - last_millis) > 10000){ if (first) testwerte_update(); //last_millis = millis(); first = 0; } }
no errors - everything seems to work but do not in zigbee2mqtt
No response
btw: in zigbee2mqtt i see realistic link quality but no temperature is my call to esp_zb_zcl_set_attribute_val correct for setting the temperature?
Board
esp32c6
Device Description
esp32c6 dev module
Hardware Configuration
no
Version
v3.0.1
IDE Name
arduino ide
Operating System
windows 11
Flash frequency
80mhz
PSRAM enabled
yes
Upload speed
115200
Description
Problem with the HA_temperature_sensor example - can't set a value which is shown in zigbee2mqtt as temperature i'm using in zigbee2mqtt the following definition:
const fz = require('zigbee-herdsman-converters/converters/fromZigbee'); const tz = require('zigbee-herdsman-converters/converters/toZigbee'); const exposes = require('zigbee-herdsman-converters/lib/exposes'); const e = exposes.presets;
const device = { zigbeeModel: ['cc2538.router.v2'], model: 'cc2538.router.v2', vendor: 'jethome', description: 'zigbee router cc2538 with temperature sensor', fromZigbee: [fz.ignore_basic_report, fz.device_temperature], toZigbee: [], exposes: [e.device_temperature(), e.linkquality()], };
module.exports = device;
Sketch
Debug Message
Other Steps to Reproduce
No response
I have checked existing issues, online documentation and the Troubleshooting Guide