2022/03/11

speedtestをsynology DS720で定期実行しGoogleスプレッドシートで集計する

 iij mio ひかり(フレッツ)のVDSL回線を使っているのですが、不安定となる時間帯が目立つようになったのでスピードテストを定期実行、集計してみました。

speedtestのコンソールプログラムLinux版をNASであるDS720上で定期実行、CSVファイルをGoogleDriveに保存しGoogle Apps Script(GAS)でshpreadsheetに読ませるまでです。

DS720の有効化

コントロールパネルの「端末&SNMP」よりSSHサービスを有効化します。不要になったら再度無効すると良いでしょう。

DS720とGoogleDriveの同期

Cloud Syndを使います。

ssh接続

ssh接続します。windowsの場合powershellを立ち上げて下記でログオンできます。標準powershellコマンドラインでも良いですが、私はWindowsTerminal(Microsoft製ターミナルアプリ)にPowserShell7.2をインストールした環境です。


ssh userid@nasname




speedtest-cliをダウンロード

適当にフォルダを作り、speedtestをwgetし、実行権限を付与します。


mkdir speedtest
cd speedtest
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
chmod +x speedtest-cli


ホームディレクトリ直下にフォルダを作ったので、WindowsからNASとして見ると下記のようになります。

speedtest-cliの実行とコピーシェル作成

speedtest-cliを実行して動作確認します。


今回はCSVモードで実行し、実行後google driveの同期フォルダにコピーを行いますので、適当にスクリプトを作成します。cronでの実行を行うのでフルパスです。各ディレクトリは環境に合わせてください。


/var/services/homes/USER_ID/speedtest-cli --csv >> /var/services/homes/USER_ID/speedtest.csv
cp /var/services/homes/USER_ID/speedtest.csv /var/services/homes/USER_ID/GoogleDrive/speedtest/


chmod +xで実行権限も設定しておきました。(必要でしたっけ??)

cron設定

DS720のDSM 7.0.1-42218 Update 3環境だと、タスクスケジューラーで毎時実行に設定しても日時実行になってしまいます。解決方法がわからなかったのでcrontabを直接編集しました。


sudo vi /etc/crontab

これで毎時5分にspeedtestが実行され、結果ファイルがGoogleDriveに保存されます。


Google Apps Scriptでの読み込み

CSVを適当に開いてspreadsheetに入れるだけです。Spreadsheetで新規作成し、AppsScriptを選択。

スクリプトを作成します。

function auto_csv() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getSheetByName('speedtest');
  var charset = "utf-8";
  var dir = DriveApp.getFoldersByName("speedtest");
  var file = DriveApp.getFilesByName("speedtest.csv").next();
  var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
  var ary = Utilities.parseCsv(csvData);

  sh.getRange(1, 1).setValue("datetime");
  sh.getRange(1, 2).setValue("date");
  sh.getRange(1, 3).setValue("time");
  sh.getRange(1, 4).setValue("ping");
  sh.getRange(1, 5).setValue("down(Mbps)");
  sh.getRange(1, 6).setValue("up(Mbps)");
  sh.getRange(1, 7).setValue("server");
  sh.getRange(1, 8).setValue("distance(10km)");

  for (var i = 0; i < csvData.length; i++) {
    var execdt = new Date(csvData[i][3]);
    var execds = Utilities.formatDate(execdt, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
    var rowdts = sh.getRange(i + 2, 1).getValue();
    if (rowdts != "" && Utilities.formatDate(rowdts, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss') == execds) continue;

    sh.getRange(i + 2, 1).setValue(execds);
    sh.getRange(i + 2, 2).setValue(Utilities.formatDate(execdt, 'Asia/Tokyo', 'yyyy-MM-dd'));
    sh.getRange(i + 2, 3).setValue(Utilities.formatDate(execdt, 'Asia/Tokyo', 'HH:mm:ss'));
    sh.getRange(i + 2, 4).setValue(parseFloat(csvData[i][5]).toFixed(2));
    sh.getRange(i + 2, 5).setValue((csvData[i][6] / 1024 / 1024).toFixed(2));
    sh.getRange(i + 2, 6).setValue((csvData[i][7] / 1024 / 1024).toFixed(2));
    sh.getRange(i + 2, 7).setValue(csvData[i][2]);
    sh.getRange(i + 2, 8).setValue(parseFloat(csvData[i][4] / 10).toFixed(2));
  }
}

実行で動作確認。

シートを追加してグラフを作成してもよいでしょう。


Google Apps Script定期実行

時計アイコンからトリガーを追加、1時間おきに実行を指定すると、毎時実行されます。

実行結果

混雑時間帯はspeedtestが国外のサーバに接続しているようです。経路混雑でそのような動きになっていると思いますので、やっぱ重いってことですね。

speedtestcliはサーバ指定も出来ますので、国内サーバに固定したほうが純粋な速度調査には向いていると思います。ただ、サーバ提供者に迷惑になるかもしれないので考えどころです。