Git Product home page Git Product logo

cable_modem_stats's Introduction

Poor man's cable modem monitor

Monitor an Arris cable modem bandwidth usage from its status page. It's intended for those CMs that do not support SNMP out of the box but still offer the down stream octets count. It could be thought of as a router bandwidth usage monitor used.

If you are interested on monitoring a cable modem or router from another vendor (Netgear , etc.), please create an issue mentioning its model and attach the status page HTML source as a file.

Based on Arris TG862 model.

Table of Contents

Description

Typically, status page is found at http://192.168.100.1/cgi-bin/status_cgi

We are interested in the Octets column of the Downstream table. It holds the count of octets or bytes per stream and could be used to calculate to downstream bandwidth in use during a period of time.

Downstream table

Solution will be based on standard Linux tools like bash, xmllint for HTML parsing with XPath and rrdtool a round robin database for time series data.

Other (possibly) supported models: CM550A, CM820A, TG852G, TG862G, TM402G, TM402P, TM502G, TM504G, TM508A, TM602G, TM604G, TM608G, TM702G, TM722G, TM822G, WBM760.

How to use scripts

  1. Create data source, see help for more options.

create_data_source.sh

  1. Create a cron job to run the update script, for example, every 5 minutes.
*/5 * * * * $HOME/bin/arris_stats.sh >> $HOME/tmp/arris-stats.log 2>&1

After some time there should be enough data to create a graphic showing downstream usage in bits/s

current_stats.sh -d "$HOME/bin/arris-download.rrd" -s "8 hours ago" -o ~/tmp/myrouter-000.png

How it works

Parsing values

Values are obtained parsing the html with xmllintand the following XPath for each row. In the example below, row 2, column 7 holds the first value.

"//tbody[tr[td[.='DCID']]]/tr[2]/td[7]/text()"

rrdtool data source

Let's create the data source specifying the start time in Unix Epoch time. The type of the data source is set to DERIVE instead of COUNTER to avoid the spike in the graphic in case the router is restarted.

rrdtool create TG862A-downstream.rrd --start 1525303000 \
    DS:stream1:DERIVE:600:U:U \
    DS:stream2:DERIVE:600:U:U \
    DS:stream3:DERIVE:600:U:U \
    DS:stream4:DERIVE:600:U:U \
    DS:stream5:DERIVE:600:U:U \
    DS:stream6:DERIVE:600:U:U \
    DS:stream7:DERIVE:600:U:U \
    DS:stream8:DERIVE:600:U:U \
    RRA:AVERAGE:0.5:1:600 \
    RRA:AVERAGE:0.5:6:700 \
    RRA:AVERAGE:0.5:24:775 \
    RRA:AVERAGE:0.5:288:797 \
    RRA:MAX:0.5:1:600 \
    RRA:MAX:0.5:6:700 \
    RRA:MAX:0.5:24:775 \
    RRA:MAX:0.5:288:797 \

Inserting data points

Data is constructed as a semicolon separated string of current timestamp and 1 value per stream taken from the Downstream table. arris_stats.shscript can be used to insert values every 10 minutes with a cron job.

rrdtool update TG862A-downstream.rrd '1525656902:2028507401:1261128031:1283119650:1250781607:1292426630:1207561542:1264223879:1268794455'

Cron job

*/5 * * * * $HOME/bin/arris_stats.sh >> $HOME/tmp/arris-stats.log 2>&1

Creating a graph

The command below will create a graph with down stream speed in bits/s for 2 hours worth of data between 12:00 and 13:00 of current date. Colors, legends, etc. can be modified on current_stats.sh script.

Down stream bandwidth 12:00 - 13:00

