# BACnet

> Conectar dispositivos de automatización de edificios BACnet/IP: instancia de dispositivo, direccionamiento por tipo e instancia de objeto, descubrimiento Who-Is y presentValue.

El controlador **BACnet** habla con equipos de automatización de edificios por BACnet/IP. Cada tag lee el **valor presente** de un objeto BACnet: la lectura en vivo de una entrada analógica, el estado de una salida binaria, la posición de un valor multiestado. Añada un dispositivo bajo el controlador BACnet en el [Connector](connector); el panel muestra solo los campos que usa este protocolo.

## Conexión {#connection}

| Campo | Significado | Por defecto |
| --- | --- | --- |
| **Host o IP** | Dirección IP o nombre de host del dispositivo BACnet (o del enrutador que responde por él). Un nombre se resuelve a su dirección IPv4 cuando el dispositivo se conecta; un nombre que este ordenador no puede resolver deja el dispositivo sin conexión, y el motivo lo dice. | vacío |
| **Puerto** | Puerto UDP del dispositivo, de 1 a 65535. Un campo vacío muestra 47808, el estándar de BACnet/IP, en gris y se llega al dispositivo por él, que es también como se lee un dispositivo guardado con 0. | 47808 |
| **Id del dispositivo** | El número de instancia del dispositivo: el número de su objeto Device, único en la red BACnet. | 0 |

La cabecera del dispositivo muestra el endpoint ya compuesto, por ejemplo `bacnet://192.168.0.30:47808/1234`. Conectar envía una petición del tamaño de la lista de objetos del dispositivo para confirmar que el equipo responde; la lista de objetos en sí no se recorre. Esa respuesta es la conexión: un dispositivo que no contesta se queda sin conexión en lugar de aparecer como conectado, y el motivo (el puerto UDP ya ocupado, una dirección que no es una dirección) se escribe en la página Eventos y en el archivo de registro del día. Este controlador no tiene campos de intervalo de sondeo: sus tags se leen una vez por segundo.

## Direccionamiento {#addressing}

Un tag BACnet se direcciona con dos campos tipados de la tarjeta Fuente del tag, sin ninguna dirección de texto libre:

| Campo | Significado | Valores aceptados | Por defecto |
| --- | --- | --- | --- |
| **Tipo de objeto** | Qué clase de objeto BACnet se va a leer. | los nueve tipos de abajo | `AnalogInput` |
| **Instancia** | El número de instancia del objeto dentro de su tipo. | 0 en adelante | 0 |

Los tipos de objeto ofrecidos y sus códigos de tipo BACnet estándar:

| Tipo de objeto | Código | El valor presente contiene |
| --- | --- | --- |
| `AnalogInput` | 0 | un número medido |
| `AnalogOutput` | 1 | un número ordenado |
| `AnalogValue` | 2 | un número guardado |
| `BinaryInput` | 3 | inactivo/activo |
| `BinaryOutput` | 4 | inactivo/activo |
| `BinaryValue` | 5 | inactivo/activo |
| `MultiStateInput` | 13 | un número de estado a partir de 1 |
| `MultiStateOutput` | 14 | un número de estado a partir de 1 |
| `MultiStateValue` | 19 | un número de estado a partir de 1 |

`AnalogInput` 5 en el dispositivo 1234 significa "el valor presente de la entrada analógica 5 de ese dispositivo". Cada lectura pide la propiedad `presentValue` del objeto; las demás propiedades no son direccionables. La línea de solo lectura **Dirección de origen (bus)** de la tarjeta Fuente muestra la pareja `type,instance` ya compuesta mientras se edita.

## Tipos de dato {#data-types}

El selector **Tipo de dato** ofrece cuatro tipos. Elija el que se corresponda con el objeto:

| Tipo de dato | Encaja con | Notas |
| --- | --- | --- |
| Float | los objetos analógicos | un valor presente Real; los double se estrechan a Float |
| Boolean | los objetos binarios | un valor presente Boolean, o el 0 y el 1 enumerados con los que contesta un objeto binario |
| Int32 | los valores multiestado y otros valores enteros | las respuestas con signo, sin signo y enumeradas llegan todas aquí |
| String | los valores de cadena de caracteres | el texto tal como lo envía el dispositivo |

El tipo elegido tiene que coincidir con lo que contiene el objeto. Un dispositivo que responde con otra cosa hace fallar la lectura de ese tag: el tag pasa a mala calidad y el motivo nombra lo que llegó ("El dispositivo respondió un valor Single para un punto declarado Integer."), en lugar de dejar que entre un número convertido en la tendencia, en el histórico y en las alarmas. Leer un objeto analógico como Boolean, o un Real como Int32, es exactamente ese caso. El resto del dispositivo sigue leyendo; nada se reconecta por un tag cuyo tipo está equivocado.

