Skip to content

PyPNM / DOCSIS-3.1 / US-OFDMA-ChannelStats

Source Files

  • HTML/script: visual/PyPNM/DOCSIS-3.1/US-OFDMA-ChannelStats.html
  • JSON sample: visual/PyPNM/DOCSIS-3.1/US-OFDMA-ChannelStats.json

Preview

Preview is best-effort. Some templates may rely on Postman-specific APIs that are not yet shimmed.

Visualizer HTML/script source
// Postman Visualizer: DOCSIS-3.1/US-OFDMA-ChannelStats
// Last Update: 2026-02-25 06:01:33 MST

// Postman Visualizer - US OFDMA Channel Statistics (Dark Mode)
// Separate, useful visuals per channel (no overlap):
// 1) Global View: Active spectrum windows (start/end) for all channels, with per-channel Tx power marker (secondary chart)
// 2) Per-channel: Active spectrum window (range bar) with derived start/end from subcarrier params
// 3) Per-channel: Timeouts/Events (T3/T4/Abort/Exceed) as vertical bars
// 4) Per-channel: Status + config (Tx power, pre-eq enabled, muted, ranging status) as a compact KPI strip

const template = `
<style>
  body {
    font-family: Arial, sans-serif;
    padding: 20px;
    background-color: #0f1220;
    color: #eaeaea;
  }
  .header {
    background-color: #151a2e;
    border: 1px solid rgba(255,255,255,0.08);
    padding: 16px 16px 12px 16px;
    border-radius: 10px;
    margin-bottom: 18px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.35);
  }
  .title {
    font-size: 18px;
    font-weight: bold;
    margin: 0 0 10px 0;
    color: #ff4d6d;
  }
  .meta {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 10px;
  }
  .pill {
    background: rgba(255,255,255,0.06);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 999px;
    padding: 6px 10px;
    font-size: 12px;
    color: #eaeaea;
  }
  .pill b { color: #9fb4ff; font-weight: 700; }

  .kpi {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 10px;
    margin-top: 12px;
  }
  .kpiItem {
    background: rgba(255,255,255,0.06);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 10px;
    padding: 10px;
  }
  .kpiItem .k { font-size: 11px; color: rgba(234,234,234,0.8); margin-bottom: 4px; }
  .kpiItem .v { font-size: 16px; font-weight: 700; color: #eaeaea; }
  .kpiItem .h { margin-top: 4px; font-size: 11px; color: rgba(159,180,255,0.95); }

  .sub {
    margin: 0;
    font-size: 12px;
    color: rgba(234,234,234,0.85);
  }
  .divider {
    height: 1px;
    background: rgba(255,255,255,0.08);
    margin: 14px 0;
  }


  .deviceInfoCard {
    background-color: #151a2e;
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 10px;
    padding: 14px;
    margin-bottom: 16px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.35);
  }
  .deviceInfoCard h3 { margin: 0 0 8px 0; font-size: 14px; color: #9fb4ff; }
  .deviceInfoTable { width: 100%; border-collapse: collapse; font-size: 12px; }
  .deviceInfoTable th, .deviceInfoTable td { border-bottom: 1px solid rgba(255,255,255,0.08); padding: 8px 6px; text-align: left; white-space: nowrap; }
  .deviceInfoTable th { color: #9fb4ff; font-weight: 700; }
  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }

  .grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 16px;
    align-items: start;
  }
  .card {
    background-color: #151a2e;
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 10px;
    padding: 14px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.35);
  }
  .card h3 {
    margin: 0 0 6px 0;
    font-size: 14px;
    color: #9fb4ff;
  }

  .strip {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 10px;
    margin: 10px 0 12px 0;
  }
  .stripItem {
    background: rgba(255,255,255,0.06);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 10px;
    padding: 10px;
  }
  .stripItem .k { font-size: 11px; color: rgba(234,234,234,0.8); margin-bottom: 4px; }
  .stripItem .v { font-size: 14px; font-weight: 700; color: #eaeaea; }

  table {
    width: 100%;
    border-collapse: collapse;
    margin-top: 10px;
    font-size: 12px;
  }
  .tableWrap {
    width: 100%;
    overflow-x: auto;
  }
  th, td {
    border-bottom: 1px solid rgba(255,255,255,0.08);
    padding: 8px 6px;
    text-align: left;
    white-space: nowrap;
  }
  th { color: #9fb4ff; font-weight: 700; }

  @media (max-width: 1200px) {
    .strip {
      grid-template-columns: repeat(3, minmax(0, 1fr));
    }
  }

  @media (max-width: 980px) {
    .grid {
      grid-template-columns: 1fr;
    }
    .kpi {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .strip {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }
  }

  @media (max-width: 640px) {
    body {
      padding: 12px;
    }
    .header, .card {
      padding: 12px;
    }
    .kpi {
      grid-template-columns: 1fr;
    }
    .strip {
      grid-template-columns: 1fr;
    }
  }
</style>


<div class="deviceInfoCard">
  <h3>Device Info</h3>
  <table class="deviceInfoTable">
    <thead>
      <tr>
        <th>MacAddress</th><th>Model</th><th>Vendor</th><th>SW Version</th><th>HW Version</th><th>Boot ROM</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="mono">{{deviceInfo.macAddress}}</td>
        <td>{{deviceInfo.MODEL}}</td>
        <td>{{deviceInfo.VENDOR}}</td>
        <td class="mono">{{deviceInfo.SW_REV}}</td>
        <td class="mono">{{deviceInfo.HW_REV}}</td>
        <td class="mono">{{deviceInfo.BOOTR}}</td>
      </tr>
    </tbody>
  </table>
</div>

<div class="header">
  <div class="title">US OFDMA Channel Statistics</div>
  <div class="meta">
    <div class="pill"><b>MAC</b> {{mac}}</div>
    <div class="pill"><b>Status</b> {{statusText}}</div>
    <div class="pill"><b>Channels</b> {{channelCount}}</div>
    <div class="pill"><b>Pre-check</b> {{precheck}}</div>
  </div>
  <p class="sub">{{message}}</p>

  <div class="kpi">
    <div class="kpiItem">
      <div class="k">Total Active Subcarriers</div>
      <div class="v">{{kpi.totalActive}}</div>
      <div class="h">Sum across channels</div>
    </div>
    <div class="kpiItem">
      <div class="k">Global Active Spectrum Span</div>
      <div class="v">{{kpi.globalSpanMHz}}</div>
      <div class="h">{{kpi.globalSpanRange}}</div>
    </div>
    <div class="kpiItem">
      <div class="k">Worst T3 Timeouts</div>
      <div class="v">{{kpi.worstT3}}</div>
      <div class="h">Ch {{kpi.worstT3Ch}}</div>
    </div>
    <div class="kpiItem">
      <div class="k">Any Muted</div>
      <div class="v">{{kpi.anyMuted}}</div>
      <div class="h">Muted flag across channels</div>
    </div>
  </div>

  <div class="divider"></div>

  <div class="sub"><b>Global View · Active Spectrum Windows (All Channels)</b></div>
  <div class="sub">Each row is one channel. Bar shows active start/end.</div>
  <canvas id="globalRangeChart" height="110"></canvas>

  <div class="divider"></div>

  <div class="sub"><b>Global View · Tx Power (dBmV)</b></div>
  <div class="sub">One bar per channel.</div>
  <canvas id="globalTxChart" height="90"></canvas>

  <div class="divider"></div>

  <div class="sub"><b>Quick Table</b></div>
  <div class="tableWrap">
    <table>
      <thead>
        <tr>
          <th>Channel</th>
          <th>Zero (MHz)</th>
          <th>Start (MHz)</th>
          <th>End (MHz)</th>
          <th>BW (MHz)</th>
          <th>Tx (dBmV)</th>
          <th>Pre-EQ</th>
          <th>Muted</th>
          <th>Ranging</th>
        </tr>
      </thead>
      <tbody>
        {{#each tableRows}}
        <tr>
          <td>{{channel}}</td>
          <td>{{zero}}</td>
          <td>{{start}}</td>
          <td>{{end}}</td>
          <td>{{bw}}</td>
          <td>{{tx}}</td>
          <td>{{preeq}}</td>
          <td>{{muted}}</td>
          <td>{{ranging}}</td>
        </tr>
        {{/each}}
      </tbody>
    </table>
  </div>
</div>


<div class="grid">
  {{#each channels}}
  <div class="card">
    <h3>{{label}} · Active Spectrum Window</h3>
    <p class="sub">Range bar derived from subcarrier params. Uses MHz.</p>

    <div class="strip">
      <div class="stripItem">
        <div class="k">Tx Power (dBmV)</div>
        <div class="v">{{txPower}}</div>
      </div>
      <div class="stripItem">
        <div class="k">Pre-EQ Enabled</div>
        <div class="v">{{preEq}}</div>
      </div>
      <div class="stripItem">
        <div class="k">Muted</div>
        <div class="v">{{muted}}</div>
      </div>
      <div class="stripItem">
        <div class="k">Ranging Status</div>
        <div class="v">{{rangingStatus}}</div>
      </div>
      <div class="stripItem">
        <div class="k">Config Change Ct</div>
        <div class="v">{{cfgChange}}</div>
      </div>
    </div>

    <canvas id="range_{{canvas_id}}" height="90"></canvas>

    <div class="divider"></div>

    <h3>{{label}} · Timeout / Event Counters</h3>
    <p class="sub">T3/T4/Abort/Exceed as bars.</p>
    <canvas id="events_{{canvas_id}}" height="110"></canvas>
  </div>
  {{/each}}
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
<script>

    pm.getData(function (err, value) {
  if (err) {
    console.error(err);
    return;
  }

  var gridColor = 'rgba(255,255,255,0.12)';
  var tickColor = 'rgba(234,234,234,0.85)';
  var labelColor = '#eaeaea';

  var cRange = 'rgb(54, 162, 235)';
  var cTx    = 'rgb(75, 192, 192)';
  var cErr   = 'rgb(255, 99, 132)';

  var rgbaFill = function(rgb, a) {
    return rgb.replace('rgb', 'rgba').replace(')', ', ' + a + ')');
  };

  // Global range chart
  (function renderGlobalRanges() {
    var canvas = document.getElementById('globalRangeChart');
    if (!canvas) return;

    var labels = (value.global || {}).labels || [];
    var ranges = (value.global || {}).ranges || []; // {x:[start,end], y:i}

    new Chart(canvas.getContext('2d'), {
      type: 'horizontalBar',
      data: {
        labels: labels,
        datasets: [{
          label: 'Active Window (MHz)',
          data: ranges,
          backgroundColor: rgbaFill(cRange, 0.45),
          borderColor: cRange,
          borderWidth: 1
        }]
      },
      options: {
        responsive: true,
        maintainAspectRatio: true,
        legend: { display: true, labels: { fontColor: labelColor } },
        tooltips: {
          mode: 'nearest',
          intersect: false,
          callbacks: {
            label: function(tooltipItem, data) {
              var v = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
              if (v && v.x && Array.isArray(v.x)) {
                return 'Active: ' + v.x[0].toFixed(3) + ' - ' + v.x[1].toFixed(3) + ' MHz';
              }
              return tooltipItem.xLabel;
            }
          }
        },
        scales: {
          xAxes: [{
            ticks: { fontColor: tickColor },
            gridLines: { color: gridColor },
            scaleLabel: { display: true, labelString: 'Frequency (MHz)', fontColor: labelColor }
          }],
          yAxes: [{
            ticks: { fontColor: tickColor },
            gridLines: { color: gridColor }
          }]
        }
      }
    });
  })();

  // Global Tx chart
  (function renderGlobalTx() {
    var canvas = document.getElementById('globalTxChart');
    if (!canvas) return;

    var labels = (value.tx || {}).labels || [];
    var txData = (value.tx || {}).tx || [];

    new Chart(canvas.getContext('2d'), {
      type: 'bar',
      data: {
        labels: labels,
        datasets: [{
          label: 'Tx Power (dBmV)',
          data: txData,
          backgroundColor: rgbaFill(cTx, 0.45),
          borderColor: cTx,
          borderWidth: 1
        }]
      },
      options: {
        responsive: true,
        maintainAspectRatio: true,
        legend: { display: true, labels: { fontColor: labelColor } },
        scales: {
          xAxes: [{
            ticks: { fontColor: tickColor },
            gridLines: { color: gridColor }
          }],
          yAxes: [{
            ticks: { fontColor: tickColor, beginAtZero: true },
            gridLines: { color: gridColor },
            scaleLabel: { display: true, labelString: 'dBmV', fontColor: labelColor }
          }]
        }
      }
    });
  })();

  // Per-channel charts (no overlap)
  (value.channels || []).forEach(function(ch) {
    // Range chart
    (function renderRange() {
      var canvas = document.getElementById('range_' + ch.canvas_id);
      if (!canvas) return;

      var ranges = [{ x: [ch.activeStartMHz, ch.activeEndMHz], y: 0 }];

      new Chart(canvas.getContext('2d'), {
        type: 'horizontalBar',
        data: {
          labels: ['Active'],
          datasets: [{
            label: 'Active Window (MHz)',
            data: ranges,
            backgroundColor: rgbaFill(cRange, 0.45),
            borderColor: cRange,
            borderWidth: 1
          }]
        },
        options: {
          responsive: true,
          maintainAspectRatio: true,
          legend: { display: true, labels: { fontColor: labelColor } },
          tooltips: {
            callbacks: {
              label: function(tooltipItem, data) {
                var v = data.datasets[0].data[0];
                return 'Active: ' + v.x[0].toFixed(3) + ' - ' + v.x[1].toFixed(3) + ' MHz';
              }
            }
          },
          scales: {
            xAxes: [{
              ticks: { fontColor: tickColor },
              gridLines: { color: gridColor },
              scaleLabel: { display: true, labelString: 'Frequency (MHz)', fontColor: labelColor }
            }],
            yAxes: [{
              ticks: { fontColor: tickColor },
              gridLines: { color: gridColor }
            }]
          }
        }
      });
    })();

    // Events chart
    (function renderEvents() {
      var canvas = document.getElementById('events_' + ch.canvas_id);
      if (!canvas) return;

      new Chart(canvas.getContext('2d'), {
        type: 'bar',
        data: {
          labels: ['T3', 'T4', 'Abort', 'Exceed'],
          datasets: [{
            label: 'Count',
            data: [ch.t3, ch.t4, ch.abort, ch.exceed],
            backgroundColor: rgbaFill(cErr, 0.55),
            borderColor: cErr,
            borderWidth: 1
          }]
        },
        options: {
          responsive: true,
          maintainAspectRatio: true,
          legend: { display: true, labels: { fontColor: labelColor } },
          scales: {
            xAxes: [{
              ticks: { fontColor: tickColor },
              gridLines: { color: gridColor }
            }],
            yAxes: [{
              ticks: { fontColor: tickColor, beginAtZero: true },
              gridLines: { color: gridColor }
            }]
          }
        }
      });
    })();
  });
});
</script>
`;

