# BACnet

> Conecte dispositivos de automação predial BACnet/IP: instância do dispositivo, endereçamento por tipo e instância de objeto, descoberta Who-Is e presentValue.

O driver **BACnet** conversa com equipamento de automação predial por BACnet/IP.
Toda tag lê o **valor presente** de um objeto BACnet: a leitura ao vivo de uma
entrada analógica, o estado de uma saída binária, a posição de um valor de
múltiplos estados. Adicione um dispositivo sob o driver BACnet no [Connector](connector); o
painel mostra só os campos que este protocolo usa.

## Conexão {#connection}

| Campo | Significado | Padrão |
| --- | --- | --- |
| **Host ou IP** | Endereço IP ou nome de host do dispositivo BACnet (ou do roteador que responde por ele). Um nome é resolvido para o seu endereço IPv4 quando o dispositivo conecta; um nome que este computador não consegue resolver deixa o dispositivo sem conexão, e o motivo diz isso. | vazio |
| **Porta** | Porta UDP do dispositivo, de 1 a 65535. Um campo vazio mostra 47808, o padrão do BACnet/IP, em cinza e o dispositivo é alcançado nela, que é também como se lê um dispositivo salvo com 0. | 47808 |
| **Id do dispositivo** | O número de instância do dispositivo, o número do objeto Device dele, único na rede BACnet. | 0 |

O cabeçalho do dispositivo mostra o endpoint montado, por exemplo
`bacnet://192.168.0.30:47808/1234`. Conectar envia uma requisição pelo tamanho
da lista de objetos do dispositivo para confirmar que o equipamento responde; a lista de objetos
em si não é percorrida. Essa resposta é a conexão: um dispositivo que não responde
fica offline em vez de aparecer como conectado, e o motivo (a porta UDP
já ocupada, um endereço que não é um endereço) é escrito na página Eventos
e no arquivo de log do dia. Não há campos de intervalo de leitura neste driver: as
tags dele são lidas uma vez por segundo.

## Endereçamento {#addressing}

Uma tag BACnet é endereçada por dois campos tipados no cartão Origem da tag, sem
endereço em texto livre:

| Campo | Significado | Valores aceitos | Padrão |
| --- | --- | --- | --- |
| **Tipo de objeto** | Que tipo de objeto BACnet ler. | os nove tipos abaixo | `AnalogInput` |
| **Instância** | O número de instância do objeto dentro do tipo dele. | 0 ou mais | 0 |

Os tipos de objeto oferecidos e os códigos de tipo padrão do BACnet:

| Tipo de objeto | Código | O valor presente guarda |
| --- | --- | --- |
| `AnalogInput` | 0 | um número medido |
| `AnalogOutput` | 1 | um número comandado |
| `AnalogValue` | 2 | um número guardado |
| `BinaryInput` | 3 | inativo/ativo |
| `BinaryOutput` | 4 | inativo/ativo |
| `BinaryValue` | 5 | inativo/ativo |
| `MultiStateInput` | 13 | um número de estado a partir de 1 |
| `MultiStateOutput` | 14 | um número de estado a partir de 1 |
| `MultiStateValue` | 19 | um número de estado a partir de 1 |

`AnalogInput` 5 no dispositivo 1234 significa "o valor presente da entrada analógica 5
daquele dispositivo". Toda leitura pede a propriedade `presentValue` do objeto; outras
propriedades não são endereçáveis. A linha somente leitura **Endereço de origem
(barramento)** do cartão Origem mostra o par `tipo,instância` montado enquanto você edita.

## Tipos de dado {#data-types}

O seletor de **Tipo de dado** oferece quatro tipos. Escolha o que corresponde ao objeto:

| Tipo de dado | Serve para | Notas |
| --- | --- | --- |
| Float | objetos analógicos | um valor presente Real; doubles são estreitados para Float |
| Boolean | objetos binários | um valor presente booleano, ou o 0 e o 1 enumerados com que um objeto binário responde |
| Int32 | múltiplos estados e outros valores inteiros | respostas com sinal, sem sinal e enumeradas chegam todas aqui |
| String | valores de cadeia de caracteres | texto como o dispositivo o envia |

