# Deploy 2026‑07 — Atualização do Nexus (banco + código + tarefas)

Runbook desta versão. A base atual (`controle_veiculos`, **MariaDB 5.5.68**) foi
conferida contra o schema canônico: **nenhuma coluna existente muda** — só entram
**13 tabelas novas** (automação + vídeo). O passo de banco é **100 % aditivo**.

## O que esta versão adiciona

- **Módulo de Automação** (dispositivos, cômodos, canais eWeLink/Tuya/HTTP, cenas,
  agendas, água/cisterna) — tabelas `auto_*`.
- **Controle por morador**: painel **Minha Casa** (`/casa`) e atribuição de acessos
  (`/automation/access`) — tabela `auto_device_pessoa`.
- **Minha Foto** (`/minha-foto`): o morador atualiza a própria foto com QA do InControl.
- **Histórico de acionamentos** por morador.
- **Vídeo ao vivo** das câmeras (go2rtc) — tabela `video_camera` (opcional).

Tabelas criadas: `video_camera`, `auto_room`, `auto_account`, `auto_device`,
`auto_scene`, `auto_scene_device`, `auto_schedule`, `auto_sun`, `auto_water`,
`auto_water_param`, `auto_setting`, `auto_event`, `auto_device_pessoa`.

> **Interruptor de automação (novo):** a tabela `auto_setting` guarda o liga/desliga
> do **motor** de automação — geral + por subsistema (Água/hidráulica e
> Agendas/elétrica). Serve para (a) subir o novo sistema em paralelo com o antigo
> sem acionar nada e (b) manutenções. Ver "Migração em paralelo" abaixo.

> **Nota de compatibilidade (importante):** o servidor é MariaDB 5.5, que **não**
> aceita `DATETIME DEFAULT CURRENT_TIMESTAMP`. As tabelas novas com data automática
> (`auto_water.data`, `auto_event.data`, `auto_device_pessoa.criado_em`) usam
> `TIMESTAMP DEFAULT CURRENT_TIMESTAMP`. O script já vem corrigido — não altere.

---

## Ordem do deploy

1. Backup do banco.
2. Rodar o script de atualização do banco.
3. Publicar o código novo.
4. Conferir o `.env` (chaves novas).
5. (Opcional) Importar o inventário da automação antiga.
6. Registrar as tarefas agendadas (Agendador do Windows).
7. (Opcional) Subir o vídeo (go2rtc).
8. Verificação pós‑deploy.

---

## Passo 1 — Backup (sempre)

No servidor (ou de onde alcança o MariaDB `172.16.0.100`):

```bat
mysqldump -h 172.16.0.100 -u USUARIO -p --single-transaction --routines ^
  controle_veiculos > C:\backups\controle_veiculos_ANTES_2026-07.sql
```

Guarde esse arquivo — é o seu rollback do banco.

## Passo 2 — Atualizar o banco

O script fica em `api/database/update_20260703.sql`. É **idempotente**
(`CREATE TABLE IF NOT EXISTS` + `INSERT IGNORE`) — pode rodar mais de uma vez.

```bat
mysql -h 172.16.0.100 -u USUARIO -p controle_veiculos < C:\wamp64\www\api\database\update_20260703.sql
```

Confira que as 12 tabelas de automação nasceram (deve retornar **12**):

```sql
SELECT COUNT(*) FROM information_schema.TABLES
 WHERE TABLE_SCHEMA = 'controle_veiculos' AND TABLE_NAME LIKE 'auto_%';
```

E o vídeo (deve retornar **1**):

```sql
SELECT COUNT(*) FROM information_schema.TABLES
 WHERE TABLE_SCHEMA = 'controle_veiculos' AND TABLE_NAME = 'video_camera';
```

> Base nova (do zero), em vez de atualizar: rode `api/database/schema.sql` (já é
> canônico e inclui tudo). O `update_20260703.sql` é só para **esta** base existente.

## Passo 3 — Publicar o código

1. Copie os arquivos novos/alterados para `C:\wamp64\www\` (mantém a estrutura
   `app/`, `api/`, `public/`).
2. Confirme o PHP do servidor: `C:\wamp64\bin\php\php8.3.28\php.exe -v` (deve ser 8.3).
3. Rode o verificador estático **no servidor** (tem PHP 8.3 → faz `php -l` em tudo):

   ```bat
   "C:\wamp64\bin\php\php8.3.28\php.exe" C:\wamp64\www\api\scripts\static_check.php
   ```

   Tem que terminar **sem erros** (sintaxe, rotas→métodos, permissões, views,
   placeholders, tabelas). Se acusar algo, **não conclua o deploy**.

## Passo 4 — Conferir o `.env`

As chaves de banco/InControl já existem em produção. Confira/defina as **novas**
(todas têm padrão seguro; vazio não quebra a tela, só desliga o recurso):

```ini
; Automação — sol/agendas (nascer/pôr do sol e agendas SUNRISE/SUNSET)
AUTOMACAO_LAT=-23.55
AUTOMACAO_LNG=-46.63
AUTOMACAO_TZ=America/Sao_Paulo

