{
  "$schema": "https://raw.githubusercontent.com/nobrega8/mbmap-library/main/schema/mbmap-2.schema.json",
  "mbmap": 2,
  "vendor": "Grant",
  "model": "Aerona3 (Chofu)",
  "models": ["Aerona3"],
  "vendor_website": "grantuk.com",
  "description": "Air-to-water heat pump made by Chofu, sold as Grant Aerona3",
  "revision": 2,
  "revised": "2026-10-18",
  "source": "Warm Energy Labs Heat Pump Modbus Database (MIT licence); draft from reverse engineering, not tested",
  "sources": [
    {
      "title": "Heat Pump Modbus Database (Warm Energy Labs)",
      "url": "https://github.com/Warm-Energy/Heat-Pump-Modbus-Database",
      "note": "src/aerona/modbus_registers.json, MIT licence, Copyright (c) 2025 Warm Energy Labs Ltd"
    }
  ],
  "notes": [
    "Draft map from reverse engineering in the source; not tested on a device.",
    "Writing to a heat pump can damage it: check before you write."
  ],
  "x_status": "unofficial",
  "x_origin": "warm-energy",
  "protocol": "rtu",
  "baudrate": 19200,
  "parity": "N",
  "stopbits": 2,
  "byte_order": "big",
  "word_order": "big",
  "address_base": 0,
  "registers": [
    {"name": "Erase Error History", "area": "coil", "address": 0, "type": "bool", "description": "Erase error history", "access": "RW"},
    {"name": "Reboot Operation", "area": "coil", "address": 1, "type": "bool", "description": "Operation at reboot after blackout: 0=disable, 1=enable", "access": "RW"},
    {"name": "Heating Zone1 Water Setpoint Mode", "area": "coil", "address": 2, "type": "bool", "description": "0=Fixed set point, 1=Climatic curve", "access": "RW"},
    {"name": "Anti Legionella Function", "area": "coil", "address": 6, "type": "bool", "description": "Anti-legionella function: 0=disable, 1=enable", "access": "RW"},
    {"name": "HP Unit Control Mode", "area": "coil", "address": 7, "type": "bool", "description": "HP unit turn on/off based on: 0=Room set point, 1=Water set point", "access": "RW"},
    {"name": "Configurable Input Heating Enable", "area": "discrete", "address": 3, "type": "bool", "description": "Configurable input (terminal 20-21) / heating enable"},
    {"name": "Return Water Temperature", "area": "input", "address": 0, "type": "int16", "unit": "°C", "description": "Return water temperature"},
    {"name": "Discharge Temperature", "area": "input", "address": 2, "type": "int16", "unit": "°C", "description": "Discharge temperature"},
    {"name": "Defrost Temperature", "area": "input", "address": 5, "type": "int16", "unit": "°C", "description": "Defrost temperature"},
    {"name": "Outdoor Air Temperature", "area": "input", "address": 6, "type": "int16", "unit": "°C", "description": "Outdoor air temperature"},
    {"name": "Suction Temperature", "area": "input", "address": 8, "type": "int16", "unit": "°C", "description": "Suction temperature"},
    {"name": "Outgoing Water Temperature", "area": "input", "address": 9, "type": "int16", "unit": "°C", "description": "Outgoing water temperature"},
    {"name": "Operating Mode", "area": "input", "address": 10, "type": "int16", "description": "Operating mode: 0=Off, 1=Heating, 2=Cooling"},
    {"name": "Zone1 Room Temperature", "area": "input", "address": 11, "type": "int16", "scale": 0.1, "unit": "°C", "description": "Zone 1 room temperature"},
    {"name": "Zone2 Room Temperature", "area": "input", "address": 12, "type": "int16", "scale": 0.1, "unit": "°C", "description": "Zone 2 room temperature"},
    {"name": "DHW Operating Mode", "area": "input", "address": 13, "type": "int16", "description": "DHW mode: 0=Disable, 1=Comfort, 2=Economy, 3=Force"},
    {"name": "DHW Tank Temperature", "area": "input", "address": 16, "type": "int16", "unit": "°C", "description": "DHW tank temperature"},
    {"name": "Humidity Sensor", "area": "input", "address": 20, "type": "int16", "unit": "%", "description": "Humidity sensor reading"},
    {"name": "Current Error Code", "area": "input", "address": 21, "type": "int16", "description": "Current error code"},
    {"name": "Previous Error Code 1", "area": "input", "address": 22, "type": "int16", "description": "Previous error code 1"},
    {"name": "Previous Error Code 2", "area": "input", "address": 23, "type": "int16", "description": "Previous error code 2"},
    {"name": "Previous Error Code 3", "area": "input", "address": 24, "type": "int16", "description": "Previous error code 3"},
    {"name": "Previous Error Code 4", "area": "input", "address": 25, "type": "int16", "description": "Previous error code 4"},
    {"name": "Previous Error Code 5", "area": "input", "address": 26, "type": "int16", "description": "Previous error code 5"},
    {"name": "Plate Heat Exchanger Temperature", "area": "input", "address": 32, "type": "int16", "unit": "°C", "description": "Plate heat exchanger temperature"},
    {"name": "Heating Zone1 Fixed Water Setpoint", "area": "holding", "address": 2, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Fixed outgoing water set point for heating zone 1", "access": "RW", "write_min": 25, "write_max": 55},
    {"name": "Heating Zone1 Max Water Temperature", "area": "holding", "address": 3, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Maximum outgoing water temperature for heating zone 1", "access": "RW", "write_min": 25, "write_max": 55},
    {"name": "Heating Zone1 Min Water Temperature", "area": "holding", "address": 4, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Minimum outgoing water temperature for heating zone 1", "access": "RW", "write_min": 25, "write_max": 55},
    {"name": "Heating Zone1 Max Outdoor Temperature", "area": "holding", "address": 5, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Maximum outdoor air temperature correlation for heating zone 1", "access": "RW"},
    {"name": "Heating Zone1 Min Outdoor Temperature", "area": "holding", "address": 6, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Minimum outdoor air temperature correlation for heating zone 1", "access": "RW"},
    {"name": "Heating Zone2 Fixed Water Setpoint", "area": "holding", "address": 7, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Fixed outgoing water set point for heating zone 2", "access": "RW", "write_min": 25, "write_max": 55},
    {"name": "Heating Zone2 Max Water Temperature", "area": "holding", "address": 8, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Maximum outgoing water temperature for heating zone 2", "access": "RW", "write_min": 25, "write_max": 55},
    {"name": "Heating Zone2 Min Water Temperature", "area": "holding", "address": 9, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Minimum outgoing water temperature for heating zone 2", "access": "RW", "write_min": 25, "write_max": 55},
    {"name": "Heating Zone2 Max Outdoor Temperature", "area": "holding", "address": 10, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Maximum outdoor air temperature correlation for heating zone 2", "access": "RW", "enum": {"0": "Off", "1": "Heat", "2": "Cool"}},
    {"name": "Heating Zone2 Min Outdoor Temperature", "area": "holding", "address": 11, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Minimum outdoor air temperature correlation for heating zone 2", "access": "RW"},
    {"name": "Cooling Zone1 Fixed Water Setpoint", "area": "holding", "address": 13, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Fixed outgoing water set point for cooling zone 1", "access": "RW", "write_min": 5, "write_max": 25, "enum": {"0": "Off", "1": "Heat"}},
    {"name": "Cooling Zone2 Fixed Water Setpoint", "area": "holding", "address": 18, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Fixed outgoing water set point for cooling zone 2", "access": "RW", "write_min": 5, "write_max": 25},
    {"name": "DHW Priority", "area": "holding", "address": 26, "type": "int16", "description": "DHW production priority: 0=Standard, 1=Priority", "access": "RW"},
    {"name": "DHW Comfort Temperature", "area": "holding", "address": 27, "type": "int16", "scale": 0.5, "unit": "°C", "description": "DHW comfort temperature", "access": "RW", "write_min": 40, "write_max": 60},
    {"name": "DHW Economy Temperature", "area": "holding", "address": 28, "type": "int16", "scale": 0.5, "unit": "°C", "description": "DHW economy temperature", "access": "RW", "write_min": 40, "write_max": 60},
    {"name": "DHW Force Temperature", "area": "holding", "address": 29, "type": "int16", "scale": 0.5, "unit": "°C", "description": "DHW force temperature", "access": "RW", "write_min": 50, "write_max": 70},
    {"name": "Pump Run Time", "area": "holding", "address": 37, "type": "int16", "unit": "min", "description": "Pump run time after compressor off", "access": "RW"},
    {"name": "Pump Frequency", "area": "holding", "address": 38, "type": "int16", "unit": "Hz", "description": "Pump frequency setting", "access": "RW"},
    {"name": "Compressor Start Delay", "area": "holding", "address": 39, "type": "int16", "unit": "min", "description": "Compressor start delay", "access": "RW"},
    {"name": "Frost Protection Start Temperature", "area": "holding", "address": 50, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Temperature at which frost protection starts", "access": "RW"},
    {"name": "Frost Protection Stop Temperature", "area": "holding", "address": 51, "type": "int16", "scale": 0.5, "unit": "°C", "description": "Temperature at which frost protection stops", "access": "RW"}
  ]
}