rfile="$HOME/bin/TG862A-downstream.rrd"
ofile="$HOME/tmp/tg862a-2h.png"
trange1="$(date -d '12:00' '+%s')"
trange2="$(date -d '13:00' '+%s')"
topt="--start $trange1 --end $trange2"
opts="--width=900 --height=600 --base=1000 --vertical-label='bits/s' --legend-position=east --interlaced"
rrdtool graph "$ofile" $opts $topt \
    DEF:in1=$rfile:stream1:AVERAGE \
    DEF:in2=$rfile:stream2:AVERAGE \
    DEF:in3=$rfile:stream3:AVERAGE \
    DEF:in4=$rfile:stream4:AVERAGE \
    DEF:in5=$rfile:stream5:AVERAGE \
    DEF:in6=$rfile:stream6:AVERAGE \
    DEF:in7=$rfile:stream7:AVERAGE \
    DEF:in8=$rfile:stream8:AVERAGE \
    CDEF:TotalIn=in1,in2,in3,in4,in5,in6,in7,in8,+,+,+,+,+,+,+,8,* \
    LINE2:TotalIn#6a5acd:"Total bits/s\n" \
    COMMENT:"\s" \
    CDEF:in1b=in1,8,* \
    CDEF:in2b=in2,8,* \
    CDEF:in3b=in3,8,* \
    CDEF:in4b=in4,8,* \
    CDEF:in5b=in5,8,* \
    CDEF:in6b=in6,8,* \
    CDEF:in7b=in7,8,* \
    CDEF:in8b=in8,8,* \
    LINE1:in1b#00FF00:"Stream 1\n" \
    LINE1:in2b#FF0000:"Stream 2\n" \
    LINE1:in3b#0000FF:"Stream 3\n" \
    LINE1:in4b#FF00FF:"Stream 4\n" \
    LINE1:in5b#EF0000:"Stream 5\n" \
    LINE1:in6b#0000EF:"Stream 6\n" \
    LINE1:in7b#DF0000:"Stream 7\n" \
    LINE1:in8b#1C3135:"Stream 8\n" \
    COMMENT:"\s" \
    GPRINT:TotalIn:AVERAGE:"Avg\:%4.2lf%s\n" \
    GPRINT:TotalIn:MAX:"Max\:%4.2lf%s\n" \

Scripts help

arris_stats.sh

SUMMARY:
    Parse Arris cable modem status page using XPath and store results on rrd. Based on model TG862A status page.

OPTIONS:
        -d Data source file path. Optional, /home/luis/tmp/arris-downstream.rrd by default.
        -u status page URL, default: http://192.168.100.1/cgi-bin/status_cgi
        -h This help.

create_data_source.sh

SUMMARY:
    Create rrdtool data source.

Usage: 
    `create_data_source.sh -d <rrd filename> [-s <start time as Unix Epoch>] [-i]`

Examples: 
            create_data_source.sh -d /home/luis/bin/arris-downstream.rrd -s 1525998621

current_stats.sh

SUMMARY:
    Create down stream speed graphic for the given time range, last 24 hs by default.
Usage: 
         current_stats.sh [-d <data source file>] [-s <start time>] [-e <end time>] [-o <output image path>]
Examples: 
        current_stats.sh -d /home/luis/bin/arris-download.rrd -s '14:00' -e '23:00' -o /home/luis/tmp/myrouter-000.png
        current_stats.sh -d /home/luis/bin/TG862G-download.rrd -s '14:00' -o /home/luis/tmp/myrouter-000.png

cable_modem_stats's People

Contributors

mluis7 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

cable_modem_stats's Issues

Add Arris SB8200

Hi is it possible to monitor and the SB8200 status, signal, and log data, every few seconds? Would be nice to see historical info and check for any issues going on.

image

