new release

This commit is contained in:
2025-11-20 07:45:00 +00:00
parent 96b2ab1f57
commit 4820d9111e
106 changed files with 4264 additions and 15581 deletions

View File

@@ -1,15 +1,20 @@
#include "meter_manager.h"
#include "esp_log.h"
#include "meter_ade7758.h"
#include "meter_orno513.h"
#include "meter_orno516.h"
#include "meter_orno526.h"
#include "meter_dts6619.h"
#include "meter_dds661.h"
#include "meter_zigbee.h"
#include "meter_ea777.h"
#include "nvs_flash.h"
#include "nvs.h"
#include <string.h>
#include "network_events.h"
static const char *TAG = "meter_manager";
// Tipos de medidores EVSE e GRID
@@ -20,48 +25,53 @@ static meter_type_t meter_grid_type = METER_TYPE_NONE;
#define NVS_EVSE_MODEL "evse_model"
#define NVS_GRID_MODEL "grid_model"
static void meter_manager_network_event_handler(void *arg, esp_event_base_t base, int32_t event_id, void *data)
{
if (base != NETWORK_EVENTS)
return;
static void meter_manager_network_event_handler(void* arg, esp_event_base_t base, int32_t event_id, void* data){
switch (event_id)
{
case NETWORK_EVENT_AP_STARTED:
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_AP_STARTED, parando medidor de grid");
// meter_manager_grid_stop();
break;
if (base != NETWORK_EVENTS) return;
case NETWORK_EVENT_AP_STOP:
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_AP_STOP, reiniciando medidor de grid");
// meter_manager_grid_start();
break;
switch (event_id) {
case NETWORK_EVENT_AP_STARTED:
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_AP_STARTED, parando medidor de grid");
meter_manager_grid_stop();
break;
case NETWORK_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_STA_GOT_IP");
// opcional: reiniciar ou logar
break;
case NETWORK_EVENT_AP_STOP:
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_AP_STOP, reiniciando medidor de grid");
meter_manager_grid_start();
break;
case NETWORK_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_STA_GOT_IP");
// opcional: reiniciar ou logar
break;
default:
break;
default:
break;
}
}
// Função unificada para ler ou inicializar um modelo de medidor
static esp_err_t load_or_init_meter_model(const char *key, meter_type_t *type) {
static esp_err_t load_or_init_meter_model(const char *key, meter_type_t *type)
{
nvs_handle_t handle;
esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &handle);
if (err != ESP_OK) {
if (err != ESP_OK)
{
ESP_LOGE(TAG, "Failed to open NVS handle for %s: %s", key, esp_err_to_name(err));
return err;
}
uint8_t value = 0;
err = nvs_get_u8(handle, key, &value);
if (err == ESP_OK && value <= METER_TYPE_TRIF_ZIGBEE) {
if (err == ESP_OK && value < 255)
{
*type = (meter_type_t)value;
ESP_LOGI(TAG, "Loaded meter type %d from NVS key '%s'", value, key);
} else {
}
else
{
*type = METER_TYPE_NONE;
nvs_set_u8(handle, key, *type);
nvs_commit(handle);
@@ -72,19 +82,24 @@ static esp_err_t load_or_init_meter_model(const char *key, meter_type_t *type) {
return ESP_OK;
}
static esp_err_t write_meter_model_to_nvs(const char *key, meter_type_t meter_type) {
static esp_err_t write_meter_model_to_nvs(const char *key, meter_type_t meter_type)
{
nvs_handle_t handle;
esp_err_t err = nvs_open(NVS_NAMESPACE, NVS_READWRITE, &handle);
if (err != ESP_OK) {
if (err != ESP_OK)
{
ESP_LOGE(TAG, "Failed to open NVS handle for writing");
return err;
}
err = nvs_set_u8(handle, key, (uint8_t)meter_type);
if (err == ESP_OK) {
if (err == ESP_OK)
{
err = nvs_commit(handle);
ESP_LOGI(TAG, "Saved meter type %d to NVS key '%s'", meter_type, key);
} else {
}
else
{
ESP_LOGE(TAG, "Failed to write meter type to NVS key '%s'", key);
}
@@ -92,7 +107,6 @@ static esp_err_t write_meter_model_to_nvs(const char *key, meter_type_t meter_ty
return err;
}
/**
* @brief Initializes the meter manager system.
*
@@ -102,16 +116,18 @@ static esp_err_t write_meter_model_to_nvs(const char *key, meter_type_t meter_ty
*
* @return esp_err_t ESP_OK on success, or an error code.
*/
esp_err_t meter_manager_init(void) {
esp_err_t meter_manager_init(void)
{
esp_err_t err;
// Initialize EVSE meter
//err = meter_manager_evse_init();
//if (err != ESP_OK) return err;
// Initialize EVSE meter (habilite quando quiser)
// err = meter_manager_evse_init();
// if (err != ESP_OK) return err;
// Initialize GRID meter
err = meter_manager_grid_init();
if (err != ESP_OK) return err;
if (err != ESP_OK)
return err;
// Register handler for custom network events
ESP_LOGI(TAG, "Registering network event handler");
@@ -121,7 +137,6 @@ esp_err_t meter_manager_init(void) {
NULL);
}
/**
* @brief Starts all configured meters (EVSE and GRID).
*
@@ -130,21 +145,22 @@ esp_err_t meter_manager_init(void) {
*
* @return esp_err_t ESP_OK on success, or an error code from one of the start calls.
*/
esp_err_t meter_manager_start(void) {
esp_err_t meter_manager_start(void)
{
esp_err_t err;
// Start EVSE meter
//err = meter_manager_evse_start();
//if (err != ESP_OK) return err;
// Start EVSE meter (habilite quando quiser)
// err = meter_manager_evse_start();
// if (err != ESP_OK) return err;
// Start GRID meter
err = meter_manager_grid_start();
if (err != ESP_OK) return err;
if (err != ESP_OK)
return err;
return ESP_OK;
}
/**
* @brief Stops all meters and unregisters event handlers.
*
@@ -153,153 +169,307 @@ esp_err_t meter_manager_start(void) {
*
* @return esp_err_t ESP_OK on success, or an error code.
*/
esp_err_t meter_manager_stop(void) {
esp_err_t meter_manager_stop(void)
{
esp_err_t err;
// Stop EVSE meter
//err = meter_manager_evse_stop();
//if (err != ESP_OK) return err;
// err = meter_manager_evse_stop();
// if (err != ESP_OK) return err;
// Stop GRID meter
err = meter_manager_grid_stop();
if (err != ESP_OK) return err;
if (err != ESP_OK)
return err;
return ESP_OK;
}
// ---------- EVSE ----------
// Função para inicializar o medidor EVSE
esp_err_t meter_manager_evse_init() {
esp_err_t meter_manager_evse_init()
{
esp_err_t err = load_or_init_meter_model(NVS_EVSE_MODEL, &meter_evse_type);
if (err != ESP_OK) return err;
if (err != ESP_OK)
return err;
ESP_LOGI(TAG, "Initializing EVSE meter of type %s", meter_type_to_str(meter_evse_type));
switch (meter_evse_type) {
case METER_TYPE_NONE: return ESP_OK;
case METER_TYPE_ADE7758: return meter_ade7758_init();
case METER_TYPE_ORNO513: return meter_orno513_init();
case METER_TYPE_ORNO516: return meter_orno516_init();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE: return meter_zigbee_init();
default: return ESP_ERR_INVALID_ARG;
switch (meter_evse_type)
{
case METER_TYPE_NONE:
return ESP_OK;
case METER_TYPE_ADE7758:
return meter_ade7758_init();
case METER_TYPE_ORNO513:
return meter_orno513_init();
case METER_TYPE_ORNO516:
return meter_orno516_init();
case METER_TYPE_ORNO526:
return meter_orno526_init();
case METER_TYPE_DTS6619:
return meter_dts6619_init();
case METER_TYPE_DDS661:
return meter_dds661_init();
case METER_TYPE_EA777:
return meter_ea777_init();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE:
return meter_zigbee_init();
default:
return ESP_ERR_INVALID_ARG;
}
}
esp_err_t meter_manager_grid_init() {
esp_err_t err = load_or_init_meter_model(NVS_GRID_MODEL, &meter_grid_type);
if (err != ESP_OK) return err;
ESP_LOGI(TAG, "Initializing GRID meter of type %s", meter_type_to_str(meter_grid_type));
switch (meter_grid_type) {
case METER_TYPE_NONE: return ESP_OK;
case METER_TYPE_ADE7758: return meter_ade7758_init();
case METER_TYPE_ORNO513: return meter_orno513_init();
case METER_TYPE_ORNO516: return meter_orno516_init();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE: return meter_zigbee_init();
default: return ESP_ERR_INVALID_ARG;
esp_err_t meter_manager_evse_start()
{
meter_type_t type = meter_manager_evse_get_model();
switch (type)
{
case METER_TYPE_NONE:
return ESP_OK;
case METER_TYPE_ADE7758:
return meter_ade7758_start();
case METER_TYPE_ORNO513:
return meter_orno513_start();
case METER_TYPE_ORNO516:
return meter_orno516_start();
case METER_TYPE_ORNO526:
return meter_orno526_start();
case METER_TYPE_DTS6619:
return meter_dts6619_start();
case METER_TYPE_DDS661:
return meter_dds661_start();
case METER_TYPE_EA777:
return meter_ea777_start();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE:
return meter_zigbee_start();
default:
return ESP_ERR_INVALID_ARG;
}
}
esp_err_t meter_manager_grid_start() {
meter_type_t type = meter_manager_grid_get_model();
switch (type) {
case METER_TYPE_NONE: return ESP_OK;
case METER_TYPE_ADE7758: return meter_ade7758_start();
case METER_TYPE_ORNO513: return meter_orno513_start();
case METER_TYPE_ORNO516: return meter_orno516_start();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE: return meter_zigbee_start();
default: return ESP_ERR_INVALID_ARG;
}
}
esp_err_t meter_manager_grid_stop(void) {
meter_type_t type = meter_manager_grid_get_model();
switch (type) {
case METER_TYPE_NONE: return ESP_OK;
case METER_TYPE_ADE7758: meter_ade7758_stop(); break;
case METER_TYPE_ORNO513: meter_orno513_stop(); break;
case METER_TYPE_ORNO516: meter_orno516_stop(); break;
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE: meter_zigbee_stop(); break;
default: return ESP_ERR_INVALID_ARG;
esp_err_t meter_manager_evse_stop(void)
{
meter_type_t type = meter_manager_evse_get_model();
switch (type)
{
case METER_TYPE_NONE:
return ESP_OK;
case METER_TYPE_ADE7758:
meter_ade7758_stop();
break;
case METER_TYPE_ORNO513:
meter_orno513_stop();
break;
case METER_TYPE_ORNO516:
meter_orno516_stop();
break;
case METER_TYPE_ORNO526:
meter_orno526_stop();
break;
case METER_TYPE_DTS6619:
meter_dts6619_stop();
break;
case METER_TYPE_DDS661:
meter_dds661_stop();
break;
case METER_TYPE_EA777:
meter_ea777_stop();
break;
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE:
meter_zigbee_stop();
break;
default:
return ESP_ERR_INVALID_ARG;
}
return ESP_OK;
}
// ---------- GRID ----------
esp_err_t meter_manager_evse_set_model(meter_type_t meter_type) {
esp_err_t meter_manager_grid_init()
{
esp_err_t err = load_or_init_meter_model(NVS_GRID_MODEL, &meter_grid_type);
if (err != ESP_OK)
return err;
ESP_LOGI(TAG, "Initializing GRID meter of type %s", meter_type_to_str(meter_grid_type));
switch (meter_grid_type) // corrigido: ORNO-513 -> driver orno513
{
case METER_TYPE_NONE:
return ESP_OK;
case METER_TYPE_ADE7758:
return meter_ade7758_init();
case METER_TYPE_ORNO513:
return meter_orno513_init();
case METER_TYPE_ORNO516:
return meter_orno516_init();
case METER_TYPE_ORNO526:
return meter_orno526_init();
case METER_TYPE_DTS6619:
return meter_dts6619_init();
case METER_TYPE_DDS661:
return meter_dds661_init();
case METER_TYPE_EA777:
return meter_ea777_init();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE:
return meter_zigbee_init();
default:
return ESP_ERR_INVALID_ARG;
}
}
esp_err_t meter_manager_grid_start()
{
meter_type_t type = meter_manager_grid_get_model();
switch (type)
{
case METER_TYPE_NONE:
return ESP_OK;
case METER_TYPE_ADE7758:
return meter_ade7758_start();
case METER_TYPE_ORNO513:
return meter_orno513_start(); // corrigido
case METER_TYPE_ORNO516:
return meter_orno516_start();
case METER_TYPE_ORNO526:
return meter_orno526_start();
case METER_TYPE_DTS6619:
return meter_dts6619_start();
case METER_TYPE_DDS661:
return meter_dds661_start();
case METER_TYPE_EA777:
return meter_ea777_start();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE:
return meter_zigbee_start();
default:
return ESP_ERR_INVALID_ARG;
}
}
esp_err_t meter_manager_grid_stop(void)
{
meter_type_t type = meter_manager_grid_get_model();
switch (type)
{
case METER_TYPE_NONE:
return ESP_OK;
case METER_TYPE_ADE7758:
meter_ade7758_stop();
break;
case METER_TYPE_ORNO513:
meter_orno513_stop(); // corrigido
break;
case METER_TYPE_ORNO516:
meter_orno516_stop();
break;
case METER_TYPE_ORNO526:
meter_orno526_stop();
break;
case METER_TYPE_DTS6619:
meter_dts6619_stop();
break;
case METER_TYPE_DDS661:
meter_dds661_stop();
break;
case METER_TYPE_EA777:
meter_ea777_stop();
break;
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE:
meter_zigbee_stop();
break;
default:
return ESP_ERR_INVALID_ARG;
}
return ESP_OK;
}
// ---------- Utilidades ----------
esp_err_t meter_manager_evse_set_model(meter_type_t meter_type)
{
meter_evse_type = meter_type;
return write_meter_model_to_nvs(NVS_EVSE_MODEL, meter_evse_type);
}
esp_err_t meter_manager_grid_set_model(meter_type_t meter_type) {
esp_err_t meter_manager_grid_set_model(meter_type_t meter_type)
{
meter_grid_type = meter_type;
return write_meter_model_to_nvs(NVS_GRID_MODEL, meter_grid_type);
}
esp_err_t meter_manager_evse_start() {
meter_type_t type = meter_manager_evse_get_model();
switch (type) {
case METER_TYPE_NONE: return ESP_OK;
case METER_TYPE_ADE7758: return meter_ade7758_start();
case METER_TYPE_ORNO513: return meter_orno513_start();
case METER_TYPE_ORNO516: return meter_orno516_start();
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE: return meter_zigbee_start();
default: return ESP_ERR_INVALID_ARG;
}
}
esp_err_t meter_manager_evse_stop(void) {
meter_type_t type = meter_manager_evse_get_model();
switch (type) {
case METER_TYPE_NONE: return ESP_OK;
case METER_TYPE_ADE7758: meter_ade7758_stop(); break;
case METER_TYPE_ORNO513: meter_orno513_stop(); break;
case METER_TYPE_ORNO516: meter_orno516_stop(); break;
case METER_TYPE_MONO_ZIGBEE:
case METER_TYPE_TRIF_ZIGBEE: meter_zigbee_stop(); break;
default: return ESP_ERR_INVALID_ARG;
}
return ESP_OK;
}
bool meter_manager_evse_is_enabled(void) {
bool meter_manager_evse_is_enabled(void)
{
return meter_manager_evse_get_model() != METER_TYPE_NONE;
}
meter_type_t meter_manager_evse_get_model(void) {
meter_type_t meter_manager_evse_get_model(void)
{
return meter_evse_type;
}
meter_type_t meter_manager_grid_get_model(void) {
meter_type_t meter_manager_grid_get_model(void)
{
return meter_grid_type;
}
const char* meter_type_to_str(meter_type_t type) {
switch (type) {
case METER_TYPE_NONE: return "NENHUM";
case METER_TYPE_ADE7758: return "IC ADE";
case METER_TYPE_ORNO513: return "ORNO-513";
case METER_TYPE_ORNO516: return "ORNO-516";
case METER_TYPE_MONO_ZIGBEE: return "MONO-ZIGBEE";
case METER_TYPE_TRIF_ZIGBEE: return "TRIF-ZIGBEE";
default: return "NENHUM";
const char *meter_type_to_str(meter_type_t type)
{
switch (type)
{
case METER_TYPE_NONE:
return "NENHUM";
case METER_TYPE_ADE7758:
return "IC ADE";
case METER_TYPE_ORNO513:
return "ORNO-513";
case METER_TYPE_ORNO516:
return "ORNO-516";
case METER_TYPE_ORNO526:
return "ORNO-526";
case METER_TYPE_DTS6619:
return "DTS-6619";
case METER_TYPE_DDS661:
return "DDS-661";
case METER_TYPE_MONO_ZIGBEE:
return "MONO-ZIGBEE";
case METER_TYPE_TRIF_ZIGBEE:
return "TRIF-ZIGBEE";
case METER_TYPE_EA777:
return "EA-777";
default:
return "NENHUM";
}
}
meter_type_t string_to_meter_type(const char *str) {
if (!str) return METER_TYPE_NONE;
if (strcmp(str, "IC ADE") == 0) return METER_TYPE_ADE7758;
if (strcmp(str, "ORNO-513") == 0) return METER_TYPE_ORNO513;
if (strcmp(str, "ORNO-516") == 0) return METER_TYPE_ORNO516;
if (strcmp(str, "MONO-ZIGBEE") == 0) return METER_TYPE_MONO_ZIGBEE;
if (strcmp(str, "TRIF-ZIGBEE") == 0) return METER_TYPE_TRIF_ZIGBEE;
meter_type_t string_to_meter_type(const char *str)
{
if (!str)
return METER_TYPE_NONE;
if (strcmp(str, "IC ADE") == 0)
return METER_TYPE_ADE7758;
if (strcmp(str, "ORNO-513") == 0)
return METER_TYPE_ORNO513;
if (strcmp(str, "ORNO-516") == 0)
return METER_TYPE_ORNO516;
if (strcmp(str, "ORNO-526") == 0)
return METER_TYPE_ORNO526;
if (strcmp(str, "DTS-6619") == 0)
return METER_TYPE_DTS6619;
if (strcmp(str, "DDS-661") == 0)
return METER_TYPE_DDS661;
if (strcmp(str, "MONO-ZIGBEE") == 0)
return METER_TYPE_MONO_ZIGBEE;
if (strcmp(str, "TRIF-ZIGBEE") == 0)
return METER_TYPE_TRIF_ZIGBEE;
if (strcmp(str, "EA-777") == 0)
return METER_TYPE_EA777;
return METER_TYPE_NONE;
}