2024-06-04 18:59:55 +03:00
# pragma once
# include "stdio.h"
# include "string.h"
# include "nvs_flash.h"
# include "esp_netif.h"
# include "esp_event.h"
# include "esp_err.h"
# include "driver/gpio.h"
# include "esp_eth.h"
# include "esp_timer.h"
# include "esp_sntp.h"
# include "esp_app_format.h"
# include "esp_ota_ops.h"
# include "esp_http_client.h"
# include "esp_mac.h"
# include "mqtt_client.h"
# include "zh_json.h"
2024-06-10 18:46:44 +03:00
# include "zh_vector.h"
2024-06-04 18:59:55 +03:00
# include "zh_config.h"
# ifdef CONFIG_NETWORK_TYPE_DIRECT
# include "zh_espnow.h"
# define zh_send_message(a, b, c) zh_espnow_send(a, b, c)
# define ZH_EVENT ZH_ESPNOW
# else
# include "zh_network.h"
# define zh_send_message(a, b, c) zh_network_send(a, b, c)
# define ZH_EVENT ZH_NETWORK
# endif
# ifdef CONFIG_IDF_TARGET_ESP32
# define ZH_CHIP_TYPE HACHT_ESP32
# elif CONFIG_IDF_TARGET_ESP32S2
# define ZH_CHIP_TYPE HACHT_ESP32S2
# elif CONFIG_IDF_TARGET_ESP32S3
# define ZH_CHIP_TYPE HACHT_ESP32S3
# elif CONFIG_IDF_TARGET_ESP32C2
# define ZH_CHIP_TYPE HACHT_ESP32C2
# elif CONFIG_IDF_TARGET_ESP32C3
# define ZH_CHIP_TYPE HACHT_ESP32C3
# elif CONFIG_IDF_TARGET_ESP32C6
# define ZH_CHIP_TYPE HACHT_ESP32C6
# endif
2024-06-12 07:03:26 +03:00
# define ZH_LAN_MODULE_TYPE(x) esp_eth_phy_new_rtl8201(x) // For LILYGO T-ETH-Lite ESP32.
# define ZH_LAN_MODULE_POWER_PIN GPIO_NUM_12 // For LILYGO T-ETH-Lite ESP32.
// #define ZH_LAN_MODULE_TYPE(x) esp_eth_phy_new_lan87xx(x) // For Wireless-Tag WT32-ETH01.
// #define ZH_LAN_MODULE_POWER_PIN GPIO_NUM_16 // For Wireless-Tag WT32-ETH01.
2024-06-04 18:59:55 +03:00
# define ZH_WIFI_MAXIMUM_RETRY 5 // Maximum number of unsuccessful WiFi connection attempts.
# define ZH_WIFI_RECONNECT_TIME 5 // Waiting time (in seconds) between attempts to reconnect to WiFi (if number of attempts of unsuccessful connections is exceeded).
# define MAC_STR "%02X-%02X-%02X-%02X-%02X-%02X"
# define ZH_MESSAGE_TASK_PRIORITY 2 // Prioritize the task of sending messages to the MQTT.
2024-06-09 09:32:51 +03:00
# define ZH_MESSAGE_STACK_SIZE 3072 // The stack size of the task of sending messages to the MQTT.
2024-06-04 18:59:55 +03:00
# define ZH_SNTP_TASK_PRIORITY 2 // Prioritize the task to get the current time.
# define ZH_SNTP_STACK_SIZE 2048 // The stack size of the task to get the current time.
2024-06-10 18:46:44 +03:00
# define ZH_CHECK_TASK_PRIORITY 2 // Prioritize the task to checking device availability.
# define ZH_CHECK_STACK_SIZE 2048 // The stack size of the task to checking device availability.
2024-06-04 18:59:55 +03:00
# define ZH_OTA_TASK_PRIORITY 3 // Prioritize the task of OTA updates.
# define ZH_OTA_STACK_SIZE 8192 // The stack size of the task of OTA updates.
# define ZH_MAX_GPIO_NUMBERS 48 // Maximum number of GPIOs on ESP modules.
typedef struct // Structure of data exchange between tasks, functions and event handlers.
{
2024-06-12 07:03:26 +03:00
struct // Storage structure of gateway configuration data.
{
bool is_lan_mode ; // Ethernet work mode flag.
char ssid_name [ 32 ] ; // WiFi SSID name.
char ssid_password [ 64 ] ; // WiFi password.
char mqtt_broker_url [ 64 ] ; // MQTT broker url.
char mqtt_topic_prefix [ 32 ] ; // MQTT topic prefix.
char ntp_server_url [ 64 ] ; // NTP server url.
char ntp_time_zone [ 10 ] ; // NTP time zone.
char firmware_upgrade_url [ 64 ] ; // Firmware upgrade url.
} software_config ;
2024-06-09 13:28:34 +03:00
uint8_t self_mac [ 6 ] ; // Gateway MAC address. @note Depends at WiFi operation mode.
bool sntp_is_enable ; // SNTP client operation status flag. @note Used to control the SNTP functions when the network connection is established / lost.
bool mqtt_is_enable ; // MQTT client operation status flag. @note Used to control the MQTT functions when the network connection is established / lost.
bool mqtt_is_connected ; // MQTT broker connection status flag. @note Used to control the gateway system tasks when the MQTT connection is established / lost.
esp_timer_handle_t wifi_reconnect_timer ; // Unique WiFi reconnection timer handle. @note Used when the number of attempts of unsuccessful connections is exceeded.
uint8_t wifi_reconnect_retry_num ; // System counter for the number of unsuccessful WiFi connection attempts.
esp_mqtt_client_handle_t mqtt_client ; // Unique MQTT client handle.
TaskHandle_t gateway_attributes_message_task ; // Unique task handle for zh_gateway_send_mqtt_json_attributes_message_task().
TaskHandle_t gateway_keep_alive_message_task ; // Unique task handle for zh_gateway_send_mqtt_json_keep_alive_message_task().
TaskHandle_t gateway_current_time_task ; // Unique task handle for zh_send_espnow_current_time_task().
2024-06-10 18:46:44 +03:00
TaskHandle_t device_availability_check_task ; // Unique task handle for zh_device_availability_check_task().
2024-06-09 13:28:34 +03:00
struct // Structure for initial transfer system data to the node update task.
{
zh_device_type_t device_type ; // ESP-NOW device type.
char app_name [ 32 ] ; // Firmware application name.
char app_version [ 32 ] ; // Firmware application version.
uint8_t mac_addr [ 6 ] ; // ESP-NOW node MAC address.
} espnow_ota_data ;
2024-06-10 18:46:44 +03:00
SemaphoreHandle_t espnow_ota_data_semaphore ; // Semaphore for control the acknowledgement of successful receipt of an update package from a node.
SemaphoreHandle_t self_ota_in_progress_mutex ; // Mutex blocking the second run of the gateway update task.
SemaphoreHandle_t espnow_ota_in_progress_mutex ; // Mutex blocking the second run of the node update task.
SemaphoreHandle_t device_check_in_progress_mutex ; // Mutex blocking the second access to the vector for struct for storing data about available nodes.
zh_vector_t available_device_vector ; // Vector for struct for storing data about available nodes.
2024-06-04 18:59:55 +03:00
} gateway_config_t ;
2024-06-10 18:46:44 +03:00
typedef struct // Struct for storing data about available nodes.
{
zh_device_type_t device_type ; // ESP-NOW device type.
uint8_t mac_addr [ 6 ] ; // ESP-NOW node MAC address.
uint8_t frequency ; // Keep alive message frequency.
uint64_t time ; // Last keep alive message time.
} available_device_t ;
2024-06-04 18:59:55 +03:00
extern const uint8_t server_certificate_pem_start [ ] asm ( " _binary_certificate_pem_start " ) ;
extern const uint8_t server_certificate_pem_end [ ] asm ( " _binary_certificate_pem_end " ) ;
2024-06-12 07:03:26 +03:00
/**
* @ brief Function for loading the gateway configuration from NVS memory .
*
* @ param [ out ] switch_config Pointer to structure of data exchange between tasks , functions and event handlers .
*/
void zh_load_config ( gateway_config_t * gateway_config ) ;
/**
* @ brief Function for saving the gateway configuration to NVS memory .
*
* @ param [ in ] switch_config Pointer to structure of data exchange between tasks , functions and event handlers .
*/
void zh_save_config ( const gateway_config_t * gateway_config ) ;
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for LAN event processing .
*
* @ param [ in , out ] arg Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_eth_event_handler ( void * arg , esp_event_base_t event_base , int32_t event_id , void * event_data ) ;
2024-06-12 07:03:26 +03:00
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for WiFi event processing .
*
* @ param [ in , out ] arg Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_wifi_event_handler ( void * arg , esp_event_base_t event_base , int32_t event_id , void * event_data ) ;
2024-06-12 07:03:26 +03:00
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for ESP - NOW event processing
*
* @ param [ in , out ] arg Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_event_handler ( void * arg , esp_event_base_t event_base , int32_t event_id , void * event_data ) ;
/**
* @ brief Function for MQTT event processing .
*
* @ param [ in , out ] arg Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_mqtt_event_handler ( void * arg , esp_event_base_t event_base , int32_t event_id , void * event_data ) ;
/**
* @ brief Task of updating the gateway firmware .
*
* @ param [ in , out ] pvParameter Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_self_ota_update_task ( void * pvParameter ) ;
/**
* @ brief Task of updating the esp - now node firmware .
*
* @ param [ in , out ] pvParameter Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_ota_update_task ( void * pvParameter ) ;
/**
* @ brief The task for getting the current time from the internet and sending it to the all esp - now nodes .
*
* @ note To Do .
*
* @ param [ in , out ] pvParameter Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_send_espnow_current_time_task ( void * pvParameter ) ;
2024-06-10 18:46:44 +03:00
/**
* @ brief The task of checking device availability and sending a message to the MQTT broker in case of unavailability .
*
* @ param [ in , out ] pvParameter Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_device_availability_check_task ( void * pvParameter ) ;
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for checking the correctness of the GPIO number value .
*
* @ param gpio Value for check .
*
* @ return GPIO number value or 0xFF if error
*/
uint8_t zh_gpio_number_check ( const int gpio ) ;
/**
* @ brief Function for checking the correctness of the bool variable value .
*
* @ param value Value for check .
*
* @ return Bool value
*/
bool zh_bool_value_check ( const int value ) ;
/**
* @ brief Function for checking the correctness of the sensor type value .
*
* @ param type Value for check .
*
* @ return Sensor type value or 0 if error
*/
uint8_t zh_sensor_type_check ( const int type ) ;
2024-06-26 09:08:51 +03:00
/**
* @ brief Function for checking the correctness of the led type value .
*
* @ param type Value for check .
*
* @ return Led type value or 0 if error
*/
uint8_t zh_led_type_check ( const int type ) ;
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for checking the correctness of the uint16_t variable value .
*
* @ param value Value for check .
*
* @ return Uint16_t value or 60 if error
*/
uint16_t zh_uint16_value_check ( const int value ) ;
/**
* @ brief Task for prepare the attributes message from a gateway and transfer it to the processing function zh_espnow_send_mqtt_json_attributes_message ( ) .
*
* @ param [ in ] pvParameter Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_gateway_send_mqtt_json_attributes_message_task ( void * pvParameter ) ;
/**
* @ brief Function for prepare the configuration message from a gateway and transfer it to the processing function zh_espnow_binary_sensor_send_mqtt_json_config_message ( ) .
*
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_gateway_send_mqtt_json_config_message ( const gateway_config_t * gateway_config ) ;
/**
* @ brief Task for prepare the keep alive message from a gateway , transfer it to the processing function zh_espnow_send_mqtt_json_keep_alive_message ( ) and sending to all esp - now nodes .
*
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_gateway_send_mqtt_json_keep_alive_message_task ( void * pvParameter ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the attributes message received from a esp - now node .
*
* @ param [ in , out ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_send_mqtt_json_attributes_message ( zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the keep alive message received from a esp - now node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_send_mqtt_json_keep_alive_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the configuration message received from a zh_espnow_switch node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_switch_send_mqtt_json_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the hardware configuration message received from a zh_espnow_switch node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_switch_send_mqtt_json_hardware_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the status message received from a zh_espnow_switch node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_switch_send_mqtt_json_status_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the configuration message received from a zh_espnow_led node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_led_send_mqtt_json_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
2024-06-26 09:08:51 +03:00
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the hardware configuration message received from a zh_espnow_led node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_led_send_mqtt_json_hardware_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the status message received from a zh_espnow_led node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_led_send_mqtt_json_status_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the configuration message received from a zh_espnow_sensor node .
*
* @ param [ in , out ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_sensor_send_mqtt_json_config_message ( zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the hardware configuration message received from a zh_espnow_sensor node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_sensor_send_mqtt_json_hardware_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the status message received from a zh_espnow_sensor node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_sensor_send_mqtt_json_status_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the configuration message received from a zh_espnow_binary_sensor node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_binary_sensor_send_mqtt_json_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
2024-06-26 09:08:51 +03:00
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the hardware configuration message received from a zh_espnow_binary_sensor node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_binary_sensor_send_mqtt_json_hardware_config_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;
2024-06-04 18:59:55 +03:00
/**
* @ brief Function for converting to JSON and sending to the MQTT broker the status message received from a zh_espnow_binary_sensor node .
*
* @ param [ in ] device_data Pointer to structure for data exchange between ESP - NOW devices .
* @ param [ in ] device_mac Pointer to ESP - NOW node MAC address .
* @ param [ in ] gateway_config Pointer to the structure of data exchange between tasks , functions and event handlers .
*/
void zh_espnow_binary_sensor_send_mqtt_json_status_message ( const zh_espnow_data_t * device_data , const uint8_t * device_mac , const gateway_config_t * gateway_config ) ;