Polling/Graphing Cisco Optical Rx/Tx Values from SFPs

I am new to NPM and the whole process of custom pollers.    Normally, a value - like "octets transmitted" follow the "ifIndex" notation to identify which interface is which value.   Similarly, all the "octets transmitted" are grouped together (by ifIndex number) and then a next block of "octets received" - etc.

Cisco doesn't appear to follow this methodology for the SNMP polling of Optical values.   Instead, it looks like this:

1) First, there's a "entPhysicalDescr" table (similar to ifIndex, but for physical interfaces)

[ entPhysicalDescr ]

$ snmpwalk -v2c -c comm avl-fed-pop-sw5 .1.3.6.1.2.1.47.1.1.1.1.2

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1042 = STRING: "1000BaseBX10-D SFP"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1043 = STRING: "GigabitEthernet0/1 Module Temperature Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1044 = STRING: "GigabitEthernet0/1 Supply Voltage Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1045 = STRING: "GigabitEthernet0/1 Bias Current Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1046 = STRING: "GigabitEthernet0/1 Transmit Power Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1047 = STRING: "GigabitEthernet0/1 Receive Power Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1048 = STRING: "1000BaseBX10-D SFP"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1049 = STRING: "GigabitEthernet0/2 Module Temperature Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1050 = STRING: "GigabitEthernet0/2 Supply Voltage Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1051 = STRING: "GigabitEthernet0/2 Bias Current Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1052 = STRING: "GigabitEthernet0/2 Transmit Power Sensor"

SNMPv2-SMI::mib-2.47.1.1.1.1.2.1053 = STRING: "GigabitEthernet0/2 Receive Power Sensor"

** So please note -- Gig1/0 repeats five times, the "type" of SFP, and then once for each of the various sensors -- then G0/2, etc.

2) Then, the "entSensorValue" will return the value for each of those sensors, example:

[ entSensorValue ]

$ snmpwalk -v2c -c ercnoc avl-fed-pop-sw5 1.3.6.1.4.1.9.9.91.1.1.1.1.4

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1043 = INTEGER: 385

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1044 = INTEGER: 33

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1045 = INTEGER: 183

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1046 = INTEGER: -67

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1047 = INTEGER: -78

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1049 = INTEGER: 420

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1050 = INTEGER: 33

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1051 = INTEGER: 209

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1052 = INTEGER: -63

SNMPv2-SMI::enterprises.9.9.91.1.1.1.1.4.1053 = INTEGER: -78

3) This corresponds to what we see within the Cisco device (with each value needing to be divided by 10 to return the proper adjusted value)

avl-fed-pop-sw5#show interfaces transceiver

                                           Optical   Optical

           Temperature  Voltage  Current   Tx Power  Rx Power

Port       (Celsius)    (Volts)  (mA)      (dBm)     (dBm)

---------  -----------  -------  --------  --------  --------

Gi0/1        38.5       3.32      18.3      -6.7      -7.8

Gi0/2        42.0       3.33      20.9      -6.3      -7.8

****

I'm not seeing how to have NPM "graph" such a weird table layout.  It would mean graphing "every 5th entry" and using the "entPhysicalDescr" instead of "ifIndex" -- and then complicating it by needing to graph at a different starting index -- so that all the "Transmit Power" are together, then "Receive Power" together, etc.

Suggestions for how to conquer this beast?