| Field Name | Internal Name | Cloud Field | Register |
|---|
| Field | Minimum | Maximum |
|---|
| Filename | Config Name | Version | Last Modified | Actions |
|---|
Below is a fully annotated example showing all possible configuration options:
{
// Basic Settings
"equipment_type": "DX", â DX, WaterChiller, or AirChiller
"version": "3.3", â Configuration version number
"description": "My DX System", â Human-readable description
"temperature_threshold": 60000, â 60000 for DX/Air, 65000 for Water
// Modbus Communication Settings
"modbus_settings": {
"port": "/dev/ttyUSB0", â Serial port path
"baud_rate": 19200, â 9600, 19200, 38400, 57600, 115200
"data_bits": 8, â Usually 8
"parity": "N", â N=None, E=Even, O=Odd
"stop_bits": 2 â 1 or 2
},
// Controller Configuration
"controllers": [
{
"name": "Controller A - IMOD-A",
"slave_id": 2, â Modbus slave address (1-247)
"timeout_ms": 500, â Read timeout in milliseconds
"register_offset": -1, â Offset for register numbering (-1, 0, or 1)
"register_mappings": {
"100": { â Modbus register number
"internal_name": "OATemp",
"cloud_field": "oatemp", â Database column name
"description": "Outdoor Air Temperature",
"data_formatter": "*.1 * 1.8 + 32", â Celsius to Fahrenheit
"ui_category": "temp-humid" â UI grouping category
}
}
}
],
// Power Meter Configuration
"power_meter": {
"slave_id": 1,
"timeout_ms": 300,
"register_mappings": {
"current_a": {
"register": 8194,
"internal_name": "CurrentA",
"cloud_field": "currenta"
}
},
"validation_rules": {
"current_a": {
"min": 0,
"max": 5000 â Value range validation
}
}
},
// Timing Configuration
"timings": {
"between_reads_delay_ms": 10,
"between_controllers_delay_ms": 25,
"modbus_timeout_ms": 300,
"retry_delay_ms": 500
},
// Field Calculation Mappings
"field_calculation_map": {
"cfm": {
"function": "CalculateCFM",
"inputs": ["velocity", "duct_height", "duct_width", "sqft_constant"],
"output_field": "CFM",
"cloud_field": "cfm",
"ui_category": "airflow"
}
}
}
| Formatter | Description | Example |
|---|---|---|
*.1 |
Divide by 10 | 650 â 65.0 |
*.01 |
Divide by 100 | 1234 â 12.34 |
*.1 * 1.8 + 32 |
Celsius to Fahrenheit | 200 â 68°F |
none |
No formatting, use raw value | 1 â 1 |
| Category | Used For |
|---|---|
temp-humid |
Temperature and humidity sensors |
airflow |
CFM, velocity, pressure measurements |
contact |
Contact closures, on/off states |
power |
Electrical measurements (voltage, current, kW) |
performance |
Calculated metrics (COP, EER, capacity) |
"controllers": [
{
"name": "Controller A - Primary Sensors",
"slave_id": 2,
"timeout_ms": 500,
"register_offset": -1,
"register_mappings": {
"100": { "internal_name": "OATemp", "cloud_field": "oatemp" },
"101": { "internal_name": "Humidity1", "cloud_field": "humidity1" },
"102": { "internal_name": "Temp1", "cloud_field": "temp1" }
}
},
{
"name": "Controller B - Additional Sensors",
"slave_id": 3,
"timeout_ms": 500,
"register_offset": 0, â Often different from Controller A
"register_mappings": {
"101": { "internal_name": "ContactClosure4", "cloud_field": "contactclosure4" }
}
}
]
"107": {
"internal_name": "ContactClosure1",
"cloud_field": "contactclosure1",
"description": "Compressor On/Off Status",
"data_formatter": "none", â Binary 0/1, no formatting
"ui_category": "contact"
}
// For negative temperatures, use temperature_threshold "temperature_threshold": 60000, "100": { "internal_name": "RefrigerantTemp", "data_formatter": "*.1", "description": "Refrigerant Temperature" } // Values > 60000 are treated as negative (two's complement) // Example: 65000 â (65000 - 65536) / 10 = -53.6°F