リスト7-1 メイン画面(Index.htm) 現在の測定値と警報の設定

 

現在の測定値と警報の設定
 

測定項目

現在値

温度

 

湿度

 

気圧

  hPa

風速

  m/s

雨量

  mm

警報メール設定

上限値

下限値

   
   
  hPa   hPa
  m/s  
  mm  
 
 警報送信先

    

--- リスト7-2 初期化を行う自動実行スクリプト(Autoscript.wcr) //--------------------------------------------------------- // [ Autoscript.wcr ] 自動実行スクリプト //--------------------------------------------------------- var Port = 2; // COM2 var TFile = "observe.txt"; // 観測データファイル名 Function main() { ////////////////////////////////////////////////// // シリアル設定初期化 siosigctrl( Port, "DTR", 1 ); // DTR-ON sioctrl( Port, 19200 ); // 19200bps その他 parity 等は設定しておく事 siotxclr( Port ); // 送信バッファ・クリア siorxclr( Port ); // 受信バッファ・クリア filecopy( "C:\\www\\%TFile%", "B:\\%TFile%" ); // 観測データの初期値ファイルをコピー ////////////////////////////////////////////////////// // ユーザー格納領域初期化 setwscparam( 1, "user5", "Temp_H=,Temp_L=" ); // Temp setwscparam( 1, "user6", "Hum_H=,Hum_L=" ); // Hum setwscparam( 1, "user7", "Baro_H=,Baro_L=" ); // Baro setwscparam( 1, "user8", "Speed_H=,Rain_H=" ); // Speed + Rain setwscparam( 1, "user9", "ToAddress=" ); // ToAddress setwscparam( 1, "user10","" ); // Mail Flag // データ取得と警報監視スクリプトを2秒後に発行 event( "TIMER", "C:\\www\\GetData.wcr", 0, 2000, 0, 1, 100*1000, 3 ); } --- リスト7-3  Vantage Pro2 からデータを受信するGetData.wcr //--------------------------------------------------------- // [ GetData.wcr ] Vantage Pro2 からデータの受信 //--------------------------------------------------------- var Port = 2; // COM2 var TFile = "B:\\observe.txt"; var From = "test@test.local"; var To = "alarm@test.local"; var Subject = "Alarm"; var Body = ""; //--------------------------------------------------------- Function main() { var Buff[], Alarm[]; var fd, len, Packet = 99; var Temp1, Temp2, tmp; var Cur = "", Msg = ""; if ( WakeUp() == 0 ) { puts( "\n通信できません。" ); } else { sioputs( Port, "LOOP 1\x0a" ); if ( siogetb( Port ) == 0x06 ) { // ACK? GetAlarmInfo( &Alarm ); len = siogetd( Port, &Buff[], Packet, 500 ); // 500ms以内に99byte受信 if ( len == Packet ) { // 全 Byte? fd = filecreat( TFile ); if ( fd >= 0 ) { Temp1 = ( Buff[13] * 256 + Buff[12] ); // 外部 温度 (oF) * 10 if ( Temp1 == 32767 ) Temp2 = "-"; else { tmp = ( Temp1 - 320 ) / 18.0; // (oF)→(oC) 変換 Temp2 = AjstNumStr( tmp, 1 ); // 少数1桁で丸める if ( Alarm["Temp_H"] != "" ) { if ( int(Temp2) > Alarm["Temp_H"] ) Msg = "温度:上限値 %Alarm[\"Temp_H\"]% ℃\n"; } else if ( Alarm["Temp_L"] != "" ) { if ( int(Temp2) < Alarm["Temp_L"] ) Msg = "温度:下限値 %Alarm[\"Temp_L\"]% ℃\n"; } } Cur = "温度:%Temp2% ℃\n"; filewrite( fd, "Temp=%Temp2%" ); Temp2 = Buff[33]; // 外部 湿度 (%) if ( Temp2 == 255 ) Temp2 = "-"; else { if ( Alarm["Hum_H"] != "" ) { if ( int(Temp2) > Alarm["Hum_H"] ) Msg = Msg + "湿度:上限値 %Alarm[\"Hum_H\"]% %\n"; } else if ( Alarm["Hum_L"] != "" ) { if ( int(Temp2) < Alarm["Hum_L"] ) Msg = Msg + "湿度:下限値 %Alarm[\"Hum_L\"]% %\n"; } } Cur = Cur + "湿度:%Temp2% %\n"; filewrite( fd, ",Hum=%Temp2%" ); Temp1 = ( Buff[8] * 256 + Buff[7] ); // 気圧 (inHg) if ( Temp1 == 32767 ) Temp2 = "-"; else { tmp = ( Temp1 * 2540 ) / 75006.4; // (inHg)→(hPa) 変換 Temp2 = AjstNumStr( tmp, 1 ); // 少数1桁で丸める if ( Alarm["Baro_H"] != "" ) { if ( int(Temp2) > Alarm["Baro_H"] ) Msg = Msg + "気圧:上限値 %Alarm[\"Baro_H\"]% hPa\n"; } else if ( Alarm["Baro_L"] != "" ) { if ( int(Temp2) < Alarm["Baro_L"] ) Msg = Msg + "気圧:下限値 %Alarm[\"Baro_L\"]% hPa\n"; } } Cur = Cur + "気圧:%Temp2% hPa\n"; filewrite( fd, ",Baro=%Temp2%" ); Temp1 = Buff[14]; // 風速 (MPH) if ( Temp1 == 255 ) Temp2 = "-"; else { tmp = ( Temp1 * 1609 ) / 3600.0; // (MPH)→(m/s) 変換 Temp2 = AjstNumStr( tmp, 1 ); // 少数1桁で丸める if ( Alarm["Speed_H"] != "" ) if ( int(Temp2) > Alarm["Speed_H"] ) Msg = Msg + "風速:上限値 %Alarm[\"Speed_H\"]% m/s\n"; } Cur = Cur + "風速:%Temp2% m/s\n"; filewrite( fd, ",Speed=%Temp2%" ); Temp1 = Buff[50]; // 雨量 (inch) * 100 if ( Temp1 == 255 ) Temp2 = "-"; else { tmp = Temp1 * 25.4 / 100.0; // (inch)→(mm) 変換 Temp2 = AjstNumStr( tmp, 1 ); // 少数1桁で丸める if ( Alarm["Rain_H"] != "" ) if ( int(Temp2) > Alarm["Rain_H"] ) Msg = Msg + "雨量:上限値 %Alarm[\"Rain_H\"]% mm\n"; } Cur = Cur + "雨量:%Temp2% mm\n"; filewrite( fd, ",Rain=%Temp2%" ); filewrite( fd, ",[END]=1" ); // 最後を示す fileclose( fd ); } else { puts( " LOOP ファイルが生成できません -- " ); } } else { puts( "LOOP応答受信できず -- rtn:%len% -- " ); } } } // 次のイベントを3秒後にセット event( "TIMER", "C:\\www\\GetData.wcr", 0, 3000, 0, 1, 100*1000, 3 ); if ( Msg != "" ) { // 警報を出す場合 if ( getwscparam( 1, "user10" ) == "" ) { // メールを一度も出していない? Body = "--警報発生--\n[現在値]\n%Cur%\n[警報]\n%Msg%"; To = Alarm["ToAddress"]; // 宛先 if ( To != "" ) { sendmail( From, To, Subject, Body ); setwscparam( 1, "user10", "1" ); // メール送信フラグ ON } } } puts( "\nLOOP終了" ); } ///////////////////////////////////////////////////////////// // Vantage Pro2 : LFを送信して応答を見る ///////////////////////////////////////////////////////////// Function WakeUp() { var i; var Buff[]; var Flag; siorxclr( Port ); // 受信バッファをクリア for ( i=2; i>=0; i-- ) { sioputb( Port, 0x0A ); // LF送信 Flag = siogetb( Port, 1000 ); if ( Flag == 0x0A ) { // LF ? Flag = siogetb( Port, 100 ); if ( Flag == 0x0D ) { // CR ? Flag = 1; break; } } Flag = 0; siorxclr( Port ); // 受信バッファをクリア } return Flag; } ////////////////////////////////////////////////// // 警報の上限値/下限値取得 ////////////////////////////////////////////////// Function GetAlarmInfo( &dst ) { var src, pos, base=0, tmp, num; src = getwscparam( 1, "user5" ) + "," ; // Temp src = src + getwscparam( 1, "user6" ) + "," ; // Hum src = src + getwscparam( 1, "user7" ) + "," ; // Baro src = src + getwscparam( 1, "user8" ) + "," ; // Speed + Rain sethashcount( &dst, 0 ); // ハッシュ・クリア pos = instr( src, "," ); while( (pos = instr( src, ",", base )) >= 0 ) { if ( pos == base ) tmp = ""; else tmp = mid( src, base, pos-base ); base = pos+1; pos = instr( tmp, "=" ); if ( pos > 0 ) { num = mid( tmp, pos+1 ); if ( num == "" ) dst[ left( tmp, pos ) ] = ""; else dst[ left( tmp, pos ) ] = int( num ); } else if ( tmp != "" ) dst[ tmp ] = ""; } src = getwscparam( 1, "user9" ); // ToAddress if ( left( src, 10 ) == "ToAddress=" ) dst["ToAddress"] = mid( src, 10 ); } //-------------------------------------------------------------------------- // 題名:float値を指定桁数の文字列へ変換する // 概要:入力されたfloat値を指定桁数の文字列へ四捨五入して変換する //-------------------------------------------------------------------------- Function AjstNumStr( &num, effect ) { var floatNum = 0.0 ; var floatStr ; var floatHash[] ; var tmpStr ; var tmpFl ; var rtnStr ; // 返す文字列 var i ; var pt, rtn ; // 引数がfloat値かどうかチェックする。 if ( istype( num ) == 1 ) return num; // 文字列の場合はそのまま返す floatNum = int(num) ; // 引数が数値でも文字列でも扱えるようにする // 引数の桁数のチェック if(effect < 1 || effect > 5) { return(-1) ; } // 数値を文字列へ変換する floatStr = "%floatNum%" ; // 小数点の位置を見つける pt = strchr(floatStr, asc(".")) ; // もし、引数の小数点以下の桁数より、num引数の小数点桁数のほうが // 小さいか同じの場合、四捨五入をする必要はない。 // (例)num=12.345 で、effect=3やeffect=4の場合 if((len(floatStr)-pt-1) <= effect) { return(floatStr) ; } if(floatNum >= 0.0) { // 正の値 --------------------------------------------------- // (例)12.3456 を小数点2桁で四捨五入 // "12.3456" を数値の12.34 に加工し、12.34+0.01 を計算する // 四捨五入する必要があるか? var spt = pt+effect+1 ; // sptは四捨五入する数値の位置 var x = int(left(floatStr, spt+1)) ; // 12.34 if(int(mid(floatStr, spt, 1)) > 4) // 4より大ならば四捨五入 { // 四捨五入を行う var y = 0.0 ; for(i=0; i 4) // 4より大ならば四捨五入 { // 四捨五入を行う var y = 0.0 ; for(i=0; i