; Automação — água/cisterna (controlador HTTP da caixa; retenção do histórico)
AUTOMACAO_WATER_URL=http://172.16.2.7/
AUTOMACAO_WATER_RETENTION=90

; Alertas (Pushover) — vazio = só registra no log, não envia push
PUSHOVER_TOKEN=
PUSHOVER_USER=

; Vídeo ao vivo (go2rtc) — só se for usar /live
GO2RTC_BASE_URL=http://127.0.0.1:1984
```

> A URL do controlador da água também pode ser ajustada pela tela
> (`/automation/water` → parâmetros), que grava em `auto_water_param.controller_url`.
> O seed inicial já entra com `http://172.16.2.7/`.

## Passo 5 — Importar o inventário da automação antiga (opcional)

Traz cômodos + dispositivos + histórico de água do banco legado `nexus`:

```bat
C:\wamp64\www\api\scripts\import_automacao.bat --host=172.16.0.100 --db=nexus --user=root --pass=SENHA
```

Use `--append` para reimportar sem apagar. Depois, revise em `/automation/devices`
e associe cada dispositivo de nuvem a um **canal** em `/automation/accounts`.

## Migração em paralelo (rodar o novo ao lado do antigo)

Enquanto o **sistema antigo ainda controla os dispositivos**, suba o novo com o
**motor de automação DESABILITADO** — assim os workers do novo não disputam os
mesmos aparelhos. Você ainda vê tudo (status, água, telas) e pode testar acionando
**manualmente**.

1. **Desabilite a automação** (uma das opções):
   - Tela: `/automation` → card **Estado da automação** → **Desabilitar** o geral.
   - SQL: `UPDATE auto_setting SET valor='0' WHERE id='automation_enabled';`
2. Registre os workers (Passo 6) e **cheque tudo** com calma.
3. No **cutover**: desligue o sistema antigo e **Habilite** a automação geral
   (mesmo card, ou `valor='1'`). A partir daí o novo assume os automatismos.

> O `auto_poll` (status) e o `auto_sun` (horário do sol) **seguem rodando** mesmo
> desabilitado — leem, não acionam. Por isso o painel mostra o estado ao vivo
> durante a checagem. Água e Agendas ficam pausadas; a bomba/leituras de nível
> continuam sendo **lidas** (sem comandar a bomba).

**Manutenção elétrica/hidráulica:** use os interruptores por subsistema —
**Água/cisterna** (hidráulica) ou **Agendas/dispositivos** (elétrica) — para pausar
só o que for mexer, sem parar o resto.

## Passo 6 — Tarefas agendadas (Agendador do Windows)

O detalhe passo‑a‑passo (GUI e cuidados) está em
[`INSTALACAO-TAREFAS.md`](INSTALACAO-TAREFAS.md). Abaixo, o bloco pronto para colar
num **cmd como Administrador**. Antes, confira o caminho do PHP dentro de cada
`.bat` (`set "PHP=..."`).

```bat
REM ---- Contínuo: monitor de eventos (InControl WSS -> banco) ----
schtasks /Create /TN "Nexus - Monitor Bridge" /TR "C:\wamp64\www\api\scripts\monitor_bridge.bat" /SC ONSTART /RU SYSTEM /RL HIGHEST /F

REM ---- Motor da automação (NOVO) ----
schtasks /Create /TN "Nexus - Auto Poll"     /TR "C:\wamp64\www\api\scripts\auto_poll.bat"     /SC MINUTE /MO 1  /RU SYSTEM /RL HIGHEST /F
schtasks /Create /TN "Nexus - Auto Water"    /TR "C:\wamp64\www\api\scripts\auto_water.bat"    /SC MINUTE /MO 2  /RU SYSTEM /RL HIGHEST /F
schtasks /Create /TN "Nexus - Auto Schedule" /TR "C:\wamp64\www\api\scripts\auto_schedule.bat" /SC MINUTE /MO 1  /RU SYSTEM /RL HIGHEST /F
schtasks /Create /TN "Nexus - Auto Alert"    /TR "C:\wamp64\www\api\scripts\auto_alert.bat"    /SC MINUTE /MO 5  /RU SYSTEM /RL HIGHEST /F
schtasks /Create /TN "Nexus - Auto Sun"      /TR "C:\wamp64\www\api\scripts\auto_sun.bat"      /SC DAILY  /ST 01:00 /RU SYSTEM /RL HIGHEST /F

REM ---- Eventos + retenção (já existentes; recrie se necessário) ----
schtasks /Create /TN "Nexus - Import Events"   /TR "C:\wamp64\www\api\scripts\import_events.bat"     /SC MINUTE /MO 15 /RU SYSTEM /RL HIGHEST /F
schtasks /Create /TN "Nexus - Retencao Diaria" /TR "C:\wamp64\www\api\scripts\retention_cleanup.bat" /SC DAILY  /ST 03:00 /RU SYSTEM /RL HIGHEST /F

REM ---- Vídeo ao vivo (OPCIONAL) ----
schtasks /Create /TN "Nexus - go2rtc" /TR "C:\wamp64\www\api\scripts\go2rtc.bat" /SC ONSTART /RU SYSTEM /RL HIGHEST /F
```

