#include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "esp_event.h" #include "zh_nrf24_gateway.h" #include "zh_nrf24_config.h" static const char *TAG = "MAIN"; #define GW_CHANNEL 120 #define GW_ADDRESS 0xDDEEFF static const zh_nrf_gateway_config_t s_gw_config = { .spi_host = SPI2_HOST, .pin_sck = 18, .pin_miso = 19, .pin_mosi = 23, .pin_csn = 17, .pin_ce = 16, .pin_irq = 4, .channel = GW_CHANNEL, .address = GW_ADDRESS, .spi_clock_hz = 0, }; static void handle_paired_event(const zh_nrf_gateway_binding_t *b) { ESP_LOGI(TAG, ">>> SENSOR PAIRED: id=%u type=%u (%s)", b->id, b->type, zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)b->type)); /* Здесь можно добавить: * - публикацию в MQTT: "sensor/paired" {id, type}; * - сохранение метаданных во внешнюю БД; * - запись в журнал / уведомление; * - поиск пользователя, которому принадлежит новое устройство, * и т.п. */ } static void handle_sensor_data_event(const zh_nrf24_sensor_transmitted_data_t *d) { const char *name = zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)d->type); ESP_LOGI(TAG, "<<< sensor id=%d type=%s battery=%.2fV", d->id, name, d->battery / 100.0); switch (d->type) { case ZH_NRF24_SENSOR_TOUCH_SWITCH: ESP_LOGI(TAG, " button event"); break; case ZH_NRF24_SENSOR_WATER_LEAKAGE: ESP_LOGI(TAG, " status=%s", d->value_1 == ZH_NRF24_SENSOR_STATUS_ALARM ? "ALARM" : "DRY"); break; case ZH_NRF24_SENSOR_OPEN_CLOSE: ESP_LOGI(TAG, " state=%s", d->value_1 == ZH_NRF24_SENSOR_STATUS_OPEN ? "OPEN" : "CLOSE"); break; case ZH_NRF24_SENSOR_PLANT_HUMIDITY: ESP_LOGI(TAG, " humidity=%d%%", d->value_1); break; case ZH_NRF24_SENSOR_BMP280: ESP_LOGI(TAG, " T=%d C, P=%d", d->value_1, d->value_2); break; case ZH_NRF24_SENSOR_BME280: ESP_LOGI(TAG, " H=%d%% T=%d C P=%d mmHg", d->value_1, d->value_2, d->value_3); break; case ZH_NRF24_SENSOR_BME680: ESP_LOGI(TAG, " H=%d%% T=%d C P=%d Q=%d", d->value_1, d->value_2, d->value_3, d->value_4); break; default: break; } } static void gateway_event_handler(void *arg, esp_event_base_t base, int32_t id, void *event_data) { if (base != ZH_NRF_GATEWAY_EVENTS) return; switch (id) { case ZH_NRF_GATEWAY_EVENT_SENSOR_DATA: handle_sensor_data_event((const zh_nrf24_sensor_transmitted_data_t *)event_data); break; case ZH_NRF_GATEWAY_EVENT_SENSOR_PAIRED: handle_paired_event((const zh_nrf_gateway_binding_t *)event_data); break; default: break; } } void app_main(void) { ESP_LOGI(TAG, "Starting nRF24L01+ gateway"); ESP_ERROR_CHECK(esp_event_loop_create_default()); ESP_ERROR_CHECK(esp_event_handler_instance_register( ZH_NRF_GATEWAY_EVENTS, ESP_EVENT_ANY_ID, &gateway_event_handler, NULL, NULL)); ESP_ERROR_CHECK(zh_nrf_gateway_init(&s_gw_config)); ESP_ERROR_CHECK(zh_nrf_gateway_start()); ESP_LOGI(TAG, "Gateway running: channel=%d, address=0x%06X", GW_CHANNEL, GW_ADDRESS); }