温度管理
- 2020/06/10 08:46
- カテゴリー:ぱそこん
サーバーを見に行かなくて良くなったんで、もう一つやりたかった事をやろうかと。
約10年以上前なんですが、猛暑の夏を乗り切れなかったPCが1台、月曜日に出勤すると、ブルースクリーンが出ていて、色々調べているとメモリーが熱でやられていました。
次の年から、サーバー機に入れ替えたおかげで、その後の猛暑も乗り越えてきたんですが、朝出勤するとファンが全開でとっても五月蠅い。
さらに、部屋が排熱でとっても熱い・・・
今年は猛暑だと言う噂もあるし、サーバーが増えたことと、常時電源が入っている、PCもあるので何とかしなければ。
KURO-RSは持っているんですが、エアコンの赤外線リモコンは、情報量が多いため、未対応。
って事で、トラ技やCQなんかとタイアップしている、ビット・トレード・ワンの赤外線リモコンキットを購入してみました。(AD00020)
このキット、フリスクサイズの基盤なんで、老眼の私には半田付けが辛い・・・
何とか完成して、HPからソフトをダウンロードして、テスト、無事動作の確認が出来ました。
ハード面は何とかなりそうなので、ソフトにかかります。
まず、温度の取得です。
USB温度計を購入しようかとも思ったんですが、PC内部には色々と温度センサーがあるんで、使えるものを探してみます。
CPUやGPUは負荷状態でかなり変動するので使えない、マザーボードの温度かHDDの温度が良さそう。
室温を色々と変えて、関係性をモニタリングしてみると、HDD温度が室温+10℃ぐらいでで推移していて、これが使えそうです。
当然、正確に+10℃ではなくバイアスがかかっているんですが、筐体の中の温度と言うことで、これを使おうと思います。(うちのマザーボードの温度は、良くわからない動きをするので・・・)
って分けで、HDDのS.M.A.R.Tから温度情報を取得します。(C#)
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSStorageDriver_ATAPISmartData");
foreach (ManagementObject queryObj in searcher.Get())
{
byte[] arrVendorSpecific = (byte[])queryObj.GetPropertyValue("VendorSpecific");
int tempIndex = Array.IndexOf(arrVendorSpecific, (byte)194);
hddchk[0] = arrVendorSpecific[tempIndex + 5].ToString() ;
}
さて、この情報を元に赤外線リモコンでエアコンを入れれば・・・・
提供されているDLLって、32ビットなんだよ~、アプリは64ビット
リモコンアプリのソースも公開されているんで、USBデバイスを直接操作って手もあるんですが、何か方法を考えてみます。
BtoIrRemoconってプロンプトアプリがあるんですが、うちの環境では何故かうまく動作しないんで、作ってみました。
[C# x86]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32.SafeHandles;
using USB_IR_Library;
namespace IRCommand
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
int i_ret;
SafeFileHandle handle_usb_device = null; // USB DEVICEハンドル
string[] cmds = System.Environment.GetCommandLineArgs();
byte[] data = new byte[103];
byte[] code = new byte[100];
if (cmds.Length > 1)
{
for (int i = 0; cmds[1].Length / 2 > i; i++)
{
data[i] = Convert.ToByte(cmds[1].Substring(i * 2, 2), 16);
}
int mode = (int)data[0];
int ilen1 = (int)data[1];
int ilen2 = (int)data[2];
for (int i = 0; i < 100; i++)
{
code[i] = data[i + 3];
}
try
{
// USB DEVICEオープン
handle_usb_device = USBIR.openUSBIR(this.Handle);
if (handle_usb_device != null)
{
// USB DEVICEへ送信 パラメータ[USB DEVICEハンドル、フォーマットタイプ、送信赤外線コード、赤外線コードのビット長]
switch (mode)
{
case 1:
i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.AEHA, code, ilen1, ilen2);
break;
case 2:
i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.NEC, code, ilen1, ilen2);
break;
case 3:
i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.SONY, code, ilen1, ilen2);
break;
case 4:
i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.MITSUBISHI, code, ilen1, ilen2);
break;
}
}
}
catch
{
}
finally
{
if (handle_usb_device != null)
{
// USB DEVICEクローズ
i_ret = USBIR.closeUSBIR(handle_usb_device);
}
}
}
Application.Exit();
}
}
}
フォームには何も入れない空です。
フォームアプリにしたのは、この先何か追加するかもしてないからです。
これに、赤外線リモコンのアプリで取得したコードを引数で与えると、動作しました。
あとは、アプリからプロセス起動させれば、温度によって、エアコンを入れたり、消したり出来るようになりました。
あと一つ問題は、設置場所です。
ネット上では、赤外線の出力が弱いという噂がありましたが、近づけても動作しない時がありました。
通常砲弾型のLEDの場合、先端から直進する部分が一番出力が強く、角度が付くと、減衰していくんです。
このキットに含まれているLEDは、50% Power Angle が15degなんで、ほぼ直進するはずなんdすけど、離して変な角度のほうが認識率が高い(反射かな)
猛暑が来るまで色々と探ってみます。