[FEATURE] Add support for Netgear CM1200 cablem modem

 
 
 
 
 
 
 
 
 
   
   
  <title>NETGEAR Modem CM1200</title>
 
 
 
   
  <script type="text/javascript" src="jquery.js"></script>
   
  <script type="text/javascript" src="script/script.js"></script>
 
   
  <script type="text/javascript">
   
  var isInited = 0;
   
  var vApply = "Apply";
  var vCancel = "Cancel";
  var vLocked = "Locked";
  var vOperational = "Operational";
  var vDisabled = "Disabled";
  var vNotLockedl = "Not Locked";
  var vUnknown = "Unknown";
  var gExtUsPower = "";
   
  $(document).ready(function()
  {
  $("#target").submit(function() {
  });
  });
   
  function setHelpIframeVisible(){
  $('.help-frame-div').css("visibility","visible");
  }
   
   
  function showHelpIframe() {
   
   
  var imgSrc=document.getElementById('help-button');
   
  if(imgSrc.src.search("up")>=0)
  {
  $(".help-frame-div").show();
  imgSrc.src="img/helparrowdown-icon.gif";
  }
  else
  {
  $(".help-frame-div").hide();
  imgSrc.src="img/helparrowup-icon.gif";
  setTimeout(setHelpIframeVisible,500);
  }
  }
  /*
  function moveToHTMLend()
  {
  window.location.href='#helpframe-anchor';
  setHelpIframeVisible();
  }
  */
   
  function loadhelp(fname,anchname)
  {
  var pane = window.frames["helpframe"].$('#content');
  var imgSrc=document.getElementById('help-button');
  if(imgSrc.src.search("up")<0)
  {
   
  $(".help-frame-div").show();
  pane.jScrollPane({showArrows:true});
   
   
  if ((loadhelp.arguments.length == 1 ) || (anchname == "" ))
  {
  window.frames["helpframe"].location.href=fname+"_h."+"htm";
  $(".help-frame-div").show();
  }
  else
  {
  window.frames["helpframe"].location.href=fname+"_h."+"htm#" + anchname;
  $(".help-frame-div").show();
  }
   
  $(".help-frame-div").show();
  pane.jScrollPane({showArrows:true});
   
  }
  }
   
  function drawTable(tableId, tags, onAddRowCB)
  {
  var cellsNum = 0;
  var item = 0;
  var totalTagNum = tags.length - 1; // expect the first 1
  var theTable = document.getElementById(tableId);
   
  if ( !tags[tags.length - 1])
  totalTagNum --;
  cellsNum = totalTagNum / parseInt(tags[0]);
   
  if (theTable != null)
  {
  // Terry 20111228, remove all table content before to fill out the new content
  while (theTable.rows.length > 1)
  {
  theTable.deleteRow(theTable.rows.length - 1);
  }
  //
   
  for (item = 0; item < parseInt(tags[0]); item++)
  {
  var newRow = theTable.insertRow(-1);
  var cellsList = onAddRowCB(newRow, item , (item * cellsNum) + 1, tags);
   
  for (i = 0; i < cellsList.length; i++)
  {
  if (cellsList[i].length == 0)
  {
  newRow.insertCell(-1).innerHTML = ' ';
  }
  else
  {
  newRow.insertCell(-1).innerHTML = cellsList[i];
  }
  }
  }
  }
  }
   
  function InitTagValue()
  {
  /*
  Acquire Downstream Channel (text) | Acquire Downstream Channel Comment (text) |
  Connectivity State (text) | Connectivity State Comment (text) |
  Boot State (text) | Boot State Comment (text) |
  Configuration File (text) | Configuration File Comment (text) |
  Security (text) | Security Comment (text) |
  Current System Time (text)
  */
  //var tagValueList = "0|In Progress|In Progress|Not Synchronized|In Progress|Unknown|In Progress|Unknown|Disabled|Disabled|--- --- -- --:--:-- ----";
  //var tagValueList = "399|Done|Done|Synchronized|Done|Unknown|In Progress|Unknown|Disabled|Disabled|123 456 78 90:12:34 5678";
   
  var tagValueList = '903000000|Locked|OK|Operational|OK|Operational| | |Enabled|BPI+|Wed Sep 16 11:33:53 2020|0|0|0|1 day 10:28:38|2|';
   
  return tagValueList.split("|");
  }
   
  function InitUpdateView(tagValues)
  {
  for (i =0; i < tagValues.length; i++)
  {
  if (tagValues[i] == "Apply")
  tagValues[i] = vApply;
  else if (tagValues[i] == "Cancel")
  tagValues[i] = vCancel;
  else if (tagValues[i] == "Locked")
  tagValues[i] = vLocked;
  else if (tagValues[i] == "Operational")
  tagValues[i] = vOperational;
  else if (tagValues[i] == "Disabled")
  tagValues[i] = vDisabled;
  else if (tagValues[i] == "Not Locked")
  tagValues[i] = vNotLockedl;
  else if (tagValues[i] == "Unknown")
  tagValues[i] = vUnknown;
  }
  document.getElementById("AcquireDsChanelStatus").innerHTML = tagValues[0] + " Hz";
  document.getElementById("AcquireDsChanelComment").innerHTML = tagValues[1];
  document.getElementById("ConnectivityStateStatus").innerHTML = tagValues[2];
  document.getElementById("ConnectivityStateComment").innerHTML = tagValues[3];
  document.getElementById("BootStateStatus").innerHTML = tagValues[4];
  document.getElementById("BootStateComment").innerHTML = tagValues[5];
  document.getElementById("ConfigurationFileStatus").innerHTML = tagValues[6];
  document.getElementById("ConfigurationFileComment").innerHTML = tagValues[7];
  if(tagValues[6] == " ")
  document.getElementById("ConfigurationFile").style.display = "none";
  document.getElementById("SecurityStatus").innerHTML = tagValues[8];
  document.getElementById("SecurityComment").innerHTML = tagValues[9];
  document.getElementById("CurrentSystemTime").innerHTML = 'Current System Time:' + tagValues[10];
  document.getElementById("SystemUpTime").innerHTML = 'System Up Time:' + tagValues[14];
  $("#Startupfreq").val(tagValues[11]); //20120525 jeffery implement goto freq
  if( tagValues[12] == 0 )
  {
  document.getElementById("DownstreamBondedChannels").innerHTML = 'Downstream Bonded Channels';
  }
  else
  {
  document.getElementById("DownstreamBondedChannels").innerHTML = 'Downstream Bonded Channels' + ' (Partial Service)';
  }
  if( tagValues[13] == 0 )
  {
  document.getElementById("UpstreamBondedChannels").innerHTML = 'Upstream Bonded Channels';
  }
  else
  {
  document.getElementById("UpstreamBondedChannels").innerHTML = 'Upstream Bonded Channels' + ' (Partial Service)';
  }
   
  document.getElementsByName("extUsPower")[0].value = tagValues[15];
  }
   
  function InitUsTableTagValue()
  {
  /*
  Channel (text) | Lock Status (text) | US Channel Type (text) | Channel ID (text) | Symbol Rate (text) | Frequency (text) | Power (text)
  */
  /*
  var tagValueList = "4" +
  "|1|Not Locked|Unknown|0|0|0|0.0" +
  "|2|Not Locked|Unknown|0|0|0|0.0" +
  "|3|Not Locked|Unknown|0|0|0|0.0" +
  "|4|Not Locked|Unknown|0|0|0|0.0";
  */
  var tagValueList = '8|1|Locked|ATDMA|1|5120|19300000 Hz|46.3|2|Locked|ATDMA|2|5120|25800000 Hz|45|3|Locked|ATDMA|3|5120|32200000 Hz|44|4|Locked|ATDMA|4|5120|38600000 Hz|44.5|5|Not Locked|Unknown|0|0|0 Hz|0.0|6|Not Locked|Unknown|0|0|0 Hz|0.0|7|Not Locked|Unknown|0|0|0 Hz|0.0|8|Not Locked|Unknown|0|0|0 Hz|0.0|';
   
  return tagValueList.split("|");
  }
   
  function onAddUsRowCB(newRow, rowId, firstCellIdx, tags)
  {
  for (i =0; i < tags.length; i++)
  {
  if (tags[i] == "Apply")
  tags[i] = vApply;
  else if (tags[i] == "Cancel")
  tags[i] = vCancel;
  else if (tags[i] == "Locked")
  tags[i] = vLocked;
  else if (tags[i] == "Operational")
  tags[i] = vOperational;
  else if (tags[i] == "Disabled")
  tags[i] = vDisabled;
  else if (tags[i] == "Not Locked")
  tags[i] = vNotLockedl;
  else if (tags[i] == "Unknown")
  tags[i] = vUnknown;
  }
  var cellsArray = new Array();
   
  cellsArray [0] = tags[firstCellIdx + 0];
  cellsArray [1] = tags[firstCellIdx + 1];
  cellsArray [2] = tags[firstCellIdx + 2];
  cellsArray [3] = tags[firstCellIdx + 3];
  cellsArray [4] = tags[firstCellIdx + 4] + " Ksym/sec";
  cellsArray [5] = tags[firstCellIdx + 5];
  cellsArray [6] = tags[firstCellIdx + 6] + " dBmV";
   
  return cellsArray;
  }
   
  function InitDsTableTagValue()
  {
  /*
  Channel (text) | Lock Status (text) | Modulation (text) | Channel ID (text) | Frequency (text) | Power (text) | SNR (text) | Correctables (text) | Uncorrectables (text)
  */
  /*
  var tagValueList = "8" +
  "|1|Locked|Unknown|0|809500000|-61.6|0.0|11|0" +
  "|2|Not Locked|Unknown|0|0|0.0|0.0|0|0" +
  "|3|Not Locked|Unknown|0|0|0.0|0.0|0|0" +
  "|4|Not Locked|Unknown|0|0|0.0|0.0|0|0" +
  "|5|Not Locked|Unknown|0|0|0.0|0.0|0|0" +
  "|6|Not Locked|Unknown|0|0|0.0|0.0|0|0" +
  "|7|Not Locked|Unknown|0|0|0.0|0.0|0|0" +
  "|8|Not Locked|Unknown|0|0|0.0|0.0|0|0";
  */
  var tagValueList = '32|1|Locked|QAM256|21|903000000 Hz|-2.8|39|518|96|2|Locked|QAM256|1|783000000 Hz|-5.4|38.1|529|63|3|Locked|QAM256|2|789000000 Hz|-5.1|38.1|537|76|4|Locked|QAM256|3|795000000 Hz|-4.9|38.2|507|93|5|Locked|QAM256|4|801000000 Hz|-4.7|38.2|503|113|6|Locked|QAM256|5|807000000 Hz|-4.5|38.3|548|76|7|Locked|QAM256|6|813000000 Hz|-4.5|38.3|536|159|8|Locked|QAM256|7|819000000 Hz|-4.4|38.4|527|91|9|Locked|QAM256|8|825000000 Hz|-4.4|38.4|526|115|10|Locked|QAM256|9|831000000 Hz|-4|38.6|542|81|11|Locked|QAM256|10|837000000 Hz|-3.2|39|541|69|12|Locked|QAM256|11|843000000 Hz|-2.6|39.3|485|119|13|Locked|QAM256|12|849000000 Hz|-2.4|39.4|535|47|14|Locked|QAM256|13|855000000 Hz|-2.8|39.2|486|102|15|Locked|QAM256|14|861000000 Hz|-2.9|38.9|2338|175|16|Locked|QAM256|15|867000000 Hz|-3.1|38.4|0|0|17|Locked|QAM256|16|873000000 Hz|-3.2|38.5|2921|7785|18|Locked|QAM256|17|879000000 Hz|-2.9|39|549|77|19|Locked|QAM256|18|885000000 Hz|-2.8|39|528|115|20|Locked|QAM256|19|891000000 Hz|-2.8|39|489|101|21|Locked|QAM256|20|897000000 Hz|-2.7|39.1|492|77|22|Locked|QAM256|22|909000000 Hz|-2.7|39|503|105|23|Locked|QAM256|23|915000000 Hz|-2.3|39.1|462|82|24|Locked|QAM256|24|921000000 Hz|-2.2|39.2|544|34|25|Locked|QAM256|25|927000000 Hz|-2|39.2|528|40|26|Locked|QAM256|26|933000000 Hz|-1.8|39.3|486|49|27|Locked|QAM256|27|939000000 Hz|-1.8|39.3|468|69|28|Locked|QAM256|28|945000000 Hz|-1.8|39.3|466|43|29|Locked|QAM256|29|951000000 Hz|-2|39.2|457|55|30|Locked|QAM256|30|957000000 Hz|-2|39.2|463|85|31|Locked|QAM256|31|963000000 Hz|-2.1|39.2|490|64|32|Locked|QAM256|32|969000000 Hz|-2.4|39|467|89|';
   
  return tagValueList.split("|");
  }
   
  function InitCmIpProvModeTag()
  {
  /*
  Is Retail (bool) | IP Provisioning Mode (text) | MIB Value (text)
  */
  //var tagValueList = "1|Honor MDD|honorMdd(4)|"
  var tagValueList = '1|Honor MDD|honorMdd(4)|';
   
  return tagValueList.split("|");
  }
   
  function onAddDsRowCB(newRow, rowId, firstCellIdx, tags)
  {
  for (i =0; i < tags.length; i++)
  {
  if (tags[i] == "Apply")
  tags[i] = vApply;
  else if (tags[i] == "Cancel")
  tags[i] = vCancel;
  else if (tags[i] == "Locked")
  tags[i] = vLocked;
  else if (tags[i] == "Operational")
  tags[i] = vOperational;
  else if (tags[i] == "Disabled")
  tags[i] = vDisabled;
  else if (tags[i] == "Not Locked")
  tags[i] = vNotLockedl;
  else if (tags[i] == "Unknown")
  tags[i] = vUnknown;
  }
  var cellsArray = new Array();
   
  cellsArray [0] = tags[firstCellIdx + 0];
  cellsArray [1] = tags[firstCellIdx + 1];
  cellsArray [2] = tags[firstCellIdx + 2];
  cellsArray [3] = tags[firstCellIdx + 3];
  cellsArray [4] = tags[firstCellIdx + 4];
  cellsArray [5] = tags[firstCellIdx + 5] + " dBmV";
  cellsArray [6] = tags[firstCellIdx + 6] + " dB";
  cellsArray [7] = tags[firstCellIdx + 7];
  cellsArray [8] = tags[firstCellIdx + 8];
   
  return cellsArray;
  }
   
  function InitUsTableUpdateView(tagValues)
  {
  /* draw table and insert content value */
  drawTable('usTable', tagValues, onAddUsRowCB);
  }
   
  function InitDsTableUpdateView(tagValues)
  {
  /* draw table and insert content value */
  drawTable('dsTable', tagValues, onAddDsRowCB);
  }
   
  function InitCmIpProvModeUpdateView(tagValues)
  {
  if(tagValues[0] == "1") // Retail
  {
  document.getElementById("IpProvModeStatus").innerHTML = tagValues[1];
  document.getElementById("IpProvModeComment").innerHTML = tagValues[2];
  }
  else
  {
  $('#CmIpProvMode').hide();
  }
  }
   
  function InitUsOfdmaTableTagValue()
  {
  /*
  var tagValueList = '2'
  + '|1||Success|1300000 Hz|74~1673|18|30.8 dBmV'
  + '|2||Success|41300000 Hz|74~1673|18|30.5 dBmV';
  */
  var tagValueList = '2|1|Not Locked|0|0|0 Hz|0 dBmV|2|Not Locked|0|0|0 Hz|0 dBmV';
   
  return tagValueList.split("|");
  }
   
  function onAddUsOfdmaRowCB(newRow, rowId, firstCellIdx, tags)
  {
  var cellsArray = new Array();
   
  cellsArray [0] = tags[firstCellIdx + 0];
  cellsArray [1] = tags[firstCellIdx + 1];
  cellsArray [2] = tags[firstCellIdx + 2];
  cellsArray [3] = tags[firstCellIdx + 3];
  cellsArray [4] = tags[firstCellIdx + 4];
  cellsArray [5] = tags[firstCellIdx + 5];
   
  return cellsArray;
  }
   
  function InitUsOfdmaTableUpdateView(tagValues)
  {
  drawTable('usOfdmaTable', tagValues, onAddUsOfdmaRowCB);
  }
   
  function InitDsOfdmTableTagValue()
  {
  /*
  var tagValueList = '2'
  + '|1|66|Primary|297600000 Hz|148~3947|0|0'
  + '|2|99|Backup Primary|495600000 Hz|148~3947|0|0';
  */
  var tagValueList = '2|1|Locked|0 ,1 ,2 ,3|159|300000000 Hz|5.7 dBmV|44.5 dB|1108 ~ 2987|5521210288|217894818|1352|2|Not Locked|0|0|0 Hz|0 dBmV|0.0 dB|0 ~ 4095|0|0|0|';
   
  return tagValueList.split("|");
  }
   
  function onAddDsOfdmRowCB(newRow, rowId, firstCellIdx, tags)
  {
  var cellsArray = new Array();
   
  cellsArray [0] = tags[firstCellIdx + 0];
  cellsArray [1] = tags[firstCellIdx + 1];
  cellsArray [2] = tags[firstCellIdx + 2];
  cellsArray [3] = tags[firstCellIdx + 3];
  cellsArray [4] = tags[firstCellIdx + 4];
  cellsArray [5] = tags[firstCellIdx + 5];
  cellsArray [6] = tags[firstCellIdx + 6];
  cellsArray [7] = tags[firstCellIdx + 7];
  cellsArray [8] = tags[firstCellIdx + 8];
  cellsArray [9] = tags[firstCellIdx + 9];
  cellsArray [10] = tags[firstCellIdx + 10];
   
  return cellsArray;
  }
   
  function InitDsOfdmTableUpdateView(tagValues)
  {
  drawTable('dsOfdmTable', tagValues, onAddDsOfdmRowCB);
  }
   
  function BodyInit()
  {
  InitUpdateView(InitTagValue());
  InitUsTableUpdateView(InitUsTableTagValue());
  InitDsTableUpdateView(InitDsTableTagValue());
  InitCmIpProvModeUpdateView(InitCmIpProvModeTag());
  InitUsOfdmaTableUpdateView(InitUsOfdmaTableTagValue());
  InitDsOfdmTableUpdateView(InitDsOfdmTableTagValue());
  }
   
  //20120525 jeffery implement goto freq
  function checkData()
  {
  var extUsPower = document.getElementsByName("extUsPower")[0].value;
  var reply;
  if(extUsPower != "0" || extUsPower != "3")
  {
  if(extUsPower == "1" && document.getElementById("ext_us_power").checked == false ||
  extUsPower == "2" && document.getElementById("ext_us_power").checked == true)
  {
  reply = confirm("Device will reboot after the change of Extended Upstream Transmit Power setting. Please confirm if you want to proceed.");
  if (!reply)
  {
  loadSettings();
  return false;
  }
  }
  }
  return true;
  }
   
  function loadSettings()
  {
  var extUsPower = document.getElementsByName("extUsPower")[0].value;
  if(extUsPower == "0")
  {
  $("#ext_us_pwr_line").hide();
  $("#ext_us_pwr_title").hide();
  $("#ext_us_pwr_checkbox").hide();
  }
  else if(extUsPower == "3")
  {
  document.getElementById("ext_us_power").checked = true;
  document.getElementById("ext_us_power").disabled = true;
  }
  else
  {
  document.getElementById("ext_us_power").disabled = false;
  if(extUsPower == "1")
  {
  document.getElementById("ext_us_power").checked = true;
  }
  else
  {
  document.getElementById("ext_us_power").checked = false;
  }
  }
  }
   
  </script>
  <style type="text/css">
  .style1 {
  text-align: left;
  }
  </style>
 
 
 
 
 
  Cable Connection
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
  <button value="Apply" type="SUBMIT" onClick="buttonClick(this,'Apply'); return checkData();"
  name="action" class="button-apply">
 
  Apply 
 
      
 
 
 
     
 
 
 
 
 
      Cancel
 
 
 
      
 
 
 
 
 
 
 
  Frequency start Value
 
 
 
 
 
  This field below allows you to modify the frequency the cable modem start with its scan during initialization and registration. Enter the new start frequency and restart the cable modem for it to take effect.
 
 
 
 
 
 
 
 
 
 
  Starting Frequency
 
 
 
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
  Startup Procedure
 
 
 
 
 
 
 
 
 
 
  Procedure
 
 
 
 
 
 
  Status
 
 
 
 
 
 
  Comment
 
 
 
 
 
 
  Acquire Downstream Channel
 
 
 
 
   
 
 
 
 
  Connectivity State
 
 
 
 
   
 
 
 
 
  Boot State
 
 
 
 
   
 
 
 
 
  Configuration File
 
 
 
 
   
 
 
 
 
  Security
 
 
 
 
   
 
 
 
 
  IP Provisioning Mode
 
 
 
 
   
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  Channel
 
 
 
 
  Lock Status
 
 
 
 
  Modulation
 
 
 
 
  Channel ID
 
 
 
 
  Frequency
 
 
 
 
  Power
 
 
 
 
  SNR
 
 
 
 
  Correctables
 
 
 
 
  Uncorrectables
 
 
 
  <!--
