Version 1.0.6
Added changing sensor measurement time. Added multiple attempts to read the sensor.
This commit is contained in:
parent
708bf211fa
commit
b5def82a15
@ -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
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit db717bf6eec149759082c00ecf2fca81faf94adf
|
||||
Subproject commit 73e8a70f4f17d10509d1a0cfe727230ec046aa79
|
@ -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
|
@ -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;
|
||||
@ -473,6 +484,8 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
data.device_type = ZHDT_SENSOR;
|
||||
for (;;)
|
||||
{
|
||||
uint8_t attempts = 0;
|
||||
READ_SENSOR:;
|
||||
esp_err_t err = ESP_OK;
|
||||
switch (switch_config->hardware_config.sensor_type)
|
||||
{
|
||||
@ -504,6 +517,11 @@ void zh_send_sensor_status_message_task(void *pvParameter)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (++attempts < ZH_SENSOR_READ_MAXIMUM_RETRY)
|
||||
{
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
goto READ_SENSOR;
|
||||
}
|
||||
data.payload_type = ZHPT_ERROR;
|
||||
char *message = (char *)heap_caps_malloc(150, MALLOC_CAP_8BIT);
|
||||
memset(message, 0, 150);
|
||||
@ -512,7 +530,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 +636,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)
|
||||
|
@ -48,8 +48,8 @@
|
||||
|
||||
#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_SENSOR_READ_MAXIMUM_RETRY 5 // Maximum number of read sensor attempts.
|
||||
|
||||
#define ZH_GPIO_TASK_PRIORITY 3 // Prioritize the task of GPIO processing.
|
||||
#define ZH_GPIO_STACK_SIZE 2048 // The stack size of the task of GPIO processing.
|
||||
@ -60,16 +60,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.
|
||||
{
|
||||
|
@ -1 +1 @@
|
||||
1.0.5
|
||||
1.0.6
|
Loading…
x
Reference in New Issue
Block a user