温度の測定:TEMPer + Python + Windows

みなさんこんにちは。



サーバールームの温度を監視するというポストを書くのは簡単な作業のように思えました。 このテーマにはかなりの数の異なるソリューションがあります(たとえば、ビデオカメラと温度計をその前にぶら下げます)が、それらのほとんどはクールな監視システム、エアコンの自動制御などです。 まともなお金の価値がある。 提案されたオプションの違いは予算です。 約250ロシアルーブルと小さな脳(価格なし)。



この問題の解決策は、当然、温度センサーの探索から始まりました。 安い。高価なものがたくさんあるので、経営陣に説明するのに長い時間がかかる。 また、お金を節約するために、USBセンサーのオプションが選択されました(LAN-より高価)。 最も安いセンサーはどこですか? 右、ebayで。 私たちはそこに行き、「USB温度計」のリクエストで、写真のようにすぐにそのようなおもちゃを見つけます。 注文、手配、配達待ち。



これは財政的な無駄を終わらせ、脳の働きを始めます。

センサーには、 TEMPer 24.4.4の CDが付属しています。 印象的なバージョン番号にもかかわらず、プログラマのこの奇跡を涙なしで見ることは不可能です。 はい、温度グラフ、電子メール、msnおよびskypeによるメッセージ送信、テキストファイルへのログ、アラームの臨界温度の設定などの機能があります。 そして、それはすべて機能します。 最も重要なことは、サービスモードまたはコマンドラインで起動することだけではありません。 これは、適切な自動化機能がないことを意味します(ログの解析はカウントされません)。



そのため、開発者が提案したプログラムはすべての点に適合しているわけではありません。 どの選択肢ですか? 温度を取得するための独自のソフトウェア。 基本バージョンでは、センサーから温度を出力するプログラムが必要でした。 データベースへの入力、アラームに関する通知の送信、状況の分析など、それ以降のすべての処理。 毎分センサーをポーリングするスケジューラーに簡単にハングアップします。



Web検索は、 temper-pythonというpythonのモジュールに簡単に出力します。 いいね! クロスプラットフォームのインタープリターを備えたすでに通常のソフトウェア。 そこにイチジク。 このモジュールはLinuxでのみ機能します。 また、タイトルで別のOSが除外されたのも当然です。 アプリケーションサーバーはWindows上で実行されます。 しかし、これはpythonです! つまり、Windowsで動作するようにスクリプトを確実にやり直すことができます。 これが私たちがやることです。



まず、コンピューター(サーバー)のUSBポートにセンサー自体を挿入します。 実験にはこれで十分ですが、実際には、外部延長スタンドでセンサーを補完する方がはるかに優れています。 中国のセンサーと一緒に注文したり、あらゆる店舗で購入したり、さまざまな送信機やフラッシュドライブのトロフィーのようなサーバールームで見つけたりできます。 Windowsはセンサーに標準ドライバーを自動的にインストールし、「複合USBデバイス」として識別します。

どのpythonを使用するかは気にしなかったので、利用可能な最新バージョン-3.4.1を使用しました 。 実際、これが誰かにとって重要な場合、下位バージョン用のスクリプトを作り直すことはまったく問題ではありません-角かっこや引用符を削除するために、あちこちで。 ダウンロード、 インストール、お楽しみくださいwww.python.org



Pythonにすぐに、ライブラリをUSBで動作するように配置する必要があります。 問題もありません。 pyusbと呼ばれますsourceforge.netのプロジェクトページから取得します。 アーカイブにsetup.pyファイルがあります。 コマンドラインから実行します。



cd C:\Downloads\pyusb-1.0.0a2





C:\Python34\python.exe setup.py install







Pyusbは、usbシステムアクセスライブラリ-libusb 0.1libusb 1.0libusbxlibusb-win32 、およびOpenUSBで動作します。 Windowsユーザーの場合、 libusb-win32オプションを使用できますが、これもインストールして構成する必要があります。 sourceforge.netのプロジェクトページからアーカイブをダウンロードします。 そして、 win32が名前をわずらわせないようにしてください-x64でドライバーは正常に動作します。



解凍して、 binフォルダーに移動し、 inf-wizard.exeファイルを実行します 。 このプログラムは、特定のデバイス用のドライバーフォルダーを自動的に生成し、インストールします。



