# BACnet

Le BACnet est un protocole spécifié par l'organisation ASHRAE (association de constructeurs et d'utilisateurs dans le domaine du chauffage, de la ventilation et de la climatisation (CVC ou HVAC)).
La spécification de ce protocole est devenue un standard international normalisé par l'ANSI et l'ISO.

## Description

La spécification BACnet intègre plusieurs aspects indépendants les uns des autres :
* La spécification des supports physiques utilisables (ARCnet, MS/TP, Ethernet, …) et leurs conditions d'utilisation ;
* La spécification des données et des messages échangés entre des éléments clients et des éléments serveurs ;
* La spécification, sur une base objet, des principes des échanges entre les clients et les serveurs ;
* La spécification des services (accès aux objets, alarmes et événements, …) utilisables au travers du protocole BACnet.
Un réseau BACnet et une application de supervision sont tous deux des systèmes intégralement orientés objet. Du fait de cette logique objet intrinsèque, il est alors possible de les intégrer (les faire communiquer) nativement, sans passer par une conversion entre les objets BACnet et des variables de supervision.

## Architecture réseau de BACnet

L'architecture réseau du protocole BACnet peut être mise en relation avec le modèle d'architecture OSI (Open System Interconnection) de l'ISO. Il s'agit cependant d'une architecture simplifiée qui fait référence uniquement aux couches : physique, liaison, réseau, application.
Les couches : transport, session et présentation ne sont pas utilisées dans le cas présent.
Les couches réseau et application font l'objet de spécifications propres au protocole BACnet. Les couches : physique et liaison font référence à des spécifications existantes indépendantes de BACnet :
* LLC:IEEE 802.2 + (Ethernet:IEEE 802.3 ou Arcnet)
* MS/TP + EIA-485
* PTP + EIA-232
* Lontalk
* UDP/IP
* Websocket sur TCP/IP avec TLS1.3 pour BACnet Secure Connect (BACnet/SC)
| Couches BACnet | Couches BACnet | Couches BACnet | Couches BACnet | Couches BACnet | Couches BACnet | Couches BACnet | Equivalent OSI |
| Couche application BACnet | Couche application BACnet | Couche application BACnet | Couche application BACnet | Couche application BACnet | Couche application BACnet | Couche application BACnet | Couche application |
| Couche réseau BACnet | Couche réseau BACnet | Couche réseau BACnet | Couche réseau BACnet | Couche réseau BACnet | Couche réseau BACnet | Couche réseau BACnet | Couche réseau |
| LLC:IEEE 802.2 | LLC:IEEE 802.2 | MS/TP | PTP | LonTalk | BVLC | BVLC | Couche liaison |
| Ethernet:IEEE 802.3 | ARCNET | EIA-485 | EIA-232 | LonTalk | UDP/IP | Websocket | Couche physique |

### Topologies des réseaux

Un système BACnet est constitué d'un ensemble d'appareils interconnectés. Cette interconnexion s'appuie sur plusieurs concepts :

#### Le segment BACnet

Un segment BACnet est constitué d'un ensemble d'équipements (devices) connectés sur un ou plusieurs segments physiques (reliés par des répéteurs) de même nature. Un segment BACnet est homogène du point de vue de la couche physique.

#### Le réseau BACnet

Un réseau BACnet est constitué d'un ensemble de segments interconnectés par des ponts. Les devices d'un réseau BACnet sont homogènes du point de vue de la couche liaison.

#### L'inter-réseau BACnet

L'inter-réseau BACnet est constitué d'un ensemble de réseaux BACnet interconnectés par des routeurs. Les technologies réseau (couche liaison et couche physique) peuvent être différentes pour chacun des réseaux BACnet.

#### Adressage BACnet

Le protocole BACnet fait appel à plusieurs mécanismes pour l'adressage des devices BACnet en fonction de la couche à laquelle on s'intéresse :
* Couche physique :
Pour la couche physique, l'adressage des devices n'est pas spécifique à BACnet et se fait en fonction de la technologie utilisée. Cette adresse est identifiée (vu de la couche réseau) comme la MAC address. Pour la technologie IP par exemple il s'agit de l'ensemble port UDP + adresse IP.
* Couche réseau :
Pour la couche réseau, l'adressage des devices fait appel à l'ensemble numéro de réseau + MAC address. Tous les devices d'un même réseau BACnet doivent appartenir au même domaine (ou espace) d'adressage. Si un système BACnet comporte des devices de même technologie (par exemple BACnet IP) mais répartis dans des domaines d'adressage distincts (par exemple 192.168.10.X et 192.168.20.X), ils doivent alors être répartis dans plusieurs réseaux BACnet comportant un numéro de réseau distinct pour former un inter-réseau BACnet.
* Couche application :
Pour la couche application, l'adressage des devices s'appuie sur le mécanisme général d'adressage des objets BACnet (le device est représenté sur le réseau au travers d'un objet BACnet). L'adressage d'un objet BACnet fait appel à l'ensemble type d'objet + numéro d'instance. Cette adresse est référencée sous le nom BACnetObjectIdentifier.
Des règles unicité doivent être respectées pour permettre un adressage non ambigu des objets (et donc des devices) :
* Chaque objet BACnet d'un même device doit avoir un BACnetObjectIdentifier unique au sein du device ;
* Chaque device BACnet doit avoir un BACnetObjectIdentifier (ou Device ID) unique au sein d'un inter-réseau (ou système) BACnet.

