# Arquitetura do H2O Remote Manager

## Decisão de comunicação

A base usa HTTPS REST com polling iniciado pela ESP32. Esse modelo funciona em hospedagem cPanel convencional porque cada troca é uma requisição PHP curta, sem processo residente ou porta adicional.

WebSockets não são requisito da primeira versão. Eles dependem de suporte a aplicação persistente, proxy e configuração do provedor. MQTT é o caminho recomendado para uma futura infraestrutura dedicada ou broker gerenciado, mas não deve ser acoplado ao cPanel compartilhado.

## Fluxo

```text
ESP32-S3
  -> HTTPS POST /api/v1/device/exchange
  -> autenticação HMAC, timestamp e nonce
  -> telemetria e estado reportado no MySQL
  <- comandos pendentes e configuração desejada
  -> execução local pela máquina de estados
  -> ACK/NACK na próxima troca
```

## Segurança

- HTTPS obrigatório.
- CA validada pela Controller.
- segredo individual por dispositivo.
- HMAC-SHA256 sobre método, path, timestamp, nonce e hash do corpo.
- prevenção de replay por nonce único.
- segredos criptografados no banco com AES-256-GCM e `APP_KEY` externa.
- sessão administrativa com cookies Secure, HttpOnly e SameSite Strict.
- CSRF em mutações.
- comandos com allowlist e TTL.
- nenhuma escrita remota direta em GPIO.

## Estado desejado e reportado

O servidor cria uma revisão de configuração desejada. A Controller recebe, valida e aplica transacionalmente. A revisão reportada só avança após confirmação local. Isso permite detectar equipamentos atrasados, falhas e conflitos.

## Status de conexão

- Online: último contato dentro de 90 segundos.
- Instável: entre 90 e 300 segundos.
- Offline: acima de 300 segundos.

Os intervalos são configuráveis no `.env`.