> **Cuidado com os dois jobs contínuos** (`Monitor Bridge` e `go2rtc`): no Agendador,
> abra cada um → aba **Configurações** → **desmarque** "Interromper a tarefa se ela
> for executada por mais de…" (o padrão de 3 dias mataria o worker) e em "Se a tarefa
> já estiver em execução" escolha **Não iniciar uma nova instância**. Depois clique
> **Executar** para subir agora sem reiniciar a máquina.

Backfill inicial dos eventos (uma vez, pode demorar):

```bat
C:\wamp64\www\api\scripts\import_events.bat --all
```

## Passo 7 — Vídeo ao vivo (opcional)

Se for usar `/live`, siga [`INTEGRACAO-VIDEO-GO2RTC.md`](INTEGRACAO-VIDEO-GO2RTC.md):
baixar o `go2rtc.exe`, exportar o `go2rtc.yaml` pela tela de Câmeras de vídeo e
registrar o `go2rtc.bat` (já incluído no bloco acima). Sem isso, o resto do sistema
funciona normalmente.

## Passo 8 — Verificação pós‑deploy

- **Automação (gestão):** `/automation` abre, lista dispositivos, liga/desliga responde.
- **Água:** `/automation/water` mostra o tanque e o gráfico; "Ler agora" retorna nível.
- **Morador:** logar como `morador` → **Minha Casa** (`/casa`) mostra só os
  dispositivos atribuídos; **Minha Foto** (`/minha-foto`) abre a câmera e valida.
- **Acessos:** `/automation/access` — escolher um morador, marcar dispositivos, salvar.
- **Sino:** o ícone de notificações no topo responde (`/notifications`).
- **Workers:** confira os logs em `C:\wamp64\www\logs\` (`auto_poll.log`,
  `auto_water.log`, etc.) crescendo sem erro.

```sql
-- Sanidade: leituras de água e eventos começam a aparecer
SELECT COUNT(*) FROM auto_water;
SELECT COUNT(*) FROM auto_event;
```

---

## Rollback

- **Código:** restaure a versão anterior de `C:\wamp64\www\`.
- **Tarefas novas:** remova‑as se necessário —
  `schtasks /Delete /TN "Nexus - Auto Poll" /F` (idem para as outras).
- **Banco:** as tabelas novas são isoladas (nada nas antigas foi tocado). Para
  desfazer por completo, com backup em mãos, é seguro:

  ```sql
  SET FOREIGN_KEY_CHECKS=0;
  DROP TABLE IF EXISTS auto_device_pessoa, auto_event, auto_setting, auto_water_param,
    auto_water, auto_sun, auto_schedule, auto_scene_device, auto_scene, auto_device,
    auto_account, auto_room, video_camera;
  SET FOREIGN_KEY_CHECKS=1;
  ```

  Como o passo de banco é aditivo, na prática basta voltar o código — as tabelas
  novas podem ficar sem uso sem afetar o sistema antigo.

---

## Resumo dos jobs

| Tarefa | `.bat` | Agenda | Novo? |
|--------|--------|--------|-------|
| Monitor Bridge (eventos WSS) | `monitor_bridge.bat` | Ao inicializar (contínuo) | — |
| Auto Poll (status dos dispositivos) | `auto_poll.bat` | A cada 1 min | ✅ |
| Auto Water (cisterna/bomba) | `auto_water.bat` | A cada 2 min | ✅ |
| Auto Schedule (agendas) | `auto_schedule.bat` | A cada 1 min | ✅ |
| Auto Alert (Pushover) | `auto_alert.bat` | A cada 5 min | ✅ |
| Auto Sun (nascer/pôr do sol) | `auto_sun.bat` | Diário 01:00 | ✅ |
| Import Events (histórico) | `import_events.bat` | A cada 15 min | — |
| Retenção diária | `retention_cleanup.bat` | Diário 03:00 | — |
| go2rtc (vídeo) | `go2rtc.bat` | Ao inicializar (contínuo) | ✅ (opc.) |
