//****************************************************************
//*****  東京電力ホームページから電力の使用状況データをダウンロードする
//****************************************************************

// 動作説明
// 本スクリプトは東京電力ホームページから「電力の使用状況」データをダウンロードするためのものである。
// 実行すると指定された時間まで待ち、タイムアップするとデータを自動的にダウンロードする。
// ダウンロードしたデータは、YYMMDD形式のファイル名でdataディレクトリに保存される。
// その後、PCを強制的にシャットダウンする。(休止状態とすることもできる。)

// 使用方法
// 1.start_hh(時)およびstart_nn(分)にダウンロード実行開始時間を設定する。
// 2.本スクリプトを実行する。
// 3.指定された時間にダウンロード実行され、そのデータは保存される。
// 4.その1分後にPCは強制的にシャットダウンされる。

// 注意事項
// ファイル名はYYMMDD形式であるが、ダウンロード開始を0時50分としているのでDDはデータの翌日付となる。
// パブリック変数 IE_VER に、スクリプトで起動されるIEのバージョン番号を正しくセットすること。

// 参考
// 「電力の使用状況」データは毎正時15〜30分後に更新される。
// 前日1日分のデータは、0時30分以降にダウンロードできる。
// ただし、1時15分〜30分以降には当日データが保存され、前日のデータは消去される。
// 1日分データのダウンロードは0時30分から1時15分までの間に行わなければならない。
// このことから本スクリプト作成した。

// 更新情報
// 2011/07/15	ブラウザ(IE)表示完了待ちルーチンを大幅に修正(IE表示更新、リトライなど)
// 2011/06/24	ブラウザ(IE)のバージョンが 9 になったときの不具合解消



