{
  "spec_version": 1,
  "slug": "seeed-s-co2-03",
  "manufacturer": "Seeed Studio",
  "model": "SenseCAP CO2, Temperature and Humidity Sensor (S-CO2-03)",
  "category": "Gas detector",
  "supplier_url": "https://files.seeedstudio.com/products/SenseCAP/101991029_CO2_Sensor/CO2_Sensor_Datasheet(S-CO2-03).pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 45,
    "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": "CO2 concentration",
      "data_type": "UInt16",
      "units": "ppm",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0...10000 ppm, unscaled (the document's example returns 0x0AB2 = 2738 ppm)."
    },
    {
      "address": 1,
      "count": 1,
      "name": "Air temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Two's complement, divided by 100 (the document's example returns 0x09C4 = 2500 = 25.00 °C). Range -40.00...80.00 °C."
    },
    {
      "address": 2,
      "count": 1,
      "name": "Air humidity",
      "data_type": "UInt16",
      "units": "%RH",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Divided by 100 (the document's example returns 0x1388 = 5000 = 50.00 %RH). Range 0...99 %RH."
    },
    {
      "address": 7,
      "count": 1,
      "name": "Firmware and hardware version",
      "data_type": "Hex",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "High byte = hardware version number, low byte = software version number, both divided by 10 (0x0B0A = hardware 1.1, software 1.0)."
    },
    {
      "address": 16,
      "count": 1,
      "name": "Modbus slave address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1...247, factory default 45. A restart is required after a change."
    },
    {
      "address": 17,
      "count": 1,
      "name": "Serial baud rate",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = 1200, 1 = 2400, 2 = 4800, 3 = 9600, 4 = 19200, 5 = 38400, 6 = 57600, 7 = 115200 bps. Factory default 3 (9600 bps). A restart is required after a change."
    },
    {
      "address": 18,
      "count": 1,
      "name": "Serial parity",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = no parity, 1 = odd, 2 = even. Factory default 0. The document adds that when parity is enabled the host must use 7 data bits and Modbus-ASCII. A restart is required after a change."
    },
    {
      "address": 19,
      "count": 1,
      "name": "Serial stop bit",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = 1 stop bit, 1 = 2 stop bits. Factory default 0. A restart is required after a change."
    },
    {
      "address": 20,
      "count": 1,
      "name": "Modbus protocol type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = Modbus-RTU, 1 = Modbus-ASCII. Factory default 0. A restart is required after a change."
    },
    {
      "address": 21,
      "count": 1,
      "name": "SDI-12 address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "ASCII code of the SDI-12 address character; default 0x30 ('0'). Read-only over Modbus."
    },
    {
      "address": 32,
      "count": 1,
      "name": "Delayed response",
      "data_type": "UInt16",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0...65535 ms, factory default 10 ms. Delay before the sensor answers a host query."
    },
    {
      "address": 33,
      "count": 1,
      "name": "CO2 sensor warm-up time",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0...65535 s, factory default 120 s. Read register 0x0000 only after warm-up time + 3 s."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Seeed Technology 'CO2, Temperature and Humidity Sensor - Datasheet', S-CO2-03, Version V2.0 (25 pages, (c)2008-2023), vendor-hosted PDF at the URL above (opened 7 Nov 2026): section 4.1 protocol, 4.2 register table, 4.3 register descriptions, 4.4 example frames, 4.5 debugging. Factory serial settings from section 4.1: 9600 bps, one start bit, 8 data bits, no parity, one stop bit; the communication registers give the same values (baud register default 3 = 9600, parity 0 = none, stop bit 0 = one) and the slave address factory default is printed as 45. Addressing: the register table prints hex addresses starting at 0x0000 and the example frames read and answer with those numbers unchanged, so they are stored zero-based. All rows use function code 0x03 for reading (the document's 'Function Number' column lists 3, 4 for the live values and 3, 6 for the configuration rows); the four communication rows (0x0010-0x0013) and the protocol type (0x0014) are write targets that need a power cycle. The register 0x0011 note that a parity setting implies 7 data bits and Modbus-ASCII is recorded in the row description because it changes the framing the gateway must use."
}