function constructVisualizerPayload() {
  const r = pm.response.json();
  const device = (r.device && typeof r.device === "object") ? r.device : {};
  const sys = (device.system_description && typeof device.system_description === "object") ? device.system_description : {};

  const mac = ((r.device || {}).mac_address) || 'N/A';
  const status = (r.status !== undefined && r.status !== null) ? r.status : 'N/A';
  const statusText = status === 0 ? 'Success' : String(status);
  const message = r.message ? r.message : '';
  const precheck = message && message.toLowerCase().indexOf('pre-check') >= 0 ? 'OK' : 'N/A';

  const results = Array.isArray(r.results) ? r.results : [];

  let totalActive = 0;
  let anyMuted = false;

  let worstT3 = -1;
  let worstT3Ch = 'N/A';

  let globalMinMHz = null;
  let globalMaxMHz = null;

  const tableRows = [];

  const channels = results.map((item, idx) => {
    const channelId = (item && item.channel_id !== undefined && item.channel_id !== null) ? item.channel_id : ('idx-' + (idx + 1));
    const e = item && item.entry ? item.entry : {};

    // NOTE: spacing appears to be "50" in sample payload (likely kHz). We defensively interpret:
    // - if spacing >= 1000: assume Hz
    // - else: assume kHz and convert to Hz (common: 50 kHz for OFDMA)
    const zeroHz = Number(e.docsIf31CmUsOfdmaChanSubcarrierZeroFreq || 0);
    const first = Number(e.docsIf31CmUsOfdmaChanFirstActiveSubcarrierNum || 0);
    const last = Number(e.docsIf31CmUsOfdmaChanLastActiveSubcarrierNum || 0);
    const numActive = Number(e.docsIf31CmUsOfdmaChanNumActiveSubcarriers || 0);

    const spacingRaw = Number(e.docsIf31CmUsOfdmaChanSubcarrierSpacing || 0);
    const spacingHz = (spacingRaw >= 1000) ? spacingRaw : (spacingRaw * 1000);

    const activeStartHz = zeroHz + (first * spacingHz);
    const activeEndHz = zeroHz + (last * spacingHz);
    const bwHz = (last >= first) ? ((last - first + 1) * spacingHz) : 0;

    const zeroMHz = zeroHz / 1e6;
    const activeStartMHz = activeStartHz / 1e6;
    const activeEndMHz = activeEndHz / 1e6;
    const bwMHz = bwHz / 1e6;

    const txPower = (e.docsIf31CmUsOfdmaChanTxPower !== undefined && e.docsIf31CmUsOfdmaChanTxPower !== null)
      ? Number(e.docsIf31CmUsOfdmaChanTxPower)
      : 0;

    const preEqEnabled = !!e.docsIf31CmUsOfdmaChanPreEqEnabled;
    const isMuted = !!e.docsIf31CmStatusOfdmaUsIsMuted;
    const rangingStatus = (e.docsIf31CmStatusOfdmaUsRangingStatus !== undefined && e.docsIf31CmStatusOfdmaUsRangingStatus !== null)
      ? String(e.docsIf31CmStatusOfdmaUsRangingStatus)
      : 'N/A';

    const cfgChange = Number(e.docsIf31CmUsOfdmaChanConfigChangeCt || 0);

    const t3 = Number(e.docsIf31CmStatusOfdmaUsT3Timeouts || 0);
    const t4 = Number(e.docsIf31CmStatusOfdmaUsT4Timeouts || 0);
    const abort = Number(e.docsIf31CmStatusOfdmaUsRangingAborteds || 0);
    const exceed = Number(e.docsIf31CmStatusOfdmaUsT3Exceededs || 0);

    totalActive += numActive;

    if (isMuted) anyMuted = true;
    if (t3 > worstT3) {
      worstT3 = t3;
      worstT3Ch = String(channelId);
    }

    if (Number.isFinite(activeStartMHz) && Number.isFinite(activeEndMHz)) {
      if (globalMinMHz === null || activeStartMHz < globalMinMHz) globalMinMHz = activeStartMHz;
      if (globalMaxMHz === null || activeEndMHz > globalMaxMHz) globalMaxMHz = activeEndMHz;
    }

    tableRows.push({
      channel: String(channelId),
      zero: zeroMHz.toFixed(3),
      start: activeStartMHz.toFixed(3),
      end: activeEndMHz.toFixed(3),
      bw: bwMHz.toFixed(3),
      tx: txPower.toFixed(1),
      preeq: preEqEnabled ? 'true' : 'false',
      muted: isMuted ? 'true' : 'false',
      ranging: rangingStatus
    });

    return {
      label: 'OFDMA Channel ' + String(channelId),
      canvas_id: 'c' + String(idx + 1),

      activeStartMHz,
      activeEndMHz,
      bwMHz,

      txPower: txPower.toFixed(1),
      preEq: preEqEnabled ? 'true' : 'false',
      muted: isMuted ? 'true' : 'false',
      rangingStatus: rangingStatus,
      cfgChange: String(cfgChange),

      t3, t4, abort, exceed
    };
  });

  const labels = channels.map(ch => ch.label.replace('OFDMA ', 'Ch '));
  const ranges = channels.map((ch, i) => ({ x: [ch.activeStartMHz, ch.activeEndMHz], y: i }));

  const txLabels = channels.map(ch => ch.label.replace('OFDMA Channel ', 'Ch '));
  const tx = channels.map(ch => Number(ch.txPower));

  const globalSpanMHz = (globalMinMHz !== null && globalMaxMHz !== null) ? (globalMaxMHz - globalMinMHz) : 0;
  const globalSpanRange = (globalMinMHz !== null && globalMaxMHz !== null)
    ? (globalMinMHz.toFixed(3) + ' - ' + globalMaxMHz.toFixed(3) + ' MHz')
    : 'N/A';

  const kpi = {
    totalActive: String(totalActive),
    globalSpanMHz: globalSpanMHz.toFixed(3) + ' MHz',
    globalSpanRange: globalSpanRange,
    worstT3: String(Math.max(0, worstT3)),
    worstT3Ch: worstT3Ch,
    anyMuted: anyMuted ? 'true' : 'false'
  };

  return {
    deviceInfo: {
      macAddress: device.mac_address || "N/A",
      MODEL: sys.MODEL || "N/A",
      VENDOR: sys.VENDOR || "N/A",
      SW_REV: sys.SW_REV || "N/A",
      HW_REV: sys.HW_REV || "N/A",
      BOOTR: sys.BOOTR || "N/A"
    },
    mac,
    statusText,
    message,
    precheck,
    channelCount: channels.length,
    kpi,
    tableRows,
    global: { labels, ranges },
    tx: { labels: txLabels, tx },
    channels
  };
}