Un tag cuyo objeto el dispositivo no tiene falla su lectura con la respuesta del propio dispositivo: el motivo dice que el dispositivo no tiene ningún objeto en esa dirección y nombra el error que envió (`ERROR_CODE_UNKNOWN_OBJECT`), así que una dirección equivocada se distingue de un dispositivo que dejó de responder. El dispositivo sigue conectado.

## Escrituras {#writes}

Se pueden escribir los tags cuyo **Acceso** es Lectura y escritura o Solo escritura. Una escritura fija el `presentValue` del objeto en el tipo que la norma BACnet da a esa clase de objeto, sea cual sea el tipo de dato del tag:

| Objeto | Se escribe como | Admite |
| --- | --- | --- |
| Entrada, salida o valor binario | Enumerated | inactivo (0) o activo (1), desde un tag Boolean o un Int32 igual a 0 o 1 |
| Entrada, salida o valor multiestado | Unsigned | un número de estado a partir de 1 |
| Entrada, salida o valor analógico | Real | un número desde un tag Float o Int32 |
| Cualquier otro tipo de objeto | el tipo de dato del tag | Float un Real, Boolean un Boolean, Int32 un entero con signo, String una cadena de caracteres |

Con la escritura no se envía ninguna prioridad de mando. Un valor que el objeto no puede contener, como 0 para un objeto multiestado o 2 para uno binario, se rechaza antes de enviar nada, y el rechazo dice el motivo. Cuando el dispositivo responde a la escritura con un error, el tag informa de la clase y el código de error que envió el dispositivo en vez de fingir que salió bien, y el dispositivo sigue conectado. Un tag nuevo nace como Solo lectura.

## Descubrimiento {#discovery}

El botón Descubrir del Connector difunde un **Who-Is** de BACnet y escucha las respuestas **I-Am** durante 10 segundos. Todo dispositivo que contesta se convierte en un candidato que lleva su dirección, su puerto y su instancia de dispositivo, listo para añadirlo con los campos de conexión rellenos, y aparece en la lista en el mismo momento en que contesta y no al final de los diez segundos: una exploración que se cancela a mitad conserva todo lo que ya había respondido. La exploración no recorre los objetos, así que los candidatos llegan con cero tags; ponga usted las parejas de tipo e instancia de objeto.

El Who-Is sale por la red que indica la tarjeta **Alcance de la exploración**. Su
cuadro admite una dirección IPv4 de esa red, la de un dispositivo o la propia de este
ordenador en ella (por ejemplo `192.168.1.20`), y la exploración difunde entonces solo
en esa red. Vacío, el Who-Is sale por todas las redes de este ordenador, así que un
ordenador con dos tarjetas de red, una VPN o Docker encuentra los dispositivos de cada
una. Lo que no sea una dirección IPv4 escrita completa se rechaza bajo el cuadro, y
Descubrir sigue en gris hasta que se corrija.

Un dispositivo que responde **a través de un enrutador BACnet** se añade igual. Su candidato lleva la dirección del enrutador y, junto a ella, la red propia del dispositivo y su dirección en esa red; las dos se conservan al añadirlo, y cada lectura se envía al enrutador nombrando el dispositivo que hay dentro. Un dispositivo encontrado así se lee, por tanto, como cualquier otro, y su endpoint se lee "dispositivo vía enrutador". Un dispositivo añadido a mano no tiene ruta y se alcanza directamente en su host.

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

- Solo BACnet/IP: un equipo MS/TP o BACnet/SC solo es alcanzable a través de un enrutador que lo presente en BACnet/IP, y la exploración es lo que lo encuentra: la ruta por la que un dispositivo contesta se conserva desde la exploración, así que añádalo desde la lista de descubiertos en vez de escribir sus campos a mano.
- En un ordenador con varias interfaces de red (dos tarjetas de red, una VPN,
  Docker), cada dispositivo se alcanza por la interfaz por la que este ordenador
  encamina su dirección, la misma que usaría cualquier otro programa aquí; no hay nada
  que elegir.
- Solo el socket que escucha los mensajes de los dispositivos ocupa el puerto UDP estándar de BACnet, el 47808, en esta estación, así que otra aplicación BACnet que ocupe ese puerto en exclusiva en el mismo ordenador puede entrar en conflicto con él. Las peticiones a un dispositivo salen de un puerto que el sistema elige para cada cliente.
- El sondeo está fijado en un segundo para todos los tags de este controlador; los campos habituales de intervalo de sondeo no se muestran.
