> ## 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

> Montar a tela da portaria a partir do mural que a central curou — não de um filtro seu.

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

Montar a grade a partir dela é diferente de montar a partir de 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ê um número menor que a central vê no mesmo mural, e os
  dois números 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.** Foi alguém que 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 o mural inteiro de uma vez quando
  ele é grande. Cada emissão acorda uma sessão de vídeo, e o teto de mídia da chave
  é bem menor que o teto geral justamente por isso. Grade com rolagem: peça ao
  entrar na viewport, e 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 serve para dizer ao morador
que a câmera caiu.

Para o eixo de imagem — quem está sem quadro — a resposta 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. É muito mais barato que perguntar
por tile, e é a mesma resposta.

## 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 — o
poster é enfeite, e 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 mural continua sendo da central,
no console — porque o mural É a decisão de operação, e ela pertence a quem
responde pelo turno.