pm.visualizer.set(template, constructVisualizerPayload());
Sample JSON payload
{
    "system_description": {
        "HW_REV": "1.0",
        "VENDOR": "LANCity",
        "BOOTR": "NONE",
        "SW_REV": "1.0.0",
        "MODEL": "LCPET-3"
    },
    "status": 0,
    "message": "Pre-check successful: CableModem reachable via ping and SNMP",
    "device": {
        "mac_address": "aa:bb:cc:dd:ee:ff",
        "system_description": {
            "HW_REV": "1.0",
            "VENDOR": "LANCity",
            "BOOTR": "NONE",
            "SW_REV": "1.0.0",
            "MODEL": "LCPET-3"
        }
    },
    "results": [
        {
            "index": 81,
            "channel_id": 42,
            "entry": {
                "docsIf31CmUsOfdmaChanChannelId": 42,
                "docsIf31CmUsOfdmaChanConfigChangeCt": 0,
                "docsIf31CmUsOfdmaChanSubcarrierZeroFreq": 104800000,
                "docsIf31CmUsOfdmaChanFirstActiveSubcarrierNum": 74,
                "docsIf31CmUsOfdmaChanLastActiveSubcarrierNum": 1969,
                "docsIf31CmUsOfdmaChanNumActiveSubcarriers": 1896,
                "docsIf31CmUsOfdmaChanSubcarrierSpacing": 50,
                "docsIf31CmUsOfdmaChanCyclicPrefix": 192,
                "docsIf31CmUsOfdmaChanRollOffPeriod": 128,
                "docsIf31CmUsOfdmaChanNumSymbolsPerFrame": 10,
                "docsIf31CmUsOfdmaChanTxPower": 16.6,
                "docsIf31CmUsOfdmaChanPreEqEnabled": true,
                "docsIf31CmStatusOfdmaUsT3Timeouts": 0,
                "docsIf31CmStatusOfdmaUsT4Timeouts": 0,
                "docsIf31CmStatusOfdmaUsRangingAborteds": 0,
                "docsIf31CmStatusOfdmaUsT3Exceededs": 0,
                "docsIf31CmStatusOfdmaUsIsMuted": false,
                "docsIf31CmStatusOfdmaUsRangingStatus": "success"
            }
        },
        {
            "index": 82,
            "channel_id": 41,
            "entry": {
                "docsIf31CmUsOfdmaChanChannelId": 41,
                "docsIf31CmUsOfdmaChanConfigChangeCt": 0,
                "docsIf31CmUsOfdmaChanSubcarrierZeroFreq": 22000000,
                "docsIf31CmUsOfdmaChanFirstActiveSubcarrierNum": 74,
                "docsIf31CmUsOfdmaChanLastActiveSubcarrierNum": 1249,
                "docsIf31CmUsOfdmaChanNumActiveSubcarriers": 1176,
                "docsIf31CmUsOfdmaChanSubcarrierSpacing": 50,
                "docsIf31CmUsOfdmaChanCyclicPrefix": 192,
                "docsIf31CmUsOfdmaChanRollOffPeriod": 128,
                "docsIf31CmUsOfdmaChanNumSymbolsPerFrame": 10,
                "docsIf31CmUsOfdmaChanTxPower": 16.6,
                "docsIf31CmUsOfdmaChanPreEqEnabled": true,
                "docsIf31CmStatusOfdmaUsT3Timeouts": 0,
                "docsIf31CmStatusOfdmaUsT4Timeouts": 0,
                "docsIf31CmStatusOfdmaUsRangingAborteds": 0,
                "docsIf31CmStatusOfdmaUsT3Exceededs": 0,
                "docsIf31CmStatusOfdmaUsIsMuted": false,
                "docsIf31CmStatusOfdmaUsRangingStatus": "success"
            }
        }
    ]
}