1Lockedunknown0809500000 Hz-61.6 dBmV 0.0 dB
 
2Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
 
3Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
 
4Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
 
5Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
 
6Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
 
7Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
 
8Not LockedUnknown00 Hz 0.0 dBmV 0.0 dB
  -->
 
  <!--
 
Downstream Channel 0
 
Lock StatusIn ProgressModulationUnknown
 
Channel ID0Symbol rate0 sym/sec
 
Downstream Frequency0 HzDownstream Power0 dBmV
 
SNR0 dBmV  
 
  -->
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  Channel
 
 
 
 
  Lock Status
 
 
 
 
  US Channel Type
 
 
 
 
  Channel ID
 
 
 
 
  Symbol Rate
 
 
 
 
  Frequency
 
 
 
 
  Power
 
 
 
  <!--
1Not LockedUnknown00 Ksym/sec0 Hz 0.0 dBmV
 
2Not LockedUnknown00 Ksym/sec0 Hz 0.0 dBmV
 
3Not LockedUnknown00 Ksym/sec0 Hz 0.0 dBmV
 
4Not LockedUnknown00 Ksym/sec0 Hz 0.0 dBmV
  -->
 
  <!--
 
Upstream Channel
 
Lock StatusNot LockedModulationQPSK
 
Channel ID2152232456Symbol rate0 Ksym/sec
 
