{
  "spec_version": 1,
  "slug": "greystone-cmd5b1",
  "manufacturer": "Greystone Energy Systems",
  "model": "CMD5B1 series Modbus carbon monoxide transmitter",
  "category": "Sensor",
  "supplier_url": "https://www.greystoneenergy.com/",
  "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": 9600,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 0,
      "count": 1,
      "name": "CO status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Holding register 40001 (offset +0): 0x0000 = CO in normal status, 0x0001 = in abnormal status."
    },
    {
      "address": 1,
      "count": 1,
      "name": "CO value",
      "data_type": "UInt16",
      "units": "ppm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Holding register 40002 (offset +1): unsigned 16-bit CO concentration, 0...500 ppm."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Greystone Energy Systems “Modbus Carbon Monoxide Transmitter – CMD5B1 Series, Installation Instructions”, document IN-GE-CMD5B1XXXMOD-003, vendor-hosted at https://downloads.greystoneenergy.com/Install%20Notes/IN-GE-CMD5B1XXXMOD.pdf. The document fixes the whole line format at the factory (section ‘Modbus protocol’): 9600 bps, 8 data bits, no parity, 1 stop bit, RTU mode, half duplex, CRC-16 (0xA001), and says other parameters are only changed at the factory. The slave address is set with the local DIP switches (1-255) and the document gives no factory switch position; unit 1 is therefore a placeholder, not a cited factory value – set the address your DIP switches select. The map itself is complete: the device exposes exactly two holding registers, status and ppm, read with function code 3; the document's offsets +0/+1 are stored as wire addresses 0 and 1 with zero_based addressing. The transmitter is a parking-garage / IAQ CO sensor (0-500 ppm) and is used for ventilation demand control."
}
