{
  "spec_version": 1,
  "slug": "abb-aquamaster4",
  "manufacturer": "ABB",
  "model": "AquaMaster4 (FET400 transmitter)",
  "category": "Flow meter",
  "supplier_url": "https://new.abb.com/products/measurement-products/flow/electromagnetic-flowmeters/water-waste-water/aquamaster",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 19200,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [
    {
      "address": 500,
      "count": 1,
      "name": "Flow sensor is reverse wired",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = sensor wired correctly for forward flow indication; 1 = sensor reverse wired (flow measurements are internally inverted so the correct direction is indicated). Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 501,
      "count": 1,
      "name": "Flow sensor is an insertion probe",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = not an insertion probe; 1 = insertion probe. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 502,
      "count": 1,
      "name": "Lock switch engaged",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = lock switch unlocked; 1 = lock switch locked. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 503,
      "count": 1,
      "name": "Reserved",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Reserved/unused; readable only as part of a block read starting at a valid address. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 504,
      "count": 1,
      "name": "Battery power low warning",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = battery voltage above the low threshold; 1 = below it. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 505,
      "count": 1,
      "name": "Battery power critical warning",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = battery voltage above the critical threshold; 1 = below it. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 506,
      "count": 1,
      "name": "Flow sensor communications error",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no sensor communications problems; 1 = sensor not connected or a communications problem. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 507,
      "count": 1,
      "name": "Flow sensor coil open circuit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = coil resistance within range; 1 = coil resistance above the expected range. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 508,
      "count": 1,
      "name": "Empty pipe condition",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = pipe full; 1 = pipe empty or less than 50 % full. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 509,
      "count": 1,
      "name": "Mains power off warning",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = mains power on; 1 = mains power off (mains-powered units). Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 510,
      "count": 1,
      "name": "Flow measurement capture saturation error",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = capture within range; 1 = capture cannot work because of an external fault such as excessive AC pickup on the measuring electrode. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 511,
      "count": 1,
      "name": "High flow",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = flow below the high flow alarm setting; 1 = flow above it. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 512,
      "count": 1,
      "name": "Low flow",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = flow above the low flow alarm setting; 1 = flow below it. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 513,
      "count": 1,
      "name": "Reserved",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Reserved/unused; readable only as part of a block read starting at a valid address. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    },
    {
      "address": 514,
      "count": 1,
      "name": "Reverse flow",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = measured flow is zero or forward; 1 = measured flow is reverse. Discrete input read as a single bit (function code 02); the value is 0 or 1."
    }
  ],
  "input_registers": [
    {
      "address": 0,
      "count": 2,
      "name": "Flow rate",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Flow rate in the user-specified flow units. Units are set on the flowmeter and are not fixed by the map."
    },
    {
      "address": 2,
      "count": 2,
      "name": "Pressure",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Pressure in the user-specified pressure units (pressure option)."
    },
    {
      "address": 4,
      "count": 2,
      "name": "Velocity",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Velocity in the user-specified velocity units."
    },
    {
      "address": 6,
      "count": 2,
      "name": "Forward flow totalizer",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Forward flow totalizer in the user-specified volume units."
    },
    {
      "address": 8,
      "count": 2,
      "name": "Reverse flow totalizer",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Reverse flow totalizer in the user-specified volume units."
    },
    {
      "address": 10,
      "count": 2,
      "name": "Net flow totalizer",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Net flow totalizer in the user-specified volume units."
    },
    {
      "address": 12,
      "count": 4,
      "name": "Forward flow totalizer, high precision",
      "data_type": "Float64",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Forward flow totalizer in the user-specified volume units, higher precision value."
    },
    {
      "address": 16,
      "count": 4,
      "name": "Reverse flow totalizer, high precision",
      "data_type": "Float64",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Reverse flow totalizer in the user-specified volume units, higher precision value."
    },
    {
      "address": 20,
      "count": 4,
      "name": "Net flow totalizer, high precision",
      "data_type": "Float64",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Net flow totalizer in the user-specified volume units, higher precision value."
    },
    {
      "address": 4026,
      "count": 2,
      "name": "Forward flow totalizer x100",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Forward flow totalizer x100 in the user-specified volume units, integer digits only (AquaMaster 3 compatible definition)."
    },
    {
      "address": 4028,
      "count": 2,
      "name": "Reverse flow totalizer x100",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Reverse flow totalizer x100 in the user-specified volume units, integer digits only (AquaMaster 3 compatible definition)."
    },
    {
      "address": 4030,
      "count": 2,
      "name": "Net flow totalizer x100",
      "data_type": "Int32",
      "units": "",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Net flow totalizer x100 in the user-specified volume units, integer digits only (AquaMaster 3 compatible definition)."
    }
  ],
  "holding_registers": [],
  "combined_registers": [],
  "notes": "Source: ABB 'AquaMaster4 electromagnetic flowmeter transmitter - Communications supplement', COI/FET400/MODBUS-EN Rev. C (library.e.abb.com/public/57ebb3fb15e84c01955f88c05bed685c/COI_FET400_MODBUS-EN_C.pdf), Modbus tables in chapter 7: the 'Discrete inputs table' and the input register blocks at 3:0001-3:0025 and 3:4027-3:4031. AquaMaster4 is ABB's battery or mains powered electromagnetic flowmeter for potable water distribution, revenue metering and irrigation. Addressing: the supplement prints every row as 'register number / address' (for example '3:0001 / 0x0000') and states the rule itself - 'Coil, DI or register numbers start at 1, whereas their corresponding addresses start at 0 ... the first input register 30001 also has address 0x0000' - so the hex address printed in the vendor table is used here unchanged and addressing is zero_based. Factory serial settings from chapter 3: 19200 baud, 8 data bits, no parity (the '19200_8_N (default)' data format), always 1 stop bit, slave address 1 by default (range 1-247). The map covers the measured flow, pressure, velocity and totalizer values plus the alarm discrete inputs of the backwards-compatible 1:0501-1:0515 block. Deliberately left out: the holding-register table (4:8001+, volume/velocity/pressure unit selection and output configuration) and the identification/diagnostic input-register blocks from 3:0013 upwards, because in those tables ABB prints the register-number column, the data-format column and the description column as separate stacked blocks so a row cannot be paired without guessing; the 'Reserved' discrete inputs 1:0504 and 1:0514 are listed because the vendor publishes them. Units are not fixed by the map: flow, volume, velocity and pressure units are selected per meter and returned in the configured unit ('user specified units' in the vendor table), so the seed states the quantity and leaves the unit blank instead of guessing a unit."
}
