Allgemein
Ein Scan des BACnet-Netzwerks wird über MQTT initiiert. Dazu stellt das Gateway ein Topic (subscribe) zur Verfügung, über das die Anfrage vom Benutzer über den Broker an das Gateway gesendet werden kann. Das Ergebnis des Scans wird dann über weitere Topics an den Broker verteilt. Dazu muss der BACnet-Treiber auch auf dem Gateway laufen und mit dem BACnet-Netzwerk verbunden sein.
Der MQTT-Treiber hat spezielle interne Datenpunkte, die verwendet werden können, um einen BACnet-Scan zu initiieren und die Ergebnisse zu liefern.
Hinweis
Dazu muss in der Konfigurationsdatei der Eintrag 'ScanBACnet=1' eingetragen werden. Beim Start stellt der Treiber über SUBSCRIBE ein Topic zur Verfügung, das andere MQTT-Clients nutzen können, um einen BACnet-Scan zu starten.
Beispiel eines Scans
Über den BACnet-Treiber mit Route 940 über alle BACnet-Geräte mit einer Instanznummer zwischen 2000 und 2009 und einem Timeout von einer Stunde (pro Gerät):
Topic: 'cmd/[ClientID]/[CmdID]/scan/bacnet'
Payload: '{"route":940, "start":2000, "end":2009, "timeout":3600}'
Die Ergebnisse des Scans werden veröffentlicht unter dem topic 'cmd/[ClientID]/[CmdID]/scan/bacnet/[route]/[device-instance]' (PUBLISH).
Der Initiale Teil 'cmd' kann im Treiber über den Eintrag 'SysPreTopic' umkonfiguriert werden, da einige MQTT-Broker Topics mit '$SYS' am Anfang nur eigene, interne Informationen zulassen.
Die Ergebnisse können auch im JSON-Format abgefragt werden. Zusätzlich zu einem Netzwerkscan ist es auch möglich, nur ein Gerät zu scannen.
Ablauf eines BACnet Scans
Start des Gateways. Das MQTT stellt über SUBSCRIBE das Topic 'cmd/[ClientID]/[CMD-ID]/scan/bacnet' bereit.
Der Benutzer bezieht über SUBSCRIBE die Topics 'cmd/[ClientID]/ [CMD-ID]/scan/bacnet/#' für die Ergebnisse des BACnet-Scans.
Der Benutzer sendet seine BACnet-Scan-Anfrage über PUBLISH an das Topic 'cmd/[ClientID]/[CMD-ID]/scan/bacnet'.
Das Gateway empfängt die Scan-Anfrage und leitet die Anfragen entsprechend an den BACnet-Treiber weiter.
Das Gateway wartet auf die Antworten des BACnet-Treibers und publiziert die Ergebnisse via PUBLISH an den MQTT-Broker.
Beispiel für ein Ergebnis
<device>
<object-identifier>(8,2000)</object-identifier>
<device-address-binding>(((8,2000),(0,0x0afa420bbac0)))</device-address-binding>
<object-name>[0]UGW</object-name>
<system-status>0</system-status>
<vendor-name>[0]MBS GmbH Krefeld</vendor-name>
<vendor-identifier>50</vendor-identifier>
<model-name>[0]UGW</model-name>
<firmware-revision>[0]1.1</firmware-revision>
<application-software-version>[0]Drv.bac V2_02D Jul 30 2015 09:30:46</application-software-version>
<location>[0]Rack</location>
<description>[0]UGW BACnet Client/Server</description>
<protocol-revision>7</protocol-revision>
<protocol-services-supported>(1,1,1,1,1,1,1,1,1,1,0,0,1,0,1,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1)</protocol-services-supported>
<protocol-object-type-supported>(1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,1,0,1,0,1,1,1,1,0,0,1,0,0,0,1,0)</protocol-object-type-supported>
<structured-object-list>()</structured-object-list>
<max-apdu-length-accepted>1476</max-apdu-length-accepted>
<segmentation-supported>0</segmentation-supported>
<max-segments-accepted>64</max-segments-accepted>
<local-time>13:01:36.00</local-time>
<local-date>(Tuesday, 4-August-2015)</local-date>
<utc-offset>-60</utc-offset>
<daylight-savings-status>1</daylight-savings-status>
<apdu-segment-timeout>2000</apdu-segment-timeout>
<apdu-timeout>3000</apdu-timeout>
<number-of-apdu-retries>5</number-of-apdu-retries>
<database-revision>0</database-revision>
<configuration-files>()</configuration-files>
<last-restore-time>[0] *:*:*.*</last-restore-time>
<backup-failure-timeout>120</backup-failure-timeout>
<backup-preparation-time>10</backup-preparation-time>
<restore-completion-time>10</restore-completion-time>
<restore-preparation-time>1</restore-preparation-time>
<backup-and-restore-state>0</backup-and-restore-state>
<last-restart-reason>3</last-restart-reason>
<time-of-device-restart>[2] ((Saturday, 1-January-2000),02:02:20.00)</time-of-device-restart>
<restart-notification-recipients>([1] (0,0x0afa0a33bac0),[1] (0,0x0afa0b94bac0),[1] (0,0x0afa140abac0),[1] (0,0x0afa0aa8bac0))</restart-notification-recipients>
<object>
<object-identifier>(15,1)</object-identifier>
<object-name>[0]2000.NC 1</object-name>
<description>[0]UG Notification Class Object 1</description>
<notification-class>1</notification-class>
<priority>(1,2,3)</priority>
<ack-required>(0,0,0)</ack-required>
<recipient-list>()</recipient-list>
</object>
<object>
<object-identifier>(14,1)</object-identifier>
<object-name>[0]2000.MO 1</object-name>
<present-value>1</present-value>
<description>[0]multistate output 1</description>
<out-of-service>0</out-of-service>
<number-of-states>3</number-of-states>
<state-text>[0]("Text State 1","Text State 2","TextState 3")</state-text>
<priority-array>(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)</priority-array>
<relinquish-default>1</relinquish-default>
<time-delay>0</time-delay>
<notification-class>1</notification-class>
<event-enable>(1,1,1)</event-enable>
<notify-type>0</notify-type>
</object>
<object>
<object-identifier>(3,1)</object-identifier>
<object-name>[0]2000.BI 1</object-name>
<present-value>0</present-value>
<description>[0]binary input 1</description>
<out-of-service>0</out-of-service>
<polarity>0</polarity>
<inactive-text>[0]OFF</inactive-text>
<active-text>[0]ON</active-text>
<time-delay>0</time-delay>
<notification-class>2</notification-class>
<alarm-value>1</alarm-value>
<event-enable>(1,1,1)</event-enable>
<notify-type>0</notify-type>
<event-message-texts>[0]("","","")</event-message-texts>
<event-message-texts-config>[0]("Alarm","Fault","Normal")</event-message-texts-config>
</object>
<object>
<object-identifier>(1,1)</object-identifier>
<object-name>[0]2000.AO 1</object-name>
<present-value>20.000000</present-value>
<description>[0]analog output 1</description>
<out-of-service>0</out-of-service>
<units>62</units>
<min-pres-value>-30.000000</min-pres-value>
<max-pres-value>270.000000</max-pres-value>
<priority-array>(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)</priority-array>
<relinquish-default>20.000000</relinquish-default>
<cov-increment>0.100000</cov-increment>
<time-delay>0</time-delay>
<notification-class>2</notification-class>
<high-limit>85.000000</high-limit>
<low-limit>-5.000000</low-limit>
<deadband>2.000000</deadband>
<limit-enable>(1,1)</limit-enable>
<event-enable>(1,1,1)</event-enable>
<notify-type>0</notify-type>
</object>
<object>
<object-identifier>(0,1)</object-identifier>
<object-name>[0]Analog-Input 1</object-name>
<present-value>0.000000</present-value>
<description>[0]Analog-Input 1</description>
<out-of-service>0</out-of-service>
<units>23</units>
<min-pres-value>-100.000000</min-pres-value>
<max-pres-value>100.000000</max-pres-value>
<cov-increment>0.100000</cov-increment>
<time-delay>0</time-delay>
<notification-class>1</notification-class>
<high-limit>80.000000</high-limit>
<low-limit>5.000000</low-limit>
<deadband>0.600000</deadband>
<limit-enable>(1,1)</limit-enable>
<event-enable>(1,1,1)</event-enable>
<notify-type>1</notify-type>
</object>
</device>
BACnet-Scan Erweiterungen
Hinweis
Die neuenOptionen werden ebenfalls im Payload der Nachrichtgesetzt.
result-type:
Kann entweder "json" oder "xml" sein. Die BACnet-Scans werden in dem entsprechenden Format geparst. Default ist "xml".
message-per-device:
Wenn auf false gesetzt, wird nur eine einzige Nachricht auf das Kommando geantwortet. Ergebnisse werden in eine Nachricht zusammengefasst. Default ist true.
network-scan und device-scan:
Wenn network-scan aktiv ist, wird ein Scan des Netzwerkes gestartet. Ein device-Scan scant die Objekte eines Devices. Wenn beides aktiv ist, wird erst ein device-scan und anschließend über die gefundende Devices ein Scan gestartet. Wenn nur device-scan aktiv ist, muss ein Array "devices" aus Device-IDs angegeben werden. Über diese Devices wird der Scan gestartet. Per default sind beide Optionen aktiv.
Beispiel:
Start eines Scans des Netzwerkes mit anschließenden Downloads aller Geräte mit der ID 2000 bis 2009. Das Output Format ist XML und es wird für jedes gefundene Geräte eine eigene Nachricht mit einem Status zurückgegeben:
json
{
"route":940,
"start":2000,
"end":2009,
"timeout":3600,
"result-type": "xml",
"message-per-device": true,
"network-scan": true,
"device-scan": true
}
Beispiel:
Start eines Scans der Devices mit den IDs 2000 und 2006. Das Output-Format ist json. Die Ergebnisse der Geräte werden in einer Nachricht zusammengefasst:
json
{
"route": 940,
"timeout": 3600,
"result-type": "json",
"message-per-device": false,
"network-scan": false,
"device-scan": true,
"devices": [
2000,
2006
]
}