87 lines
3.6 KiB
C
87 lines
3.6 KiB
C
#include "dashboard_api.h"
|
|
#include "esp_log.h"
|
|
#include "cJSON.h"
|
|
#include "evse_api.h"
|
|
#include "evse_error.h"
|
|
#include "evse_config.h"
|
|
#include "evse_limits.h"
|
|
|
|
|
|
static const char *TAG = "dashboard_api";
|
|
|
|
static esp_err_t dashboard_get_handler(httpd_req_t *req) {
|
|
httpd_resp_set_type(req, "application/json");
|
|
|
|
// Cria o objeto JSON principal do dashboard
|
|
cJSON *dashboard = cJSON_CreateObject();
|
|
|
|
// Status do sistema
|
|
evse_state_t state = evse_get_state();
|
|
cJSON_AddStringToObject(dashboard, "status", evse_state_to_str(state));
|
|
|
|
// Carregador - informação do carregador 1 (adapte conforme necessário)
|
|
cJSON *chargers = cJSON_CreateArray();
|
|
cJSON *charger1 = cJSON_CreateObject();
|
|
cJSON_AddNumberToObject(charger1, "id", 1);
|
|
cJSON_AddStringToObject(charger1, "status", evse_state_to_str(state));
|
|
cJSON_AddNumberToObject(charger1, "current", evse_get_charging_current());
|
|
cJSON_AddNumberToObject(charger1, "maxCurrent", evse_get_max_charging_current());
|
|
|
|
// Calcular a potência com base na corrente (considerando 230V)
|
|
int power = (evse_get_charging_current()) * 230;
|
|
cJSON_AddNumberToObject(charger1, "power", power);
|
|
|
|
cJSON_AddItemToArray(chargers, charger1);
|
|
cJSON_AddItemToObject(dashboard, "chargers", chargers);
|
|
|
|
// Consumo e tempo de carregamento
|
|
cJSON_AddNumberToObject(dashboard, "energyConsumed", evse_get_consumption_limit());
|
|
cJSON_AddNumberToObject(dashboard, "chargingTime", evse_get_charging_time_limit());
|
|
|
|
// Alertas
|
|
cJSON *alerts = cJSON_CreateArray();
|
|
if (evse_is_limit_reached()) {
|
|
cJSON_AddItemToArray(alerts, cJSON_CreateString("Limite de consumo atingido."));
|
|
}
|
|
if (!evse_config_is_available()) {
|
|
cJSON_AddItemToArray(alerts, cJSON_CreateString("Estação indisponível."));
|
|
}
|
|
if (!evse_config_is_enabled()) {
|
|
cJSON_AddItemToArray(alerts, cJSON_CreateString("EVSE desativado."));
|
|
}
|
|
cJSON_AddItemToObject(dashboard, "alerts", alerts);
|
|
|
|
// Erros
|
|
uint32_t error_bits = evse_get_error();
|
|
cJSON *errors = cJSON_CreateArray();
|
|
if (error_bits & EVSE_ERR_DIODE_SHORT_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Diodo curto-circuitado"));
|
|
if (error_bits & EVSE_ERR_LOCK_FAULT_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Falha no travamento"));
|
|
if (error_bits & EVSE_ERR_UNLOCK_FAULT_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Falha no destravamento"));
|
|
if (error_bits & EVSE_ERR_RCM_SELFTEST_FAULT_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Falha no autoteste do RCM"));
|
|
if (error_bits & EVSE_ERR_RCM_TRIGGERED_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("RCM disparado"));
|
|
if (error_bits & EVSE_ERR_TEMPERATURE_HIGH_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Temperatura elevada"));
|
|
if (error_bits & EVSE_ERR_PILOT_FAULT_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Erro no sinal piloto"));
|
|
if (error_bits & EVSE_ERR_TEMPERATURE_FAULT_BIT) cJSON_AddItemToArray(errors, cJSON_CreateString("Falha no sensor de temperatura"));
|
|
cJSON_AddItemToObject(dashboard, "errors", errors);
|
|
|
|
// Enviar resposta JSON
|
|
const char *json_str = cJSON_Print(dashboard);
|
|
httpd_resp_sendstr(req, json_str);
|
|
|
|
// Liberar memória
|
|
free((void *)json_str);
|
|
cJSON_Delete(dashboard);
|
|
|
|
return ESP_OK;
|
|
}
|
|
|
|
void register_dashboard_handlers(httpd_handle_t server, void *ctx) {
|
|
httpd_uri_t uri = {
|
|
.uri = "/api/v1/dashboard",
|
|
.method = HTTP_GET,
|
|
.handler = dashboard_get_handler,
|
|
.user_ctx = ctx
|
|
};
|
|
httpd_register_uri_handler(server, &uri);
|
|
}
|