import argparse
import asyncio
import logging
import re
import sys
from pathlib import Path

BACPYPES3_VERSION = "0.0.106"

try:
    from bacpypes3.app import Application
    from bacpypes3.argparse import SimpleArgumentParser
    from bacpypes3.apdu import ErrorRejectAbortNack
    from bacpypes3.constructeddata import AnyAtomic, Any
    from bacpypes3.primitivedata import CharacterString, Enumerated
except Exception as exc:
    print(f"Please install: pip3 install bacpypes3=={BACPYPES3_VERSION}, Error importing bacpypes3 modules: {repr(exc)}")
    sys.exit(1)

logging.getLogger("bacpypes3").setLevel(logging.ERROR)

DEFAULT_BACNET_PORT = 47808
DEFAULT_BACNET_ID = 101
DEFAULT_DEVICE_SLOT_SIZE = 100
_BUILTIN_SNAPSHOT = {'globals': {'http_port': '8070',
             'http_enable': '1',
             'auto_save': '1',
             'save_interval': '60',
             'check_interval': '5',
             'cleanup_threshold_pct': '80',
             'cleanup_delete_pct': '25',
             'sync_enable': '1',
             'sync_interval': '60',
             'default_sensor_type': 'undefine',
             'default_keep_alive_interval': '86400',
             'default_modbus_tcp_enable': '1',
             'default_modbus_tcp_port': '502',
             'default_modbus_tcp_slave_id': '2',
             'default_bacnet_bip_enable': '1',
             'default_bacnet_bip_id': '101',
             'unicast_max_retry': '1',
             'multicast_max_retry': '1',
             'bacnet_instance_number': '260001'},
 'attributes': {'powerState': {'name': 'powerState',
                               'json_key': 'powerState',
                               'data_type': 'bool',
                               'unit': 'none',
                               'readwrite': '1',
                               'description': 'Power on or off',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'BV',
                               'bacnet_unit': '95'},
                'switch': {'name': 'switch',
                           'json_key': 'switch',
                           'data_type': 'bool',
                           'unit': 'none',
                           'readwrite': '1',
                           'description': 'Socket switch on or off',
                           'modbus_enable': '1',
                           'modbus_table': 'holding',
                           'modbus_register_count': '1',
                           'modbus_mapping_mode': 'single',
                           'modbus_scale': '1',
                           'bacnet_enable': '1',
                           'bacnet_object_type': 'BV',
                           'bacnet_unit': '95'},
                'temperature': {'name': 'temperature',
                                'json_key': 'temperature',
                                'data_type': 'float',
                                'unit': 'celsius',
                                'decimal_places': '1',
                                'min_value': '-100',
                                'max_value': '500',
                                'readwrite': '0',
                                'description': 'Temperature',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '100',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '62'},
                'co2': {'name': 'co2',
                        'json_key': 'co2',
                        'data_type': 'int',
                        'unit': 'none',
                        'min_value': '0',
                        'max_value': '65535',
                        'readwrite': '0',
                        'description': 'CO2 concentration',
                        'modbus_enable': '1',
                        'modbus_table': 'holding',
                        'modbus_register_count': '1',
                        'modbus_mapping_mode': 'single',
                        'modbus_scale': '1',
                        'bacnet_enable': '1',
                        'bacnet_object_type': 'AI',
                        'bacnet_unit': '95'},
                'pm25': {'name': 'pm25',
                         'json_key': 'pm25',
                         'data_type': 'int',
                         'unit': 'none',
                         'min_value': '0',
                         'max_value': '65535',
                         'readwrite': '0',
                         'description': 'PM2.5 concentration',
                         'modbus_enable': '1',
                         'modbus_table': 'holding',
                         'modbus_register_count': '1',
                         'modbus_mapping_mode': 'single',
                         'modbus_scale': '1',
                         'bacnet_enable': '1',
                         'bacnet_object_type': 'AI',
                         'bacnet_unit': '95'},
                'formaldehyde': {'name': 'formaldehyde',
                                 'json_key': 'formaldehyde',
                                 'data_type': 'int',
                                 'unit': 'none',
                                 'min_value': '0',
                                 'max_value': '65535',
                                 'readwrite': '0',
                                 'description': 'Formaldehyde concentration',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '95'},
                'tvoc': {'name': 'tvoc',
                         'json_key': 'tvoc',
                         'data_type': 'int',
                         'unit': 'none',
                         'min_value': '0',
                         'max_value': '65535',
                         'readwrite': '0',
                         'description': 'TVOC concentration',
                         'modbus_enable': '1',
                         'modbus_table': 'holding',
                         'modbus_register_count': '1',
                         'modbus_mapping_mode': 'single',
                         'modbus_scale': '1',
                         'bacnet_enable': '1',
                         'bacnet_object_type': 'AI',
                         'bacnet_unit': '95'},
                'humidity': {'name': 'humidity',
                             'json_key': 'humidity',
                             'data_type': 'float',
                             'unit': 'percent',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '99.9',
                             'readwrite': '0',
                             'description': 'Humidity',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '100',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '98'},
                'bootVersion': {'name': 'bootVersion',
                                'json_key': 'bootVersion',
                                'data_type': 'string',
                                'unit': 'none',
                                'string_max_len': '16',
                                'readwrite': '0',
                                'description': 'Firmware U-boot Version',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '8',
                                'modbus_mapping_mode': 'string',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'CV',
                                'bacnet_unit': '95'},
                'mainVersion': {'name': 'mainVersion',
                                'json_key': 'mainVersion',
                                'data_type': 'string',
                                'unit': 'none',
                                'string_max_len': '16',
                                'readwrite': '0',
                                'description': 'Firmware Main Version',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '8',
                                'modbus_mapping_mode': 'string',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'CV',
                                'bacnet_unit': '95'},
                'appVersion': {'name': 'appVersion',
                               'json_key': 'appVersion',
                               'data_type': 'string',
                               'unit': 'none',
                               'string_max_len': '16',
                               'readwrite': '0',
                               'description': 'Firmware Application Version',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '8',
                               'modbus_mapping_mode': 'string',
                               'modbus_scale': '1',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'CV',
                               'bacnet_unit': '95'},
                'hardwareVersion': {'name': 'hardwareVersion',
                                    'json_key': 'hardwareVersion',
                                    'data_type': 'string',
                                    'unit': 'none',
                                    'string_max_len': '16',
                                    'readwrite': '0',
                                    'description': 'Hardware Version',
                                    'modbus_enable': '1',
                                    'modbus_table': 'holding',
                                    'modbus_register_count': '8',
                                    'modbus_mapping_mode': 'string',
                                    'modbus_scale': '1',
                                    'bacnet_enable': '1',
                                    'bacnet_object_type': 'CV',
                                    'bacnet_unit': '95'},
                'model': {'name': 'model',
                          'json_key': 'model',
                          'data_type': 'string',
                          'unit': 'none',
                          'string_max_len': '24',
                          'readwrite': '0',
                          'description': 'Product Model',
                          'modbus_enable': '1',
                          'modbus_table': 'holding',
                          'modbus_register_count': '12',
                          'modbus_mapping_mode': 'string',
                          'modbus_scale': '1',
                          'bacnet_enable': '1',
                          'bacnet_object_type': 'CV',
                          'bacnet_unit': '95'},
                'batteryVoltage': {'name': 'batteryVoltage',
                                   'json_key': 'batteryVoltage',
                                   'data_type': 'float',
                                   'unit': 'volt',
                                   'decimal_places': '2',
                                   'min_value': '0.1',
                                   'max_value': '48.0',
                                   'readwrite': '0',
                                   'description': 'Battery Voltage',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '100',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '5'},
                'batteryVoltageState': {'name': 'batteryVoltageState',
                                        'json_key': 'batteryVoltageState',
                                        'data_type': 'int',
                                        'unit': 'none',
                                        'min_value': '0',
                                        'max_value': '10',
                                        'readwrite': '0',
                                        'description': 'Battery State',
                                        'modbus_enable': '1',
                                        'modbus_table': 'holding',
                                        'modbus_register_count': '1',
                                        'modbus_mapping_mode': 'single',
                                        'modbus_scale': '1',
                                        'bacnet_enable': '1',
                                        'bacnet_object_type': 'AI',
                                        'bacnet_unit': '95'},
                'batteryLevel': {'name': 'batteryLevel',
                                 'json_key': 'batteryLevel',
                                 'data_type': 'int',
                                 'unit': 'percent',
                                 'min_value': '0',
                                 'max_value': '100',
                                 'readwrite': '0',
                                 'description': 'Battery level',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '98'},
                'online': {'name': 'online',
                           'json_key': 'online',
                           'data_type': 'bool',
                           'unit': 'none',
                           'readwrite': '0',
                           'description': 'Online Status',
                           'modbus_enable': '1',
                           'modbus_table': 'holding',
                           'modbus_register_count': '1',
                           'modbus_mapping_mode': 'single',
                           'modbus_scale': '1',
                           'bacnet_enable': '1',
                           'bacnet_object_type': 'BI',
                           'bacnet_unit': '95'},
                'lastOnlineTime': {'name': 'lastOnlineTime',
                                   'json_key': 'lastOnlineTime',
                                   'data_type': 'timestamp',
                                   'unit': 'second',
                                   'readwrite': '0',
                                   'description': 'Last Online Time (Unix timestamp)',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '73'},
                'doorState': {'name': 'doorState',
                              'json_key': 'doorState',
                              'data_type': 'int',
                              'unit': 'none',
                              'min_value': '0',
                              'max_value': '1',
                              'readwrite': '0',
                              'description': 'door open(1)/close(0)',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'BI',
                              'bacnet_unit': '95'},
                'levelValue': {'name': 'levelValue',
                               'json_key': 'levelValue',
                               'data_type': 'float',
                               'unit': 'percent',
                               'decimal_places': '1',
                               'min_value': '0',
                               'max_value': '100',
                               'readwrite': '0',
                               'description': 'liquid level percent',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '10',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AI',
                               'bacnet_unit': '98'},
                'presence': {'name': 'presence',
                             'json_key': 'presence',
                             'data_type': 'bool',
                             'unit': 'none',
                             'readwrite': '0',
                             'description': 'presence detection',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'BI',
                             'bacnet_unit': '95'},
                'distance': {'name': 'distance',
                             'json_key': 'distance',
                             'data_type': 'float',
                             'unit': 'meter',
                             'decimal_places': '2',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'Target Distance',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '100',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '31'},
                'lastPayload': {'name': 'lastPayload',
                                'json_key': 'lastPayload',
                                'data_type': 'binary',
                                'unit': 'none',
                                'readwrite': '0',
                                'description': 'Last Payload Data',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '130',
                                'modbus_mapping_mode': 'binary',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'CV',
                                'bacnet_unit': '95'},
                'lastPayloadLen': {'name': 'lastPayloadLen',
                                   'json_key': 'lastPayloadLen',
                                   'data_type': 'int',
                                   'unit': 'none',
                                   'min_value': '0',
                                   'max_value': '256',
                                   'description': 'Last Payload Length',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '95'},
                'lastFport': {'name': 'lastFport',
                              'json_key': 'lastFport',
                              'data_type': 'int',
                              'unit': 'none',
                              'min_value': '0',
                              'max_value': '256',
                              'description': 'Last FPort Used',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '95'},
                'tamper': {'name': 'tamper',
                           'json_key': 'tamper',
                           'data_type': 'int',
                           'unit': 'none',
                           'min_value': '0',
                           'max_value': '2',
                           'description': 'Tamper Detection',
                           'modbus_enable': '1',
                           'modbus_table': 'holding',
                           'modbus_register_count': '1',
                           'modbus_mapping_mode': 'single',
                           'modbus_scale': '1',
                           'bacnet_enable': '1',
                           'bacnet_object_type': 'AI',
                           'bacnet_unit': '95'},
                'tamperEvent': {'name': 'tamperEvent',
                                'json_key': 'tamperEvent',
                                'data_type': 'int',
                                'unit': 'none',
                                'min_value': '0',
                                'max_value': '2',
                                'description': 'Tamper Detection Event',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '95'},
                'infraredEvent': {'name': 'infraredEvent',
                                  'json_key': 'infraredEvent',
                                  'data_type': 'int',
                                  'unit': 'none',
                                  'readwrite': '0',
                                  'min_value': '0',
                                  'max_value': '255',
                                  'description': 'Infrared detection event code',
                                  'modbus_enable': '1',
                                  'modbus_table': 'holding',
                                  'modbus_register_count': '1',
                                  'modbus_mapping_mode': 'single',
                                  'modbus_scale': '1',
                                  'bacnet_enable': '1',
                                  'bacnet_object_type': 'AI',
                                  'bacnet_unit': '95'},
                'temperatureState': {'name': 'temperatureState',
                                     'json_key': 'temperatureState',
                                     'data_type': 'int',
                                     'unit': 'none',
                                     'min_value': '0',
                                     'max_value': '2',
                                     'readwrite': '0',
                                     'description': 'Temperature State',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '95'},
                'humidityState': {'name': 'humidityState',
                                  'json_key': 'humidityState',
                                  'data_type': 'int',
                                  'unit': 'none',
                                  'min_value': '0',
                                  'max_value': '2',
                                  'readwrite': '0',
                                  'description': 'Humidity State',
                                  'modbus_enable': '1',
                                  'modbus_table': 'holding',
                                  'modbus_register_count': '1',
                                  'modbus_mapping_mode': 'single',
                                  'modbus_scale': '1',
                                  'bacnet_enable': '1',
                                  'bacnet_object_type': 'AI',
                                  'bacnet_unit': '95'},
                'snr': {'name': 'snr',
                        'json_key': 'snr',
                        'data_type': 'int',
                        'unit': 'none',
                        'min_value': '-128',
                        'max_value': '128',
                        'readwrite': '0',
                        'description': 'SNR (dB)',
                        'modbus_enable': '1',
                        'modbus_table': 'holding',
                        'modbus_register_count': '1',
                        'modbus_mapping_mode': 'single',
                        'modbus_scale': '1',
                        'bacnet_enable': '1',
                        'bacnet_object_type': 'AI',
                        'bacnet_unit': '95'},
                'ef5600CommandCode': {'name': 'ef5600CommandCode',
                                      'json_key': 'ef5600CommandCode',
                                      'data_type': 'int',
                                      'unit': 'none',
                                      'min_value': '0',
                                      'max_value': '255',
                                      'readwrite': '1',
                                      'description': 'EF5600 Command Code',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'AV',
                                      'bacnet_unit': '95'},
                'ef5600SettingAddress': {'name': 'ef5600SettingAddress',
                                         'json_key': 'ef5600SettingAddress',
                                         'data_type': 'int',
                                         'unit': 'none',
                                         'min_value': '0',
                                         'max_value': '65535',
                                         'readwrite': '1',
                                         'description': 'EF5600 Setting Address',
                                         'modbus_enable': '1',
                                         'modbus_table': 'holding',
                                         'modbus_register_count': '1',
                                         'modbus_mapping_mode': 'single',
                                         'modbus_scale': '1',
                                         'bacnet_enable': '1',
                                         'bacnet_object_type': 'AV',
                                         'bacnet_unit': '95'},
                'ef5600SettingValueHigh': {'name': 'ef5600SettingValueHigh',
                                           'json_key': 'ef5600SettingValueHigh',
                                           'data_type': 'int',
                                           'unit': 'none',
                                           'min_value': '0',
                                           'max_value': '255',
                                           'readwrite': '1',
                                           'description': 'EF5600 Setting Value High Byte',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'AV',
                                           'bacnet_unit': '95'},
                'ef5600SettingValueLow': {'name': 'ef5600SettingValueLow',
                                          'json_key': 'ef5600SettingValueLow',
                                          'data_type': 'int',
                                          'unit': 'none',
                                          'min_value': '0',
                                          'max_value': '255',
                                          'readwrite': '1',
                                          'description': 'EF5600 Setting Value Low Byte',
                                          'modbus_enable': '1',
                                          'modbus_table': 'holding',
                                          'modbus_register_count': '1',
                                          'modbus_mapping_mode': 'single',
                                          'modbus_scale': '1',
                                          'bacnet_enable': '1',
                                          'bacnet_object_type': 'AV',
                                          'bacnet_unit': '95'},
                'rssi': {'name': 'rssi',
                         'json_key': 'rssi',
                         'data_type': 'int',
                         'unit': 'none',
                         'min_value': '-128',
                         'max_value': '128',
                         'readwrite': '0',
                         'description': 'RSSI (dBm)',
                         'modbus_enable': '1',
                         'modbus_table': 'holding',
                         'modbus_register_count': '1',
                         'modbus_mapping_mode': 'single',
                         'modbus_scale': '1',
                         'bacnet_enable': '1',
                         'bacnet_object_type': 'AI',
                         'bacnet_unit': '95'},
                'setTemperature': {'name': 'setTemperature',
                                   'json_key': 'setTemperature',
                                   'data_type': 'float',
                                   'unit': 'celsius',
                                   'decimal_places': '1',
                                   'min_value': '10',
                                   'max_value': '35',
                                   'readwrite': '1',
                                   'description': 'Set Temperature',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '100',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AV',
                                   'bacnet_unit': '62'},
                'workMode': {'name': 'workMode',
                             'json_key': 'workMode',
                             'data_type': 'int',
                             'unit': 'none',
                             'min_value': '0',
                             'max_value': '3',
                             'readwrite': '1',
                             'description': 'Work Mode (0:auto, 1:cool, 2:heat, 3:vent)',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AV',
                             'bacnet_unit': '95'},
                'fanSpeed': {'name': 'fanSpeed',
                             'json_key': 'fanSpeed',
                             'data_type': 'int',
                             'unit': 'none',
                             'min_value': '0',
                             'max_value': '4',
                             'readwrite': '1',
                             'description': 'Fan Speed (0:off, 1:low, 2:mid, 3:high, 4:auto)',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AV',
                             'bacnet_unit': '95'},
                'keyLockState': {'name': 'keyLockState',
                                 'json_key': 'keyLockState',
                                 'data_type': 'int',
                                 'unit': 'none',
                                 'min_value': '0',
                                 'max_value': '1',
                                 'readwrite': '1',
                                 'description': 'Key Lock State (0:unlocked, 1:locked)',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BV',
                                 'bacnet_unit': '95'},
                'valveState': {'name': 'valveState',
                               'json_key': 'valveState',
                               'data_type': 'int',
                               'unit': 'none',
                               'min_value': '0',
                               'max_value': '1',
                               'readwrite': '0',
                               'description': 'Valve State (0:closed, 1:open)',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'BI',
                               'bacnet_unit': '95'},
                'signalStrength': {'name': 'signalStrength',
                                   'json_key': 'signalStrength',
                                   'data_type': 'int',
                                   'unit': 'none',
                                   'min_value': '0',
                                   'max_value': '3',
                                   'readwrite': '1',
                                   'description': 'Wireless Signal Strength (0:offline, 1:poor, 2:good, 3:excellent)',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '95'},
                'cumulativeOnTime': {'name': 'cumulativeOnTime',
                                     'json_key': 'cumulativeOnTime',
                                     'data_type': 'int',
                                     'unit': 'minute',
                                     'min_value': '0',
                                     'max_value': '999999',
                                     'readwrite': '0',
                                     'description': 'Cumulative Power-On Time',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '10',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '73'},
                'cumulativeValveOpenTime': {'name': 'cumulativeValveOpenTime',
                                            'json_key': 'cumulativeValveOpenTime',
                                            'data_type': 'int',
                                            'unit': 'minute',
                                            'min_value': '0',
                                            'max_value': '999999',
                                            'readwrite': '0',
                                            'description': 'Cumulative Valve Open Time',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '1',
                                            'modbus_mapping_mode': 'single',
                                            'modbus_scale': '10',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'AI',
                                            'bacnet_unit': '73'},
                'voltage': {'name': 'voltage',
                            'json_key': 'voltage',
                            'data_type': 'float',
                            'unit': 'volt',
                            'decimal_places': '1',
                            'min_value': '0',
                            'max_value': '300',
                            'readwrite': '0',
                            'description': 'Voltage (RMS)',
                            'modbus_enable': '1',
                            'modbus_table': 'holding',
                            'modbus_register_count': '1',
                            'modbus_mapping_mode': 'single',
                            'modbus_scale': '10',
                            'bacnet_enable': '1',
                            'bacnet_object_type': 'AI',
                            'bacnet_unit': '5'},
                'current': {'name': 'current',
                            'json_key': 'current',
                            'data_type': 'float',
                            'unit': 'ampere',
                            'decimal_places': '2',
                            'min_value': '0',
                            'max_value': '20',
                            'readwrite': '0',
                            'description': 'Current (RMS)',
                            'modbus_enable': '1',
                            'modbus_table': 'holding',
                            'modbus_register_count': '1',
                            'modbus_mapping_mode': 'single',
                            'modbus_scale': '100',
                            'bacnet_enable': '1',
                            'bacnet_object_type': 'AI',
                            'bacnet_unit': '8'},
                'activePower': {'name': 'activePower',
                                'json_key': 'activePower',
                                'data_type': 'float',
                                'unit': 'watt',
                                'decimal_places': '2',
                                'min_value': '0',
                                'max_value': '3500',
                                'readwrite': '0',
                                'description': 'Active Power',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '100',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '29'},
                'energy': {'name': 'energy',
                           'json_key': 'energy',
                           'data_type': 'float',
                           'unit': 'kilowatt_hour',
                           'decimal_places': '2',
                           'min_value': '0',
                           'max_value': '999999',
                           'readwrite': '0',
                           'description': 'Energy Consumption',
                           'modbus_enable': '1',
                           'modbus_table': 'holding',
                           'modbus_register_count': '2',
                           'modbus_mapping_mode': 'big_endian',
                           'modbus_scale': '100',
                           'bacnet_enable': '1',
                           'bacnet_object_type': 'AI',
                           'bacnet_unit': '30'},
                'lockState': {'name': 'lockState',
                              'json_key': 'lockState',
                              'data_type': 'int',
                              'unit': 'none',
                              'min_value': '0',
                              'max_value': '1',
                              'readwrite': '1',
                              'description': 'Socket Lock State (0:unlocked, 1:locked)',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'BV',
                              'bacnet_unit': '95'},
                'timerCloseEnabled': {'name': 'timerCloseEnabled',
                                      'json_key': 'timerCloseEnabled',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Timer Close Enabled',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'timerOpenEnabled': {'name': 'timerOpenEnabled',
                                     'json_key': 'timerOpenEnabled',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Timer Open Enabled',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'timerLockEnabled': {'name': 'timerLockEnabled',
                                     'json_key': 'timerLockEnabled',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Timer Lock Enabled',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'timerUnlockEnabled': {'name': 'timerUnlockEnabled',
                                       'json_key': 'timerUnlockEnabled',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'Timer Unlock Enabled',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BI',
                                       'bacnet_unit': '95'},
                'waterStatus': {'name': 'waterStatus',
                                'json_key': 'waterStatus',
                                'data_type': 'bool',
                                'unit': 'none',
                                'readwrite': '0',
                                'description': 'Water Leakage Status (true=water detected)',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'BI',
                                'bacnet_unit': '95'},
                'waterDuration': {'name': 'waterDuration',
                                  'json_key': 'waterDuration',
                                  'data_type': 'int',
                                  'unit': 'minute',
                                  'min_value': '0',
                                  'max_value': '65535',
                                  'readwrite': '0',
                                  'description': 'Water Leakage Duration (minutes)',
                                  'modbus_enable': '1',
                                  'modbus_table': 'holding',
                                  'modbus_register_count': '1',
                                  'modbus_mapping_mode': 'single',
                                  'modbus_scale': '1',
                                  'bacnet_enable': '1',
                                  'bacnet_object_type': 'AI',
                                  'bacnet_unit': '73'},
                'batteryLowEvent': {'name': 'batteryLowEvent',
                                    'json_key': 'batteryLowEvent',
                                    'data_type': 'bool',
                                    'unit': 'none',
                                    'readwrite': '0',
                                    'description': 'Battery Low Voltage Event',
                                    'modbus_enable': '1',
                                    'modbus_table': 'holding',
                                    'modbus_register_count': '1',
                                    'modbus_mapping_mode': 'single',
                                    'modbus_scale': '1',
                                    'bacnet_enable': '1',
                                    'bacnet_object_type': 'BI',
                                    'bacnet_unit': '95'},
                'waterEvent': {'name': 'waterEvent',
                               'json_key': 'waterEvent',
                               'data_type': 'bool',
                               'unit': 'none',
                               'readwrite': '0',
                               'description': 'Water Leakage Event',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'BI',
                               'bacnet_unit': '95'},
                'tamperStatus': {'name': 'tamperStatus',
                                 'json_key': 'tamperStatus',
                                 'data_type': 'bool',
                                 'unit': 'none',
                                 'readwrite': '0',
                                 'description': 'Tamper Detection Status (true=tampered)',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BI',
                                 'bacnet_unit': '95'},
                'doorEvent': {'name': 'doorEvent',
                              'json_key': 'doorEvent',
                              'data_type': 'int',
                              'unit': 'none',
                              'readwrite': '0',
                              'min_value': '0',
                              'max_value': '255',
                              'description': 'Door Open/Close Event',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '95'},
                'sosEvent': {'name': 'sosEvent',
                             'json_key': 'sosEvent',
                             'data_type': 'bool',
                             'unit': 'none',
                             'readwrite': '0',
                             'description': 'SOS Emergency Event',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'BI',
                             'bacnet_unit': '95'},
                'smokeEvent': {'name': 'smokeEvent',
                               'json_key': 'smokeEvent',
                               'data_type': 'int',
                               'unit': 'none',
                               'readwrite': '0',
                               'min_value': '0',
                               'max_value': '255',
                               'description': 'Smoke alarm event code',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AI',
                               'bacnet_unit': '95'},
                'selfCheckEvent': {'name': 'selfCheckEvent',
                                   'json_key': 'selfCheckEvent',
                                   'data_type': 'int',
                                   'unit': 'none',
                                   'readwrite': '0',
                                   'min_value': '0',
                                   'max_value': '255',
                                   'description': 'Sensor self-check event code',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '95'},
                'smokeStatus': {'name': 'smokeStatus',
                                'json_key': 'smokeStatus',
                                'data_type': 'int',
                                'unit': 'none',
                                'readwrite': '0',
                                'min_value': '0',
                                'max_value': '255',
                                'description': 'Smoke alarm status code',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '95'},
                'sosEventTime': {'name': 'sosEventTime',
                                 'json_key': 'sosEventTime',
                                 'data_type': 'timestamp',
                                 'unit': 'second',
                                 'readwrite': '0',
                                 'description': 'SOS Event Timestamp (Unix timestamp)',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '73'},
                'voltageA': {'name': 'voltageA',
                             'json_key': 'voltageA',
                             'data_type': 'float',
                             'unit': 'volt',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '300',
                             'readwrite': '0',
                             'description': 'A-phase voltage',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '10',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '5'},
                'voltageB': {'name': 'voltageB',
                             'json_key': 'voltageB',
                             'data_type': 'float',
                             'unit': 'volt',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '300',
                             'readwrite': '0',
                             'description': 'B-phase voltage',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '10',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '5'},
                'voltageC': {'name': 'voltageC',
                             'json_key': 'voltageC',
                             'data_type': 'float',
                             'unit': 'volt',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '300',
                             'readwrite': '0',
                             'description': 'C-phase voltage',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '10',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '5'},
                'voltageAvg': {'name': 'voltageAvg',
                               'json_key': 'voltageAvg',
                               'data_type': 'float',
                               'unit': 'volt',
                               'decimal_places': '1',
                               'min_value': '0',
                               'max_value': '300',
                               'readwrite': '0',
                               'description': 'Average phase voltage',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '10',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AI',
                               'bacnet_unit': '5'},
                'currentA': {'name': 'currentA',
                             'json_key': 'currentA',
                             'data_type': 'float',
                             'unit': 'ampere',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'A-phase current',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '10',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '3'},
                'currentB': {'name': 'currentB',
                             'json_key': 'currentB',
                             'data_type': 'float',
                             'unit': 'ampere',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'B-phase current',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '10',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '3'},
                'currentC': {'name': 'currentC',
                             'json_key': 'currentC',
                             'data_type': 'float',
                             'unit': 'ampere',
                             'decimal_places': '1',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'C-phase current',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '10',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '3'},
                'activePowerA': {'name': 'activePowerA',
                                 'json_key': 'activePowerA',
                                 'data_type': 'float',
                                 'unit': 'watt',
                                 'decimal_places': '2',
                                 'min_value': '0',
                                 'max_value': '10000',
                                 'readwrite': '0',
                                 'description': 'A-phase active power',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '47'},
                'activePowerTotal': {'name': 'activePowerTotal',
                                     'json_key': 'activePowerTotal',
                                     'data_type': 'float',
                                     'unit': 'watt',
                                     'decimal_places': '2',
                                     'min_value': '0',
                                     'max_value': '30000',
                                     'readwrite': '0',
                                     'description': 'Total active power',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '2',
                                     'modbus_mapping_mode': 'big_endian',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '47'},
                'powerFactorTotal': {'name': 'powerFactorTotal',
                                     'json_key': 'powerFactorTotal',
                                     'data_type': 'float',
                                     'unit': 'none',
                                     'decimal_places': '3',
                                     'min_value': '-1',
                                     'max_value': '1',
                                     'readwrite': '0',
                                     'description': 'Total power factor',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '2',
                                     'modbus_mapping_mode': 'big_endian',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '95'},
                'activeEnergy': {'name': 'activeEnergy',
                                 'json_key': 'activeEnergy',
                                 'data_type': 'float',
                                 'unit': 'kilowatt_hour',
                                 'decimal_places': '2',
                                 'min_value': '0',
                                 'max_value': '999999',
                                 'readwrite': '0',
                                 'description': 'Active energy consumption',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '19'},
                'leakageCurrent': {'name': 'leakageCurrent',
                                   'json_key': 'leakageCurrent',
                                   'data_type': 'float',
                                   'unit': 'milliampere',
                                   'decimal_places': '1',
                                   'min_value': '0',
                                   'max_value': '5000',
                                   'readwrite': '0',
                                   'description': 'Leakage current',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '10',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '2'},
                'tempSensor1': {'name': 'tempSensor1',
                                'json_key': 'tempSensor1',
                                'data_type': 'float',
                                'unit': 'celsius',
                                'decimal_places': '1',
                                'min_value': '-20',
                                'max_value': '110',
                                'readwrite': '0',
                                'description': 'Temperature sensor 1',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '10',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '62'},
                'tempAvg': {'name': 'tempAvg',
                            'json_key': 'tempAvg',
                            'data_type': 'float',
                            'unit': 'celsius',
                            'decimal_places': '1',
                            'min_value': '-20',
                            'max_value': '110',
                            'readwrite': '0',
                            'description': 'Average temperature',
                            'modbus_enable': '1',
                            'modbus_table': 'holding',
                            'modbus_register_count': '1',
                            'modbus_mapping_mode': 'single',
                            'modbus_scale': '10',
                            'bacnet_enable': '1',
                            'bacnet_object_type': 'AI',
                            'bacnet_unit': '62'},
                'envTemperature': {'name': 'envTemperature',
                                   'json_key': 'envTemperature',
                                   'data_type': 'float',
                                   'unit': 'celsius',
                                   'decimal_places': '1',
                                   'min_value': '-20',
                                   'max_value': '85',
                                   'readwrite': '0',
                                   'description': 'Environment temperature',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '10',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '62'},
                'envHumidity': {'name': 'envHumidity',
                                'json_key': 'envHumidity',
                                'data_type': 'float',
                                'unit': 'percent',
                                'decimal_places': '1',
                                'min_value': '0',
                                'max_value': '100',
                                'readwrite': '0',
                                'description': 'Environment humidity',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '10',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '98'},
                'electricalAlarm': {'name': 'electricalAlarm',
                                    'json_key': 'electricalAlarm',
                                    'data_type': 'bool',
                                    'unit': 'none',
                                    'readwrite': '0',
                                    'description': 'Electrical alarm active',
                                    'modbus_enable': '1',
                                    'modbus_table': 'holding',
                                    'modbus_register_count': '1',
                                    'modbus_mapping_mode': 'single',
                                    'modbus_scale': '1',
                                    'bacnet_enable': '1',
                                    'bacnet_object_type': 'BI',
                                    'bacnet_unit': '95'},
                'alarmOvercurrentA': {'name': 'alarmOvercurrentA',
                                      'json_key': 'alarmOvercurrentA',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'A-phase overcurrent alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmLeakage': {'name': 'alarmLeakage',
                                 'json_key': 'alarmLeakage',
                                 'data_type': 'bool',
                                 'unit': 'none',
                                 'readwrite': '0',
                                 'description': 'Leakage current alarm',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BI',
                                 'bacnet_unit': '95'},
                'tiltAngle': {'name': 'tiltAngle',
                              'json_key': 'tiltAngle',
                              'data_type': 'int',
                              'unit': 'degree',
                              'min_value': '0',
                              'max_value': '360',
                              'readwrite': '0',
                              'description': 'Tilt angle in degrees',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '96'},
                'illuminance': {'name': 'illuminance',
                                'json_key': 'illuminance',
                                'data_type': 'int',
                                'unit': 'lux',
                                'min_value': '0',
                                'max_value': '100000',
                                'readwrite': '0',
                                'description': 'Light illuminance in Lux',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '2',
                                'modbus_mapping_mode': 'big_endian',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '86'},
                'liquidLevel': {'name': 'liquidLevel',
                                'json_key': 'liquidLevel',
                                'data_type': 'float',
                                'unit': 'meter',
                                'decimal_places': '2',
                                'min_value': '0',
                                'max_value': '100',
                                'readwrite': '0',
                                'description': 'Liquid level in meters',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '100',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '31'},
                'liquidLevelPercent': {'name': 'liquidLevelPercent',
                                       'json_key': 'liquidLevelPercent',
                                       'data_type': 'float',
                                       'unit': 'percent',
                                       'decimal_places': '1',
                                       'min_value': '0',
                                       'max_value': '100',
                                       'readwrite': '0',
                                       'description': 'Liquid level percentage',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '10',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AI',
                                       'bacnet_unit': '98'},
                'atmosphericPressure': {'name': 'atmosphericPressure',
                                        'json_key': 'atmosphericPressure',
                                        'data_type': 'int',
                                        'unit': 'pascal',
                                        'min_value': '80000',
                                        'max_value': '120000',
                                        'readwrite': '0',
                                        'description': 'Atmospheric pressure in Pascals',
                                        'modbus_enable': '1',
                                        'modbus_table': 'holding',
                                        'modbus_register_count': '2',
                                        'modbus_mapping_mode': 'big_endian',
                                        'modbus_scale': '1',
                                        'bacnet_enable': '1',
                                        'bacnet_object_type': 'AI',
                                        'bacnet_unit': '100'},
                'altitude': {'name': 'altitude',
                             'json_key': 'altitude',
                             'data_type': 'float',
                             'unit': 'meter',
                             'decimal_places': '1',
                             'min_value': '-1000',
                             'max_value': '10000',
                             'readwrite': '0',
                             'description': 'altitude',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '2',
                             'modbus_mapping_mode': 'big_endian',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '31'},
                'switch1State': {'name': 'switch1State',
                                 'json_key': 'switch1State',
                                 'data_type': 'bool',
                                 'unit': 'none',
                                 'readwrite': '1',
                                 'description': 'Switch 1 state (0=off, 1=on)',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BV',
                                 'bacnet_unit': '95'},
                'switch2State': {'name': 'switch2State',
                                 'json_key': 'switch2State',
                                 'data_type': 'bool',
                                 'unit': 'none',
                                 'readwrite': '1',
                                 'description': 'Switch 2 state (0=off, 1=on)',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BV',
                                 'bacnet_unit': '95'},
                'switch3State': {'name': 'switch3State',
                                 'json_key': 'switch3State',
                                 'data_type': 'bool',
                                 'unit': 'none',
                                 'readwrite': '1',
                                 'description': 'Switch 3 state (0=off, 1=on)',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BV',
                                 'bacnet_unit': '95'},
                'alarmStatus': {'name': 'alarmStatus',
                                'json_key': 'alarmStatus',
                                'data_type': 'bool',
                                'unit': 'none',
                                'readwrite': '1',
                                'description': 'Sound & light alarm status (0=off, 1=on)',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'BV',
                                'bacnet_unit': '95'},
                'alarmDurationSeconds': {'name': 'alarmDurationSeconds',
                                         'json_key': 'alarmDurationSeconds',
                                         'data_type': 'int',
                                         'unit': 'seconds',
                                         'min_value': '0',
                                         'max_value': '65535',
                                         'readwrite': '1',
                                         'description': 'Optional auto-off delay in seconds for AN-307 alarm control',
                                         'modbus_enable': '1',
                                         'modbus_table': 'holding',
                                         'modbus_register_count': '1',
                                         'modbus_mapping_mode': 'single',
                                         'modbus_scale': '1',
                                         'bacnet_enable': '1',
                                         'bacnet_object_type': 'AV',
                                         'bacnet_unit': '73'},
                'vibFreqX': {'name': 'vibFreqX',
                             'json_key': 'vibFreqX',
                             'data_type': 'int',
                             'unit': 'hertz',
                             'min_value': '0',
                             'max_value': '1000',
                             'readwrite': '0',
                             'description': 'X-axis vibration frequency in Hz',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '72'},
                'vibAccelX': {'name': 'vibAccelX',
                              'json_key': 'vibAccelX',
                              'data_type': 'int',
                              'unit': 'millig',
                              'min_value': '0',
                              'max_value': '20000',
                              'readwrite': '0',
                              'description': 'X-axis acceleration in mg',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '166'},
                'vibVelX': {'name': 'vibVelX',
                            'json_key': 'vibVelX',
                            'data_type': 'float',
                            'unit': 'millimeter_per_second',
                            'decimal_places': '1',
                            'min_value': '0',
                            'max_value': '1000',
                            'readwrite': '0',
                            'description': 'X-axis velocity in mm/s',
                            'modbus_enable': '1',
                            'modbus_table': 'holding',
                            'modbus_register_count': '1',
                            'modbus_mapping_mode': 'single',
                            'modbus_scale': '10',
                            'bacnet_enable': '1',
                            'bacnet_object_type': 'AI',
                            'bacnet_unit': '134'},
                'fallAlarmStatus': {'name': 'fallAlarmStatus',
                                    'json_key': 'fallAlarmStatus',
                                    'data_type': 'bool',
                                    'unit': 'none',
                                    'readwrite': '0',
                                    'description': 'Fall detection alarm status (0=no alarm, 1=alarm)',
                                    'modbus_enable': '1',
                                    'modbus_table': 'holding',
                                    'modbus_register_count': '1',
                                    'modbus_mapping_mode': 'single',
                                    'modbus_scale': '1',
                                    'bacnet_enable': '1',
                                    'bacnet_object_type': 'BI',
                                    'bacnet_unit': '95'},
                'helmetRemovalAlarmStatus': {'name': 'helmetRemovalAlarmStatus',
                                             'json_key': 'helmetRemovalAlarmStatus',
                                             'data_type': 'bool',
                                             'unit': 'none',
                                             'readwrite': '0',
                                             'description': 'Helmet removal alarm status (0=no alarm, 1=alarm)',
                                             'modbus_enable': '1',
                                             'modbus_table': 'holding',
                                             'modbus_register_count': '1',
                                             'modbus_mapping_mode': 'single',
                                             'modbus_scale': '1',
                                             'bacnet_enable': '1',
                                             'bacnet_object_type': 'BI',
                                             'bacnet_unit': '95'},
                'electricityProximityAlarmStatus': {'name': 'electricityProximityAlarmStatus',
                                                    'json_key': 'electricityProximityAlarmStatus',
                                                    'data_type': 'bool',
                                                    'unit': 'none',
                                                    'readwrite': '0',
                                                    'description': 'Proximity to electricity alarm status (0=no alarm, '
                                                                   '1=alarm)',
                                                    'modbus_enable': '1',
                                                    'modbus_table': 'holding',
                                                    'modbus_register_count': '1',
                                                    'modbus_mapping_mode': 'single',
                                                    'modbus_scale': '1',
                                                    'bacnet_enable': '1',
                                                    'bacnet_object_type': 'BI',
                                                    'bacnet_unit': '95'},
                'temperatureAlarmStatus': {'name': 'temperatureAlarmStatus',
                                           'json_key': 'temperatureAlarmStatus',
                                           'data_type': 'int',
                                           'unit': 'none',
                                           'min_value': '0',
                                           'max_value': '3',
                                           'readwrite': '0',
                                           'description': 'Temperature alarm status (0=normal, 1=too low, 2=too high, '
                                                          '3=cannot collect)',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'AI',
                                           'bacnet_unit': '95'},
                'batteryLowAlarm': {'name': 'batteryLowAlarm',
                                    'json_key': 'batteryLowAlarm',
                                    'data_type': 'bool',
                                    'unit': 'none',
                                    'readwrite': '0',
                                    'description': 'Battery low percentage alarm',
                                    'modbus_enable': '1',
                                    'modbus_table': 'holding',
                                    'modbus_register_count': '1',
                                    'modbus_mapping_mode': 'single',
                                    'modbus_scale': '1',
                                    'bacnet_enable': '1',
                                    'bacnet_object_type': 'BI',
                                    'bacnet_unit': '95'},
                'accelerationAlarm': {'name': 'accelerationAlarm',
                                      'json_key': 'accelerationAlarm',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Acceleration alarm (0=normal, 1=alarm)',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'tiltAlarm': {'name': 'tiltAlarm',
                              'json_key': 'tiltAlarm',
                              'data_type': 'bool',
                              'unit': 'none',
                              'readwrite': '0',
                              'description': 'Tilt angle alarm (0=normal, 1=alarm)',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'BI',
                              'bacnet_unit': '95'},
                'sensorAbnormal': {'name': 'sensorAbnormal',
                                   'json_key': 'sensorAbnormal',
                                   'data_type': 'bool',
                                   'unit': 'none',
                                   'readwrite': '0',
                                   'description': 'Sensor abnormal status (0=normal, 1=abnormal)',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'BI',
                                   'bacnet_unit': '95'},
                'liquidLevelStatus': {'name': 'liquidLevelStatus',
                                      'json_key': 'liquidLevelStatus',
                                      'data_type': 'int',
                                      'unit': 'none',
                                      'min_value': '0',
                                      'max_value': '2',
                                      'readwrite': '0',
                                      'description': 'Liquid level status (0=normal, 1=too low, 2=too high)',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'AI',
                                      'bacnet_unit': '95'},
                'vibrationAlarmStatus': {'name': 'vibrationAlarmStatus',
                                         'json_key': 'vibrationAlarmStatus',
                                         'data_type': 'int',
                                         'unit': 'none',
                                         'min_value': '0',
                                         'max_value': '65535',
                                         'readwrite': '0',
                                         'description': 'Vibration alarm status bitfield',
                                         'modbus_enable': '1',
                                         'modbus_table': 'holding',
                                         'modbus_register_count': '1',
                                         'modbus_mapping_mode': 'single',
                                         'modbus_scale': '1',
                                         'bacnet_enable': '1',
                                         'bacnet_object_type': 'AI',
                                         'bacnet_unit': '95'},
                'safetyAlarmActive': {'name': 'safetyAlarmActive',
                                      'json_key': 'safetyAlarmActive',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Any safety alarm active (0=normal, 1=alarm)',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'latitude': {'name': 'latitude',
                             'json_key': 'latitude',
                             'data_type': 'float',
                             'unit': 'degrees',
                             'decimal_places': '6',
                             'min_value': '-90',
                             'max_value': '90',
                             'readwrite': '0',
                             'description': 'GPS latitude',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '2',
                             'modbus_mapping_mode': 'big_endian',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '95'},
                'longitude': {'name': 'longitude',
                              'json_key': 'longitude',
                              'data_type': 'float',
                              'unit': 'degrees',
                              'decimal_places': '6',
                              'min_value': '-180',
                              'max_value': '180',
                              'readwrite': '0',
                              'description': 'GPS longitude',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '2',
                              'modbus_mapping_mode': 'big_endian',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '95'},
                'positionAccuracy': {'name': 'positionAccuracy',
                                     'json_key': 'positionAccuracy',
                                     'data_type': 'float',
                                     'unit': 'meter',
                                     'decimal_places': '2',
                                     'min_value': '0',
                                     'max_value': '1000',
                                     'readwrite': '0',
                                     'description': 'GPS position accuracy',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '2',
                                     'modbus_mapping_mode': 'big_endian',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '31'},
                'gpsAbsoluteTimestamp': {'name': 'gpsAbsoluteTimestamp',
                                         'json_key': 'gpsAbsoluteTimestamp',
                                         'data_type': 'timestamp',
                                         'unit': 'second',
                                         'readwrite': '0',
                                         'description': 'GPS absolute timestamp',
                                         'modbus_enable': '1',
                                         'modbus_table': 'holding',
                                         'modbus_register_count': '2',
                                         'modbus_mapping_mode': 'big_endian',
                                         'modbus_scale': '1',
                                         'bacnet_enable': '1',
                                         'bacnet_object_type': 'AI',
                                         'bacnet_unit': '73'},
                'gpsTimeValid': {'name': 'gpsTimeValid',
                                 'json_key': 'gpsTimeValid',
                                 'data_type': 'bool',
                                 'unit': 'none',
                                 'readwrite': '0',
                                 'description': 'time-valid flag',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '1',
                                 'modbus_mapping_mode': 'single',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'BI',
                                 'bacnet_unit': '95'},
                'timestamp': {'name': 'timestamp',
                              'json_key': 'timestamp',
                              'data_type': 'int',
                              'unit': 'seconds',
                              'min_value': '0',
                              'max_value': '4294967295',
                              'readwrite': '0',
                              'description': 'Unix timestamp in seconds',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '2',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '95'},
                'vibratingWireSensorModel': {'name': 'vibratingWireSensorModel',
                                             'json_key': 'vibratingWireSensorModel',
                                             'data_type': 'int',
                                             'unit': 'none',
                                             'min_value': '0',
                                             'max_value': '255',
                                             'readwrite': '0',
                                             'description': 'Vibrating wire sensor model code',
                                             'modbus_enable': '1',
                                             'modbus_table': 'holding',
                                             'modbus_register_count': '1',
                                             'modbus_mapping_mode': 'single',
                                             'modbus_scale': '1',
                                             'bacnet_enable': '1',
                                             'bacnet_object_type': 'AI',
                                             'bacnet_unit': '95'},
                'frequency': {'name': 'frequency',
                              'json_key': 'frequency',
                              'data_type': 'float',
                              'unit': 'hertz',
                              'decimal_places': '2',
                              'min_value': '0',
                              'max_value': '10000',
                              'readwrite': '0',
                              'description': 'Latest vibrating wire frequency in Hz',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '2',
                              'modbus_mapping_mode': 'big_endian',
                              'modbus_scale': '100',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '72'},
                'frequencyDigit': {'name': 'frequencyDigit',
                                   'json_key': 'frequencyDigit',
                                   'data_type': 'float',
                                   'unit': 'digit',
                                   'decimal_places': '2',
                                   'min_value': '0',
                                   'max_value': '1000000',
                                   'readwrite': '0',
                                   'description': 'Latest frequency modulus digit calculated by f^2/1000',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '100',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '95'},
                'initialFrequency': {'name': 'initialFrequency',
                                     'json_key': 'initialFrequency',
                                     'data_type': 'float',
                                     'unit': 'hertz',
                                     'decimal_places': '2',
                                     'min_value': '0',
                                     'max_value': '10000',
                                     'readwrite': '0',
                                     'description': 'Initial baseline vibrating wire frequency in Hz',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '2',
                                     'modbus_mapping_mode': 'big_endian',
                                     'modbus_scale': '100',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '72'},
                'initialFrequencyDigit': {'name': 'initialFrequencyDigit',
                                          'json_key': 'initialFrequencyDigit',
                                          'data_type': 'float',
                                          'unit': 'digit',
                                          'decimal_places': '2',
                                          'min_value': '0',
                                          'max_value': '1000000',
                                          'readwrite': '0',
                                          'description': 'Initial baseline frequency modulus digit calculated by '
                                                         'f^2/1000',
                                          'modbus_enable': '1',
                                          'modbus_table': 'holding',
                                          'modbus_register_count': '2',
                                          'modbus_mapping_mode': 'big_endian',
                                          'modbus_scale': '100',
                                          'bacnet_enable': '1',
                                          'bacnet_object_type': 'AI',
                                          'bacnet_unit': '95'},
                'initialTemperature': {'name': 'initialTemperature',
                                       'json_key': 'initialTemperature',
                                       'data_type': 'float',
                                       'unit': 'celsius',
                                       'decimal_places': '1',
                                       'min_value': '-100',
                                       'max_value': '500',
                                       'readwrite': '0',
                                       'description': 'Initial baseline temperature',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '10',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AI',
                                       'bacnet_unit': '62'},
                'correctionFactor': {'name': 'correctionFactor',
                                     'json_key': 'correctionFactor',
                                     'data_type': 'float',
                                     'unit': 'none',
                                     'decimal_places': '4',
                                     'min_value': '0',
                                     'max_value': '10',
                                     'readwrite': '0',
                                     'description': 'Average correction factor C used in strain calculation, default '
                                                    '1.0',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '2',
                                     'modbus_mapping_mode': 'big_endian',
                                     'modbus_scale': '10000',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '95'},
                'steelStructureStrain': {'name': 'steelStructureStrain',
                                         'json_key': 'steelStructureStrain',
                                         'data_type': 'float',
                                         'unit': 'microstrain',
                                         'decimal_places': '2',
                                         'min_value': '-5000000',
                                         'max_value': '5000000',
                                         'readwrite': '0',
                                         'description': 'Calculated strain for surface-mounted steel structure in '
                                                        'microstrain',
                                         'modbus_enable': '1',
                                         'modbus_table': 'holding',
                                         'modbus_register_count': '2',
                                         'modbus_mapping_mode': 'big_endian',
                                         'modbus_scale': '100',
                                         'bacnet_enable': '1',
                                         'bacnet_object_type': 'AI',
                                         'bacnet_unit': '95'},
                'concreteStructureStrain': {'name': 'concreteStructureStrain',
                                            'json_key': 'concreteStructureStrain',
                                            'data_type': 'float',
                                            'unit': 'microstrain',
                                            'decimal_places': '2',
                                            'min_value': '-5000000',
                                            'max_value': '5000000',
                                            'readwrite': '0',
                                            'description': 'Calculated strain for surface-mounted concrete structure '
                                                           'in microstrain',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '2',
                                            'modbus_mapping_mode': 'big_endian',
                                            'modbus_scale': '100',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'AI',
                                            'bacnet_unit': '95'},
                'isHeartbeat': {'name': 'isHeartbeat',
                                'json_key': 'isHeartbeat',
                                'data_type': 'bool',
                                'unit': 'none',
                                'readwrite': '0',
                                'description': 'Heartbeat message indicator',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'BI',
                                'bacnet_unit': '95'},
                'beaconIdHex': {'name': 'beaconIdHex',
                                'json_key': 'beaconIdHex',
                                'data_type': 'string',
                                'unit': 'none',
                                'string_max_len': '32',
                                'readwrite': '0',
                                'description': 'Latest beacon identifier in hexadecimal',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '16',
                                'modbus_mapping_mode': 'string',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'CV',
                                'bacnet_unit': '95'},
                'beaconRssi': {'name': 'beaconRssi',
                               'json_key': 'beaconRssi',
                               'data_type': 'int',
                               'unit': 'none',
                               'min_value': '-120',
                               'max_value': '0',
                               'readwrite': '0',
                               'description': 'Latest beacon RSSI signal strength',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AI',
                               'bacnet_unit': '95'},
                'beaconBatteryLevel': {'name': 'beaconBatteryLevel',
                                       'json_key': 'beaconBatteryLevel',
                                       'data_type': 'int',
                                       'unit': 'percent',
                                       'min_value': '0',
                                       'max_value': '100',
                                       'readwrite': '0',
                                       'description': 'Latest beacon battery level percentage',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AI',
                                       'bacnet_unit': '98'},
                'beaconBatteryValid': {'name': 'beaconBatteryValid',
                                       'json_key': 'beaconBatteryValid',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'Latest beacon battery level valid flag',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BI',
                                       'bacnet_unit': '95'},
                'vibFreqY': {'name': 'vibFreqY',
                             'json_key': 'vibFreqY',
                             'data_type': 'int',
                             'unit': 'hertz',
                             'min_value': '0',
                             'max_value': '1000',
                             'readwrite': '0',
                             'description': 'Y-axis vibration frequency in Hz',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '72'},
                'vibFreqZ': {'name': 'vibFreqZ',
                             'json_key': 'vibFreqZ',
                             'data_type': 'int',
                             'unit': 'hertz',
                             'min_value': '0',
                             'max_value': '1000',
                             'readwrite': '0',
                             'description': 'Z-axis vibration frequency in Hz',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '72'},
                'vibAccelY': {'name': 'vibAccelY',
                              'json_key': 'vibAccelY',
                              'data_type': 'float',
                              'unit': 'g',
                              'decimal_places': '3',
                              'min_value': '0',
                              'max_value': '100',
                              'readwrite': '0',
                              'description': 'Y-axis vibration acceleration in g',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1000',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '95'},
                'vibAccelZ': {'name': 'vibAccelZ',
                              'json_key': 'vibAccelZ',
                              'data_type': 'float',
                              'unit': 'g',
                              'decimal_places': '3',
                              'min_value': '0',
                              'max_value': '100',
                              'readwrite': '0',
                              'description': 'Z-axis vibration acceleration in g',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '1000',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AI',
                              'bacnet_unit': '95'},
                'vibVelY': {'name': 'vibVelY',
                            'json_key': 'vibVelY',
                            'data_type': 'float',
                            'unit': 'mm/s',
                            'decimal_places': '2',
                            'min_value': '0',
                            'max_value': '1000',
                            'readwrite': '0',
                            'description': 'Y-axis vibration velocity in mm/s',
                            'modbus_enable': '1',
                            'modbus_table': 'holding',
                            'modbus_register_count': '1',
                            'modbus_mapping_mode': 'single',
                            'modbus_scale': '100',
                            'bacnet_enable': '1',
                            'bacnet_object_type': 'AI',
                            'bacnet_unit': '95'},
                'vibVelZ': {'name': 'vibVelZ',
                            'json_key': 'vibVelZ',
                            'data_type': 'float',
                            'unit': 'mm/s',
                            'decimal_places': '2',
                            'min_value': '0',
                            'max_value': '1000',
                            'readwrite': '0',
                            'description': 'Z-axis vibration velocity in mm/s',
                            'modbus_enable': '1',
                            'modbus_table': 'holding',
                            'modbus_register_count': '1',
                            'modbus_mapping_mode': 'single',
                            'modbus_scale': '100',
                            'bacnet_enable': '1',
                            'bacnet_object_type': 'AI',
                            'bacnet_unit': '95'},
                'vibDispX': {'name': 'vibDispX',
                             'json_key': 'vibDispX',
                             'data_type': 'float',
                             'unit': 'mm',
                             'decimal_places': '3',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'X-axis vibration displacement in mm',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1000',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '95'},
                'vibDispY': {'name': 'vibDispY',
                             'json_key': 'vibDispY',
                             'data_type': 'float',
                             'unit': 'mm',
                             'decimal_places': '3',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'Y-axis vibration displacement in mm',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1000',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '95'},
                'vibDispZ': {'name': 'vibDispZ',
                             'json_key': 'vibDispZ',
                             'data_type': 'float',
                             'unit': 'mm',
                             'decimal_places': '3',
                             'min_value': '0',
                             'max_value': '100',
                             'readwrite': '0',
                             'description': 'Z-axis vibration displacement in mm',
                             'modbus_enable': '1',
                             'modbus_table': 'holding',
                             'modbus_register_count': '1',
                             'modbus_mapping_mode': 'single',
                             'modbus_scale': '1000',
                             'bacnet_enable': '1',
                             'bacnet_object_type': 'AI',
                             'bacnet_unit': '95'},
                'alarmAccelX': {'name': 'alarmAccelX',
                                'json_key': 'alarmAccelX',
                                'data_type': 'float',
                                'unit': 'g',
                                'decimal_places': '3',
                                'min_value': '0',
                                'max_value': '100',
                                'readwrite': '1',
                                'description': 'X-axis acceleration alarm threshold in g',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1000',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AV',
                                'bacnet_unit': '95'},
                'alarmAccelY': {'name': 'alarmAccelY',
                                'json_key': 'alarmAccelY',
                                'data_type': 'float',
                                'unit': 'g',
                                'decimal_places': '3',
                                'min_value': '0',
                                'max_value': '100',
                                'readwrite': '1',
                                'description': 'Y-axis acceleration alarm threshold in g',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1000',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AV',
                                'bacnet_unit': '95'},
                'alarmAccelZ': {'name': 'alarmAccelZ',
                                'json_key': 'alarmAccelZ',
                                'data_type': 'float',
                                'unit': 'g',
                                'decimal_places': '3',
                                'min_value': '0',
                                'max_value': '100',
                                'readwrite': '1',
                                'description': 'Z-axis acceleration alarm threshold in g',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '1000',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AV',
                                'bacnet_unit': '95'},
                'alarmVelX': {'name': 'alarmVelX',
                              'json_key': 'alarmVelX',
                              'data_type': 'float',
                              'unit': 'mm/s',
                              'decimal_places': '2',
                              'min_value': '0',
                              'max_value': '1000',
                              'readwrite': '1',
                              'description': 'X-axis velocity alarm threshold in mm/s',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '100',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AV',
                              'bacnet_unit': '95'},
                'alarmVelY': {'name': 'alarmVelY',
                              'json_key': 'alarmVelY',
                              'data_type': 'float',
                              'unit': 'mm/s',
                              'decimal_places': '2',
                              'min_value': '0',
                              'max_value': '1000',
                              'readwrite': '1',
                              'description': 'Y-axis velocity alarm threshold in mm/s',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '100',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AV',
                              'bacnet_unit': '95'},
                'alarmVelZ': {'name': 'alarmVelZ',
                              'json_key': 'alarmVelZ',
                              'data_type': 'float',
                              'unit': 'mm/s',
                              'decimal_places': '2',
                              'min_value': '0',
                              'max_value': '1000',
                              'readwrite': '1',
                              'description': 'Z-axis velocity alarm threshold in mm/s',
                              'modbus_enable': '1',
                              'modbus_table': 'holding',
                              'modbus_register_count': '1',
                              'modbus_mapping_mode': 'single',
                              'modbus_scale': '100',
                              'bacnet_enable': '1',
                              'bacnet_object_type': 'AV',
                              'bacnet_unit': '95'},
                'alarmDispX': {'name': 'alarmDispX',
                               'json_key': 'alarmDispX',
                               'data_type': 'float',
                               'unit': 'mm',
                               'decimal_places': '3',
                               'min_value': '0',
                               'max_value': '100',
                               'readwrite': '1',
                               'description': 'X-axis displacement alarm threshold in mm',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1000',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AV',
                               'bacnet_unit': '95'},
                'alarmDispY': {'name': 'alarmDispY',
                               'json_key': 'alarmDispY',
                               'data_type': 'float',
                               'unit': 'mm',
                               'decimal_places': '3',
                               'min_value': '0',
                               'max_value': '100',
                               'readwrite': '1',
                               'description': 'Y-axis displacement alarm threshold in mm',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1000',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AV',
                               'bacnet_unit': '95'},
                'alarmDispZ': {'name': 'alarmDispZ',
                               'json_key': 'alarmDispZ',
                               'data_type': 'float',
                               'unit': 'mm',
                               'decimal_places': '3',
                               'min_value': '0',
                               'max_value': '100',
                               'readwrite': '1',
                               'description': 'Z-axis displacement alarm threshold in mm',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '1000',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AV',
                               'bacnet_unit': '95'},
                'timerOpenEnabled1': {'name': 'timerOpenEnabled1',
                                      'json_key': 'timerOpenEnabled1',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Timer open enable for channel 1',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BV',
                                      'bacnet_unit': '95'},
                'timerOpenEnabled2': {'name': 'timerOpenEnabled2',
                                      'json_key': 'timerOpenEnabled2',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Timer open enable for channel 2',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BV',
                                      'bacnet_unit': '95'},
                'timerOpenEnabled3': {'name': 'timerOpenEnabled3',
                                      'json_key': 'timerOpenEnabled3',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Timer open enable for channel 3',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BV',
                                      'bacnet_unit': '95'},
                'timerCloseEnabled1': {'name': 'timerCloseEnabled1',
                                       'json_key': 'timerCloseEnabled1',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'Timer close enable for channel 1',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BV',
                                       'bacnet_unit': '95'},
                'timerCloseEnabled2': {'name': 'timerCloseEnabled2',
                                       'json_key': 'timerCloseEnabled2',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'Timer close enable for channel 2',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BV',
                                       'bacnet_unit': '95'},
                'timerCloseEnabled3': {'name': 'timerCloseEnabled3',
                                       'json_key': 'timerCloseEnabled3',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'Timer close enable for channel 3',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BV',
                                       'bacnet_unit': '95'},
                'temperatureEvent': {'name': 'temperatureEvent',
                                     'json_key': 'temperatureEvent',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Temperature alarm event',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'presenceEvent': {'name': 'presenceEvent',
                                  'json_key': 'presenceEvent',
                                  'data_type': 'int',
                                  'unit': 'none',
                                  'readwrite': '0',
                                  'min_value': '0',
                                  'max_value': '255',
                                  'description': 'Presence detection event code',
                                  'modbus_enable': '1',
                                  'modbus_table': 'holding',
                                  'modbus_register_count': '1',
                                  'modbus_mapping_mode': 'single',
                                  'modbus_scale': '1',
                                  'bacnet_enable': '1',
                                  'bacnet_object_type': 'AI',
                                  'bacnet_unit': '95'},
                'liquidLevelEvent': {'name': 'liquidLevelEvent',
                                     'json_key': 'liquidLevelEvent',
                                     'data_type': 'int',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'min_value': '0',
                                     'max_value': '255',
                                     'description': 'Liquid level change event code',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AI',
                                     'bacnet_unit': '95'},
                'vibrationAlarmEvent': {'name': 'vibrationAlarmEvent',
                                        'json_key': 'vibrationAlarmEvent',
                                        'data_type': 'bool',
                                        'unit': 'none',
                                        'readwrite': '0',
                                        'description': 'Vibration alarm event',
                                        'modbus_enable': '1',
                                        'modbus_table': 'holding',
                                        'modbus_register_count': '1',
                                        'modbus_mapping_mode': 'single',
                                        'modbus_scale': '1',
                                        'bacnet_enable': '1',
                                        'bacnet_object_type': 'BI',
                                        'bacnet_unit': '95'},
                'fallAlarmEvent': {'name': 'fallAlarmEvent',
                                   'json_key': 'fallAlarmEvent',
                                   'data_type': 'bool',
                                   'unit': 'none',
                                   'readwrite': '0',
                                   'description': 'Fall detection alarm event',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '1',
                                   'modbus_mapping_mode': 'single',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'BI',
                                   'bacnet_unit': '95'},
                'helmetRemovalAlarmEvent': {'name': 'helmetRemovalAlarmEvent',
                                            'json_key': 'helmetRemovalAlarmEvent',
                                            'data_type': 'bool',
                                            'unit': 'none',
                                            'readwrite': '0',
                                            'description': 'Helmet removal alarm event',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '1',
                                            'modbus_mapping_mode': 'single',
                                            'modbus_scale': '1',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'BI',
                                            'bacnet_unit': '95'},
                'electricityProximityAlarmEvent': {'name': 'electricityProximityAlarmEvent',
                                                   'json_key': 'electricityProximityAlarmEvent',
                                                   'data_type': 'bool',
                                                   'unit': 'none',
                                                   'readwrite': '0',
                                                   'description': 'Electricity proximity alarm event',
                                                   'modbus_enable': '1',
                                                   'modbus_table': 'holding',
                                                   'modbus_register_count': '1',
                                                   'modbus_mapping_mode': 'single',
                                                   'modbus_scale': '1',
                                                   'bacnet_enable': '1',
                                                   'bacnet_object_type': 'BI',
                                                   'bacnet_unit': '95'},
                'impactAlarmEvent': {'name': 'impactAlarmEvent',
                                     'json_key': 'impactAlarmEvent',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Impact detection alarm event',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'silenceAlarmEvent': {'name': 'silenceAlarmEvent',
                                      'json_key': 'silenceAlarmEvent',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Silence alarm event',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmEventActive': {'name': 'alarmEventActive',
                                     'json_key': 'alarmEventActive',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'General alarm event active flag',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'impactAlarmStatus': {'name': 'impactAlarmStatus',
                                      'json_key': 'impactAlarmStatus',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Impact alarm status',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'silenceAlarmStatus': {'name': 'silenceAlarmStatus',
                                       'json_key': 'silenceAlarmStatus',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'Silence alarm status',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BI',
                                       'bacnet_unit': '95'},
                'heightAccessAlarmStatus': {'name': 'heightAccessAlarmStatus',
                                            'json_key': 'heightAccessAlarmStatus',
                                            'data_type': 'bool',
                                            'unit': 'none',
                                            'readwrite': '0',
                                            'description': 'Height access alarm status',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '1',
                                            'modbus_mapping_mode': 'single',
                                            'modbus_scale': '1',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'BI',
                                            'bacnet_unit': '95'},
                'heightAccessAlarmEvent': {'name': 'heightAccessAlarmEvent',
                                           'json_key': 'heightAccessAlarmEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'Height access alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'switchTimerStatus': {'name': 'switchTimerStatus',
                                      'json_key': 'switchTimerStatus',
                                      'data_type': 'int',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'min_value': '0',
                                      'max_value': '4294967295',
                                      'description': 'Switch timer status bitfield',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '2',
                                      'modbus_mapping_mode': 'big_endian',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'AI',
                                      'bacnet_unit': '95'},
                'ds103ControlTarget': {'name': 'ds103ControlTarget',
                                       'json_key': 'ds103ControlTarget',
                                       'data_type': 'int',
                                       'unit': 'none',
                                       'min_value': '1',
                                       'max_value': '255',
                                       'readwrite': '1',
                                       'description': 'DS-103 control target (1=left, 2=middle, 3=right, 254=lock, '
                                                      '255=all switches)',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AV',
                                       'bacnet_unit': '95'},
                'ds103ControlState': {'name': 'ds103ControlState',
                                      'json_key': 'ds103ControlState',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '1',
                                      'description': 'DS-103 control state (switch: 0=off,1=on; lock: 0=unlock,1=lock)',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BV',
                                      'bacnet_unit': '95'},
                'ds103ControlMode': {'name': 'ds103ControlMode',
                                     'json_key': 'ds103ControlMode',
                                     'data_type': 'int',
                                     'unit': 'none',
                                     'min_value': '0',
                                     'max_value': '4',
                                     'readwrite': '1',
                                     'description': 'DS-103 control mode (0=immediate, 1=delay, 2=schedule, '
                                                    '3=cancelTimer, 4=query)',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AV',
                                     'bacnet_unit': '95'},
                'ds103DelaySeconds': {'name': 'ds103DelaySeconds',
                                      'json_key': 'ds103DelaySeconds',
                                      'data_type': 'int',
                                      'unit': 'seconds',
                                      'min_value': '0',
                                      'max_value': '4294967295',
                                      'readwrite': '1',
                                      'description': 'DS-103 delay time in seconds for delayed commands',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '2',
                                      'modbus_mapping_mode': 'big_endian',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'AV',
                                      'bacnet_unit': '73'},
                'ds103ScheduleTimestamp': {'name': 'ds103ScheduleTimestamp',
                                           'json_key': 'ds103ScheduleTimestamp',
                                           'data_type': 'timestamp',
                                           'unit': 'seconds',
                                           'min_value': '0',
                                           'max_value': '4294967295',
                                           'readwrite': '1',
                                           'description': 'DS-103 scheduled execution timestamp in Unix seconds',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '2',
                                           'modbus_mapping_mode': 'big_endian',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'AV',
                                           'bacnet_unit': '73'},
                'ds103RepeatDaily': {'name': 'ds103RepeatDaily',
                                     'json_key': 'ds103RepeatDaily',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '1',
                                     'description': 'DS-103 schedule repeat mode (0=once, 1=daily)',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BV',
                                     'bacnet_unit': '95'},
                'ds501ControlTarget': {'name': 'ds501ControlTarget',
                                       'json_key': 'ds501ControlTarget',
                                       'data_type': 'int',
                                       'unit': 'none',
                                       'min_value': '1',
                                       'max_value': '255',
                                       'readwrite': '1',
                                       'description': 'DS-501 control target (1=socket, 254=lock, 255=query)',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AV',
                                       'bacnet_unit': '95'},
                'ds501ControlState': {'name': 'ds501ControlState',
                                      'json_key': 'ds501ControlState',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '1',
                                      'description': 'DS-501 control state (socket: 0=off,1=on; lock: 0=unlock,1=lock)',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BV',
                                      'bacnet_unit': '95'},
                'ds501ControlMode': {'name': 'ds501ControlMode',
                                     'json_key': 'ds501ControlMode',
                                     'data_type': 'int',
                                     'unit': 'none',
                                     'min_value': '0',
                                     'max_value': '4',
                                     'readwrite': '1',
                                     'description': 'DS-501 control mode (0=immediate, 1=delay, 2=schedule, '
                                                    '3=cancelTimer, 4=query)',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'AV',
                                     'bacnet_unit': '95'},
                'ds501DelaySeconds': {'name': 'ds501DelaySeconds',
                                      'json_key': 'ds501DelaySeconds',
                                      'data_type': 'int',
                                      'unit': 'seconds',
                                      'min_value': '0',
                                      'max_value': '4294967295',
                                      'readwrite': '1',
                                      'description': 'DS-501 delay time in seconds for delayed commands',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '2',
                                      'modbus_mapping_mode': 'big_endian',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'AV',
                                      'bacnet_unit': '73'},
                'ds501ScheduleTimestamp': {'name': 'ds501ScheduleTimestamp',
                                           'json_key': 'ds501ScheduleTimestamp',
                                           'data_type': 'timestamp',
                                           'unit': 'seconds',
                                           'min_value': '0',
                                           'max_value': '4294967295',
                                           'readwrite': '1',
                                           'description': 'DS-501 scheduled execution timestamp in Unix seconds',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '2',
                                           'modbus_mapping_mode': 'big_endian',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'AV',
                                           'bacnet_unit': '73'},
                'ds501RepeatDaily': {'name': 'ds501RepeatDaily',
                                     'json_key': 'ds501RepeatDaily',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '1',
                                     'description': 'DS-501 schedule repeat mode (0=once, 1=daily)',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BV',
                                     'bacnet_unit': '95'},
                'currentAvg': {'name': 'currentAvg',
                               'json_key': 'currentAvg',
                               'data_type': 'float',
                               'unit': 'ampere',
                               'decimal_places': '1',
                               'min_value': '0',
                               'max_value': '100',
                               'readwrite': '0',
                               'description': 'Average three-phase current',
                               'modbus_enable': '1',
                               'modbus_table': 'holding',
                               'modbus_register_count': '1',
                               'modbus_mapping_mode': 'single',
                               'modbus_scale': '10',
                               'bacnet_enable': '1',
                               'bacnet_object_type': 'AI',
                               'bacnet_unit': '3'},
                'activePowerB': {'name': 'activePowerB',
                                 'json_key': 'activePowerB',
                                 'data_type': 'float',
                                 'unit': 'watt',
                                 'decimal_places': '2',
                                 'min_value': '0',
                                 'max_value': '10000',
                                 'readwrite': '0',
                                 'description': 'B-phase active power',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '47'},
                'activePowerC': {'name': 'activePowerC',
                                 'json_key': 'activePowerC',
                                 'data_type': 'float',
                                 'unit': 'watt',
                                 'decimal_places': '2',
                                 'min_value': '0',
                                 'max_value': '10000',
                                 'readwrite': '0',
                                 'description': 'C-phase active power',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '47'},
                'reactivePowerA': {'name': 'reactivePowerA',
                                   'json_key': 'reactivePowerA',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '-10000',
                                   'max_value': '10000',
                                   'readwrite': '0',
                                   'description': 'A-phase reactive power',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '11'},
                'reactivePowerB': {'name': 'reactivePowerB',
                                   'json_key': 'reactivePowerB',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '-10000',
                                   'max_value': '10000',
                                   'readwrite': '0',
                                   'description': 'B-phase reactive power',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '11'},
                'reactivePowerC': {'name': 'reactivePowerC',
                                   'json_key': 'reactivePowerC',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '-10000',
                                   'max_value': '10000',
                                   'readwrite': '0',
                                   'description': 'C-phase reactive power',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '11'},
                'reactivePowerTotal': {'name': 'reactivePowerTotal',
                                       'json_key': 'reactivePowerTotal',
                                       'data_type': 'float',
                                       'unit': 'none',
                                       'decimal_places': '2',
                                       'min_value': '-30000',
                                       'max_value': '30000',
                                       'readwrite': '0',
                                       'description': 'Total reactive power',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '2',
                                       'modbus_mapping_mode': 'big_endian',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AI',
                                       'bacnet_unit': '11'},
                'apparentPowerA': {'name': 'apparentPowerA',
                                   'json_key': 'apparentPowerA',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '0',
                                   'max_value': '10000',
                                   'readwrite': '0',
                                   'description': 'A-phase apparent power',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '8'},
                'apparentPowerB': {'name': 'apparentPowerB',
                                   'json_key': 'apparentPowerB',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '0',
                                   'max_value': '10000',
                                   'readwrite': '0',
                                   'description': 'B-phase apparent power',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '8'},
                'apparentPowerC': {'name': 'apparentPowerC',
                                   'json_key': 'apparentPowerC',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '0',
                                   'max_value': '10000',
                                   'readwrite': '0',
                                   'description': 'C-phase apparent power',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '8'},
                'apparentPowerTotal': {'name': 'apparentPowerTotal',
                                       'json_key': 'apparentPowerTotal',
                                       'data_type': 'float',
                                       'unit': 'none',
                                       'decimal_places': '2',
                                       'min_value': '0',
                                       'max_value': '30000',
                                       'readwrite': '0',
                                       'description': 'Total apparent power',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '2',
                                       'modbus_mapping_mode': 'big_endian',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'AI',
                                       'bacnet_unit': '8'},
                'powerFactorA': {'name': 'powerFactorA',
                                 'json_key': 'powerFactorA',
                                 'data_type': 'float',
                                 'unit': 'none',
                                 'decimal_places': '3',
                                 'min_value': '0',
                                 'max_value': '1',
                                 'readwrite': '0',
                                 'description': 'A-phase power factor',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '95'},
                'powerFactorB': {'name': 'powerFactorB',
                                 'json_key': 'powerFactorB',
                                 'data_type': 'float',
                                 'unit': 'none',
                                 'decimal_places': '3',
                                 'min_value': '0',
                                 'max_value': '1',
                                 'readwrite': '0',
                                 'description': 'B-phase power factor',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '95'},
                'powerFactorC': {'name': 'powerFactorC',
                                 'json_key': 'powerFactorC',
                                 'data_type': 'float',
                                 'unit': 'none',
                                 'decimal_places': '3',
                                 'min_value': '0',
                                 'max_value': '1',
                                 'readwrite': '0',
                                 'description': 'C-phase power factor',
                                 'modbus_enable': '1',
                                 'modbus_table': 'holding',
                                 'modbus_register_count': '2',
                                 'modbus_mapping_mode': 'big_endian',
                                 'modbus_scale': '1',
                                 'bacnet_enable': '1',
                                 'bacnet_object_type': 'AI',
                                 'bacnet_unit': '95'},
                'reactiveEnergy': {'name': 'reactiveEnergy',
                                   'json_key': 'reactiveEnergy',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '0',
                                   'max_value': '999999',
                                   'readwrite': '0',
                                   'description': 'Reactive energy consumption',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '204'},
                'apparentEnergy': {'name': 'apparentEnergy',
                                   'json_key': 'apparentEnergy',
                                   'data_type': 'float',
                                   'unit': 'none',
                                   'decimal_places': '2',
                                   'min_value': '0',
                                   'max_value': '999999',
                                   'readwrite': '0',
                                   'description': 'Apparent energy consumption',
                                   'modbus_enable': '1',
                                   'modbus_table': 'holding',
                                   'modbus_register_count': '2',
                                   'modbus_mapping_mode': 'big_endian',
                                   'modbus_scale': '1',
                                   'bacnet_enable': '1',
                                   'bacnet_object_type': 'AI',
                                   'bacnet_unit': '240'},
                'tempSensor2': {'name': 'tempSensor2',
                                'json_key': 'tempSensor2',
                                'data_type': 'float',
                                'unit': 'celsius',
                                'decimal_places': '1',
                                'min_value': '-20',
                                'max_value': '110',
                                'readwrite': '0',
                                'description': 'Temperature sensor 2',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '10',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '62'},
                'tempSensor3': {'name': 'tempSensor3',
                                'json_key': 'tempSensor3',
                                'data_type': 'float',
                                'unit': 'celsius',
                                'decimal_places': '1',
                                'min_value': '-20',
                                'max_value': '110',
                                'readwrite': '0',
                                'description': 'Temperature sensor 3',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '10',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '62'},
                'tempSensor4': {'name': 'tempSensor4',
                                'json_key': 'tempSensor4',
                                'data_type': 'float',
                                'unit': 'celsius',
                                'decimal_places': '1',
                                'min_value': '-20',
                                'max_value': '110',
                                'readwrite': '0',
                                'description': 'Temperature sensor 4',
                                'modbus_enable': '1',
                                'modbus_table': 'holding',
                                'modbus_register_count': '1',
                                'modbus_mapping_mode': 'single',
                                'modbus_scale': '10',
                                'bacnet_enable': '1',
                                'bacnet_object_type': 'AI',
                                'bacnet_unit': '62'},
                'alarmOvercurrentB': {'name': 'alarmOvercurrentB',
                                      'json_key': 'alarmOvercurrentB',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'B-phase overcurrent alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmOvercurrentC': {'name': 'alarmOvercurrentC',
                                      'json_key': 'alarmOvercurrentC',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'C-phase overcurrent alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmOvervoltageA': {'name': 'alarmOvervoltageA',
                                      'json_key': 'alarmOvervoltageA',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'A-phase overvoltage alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmOvervoltageB': {'name': 'alarmOvervoltageB',
                                      'json_key': 'alarmOvervoltageB',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'B-phase overvoltage alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmOvervoltageC': {'name': 'alarmOvervoltageC',
                                      'json_key': 'alarmOvervoltageC',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'C-phase overvoltage alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmUndervoltageA': {'name': 'alarmUndervoltageA',
                                       'json_key': 'alarmUndervoltageA',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'A-phase undervoltage alarm',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BI',
                                       'bacnet_unit': '95'},
                'alarmUndervoltageB': {'name': 'alarmUndervoltageB',
                                       'json_key': 'alarmUndervoltageB',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'B-phase undervoltage alarm',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BI',
                                       'bacnet_unit': '95'},
                'alarmUndervoltageC': {'name': 'alarmUndervoltageC',
                                       'json_key': 'alarmUndervoltageC',
                                       'data_type': 'bool',
                                       'unit': 'none',
                                       'readwrite': '0',
                                       'description': 'C-phase undervoltage alarm',
                                       'modbus_enable': '1',
                                       'modbus_table': 'holding',
                                       'modbus_register_count': '1',
                                       'modbus_mapping_mode': 'single',
                                       'modbus_scale': '1',
                                       'bacnet_enable': '1',
                                       'bacnet_object_type': 'BI',
                                       'bacnet_unit': '95'},
                'alarmShortCircuit': {'name': 'alarmShortCircuit',
                                      'json_key': 'alarmShortCircuit',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Short circuit alarm',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'},
                'alarmTempSensor1': {'name': 'alarmTempSensor1',
                                     'json_key': 'alarmTempSensor1',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Temperature sensor 1 alarm',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'alarmTempSensor2': {'name': 'alarmTempSensor2',
                                     'json_key': 'alarmTempSensor2',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Temperature sensor 2 alarm',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'alarmTempSensor3': {'name': 'alarmTempSensor3',
                                     'json_key': 'alarmTempSensor3',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Temperature sensor 3 alarm',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'alarmTempSensor4': {'name': 'alarmTempSensor4',
                                     'json_key': 'alarmTempSensor4',
                                     'data_type': 'bool',
                                     'unit': 'none',
                                     'readwrite': '0',
                                     'description': 'Temperature sensor 4 alarm',
                                     'modbus_enable': '1',
                                     'modbus_table': 'holding',
                                     'modbus_register_count': '1',
                                     'modbus_mapping_mode': 'single',
                                     'modbus_scale': '1',
                                     'bacnet_enable': '1',
                                     'bacnet_object_type': 'BI',
                                     'bacnet_unit': '95'},
                'beaconRefRssi': {'name': 'beaconRefRssi',
                                  'json_key': 'beaconRefRssi',
                                  'data_type': 'int',
                                  'unit': 'none',
                                  'min_value': '-120',
                                  'max_value': '0',
                                  'readwrite': '0',
                                  'description': 'Latest beacon 1m reference RSSI',
                                  'modbus_enable': '1',
                                  'modbus_table': 'holding',
                                  'modbus_register_count': '1',
                                  'modbus_mapping_mode': 'single',
                                  'modbus_scale': '1',
                                  'bacnet_enable': '1',
                                  'bacnet_object_type': 'AI',
                                  'bacnet_unit': '95'},
                'electricalAlarmEvent': {'name': 'electricalAlarmEvent',
                                         'json_key': 'electricalAlarmEvent',
                                         'data_type': 'int',
                                         'unit': 'none',
                                         'min_value': '0',
                                         'max_value': '65535',
                                         'readwrite': '0',
                                         'description': 'Electrical fire alarm event bitfield',
                                         'modbus_enable': '1',
                                         'modbus_table': 'holding',
                                         'modbus_register_count': '1',
                                         'modbus_mapping_mode': 'single',
                                         'modbus_scale': '1',
                                         'bacnet_enable': '1',
                                         'bacnet_object_type': 'AI',
                                         'bacnet_unit': '95'},
                'alarmOvercurrentAEvent': {'name': 'alarmOvercurrentAEvent',
                                           'json_key': 'alarmOvercurrentAEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'A-phase overcurrent alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmOvercurrentBEvent': {'name': 'alarmOvercurrentBEvent',
                                           'json_key': 'alarmOvercurrentBEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'B-phase overcurrent alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmOvercurrentCEvent': {'name': 'alarmOvercurrentCEvent',
                                           'json_key': 'alarmOvercurrentCEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'C-phase overcurrent alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmOvervoltageAEvent': {'name': 'alarmOvervoltageAEvent',
                                           'json_key': 'alarmOvervoltageAEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'A-phase overvoltage alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmOvervoltageBEvent': {'name': 'alarmOvervoltageBEvent',
                                           'json_key': 'alarmOvervoltageBEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'B-phase overvoltage alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmOvervoltageCEvent': {'name': 'alarmOvervoltageCEvent',
                                           'json_key': 'alarmOvervoltageCEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'C-phase overvoltage alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmUndervoltageAEvent': {'name': 'alarmUndervoltageAEvent',
                                            'json_key': 'alarmUndervoltageAEvent',
                                            'data_type': 'bool',
                                            'unit': 'none',
                                            'readwrite': '0',
                                            'description': 'A-phase undervoltage alarm event',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '1',
                                            'modbus_mapping_mode': 'single',
                                            'modbus_scale': '1',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'BI',
                                            'bacnet_unit': '95'},
                'alarmUndervoltageBEvent': {'name': 'alarmUndervoltageBEvent',
                                            'json_key': 'alarmUndervoltageBEvent',
                                            'data_type': 'bool',
                                            'unit': 'none',
                                            'readwrite': '0',
                                            'description': 'B-phase undervoltage alarm event',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '1',
                                            'modbus_mapping_mode': 'single',
                                            'modbus_scale': '1',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'BI',
                                            'bacnet_unit': '95'},
                'alarmUndervoltageCEvent': {'name': 'alarmUndervoltageCEvent',
                                            'json_key': 'alarmUndervoltageCEvent',
                                            'data_type': 'bool',
                                            'unit': 'none',
                                            'readwrite': '0',
                                            'description': 'C-phase undervoltage alarm event',
                                            'modbus_enable': '1',
                                            'modbus_table': 'holding',
                                            'modbus_register_count': '1',
                                            'modbus_mapping_mode': 'single',
                                            'modbus_scale': '1',
                                            'bacnet_enable': '1',
                                            'bacnet_object_type': 'BI',
                                            'bacnet_unit': '95'},
                'alarmShortCircuitEvent': {'name': 'alarmShortCircuitEvent',
                                           'json_key': 'alarmShortCircuitEvent',
                                           'data_type': 'bool',
                                           'unit': 'none',
                                           'readwrite': '0',
                                           'description': 'Short circuit alarm event',
                                           'modbus_enable': '1',
                                           'modbus_table': 'holding',
                                           'modbus_register_count': '1',
                                           'modbus_mapping_mode': 'single',
                                           'modbus_scale': '1',
                                           'bacnet_enable': '1',
                                           'bacnet_object_type': 'BI',
                                           'bacnet_unit': '95'},
                'alarmTempSensor1Event': {'name': 'alarmTempSensor1Event',
                                          'json_key': 'alarmTempSensor1Event',
                                          'data_type': 'bool',
                                          'unit': 'none',
                                          'readwrite': '0',
                                          'description': 'Temperature sensor 1 alarm event',
                                          'modbus_enable': '1',
                                          'modbus_table': 'holding',
                                          'modbus_register_count': '1',
                                          'modbus_mapping_mode': 'single',
                                          'modbus_scale': '1',
                                          'bacnet_enable': '1',
                                          'bacnet_object_type': 'BI',
                                          'bacnet_unit': '95'},
                'alarmTempSensor2Event': {'name': 'alarmTempSensor2Event',
                                          'json_key': 'alarmTempSensor2Event',
                                          'data_type': 'bool',
                                          'unit': 'none',
                                          'readwrite': '0',
                                          'description': 'Temperature sensor 2 alarm event',
                                          'modbus_enable': '1',
                                          'modbus_table': 'holding',
                                          'modbus_register_count': '1',
                                          'modbus_mapping_mode': 'single',
                                          'modbus_scale': '1',
                                          'bacnet_enable': '1',
                                          'bacnet_object_type': 'BI',
                                          'bacnet_unit': '95'},
                'alarmTempSensor3Event': {'name': 'alarmTempSensor3Event',
                                          'json_key': 'alarmTempSensor3Event',
                                          'data_type': 'bool',
                                          'unit': 'none',
                                          'readwrite': '0',
                                          'description': 'Temperature sensor 3 alarm event',
                                          'modbus_enable': '1',
                                          'modbus_table': 'holding',
                                          'modbus_register_count': '1',
                                          'modbus_mapping_mode': 'single',
                                          'modbus_scale': '1',
                                          'bacnet_enable': '1',
                                          'bacnet_object_type': 'BI',
                                          'bacnet_unit': '95'},
                'alarmTempSensor4Event': {'name': 'alarmTempSensor4Event',
                                          'json_key': 'alarmTempSensor4Event',
                                          'data_type': 'bool',
                                          'unit': 'none',
                                          'readwrite': '0',
                                          'description': 'Temperature sensor 4 alarm event',
                                          'modbus_enable': '1',
                                          'modbus_table': 'holding',
                                          'modbus_register_count': '1',
                                          'modbus_mapping_mode': 'single',
                                          'modbus_scale': '1',
                                          'bacnet_enable': '1',
                                          'bacnet_object_type': 'BI',
                                          'bacnet_unit': '95'},
                'alarmLeakageEvent': {'name': 'alarmLeakageEvent',
                                      'json_key': 'alarmLeakageEvent',
                                      'data_type': 'bool',
                                      'unit': 'none',
                                      'readwrite': '0',
                                      'description': 'Leakage current alarm event',
                                      'modbus_enable': '1',
                                      'modbus_table': 'holding',
                                      'modbus_register_count': '1',
                                      'modbus_mapping_mode': 'single',
                                      'modbus_scale': '1',
                                      'bacnet_enable': '1',
                                      'bacnet_object_type': 'BI',
                                      'bacnet_unit': '95'}},
 'sensor_types': {'AN_303_temperature_humidity': {'name': 'AN_303_temperature_humidity',
                                                  'attributes': ['online',
                                                                 'lastOnlineTime',
                                                                 'temperature',
                                                                 'temperatureState',
                                                                 'humidity',
                                                                 'humidityState',
                                                                 'batteryVoltage',
                                                                 'batteryVoltageState',
                                                                 'tamper',
                                                                 'mainVersion',
                                                                 'appVersion',
                                                                 'hardwareVersion',
                                                                 'model',
                                                                 'rssi',
                                                                 'snr'],
                                                  'description': 'Temperature & Humidity sensor',
                                                  'model_name': 'AN-303',
                                                  'version': '20260101',
                                                  'modbus_block_span': '48',
                                                  'bacnet_block_span': '20'},
                  'AN_304_infrared_detector': {'name': 'AN_304_infrared_detector',
                                               'attributes': ['online',
                                                              'lastOnlineTime',
                                                              'batteryVoltage',
                                                              'batteryVoltageState',
                                                              'tamper',
                                                              'tamperEvent',
                                                              'infraredEvent',
                                                              'mainVersion',
                                                              'appVersion',
                                                              'hardwareVersion',
                                                              'model',
                                                              'rssi',
                                                              'snr'],
                                               'description': 'Infrared Detector',
                                               'model_name': 'AN-304',
                                               'version': '20260101',
                                               'modbus_block_span': '48',
                                               'bacnet_block_span': '20'},
                  'JTY_AN_503A_smoke_detector': {'name': 'JTY_AN_503A_smoke_detector',
                                                 'attributes': ['online',
                                                                'lastOnlineTime',
                                                                'temperature',
                                                                'batteryVoltage',
                                                                'batteryVoltageState',
                                                                'tamper',
                                                                'tamperEvent',
                                                                'smokeEvent',
                                                                'smokeStatus',
                                                                'selfCheckEvent',
                                                                'mainVersion',
                                                                'appVersion',
                                                                'hardwareVersion',
                                                                'model',
                                                                'rssi',
                                                                'snr'],
                                                 'description': 'Smoke Detector',
                                                 'model_name': 'JTY-AN-503A',
                                                 'version': '20260101',
                                                 'modbus_block_span': '58',
                                                 'bacnet_block_span': '30'},
                  'CU606_air_quality_sensor': {'name': 'CU606_air_quality_sensor',
                                               'attributes': ['online',
                                                              'lastOnlineTime',
                                                              'temperature',
                                                              'humidity',
                                                              'batteryVoltage',
                                                              'batteryVoltageState',
                                                              'co2',
                                                              'pm25',
                                                              'formaldehyde',
                                                              'tvoc',
                                                              'mainVersion',
                                                              'appVersion',
                                                              'hardwareVersion',
                                                              'model',
                                                              'rssi',
                                                              'snr'],
                                               'description': 'Air Quality Sensor',
                                               'model_name': 'CU606',
                                               'version': '20260101',
                                               'modbus_block_span': '58',
                                               'bacnet_block_span': '20'},
                  'W8004_thermostat': {'name': 'W8004_thermostat',
                                       'attributes': ['online',
                                                      'lastOnlineTime',
                                                      'powerState',
                                                      'setTemperature',
                                                      'workMode',
                                                      'fanSpeed',
                                                      'temperature',
                                                      'humidity',
                                                      'keyLockState',
                                                      'valveState',
                                                      'signalStrength',
                                                      'cumulativeOnTime',
                                                      'cumulativeValveOpenTime',
                                                      'mainVersion',
                                                      'appVersion',
                                                      'hardwareVersion',
                                                      'model',
                                                      'rssi',
                                                      'snr'],
                                       'description': 'Thermostat Controller',
                                       'model_name': 'W8004',
                                       'version': '20260101',
                                       'modbus_block_span': '58',
                                       'bacnet_block_span': '20'},
                  'DS_501_socket': {'name': 'DS_501_socket',
                                    'attributes': ['online',
                                                   'lastOnlineTime',
                                                   'ds501ControlTarget',
                                                   'ds501ControlState',
                                                   'ds501ControlMode',
                                                   'ds501DelaySeconds',
                                                   'ds501ScheduleTimestamp',
                                                   'ds501RepeatDaily',
                                                   'switch',
                                                   'lockState',
                                                   'voltage',
                                                   'current',
                                                   'activePower',
                                                   'energy',
                                                   'timestamp',
                                                   'timerCloseEnabled',
                                                   'timerOpenEnabled',
                                                   'timerLockEnabled',
                                                   'timerUnlockEnabled',
                                                   'mainVersion',
                                                   'appVersion',
                                                   'hardwareVersion',
                                                   'model',
                                                   'rssi',
                                                   'snr'],
                                    'description': 'Smart Socket Panel',
                                    'model_name': 'DS-501',
                                    'version': '20260101',
                                    'modbus_block_span': '68',
                                    'bacnet_block_span': '30'},
                  'EF5600_DN1_electrical_fire_monitor': {'name': 'EF5600_DN1_electrical_fire_monitor',
                                                         'attributes': ['online',
                                                                        'lastOnlineTime',
                                                                        'ef5600CommandCode',
                                                                        'ef5600SettingAddress',
                                                                        'ef5600SettingValueHigh',
                                                                        'ef5600SettingValueLow',
                                                                        'switch',
                                                                        'voltageA',
                                                                        'voltageB',
                                                                        'voltageC',
                                                                        'voltageAvg',
                                                                        'currentA',
                                                                        'currentB',
                                                                        'currentC',
                                                                        'currentAvg',
                                                                        'activePowerA',
                                                                        'activePowerB',
                                                                        'activePowerC',
                                                                        'activePowerTotal',
                                                                        'reactivePowerA',
                                                                        'reactivePowerB',
                                                                        'reactivePowerC',
                                                                        'reactivePowerTotal',
                                                                        'apparentPowerA',
                                                                        'apparentPowerB',
                                                                        'apparentPowerC',
                                                                        'apparentPowerTotal',
                                                                        'powerFactorA',
                                                                        'powerFactorB',
                                                                        'powerFactorC',
                                                                        'powerFactorTotal',
                                                                        'activeEnergy',
                                                                        'reactiveEnergy',
                                                                        'apparentEnergy',
                                                                        'leakageCurrent',
                                                                        'tempSensor1',
                                                                        'tempSensor2',
                                                                        'tempSensor3',
                                                                        'tempSensor4',
                                                                        'tempAvg',
                                                                        'envTemperature',
                                                                        'envHumidity',
                                                                        'electricalAlarm',
                                                                        'electricalAlarmEvent',
                                                                        'alarmOvercurrentA',
                                                                        'alarmOvercurrentB',
                                                                        'alarmOvercurrentC',
                                                                        'alarmOvercurrentAEvent',
                                                                        'alarmOvercurrentBEvent',
                                                                        'alarmOvercurrentCEvent',
                                                                        'alarmOvervoltageA',
                                                                        'alarmOvervoltageB',
                                                                        'alarmOvervoltageC',
                                                                        'alarmOvervoltageAEvent',
                                                                        'alarmOvervoltageBEvent',
                                                                        'alarmOvervoltageCEvent',
                                                                        'alarmUndervoltageA',
                                                                        'alarmUndervoltageB',
                                                                        'alarmUndervoltageC',
                                                                        'alarmUndervoltageAEvent',
                                                                        'alarmUndervoltageBEvent',
                                                                        'alarmUndervoltageCEvent',
                                                                        'alarmShortCircuit',
                                                                        'alarmShortCircuitEvent',
                                                                        'alarmTempSensor1',
                                                                        'alarmTempSensor2',
                                                                        'alarmTempSensor3',
                                                                        'alarmTempSensor4',
                                                                        'alarmTempSensor1Event',
                                                                        'alarmTempSensor2Event',
                                                                        'alarmTempSensor3Event',
                                                                        'alarmTempSensor4Event',
                                                                        'alarmLeakage',
                                                                        'alarmLeakageEvent',
                                                                        'mainVersion',
                                                                        'appVersion',
                                                                        'hardwareVersion',
                                                                        'model',
                                                                        'rssi',
                                                                        'snr'],
                                                         'description': 'Electrical Fire Monitor',
                                                         'model_name': 'EF5600-DN1',
                                                         'version': '20260101',
                                                         'modbus_block_span': '138',
                                                         'bacnet_block_span': '80'},
                  'AN_301_emergency_button': {'name': 'AN_301_emergency_button',
                                              'attributes': ['online',
                                                             'lastOnlineTime',
                                                             'batteryVoltage',
                                                             'tamperStatus',
                                                             'tamperEvent',
                                                             'sosEvent',
                                                             'sosEventTime',
                                                             'mainVersion',
                                                             'appVersion',
                                                             'hardwareVersion',
                                                             'model',
                                                             'rssi',
                                                             'snr'],
                                              'description': 'Emergency Button/SOS Device',
                                              'model_name': 'AN-301',
                                              'version': '20260101',
                                              'modbus_block_span': '48',
                                              'bacnet_block_span': '20'},
                  'undefine': {'name': 'undefine',
                               'attributes': ['online',
                                              'lastOnlineTime',
                                              'lastFport',
                                              'lastPayloadLen',
                                              'lastPayload',
                                              'rssi',
                                              'snr'],
                               'description': 'undefine sensor',
                               'version': '20260101',
                               'modbus_block_span': '145',
                               'bacnet_block_span': '20'},
                  'AN_305_door_contact': {'name': 'AN_305_door_contact',
                                          'attributes': ['online',
                                                         'lastOnlineTime',
                                                         'doorState',
                                                         'batteryVoltage',
                                                         'batteryVoltageState',
                                                         'tamperStatus',
                                                         'batteryLevel',
                                                         'tamperEvent',
                                                         'doorEvent',
                                                         'mainVersion',
                                                         'appVersion',
                                                         'hardwareVersion',
                                                         'model',
                                                         'rssi',
                                                         'snr'],
                                          'description': 'Door Contact Sensor',
                                          'model_name': 'AN-305',
                                          'version': '20260101',
                                          'modbus_block_span': '48',
                                          'bacnet_block_span': '20'},
                  'AN_204_water_leakage': {'name': 'AN_204_water_leakage',
                                           'attributes': ['online',
                                                          'lastOnlineTime',
                                                          'batteryVoltage',
                                                          'waterStatus',
                                                          'waterDuration',
                                                          'batteryLowEvent',
                                                          'waterEvent',
                                                          'mainVersion',
                                                          'appVersion',
                                                          'hardwareVersion',
                                                          'model',
                                                          'rssi',
                                                          'snr'],
                                           'description': 'Water Leakage Sensor',
                                           'model_name': 'AN-204',
                                           'version': '20260101',
                                           'modbus_block_span': '48',
                                           'bacnet_block_span': '20'},
                  'AN_201G_vibrating_wire_strain_gauge': {'name': 'AN_201G_vibrating_wire_strain_gauge',
                                                          'attributes': ['online',
                                                                         'lastOnlineTime',
                                                                         'batteryVoltage',
                                                                         'batteryVoltageState',
                                                                         'timestamp',
                                                                         'vibratingWireSensorModel',
                                                                         'frequency',
                                                                         'frequencyDigit',
                                                                         'temperature',
                                                                         'correctionFactor',
                                                                         'initialFrequency',
                                                                         'initialFrequencyDigit',
                                                                         'initialTemperature',
                                                                         'steelStructureStrain',
                                                                         'concreteStructureStrain',
                                                                         'batteryLowAlarm',
                                                                         'isHeartbeat',
                                                                         'mainVersion',
                                                                         'appVersion',
                                                                         'hardwareVersion',
                                                                         'model',
                                                                         'rssi',
                                                                         'snr'],
                                                          'description': 'Vibrating Wire Strain Gauge',
                                                          'model_name': 'AN-201G',
                                                          'version': '20260101',
                                                          'modbus_block_span': '88',
                                                          'bacnet_block_span': '30'},
                  'AN_113_tilt_angle': {'name': 'AN_113_tilt_angle',
                                        'attributes': ['online',
                                                       'lastOnlineTime',
                                                       'batteryVoltage',
                                                       'batteryVoltageState',
                                                       'tamper',
                                                       'tiltAngle',
                                                       'accelerationAlarm',
                                                       'tiltAlarm',
                                                       'batteryLowEvent',
                                                       'tamperEvent',
                                                       'mainVersion',
                                                       'appVersion',
                                                       'hardwareVersion',
                                                       'model',
                                                       'rssi',
                                                       'snr'],
                                        'description': 'Tilt/Angle Sensor',
                                        'model_name': 'AN-113',
                                        'version': '20260101',
                                        'modbus_block_span': '58',
                                        'bacnet_block_span': '20'},
                  'AN_122_beacon_tracker': {'name': 'AN_122_beacon_tracker',
                                            'attributes': ['online',
                                                           'lastOnlineTime',
                                                           'batteryLevel',
                                                           'tamper',
                                                           'latitude',
                                                           'longitude',
                                                           'positionAccuracy',
                                                           'beaconIdHex',
                                                           'beaconRefRssi',
                                                           'beaconRssi',
                                                           'beaconBatteryLevel',
                                                           'beaconBatteryValid',
                                                           'tiltAngle',
                                                           'batteryLowAlarm',
                                                           'tamperEvent',
                                                           'accelerationAlarm',
                                                           'tiltAlarm',
                                                           'mainVersion',
                                                           'appVersion',
                                                           'hardwareVersion',
                                                           'model',
                                                           'rssi',
                                                           'snr'],
                                            'description': 'Beacon Tracker with GPS',
                                            'model_name': 'AN-122',
                                            'version': '20260101',
                                            'modbus_block_span': '78',
                                            'bacnet_block_span': '30'},
                  'AN_306_radar_presence': {'name': 'AN_306_radar_presence',
                                            'attributes': ['online',
                                                           'lastOnlineTime',
                                                           'presence',
                                                           'tamper',
                                                           'presenceEvent',
                                                           'tamperEvent',
                                                           'isHeartbeat',
                                                           'mainVersion',
                                                           'appVersion',
                                                           'hardwareVersion',
                                                           'model',
                                                           'rssi',
                                                           'snr'],
                                            'description': 'Radar Human Presence Sensor',
                                            'model_name': 'AN-306',
                                            'version': '20260101',
                                            'modbus_block_span': '48',
                                            'bacnet_block_span': '20'},
                  'AN_308_light_illuminance': {'name': 'AN_308_light_illuminance',
                                               'attributes': ['online',
                                                              'lastOnlineTime',
                                                              'batteryVoltage',
                                                              'batteryVoltageState',
                                                              'tamper',
                                                              'illuminance',
                                                              'batteryLowEvent',
                                                              'tamperEvent',
                                                              'mainVersion',
                                                              'appVersion',
                                                              'hardwareVersion',
                                                              'model',
                                                              'rssi',
                                                              'snr'],
                                               'description': 'Light Illuminance Sensor',
                                               'model_name': 'AN-308',
                                               'version': '20260101',
                                               'modbus_block_span': '48',
                                               'bacnet_block_span': '20'},
                  'EX205_liquid_level': {'name': 'EX205_liquid_level',
                                         'attributes': ['online',
                                                        'lastOnlineTime',
                                                        'batteryVoltage',
                                                        'batteryVoltageState',
                                                        'distance',
                                                        'liquidLevel',
                                                        'liquidLevelPercent',
                                                        'liquidLevelStatus',
                                                        'liquidLevelEvent',
                                                        'batteryLowEvent',
                                                        'sensorAbnormal',
                                                        'mainVersion',
                                                        'appVersion',
                                                        'hardwareVersion',
                                                        'model',
                                                        'rssi',
                                                        'snr'],
                                         'description': 'Radar Liquid Level Meter',
                                         'model_name': 'EX205',
                                         'version': '20260101',
                                         'modbus_block_span': '58',
                                         'bacnet_block_span': '20'},
                  'AN_307_sound_light_alarm': {'name': 'AN_307_sound_light_alarm',
                                               'attributes': ['online',
                                                              'lastOnlineTime',
                                                              'alarmStatus',
                                                              'alarmDurationSeconds',
                                                              'mainVersion',
                                                              'appVersion',
                                                              'hardwareVersion',
                                                              'model',
                                                              'rssi',
                                                              'snr'],
                                               'description': 'Sound & Light Alarm',
                                               'model_name': 'AN-307',
                                               'version': '20260101',
                                               'modbus_block_span': '48',
                                               'bacnet_block_span': '20'},
                  'DS_103_3ch_switch': {'name': 'DS_103_3ch_switch',
                                        'attributes': ['online',
                                                       'lastOnlineTime',
                                                       'ds103ControlTarget',
                                                       'ds103ControlState',
                                                       'ds103ControlMode',
                                                       'ds103DelaySeconds',
                                                       'ds103ScheduleTimestamp',
                                                       'ds103RepeatDaily',
                                                       'lockState',
                                                       'switch1State',
                                                       'switch2State',
                                                       'switch3State',
                                                       'timestamp',
                                                       'switchTimerStatus',
                                                       'timerCloseEnabled1',
                                                       'timerOpenEnabled1',
                                                       'timerCloseEnabled2',
                                                       'timerOpenEnabled2',
                                                       'timerCloseEnabled3',
                                                       'timerOpenEnabled3',
                                                       'timerLockEnabled',
                                                       'timerUnlockEnabled',
                                                       'mainVersion',
                                                       'appVersion',
                                                       'hardwareVersion',
                                                       'model',
                                                       'rssi',
                                                       'snr'],
                                        'description': '3-Channel Switch Controller',
                                        'model_name': 'DS-103',
                                        'version': '20260101',
                                        'modbus_block_span': '68',
                                        'bacnet_block_span': '30'},
                  'EX301_vibration': {'name': 'EX301_vibration',
                                      'attributes': ['online',
                                                     'lastOnlineTime',
                                                     'batteryVoltage',
                                                     'batteryVoltageState',
                                                     'temperature',
                                                     'temperatureAlarmStatus',
                                                     'vibFreqX',
                                                     'vibFreqY',
                                                     'vibFreqZ',
                                                     'vibAccelX',
                                                     'vibAccelY',
                                                     'vibAccelZ',
                                                     'vibVelX',
                                                     'vibVelY',
                                                     'vibVelZ',
                                                     'vibDispX',
                                                     'vibDispY',
                                                     'vibDispZ',
                                                     'vibrationAlarmStatus',
                                                     'alarmAccelX',
                                                     'alarmAccelY',
                                                     'alarmAccelZ',
                                                     'alarmVelX',
                                                     'alarmVelY',
                                                     'alarmVelZ',
                                                     'alarmDispX',
                                                     'alarmDispY',
                                                     'alarmDispZ',
                                                     'sensorAbnormal',
                                                     'batteryLowEvent',
                                                     'vibrationAlarmEvent',
                                                     'alarmEventActive',
                                                     'mainVersion',
                                                     'appVersion',
                                                     'hardwareVersion',
                                                     'model',
                                                     'rssi',
                                                     'snr'],
                                      'description': 'Vibration Sensor',
                                      'model_name': 'EX301',
                                      'version': '20260101',
                                      'modbus_block_span': '78',
                                      'bacnet_block_span': '50'},
                  'CM100_beacon_receiver': {'name': 'CM100_beacon_receiver',
                                            'attributes': ['online',
                                                           'lastOnlineTime',
                                                           'batteryLevel',
                                                           'beaconIdHex',
                                                           'beaconRssi',
                                                           'beaconBatteryLevel',
                                                           'beaconBatteryValid',
                                                           'batteryLowAlarm',
                                                           'sosEvent',
                                                           'isHeartbeat',
                                                           'mainVersion',
                                                           'appVersion',
                                                           'hardwareVersion',
                                                           'model',
                                                           'rssi',
                                                           'snr'],
                                            'description': 'Beacon Receiver/Gateway',
                                            'model_name': 'CM100',
                                            'version': '20260101',
                                            'modbus_block_span': '68',
                                            'bacnet_block_span': '20'},
                  'GB100_safety_helmet': {'name': 'GB100_safety_helmet',
                                          'attributes': ['online',
                                                         'lastOnlineTime',
                                                         'batteryLevel',
                                                         'atmosphericPressure',
                                                         'altitude',
                                                         'temperature',
                                                         'temperatureAlarmStatus',
                                                         'fallAlarmStatus',
                                                         'fallAlarmEvent',
                                                         'helmetRemovalAlarmStatus',
                                                         'helmetRemovalAlarmEvent',
                                                         'electricityProximityAlarmStatus',
                                                         'electricityProximityAlarmEvent',
                                                         'impactAlarmStatus',
                                                         'impactAlarmEvent',
                                                         'silenceAlarmStatus',
                                                         'silenceAlarmEvent',
                                                         'heightAccessAlarmStatus',
                                                         'heightAccessAlarmEvent',
                                                         'latitude',
                                                         'longitude',
                                                         'positionAccuracy',
                                                         'gpsAbsoluteTimestamp',
                                                         'gpsTimeValid',
                                                         'beaconIdHex',
                                                         'beaconRssi',
                                                         'beaconBatteryLevel',
                                                         'beaconBatteryValid',
                                                         'batteryLowAlarm',
                                                         'temperatureEvent',
                                                         'sosEvent',
                                                         'safetyAlarmActive',
                                                         'isHeartbeat',
                                                         'mainVersion',
                                                         'appVersion',
                                                         'hardwareVersion',
                                                         'model',
                                                         'rssi',
                                                         'snr'],
                                          'description': 'Safety Helmet with Multiple Sensors',
                                          'model_name': 'GB100',
                                          'version': '20260101',
                                          'modbus_block_span': '98',
                                          'bacnet_block_span': '40'}}}

CONFIG_SNAPSHOT_PATH = Path(__file__).with_name("openwrt的配置文件iot_hub")
BACNET_DEVICE_META_HEADER_INSTANCE_COUNT = 2
BACNET_META_LAYOUT_HASH_OFFSET = 0
BACNET_META_PROFILE_VERSION_OFFSET = 1

ATTRIBUTE_FLOAT_PRECISION = {
    "latitude": 6,
    "longitude": 6,
}

BACNET_TYPE_MAP = {
    "AI": "analog-input",
    "AV": "analog-value",
    "BI": "binary-input",
    "BV": "binary-value",
    "CV": "characterstring-value",
}

BACNET_OBJECT_TYPE_MAP = {
    "AI": "analog-input",
    "AO": "analog-output",
    "AV": "analog-value",
    "BI": "binary-input",
    "BO": "binary-output",
    "BV": "binary-value",
    "MSI": "multi-state-input",
    "MSO": "multi-state-output",
    "MSV": "multi-state-value",
    "CV": "characterstring-value",
}

SCAN_ORDER = ["AI", "AV", "BI", "BV", "CV"]

HELP_EXAMPLES = """Examples:
    python bacnet_read.py --ip 192.168.1.10 --id 101
    python bacnet_read.py --ip 192.168.1.10 --id 101 --objectType AI --objectType BV
    python bacnet_read.py --ip 192.168.1.10 --id 101 --start 10100 --count 20
    python bacnet_read.py --ip 192.168.1.10 --id 101 --sensorType AN-201G
"""


def _parse_uci_value(value):
    value = value.strip()
    if value and value[0] == "'":
        end = value.find("'", 1)
        if end != -1:
            return value[1:end]
    return value


def _parse_int(value, default=0):
    if value in (None, ""):
        return default
    return int(value)


def load_uci_config(file_path):
    lines = Path(file_path).read_text(encoding="utf-8").splitlines()
    globals_cfg = {}
    sensor_types = {}
    attributes = {}
    section_type = None
    section_name = None

    for raw_line in lines:
        line = raw_line.strip()
        if not line or line.startswith("#"):
            continue

        config_match = re.match(r"^config\s+(\S+)\s+'(.*)'$", line)
        if config_match:
            section_type, section_name = config_match.group(1), config_match.group(2)
            if section_type == "global":
                globals_cfg = {}
            elif section_type == "sensor_type":
                sensor_types[section_name] = {"attributes": []}
            elif section_type == "attribute":
                attributes[section_name] = {}
            continue

        option_match = re.match(r"^option\s+(\S+)\s+(.+)$", line)
        if option_match and section_type:
            key = option_match.group(1)
            value = _parse_uci_value(option_match.group(2))
            if section_type == "global":
                globals_cfg[key] = value
            elif section_type == "sensor_type":
                sensor_types[section_name][key] = value
            elif section_type == "attribute":
                attributes[section_name][key] = value
            continue

        list_match = re.match(r"^list\s+(\S+)\s+(.+)$", line)
        if list_match and section_type == "sensor_type":
            key = list_match.group(1)
            value = _parse_uci_value(list_match.group(2))
            sensor_types[section_name].setdefault(key, []).append(value)

    return {
        "globals": globals_cfg,
        "sensor_types": sensor_types,
        "attributes": attributes,
    }


def get_global_defaults(config_data):
    globals_cfg = config_data.get("globals", {})
    return {
        "bacnet_id": _parse_int(globals_cfg.get("default_bacnet_bip_id"), DEFAULT_BACNET_ID),
    }


def resolve_sensor_type_name(config_data, sensor_type_or_model):
    if not sensor_type_or_model:
        return None

    sensor_types = config_data.get("sensor_types", {}) if config_data else {}
    requested = str(sensor_type_or_model).strip().casefold()

    for sensor_type_name, sensor in sensor_types.items():
        model_name = str(sensor.get("model_name", "")).strip().casefold()
        if sensor_type_name.casefold() == requested or model_name == requested:
            return sensor_type_name

    return None


def get_sensor_display_name(config_data, sensor_type_name):
    sensor = config_data.get("sensor_types", {}).get(sensor_type_name, {}) if config_data else {}
    model_name = str(sensor.get("model_name", "")).strip()
    return model_name or sensor_type_name


def get_sensor_profile_version(config_data, sensor_type_name):
    sensor = config_data.get("sensor_types", {}).get(sensor_type_name, {}) if config_data else {}
    raw = str(sensor.get("version", "0")).strip()
    return int(raw) if raw.isdigit() else 0


def _value_kind_from_attribute(attribute):
    data_type = str((attribute or {}).get("data_type", "")).strip().lower()
    if data_type in {"bool", "float", "string", "binary"}:
        return data_type
    if data_type in {"int", "uint", "timestamp"}:
        return "int"
    return "unknown"


def _fnv1a32_update(hash_value, token):
    data = str(token or "").encode("utf-8") + b"\x1f"
    for byte in data:
        hash_value ^= byte
        hash_value = (hash_value * 16777619) & 0xFFFFFFFF
    return hash_value


def compute_bacnet_layout_hash(config_data, sensor_type_name):
    """Hash all BACnet-enabled fields by (name, json_key, kind, object_type) in field order.
    Absolute instance numbers are intentionally excluded — they are determined by field
    sequence + header size, so any reorder, insertion, or deletion is still detected.
    This also catches name and type changes in any field (read-only or writable)."""
    if not config_data:
        return ""

    sensor = config_data.get("sensor_types", {}).get(sensor_type_name)
    attributes = config_data.get("attributes", {})

    if not sensor:
        return ""

    hash_value = 2166136261
    hash_value = _fnv1a32_update(hash_value, "bacnet")

    for attribute_name in sensor.get("attributes", []):
        attribute = attributes.get(attribute_name)
        if not attribute or attribute.get("bacnet_enable") != "1":
            continue

        hash_value = _fnv1a32_update(hash_value, attribute_name)
        hash_value = _fnv1a32_update(hash_value, attribute.get("json_key", attribute_name))
        hash_value = _fnv1a32_update(hash_value, _value_kind_from_attribute(attribute))
        hash_value = _fnv1a32_update(hash_value, BACNET_OBJECT_TYPE_MAP.get(attribute.get("bacnet_object_type"), "analog-value"))

    return f"{hash_value:08X}"


def _infer_float_precision(object_name):
    if not object_name:
        return 2

    attribute_name = object_name.rsplit(".", 1)[-1]
    return ATTRIBUTE_FLOAT_PRECISION.get(attribute_name, 2)


def extract_value(val, object_name=""):
    if val is None:
        return ""

    if isinstance(val, AnyAtomic):
        try:
            val = val.get_value()
        except Exception:
            pass

    if isinstance(val, Any):
        try:
            return str(val.cast_out(CharacterString))
        except Exception:
            return str(val)

    if isinstance(val, CharacterString):
        return str(val)

    if isinstance(val, Enumerated):
        return str(val)

    if isinstance(val, float):
        precision = _infer_float_precision(object_name)
        return f"{val:.{precision}f}"

    return str(val)


def _looks_like_unknown_object(exc):
    value = str(exc)
    return "unknown-object" in value or "unknownObject" in value or "unknown object" in value


class BACnetClient:
    def __init__(self, app, target_ip, target_port, timeout=2.0):
        self.app = app
        self.target_address = f"{target_ip}:{target_port}"
        self.timeout = timeout

    async def read_property(self, obj_type, obj_inst, prop_id):
        objid = f"{obj_type},{obj_inst}"
        try:
            coro = self.app.read_property(self.target_address, objid, prop_id)
            value = await asyncio.wait_for(coro, timeout=self.timeout)
            if isinstance(value, ErrorRejectAbortNack):
                return None
            return value
        except ErrorRejectAbortNack:
            return None
        except asyncio.TimeoutError:
            return None
        except Exception as exc:
            if _looks_like_unknown_object(exc):
                return None
            return None

    async def read_protocol_header(self, bacnet_id):
        try:
            layout_hash_objid = f"characterstring-value,{int(bacnet_id) * 100 + BACNET_META_LAYOUT_HASH_OFFSET}"
            profile_objid = f"characterstring-value,{int(bacnet_id) * 100 + BACNET_META_PROFILE_VERSION_OFFSET}"

            layout_hash = await self.app.read_property(self.target_address, layout_hash_objid, "present-value")
            profile_version = await self.app.read_property(self.target_address, profile_objid, "present-value")

            if any(isinstance(value, ErrorRejectAbortNack) for value in (layout_hash, profile_version)):
                return None

            return {
                "layoutHash": extract_value(layout_hash).strip(),
                "profileVersion": int(extract_value(profile_version).strip() or 0),
            }
        except ErrorRejectAbortNack:
            return None
        except asyncio.TimeoutError:
            return None
        except Exception as exc:
            if _looks_like_unknown_object(exc):
                return None
            return None


def print_header():
    print("-" * 108)
    print(f"{'Type':<4} | {'Instance':<8} | {'Offset':<6} | {'Value':<24} | {'Object Name'}")
    print("-" * 108)


async def read_object_name(client, obj_type, obj_inst):
    raw_name = await client.read_property(obj_type, obj_inst, "object-name")
    if raw_name is None:
        return ""
    return extract_value(raw_name)


async def run_scan_mode(client, resolved_id, target_ip, target_port, instance_start, instance_count, type_filter):
    instance_end = instance_start + instance_count - 1
    print(f"Target: {target_ip}:{target_port} | BACnet ID: {resolved_id} | Scan: {instance_start}-{instance_end}")
    print_header()

    matched = 0
    for instance in range(instance_start, instance_end + 1):
        instance_offset = instance - instance_start
        for object_type_short in SCAN_ORDER:
            if type_filter and object_type_short not in type_filter:
                continue

            object_type_long = BACNET_TYPE_MAP[object_type_short]
            raw_value = await client.read_property(object_type_long, instance, "present-value")
            if raw_value is None:
                continue

            object_name = await read_object_name(client, object_type_long, instance)
            value_text = extract_value(raw_value, object_name)
            print(
                f"{object_type_short:<4} | {instance:<8} | {instance_offset:<6} | {value_text:<24} | {object_name}"
            )
            matched += 1

    if matched == 0:
        print("No BACnet objects responded in the scanned instance range.")


async def async_main():
    parser = argparse.ArgumentParser(
        description="BACnet/IP segment scanner for IoT Hub BACnet objects",
        epilog=HELP_EXAMPLES,
        formatter_class=argparse.RawTextHelpFormatter,
    )
    parser.add_argument("--ip", type=str, default="127.0.0.1", help="Gateway IP address")
    parser.add_argument("--port", type=int, help="BACnet server port")
    parser.add_argument("--id", type=int, help="BACnet device ID (bacnet_bip_id)")
    parser.add_argument("--local", type=str, default="0.0.0.0:47809", help="Local BACnet/IP bind address")
    parser.add_argument("--start", type=int, help="Optional instance start, defaults to bacnet_id * 100")
    parser.add_argument("--count", type=int, default=DEFAULT_DEVICE_SLOT_SIZE, help="Number of instances to scan")
    parser.add_argument("--objectType", action="append", choices=SCAN_ORDER, help="Optional object type filter, repeatable")
    parser.add_argument("--sensorType", type=str, help="Optional sensor model/type for profile version and layout hash validation")

    args = parser.parse_args()

    if CONFIG_SNAPSHOT_PATH.exists():
        config_data = load_uci_config(CONFIG_SNAPSHOT_PATH)
    else:
        config_data = _BUILTIN_SNAPSHOT
    resolved_id = args.id or DEFAULT_BACNET_ID
    defaults = get_global_defaults(config_data)
    resolved_id = args.id or defaults["bacnet_id"]

    port = args.port or DEFAULT_BACNET_PORT
    instance_start = args.start if args.start is not None else resolved_id * DEFAULT_DEVICE_SLOT_SIZE
    if args.count <= 0:
        print("Error: --count must be greater than 0.")
        sys.exit(1)
    type_filter = set(args.objectType or [])

    bp_args = SimpleArgumentParser().parse_args([])
    bp_args.address = args.local
    bp_args.vendoridentifier = 999
    bp_args.name = "PythonClient"
    bp_args.instance = 59999

    app = Application.from_args(bp_args)
    client = BACnetClient(app, args.ip, port)
    try:
        if args.sensorType:
            if not config_data:
                print("Error: Sensor profile validation requires a UCI config snapshot.")
                sys.exit(2)

            sensor_type = resolve_sensor_type_name(config_data, args.sensorType)
            if not sensor_type:
                print(f"Error: Sensor model '{args.sensorType}' was not found in the current config snapshot.")
                sys.exit(2)

            sensor_label = get_sensor_display_name(config_data, sensor_type)
            expected_version = get_sensor_profile_version(config_data, sensor_type)
            expected_layout_hash = compute_bacnet_layout_hash(config_data, sensor_type)
            remote_header = await client.read_protocol_header(resolved_id)

            if expected_version or expected_layout_hash:
                if not remote_header:
                    print(
                        "Error: Gateway service did not expose a valid fixed BACnet protocol header at the device metadata objects. "
                        "The running iot_hub service is likely too old for this script."
                    )
                    sys.exit(2)

                if expected_layout_hash and remote_header["layoutHash"] != expected_layout_hash:
                    print(
                        f"Error: BACnet layout hash mismatch for {sensor_label}. "
                        f"Script expects {expected_layout_hash}, gateway exposes {remote_header['layoutHash']}. "
                        "Please update the Python scripts or restart iot_hub with the matching protocol mapping."
                    )
                    sys.exit(2)

                if expected_version and remote_header["profileVersion"] != expected_version:
                    print(
                        f"Error: Profile version mismatch for {sensor_label}. "
                        f"Script expects {expected_version}, gateway exposes {remote_header['profileVersion']}. "
                        "Please update the Python scripts or restart iot_hub with the matching protocol mapping."
                    )
                    sys.exit(2)

        await run_scan_mode(client, resolved_id, args.ip, port, instance_start, args.count, type_filter)
    finally:
        app.close()


def main():
    asyncio.run(async_main())


if __name__ == "__main__":
    main()