//------------------------   メインルーチン   ------------------------

  // パブリック変数定義
  PUBLIC  start_hh = 0						// ダウンロード開始時刻(時)
  PUBLIC  start_nn = 50						// ダウンロード開始時刻(分)
  PUBLIC IE_VER = 9						// IEのバージョン番号(8 or 9)

  // ----------------------------------------------------------
  // タイムカウントを0秒近くに同期(おまけ機能)
  // ----------------------------------------------------------
  flg = 0
  while flg = 0
    gettime()							// システム時間を取得
    fukidasi("タイムカウント同期完了まであと" + (60 - G_TIME_SS) + "秒です", 0, 0, 0, 8, , $000000, $ccffff, 64)
    if  (G_TIME_SS = 0)  then  flg = 1  else  sleep(0.1)
  wend
  fukidasi()

  // ----------------------------------------------------------
  // ダウンロード実行開始時間まで待つ
  // ----------------------------------------------------------
  x_time()							// 実行開始までの時間を表示
  flg = 0
  while flg = 0
    gettime()							// システム時間を取得
    x_time()
    if  (G_TIME_HH = start_hh) AND (G_TIME_NN = start_nn)  then  flg = 1  else  sleep(10)
  wend
  fukidasi("電力の使用状況データをダウンロードしています", 0, 0, 0, 8, , $000000, $ccffff, 64)

  // ----------------------------------------------------------
  // ダウンロードURLをIEで開く
  // ----------------------------------------------------------
  IE = CreateOLEObj("InternetExplorer.Application")
  IE.Visible = true
  IE.Navigate("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv")
  BusyWait(IE)


  ifb IE_VER = 8	// ------------------------------------- IEのバージョンが8のとき
    // ----------------------------------------------------------
    // 「ファイルのダウンロード」ウィンドウ取得
    // ----------------------------------------------------------
    while getid("ファイルのダウンロード","#32770")  < 0
      sleep(0.2)
    wend
    id = getid("ファイルのダウンロード","#32770")			// ID取得
    acw(id)
    mouseorg(id)
    sleep(0.5)							// 表示完了まで0.5秒待つ
    clkitem(id,"保存",CLK_BTN)					// 「保存」ボタンをクリック

    // ----------------------------------------------------------
    // 「名前を付けて保存」ウィンドウ取得
    // ----------------------------------------------------------
    while getid("名前を付けて保存","#32770")  < 0
      sleep(0.2)
    wend
    id = getid("名前を付けて保存","#32770")				// ID取得
    acw(id)
    mouseorg(id)
    sleep(0.5)							// 表示完了まで0.5秒待つ

    // ファイル名テキストボックスを選択
    kbd(VK_ALT,DOWN,50)
    kbd(VK_N,CLICK,50)						// ALTキーを押しながらNキークリック
    kbd(VK_ALT,UP,50)

    // 保存ファイル名を書き込み保存する
    gettime()							// システム時間を取得
    str = "D:\AWK_work\計画停電関係\電力使用状況データ\data\" + G_TIME_YY2 + G_TIME_MM2 + G_TIME_DD2 + ".csv"
    kbd(VK_DELETE,CLICK,50)						// テキストボックスをクリア
    sendstr(id, str)						// ファイル名(フルパス)の書き込み
    clkitem(id,"保存",CLK_BTN)					// 「保存」ボタンをクリック

    // ----------------------------------------------------------
    // 上書き保存の確認
    // ----------------------------------------------------------
    sleep(0.5)							// 上書保存確認ウィンドウが開くまで0.5秒待つ
    id=getid("名前を付けて保存の確認","#32770")			// ID取得
    ifb id >= 0							// 上書保存確認ウィンドウが開いたら以下を実行
      acw(id)
      mouseorg(id)
      sleep(0.5)							// 表示完了まで0.5秒待つ
      clkitem(id,"はい",CLK_BTN)					// 「はい」ボタンをクリック
    endif


  elseif IE_VER = 9	// ------------------------------------- IEのバージョンが9のとき
    // ----------------------------------------------------------
    // ホームページウィンドウIDを取得する
    // ----------------------------------------------------------
    id=getid("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv - Windows Internet Explorer","IEFrame")
    acw(id)
    mouseorg(id)
    sleep(0.5)

    // ----------------------------------------------------------
    // データをファイル保存する
    // ----------------------------------------------------------
      // データページを全て選択しコピーする
      kbd(VK_CTRL, DOWN, 40)
      kbd(VK_A, CLICK, 300)						// 全て選択
      kbd(VK_C, CLICK, 300)						// クリップボードにコピー
      kbd(VK_CTRL, UP, 300)
      sleep(0.3)

      // コピーしたデータをファイル保存する
      str = getstr(0)						// コピーした文字列の取得
      // ファイルを開く
      fid = fopen("D:\AWK_work\計画停電関係\電力使用状況データ\data\" + G_TIME_YY2 + G_TIME_MM2 + G_TIME_DD2 + ".csv", F_WRITE)
      fput(fid, str)						// データ書き込み
      fclose(fid)							// ファイルを閉じる
  else
    msgbox("IEのバージョンは、8 か 9 です。バージョン番号を IE_VER に正しく設定してください。")
  endif


  // ----------------------------------------------------------
  // IEを閉じる
  // ----------------------------------------------------------
  sleep(0.5)
  kbd(VK_ALT, DOWN, 50)
  kbd(VK_F4, CLICK, 50)						// ALT-F4(アクティブウィンドウを閉じる)
  kbd(VK_ALT, UP, 50)


  fukidasi()

  // ----------------------------------------------------------
  // 電源遮断
  // ----------------------------------------------------------
  fukidasi("間もなくこのパソコンをシャットダウンします", 0, 0, 0, 8, , $000000, $ccffff, 64)
  sleep(60)							// シャットダウンまで1分待つ
  fukidasi()
//  poff(P_SUSPEND)						// 休止状態へ移行
  poff(P_SHUTDOWN or P_FORCE)					// 強制シャットダウン実行

//------------------------   メインルーチン終了   ------------------------




// ----------------------------------------------------------
// 関数・サブルーチン
// ----------------------------------------------------------

// 残り時間表示サブルーチン
procedure x_time()
  gettime()
  x_hh = start_hh - G_TIME_HH
  x_nn = start_nn - G_TIME_NN
  ifb  x_nn < 0
    x_nn = x_nn + 60
    x_hh = x_hh - 1
  endif
  if  x_hh < 0  then  x_hh = x_hh + 24

  ifb x_hh = 0
    fukidasi("現在" + G_TIME_HH + "時" + G_TIME_NN + "分:  " + x_nn + "分後に電力使用状況データをダウンロードします", 0, 0, 0, 8, , $000000, $ccffff, 64)
  else
    fukidasi("現在" + G_TIME_HH + "時" + G_TIME_NN + "分:  " + x_hh + "時間" + x_nn + "分後に電力使用状況データをダウンロードします", 0, 0, 0, 8, , $000000, $ccffff, 64)
  endif
fend


// IE表示ビジー待ち
Procedure BusyWait(ie)
  Const TIME_OUT = 120						// タイムアウト時間
  Const T_NUM = 3							// 再チャレンジ回数

  tm = Gettime()							// 現在システム時間取得
  tout_num = 0							// 再チャレンジ回数初期化

  repeat								// ビジー待ちループ開始
    sleep(0.2)
    // タイムアウトのチェック
    ifb Gettime() - tm > TIME_OUT
      fukidasi("ビジー待ちタイムアウト (" + tout_num + "回)")
      kbd(VK_F5, CLICK, 50)						// F5キー(最新の情報に更新)
      sleep(0.5)
      tout_num = tout_num + 1					// タイムアウト再チャレンジ回数+1
      // タイムアウト再チャレンジ回数チェック
      ifb tout_num > T_NUM
        msgbox("ビジー待ちタイムアウトが" + T_NUM + "回繰り返されました。<#CR>再度ビジー解除を待ちます。(強制終了は ALT-F2)")
        tm = Gettime()						// 現在システム時間取得
        tout_num = 0						// 再チャレンジ回数初期化
      endif
    endif
  until (! ie.busy) and (ie.readyState=4)				// ビジー待ちループ終了

  // 吹き出し表示OFF
  fukidasi()
  sleep(0.5)
Fend