Upstream Frequency-2142734840 HzUpstream Power0 dBmV
 
  -->
 
 
 
 
 
   
 
 
 
 
 
  Downstream OFDM Channels
 
 
 
 
 
 
 
 
  Channel
 
 
 
 
  Lock
Status
 
 
 
 
  Modulation /
Profile ID
 
 
 
 
  Channel
ID
 
 
 
 
  Frequency
 
 
 
 
  Power
 
 
 
 
  SNR /
MER
 
 
 
 
  Active Subcarrier
Number Range
 
 
 
 
  Unerrored
Codewords
 
 
 
 
  Correctable
Codewords
 
 
 
 
  Uncorrectable
Codewords
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
  Upstream OFDMA Channels
 
 
 
 
 
 
 
 
  Channel
 
 
 
 
  Lock Status
 
 
 
 
  Modulation / Profile ID
 
 
 
 
  Channel ID
 
 
 
 
  Frequency
 
 
 
 
  Power
 
 
 
 
 
 
 
 
 
   
 
 
 
 
 
 
  Extended Upstream Transmit Power
 
 
 
 
 
  Enable Extended Upstream Transmit Power
 
 
 
 
 
   
 
 
 
 
 
 
  Current System Time:
 
  --- --- -- --:--:-- ----
 
 
 
 
 
 
  System Up Time:
 
  00:00:00
 
 
 
   
 
 
 
 
 
 
 
 
 
  <iframe src="DocsisStatus_h.htm" class="help-iframe" scrolling="no" name="helpframe" frameborder="0">
  </iframe>
 
 
 
 
 
 
 
 
 
  Help Center
 
 
 
 
 
  Show/Hide Help Center
 
 
 
 
 
 
   

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.