### Utilisation sur réseau IP

Les travaux de spécifications du protocole BACnet ont débuté en 1987 à une époque où la technologie IP n'était pas encore la technologie réseau universelle (au moins dans la majorité des domaines) qu'elle est devenue à ce jour.
L'intégration de cette technologie dans les spécifications du protocole BACnet a fait l'objet d'une annexe (annexe J) qui précise les conditions de son utilisation pour ce protocole. L'utilisation du protocole BACnet sur IP est généralement mentionnée sous l'appellation BACnet/IP.
Le choix du protocole IP utilisé pour BACnet s'est porté sur UDP. Le choix de ce protocole, sans garantie d'acheminement, est basé sur le fait que la messagerie BACnet intègre elle-même les mécanismes de garantie d'acheminement (timeout d'acquittement de réception et tentatives multiples).
Un problème propre au protocole BACnet est posé pour son utilisation sur des réseaux IP publics ou d'entreprise. Ce problème est lié à l'utilisation du principe de broadcast inhérent à certains services du protocole BACnet. Les messages broadcast étant généralement filtrés par les équipements des réseaux non strictement locaux, une réponse spécifique a été apportée à ce problème. Cette réponse est basée sur la notion de BBMD (BACnet/IP Broadcast Management Device).
La notion de BBMD correspond à une fonction de propagation dirigée des messages broadcast. Une fonction BBMD doit être présente sur chacun des segments de réseau qui doit être relié à un autre segment au travers d'un dispositif qui filtre les messages broadcast. Cette fonction, de la couche réseau, se base sur des tables de configuration (BDT et FDT) pour retransmettre, aux réseaux distants, les messages broadcast émis par les devices locaux, et générer sur le réseau local les demandes de broadcast transmis par les réseaux distants.

### Sécurisation du protocole BACnet

Le protocole BACnet peut être sécurisé avec sa déclinaison BACnet/SC (Secure Connect). BACnet/SC permet d'assurer la confidentialité, l'authenticité et l'intégrité des données et l'authentification des équipements grâce au protocole de sécurité TLS. BACnet/SC nécessite l'utilisation de certificats informatiques. Il utilise le standard WebSocket. Il est disponible depuis 2016.
La communication se fait en diffusion unicast en TCP, par opposition au BACnet standard dont la diffusion peut être en broadcast en UDP. Le mécanisme BBMD lié à la diffusion en broadcast est inutile avec BACnet/SC.
Avec BACnet/SC, les équipements sont identifiés sans tenir compte de leur adresse IP. BACnet/SC facilite l'utilisation d'adressage dynamique avec le protocole DHCP ou de l'IPv6.
Chaque réseau BACnet doit être équipé d'un hub, équipement intermédiaire assurant la communication entre équipements. Le protocole BACnet/SC permet une tolérance de panne du hub avec un basculement vers un autre équipement similaire en cas d'indisponibilité du hub principal. BACnet/SC permet également des échanges de pair-à-pair entre équipements.

## Fonctionnement de la couche application de BACnet

La couche application de BACnet repose essentiellement sur la définition d'un ensemble d'objets manipulés, au travers du réseau, par un ensemble de services.

### Les objets de BACnet

La notion d'objet est une notion fondamentale du protocole BACnet. Les objets sont utilisés d'une part pour représenter les informations gérées par les devices et échangées au travers du protocole, et d'autre part pour une gestion optimale de certains services ou de fonctions applicatives.

## Généralités

