Get monitor make and model and other info in human readable form

In Ubuntu's Monitor Preferences, it is identified as Viewsonic Corporation 16". How can I extract this human readable form?

That human readable form ("Viewsonic Corporation") does not come (directly) from your EDID:
Ubuntu uses gnome libraries underneath. libgnome-desktop decodes the edid and - via pnp-ids - converts the three-letter vendor ID ("VSC" in your particular case) into a pretty name for the display.

gnome-pnp-ids.c, line 51:

* Note: we now prefer to use data coming from hwdata (and shipped with gnome-desktop)*

On my system

grep VSC /usr/share/hwdata/pnp.ids

returns:

VSC    ViewSonic Corporation

That aside, additional information can be extracted from the EDID, namely from the descriptor blocks. From the same wikipedia link:

Descriptor blocks. Detailed timing descriptors, in decreasing preference order. After all detailed timing descriptors, additional descriptors are permitted:

  • Monitor range limits (required)
  • ASCII text (monitor name (required), monitor serial number or unstructured text)
  • 6 Additional standard timing information blocks
  • Colour point data

Currently defined descriptor types are:

  • 0xFF: Monitor serial number (text)
  • 0xFE: Unspecified text (text)
  • 0xFD: Monitor range limits. 6- or 13-byte binary descriptor.
  • 0xFC: Monitor name (text)
  • 0xFB: Additional white point data. 2× 5-byte descriptors, padded with 0A 20 20.
  • 0xFA: Additional standard timing identifiers. 6× 2-byte descriptors, padded with 0A.

In your EDID you have 0xFF (serial number) in descriptor 1 (bytes 54-71):

00 ff 00 48 48 39 32 31 30 30 30 30 39 0a 20 20 00 00

and you have 0xFC (monitor name) in descriptor 3 (bytes 90–107) and 4 (bytes 108–125):

  00 fc 00 56 69 65 77 53 6f 6e 69 63 20 45 37 37 00 00
  00 fc 00 31 2d 32 0a 20 20 20 20 20 20 20 20 20 00 84

so it's only a matter of extracting the information from there, e.g. descriptor 3:

56 69 65 77 53 6f 6e 69 63 20 45 37 37 >> Viewsonic E77

There are some linux tools out there that parse EDIDs... I use monitor-edid. Here is the output in Perl dumper format on my machine:

(
+{
          'EISA_ID' => 'CMO1574',
          'checksum' => 25,
          'detailed_timings' => [
                                  {
                                    'ModeLine' => '"1600x900" 97.75 1600 1648 1680 1760 900 903 908 926 -hsync -vsync',
                                    'ModeLine_comment' => '# Monitor preferred modeline (60.0 Hz vsync, 55.5 kHz hsync, ratio 16/9, 118 dpi)',
                                    'digital_composite' => 3,
                                    'horizontal_active' => 1600,
                                    'horizontal_blanking' => 160,
                                    'horizontal_border' => 0,
                                    'horizontal_dpi' => '118.139534883721',
                                    'horizontal_image_size' => 344,
                                    'horizontal_sync_offset' => 48,
                                    'horizontal_sync_positive' => 0,
                                    'horizontal_sync_pulse_width' => 32,
                                    'interlaced' => 0,
                                    'pixel_clock' => '97.75',
                                    'preferred' => 1,
                                    'stereo' => 0,
                                    'vertical_active' => 900,
                                    'vertical_blanking' => 26,
                                    'vertical_border' => 0,
                                    'vertical_dpi' => '118.445595854922',
                                    'vertical_image_size' => 193,
                                    'vertical_sync_offset' => 3,
                                    'vertical_sync_positive' => 0,
                                    'vertical_sync_pulse_width' => 5
                                  }
                                ],
          'diagonal_size' => '15.5292379824145',
          'edid_revision' => 3,
          'edid_version' => 1,
          'established_timings' => [],
          'extension_flag' => 0,
          'feature_support' => {
                                 'DPMS_active_off' => 0,
                                 'DPMS_standby' => 0,
                                 'DPMS_suspend' => 0,
                                 'GTF_compliance' => 0,
                                 'has_preferred_timing' => 1,
                                 'rgb' => 0,
                                 'sRGB_compliance' => 0
                               },
          'file' => '/sys/class/drm/card0-LVDS-1/edid',
          'gamma' => 120,
          'manufacturer_name' => 'CMO',
          'max_size_horizontal' => '34.4',
          'max_size_precision' => 'mm',
          'max_size_vertical' => '19.3',
          'monitor_details' => '',
          'monitor_text' => [
                              'N156O6-L01',
                              'CMO',
                              'N156O6-L01'
                            ],
          'product_code' => 5492,
          'ratio' => '1.78238341968912',
          'ratio_name' => '16/9',
          'ratio_precision' => 'mm',
          'serial_number' => 0,
          'standard_timings' => [],
          'video_input_definition' => {
                                        'composite_sync' => 0,
                                        'digital' => 1,
                                        'separate_sync' => 0,
                                        'sync_on_green' => 0,
                                        'voltage_level' => 0
                                      },
          'week' => 41,
          'year' => 2008
        }
,
)

Finally, I have no idea how to determine (in linux) if a monitor is LCD or CRT. I don't know of any library that implements such function (like this one from MS).


The following tool can be helpful for decoding edid info: http://cgit.freedesktop.org/xorg/app/edid-decode


Something like this should work better (all others answers didn't work 100% here):

for file in `ls -1 /sys/class/drm/*/edid`; do text=$(tr -d '\0' <"$file"); if [ -n "$text" ]; then edid-decode "$file" | grep -e Manufacturer: -e Product; sleep 0.0001; fi done

I tested here with 2 monitors. My primary is a builtin laptop monitor and the secondary is a DELL 25". This was the output:

Manufacturer: DELL Model 53359 Serial Number 809781068
Display Product Serial Number: YKFWP5790DGL
Display Product Name: DELL U2515H
Manufacturer: LGD Model 1133 Serial Number 0

You must have installed the edid-decode in your distro. My setup is DELL Latitude e5450 with Ubuntu 20.04.