dependencies:
espressif/esp-zboss-lib:
- component_hash: ba11f1139481e9d0aaa08e9d621eb04113052fad28c8316744a5cb503d79fe6a
+ component_hash: 8c214bc75cae20c6583f98971d249e2f05a56c82539b0399b5dbb59cb3c38326
source:
service_url: https://api.components.espressif.com/
type: service
- version: 0.5.1
+ version: 0.5.4
espressif/esp-zigbee-lib:
- component_hash: 5031e107e2da6a65d30770a0b1a130860fe353021549e65e3a788ea8a53933ff
+ component_hash: 4a84a2f19ad6077278d6b20d809158b9939afcc540702e57d53084fe26adc69e
source:
service_url: https://api.components.espressif.com/
type: service
- version: 0.7.1
+ version: 0.7.4
espressif/led_strip:
component_hash: 7e92a0c8a2e35b40904f88e88ce3c0dffff504a2763f70fba7ef4787cf2eec83
source:
component_hash: null
source:
type: idf
- version: 5.1.0
+ version: 5.1.1
manifest_hash: a38aaee041b50633069a2b3b73fab6a06e0ac769824d1e24f51de3d63b42b66b
target: esp32c6
version: 1.0.0
default y
help
This gets passed and used for includes later
+config LIGHT_SLEEP_ENABLED
+ bool "Actually go into light sleep between polls?"
+ default n
+ help
+ Not very well tested yet
config ZIG_ENABLED
bool "Are we using zigbee pairing and reporting"
#include "freertos/task.h"
#include "ha/esp_zigbee_ha_standard.h"
#include "aqi.h"
+#include "math.h"
typedef struct aqi_data_s {
float pm10;
#endif
static bool way_too_funky = false;
-
+static bool init_connected = false;
#ifdef CONFIG_ZIG_ENABLED
static bool zig_connected = false;
#endif
ESP_LOGW(TAG, "invalid first entry, returning invalid data");
return retval;
}
- ESP_LOGI(TAG, "first entry found at %p (offset %d)", (uint8_t*)first_entry, offset);
+ ESP_LOGI(TAG, "first entry found at %p (offset %d) data size %d", (uint8_t*)first_entry, offset, data_size);
uint8_t* cur_entry = first_entry;
int pm10, pm25;
- while (cur_entry + 32 < data + data_size){
+ while (cur_entry + 32 <= data + data_size){
//printf("doing one iteration\n");
- //ESP_LOG_BUFFER_HEXDUMP(TAG, cur_entry, 32, ESP_LOG_INFO);
+ ESP_LOG_BUFFER_HEXDUMP(TAG, cur_entry, 32, ESP_LOG_INFO);
if (verify_checksum(cur_entry)){
pm25 = (data[12] << 8) + (data[13]);
pm10 = (data[10] << 8) + (data[11]);
}
cur_entry += 32;
}
+ ESP_LOGI(TAG, "pm10_total %d pm25_total %d count %d", pm10_total, pm25_total, count);
if (count != 0){
retval.pm10 = ((float)pm10_total)/count;
retval.pm25 = ((float)pm25_total)/count;
uint16_t set_pm10;
uint16_t set_pm25;
+ int64_t cur_uptime = 0;
+ int64_t next_sleep_uptime = 0;
+ int64_t remaining_time = 0;
uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE+1);
int length = 0;
#ifdef CONFIG_WIFI_ENABLED
ESP_LOGI(TAG, "free heap: %"PRIu32, esp_get_free_heap_size());
+ 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
- device_uptime_seconds = (uint32_t)(esp_timer_get_time()/1000000);
+ device_uptime_seconds = (uint32_t)(cur_uptime/1000000);
// 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, 100);
+ const int rxBytes = uart_read_bytes(UART_NUM_1, data, length, 1000);
if (rxBytes > 0) {
data[rxBytes] = 0;
//ESP_LOGI(TAG, "Read %d bytes: '%s'", rxBytes, data);
ESP_LOGI(TAG, "average from last 10 seconds pm10: %f", cur_avg.pm10);
ESP_LOGI(TAG, "average from last 10 seconds pm25: %f", cur_avg.pm25);
- ESP_LOGI(TAG, "setting attrib value and sending, I guess");
- cur_pm = new_pm_average(cur_avg);
+ if (cur_avg.pm10 < MAX_PM10 && cur_avg.pm25 < MAX_PM25 ){
+ ESP_LOGI(TAG, "setting attrib value and sending, I guess");
+ cur_pm = new_pm_average(cur_avg);
+ } else {
+ ESP_LOGW(TAG, "pm average outside of threshold, ignoring");
+ }
#ifdef CONFIG_ZIG_ENABLED
if (zig_connected){
send_report_wifi(cur_pm.pm10, cur_pm.pm25, cur_aqi_pm25, temp_avg);
#endif
+ cur_uptime = esp_timer_get_time();
+ remaining_time = next_sleep_uptime - cur_uptime;
+ ESP_LOGI(TAG, "next sleep uptime %lld cur_uptime %lld remaining time %lld", next_sleep_uptime, cur_uptime, remaining_time);
+#ifdef CONFIG_LIGHT_SLEEP_ENABLED
+ // needs to be in microseconds, so convert
+ int sleep_us = 100000;
+ // grab at least _some_ uart
+ vTaskDelay( pdMS_TO_TICKS(1000) );
+ while ( remaining_time > sleep_us ){
+ // still have sleep_us to go or more
+ if ( remaining_time > sleep_us ){
+ vTaskDelay( pdMS_TO_TICKS(sleep_us/1000) );
+ remaining_time -= sleep_us;
+ }
+ if (remaining_time > 0 && init_connected){
+ // 1 second max
+ ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(MIN(10000000, remaining_time)));
+ ESP_ERROR_CHECK(esp_sleep_enable_uart_wakeup(1));
+ ESP_ERROR_CHECK(esp_light_sleep_start());
+ }
+
+ cur_uptime = esp_timer_get_time();
+ remaining_time = next_sleep_uptime - cur_uptime;
+
+ }
+ // we woke up, but for what reason?
+ esp_sleep_wakeup_cause_t wakeup_cause = esp_sleep_get_wakeup_cause();
+ if (wakeup_cause == ESP_SLEEP_WAKEUP_TIMER ){
+ ESP_LOGI(TAG, "woke up from timer at the end of our sleep, all is well");
+ } else if (wakeup_cause == ESP_SLEEP_WAKEUP_UART ){
+ ESP_LOGI(TAG, "filled up UART, need to do something (but instead am just gonna regular task delay lol)");
+ vTaskDelay(pdMS_TO_TICKS((next_sleep_uptime - esp_timer_get_time())/1000));
+ } else {
+ ESP_LOGW(TAG, "woke up for some other reason?? here it is %d", wakeup_cause);
+ }
+#else
// sleep for 10 seconds before measuring again
- vTaskDelay( pdMS_TO_TICKS(10000) );
+ ESP_LOGI(TAG, "sleeping for %lld ms", remaining_time/1000);
+ vTaskDelay( pdMS_TO_TICKS(remaining_time/1000) );
+#endif
}
// only called if we break out of the loop somehow (right now, never)
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");
/* 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;
//ip_event_got_ip_t* param = (ip_event_got_ip_t*)pvParameter;
ESP_LOGW(TAG, "wifi connection got dropped! just gonna set stuff down and hope for the best");
wifi_connected = false;
+ init_connected = false;
mqtt_connected = false;
}
// wifi connection ok callback
void wifi_connection_ok(void* pvParameter){
wifi_connected = true;
+ init_connected = true;
ip_event_got_ip_t* param = (ip_event_got_ip_t*)pvParameter;
/* transform IP to human readable string */
#endif
void app_main(void)
{
+
+
+/*#ifdef CONFIG_LIGHT_SLEEP_ENABLED
+ ESP_ERROR_CHECK(esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON));
+#endif*/
+
ESP_ERROR_CHECK(nvs_flash_init());
#ifdef CONFIG_WIFI_ENABLED
event_queue = xQueueCreate(5, sizeof(esp_mqtt_client_handle_t));
void init_mqtt();
#endif
+
+#ifdef CONFIG_LIGHT_SLEEP_ENABLED
+#include <esp_sleep.h>
+#include "esp_pm.h"
+#endif
+
#include "esp_system.h"
//#include "light_driver.h"
#define AQI_INDICATOR_BRIGHTNESS 0.01
#ifdef CONFIG_TEMP_ENABLED
-#define TEMP_GPIO 0
+#define TEMP_GPIO 22
#include "onewire.h"
#define MIN_TEMP_VALUE -5500
#define MAX_TEMP_VALUE 12500
#endif
+#define MAX_PM10 500
+#define MAX_PM25 1000
#ifdef CONFIG_LED_ENABLED
//#include "tm1637_hw.h"
#define UART_RX_GPIO (GPIO_NUM_5)
#define UART_TX_GPIO (GPIO_NUM_14)
+// ten second loop
+#define SLEEP_MS 10000
+
// zigbee cluster reporting stuff
}, \
}
-#elif CONFIG_ZB_ED
+#elif CONFIG_ZB_ZED
#define ZB_TYPE ESP_ZB_DEVICE_TYPE_ED
#define ESP_ZB_ZED_CONFIG() \
{ \
#
# Automatically generated file. DO NOT EDIT.
-# Espressif IoT Development Framework (ESP-IDF) Project Configuration
+# Espressif IoT Development Framework (ESP-IDF) 5.1.1 Project Configuration
#
CONFIG_SOC_ADC_SUPPORTED=y
CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y
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
CONFIG_SOC_DEDIC_PERIPH_ALWAYS_ENABLE=y
CONFIG_SOC_I2C_NUM=1
CONFIG_SOC_I2C_FIFO_LEN=32
+CONFIG_SOC_I2C_CMD_REG_NUM=8
CONFIG_SOC_I2C_SUPPORT_SLAVE=y
CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y
CONFIG_SOC_I2C_SUPPORT_XTAL=y
CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32
CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y
CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y
+CONFIG_SOC_CRYPTO_DPA_PROTECTION_SUPPORTED=y
CONFIG_SOC_UART_NUM=2
CONFIG_SOC_UART_FIFO_LEN=128
CONFIG_SOC_UART_BITRATE_MAX=5000000
CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y
CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y
CONFIG_SOC_COEX_HW_PTI=y
+CONFIG_SOC_EXTERNAL_COEX_ADVANCE=y
CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21
CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12
CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y
CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y
CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y
CONFIG_SOC_PM_SUPPORT_TOP_PD=y
+CONFIG_SOC_PM_SUPPORT_HP_AON_PD=y
CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y
CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y
CONFIG_SOC_PM_SUPPORT_PMU_MODEM_STATE=y
CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y
CONFIG_SOC_PM_CPU_RETENTION_BY_SW=y
CONFIG_SOC_PM_MODEM_RETENTION_BY_REGDMA=y
+CONFIG_SOC_PM_RETENTION_HAS_CLOCK_BUG=y
CONFIG_SOC_PM_PAU_LINK_NUM=4
CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y
CONFIG_SOC_MODEM_CLOCK_IS_INDEPENDENT=y
CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL=y
CONFIG_SOC_TEMPERATURE_SENSOR_INTR_SUPPORT=y
CONFIG_SOC_WIFI_HW_TSF=y
-CONFIG_SOC_WIFI_FTM_SUPPORT=y
CONFIG_SOC_WIFI_GCMP_SUPPORT=y
CONFIG_SOC_WIFI_WAPI_SUPPORT=y
CONFIG_SOC_WIFI_CSI_SUPPORT=y
CONFIG_SOC_BLE_50_SUPPORTED=y
CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y
CONFIG_SOC_BLE_POWER_CONTROL_SUPPORTED=y
+CONFIG_SOC_BLUFI_SUPPORTED=y
+CONFIG_SOC_BLE_MULTI_CONN_OPTIMIZATION=y
+CONFIG_SOC_BLE_USE_WIFI_PWR_CLK_WORKAROUND=y
CONFIG_IDF_CMAKE=y
CONFIG_IDF_TARGET_ARCH_RISCV=y
CONFIG_IDF_TARGET_ARCH="riscv"
# Sleep Config
#
# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set
-CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y
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
# end of Sleep Config
#
CONFIG_XTAL_FREQ_40=y
CONFIG_XTAL_FREQ=40
# end of Main XTAL Config
+
+#
+# Crypto DPA Protection
+#
+CONFIG_ESP_CRYPTO_DPA_PROTECTION_AT_STARTUP=y
+CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_LOW=y
+# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_MEDIUM is not set
+# CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL_HIGH is not set
+CONFIG_ESP_CRYPTO_DPA_PROTECTION_LEVEL=1
+# end of Crypto DPA Protection
# end of Hardware Settings
#
CONFIG_ESP_NETIF_TCPIP_LWIP=y
# CONFIG_ESP_NETIF_LOOPBACK is not set
CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y
+# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set
# CONFIG_ESP_NETIF_L2_TAP is not set
# CONFIG_ESP_NETIF_BRIDGE_EN is not set
# end of ESP NETIF Adapter
CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y
CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y
# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
-# CONFIG_ESP_WIFI_FTM_ENABLE is not set
CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y
# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set
# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set
CONFIG_IEEE802154_PENDING_TABLE_SIZE=20
# CONFIG_IEEE802154_MULTI_PAN_ENABLE is not set
# CONFIG_IEEE802154_TIMING_OPTIMIZATION is not set
+# CONFIG_IEEE802154_DEBUG is not set
# end of IEEE 802.15.4
#
CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y
# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set
# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y
+# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set
CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y
# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set
# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set
# OpenThread
#
# CONFIG_OPENTHREAD_ENABLED is not set
+
+#
+# Thread Operational Dataset
+#
+CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP"
+CONFIG_OPENTHREAD_NETWORK_CHANNEL=15
+CONFIG_OPENTHREAD_NETWORK_PANID=0x1234
+CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe"
+CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff"
+CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53"
+# end of Thread Operational Dataset
# end of OpenThread
#
CONFIG_VFS_SUPPORT_SELECT=y
CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
CONFIG_VFS_SUPPORT_TERMIOS=y
+CONFIG_VFS_MAX_COUNT=8
#
# Host File System I/O (Semihosting)
# AQI Program Configuration
#
# CONFIG_TEMP_ENABLED is not set
+# CONFIG_LIGHT_SLEEP_ENABLED is not set
# CONFIG_ZIG_ENABLED is not set
CONFIG_WIFI_ENABLED=y
CONFIG_LED_ENABLED=y
CONFIG_INDICATOR_ENABLED=y
CONFIG_BROKER_URL="mqtts://esp32:sensorauth@rabbitmq.hexthepla.net"
-CONFIG_LOCATION="ESP32wifitest"
+CONFIG_LOCATION="West Seattle"
CONFIG_GPIO_ERASE_PIN=23
# end of AQI Program Configuration
CONFIG_WIFI_MANAGER_MAX_RETRY_START_AP=3
CONFIG_WIFI_MANAGER_SHUTDOWN_AP_TIMER=60000
CONFIG_WEBAPP_LOCATION="/"
-CONFIG_DEFAULT_AP_SSID="esp32"
-CONFIG_DEFAULT_AP_PASSWORD="esp32pwd"
+CONFIG_DEFAULT_AP_SSID="aqimonitor"
+CONFIG_DEFAULT_AP_PASSWORD="aqimonitorpwd"
CONFIG_DEFAULT_AP_CHANNEL=1
CONFIG_NVS_WIFI_PARTITION="wifi_storage"
CONFIG_DEFAULT_AP_IP="10.10.0.1"