From 554268488f5f0fcba5d8642a7c0661b571feb72d Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Fri, 19 Jul 2024 12:52:57 +0300 Subject: [PATCH] Added changing sensor measurement time --- README.md | 3 ++- components/zh_config | 2 +- main/Kconfig.projbuild | 8 ++++++++ main/zh_espnow_switch.c | 36 ++++++++++++++++++++++++------------ main/zh_espnow_switch.h | 22 +++++++++++----------- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 30bca2e..d790630 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ ESP-NOW based switch for ESP32 ESP-IDF and ESP8266 RTOS SDK. Alternate firmware 3. For initial settings use "menuconfig -> ZH ESP-NOW Switch Configuration". After first boot all settings will be stored in NVS memory for prevente change during OTA firmware update. 4. To restart the switch, send the "restart" command to the root topic of the switch (example - "homeassistant/espnow_switch/24-62-AB-F9-1F-A8"). 5. To update the switch firmware, send the "update" command to the root topic of the switch (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7"). The update path should be like as "https://your_server/zh_espnow_switch_esp32.bin" (for ESP32) or "https://your_server/zh_espnow_switch_esp8266.app1.bin + https://your_server/zh_espnow_switch_esp8266.app2.bin" (for ESP8266). Average update time is up to some minutes. The online status of the update will be displayed in the root switch topic. -6. To change initial settings of the switch (except work mode), send the X1,X2,X3,X4,X5,X6,X7,X8,X9,X10 command to the hardware topic of the switch (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7/hardware"). The configuration will only be accepted if it does not cause errors. The current configuration status is displayed in the configuration topic of the switch (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7/config"). +6. To change initial settings of the switch (except work mode), send the X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11 command to the hardware topic of the switch (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7/hardware"). The configuration will only be accepted if it does not cause errors. The current configuration status is displayed in the configuration topic of the switch (example - "homeassistant/espnow_switch/70-03-9F-44-BE-F7/config"). MQTT configuration message should filled according to the template "X1,X2,X3,X4,X5,X6,X7,X8,X9,X10". Where: @@ -36,6 +36,7 @@ MQTT configuration message should filled according to the template "X1,X2,X3,X4, 8. X8 - External button trigger level. 1 for high, 0 for low. Only affected when X7 is used. 9. X9 - Sensor GPIO number. 0 - 48 (according to the module used). 255 if not used. 10. X10 - Sensor type. 1 for DS18B20, 8 for DHT. Only affected when X9 is used. +11. X11 - Sensor measurement frequency. 1 - 65536 seconds. Only affected when X9 is used. ## Build and flash diff --git a/components/zh_config b/components/zh_config index db717bf..72db32c 160000 --- a/components/zh_config +++ b/components/zh_config @@ -1 +1 @@ -Subproject commit db717bf6eec149759082c00ecf2fca81faf94adf +Subproject commit 72db32cc7f79f302ae6f3bbde6e77c64d99662f1 diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 4499703..83d721d 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -155,4 +155,12 @@ menu "ZH ESP-NOW Switch Configuration" bool "DHT" endchoice + config MEASUREMENT_FREQUENCY + depends on SENSOR_USING + int "Sensor measurement frequency" + range 1 65536 + default 300 + help + Sensor measurement frequency. + endmenu \ No newline at end of file diff --git a/main/zh_espnow_switch.c b/main/zh_espnow_switch.c index c584005..2e2784a 100644 --- a/main/zh_espnow_switch.c +++ b/main/zh_espnow_switch.c @@ -52,6 +52,7 @@ void zh_load_config(switch_config_t *switch_config) { nvs_set_u8(nvs_handle, "present", 0xFE); nvs_close(nvs_handle); + SETUP_INITIAL_SETTINGS: #ifdef CONFIG_RELAY_USING switch_config->hardware_config.relay_pin = CONFIG_RELAY_PIN; #else @@ -95,27 +96,36 @@ void zh_load_config(switch_config_t *switch_config) #ifdef CONFIG_SENSOR_TYPE_DS18B20 switch_config->hardware_config.sensor_pin = CONFIG_SENSOR_PIN; switch_config->hardware_config.sensor_type = HAST_DS18B20; + switch_config->hardware_config.measurement_frequency = CONFIG_MEASUREMENT_FREQUENCY; #elif CONFIG_SENSOR_TYPE_DHT switch_config->hardware_config.sensor_pin = CONFIG_SENSOR_PIN; switch_config->hardware_config.sensor_type = HAST_DHT; + switch_config->hardware_config.measurement_frequency = CONFIG_MEASUREMENT_FREQUENCY; #else switch_config->hardware_config.sensor_pin = ZH_NOT_USED; switch_config->hardware_config.sensor_type = HAST_NONE; + switch_config->hardware_config.measurement_frequency = ZH_NOT_USED; #endif zh_save_config(switch_config); return; } - nvs_get_u8(nvs_handle, "relay_pin", &switch_config->hardware_config.relay_pin); - nvs_get_u8(nvs_handle, "relay_lvl", (uint8_t *)&switch_config->hardware_config.relay_on_level); - nvs_get_u8(nvs_handle, "led_pin", &switch_config->hardware_config.led_pin); - nvs_get_u8(nvs_handle, "led_lvl", (uint8_t *)&switch_config->hardware_config.led_on_level); - nvs_get_u8(nvs_handle, "int_btn_pin", &switch_config->hardware_config.int_button_pin); - nvs_get_u8(nvs_handle, "int_btn_lvl", (uint8_t *)&switch_config->hardware_config.int_button_on_level); - nvs_get_u8(nvs_handle, "ext_btn_pin", &switch_config->hardware_config.ext_button_pin); - nvs_get_u8(nvs_handle, "ext_btn_lvl", (uint8_t *)&switch_config->hardware_config.ext_button_on_level); - nvs_get_u8(nvs_handle, "sensor_pin", &switch_config->hardware_config.sensor_pin); - nvs_get_u8(nvs_handle, "sensor_type", (uint8_t *)&switch_config->hardware_config.sensor_type); + esp_err_t err = ESP_OK; + err += nvs_get_u8(nvs_handle, "relay_pin", &switch_config->hardware_config.relay_pin); + err += nvs_get_u8(nvs_handle, "relay_lvl", (uint8_t *)&switch_config->hardware_config.relay_on_level); + err += nvs_get_u8(nvs_handle, "led_pin", &switch_config->hardware_config.led_pin); + err += nvs_get_u8(nvs_handle, "led_lvl", (uint8_t *)&switch_config->hardware_config.led_on_level); + err += nvs_get_u8(nvs_handle, "int_btn_pin", &switch_config->hardware_config.int_button_pin); + err += nvs_get_u8(nvs_handle, "int_btn_lvl", (uint8_t *)&switch_config->hardware_config.int_button_on_level); + err += nvs_get_u8(nvs_handle, "ext_btn_pin", &switch_config->hardware_config.ext_button_pin); + err += nvs_get_u8(nvs_handle, "ext_btn_lvl", (uint8_t *)&switch_config->hardware_config.ext_button_on_level); + err += nvs_get_u8(nvs_handle, "sensor_pin", &switch_config->hardware_config.sensor_pin); + err += nvs_get_u8(nvs_handle, "sensor_type", (uint8_t *)&switch_config->hardware_config.sensor_type); + err += nvs_get_u16(nvs_handle, "frequency", &switch_config->hardware_config.measurement_frequency); nvs_close(nvs_handle); + if (err != ESP_OK) + { + goto SETUP_INITIAL_SETTINGS; + } } void zh_save_config(const switch_config_t *switch_config) @@ -132,6 +142,7 @@ void zh_save_config(const switch_config_t *switch_config) nvs_set_u8(nvs_handle, "ext_btn_lvl", switch_config->hardware_config.ext_button_on_level); nvs_set_u8(nvs_handle, "sensor_pin", switch_config->hardware_config.sensor_pin); nvs_set_u8(nvs_handle, "sensor_type", switch_config->hardware_config.sensor_type); + nvs_set_u16(nvs_handle, "frequency", switch_config->hardware_config.measurement_frequency); nvs_close(nvs_handle); } @@ -400,7 +411,7 @@ void zh_send_sensor_config_message(const switch_config_t *switch_config) data.device_type = ZHDT_SENSOR; data.payload_type = ZHPT_CONFIG; data.payload_data.config_message.sensor_config_message.suggested_display_precision = 1; - data.payload_data.config_message.sensor_config_message.expire_after = ZH_SENSOR_STATUS_MESSAGE_FREQUENCY * 1.25; // + 25% just in case. + data.payload_data.config_message.sensor_config_message.expire_after = switch_config->hardware_config.measurement_frequency * 1.5; // + 50% just in case. data.payload_data.config_message.sensor_config_message.enabled_by_default = true; data.payload_data.config_message.sensor_config_message.force_update = true; data.payload_data.config_message.sensor_config_message.qos = 2; @@ -512,7 +523,7 @@ void zh_send_sensor_status_message_task(void *pvParameter) zh_send_message(switch_config->gateway_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); heap_caps_free(message); } - vTaskDelay(ZH_SENSOR_STATUS_MESSAGE_FREQUENCY * 1000 / portTICK_PERIOD_MS); + vTaskDelay(switch_config->hardware_config.measurement_frequency * 1000 / portTICK_PERIOD_MS); } vTaskDelete(NULL); } @@ -618,6 +629,7 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve switch_config->hardware_config.ext_button_on_level = data->payload_data.config_message.switch_hardware_config_message.ext_button_on_level; switch_config->hardware_config.sensor_pin = data->payload_data.config_message.switch_hardware_config_message.sensor_pin; switch_config->hardware_config.sensor_type = data->payload_data.config_message.switch_hardware_config_message.sensor_type; + switch_config->hardware_config.measurement_frequency = data->payload_data.config_message.switch_hardware_config_message.measurement_frequency; zh_save_config(switch_config); switch_config->gateway_is_available = false; if (switch_config->hardware_config.relay_pin != ZH_NOT_USED) diff --git a/main/zh_espnow_switch.h b/main/zh_espnow_switch.h index edced46..8a81e0a 100644 --- a/main/zh_espnow_switch.h +++ b/main/zh_espnow_switch.h @@ -48,7 +48,6 @@ #define ZH_SWITCH_KEEP_ALIVE_MESSAGE_FREQUENCY 10 // Frequency of sending a switch keep alive message to the gateway (in seconds). #define ZH_SWITCH_ATTRIBUTES_MESSAGE_FREQUENCY 60 // Frequency of sending a switch attributes message to the gateway (in seconds). -#define ZH_SENSOR_STATUS_MESSAGE_FREQUENCY 60 // Frequency of sending a sensor status message to the gateway (in seconds). #define ZH_SENSOR_ATTRIBUTES_MESSAGE_FREQUENCY 60 // Frequency of sending a sensor attributes message to the gateway (in seconds). #define ZH_GPIO_TASK_PRIORITY 3 // Prioritize the task of GPIO processing. @@ -60,16 +59,17 @@ typedef struct // Structure of data exchange between tasks, functions and event { struct // Storage structure of switch hardware configuration data. { - uint8_t relay_pin; // Relay GPIO number. - bool relay_on_level; // Relay ON level. @note HIGH (true) / LOW (false). - uint8_t led_pin; // Led GPIO number (if present). - bool led_on_level; // Led ON level (if present). @note HIGH (true) / LOW (false). - uint8_t int_button_pin; // Internal button GPIO number (if present). - bool int_button_on_level; // Internal button trigger level (if present). @note HIGH (true) / LOW (false). - uint8_t ext_button_pin; // External button GPIO number (if present). - bool ext_button_on_level; // External button trigger level (if present). @note HIGH (true) / LOW (false). - uint8_t sensor_pin; // Sensor GPIO number (if present). - ha_sensor_type_t sensor_type; // Sensor types (if present). @note Used to identify the sensor type by ESP-NOW gateway and send the appropriate sensor status messages to MQTT. + uint8_t relay_pin; // Relay GPIO number. + bool relay_on_level; // Relay ON level. @note HIGH (true) / LOW (false). + uint8_t led_pin; // Led GPIO number (if present). + bool led_on_level; // Led ON level (if present). @note HIGH (true) / LOW (false). + uint8_t int_button_pin; // Internal button GPIO number (if present). + bool int_button_on_level; // Internal button trigger level (if present). @note HIGH (true) / LOW (false). + uint8_t ext_button_pin; // External button GPIO number (if present). + bool ext_button_on_level; // External button trigger level (if present). @note HIGH (true) / LOW (false). + uint8_t sensor_pin; // Sensor GPIO number (if present). + ha_sensor_type_t sensor_type; // Sensor types (if present). @note Used to identify the sensor type by ESP-NOW gateway and send the appropriate sensor status messages to MQTT. + uint16_t measurement_frequency; // Sensor measurement frequency (if present). } hardware_config; struct // Storage structure of switch status data. {