âš™ī¸ Equipment Configuration Manager

📋 Basic Settings
🔌 Modbus Settings
đŸŽ›ī¸ Controllers
⚡ Power Meter
âąī¸ Timings
📚 Config Library
📝 JSON Editor
📖 JSON Documentation
Basic Configuration
Select the type of HVAC equipment being monitored
Version number for tracking configuration changes
Optional description of this configuration setup
Two's complement threshold: 60000 for Air Chiller, 65000 for Water Chiller, 0 for DX
Modbus Communication Settings
USB serial port for Modbus communication
Communication speed (typically 19200)
âš ī¸ Note: Changes to Modbus settings require restarting the readsensors service.
IMOD Controllers Configuration
Power Meter Configuration
Modbus slave address (1-247)
Communication timeout in milliseconds
Register Mappings
Field Name Internal Name Cloud Field Register
Validation Rules
Field Minimum Maximum
System Timing Configuration
Timeout for individual Modbus operations
Delay before retrying failed operations
Delay between reading individual registers
Delay between polling different controllers
Configuration Library
â„šī¸ Template Configurations: Activate a template to load it as your active configuration. The service will restart automatically.
Filename Config Name Version Last Modified Actions
📚 Complete JSON Configuration Guide
â„šī¸ Reference Guide: This is documentation only. Use other tabs to actually configure your system.

📄 Complete JSON Structure

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"
    }
  }
}

📋 Field Reference

Data Formatters

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

UI Categories

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)

🧮 Available Calculation Functions

CalculateCFM
Calculates air flow in cubic feet per minute
Inputs: velocity, duct_height, duct_width, sqft_constant
CalculatePower
Three-phase power calculation in kilowatts
Inputs: voltage_avg, current_avg, power_factor, phase_count
CalculateEER
Energy Efficiency Ratio (BTU/hr per Watt)
Inputs: capacity_btu, power_kw
CalculateCOP
Coefficient of Performance
Inputs: kwr, power_kw
CalculateEnthalpy
Air enthalpy from temperature and humidity
Inputs: temp, humidity
CalculateDewPoint
Dew point temperature calculation
Inputs: temp, humidity
CalculateWetBulb
Wet bulb temperature calculation
Inputs: temp, humidity
CalculateFlowRate
Water flow rate from pressure differential
Inputs: diff_pressure_ft, design_diff_pressure_ft, design_flow_gpm
CalculateCapacityFromFlowTemp
Chiller capacity from water flow and delta-T
Inputs: flow_gpm, delta_temp
CalculateCapacityFromCFMEnthalpy
DX capacity from air flow and enthalpy change
Inputs: cfm, enthalpy_delta
CalculateSensibleCapacity
Sensible cooling capacity
Inputs: cfm, delta_t
CalculateAverage3
Average of three values (for 3-phase systems)
Inputs: value1, value2, value3
CalculateTempDelta
Temperature difference
Inputs: temp1, temp2
CalculateKWPerTon
Efficiency metric (kW per ton of cooling)
Inputs: power_kw, capacity_tons
ConvertTonsToBTU
Convert tons to BTU/hr (× 12,000)
Inputs: capacity_tons
ConvertGPMToLPS
Convert gallons per minute to liters per second
Inputs: flow_gpm
ConvertPSIToFeet
Convert PSI to feet of head (water)
Inputs: pressure_psi
ConvertPSIToKPa
Convert PSI to kilopascals
Inputs: pressure_psi
ConvertCelsiusToFahrenheit
Temperature unit conversion
Inputs: temp_celsius
CalculateKWR
Kilowatts of refrigeration
Inputs: capacity_tons
CalculateKWEPerKWR
Kilowatts electric per kilowatts refrigeration
Inputs: power_kw, kwr

🏭 Equipment Type Differences

DX System
  • Temperature Threshold: 60000
  • Capacity Calculation: CFM × Enthalpy Delta
  • Typical Controllers: 1-2 IMOD controllers
  • Key Measurements: Supply/return air temp & humidity, velocity
  • Database Table: dxnodedata
Water Chiller
  • Temperature Threshold: 65000
  • Capacity Calculation: GPM × 500 × ΔT / 12000
  • Flow Calculation: Pressure differential method
  • Key Measurements: Chilled/condenser water temps, flow rates
  • Database Table: chillernodedata (78 fields)
Air Chiller
  • Temperature Threshold: 60000
  • Multi-Circuit: Supports up to 3 circuits
  • Compressors: 2 per circuit (6 total max)
  • Refrigerants: R134A, R407C, R514A, R123
  • Database Table: airchillernodedata (62 fields)

💡 Common Configuration Patterns

Two-Controller Setup (Most Common)

"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" }
    }
  }
]

Contact Closures (Equipment On/Off Status)

"107": {
  "internal_name": "ContactClosure1",
  "cloud_field": "contactclosure1",
  "description": "Compressor On/Off Status",
  "data_formatter": "none",     ← Binary 0/1, no formatting
  "ui_category": "contact"
}

Temperature with Two's Complement

// 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
Advanced JSON Editor
âš ī¸ Expert Mode: Direct JSON editing. Incorrect values may cause system errors.