> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pictor.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# A grade do condomínio

> A tela da portaria sai do mural curado, não de um filtro seu.

Um mural é uma seleção **curada por gente**: "Portaria", "Ronda Noturna",
"Perímetro". Ele carrega a decisão de quem responde pelo turno: qual câmera
importa, e em que ordem.

É diferente de montar a grade com um filtro seu. O filtro devolve todas as
câmeras do local, e a portaria não olha todas as câmeras do local.

## Listar

```bash theme={null}
curl -s -H "Authorization: Bearer $PICTOR_KEY" "$PICTOR_API/api/video-walls"
```

```json theme={null}
{
  "data": [
    {
      "video_wall_id": "3c1a…",
      "name": "Portaria — Alvorada",
      "owner_kind": "client",
      "client_id": "…",
      "is_active": true,
      "device_count": 6
    },
    { "video_wall_id": "77bd…", "name": "Ronda Noturna", "owner_kind": "tenant", "device_count": 12 }
  ]
}
```

`owner_kind` diz para quem o mural foi montado: **`client`** é do condomínio,
**`tenant`** é operacional da central e aparece para todo mundo por desenho.

<Tip>
  `device_count` é a contagem do que **esta chave** veria ao abrir. Uma chave
  recortada a um cliente vê número menor que a central vê no mesmo mural, e os dois
  estão certos. Não trate a diferença como erro de dado.
</Tip>

## Abrir, e montar a tela

Uma chamada traz tudo o que a grade precisa:

```bash theme={null}
curl -s -H "Authorization: Bearer $PICTOR_KEY" \
  "$PICTOR_API/api/video-walls/3c1a…"
```

```json theme={null}
{
  "video_wall_id": "3c1a…",
  "name": "Portaria — Alvorada",
  "device_count": 6,
  "devices": [
    {
      "device_uuid": "0b8f…",
      "device_id": "G87232574",
      "name": "Guarita - entrada",
      "status": "online",
      "thumbnail_url": "/api/thumbs/G87232574"
    }
  ]
}
```

<Warning>
  **A ordem de `devices` é informação de operação.** Alguém a definiu, e o operador
  do turno da noite conta com ela para achar a câmera sem procurar. Não reordene
  por nome.
</Warning>

## Do mural ao vídeo

```js theme={null}
async function abrirMural(wallId) {
  // 1. Uma chamada monta a grade inteira: nome, ordem, situação de cada tile.
  const mural = await meuBackend(`/murais/${wallId}`);
  renderizarGrade(mural.devices);   // desenhe os tiles JÁ, com o nome

  // 2. Só então peça o vídeo — e só dos tiles que estão visíveis.
  //    Pedir para os 6 de uma vez está bem; pedir para 40 não está.
  for (const tile of visiveis(mural.devices)) {
    const { whep_url, hls_url } = await meuBackend(`/cameras/${tile.device_id}/url`);
    tocar(tile, whep_url, hls_url);   // ver "Mostrar a câmera ao vivo"
  }
}
```

<Warning>
  Peça o vídeo **por tile visível**, nunca para um mural grande de uma vez. Cada
  emissão acorda uma sessão de vídeo, e é por isso que o teto de mídia é menor que
  o geral. Grade com rolagem: peça ao entrar na viewport, solte ao sair.
</Warning>

## O `status` do tile, e o que ele não é

`status` no mural é o de **cadastro**, não "está transmitindo agora". Serve para
pintar o tile de cinza antes de o vídeo carregar, não para dizer ao morador que a
câmera caiu.

Quem está sem imagem vem da frota, numa chamada só:

```bash theme={null}
curl -s -H "Authorization: Bearer $PICTOR_KEY" \
  "$PICTOR_API/api/devices?transmitting=no&limit=500"
```

Cruze o resultado com os `device_id` do mural: mesma resposta, muito mais
barato que perguntar por tile.

## O poster do tile

`thumbnail_url` é um caminho relativo do console. Para o seu lado, use a rota de
quadro com a sua chave:

```bash theme={null}
curl -s -H "Authorization: Bearer $PICTOR_KEY" \
  "$PICTOR_API/api/devices/G87232574/thumbnail" --output poster.jpg
```

Ela devolve o último quadro (JPEG) e **não acorda a câmera**: sem quadro recente,
`404`, e o tile fica com o seu placeholder. É o que você quer numa grade, porque
enfeite não pode abrir sessão em equipamento.

O cabeçalho `X-Thumbnail-Source` diz se o quadro é `live` ou `cache`.

## Criar mural

Não pela API. Criar, renomear, reordenar e apagar continua no console da central,
porque o mural é a decisão de operação de quem responde pelo turno.