O tipo escolhido tem de bater com o que o objeto guarda. Um dispositivo que responde com
outra coisa faz a leitura daquela tag falhar: a tag vai a qualidade ruim e o motivo
nomeia o que chegou ("O dispositivo respondeu um valor Single para um ponto declarado
Inteiro."), em vez de um número convertido entrar na tendência, no histórico e
nos alarmes. Ler um objeto analógico como booleano, ou um Real como Int32, é exatamente
esse caso. O resto do dispositivo segue lendo; nada é reconectado por causa de uma
tag com o tipo errado.

Uma tag cujo objeto o dispositivo não tem falha a leitura com a resposta do
próprio dispositivo: o motivo diz que o dispositivo não tem objeto naquele
endereço e nomeia o erro que ele enviou (`ERROR_CODE_UNKNOWN_OBJECT`), então um
endereço errado se distingue de um dispositivo que parou de responder. O
dispositivo continua conectado.

## Escritas {#writes}

Tags cujo **Acesso** é Leitura e escrita ou Somente escrita podem ser escritas. Uma escrita
define o `presentValue` do objeto no tipo que a norma BACnet dá a esse tipo de objeto,
qualquer que seja o tipo de dado da tag:

| Objeto | Escrito como | Aceita |
| --- | --- | --- |
| Entrada, saída ou valor binário | Enumerated | inativo (0) ou ativo (1), vindo de uma tag Boolean ou de um Int32 igual a 0 ou 1 |
| Entrada, saída ou valor de múltiplos estados | Unsigned | um número de estado a partir de 1 |
| Entrada, saída ou valor analógico | Real | um número vindo de uma tag Float ou Int32 |
| Qualquer outro tipo de objeto | o tipo de dado da tag | Float um Real, Boolean um Boolean, Int32 um inteiro com sinal, String uma cadeia de caracteres |

Nenhuma prioridade de comando é enviada com a escrita. Um valor que o objeto não comporta,
como 0 num objeto de múltiplos estados ou 2 num binário, é recusado antes de qualquer
envio, e a recusa diz o motivo. Quando o dispositivo responde à escrita com um erro, a tag
relata a classe e o código de erro que o dispositivo enviou em vez de fingir sucesso, e o
dispositivo continua conectado. Uma tag nova nasce como Somente leitura.

## Descoberta {#discovery}

O botão Descobrir do Connector faz difusão de um **Who-Is** do BACnet e escuta as
respostas **I-Am** por 10 segundos. Todo dispositivo que responde vira um candidato
que carrega o endereço, a porta e a instância de dispositivo dele, pronto para adicionar com os campos
de conexão preenchidos, e ele aparece na lista no instante em que responde, e não ao
fim dos dez segundos: uma varredura que você cancela no meio guarda tudo que já
tinha respondido. A varredura não navega objetos, então os candidatos chegam com zero
tags; acrescente você mesmo os pares de tipo e instância de objeto.

O Who-Is sai pela rede que o cartão **Escopo da varredura** indica. A caixa dele
recebe um endereço IPv4 dessa rede, o de um dispositivo ou o do próprio computador
nela (por exemplo `192.168.1.20`), e a varredura então faz difusão só nessa rede.
Vazia, o Who-Is sai por todas as redes deste computador, então um computador com
duas placas de rede, uma VPN ou o Docker acha os dispositivos de cada uma delas. O
que não for um endereço IPv4 escrito por inteiro é recusado embaixo da caixa, e
Descobrir fica cinza até ser corrigido.

Um dispositivo que responde **por um roteador BACnet** é adicionado do mesmo jeito. O
candidato dele carrega o endereço do roteador e, ao lado, a rede e o endereço do próprio
dispositivo naquela rede; os dois são guardados quando você o adiciona, e toda leitura é enviada
ao roteador nomeando o dispositivo lá dentro. Um dispositivo achado assim, portanto, lê
como qualquer outro, e o endpoint dele mostra "dispositivo via roteador". Um dispositivo adicionado à mão
não tem rota e é alcançado diretamente no host dele.

## Bom saber {#good-to-know}

- Só BACnet/IP: equipamento MS/TP ou BACnet/SC só é alcançável por um
  roteador que o apresente em BACnet/IP, e a varredura é o que o encontra: a rota
  em que um dispositivo responde é guardada da varredura, então adicione-o pela lista descoberta
  em vez de digitar os campos dele à mão.
- Num computador com várias interfaces de rede (duas placas de rede, uma VPN, o
  Docker), cada dispositivo é alcançado pela interface por onde este computador roteia
  o endereço dele, a mesma que qualquer outro programa daqui usaria; não há nada a
  escolher.
- Só o socket que escuta as mensagens dos dispositivos fica na porta UDP padrão
  47808 do BACnet nesta estação, e por isso outra aplicação BACnet que segure
  aquela porta com exclusividade no mesmo computador pode conflitar com ele. Os
  pedidos a um dispositivo saem de uma porta que o sistema escolhe para cada cliente.
- A leitura cíclica é fixa em um segundo para toda tag deste driver; os campos usuais de
  intervalo de leitura não são mostrados.
