diff --git a/.gitmodules b/.gitmodules index 67bd543..3a51633 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,4 +12,7 @@ url = https://github.com/aZholtikov/zh_config [submodule "components/zh_espnow"] path = components/zh_espnow - url = https://github.com/aZholtikov/zh_espnow \ No newline at end of file + url = https://github.com/aZholtikov/zh_espnow +[submodule "components/zh_syslog"] + path = components/zh_syslog + url = https://github.com/aZholtikov/zh_syslog diff --git a/README.md b/README.md index bc0885a..3ebe60f 100755 --- a/README.md +++ b/README.md @@ -8,20 +8,22 @@ Gateway for ESP32 ESP-IDF for data exchange between ESP-NOW devices and MQTT bro ## Features -1. Automatically adds gateway configuration to Home Assistan via MQTT discovery as a binary_sensor. -2. Automatically adds supported devices configurations to Home Assistan via MQTT discovery. -3. Update firmware from HTTPS server via OTA. -4. Update firmware of supported devices from HTTPS server via ESP-NOW. -5. LAN or WiFi connection to router. -6. Direct or mesh work mode. +1. LAN or WiFi connection to router. +2. Direct or mesh work mode. +3. Automatically adds gateway configuration to Home Assistan via MQTT discovery as a binary_sensor. +4. Automatically adds supported devices configurations to Home Assistan via MQTT discovery. +5. Update firmware from HTTPS server via OTA (optional). +6. Update firmware of supported devices from HTTPS server via ESP-NOW (optional). +7. Receive time from NTP server and transmit it to supported devices (optional). +8. Transmitting system information to Syslog server (optional). ## Notes 1. All devices on the network must have the same work mode. 2. ESP-NOW mesh network based on the [zh_network](https://github.com/aZholtikov/zh_network). -3. For initial settings use "menuconfig -> ZH Gateway Configuration". After first boot all settings (except work mode) will be stored in NVS memory for prevente change during OTA firmware update. +3. For initial settings use "menuconfig -> ZH Gateway Configuration". After first boot all settings (except work mode) will be stored in NVS memory for prevente change during OTA firmware update. But it is highly recommended to set up the configuration via menuconfig before updating. 4. To restart the gateway, send the "restart" command to the root topic of the gateway (example - "homeassistant/gateway/70-03-9F-44-BE-F7"). -5. To update the gateway firmware, send the "update" command to the root topic of the gateway (example - "homeassistant/gateway/70-03-9F-44-BE-F7"). The update path should be like as "https://your_server/zh_gateway_esp32.bin". The online status of the update is displayed in the root gateway topic. +5. To update the gateway firmware, send the "update" command to the root topic of the gateway (example - "homeassistant/gateway/70-03-9F-44-BE-F7"). The update path should be like as "https://your_server/zh_gateway_esp32.bin". The online status of the update is displayed in the root gateway topic and Syslog server (if enabled). ## Build and flash diff --git a/components/zh_config b/components/zh_config index 4b9ccf8..db717bf 160000 --- a/components/zh_config +++ b/components/zh_config @@ -1 +1 @@ -Subproject commit 4b9ccf882de3d534b149d5dfe8b4a5ba080788a9 +Subproject commit db717bf6eec149759082c00ecf2fca81faf94adf diff --git a/components/zh_espnow b/components/zh_espnow index 742c807..39fdb2e 160000 --- a/components/zh_espnow +++ b/components/zh_espnow @@ -1 +1 @@ -Subproject commit 742c807c416d9f80c0571f8daea85d275e8d4c93 +Subproject commit 39fdb2eb4968172ce16269d6b24ff1672c6f5351 diff --git a/components/zh_json b/components/zh_json index 93e4e93..3fe0b9f 160000 --- a/components/zh_json +++ b/components/zh_json @@ -1 +1 @@ -Subproject commit 93e4e938b01be6ce938277b51a0dfbca241776b2 +Subproject commit 3fe0b9fa76eb0f081e0e386cbd3d7993d95a2dca diff --git a/components/zh_network b/components/zh_network index 783b44f..10fefb2 160000 --- a/components/zh_network +++ b/components/zh_network @@ -1 +1 @@ -Subproject commit 783b44fbca0ed467a868b4420f191c6d9f6caea5 +Subproject commit 10fefb2912a2489d4be23ba41eedae47290b0fc0 diff --git a/components/zh_syslog b/components/zh_syslog new file mode 160000 index 0000000..912eea5 --- /dev/null +++ b/components/zh_syslog @@ -0,0 +1 @@ +Subproject commit 912eea58dd03a967ec6e48d62c2c669fc5442555 diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 109e690..8f45caa 100755 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -48,19 +48,55 @@ menu "ZH Gateway Configuration" help MQTT topic prefix. + config SYSLOG_SERVER_USING + bool "Enable using Syslog server" + default true + help + Enable using Syslog server. + + config SYSLOG_SERVER_IP + depends on SYSLOG_SERVER_USING + string "Syslog server IP" + default "192.168.1.2" + help + Syslog server IP. + + config SYSLOG_SERVER_PORT + depends on SYSLOG_SERVER_USING + int "Syslog server port" + range 0 65635 + default 514 + help + Syslog server port. + + config NTP_SERVER_USING + bool "Enable using NTP server" + default true + help + Enable using NTP server. + config NTP_SERVER_URL + depends on NTP_SERVER_USING string "NTP server url" default "ntpserver.com" help NTP server url. config NTP_TIME_ZONE + depends on NTP_SERVER_USING string "NTP time zone" default "UTC-3" help NTP time zone. + config FIRMWARE_UPGRADE_SERVER_USING + bool "Enable using OTA update" + default true + help + Enable using OTA update. + config FIRMWARE_UPGRADE_URL + depends on FIRMWARE_UPGRADE_SERVER_USING string "Firmware upgrade url" default "https://yourserver.com" help diff --git a/main/zh_gateway.c b/main/zh_gateway.c index 9d07ba0..fc3c231 100755 --- a/main/zh_gateway.c +++ b/main/zh_gateway.c @@ -99,10 +99,11 @@ void zh_load_config(gateway_config_t *gateway_config) { nvs_set_u8(nvs_handle, "present", 0xFE); nvs_close(nvs_handle); + SETUP_INITIAL_SETTINGS: #ifdef CONFIG_CONNECTION_TYPE_LAN gateway_config->software_config.is_lan_mode = true; - strcpy(gateway_config->software_config.ssid_name, "ssid"); - strcpy(gateway_config->software_config.ssid_password, "password"); + strcpy(gateway_config->software_config.ssid_name, "NULL"); + strcpy(gateway_config->software_config.ssid_password, "NULL"); #else gateway_config->software_config.is_lan_mode = false; strcpy(gateway_config->software_config.ssid_name, CONFIG_WIFI_SSID_NAME); @@ -110,29 +111,62 @@ void zh_load_config(gateway_config_t *gateway_config) #endif strcpy(gateway_config->software_config.mqtt_broker_url, CONFIG_MQTT_BROKER_URL); strcpy(gateway_config->software_config.mqtt_topic_prefix, CONFIG_MQTT_TOPIC_PREFIX); +#ifdef CONFIG_SYSLOG_SERVER_USING + gateway_config->software_config.is_syslog_server_usage = true; + strcpy(gateway_config->software_config.syslog_server_ip, CONFIG_SYSLOG_SERVER_IP); + gateway_config->software_config.syslog_server_port = CONFIG_SYSLOG_SERVER_PORT; +#else + gateway_config->software_config.is_syslog_server_usage = false; + strcpy(gateway_config->software_config.syslog_server_ip, "NULL"); + gateway_config->software_config.syslog_server_port = 0; +#endif +#ifdef CONFIG_NTP_SERVER_USING + gateway_config->software_config.is_ntp_server_usage = true; strcpy(gateway_config->software_config.ntp_server_url, CONFIG_NTP_SERVER_URL); strcpy(gateway_config->software_config.ntp_time_zone, CONFIG_NTP_TIME_ZONE); +#else + gateway_config->software_config.is_ntp_server_usage = false; + strcpy(gateway_config->software_config.ntp_server_url, "NULL"); + strcpy(gateway_config->software_config.ntp_time_zone, "NULL"); +#endif +#ifdef CONFIG_FIRMWARE_UPGRADE_SERVER_USING + gateway_config->software_config.is_ota_server_usage = true; strcpy(gateway_config->software_config.firmware_upgrade_url, CONFIG_FIRMWARE_UPGRADE_URL); +#else + gateway_config->software_config.is_ota_server_usage = false; + strcpy(gateway_config->software_config.firmware_upgrade_url, "NULL"); +#endif zh_save_config(gateway_config); return; } - nvs_get_u8(nvs_handle, "lan_mode", (uint8_t *)&gateway_config->software_config.is_lan_mode); + esp_err_t err = ESP_OK; size_t size = 0; - nvs_get_str(nvs_handle, "ssid_name", NULL, &size); - nvs_get_str(nvs_handle, "ssid_name", gateway_config->software_config.ssid_name, &size); - nvs_get_str(nvs_handle, "ssid_password", NULL, &size); - nvs_get_str(nvs_handle, "ssid_password", gateway_config->software_config.ssid_password, &size); - nvs_get_str(nvs_handle, "mqtt_url", NULL, &size); - nvs_get_str(nvs_handle, "mqtt_url", gateway_config->software_config.mqtt_broker_url, &size); - nvs_get_str(nvs_handle, "topic_prefix", NULL, &size); - nvs_get_str(nvs_handle, "topic_prefix", gateway_config->software_config.mqtt_topic_prefix, &size); - nvs_get_str(nvs_handle, "ntp_url", NULL, &size); - nvs_get_str(nvs_handle, "ntp_url", gateway_config->software_config.ntp_server_url, &size); - nvs_get_str(nvs_handle, "time_zone", NULL, &size); - nvs_get_str(nvs_handle, "time_zone", gateway_config->software_config.ntp_time_zone, &size); - nvs_get_str(nvs_handle, "upgrade_url", NULL, &size); - nvs_get_str(nvs_handle, "upgrade_url", gateway_config->software_config.firmware_upgrade_url, &size); + err += nvs_get_u8(nvs_handle, "lan_mode", (uint8_t *)&gateway_config->software_config.is_lan_mode); + err += nvs_get_str(nvs_handle, "ssid_name", NULL, &size); + err += nvs_get_str(nvs_handle, "ssid_name", gateway_config->software_config.ssid_name, &size); + err += nvs_get_str(nvs_handle, "ssid_password", NULL, &size); + err += nvs_get_str(nvs_handle, "ssid_password", gateway_config->software_config.ssid_password, &size); + err += nvs_get_str(nvs_handle, "mqtt_url", NULL, &size); + err += nvs_get_str(nvs_handle, "mqtt_url", gateway_config->software_config.mqtt_broker_url, &size); + err += nvs_get_str(nvs_handle, "topic_prefix", NULL, &size); + err += nvs_get_str(nvs_handle, "topic_prefix", gateway_config->software_config.mqtt_topic_prefix, &size); + err += nvs_get_u8(nvs_handle, "syslog_usage", (uint8_t *)&gateway_config->software_config.is_syslog_server_usage); + err += nvs_get_str(nvs_handle, "syslog_ip", NULL, &size); + err += nvs_get_str(nvs_handle, "syslog_ip", gateway_config->software_config.syslog_server_ip, &size); + err += nvs_get_u32(nvs_handle, "syslog_port", &gateway_config->software_config.syslog_server_port); + err += nvs_get_u8(nvs_handle, "ntp_usage", (uint8_t *)&gateway_config->software_config.is_ntp_server_usage); + err += nvs_get_str(nvs_handle, "ntp_url", NULL, &size); + err += nvs_get_str(nvs_handle, "ntp_url", gateway_config->software_config.ntp_server_url, &size); + err += nvs_get_str(nvs_handle, "time_zone", NULL, &size); + err += nvs_get_str(nvs_handle, "time_zone", gateway_config->software_config.ntp_time_zone, &size); + err += nvs_get_u8(nvs_handle, "ota_usage", (uint8_t *)&gateway_config->software_config.is_ota_server_usage); + err += nvs_get_str(nvs_handle, "upgrade_url", NULL, &size); + err += nvs_get_str(nvs_handle, "upgrade_url", gateway_config->software_config.firmware_upgrade_url, &size); nvs_close(nvs_handle); + if (err != ESP_OK) + { + goto SETUP_INITIAL_SETTINGS; + } } void zh_save_config(const gateway_config_t *gateway_config) @@ -144,8 +178,13 @@ void zh_save_config(const gateway_config_t *gateway_config) nvs_set_str(nvs_handle, "ssid_password", gateway_config->software_config.ssid_password); nvs_set_str(nvs_handle, "mqtt_url", gateway_config->software_config.mqtt_broker_url); nvs_set_str(nvs_handle, "topic_prefix", gateway_config->software_config.mqtt_topic_prefix); + nvs_set_u8(nvs_handle, "syslog_usage", gateway_config->software_config.is_syslog_server_usage); + nvs_set_str(nvs_handle, "syslog_ip", gateway_config->software_config.syslog_server_ip); + nvs_set_u32(nvs_handle, "syslog_port", gateway_config->software_config.syslog_server_port); + nvs_set_u8(nvs_handle, "ntp_usage", gateway_config->software_config.is_ntp_server_usage); nvs_set_str(nvs_handle, "ntp_url", gateway_config->software_config.ntp_server_url); nvs_set_str(nvs_handle, "time_zone", gateway_config->software_config.ntp_time_zone); + nvs_set_u8(nvs_handle, "ota_usage", gateway_config->software_config.is_ota_server_usage); nvs_set_str(nvs_handle, "upgrade_url", gateway_config->software_config.firmware_upgrade_url); nvs_close(nvs_handle); } @@ -161,11 +200,22 @@ void zh_eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_ esp_mqtt_client_stop(gateway_config->mqtt_client); gateway_config->mqtt_is_enable = false; } - if (gateway_config->sntp_is_enable == true) + if (gateway_config->software_config.is_ntp_server_usage == true) { - esp_sntp_stop(); - gateway_config->sntp_is_enable = false; - vTaskDelete(gateway_config->gateway_current_time_task); + if (gateway_config->sntp_is_enable == true) + { + esp_sntp_stop(); + gateway_config->sntp_is_enable = false; + vTaskDelete(gateway_config->gateway_current_time_task); + } + } + if (gateway_config->software_config.is_syslog_server_usage == true) + { + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_deinit(); + gateway_config->syslog_is_enable = false; + } } break; case IP_EVENT_ETH_GOT_IP: @@ -179,14 +229,25 @@ void zh_eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_ esp_mqtt_client_start(gateway_config->mqtt_client); gateway_config->mqtt_is_enable = true; } - if (gateway_config->sntp_is_enable == false) + if (gateway_config->software_config.is_ntp_server_usage == true) { - esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); - sntp_set_sync_mode(SNTP_SYNC_MODE_SMOOTH); - esp_sntp_setservername(0, gateway_config->software_config.ntp_server_url); - esp_sntp_init(); - gateway_config->sntp_is_enable = true; - xTaskCreatePinnedToCore(&zh_send_espnow_current_time_task, "NULL", ZH_SNTP_STACK_SIZE, gateway_config, ZH_SNTP_TASK_PRIORITY, (TaskHandle_t *)&gateway_config->gateway_current_time_task, tskNO_AFFINITY); + if (gateway_config->sntp_is_enable == false) + { + esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_set_sync_mode(SNTP_SYNC_MODE_SMOOTH); + esp_sntp_setservername(0, gateway_config->software_config.ntp_server_url); + esp_sntp_init(); + gateway_config->sntp_is_enable = true; + xTaskCreatePinnedToCore(&zh_send_espnow_current_time_task, "NULL", ZH_SNTP_STACK_SIZE, gateway_config, ZH_SNTP_TASK_PRIORITY, (TaskHandle_t *)&gateway_config->gateway_current_time_task, tskNO_AFFINITY); + } + } + if (gateway_config->software_config.is_syslog_server_usage == true) + { + zh_syslog_init_config_t syslog_init_config = ZH_SYSLOG_INIT_CONFIG_DEFAULT(); + memcpy(syslog_init_config.syslog_ip, gateway_config->software_config.syslog_server_ip, strlen(gateway_config->software_config.syslog_server_ip)); + syslog_init_config.syslog_port = gateway_config->software_config.syslog_server_port; + zh_syslog_init(&syslog_init_config); + gateway_config->syslog_is_enable = true; } break; default: @@ -208,11 +269,22 @@ void zh_wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event esp_mqtt_client_stop(gateway_config->mqtt_client); gateway_config->mqtt_is_enable = false; } - if (gateway_config->sntp_is_enable == true) + if (gateway_config->software_config.is_ntp_server_usage == true) { - esp_sntp_stop(); - gateway_config->sntp_is_enable = false; - vTaskDelete(gateway_config->gateway_current_time_task); + if (gateway_config->sntp_is_enable == true) + { + esp_sntp_stop(); + gateway_config->sntp_is_enable = false; + vTaskDelete(gateway_config->gateway_current_time_task); + } + } + if (gateway_config->software_config.is_syslog_server_usage == true) + { + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_deinit(); + gateway_config->syslog_is_enable = false; + } } if (gateway_config->wifi_reconnect_retry_num < ZH_WIFI_MAXIMUM_RETRY) { @@ -240,14 +312,25 @@ void zh_wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event esp_mqtt_client_start(gateway_config->mqtt_client); gateway_config->mqtt_is_enable = true; } - if (gateway_config->sntp_is_enable == false) + if (gateway_config->software_config.is_ntp_server_usage == true) { - esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); - sntp_set_sync_mode(SNTP_SYNC_MODE_SMOOTH); - esp_sntp_setservername(0, gateway_config->software_config.ntp_server_url); - esp_sntp_init(); - gateway_config->sntp_is_enable = true; - xTaskCreatePinnedToCore(&zh_send_espnow_current_time_task, "NULL", ZH_SNTP_STACK_SIZE, gateway_config, ZH_SNTP_TASK_PRIORITY, (TaskHandle_t *)&gateway_config->gateway_current_time_task, tskNO_AFFINITY); + if (gateway_config->sntp_is_enable == false) + { + esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_set_sync_mode(SNTP_SYNC_MODE_SMOOTH); + esp_sntp_setservername(0, gateway_config->software_config.ntp_server_url); + esp_sntp_init(); + gateway_config->sntp_is_enable = true; + xTaskCreatePinnedToCore(&zh_send_espnow_current_time_task, "NULL", ZH_SNTP_STACK_SIZE, gateway_config, ZH_SNTP_TASK_PRIORITY, (TaskHandle_t *)&gateway_config->gateway_current_time_task, tskNO_AFFINITY); + } + } + if (gateway_config->software_config.is_syslog_server_usage == true) + { + zh_syslog_init_config_t syslog_init_config = ZH_SYSLOG_INIT_CONFIG_DEFAULT(); + memcpy(syslog_init_config.syslog_ip, gateway_config->software_config.syslog_server_ip, strlen(gateway_config->software_config.syslog_server_ip)); + syslog_init_config.syslog_port = gateway_config->software_config.syslog_server_port; + zh_syslog_init(&syslog_init_config); + gateway_config->syslog_is_enable = true; } break; default: @@ -310,18 +393,32 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve { case ZHDT_SWITCH: zh_espnow_switch_send_mqtt_json_config_message(data, recv_data->mac_addr, gateway_config); + goto ZHPT_CONFIG_SEND_SYSLOG; break; case ZHDT_LED: zh_espnow_led_send_mqtt_json_config_message(data, recv_data->mac_addr, gateway_config); + goto ZHPT_CONFIG_SEND_SYSLOG; break; case ZHDT_SENSOR: zh_espnow_sensor_send_mqtt_json_config_message(data, recv_data->mac_addr, gateway_config); + goto ZHPT_CONFIG_SEND_SYSLOG; break; case ZHDT_BINARY_SENSOR: zh_espnow_binary_sensor_send_mqtt_json_config_message(data, recv_data->mac_addr, gateway_config); + goto ZHPT_CONFIG_SEND_SYSLOG; break; default: break; + ZHPT_CONFIG_SEND_SYSLOG: + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(recv_data->mac_addr)); + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(data->device_type), "Connected to gateway."); + heap_caps_free(mac); + } + break; } break; case ZHPT_HARDWARE: @@ -378,9 +475,35 @@ void zh_espnow_event_handler(void *arg, esp_event_base_t event_base, int32_t eve break; case ZHPT_UPDATE_FAIL: esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_fail", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(recv_data->mac_addr)); + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(data->device_type), "Firmware update fail. Incorrect bin file."); + heap_caps_free(mac); + } break; case ZHPT_UPDATE_SUCCESS: esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_success", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(recv_data->mac_addr)); + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(data->device_type), "Firmware update success."); + heap_caps_free(mac); + } + break; + case ZHPT_ERROR: + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(recv_data->mac_addr)); + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(data->device_type), data->payload_data.status_message.error_message.message); + heap_caps_free(mac); + } break; default: break; @@ -413,6 +536,14 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event case MQTT_EVENT_CONNECTED: if (gateway_config->mqtt_is_connected == false) { + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(gateway_config->self_mac)); + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Connected to MQTT."); + heap_caps_free(mac); + } char *topic_for_subscribe = NULL; char *supported_device_type = NULL; for (zh_device_type_t i = 1; i <= ZHDT_MAX; ++i) @@ -434,6 +565,14 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event case MQTT_EVENT_DISCONNECTED: if (gateway_config->mqtt_is_connected == true) { + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(gateway_config->self_mac)); + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Disconnected from MQTT."); + heap_caps_free(mac); + } vTaskDelete(gateway_config->gateway_attributes_message_task); vTaskDelete(gateway_config->gateway_keep_alive_message_task); vTaskDelete(gateway_config->device_availability_check_task); @@ -500,7 +639,7 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event { if (memcmp(gateway_config->self_mac, incoming_data_mac, 6) == 0) { - if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0) + if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0 && gateway_config->software_config.is_ota_server_usage == true) { if (xSemaphoreTake(gateway_config->self_ota_in_progress_mutex, portTICK_PERIOD_MS) == pdTRUE) { @@ -529,7 +668,7 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event switch (incoming_data_payload_type) { case ZHPT_NONE: - if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0) + if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0 && gateway_config->software_config.is_ota_server_usage == true) { data.payload_type = ZHPT_UPDATE; zh_send_message(incoming_data_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); @@ -628,7 +767,7 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event switch (incoming_data_payload_type) { case ZHPT_NONE: - if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0) + if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0 && gateway_config->software_config.is_ota_server_usage == true) { data.payload_type = ZHPT_UPDATE; zh_send_message(incoming_data_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); @@ -735,7 +874,7 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event switch (incoming_data_payload_type) { case ZHPT_NONE: - if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0) + if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0 && gateway_config->software_config.is_ota_server_usage == true) { data.payload_type = ZHPT_UPDATE; zh_send_message(incoming_data_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); @@ -798,7 +937,7 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event switch (incoming_data_payload_type) { case ZHPT_NONE: - if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0) + if (strncmp(incoming_payload, "update", strlen(incoming_payload) + 1) == 0 && gateway_config->software_config.is_ota_server_usage == true) { data.payload_type = ZHPT_UPDATE; zh_send_message(incoming_data_mac, (uint8_t *)&data, sizeof(zh_espnow_data_t)); @@ -827,6 +966,9 @@ void zh_mqtt_event_handler(void *arg, esp_event_base_t event_base, int32_t event void zh_self_ota_update_task(void *pvParameter) { gateway_config_t *gateway_config = pvParameter; + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(gateway_config->self_mac)); xSemaphoreTake(gateway_config->self_ota_in_progress_mutex, portMAX_DELAY); char *topic = (char *)heap_caps_malloc(strlen(gateway_config->software_config.mqtt_topic_prefix) + strlen(zh_get_device_type_value_name(ZHDT_GATEWAY)) + 20, MALLOC_CAP_8BIT); memset(topic, 0, strlen(gateway_config->software_config.mqtt_topic_prefix) + strlen(zh_get_device_type_value_name(ZHDT_GATEWAY)) + 20); @@ -835,6 +977,10 @@ void zh_self_ota_update_task(void *pvParameter) esp_ota_handle_t update_handle = {0}; const esp_partition_t *update_partition = NULL; esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_begin", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Firmware update begin."); + } const esp_app_desc_t *app_info = esp_app_get_description(); char *app_name = (char *)heap_caps_malloc(strlen(gateway_config->software_config.firmware_upgrade_url) + strlen(app_info->project_name) + 6, MALLOC_CAP_8BIT); memset(app_name, 0, strlen(gateway_config->software_config.firmware_upgrade_url) + strlen(app_info->project_name) + 6); @@ -852,6 +998,10 @@ void zh_self_ota_update_task(void *pvParameter) esp_http_client_fetch_headers(https_client); update_partition = esp_ota_get_next_update_partition(NULL); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_progress", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Firmware update progress."); + } esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle); for (;;) { @@ -861,7 +1011,12 @@ void zh_self_ota_update_task(void *pvParameter) esp_http_client_close(https_client); esp_http_client_cleanup(https_client); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_error_data_size", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Firmware update error. Incorrect size of read data."); + } heap_caps_free(topic); + heap_caps_free(mac); xSemaphoreGive(gateway_config->self_ota_in_progress_mutex); vTaskDelete(NULL); } @@ -879,7 +1034,12 @@ void zh_self_ota_update_task(void *pvParameter) esp_http_client_close(https_client); esp_http_client_cleanup(https_client); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_fail", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Firmware update fail. Incorrect bin file."); + } heap_caps_free(topic); + heap_caps_free(mac); xSemaphoreGive(gateway_config->self_ota_in_progress_mutex); vTaskDelete(NULL); } @@ -887,7 +1047,12 @@ void zh_self_ota_update_task(void *pvParameter) esp_http_client_close(https_client); esp_http_client_cleanup(https_client); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_success", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Firmware update success."); + } heap_caps_free(topic); + heap_caps_free(mac); zh_espnow_data_t data = {0}; data.device_type = ZHDT_GATEWAY; data.payload_type = ZHPT_KEEP_ALIVE; @@ -900,6 +1065,10 @@ void zh_self_ota_update_task(void *pvParameter) void zh_espnow_ota_update_task(void *pvParameter) { gateway_config_t *gateway_config = pvParameter; + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(gateway_config->espnow_ota_data.mac_addr)); + // heap_caps_free(mac); xSemaphoreTake(gateway_config->espnow_ota_in_progress_mutex, portMAX_DELAY); zh_espnow_data_t data = {0}; data.device_type = ZHDT_GATEWAY; @@ -907,6 +1076,10 @@ void zh_espnow_ota_update_task(void *pvParameter) memset(topic, 0, strlen(gateway_config->software_config.mqtt_topic_prefix) + strlen(zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type)) + 20); sprintf(topic, "%s/%s/" MAC_STR, gateway_config->software_config.mqtt_topic_prefix, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), MAC2STR(gateway_config->espnow_ota_data.mac_addr)); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_begin", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), "Firmware update begin."); + } char espnow_ota_write_data[sizeof(data.payload_data.ota_message.espnow_ota_message.data) + 1] = {0}; char *app_name = (char *)heap_caps_malloc(strlen(gateway_config->software_config.firmware_upgrade_url) + strlen(gateway_config->espnow_ota_data.app_name) + 6, MALLOC_CAP_8BIT); memset(app_name, 0, strlen(gateway_config->software_config.firmware_upgrade_url) + strlen(gateway_config->espnow_ota_data.app_name) + 6); @@ -931,11 +1104,20 @@ void zh_espnow_ota_update_task(void *pvParameter) data.payload_type = ZHPT_UPDATE_ERROR; zh_send_message(gateway_config->espnow_ota_data.mac_addr, (uint8_t *)&data, sizeof(zh_espnow_data_t)); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_error_begin_timeout", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), "Firmware update error. Timeout exceed."); + } + heap_caps_free(mac); heap_caps_free(topic); xSemaphoreGive(gateway_config->espnow_ota_in_progress_mutex); vTaskDelete(NULL); } esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_progress", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), "Firmware update progress."); + } for (;;) { int data_read_size = esp_http_client_read(https_client, espnow_ota_write_data, sizeof(data.payload_data.ota_message.espnow_ota_message.data)); @@ -944,6 +1126,11 @@ void zh_espnow_ota_update_task(void *pvParameter) esp_http_client_close(https_client); esp_http_client_cleanup(https_client); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_error_data_size", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), "Firmware update error. Incorrect size of read data."); + } + heap_caps_free(mac); heap_caps_free(topic); xSemaphoreGive(gateway_config->espnow_ota_in_progress_mutex); vTaskDelete(NULL); @@ -962,6 +1149,11 @@ void zh_espnow_ota_update_task(void *pvParameter) data.payload_type = ZHPT_UPDATE_ERROR; zh_send_message(gateway_config->espnow_ota_data.mac_addr, (uint8_t *)&data, sizeof(zh_espnow_data_t)); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_error_progress_timeout", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_ERR, mac, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), "Firmware update error. Timeout exceed."); + } + heap_caps_free(mac); heap_caps_free(topic); xSemaphoreGive(gateway_config->espnow_ota_in_progress_mutex); vTaskDelete(NULL); @@ -974,6 +1166,11 @@ void zh_espnow_ota_update_task(void *pvParameter) data.payload_type = ZHPT_UPDATE_END; zh_send_message(gateway_config->espnow_ota_data.mac_addr, (uint8_t *)&data, sizeof(zh_espnow_data_t)); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "update_end", 0, 2, true); + if (gateway_config->syslog_is_enable == true) + { + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(gateway_config->espnow_ota_data.device_type), "Firmware update end."); + } + heap_caps_free(mac); heap_caps_free(topic); xSemaphoreGive(gateway_config->espnow_ota_in_progress_mutex); vTaskDelete(NULL); @@ -988,6 +1185,14 @@ void zh_send_espnow_current_time_task(void *pvParameter) { vTaskDelay(5000 / portTICK_PERIOD_MS); } + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(gateway_config->self_mac)); + zh_syslog_send(ZH_USER, ZH_INFO, mac, zh_get_device_type_value_name(ZHDT_GATEWAY), "Connected to NTP."); + heap_caps_free(mac); + } time_t now; setenv("TZ", gateway_config->software_config.ntp_time_zone, 1); tzset(); @@ -1021,6 +1226,14 @@ void zh_device_availability_check_task(void *pvParameter) sprintf(topic, "%s/%s/" MAC_STR "/status", gateway_config->software_config.mqtt_topic_prefix, zh_get_device_type_value_name(available_device->device_type), MAC2STR(available_device->mac_addr)); esp_mqtt_client_publish(gateway_config->mqtt_client, topic, "offline", 0, 2, true); heap_caps_free(topic); + if (gateway_config->syslog_is_enable == true) + { + char *mac = (char *)heap_caps_malloc(18, MALLOC_CAP_8BIT); + memset(mac, 0, 18); + sprintf(mac, "" MAC_STR "", MAC2STR(available_device->mac_addr)); + zh_syslog_send(ZH_USER, ZH_WARNING, mac, zh_get_device_type_value_name(available_device->device_type), "Disconnected from gateway."); + heap_caps_free(mac); + } zh_vector_delete_item(&gateway_config->available_device_vector, i); goto CHECK; // Since the vector is shifted after item deletion, the item needs to be re-checked. } @@ -1705,7 +1918,7 @@ void zh_espnow_sensor_send_mqtt_json_status_message(const zh_espnow_data_t *devi case HAST_DHT: case HAST_AHT: case HAST_SHT: - case HAST_HTU21D: + case HAST_HTU: case HAST_HDC1080: sprintf(temperature, "%f", device_data->payload_data.status_message.sensor_status_message.temperature); zh_json_add(&json, "temperature", temperature); diff --git a/main/zh_gateway.h b/main/zh_gateway.h index 1b904fd..6e7488e 100755 --- a/main/zh_gateway.h +++ b/main/zh_gateway.h @@ -17,6 +17,7 @@ #include "mqtt_client.h" #include "zh_json.h" #include "zh_vector.h" +#include "zh_syslog.h" #include "zh_config.h" #ifdef CONFIG_NETWORK_TYPE_DIRECT @@ -72,11 +73,17 @@ typedef struct // Structure of data exchange between tasks, functions and event char ssid_password[64]; // WiFi password. char mqtt_broker_url[64]; // MQTT broker url. char mqtt_topic_prefix[32]; // MQTT topic prefix. + bool is_syslog_server_usage; // Syslog server usage flag. + char syslog_server_ip[16]; // Syslog server IP address. + uint32_t syslog_server_port; // Syslog server port. + bool is_ntp_server_usage; // NTP server usage flag. char ntp_server_url[64]; // NTP server url. char ntp_time_zone[10]; // NTP time zone. + bool is_ota_server_usage; // OTA server usage flag. char firmware_upgrade_url[64]; // Firmware upgrade url. } software_config; uint8_t self_mac[6]; // Gateway MAC address. @note Depends at WiFi operation mode. + bool syslog_is_enable; // Syslog client operation status flag. @note Used to control the Syslog functions when the network connection is established / lost. 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. diff --git a/version.txt b/version.txt index ece61c6..f9cbc01 100755 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.6 \ No newline at end of file +1.0.7 \ No newline at end of file