Pour le protocole BACnet, un objet est caractérisé par une liste de propriétés et par les valeurs de ces dernières. Les spécifications de BACnet définissent un certain nombre de types d'objets (classes) en indiquant la liste et les caractéristiques des propriétés de chacun des types. Certaines propriétés sont obligatoires pour qu'un objet soit conforme à la définition d'un type, d'autres sont optionnelles. Un constructeur d'équipements BACnet peut ajouter des propriétés qui lui sont propres aux objets standards, et il peut également définir ses propres types d'objets.
L'identification d'un objet (son adresse) au sein d'un système BACnet fait intervenir deux propriétés obligatoires (indépendantes) :
* Object_Identifier
Cette propriété est constituée de la concaténation du type de l'objet et d'un numéro d'instance. La valeur de cette propriété doit être unique pour le système s'il s'agit d'un objet device, ou doit être unique au sein du device qui le gère pour les autres objets.
* Object_Name
Cette propriété est une chaîne de caractères qui doit obéir aux mêmes règles d'unicité que la propriété Object_Identifier. La définition du type d'un objet est indiquée par la propriété obligatoire Object_Type.

### Objets de données

Dans l'ensemble des types d'objets standards de BACnet un certain nombre d'entre eux sont utilisés pour gérer une donnée élémentaire du système. Ces objets sont les suivants : Accumulator, Analog Input, Analog Output, Analog Value, Binary Input, Binary Output, Binary Value, Multi-state Input, Multi-state Output, Multi-state Value.
D'une façon générale, ces objets ont pour fonction de représenter la valeur d'une donnée au travers de leur propriété Present_Value. Ils peuvent comporter des conditions d'alarme et être couplés à un objet de notification (Notification_Class) pour générer des alarmes ou des événements lors du franchissement de ces conditions.

### Objets fonctionnels

