AQI features and changes
authorjweigele <jweigele@local>
Sun, 14 Jan 2024 21:07:41 +0000 (13:07 -0800)
committerjweigele <jweigele@local>
Sun, 14 Jan 2024 21:07:41 +0000 (13:07 -0800)
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
aqi/main/Kconfig
aqi/main/aqi.c
aqi/main/aqi.h
aqi/sdkconfig

index cf48a8eeaba3ba818a2df377d9ed042124413cde..1276ca3e681f74920f112edcd0f1b3e7b39f2ed9 100644 (file)
@@ -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
index 4047a949582e215d26dc08eeb5750be42b5f862c..8735b393294bf7c16a7eb8ed81093201c013f0b9 100644 (file)
@@ -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
index e8c3fc190821ec170c9a001f29ea78debc3f9d67..076ba5643d0352058b85bd9213715c1a2d96d5b2 100644 (file)
 #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);    
 }
index 33b21028f1b4b30c7a18902a06022d8b6f744989..5b7bfdc8393eaf191a7fdd67a575935d6949d5f4 100644 (file)
@@ -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
index d4ffda52290452e0e28e0dfae855ae31e974aaff..3ceb4e3f2254af57ed67b6c87003121e74d48fa2 100644 (file)
@@ -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