REST API¶
A app api expõe endpoints REST via Django REST Framework para o app Flet consumir.
Autenticação¶
Token-based (DRF TokenAuthentication). Todo request autenticado deve incluir:
Authorization: Token <token>
O token é obtido via POST /api/auth/token/ com e-mail e senha.
Todos os endpoints retornam somente dados do usuário autenticado (escopo por owner.effective_owner). Tentar acessar dado de outro usuário retorna 403 ou 404.
Contas visualizadoras: tokens de contas visualizadoras (somente-leitura, ver PRD.md seção 6.11) autenticam normalmente e leem os dados do owner vinculado, mas todo endpoint de escrita (POST/PUT/PATCH/DELETE) retorna 403 Forbidden para essas contas (api.permissions.DenyViewerWrite).
Endpoints¶
Autenticação¶
| Método | Rota | Descrição |
|---|---|---|
POST |
/api/auth/token/ |
Autentica por e-mail e senha; retorna o token |
Body:
{ "email": "usuario@email.com", "password": "senha" }
Resposta 200:
{ "token": "abc123..." }
Medidores¶
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/meters/ |
Lista os medidores do usuário e seus status |
GET |
/api/meters/{id}/ |
Detalha um medidor |
Telemetria¶
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/meters/{id}/readings/ |
Leituras do medidor (filtráveis por período) |
GET |
/api/meters/{id}/summary/ |
KPIs: potência atual (W), kWh do ciclo, custo estimado (R$) |
Query params para /readings/:
| Param | Tipo | Exemplo |
|---|---|---|
start |
date |
2026-06-01 |
end |
date |
2026-06-30 |
Tarifas¶
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/tariffs/ |
Lista as tarifas do usuário |
POST |
/api/tariffs/ |
Cria uma tarifa |
PUT |
/api/tariffs/{id}/ |
Atualiza uma tarifa |
DELETE |
/api/tariffs/{id}/ |
Remove uma tarifa (204 No Content) |
Tarifa branca (postos horários — Sprint 16): quando is_white: true, o corpo da requisição deve incluir rate_source, rate_source_date e o campo extra time_slots (lista de exatamente 3 postos — não faz parte dos campos do model, tratado à parte na view):
{
"name": "Tarifa Branca CELESC",
"price_per_kwh": "1.0000",
"flag_color": "green",
"flag_extra_cost": "0",
"taxes_percent": "0",
"is_active": true,
"is_white": true,
"rate_source": "Resolução Homologatória ANEEL nº 1234/2026",
"rate_source_date": "2026-01-01",
"time_slots": [
{ "period_type": "peak", "start_time": "18:00:00", "end_time": "21:00:00", "price_per_kwh": "2.0000" },
{ "period_type": "intermediate", "start_time": "21:00:00", "end_time": "22:30:00", "price_per_kwh": "1.5000" },
{ "period_type": "off_peak", "start_time": "22:30:00", "end_time": "18:00:00", "price_per_kwh": "0.5000" }
]
}
A resposta (e o GET /api/tariffs/) sempre inclui time_slots (lista, vazia para tarifas não-brancas) com id, period_type, period_type_display, start_time, end_time, price_per_kwh.
Analytics (IA)¶
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/meters/{id}/forecast/ |
Previsão de fatura: kWh estimado, custo em R$ e confiança (404 se não houver previsão gerada ainda) |
POST |
/api/meters/{id}/forecast/ |
Gera uma nova previsão de fatura sob demanda (201 Created) |
GET |
/api/meters/{id}/disaggregation/ |
Composição de consumo por aparelho (NILM) |
GET |
/api/meters/{id}/usage-suggestions/ |
Recomendação de horário de uso (Sprint 17) — melhor posto por aparelho conhecido, com base na tarifa branca ativa. Lista vazia sem tarifa branca ativa ou sem aparelhos conhecidos. |
Resposta de /usage-suggestions/:
[
{
"appliance_id": 3,
"appliance_name": "Chuveiro Elétrico",
"recommended_period_type": "off_peak",
"recommended_period_display": "Fora de Ponta",
"recommended_start": "22:30:00",
"recommended_end": "18:00:00",
"worst_period_display": "Ponta",
"usage_hours": 1.0,
"kwh_per_use": 5.0,
"cost_at_recommended": 2.5,
"cost_at_worst": 10.0,
"estimated_savings": 7.5
}
]
Códigos de resposta¶
| Código | Situação |
|---|---|
200 |
OK |
201 |
Criado |
400 |
Dados inválidos |
401 |
Sem autenticação ou token inválido |
403 / 404 |
Recurso de outro usuário |