ドライバーをインストールするデバイスのリストで、 TEMPerV1.4(インターフェース1)を選択します。 [ 次へ]をクリックして、同意できるすべての内容に同意し、ドライバーの保存ウィンドウに移動します。 ここでは、ユーティリティが必要なすべてのドライバーを配置するtemper用に別のフォルダーを作成することをお勧めします。 その後、作成されたドライバーのインストールが提供されます。 これは、 [今すぐインストール ]ボタンで行います...



すべてがうまくいった場合、デバイスマネージャーの「 複合USBデバイス 」が消え、 TEMPerV1.4(インターフェイス1)が表示されます。



libusb-win32ディストリビューションのbin / amd64フォルダーには、 testlibusb-win.exeユーティリティがあります 。 実行して、必要なデバイスがシステムから見えることを確認します。 すべてが正常で、デバイスが表示されている場合、最も興味深いのはpythonスクリプトです。



すでに上で書いたように、私はtemper-pythonモジュールを基礎として取りました。 インストールする必要があるこのだまされたモジュールには、修正のための構成、摂氏または華氏の選択、さらにはSNMPサポートがあります。 それはすべてクールですが、私はする必要はありません。 そのため、コンソールに温度を表示する1つのスクリプトにすべてを単純化します。 さらに、 temper-pythonには、Linuxでのみ必要な行がたくさんありますが、Windowsでは単純に機能しません。



グローバル変数を設定することから始めましょう:

 import sys, usb VENDOR_ID = 0x0c45 PRODUCT_ID = 0x7401 TIMEOUT = 5000 OFFSET = 0 INTERFACE = 1 REQ_INT_LEN = 8 ENDPOINT = 0x82 COMMANDS = { 'temp': b'\x01\x80\x33\x01\x00\x00\x00\x00', 'ini1': b'\x01\x82\x77\x01\x00\x00\x00\x00', 'ini2': b'\x01\x86\xff\x01\x00\x00\x00\x00', }
      
      





VENDOR_IDおよびPRODUCT_IDにより、スクリプトはすべてのデバイスからTemperを見つけて使用します。 一般に、タイムアウトとオフセットは説明なしで理解できます-センサーへのアクセスのタイムアウトと温度補正。 安価な中国のセンサーは数度以内に間違いを犯す可能性があるため、修正が必要ですが、室内温度計を使用して一度それを判断し、それを忘れるだけで十分です。



残りの変数はセンサーのAPIを参照するため、変更する必要はありません。



今最も重要なことは、センサーにアクセスするためのクラスです。



 class TemperDevice(object): def __init__(self, device): self._device = device def get_temperature(self): if self._device is None: return "Device not ready" else: try: self._device.set_configuration() ret = self._device.ctrl_transfer(bmRequestType=0x21, bRequest=0x09, wValue=0x0201, wIndex=0x00, data_or_wLength=b'\x01\x01', timeout=TIMEOUT) self._control_transfer(COMMANDS['temp']) self._interrupt_read() self._control_transfer(COMMANDS['ini1']) self._interrupt_read() self._control_transfer(COMMANDS['ini2']) self._interrupt_read() self._interrupt_read() self._control_transfer(COMMANDS['temp']) data = self._interrupt_read() self._device.reset() temp = (data[3] & 0xFF) + (data[2] << 8) temp_c = temp * (125.0 / 32000.0) temp_c = temp_c + OFFSET return temp_c except usb.USBError as err: if "not permitted" in str(err): return "Permission problem accessing USB." else: return err except: return "Unexpected error:", sys.exc_info()[0] raise def _control_transfer(self, data): ret = self._device.ctrl_transfer(bmRequestType=0x21, bRequest=0x09, wValue=0x0200, wIndex=0x01, data_or_wLength=data, timeout=TIMEOUT) def _interrupt_read(self): data = self._device.read(ENDPOINT, REQ_INT_LEN, interface=INTERFACE, timeout=TIMEOUT) return data
      
      





_control_transferは、センサーにコマンドを送信し、 _interrupt_read-応答を読み取ります。 実際、 get_temperatureでは、これらすべてのコマンドを送信し、回答を読み、数値のセットを人間が読める温度に変換します。



起動時にこれを機能させるには、数行を初期化する必要があります。

 dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID) TDev = TemperDevice(dev) output = TDev.get_temperature() print(output)
      
      





1行目はデバイス間でTEMPerを検索し、2行目と3行目は要求温度です。



実際、それがすべてです。 コンソールで標準コマンドを使用して、スクリプトの動作を確認できます。



C:\Python34\python.exe temper.py







センサーからの温度が表示されます。 それをどうするか-誰もが自分で決めることができます。



All Articles