Les objets fonctionnels réalisent la prise en charge d'une fonction destinée à piloter des propriétés d'autres objets ou à élaborer des résultats localement. Les objets fonctionnels définis par les spécifications BACnet sont les suivants :
* Averaging : calcul d'indicateurs statistiques sur une donnée (minimum, maximum, moyenne, variance)
* Calendar : définition d'une liste de plages calendaires (est généralement utilisé par référence par les objets Schedule)
* Command : objet utilisé pour déclencher un ensemble d'actions préconfigurées au travers d'une seule écriture de la Present_Value de l'objet Command
* Event Enrollment : permet de définir des conditions de génération d'événements en dehors des conditions intrinsèques aux objets
* Group : est utilisé pour donner accès simplement à un ensemble de données
* Loop : permet de représenter, de façon standardisée, une boucle de régulation
* Program : permet de représenter, de façon standardisée, un programme exécuté dans un device BACnet
* Pulse Converter : élaboration d'une grandeur physique à partir d'un comptage d'impulsions
* Schedule : objet de commande de propriétés d'autres objets sur la base d'une programmation horaire
* Trend Log : réalise l'historisation de la valeur de propriétés d'autres objets
* Event Log : réalise l'historisation d'événements
* Structured View : permet de décrire une organisation (qui peut être hiérarchique) entre des objets d'un système BACnet
* Trend Log Multiple : réalise l'historisation d'un ensemble de propriétés d'autres objets.
Certains objets fonctionnels sont plus particulièrement adaptés pour un métier particulier (contrôle d'accès, détection incendie, …) :
* Life Safety Point : point de détection incendie
* Life Safety Zone : permet de définir des zones de détection incendie constituées d'une liste de détecteurs et de zones
* Access Door : permet de représenter, de façon standardisée, une porte de contrôle d'accès
* Load Control : permet de représenter, de façon standardisée, une fonction de délestage
D'autres objets fonctionnels sont utilisés en liaison avec les services proposés par le protocole BACnet :
* Device : l'objet Device représente l'ensemble des caractéristiques d'un équipement BACnet présent sur le réseau
* Notification Class : cet objet est utilisé pour définir les conditions de diffusion des notifications pour tout ou partie des alarmes et des événements

## Gestion des propriétés commandables

Il existe deux types de propriétés du point de vue des opérations d'écriture : commandable ou non commandable.
Pour les propriétés commandables, une notion de priorité permet de gérer des forçages de valeur en fonction du niveau de priorité utilisé lors de la demande d'écriture. Un tableau de priorités est géré par les objets qui disposent d'une propriété commandable. Ce tableau dispose d'un emplacement pour chacun des 16 niveaux de priorité possibles. Ce tableau contient la dernière valeur éventuellement écrite pour un niveau donné. La valeur prise par la propriété concernée est alors la valeur associée à la priorité la plus élevée. La priorité d'écriture est spécifiée à chaque demande d'écriture. Une demande d'écriture avec la valeur NULL libère le niveau de priorité spécifié.

## Les services de BACnet

La couche application du protocole BACnet spécifie également un ensemble de services qui permettent de gérer les devices et les objets des devices qui constituent un système BACnet. Ces services couvrent divers aspects, en particulier :
* les services d'accès aux objets : ces services permettent de manipuler les objets
* lecture (unitaire, multiple, plage) et écriture (unitaire, multiple) des propriétés
* création, suppression d'objets
* ajout, suppression d'éléments dans les propriétés de type liste
* Les services de gestion des alarmes et événements : sont utilisés pour la gestion des notifications. Ces notifications peuvent concerner l'évolution des valeurs d'une propriété (COV) ou l'occurrence d'une condition d'alarme ou d'événement (intrinsèque ou algorithmique).
* L'échange de fichiers : lecture ou écriture de fichiers dans un device.
* La gestion à distance des devices : sont principalement utilisés pour des fonctions d'administration des devices (contrôle des échanges sur le réseau, réinitialisation, synchronisation horaire, exploration du réseau (Who-Is, Who-Has,...))
* L'accès au travers d'un terminal virtuel.

## Utilisation pour la supervision

Le protocole BACnet est utilisé pour assurer la communication entre les différents équipements d'un système BACnet en vue de satisfaire les exigences du fonctionnement global d'une installation. Il est également, voire principalement, utilisé pour les besoins de la supervision de ces installations.
Pour les besoins de la supervision, les services utiles sont essentiellement l'accès aux objets et à leurs propriétés, et la gestion des alarmes.
La mise en œuvre d'un réseau BACnet pour la supervision pose des problèmes spécifiques à cette technologie pour les logiciels de supervision traditionnels.
Ces problèmes sont essentiellement liés à :
* L'approche objet : les logiciels de supervision traditionnels gèrent des données unitaires qui diffèrent profondément de la notion de propriété associée à une instance d'objet.
* L'utilisation de propriétés complexes : certaines propriétés d'objets (la propriété Weekly_Schedule de l'objet Schedule par exemple) sont accessibles uniquement sous forme d'une structure complexe qui n'est pas manipulable comme une donnée élémentaire d'un superviseur traditionnel.
* L'optimisation des échanges sur le réseau : d'une façon générale, une supervision peut être intéressée par la totalité des propriétés d'un objet pour afficher les valeurs de ces propriétés ou les modifier. Cependant, toutes les propriétés, selon leur nature, n'évoluent pas de la même manière. Certaines évoluent en permanence (Present_Value), d'autres évoluent occasionnellement à l'initiative du device (Status_Flags), d'autres encore évoluent occasionnellement à l'initiative d'un device extérieur (High_Limit), enfin certaines propriétés sont pratiquement statiques (Description).
    Les superviseurs traditionnels ne sont généralement pas capable de distinguer la nature des informations échangées et ne peuvent donc pas adapter la logique des échanges sur le réseau en fonction de cette nature. Lorsqu'il n'est pas possible de prendre en compte ces caractéristiques, il faut alors renoncer à récupérer les propriétés statiques ou quasi statiques sous peine de surcharger inutilement le réseau.Il est à noter qu'il existe un service de notification qui permet à un device client de s'abonner à des notifications sur changement de valeur. Ce service ne s'applique cependant qu'à certaines propriétés.
* L'utilisation d'objets d'historisation locale : certains objets (Trend Log par exemple) réalisent une mémorisation locale au device de l'évolution des valeurs de propriétés. La prise en compte de ces valeurs historisées nécessitent une implémentation spécifique à BACnet de la gestion de ces objets
* L'utilisation d'un service de gestion d'alarmes le couplage entre un logiciel de supervision et un service externe de gestion des alarmes n'est pas habituel et les mécanismes utilisés par le protocole BACnet lui sont spécifiques. Ici aussi, il est nécessaire de disposer d'une implémentation native de la gestion des alarmes BACnet dans la supervision pour pouvoir disposer de l'ensemble des fonctions nécessaires : synchronisation de l'état, propagation des acquittements, …
* La notion de propriété commandable : traditionnellement, la commande des installations supervisées est réalisée au travers d'une simple écriture dans les données qui représentent les actionneurs (ou les consignes). Le protocole BACnet a introduit la notion de propriété commandable qui permet, à un device client, de prendre la main sur une commande. L'utilisation d'un niveau de priorité adéquat permet alors à ce device d'empêcher toute action par un device moins prioritaire. Ce mécanisme, propre à BACnet, nécessite également une implémentation spécifique à ce protocole au sein de la supervision.
La façon d'apporter une réponse à ces problèmes doit être un critère de choix de premier niveau pour le logiciel de supervision d'un système BACnet.