From 2c7e728437a43bd5203a0d59af090b227def6b13 Mon Sep 17 00:00:00 2001 From: jweigele Date: Sun, 14 Jan 2024 13:07:41 -0800 Subject: [PATCH] AQI features and changes Features: * Internal temperature sensor reporting * Uptime reporting * Motion sensor detect for 1 or 2 devices, interrupt triggered Other changes: * Generic report framework * Report MAC addy at start * More configurable openthread params * Migrated some include defines to kconfig (still pretty messy) * Semaphore guarded send task, so we don't stomp on various reports * Tuning on connection/keepalive behavior in MQTT for better stability * Include MAC in MQTT ID for better remote identification --- aqi/dependencies.lock | 8 +- aqi/main/Kconfig | 67 ++++++ aqi/main/aqi.c | 538 +++++++++++++++++++++--------------------- aqi/main/aqi.h | 5 +- aqi/sdkconfig | 92 +++++--- 5 files changed, 410 insertions(+), 300 deletions(-) diff --git a/aqi/dependencies.lock b/aqi/dependencies.lock index cf48a8e..1276ca3 100644 --- a/aqi/dependencies.lock +++ b/aqi/dependencies.lock @@ -6,16 +6,16 @@ dependencies: type: service version: 2.0.0 espressif/mdns: - component_hash: 53b22a3b01d0b61180369a5dab00e271f1e725164b6affbc73af85e80b043658 + component_hash: 810ec139689ae93bf42520d05de4855fbb68f7140ef67797d91d8d61829589cb source: service_url: https://api.components.espressif.com/ type: service - version: 1.2.0 + version: 1.2.2 idf: component_hash: null source: type: idf - version: 5.1.1 -manifest_hash: c508d657d00fb5d33458883128bb78142b4390c1d3213d706d801da9056c9657 + version: 5.1.2 +manifest_hash: f3235d76476013e02f3188e81bf6c37c65c4e7e5ebba3f55f64f2481effeaf90 target: esp32h2 version: 1.0.0 diff --git a/aqi/main/Kconfig b/aqi/main/Kconfig index 4047a94..8735b39 100644 --- a/aqi/main/Kconfig +++ b/aqi/main/Kconfig @@ -5,6 +5,16 @@ config TEMP_ENABLED default y help This gets passed and used for includes later +config TEMP_PIN + int "If using temperature, on which GPIO?" + default 4 + help + Gets passed and used later for includes +config EEPY_DEVICE + bool "Minimal, sleeping thread device?" + default n + help + Working on this config LIGHT_SLEEP_ENABLED bool "Actually go into light sleep between polls?" default n @@ -36,6 +46,63 @@ config LED_ENABLED default n help Gets passed and used later for includes +config MOTION_FIRST_ENABLED + bool "Are we using a PIR motion sensor (first)?" + default n + help + Gets passed and used later for includes +config MOTION_FIRST_PIN + int "If using motion, on which GPIO?" + default 22 + help + Gets passed and used later for includes + +config MOTION_SECOND_ENABLED + bool "Are we using a PIR motion sensor (second)?" + default n + help + Gets passed and used later for includes +config MOTION_SECOND_PIN + int "If using motion, on which GPIO?" + default 22 + help + Gets passed and used later for includes + +config PWM_ENABLED + bool "Are we using PWM led control?" + default n + help + Also uses PWM_TOPIC to determine listening MQTT + +config PWM_TOPIC + string "Topic to listen on for PWM data" + default "esp32/pwm/default" + +config PWM_R1_GPIO + int "Red 1 GPIO LED, -1 for disabled" + default -1 + +config PWM_G1_GPIO + int "Green 1 GPIO LED, -1 for disabled" + default -1 + +config PWM_B1_GPIO + int "Blue 1 GPIO LED, -1 for disabled" + default -1 + +config PWM_R2_GPIO + int "Red 2 GPIO LED, -1 for disabled" + default -1 + +config PWM_G2_GPIO + int "Green 2 GPIO LED, -1 for disabled" + default -1 + +config PWM_B2_GPIO + int "Blue 2 GPIO LED, -1 for disabled" + default -1 + + config INDICATOR_ENABLED bool "Are we using the onboard WS2812B for rough AQI status info?" default y diff --git a/aqi/main/aqi.c b/aqi/main/aqi.c index e8c3fc1..076ba56 100644 --- a/aqi/main/aqi.c +++ b/aqi/main/aqi.c @@ -18,13 +18,42 @@ #include "freertos/task.h" #include "aqi.h" #include "math.h" +#include "esp_mac.h" +#include "driver/gpio.h" +#include "driver/temperature_sensor.h" typedef struct aqi_data_s { float pm10; float pm25; } aqi_data_t; + +typedef struct report_data_s { +#ifdef CONFIG_UART_ENABLED + uint16_t pm10; + uint16_t pm25; + float aqi; +#endif +#ifdef CONFIG_TEMP_ENABLED + uint16_t temperature; +#endif +#if defined(CONFIG_MOTION_FIRST_ENABLED) || defined(CONFIG_MOTION_SECOND_ENABLED) + bool motion; +#endif + float internal_temperature; + uint32_t uptime; + SemaphoreHandle_t mutex; +} report_data_t; + +static temperature_sensor_handle_t temp_handle; static QueueHandle_t event_queue; +static QueueHandle_t send_queue; + +#if defined(CONFIG_MOTION_FIRST_ENABLED) || defined(CONFIG_MOTION_SECOND_ENABLED) +static QueueHandle_t motion_queue; +static int motion_pins[2] = {0, 0}; + +#endif // for tracking and reporting device uptime static uint32_t device_uptime_seconds = 0; @@ -57,24 +86,26 @@ uint8_t aqi_band_colors[6][3] = { static bool way_too_funky = false; static bool init_connected = false; -#ifdef CONFIG_ZIG_ENABLED -static bool zig_connected = false; -#endif #if defined(CONFIG_WIFI_ENABLED) || defined(CONFIG_OT_ENABLED) static bool netif_connected = false; static bool mqtt_was_reinit = true; static bool mqtt_connected = false; +static uint8_t ot_mac[6]; #endif static aqi_data_t cur_pm = { .pm10 = 0, .pm25 = 0 }; + +static report_data_t report_data; + static aqi_data_t pmbuffer[PMBUFFERSIZE]; static int pmbufferindex = 0; + // openthread functions #ifdef CONFIG_OT_ENABLED void handleNetifStateChanged(uint32_t aFlags, void *aContext) @@ -88,10 +119,14 @@ void handleNetifStateChanged(uint32_t aFlags, void *aContext) case OT_DEVICE_ROLE_LEADER: case OT_DEVICE_ROLE_ROUTER: case OT_DEVICE_ROLE_CHILD: + ESP_LOGI(TAG, "valid role, setting netif_connected"); netif_connected = true; - init_connected = true; - ESP_LOGI(TAG, "is_connected = true"); - init_mqtt(); + if (mqtt_connected == false ){ + ESP_LOGI(TAG, "CONNECTING to mqtt here!"); + init_connected = true; + ESP_LOGI(TAG, "is_connected = true"); + init_mqtt(); + } break; case OT_DEVICE_ROLE_DETACHED: @@ -156,9 +191,15 @@ static void create_config_network(otInstance *instance) { otLinkModeConfig linkMode = { 0 }; +#ifdef CONFIG_EEPY_DEVICE linkMode.mRxOnWhenIdle = true; linkMode.mDeviceType = false; - linkMode.mNetworkData = false; + linkMode.mNetworkData = false; +#else + linkMode.mRxOnWhenIdle = true; + linkMode.mDeviceType = true; + linkMode.mNetworkData = true; +#endif if (otLinkSetPollPeriod(instance, CONFIG_OPENTHREAD_NETWORK_POLLPERIOD_TIME) != OT_ERROR_NONE) { ESP_LOGE(TAG, "Failed to set OpenThread pollperiod."); @@ -188,6 +229,7 @@ static esp_netif_t *init_openthread_netif(const esp_openthread_platform_config_t { esp_netif_config_t cfg = ESP_NETIF_DEFAULT_OPENTHREAD(); esp_netif_t *netif = esp_netif_new(&cfg); + assert(netif != NULL); ESP_ERROR_CHECK(esp_netif_attach(netif, esp_openthread_netif_glue_init(config))); @@ -204,7 +246,7 @@ static esp_err_t ot_power_save_init(void) .max_freq_mhz = cur_cpu_freq_mhz, .min_freq_mhz = cur_cpu_freq_mhz, #if CONFIG_FREERTOS_USE_TICKLESS_IDLE - .light_sleep_enable = true + .light_sleep_enable = false //true #endif }; @@ -235,13 +277,19 @@ static void ot_task_worker(void *aContext) create_config_network(esp_openthread_get_instance()); - while (true) { + //esp_err_t err_netif = esp_netif_get_mac(openthread_netif, ot_mac); + esp_err_t err_netif = esp_base_mac_addr_get(ot_mac); + ESP_LOGE(TAG, "error status is %s", esp_err_to_name(err_netif)); + ESP_LOGI(TAG, "here I go here I go here I go again"); + ESP_LOG_BUFFER_HEXDUMP(TAG, ot_mac, 6, ESP_LOG_INFO); + + //while (true) { // Run the main loop - esp_err_t err = esp_openthread_launch_mainloop(); - ESP_LOGE(TAG, "Error somewhere in openthread loop %s.", esp_err_to_name(err)); - vTaskDelay( pdMS_TO_TICKS(10000) ); + esp_err_t err = esp_openthread_launch_mainloop(); + ESP_LOGE(TAG, "Error somewhere in openthread loop %s.", esp_err_to_name(err)); + // vTaskDelay( pdMS_TO_TICKS(10000) ); - } + //} // Clean up @@ -301,11 +349,6 @@ void erase_data_hook(void){ way_too_funky = true; } -#ifdef CONFIG_ZIG_ENABLED - // we call the zigbee code directly so this needs no check - ESP_LOGW(TAG, "erasing zigbee settings by calling function"); - esp_zb_factory_reset(); -#endif ESP_LOGI(TAG, "waiting 10 seconds then restarting"); // if you didn't have zigbee running, this takes care of the restart vTaskDelay( pdMS_TO_TICKS(10000) ); @@ -315,20 +358,6 @@ void erase_data_hook(void){ } } - - -#ifdef CONFIG_ZIG_ENABLED -typedef struct zdo_info_ctx_s { - uint8_t endpoint; - esp_zb_ieee_addr_t long_addr; -} zdo_info_user_ctx_t; - -static void bdb_start_top_level_commissioning_cb(uint8_t mode_mask) -{ - ESP_ERROR_CHECK(esp_zb_bdb_start_top_level_commissioning(mode_mask)); -} -#endif - #ifdef CONFIG_LED_ENABLED void init_led(){ led = tm1637_init(LED_GPIO_CLK, LED_GPIO_DIO); @@ -342,7 +371,7 @@ void init_led(){ #ifdef CONFIG_TEMP_ENABLED bool init_temp(){ - bool err = ow_init(&ow, TEMP_GPIO); + bool err = ow_init(&ow, CONFIG_TEMP_PIN); if (err){ ESP_LOGI(TAG, "there was an error initing ow"); } @@ -505,59 +534,87 @@ void init_uart(void) { uart_set_pin(UART_NUM_1, UART_TX_GPIO, UART_RX_GPIO, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); } +static void send_task(void* discard){ + + char* mqtt_string = ""; //NULL; + bool last_sent = false; + for(;;){ + // receive an event we need to deal with from elsewhere, right now just reconnect related + if (xQueueReceive(send_queue, &mqtt_string, portMAX_DELAY )){ + last_sent = true; + //ESP_LOGW(TAG, "received a string in send loop! %s", mqtt_string); + ESP_LOGI(TAG, "sending mqtt_string:\n%s",mqtt_string); + if (netif_connected == true && mqtt_connected == true){ + int msg_id = esp_mqtt_client_publish(mqtt_client, "esp32/sensor_info", mqtt_string, 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + } else { + ESP_LOGW(TAG, "well, not quite yet (not connected)"); + } + free(mqtt_string); + } + // and loop around immediately if we just sent something, otherwise sleep a bit + if (last_sent == true) { + last_sent = false; + } else { + vTaskDelay( pdMS_TO_TICKS(1000) ); + } + + } + +} + #if defined(CONFIG_WIFI_ENABLED) || defined(CONFIG_OT_ENABLED) -static void send_report_wifi(uint16_t pm10, uint16_t pm25, float aqi, uint16_t temperature){ +static void send_report_motion(bool motion){ + xSemaphoreTake(report_data.mutex, portMAX_DELAY); + + ESP_LOGI(TAG, "send_report_motion was called!"); + cJSON *root; + root = cJSON_CreateObject(); + cJSON_AddStringToObject(root, "location", CONFIG_LOCATION); + cJSON_AddBoolToObject(root, "motion", motion); + char *mqtt_string = cJSON_Print(root); + xQueueSend(send_queue, &mqtt_string, portMAX_DELAY); + cJSON_Delete(root); + + xSemaphoreGive(report_data.mutex); + +} + +static void send_report_wifi(report_data_t report_data){ + xSemaphoreTake(report_data.mutex, portMAX_DELAY); + ESP_LOGI(TAG, "send_report_wifi was called!"); cJSON *root; root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "location", CONFIG_LOCATION); - cJSON_AddNumberToObject(root, "pm10", ((float)pm10/100)); - cJSON_AddNumberToObject(root, "pm25", ((float)pm25/100)); - cJSON_AddNumberToObject(root, "aqi", aqi); - cJSON_AddNumberToObject(root, "uptime", device_uptime_seconds); +#ifdef CONFIG_UART_ENABLED + cJSON_AddNumberToObject(root, "pm10", ((float)report_data.pm10/100)); + cJSON_AddNumberToObject(root, "pm25", ((float)report_data.pm25/100)); + cJSON_AddNumberToObject(root, "aqi", report_data.aqi); +#endif + cJSON_AddNumberToObject(root, "uptime", report_data.uptime); + cJSON_AddNumberToObject(root, "internal", report_data.internal_temperature); #ifdef CONFIG_TEMP_ENABLED - cJSON_AddNumberToObject(root, "temperature", ((float)temperature/100)); + if (report_data.temperature != 0x8000) { + cJSON_AddNumberToObject(root, "temperature", ((float)report_data.temperature/100)); + //ESP_LOGI(TAG, "temperature was %u", temperature); + } else { + ESP_LOGW(TAG, "temperature not init, skipping it in report"); + } +#endif +#if defined(CONFIG_MOTION_FIRST_ENABLED) || defined(CONFIG_MOTION_SECOND_ENABLED) + cJSON_AddBoolToObject(root, "motion", report_data.motion); #endif - //const char *my_json_string = cJSON_Print(root); char *mqtt_string = cJSON_Print(root); - ESP_LOGI(TAG, "sending mqtt_string:\n%s",mqtt_string); - if (netif_connected == true && mqtt_connected == true){ - int msg_id = esp_mqtt_client_publish(mqtt_client, "esp32/sensor_info", mqtt_string, 0, 1, 0); - ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); - } else { - ESP_LOGW(TAG, "well, not quite yet (not connected)"); - } - free(mqtt_string); + xQueueSend(send_queue, &mqtt_string, portMAX_DELAY); cJSON_Delete(root); -} -#endif - -#ifdef CONFIG_ZIG_ENABLED -static void send_report_zig(int report_cluster, int report_attribute){ - ESP_LOGI(TAG, "sending report here"); - esp_zb_zcl_report_attr_cmd_t des; - - //uint8_t long_addy[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}; - //memcpy(des.zcl_basic_cmd.dst_addr_u.addr_long, long_addy, sizeof(esp_zb_ieee_addr_t)); - //des.zcl_basic_cmd.dst_addr_u.addr_long = long_addy; - des.zcl_basic_cmd.dst_addr_u.addr_short = 0; - // 0xFFFCu; - des.zcl_basic_cmd.dst_endpoint = HA_ESP_ENDPOINT; - des.zcl_basic_cmd.src_endpoint = HA_ESP_ENDPOINT; - des.address_mode = ESP_ZB_APS_ADDR_MODE_16_ENDP_PRESENT; - //ESP_ZB_APS_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT; - //des.address_mode = ESP_ZB_APS_ADDR_MODE_64_ENDP_PRESENT; - - des.clusterID = report_cluster; - des.attributeID = report_attribute; - des.cluster_role=ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; - ESP_ERROR_CHECK(esp_zb_zcl_report_attr_cmd_req(&des)); - ESP_LOGI(TAG, "sent report"); + xSemaphoreGive(report_data.mutex); } + #endif bool verify_checksum(uint8_t* data){ @@ -619,6 +676,96 @@ aqi_data_t get_average_pm25(uint8_t* data, int data_size){ } +#if defined(CONFIG_MOTION_FIRST_ENABLED) || defined(CONFIG_MOTION_SECOND_ENABLED) +static void IRAM_ATTR gpio_isr_handler(void* arg) +{ + uint32_t gpio_num = (uint32_t) arg; + xQueueSendFromISR(motion_queue, &gpio_num, NULL); +} + +static void motion_task(void* discard){ + + //zero-initialize the config structure. + gpio_config_t io_conf = {}; + + //interrupt of rising edge + io_conf.intr_type = GPIO_INTR_ANYEDGE; + //bit mask of the pins, use GPIO4/5 here + io_conf.pin_bit_mask = 0; +#ifdef CONFIG_MOTION_FIRST_ENABLED + io_conf.pin_bit_mask |= (1ULL << CONFIG_MOTION_FIRST_PIN); + ESP_LOGI(TAG, "first motion bitmask now %"PRIu64, io_conf.pin_bit_mask); +#endif +#ifdef CONFIG_MOTION_SECOND_ENABLED + io_conf.pin_bit_mask |= (1ULL << CONFIG_MOTION_SECOND_PIN); + ESP_LOGI(TAG, "second motion bitmask now %"PRIu64, io_conf.pin_bit_mask); +#endif + + //set as input mode + io_conf.mode = GPIO_MODE_INPUT; + //enable pull-down mode + io_conf.pull_down_en = 1; + io_conf.pull_up_en = 0; + gpio_config(&io_conf); + + //change gpio interrupt type for one pin +#ifdef CONFIG_MOTION_FIRST_ENABLED + ESP_ERROR_CHECK(gpio_set_intr_type(CONFIG_MOTION_FIRST_PIN, GPIO_INTR_ANYEDGE)); +#endif +#ifdef CONFIG_MOTION_SECOND_ENABLED + ESP_ERROR_CHECK(gpio_set_intr_type(CONFIG_MOTION_SECOND_PIN, GPIO_INTR_ANYEDGE)); +#endif + + + //create a queue to handle gpio event from isr + motion_queue = xQueueCreate(10, sizeof(uint32_t)); + + //install gpio isr service + ESP_ERROR_CHECK(gpio_install_isr_service(ESP_INTR_FLAG_LOWMED)); + //hook isr handler for specific gpio pin +#ifdef CONFIG_MOTION_FIRST_ENABLED + esp_err_t firstret = gpio_isr_handler_add(CONFIG_MOTION_FIRST_PIN, gpio_isr_handler, (void*) CONFIG_MOTION_FIRST_PIN); + ESP_LOGE(TAG, "return for isr handler add (first) is %s", esp_err_to_name(firstret)); +#endif +#ifdef CONFIG_MOTION_SECOND_ENABLED + esp_err_t secondret = gpio_isr_handler_add(CONFIG_MOTION_SECOND_PIN, gpio_isr_handler, (void*) CONFIG_MOTION_SECOND_PIN); + ESP_LOGE(TAG, "return for isr handler add (second) is %s", esp_err_to_name(secondret)); +#endif + + + uint32_t io_num; + ESP_LOGI(TAG, "waiting for motion events"); + for(;;) { + if(xQueueReceive(motion_queue, &io_num, portMAX_DELAY)) { + // Take the mutex + xSemaphoreTake(report_data.mutex, portMAX_DELAY); + int pin_value = gpio_get_level(io_num); + printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, pin_value); + switch (io_num) { + case CONFIG_MOTION_FIRST_PIN: + motion_pins[0] = pin_value; + break; + case CONFIG_MOTION_SECOND_PIN: + motion_pins[1] = pin_value; + break; + default: + printf("Unable to set motion pins!\n"); + } + bool motion; + if ((motion_pins[0] == 0) && (motion_pins[1] == 0)) { + motion = false; + } else { + motion = true; + } + + report_data.motion = motion; + xSemaphoreGive(report_data.mutex); + send_report_motion(motion); + } + } +} +#endif + static void monitoring_task(void* discard) { short temp_avg = 0; @@ -634,6 +781,8 @@ short temp_avg = 0; int64_t remaining_time = 0; uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE+1); int length = 0; + float cur_aqi_pm25 = 0.0; + float cur_aqi_pm10 = 0.0; #if defined(CONFIG_WIFI_ENABLED) || defined(CONFIG_OT_ENABLED) esp_mqtt_client_handle_t queue_item; #endif @@ -652,10 +801,17 @@ short temp_avg = 0; cur_uptime = esp_timer_get_time(); // we'll use this to calc our sleeps later next_sleep_uptime = cur_uptime + SLEEP_MS*1000; + // first things first (function gives microseconds, just convert to seconds) // 32 bits is enough for >50 years and zigbee stack gets mad if we use more bits + xSemaphoreTake(report_data.mutex, portMAX_DELAY); + ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_handle, &report_data.internal_temperature)); device_uptime_seconds = (uint32_t)(cur_uptime/1000000); + report_data.uptime = device_uptime_seconds; + xSemaphoreGive(report_data.mutex); + +#ifdef CONFIG_UART_ENABLED // aqi fetch/calculation/report ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM_1, (size_t*)&length)); const int rxBytes = uart_read_bytes(UART_NUM_1, data, length, 1000); @@ -673,30 +829,12 @@ short temp_avg = 0; } else { ESP_LOGW(TAG, "pm average outside of threshold, ignoring"); } -#ifdef CONFIG_ZIG_ENABLED - - if (zig_connected){ - set_pm10 = (uint16_t)cur_pm.pm10; - set_pm25 = (uint16_t)cur_pm.pm25; - - esp_zb_zcl_set_attribute_val(HA_ESP_ENDPOINT, PM25CLUSTER, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - PM10MEASURED, &set_pm10, false); - esp_zb_zcl_set_attribute_val(HA_ESP_ENDPOINT, PM25CLUSTER, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - PM25MEASURED, &set_pm25, false); - send_report_zig(PM10CLUSTER, PM10MEASURED); - send_report_zig(PM25CLUSTER, PM25MEASURED); - // reasonable place to do it since this is the one universal measurement block for zigbee - esp_zb_zcl_set_attribute_val(HA_ESP_ENDPOINT, UPTIMECLUSTER, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - UPTIMEID, &device_uptime_seconds, false); - send_report_zig(UPTIMECLUSTER, UPTIMEID); - } -#endif } else { ESP_LOGW(TAG, "Nothing seen from uart"); } - float cur_aqi_pm10 = aqi_calc_pm10(cur_pm.pm10); - float cur_aqi_pm25 = aqi_calc_pm25(cur_pm.pm25); + cur_aqi_pm10 = aqi_calc_pm10(cur_pm.pm10); + cur_aqi_pm25 = aqi_calc_pm25(cur_pm.pm25); uint16_t set_aqi; if (cur_aqi_pm25 > cur_aqi_pm10){ ESP_LOGI(TAG, "pm25 > pm10, using %f > %f", cur_aqi_pm25, cur_aqi_pm10); @@ -705,6 +843,11 @@ short temp_avg = 0; ESP_LOGI(TAG, "pm10 > pm25, using %f > %f", cur_aqi_pm10, cur_aqi_pm25); set_aqi = round(cur_aqi_pm10); } + xSemaphoreTake(report_data.mutex, portMAX_DELAY); + report_data.pm10 = cur_pm.pm10; + report_data.pm25 = cur_pm.pm25; + report_data.aqi = set_aqi; + xSemaphoreGive(report_data.mutex); #ifdef CONFIG_LED_ENABLED ESP_LOGI(TAG, "setting led value to %d", set_aqi); tm1637_set_number(led, set_aqi); @@ -717,30 +860,23 @@ short temp_avg = 0; // colors match the aqi bands that we're calculating off of, so just 1:1 translate the RGB through light_driver_set_color_RGB(current_colors[0], current_colors[1], current_colors[2]); #endif + +#endif // end UART section temp_avg = 0; #ifdef CONFIG_TEMP_ENABLED // Temperature fetch/calculation/report temp_avg = new_temp_average(get_temp()); - ESP_LOGI(TAG, "current: %d", temp_avg); - -#ifdef CONFIG_ZIG_ENABLED - if (zig_connected){ - ESP_LOGI(TAG, "setting attrib value and sending, I guess"); - esp_zb_zcl_set_attribute_val(HA_ESP_ENDPOINT, ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, &temp_avg, false); - send_report_zig(ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID); - } - -#endif // ZIG - - + xSemaphoreTake(report_data.mutex, portMAX_DELAY); + report_data.temperature = temp_avg; + xSemaphoreGive(report_data.mutex); + ESP_LOGI(TAG, "current: %u", temp_avg); #endif // TEMP #if defined(CONFIG_WIFI_ENABLED) || defined(CONFIG_OT_ENABLED) // one BIG report for wifi - send_report_wifi(cur_pm.pm10, cur_pm.pm25, cur_aqi_pm25, temp_avg); + send_report_wifi(report_data); #endif cur_uptime = esp_timer_get_time(); @@ -789,144 +925,6 @@ short temp_avg = 0; free(data); } - -#ifdef CONFIG_ZIG_ENABLED -void esp_zb_app_signal_handler(esp_zb_app_signal_t *signal_struct) -{ - uint32_t *p_sg_p = signal_struct->p_app_signal; - // error handling if pointer is messed up - if (p_sg_p == NULL){ - ESP_LOGW(TAG, "signal null in app signal handler, just returning"); - return; - } - esp_err_t err_status = signal_struct->esp_err_status; - esp_zb_app_signal_type_t sig_type = *p_sg_p; - ESP_LOGI(TAG, "enter signal handler"); - switch (sig_type) { - case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP: - ESP_LOGI(TAG, "Zigbee stack initialized"); - 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: - //zig_connected = false; - if (err_status == ESP_OK) { - ESP_LOGI(TAG, "Start network steering"); - esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING); - esp_zb_ieee_addr_t local_addy; - esp_zb_get_long_address(local_addy); - ESP_LOGI(TAG, "Local ZB address: 0x%02x%02x%02x%02x%02x%02x%02x%02x", - local_addy[7], local_addy[6], local_addy[5], local_addy[4], - local_addy[3], local_addy[2], local_addy[1], local_addy[0]); - } else { - /* commissioning failed */ - ESP_LOGW(TAG, "Failed to initialize Zigbee stack (status: %s)", esp_err_to_name(err_status)); - //zig_connected = false; - esp_zb_start(false); - } - 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); - ESP_LOGI(TAG, "Joined network successfully (Extended PAN ID: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x, PAN ID: 0x%04hx, Channel:%d)", - extended_pan_id[7], extended_pan_id[6], extended_pan_id[5], extended_pan_id[4], - extended_pan_id[3], extended_pan_id[2], extended_pan_id[1], extended_pan_id[0], - esp_zb_get_pan_id(), esp_zb_get_current_channel()); - /* Implement some actions if needed when other cluster changed */ - - zig_connected = true; - init_connected = true; - } else { - ESP_LOGI(TAG, "Network steering was not successful (status: %s)", esp_err_to_name(err_status)); - //zig_connected = false; - 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; - } -} - -static void esp_zb_task(void *pvParameters) -{ - if (ZB_TYPE == ESP_ZB_DEVICE_TYPE_ROUTER){ - ESP_LOGI(TAG, "entered esp_zb_task, zb_type is router"); - } else { - ESP_LOGI(TAG, "entered esp_zb_task, zb_type is end device"); - } - - /* initialize Zigbee stack with Zigbee end-device config */ - esp_zb_cfg_t zb_nwk_cfg = ESP_ZB_ZED_CONFIG(); - esp_zb_init(&zb_nwk_cfg); - - esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK); - - /* set the on-off light device config */ - char modelid[] = {7, 'T', 'E', 'S', 'T', 'D', 'E', 'V'}; - char manufacturer[] = {3, 'h', 'e', 'x'}; - uint8_t power_source[] = {0x01}; - - - /* basic cluster create with fully customized */ - esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_BASIC); - esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, power_source); - esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MODEL_IDENTIFIER_ID, &modelid); - esp_zb_basic_cluster_add_attr(esp_zb_basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_MANUFACTURER_NAME_ID, &manufacturer); - /* identify cluster create with fully customized */ - esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_IDENTIFY); - - - esp_zb_attribute_list_t *esp_zb_uptime_cluster = esp_zb_zcl_attr_list_create(UPTIMECLUSTER); - ESP_ERROR_CHECK(esp_zb_custom_cluster_add_custom_attr(esp_zb_uptime_cluster, UPTIMEID, ESP_ZB_ZCL_ATTR_TYPE_U32, ESP_ZB_ZCL_ATTR_ACCESS_READ_ONLY | ESP_ZB_ZCL_ATTR_ACCESS_REPORTING, &device_uptime_seconds)); - - uint16_t initial_pm10 = 0; - uint16_t initial_pm25 = 0; - - - esp_zb_attribute_list_t *esp_zb_pm25_cluster = esp_zb_zcl_attr_list_create(PM25CLUSTER); - ESP_ERROR_CHECK(esp_zb_custom_cluster_add_custom_attr(esp_zb_pm25_cluster, PM25MEASURED, ESP_ZB_ZCL_ATTR_TYPE_U16, ESP_ZB_ZCL_ATTR_ACCESS_READ_ONLY | ESP_ZB_ZCL_ATTR_ACCESS_REPORTING, &initial_pm25)); - ESP_ERROR_CHECK(esp_zb_custom_cluster_add_custom_attr(esp_zb_pm25_cluster, PM10MEASURED, ESP_ZB_ZCL_ATTR_TYPE_U16, ESP_ZB_ZCL_ATTR_ACCESS_READ_ONLY | ESP_ZB_ZCL_ATTR_ACCESS_REPORTING, &initial_pm10)); - - /* create cluster lists for this endpoint */ - esp_zb_cluster_list_t *esp_zb_cluster_list = esp_zb_zcl_cluster_list_create(); - esp_zb_cluster_list_add_basic_cluster(esp_zb_cluster_list, esp_zb_basic_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_identify_cluster(esp_zb_cluster_list, esp_zb_identify_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - -#ifdef CONFIG_TEMP_ENABLED - short min_temp = MIN_TEMP_VALUE; - short max_temp = MAX_TEMP_VALUE; - - // temperature cluster - esp_zb_attribute_list_t *esp_zb_temp_cluster = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT); - esp_zb_temperature_meas_cluster_add_attr(esp_zb_temp_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, &tempbuffer[0]); - esp_zb_temperature_meas_cluster_add_attr(esp_zb_temp_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, &min_temp); - esp_zb_temperature_meas_cluster_add_attr(esp_zb_temp_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, &max_temp); - - esp_zb_cluster_list_add_temperature_meas_cluster(esp_zb_cluster_list, esp_zb_temp_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); -#endif - - ESP_ERROR_CHECK(esp_zb_cluster_list_add_custom_cluster(esp_zb_cluster_list, esp_zb_uptime_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE)); - ESP_ERROR_CHECK(esp_zb_cluster_list_add_custom_cluster(esp_zb_cluster_list, esp_zb_pm25_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE)); - - - esp_zb_ep_list_t *esp_zb_ep_list = esp_zb_ep_list_create(); - /* add created endpoint (cluster_list) to endpoint list */ - esp_zb_ep_list_add_ep(esp_zb_ep_list, esp_zb_cluster_list, HA_ESP_ENDPOINT, ESP_ZB_AF_HA_PROFILE_ID, ESP_ZB_HA_ON_OFF_OUTPUT_DEVICE_ID); - esp_zb_device_register(esp_zb_ep_list); - - ESP_ERROR_CHECK(esp_zb_start(false)); - erase_data_hook(); - - //ESP_ERROR_CHECK(esp_zb_secur_ic_set(ESP_ZB_IC_TYPE_128, (uint8_t*)curic)); - ESP_LOGI(TAG, "main loop begin"); - esp_zb_main_loop_iteration(); - -} -#endif - #if defined(CONFIG_WIFI_ENABLED) || defined(CONFIG_OT_ENABLED) static void log_error_if_nonzero(const char *message, int error_code) @@ -1016,6 +1014,9 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ void init_mqtt(){ ESP_LOGI(TAG, "attempting to connect to MQTT"); mqtt_client = NULL; + char mqtt_id[64]; + sprintf(mqtt_id, "ESP32_%02x%02x%02x%02x%02x%02x", + ot_mac[0], ot_mac[1], ot_mac[2], ot_mac[3], ot_mac[4], ot_mac[5]); esp_mqtt_client_config_t mqtt_cfg = { .broker = { .address.uri = CONFIG_BROKER_URL, @@ -1023,7 +1024,10 @@ void init_mqtt(){ //.verification.use_global_ca_store = true, //.verification.crt_bundle_attach = esp_crt_bundle_attach, }, - .session.keepalive = 10, + .credentials.client_id = mqtt_id, + .session.keepalive = 60, + .session.disable_keepalive = false, + .session.disable_clean_session = false, //.cacert_buf = ca_cert, //.cacert_bytes = strlen(ca_cert)+1, }; @@ -1084,6 +1088,21 @@ void app_main(void) #endif*/ ESP_ERROR_CHECK(nvs_flash_init()); + + // temp monitoring + temp_handle = NULL; + temperature_sensor_config_t temp_sensor = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80); + /* { + .range_min = 20, + .range_max = 100, + .temperature_sensor_clk_src_t = + };*/ + ESP_ERROR_CHECK(temperature_sensor_install(&temp_sensor, &temp_handle)); // + ESP_ERROR_CHECK(temperature_sensor_enable(temp_handle)); + + + // Create mutex before starting tasks + report_data.mutex = xSemaphoreCreateMutex(); #if defined(CONFIG_WIFI_ENABLED) || defined(CONFIG_OT_ENABLED) event_queue = xQueueCreate(5, sizeof(esp_mqtt_client_handle_t)); #endif @@ -1092,19 +1111,14 @@ void app_main(void) light_driver_init(LIGHT_DEFAULT_OFF); #endif -// if it's zigbee enabled, we need to actually start zb -// before calling this (added directly in task later) -#ifndef CONFIG_ZIG_ENABLED - ESP_LOGI(TAG, "no zigbee, calling erase hook early"); - // check for erasing data partitions - erase_data_hook(); -#endif #ifdef CONFIG_INDICATOR_ENABLED adjust_color_lookup_brightness(AQI_INDICATOR_BRIGHTNESS); #endif - init_uart(); +#ifdef CONFIG_UART_ENABLED + init_uart(); init_pmbuffer(); +#endif #ifdef CONFIG_TEMP_ENABLED init_tempbuffer(); #endif @@ -1115,18 +1129,6 @@ void app_main(void) //runit(); #endif -#ifdef CONFIG_ZIG_ENABLED - esp_zb_platform_config_t config = { - .radio_config = ESP_ZB_DEFAULT_RADIO_CONFIG(), - .host_config = ESP_ZB_DEFAULT_HOST_CONFIG(), - }; - - /* load Zigbee light_bulb platform config to initialization */ - ESP_ERROR_CHECK(esp_zb_platform_config(&config)); - /* hardware related and device init */ - //light_driver_init(LIGHT_DEFAULT_OFF); - xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL); -#endif #ifdef CONFIG_OT_ENABLED esp_vfs_eventfd_config_t eventfd_config = { .max_fds = 3, @@ -1146,6 +1148,12 @@ void app_main(void) wifi_manager_set_callback(WM_EVENT_STA_GOT_IP, &wifi_connection_ok); wifi_manager_set_callback(WM_EVENT_STA_DISCONNECTED, &wifi_connection_bad); +#endif + send_queue = xQueueCreate(5, sizeof(char*)); + xTaskCreate(send_task, "send_task", 4096, NULL, 2, NULL); +#if defined(CONFIG_MOTION_FIRST_ENABLED) || defined(CONFIG_MOTION_SECOND_ENABLED) + ESP_LOGI(TAG, "installing motion task"); + xTaskCreate(motion_task, "motion_task", 4096, NULL, 2, NULL); #endif xTaskCreate(monitoring_task, "monitoring_task", 4096, NULL, 1, NULL); } diff --git a/aqi/main/aqi.h b/aqi/main/aqi.h index 33b2102..5b7bfdc 100644 --- a/aqi/main/aqi.h +++ b/aqi/main/aqi.h @@ -102,7 +102,6 @@ static const char *TAG = "aqi"; #define AQI_INDICATOR_BRIGHTNESS 0.01 #ifdef CONFIG_TEMP_ENABLED -#define TEMP_GPIO 4 #include "onewire.h" #define MIN_TEMP_VALUE -5500 #define MAX_TEMP_VALUE 12500 @@ -119,8 +118,8 @@ static const char *TAG = "aqi"; #endif #define MAXDEVS 1 -#define UART_RX_GPIO (GPIO_NUM_12) -#define UART_TX_GPIO (GPIO_NUM_14) +#define UART_RX_GPIO (GPIO_NUM_22) +#define UART_TX_GPIO (GPIO_NUM_25) // ten second loop #define SLEEP_MS 10000 diff --git a/aqi/sdkconfig b/aqi/sdkconfig index d4ffda5..3ceb4e3 100644 --- a/aqi/sdkconfig +++ b/aqi/sdkconfig @@ -1,6 +1,6 @@ # # Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.1.1 Project Configuration +# Espressif IoT Development Framework (ESP-IDF) 5.1.2 Project Configuration # CONFIG_SOC_ADC_SUPPORTED=y CONFIG_SOC_ANA_CMPR_SUPPORTED=y @@ -44,6 +44,7 @@ CONFIG_SOC_BOD_SUPPORTED=y CONFIG_SOC_APM_SUPPORTED=y CONFIG_SOC_PMU_SUPPORTED=y CONFIG_SOC_LP_TIMER_SUPPORTED=y +CONFIG_SOC_LP_AON_SUPPORTED=y CONFIG_SOC_PAU_SUPPORTED=y CONFIG_SOC_CLK_TREE_SUPPORTED=y CONFIG_SOC_XTAL_SUPPORT_32M=y @@ -70,6 +71,9 @@ CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_CALIB_CHAN_COMPENS_SUPPORTED=y CONFIG_SOC_ADC_TEMPERATURE_SHARE_INTR=y CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y @@ -80,7 +84,7 @@ CONFIG_SOC_CPU_HAS_FLEXIBLE_INTC=y CONFIG_SOC_INT_PLIC_SUPPORTED=y CONFIG_SOC_CPU_BREAKPOINTS_NUM=4 CONFIG_SOC_CPU_WATCHPOINTS_NUM=4 -CONFIG_SOC_CPU_WATCHPOINT_SIZE=0x80000000 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x80000000 CONFIG_SOC_CPU_HAS_PMA=y CONFIG_SOC_CPU_IDRAM_SPLIT_USING_PMP=y CONFIG_SOC_MMU_PAGE_SIZE_CONFIGURABLE=y @@ -103,11 +107,12 @@ CONFIG_SOC_GPIO_FLEX_GLITCH_FILTER_NUM=8 CONFIG_SOC_GPIO_SUPPORT_ETM=y CONFIG_SOC_GPIO_ETM_EVENTS_PER_GROUP=8 CONFIG_SOC_GPIO_ETM_TASKS_PER_GROUP=8 -CONFIG_SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP=y -CONFIG_SOC_GPIO_DEEP_SLEEP_WAKE_VALID_GPIO_MASK=0 +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x000000000FFF807F CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y CONFIG_SOC_GPIO_SUPPORT_HOLD_SINGLE_IO_IN_DSLP=y +CONFIG_SOC_RTCIO_PIN_COUNT=8 +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y @@ -179,7 +184,6 @@ CONFIG_SOC_PARLIO_TX_UNIT_MAX_DATA_WIDTH=8 CONFIG_SOC_PARLIO_RX_UNIT_MAX_DATA_WIDTH=8 CONFIG_SOC_PARLIO_TX_CLK_SUPPORT_GATING=y CONFIG_SOC_PARLIO_TRANS_BIT_ALIGN=y -CONFIG_SOC_RTCIO_PIN_COUNT=0 CONFIG_SOC_RSA_MAX_BIT_LEN=3072 CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 CONFIG_SOC_SHA_SUPPORT_DMA=y @@ -234,6 +238,7 @@ CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y CONFIG_SOC_TIMER_GROUP_SUPPORT_RC_FAST=y CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=2 CONFIG_SOC_TIMER_SUPPORT_ETM=y +CONFIG_SOC_MWDT_SUPPORT_XTAL=y CONFIG_SOC_TWAI_CONTROLLER_NUM=y CONFIG_SOC_TWAI_CLK_SUPPORT_XTAL=y CONFIG_SOC_TWAI_BRP_MIN=2 @@ -245,6 +250,7 @@ CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y CONFIG_SOC_EFUSE_DIS_ICACHE=y CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_EFUSE_ECDSA_USE_HARDWARE_K=y CONFIG_SOC_SECURE_BOOT_V2_RSA=y CONFIG_SOC_SECURE_BOOT_V2_ECC=y CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 @@ -265,6 +271,7 @@ CONFIG_SOC_COEX_HW_PTI=y CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y CONFIG_SOC_PM_SUPPORT_CPU_PD=y CONFIG_SOC_PM_SUPPORT_MODEM_PD=y CONFIG_SOC_PM_SUPPORT_XTAL32K_PD=y @@ -277,7 +284,6 @@ CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y CONFIG_SOC_PM_RETENTION_HAS_REGDMA_POWER_BUG=y -CONFIG_SOC_PM_RETENTION_HAS_CLOCK_BUG=y CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y CONFIG_SOC_CLK_OSC_SLOW_SUPPORTED=y @@ -406,14 +412,14 @@ CONFIG_ESPTOOLPY_FLASHFREQ_64M=y # CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set CONFIG_ESPTOOLPY_FLASHFREQ="48m" # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y -# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y # CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE="2MB" +CONFIG_ESPTOOLPY_FLASHSIZE="4MB" # CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set CONFIG_ESPTOOLPY_BEFORE_RESET=y # CONFIG_ESPTOOLPY_BEFORE_NORESET is not set @@ -554,6 +560,7 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # # GPTimer Configuration # +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y # CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set # CONFIG_GPTIMER_ISR_IRAM_SAFE is not set # CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set @@ -573,6 +580,7 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y # RMT Configuration # # CONFIG_RMT_ISR_IRAM_SAFE is not set +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set # CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set # CONFIG_RMT_ENABLE_DEBUG_LOG is not set # end of RMT Configuration @@ -742,6 +750,8 @@ CONFIG_ESP32H2_UNIVERSAL_MAC_ADDRESSES=2 CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y # CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# CONFIG_ESP_SLEEP_EVENT_CALLBACKS is not set # end of Sleep Config # @@ -849,7 +859,8 @@ CONFIG_PM_ENABLE=y # CONFIG_PM_RTOS_IDLE_OPT is not set CONFIG_PM_SLP_DISABLE_GPIO=y CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y -CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP=y +# CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP is not set +# CONFIG_PM_LIGHT_SLEEP_CALLBACKS is not set # end of Power Management # @@ -874,7 +885,7 @@ CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set # CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set # CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set -CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=1 CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE=y # CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set @@ -917,13 +928,13 @@ CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y # Brownout Detector # CONFIG_ESP_BROWNOUT_DET=y -CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set # CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set -CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2=y +CONFIG_ESP_BROWNOUT_DET_LVL=2 # end of Brownout Detector CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y @@ -961,6 +972,10 @@ CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32 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_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y CONFIG_ESP_WIFI_TX_BA_WIN=6 CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y @@ -969,6 +984,7 @@ CONFIG_ESP_WIFI_NVS_ENABLED=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_EXTRA_IRAM_OPT is not set CONFIG_ESP_WIFI_RX_IRAM_OPT=y CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y CONFIG_ESP_WIFI_ENABLE_SAE_PK=y @@ -982,7 +998,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y -# CONFIG_ESP_WIFI_SUITE_B_192 is not set # CONFIG_ESP_WIFI_11KV_SUPPORT is not set # CONFIG_ESP_WIFI_MBO_SUPPORT is not set # CONFIG_ESP_WIFI_DPP_SUPPORT is not set @@ -998,6 +1013,7 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y # CONFIG_ESP_WIFI_DEBUG_PRINT is not set # CONFIG_ESP_WIFI_TESTING_OPTIONS is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y # end of Wi-Fi # @@ -1093,7 +1109,7 @@ 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_SNAPSHOT_FUNS_INTO_FLASH is not set +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y # end of Port @@ -1145,7 +1161,6 @@ CONFIG_IEEE802154_CCA_THRESHOLD=-60 CONFIG_IEEE802154_PENDING_TABLE_SIZE=20 # CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set # CONFIG_IEEE802154_TIMING_OPTIMIZATION is not set -CONFIG_IEEE802154_SLEEP_ENABLE=y # CONFIG_IEEE802154_DEBUG is not set # end of IEEE 802.15.4 @@ -1173,12 +1188,15 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LWIP_LOCAL_HOSTNAME="espressif" # CONFIG_LWIP_NETIF_API is not set +CONFIG_LWIP_TCPIP_TASK_PRIO=18 # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set # CONFIG_LWIP_CHECK_THREAD_SAFETY is not set CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set # CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y CONFIG_LWIP_MAX_SOCKETS=10 # CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set # CONFIG_LWIP_SO_LINGER is not set @@ -1240,6 +1258,8 @@ CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744 CONFIG_LWIP_TCP_WND_DEFAULT=5744 CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 # CONFIG_LWIP_TCP_SACK_OUT is not set CONFIG_LWIP_TCP_OVERSIZE_MSS=y # CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set @@ -1450,11 +1470,11 @@ CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y # CONFIG_MBEDTLS_POLY1305_C is not set # CONFIG_MBEDTLS_CHACHA20_C is not set # CONFIG_MBEDTLS_HKDF_C is not set # CONFIG_MBEDTLS_THREADING_C is not set -# CONFIG_MBEDTLS_SECURITY_RISKS is not set # end of mbedTLS # @@ -1500,11 +1520,14 @@ CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y # CONFIG_OPENTHREAD_ENABLED=y CONFIG_OPENTHREAD_LOG_LEVEL_DYNAMIC=y +CONFIG_OPENTHREAD_CONSOLE_TYPE_UART=y +# CONFIG_OPENTHREAD_CONSOLE_TYPE_USB_SERIAL_JTAG is not set # # Thread Operational Dataset # CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP" +CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64" CONFIG_OPENTHREAD_NETWORK_CHANNEL=15 CONFIG_OPENTHREAD_NETWORK_PANID=0x1234 CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe" @@ -1523,16 +1546,22 @@ CONFIG_OPENTHREAD_DIAG=y # CONFIG_OPENTHREAD_COMMISSIONER is not set # CONFIG_OPENTHREAD_JOINER is not set CONFIG_OPENTHREAD_SRP_CLIENT=y +CONFIG_OPENTHREAD_SRP_CLIENT_MAX_SERVICES=5 CONFIG_OPENTHREAD_DNS_CLIENT=y # CONFIG_OPENTHREAD_BORDER_ROUTER is not set CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS=65 +CONFIG_OPENTHREAD_SPINEL_RX_FRAME_BUFFER_SIZE=1024 +CONFIG_OPENTHREAD_MLE_MAX_CHILDREN=10 +CONFIG_OPENTHREAD_TMF_ADDR_CACHE_ENTRIES=20 CONFIG_OPENTHREAD_DNS64_CLIENT=y CONFIG_OPENTHREAD_DNS_SERVER_ADDR="10.246.246.246" CONFIG_OPENTHREAD_UART_BUFFER_SIZE=256 # CONFIG_OPENTHREAD_LINK_METRICS is not set # CONFIG_OPENTHREAD_MACFILTER_ENABLE is not set # CONFIG_OPENTHREAD_CSL_ENABLE is not set +CONFIG_OPENTHREAD_XTAL_ACCURACY=130 # CONFIG_OPENTHREAD_DUA_ENABLE is not set +# CONFIG_OPENTHREAD_TIME_SYNC is not set # end of OpenThread # @@ -1556,9 +1585,9 @@ CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" # # MMU Config # -CONFIG_MMU_PAGE_SIZE_32KB=y -CONFIG_MMU_PAGE_MODE="32KB" -CONFIG_MMU_PAGE_SIZE=0x8000 +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 # end of MMU Config # @@ -1707,15 +1736,22 @@ CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y # AQI Program Configuration # CONFIG_TEMP_ENABLED=y +CONFIG_TEMP_PIN=2 +CONFIG_EEPY_DEVICE=y # CONFIG_LIGHT_SLEEP_ENABLED is not set +# CONFIG_UART_ENABLED is not set # CONFIG_ZIG_ENABLED is not set # CONFIG_WIFI_ENABLED is not set CONFIG_OT_ENABLED=y -CONFIG_LED_ENABLED=y +# CONFIG_LED_ENABLED is not set +CONFIG_MOTION_FIRST_ENABLED=y +CONFIG_MOTION_FIRST_PIN=13 +CONFIG_MOTION_SECOND_ENABLED=y +CONFIG_MOTION_SECOND_PIN=22 # CONFIG_INDICATOR_ENABLED is not set CONFIG_BROKER_URL="mqtts://esp32:sensorauth@rabbitmq" -CONFIG_LOCATION="Indoor AQI Monitor" -CONFIG_GPIO_ERASE_PIN=25 +CONFIG_LOCATION="Downstairs" +CONFIG_GPIO_ERASE_PIN=5 # end of AQI Program Configuration # @@ -1749,6 +1785,7 @@ CONFIG_DEFAULT_AP_BEACON_INTERVAL=100 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 @@ -1840,13 +1877,13 @@ CONFIG_TASK_WDT_TIMEOUT_S=5 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y # CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set CONFIG_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set # CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set # CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set # CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set # CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set -CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_BROWNOUT_DET_LVL_SEL_2=y +CONFIG_BROWNOUT_DET_LVL=2 CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=3584 CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 @@ -1870,7 +1907,6 @@ CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y CONFIG_WPA_MBEDTLS_CRYPTO=y CONFIG_WPA_MBEDTLS_TLS_CLIENT=y -# CONFIG_WPA_SUITE_B_192 is not set # CONFIG_WPA_11KV_SUPPORT is not set # CONFIG_WPA_MBO_SUPPORT is not set # CONFIG_WPA_DPP_SUPPORT is not set -- 2.30.2