.NETのスマート目覚まし時計

最近、私は「スマートホーム」のアイデアに興味を持ち始めました。 独自のアプリケーションから照明を制御することは非常に便利だと思います。 ライトのオン/オフの時間を設定したり、電化製品を制御するためのシナリオを記述したりできます。
Nooliteシステムに注意を向けました。 それは、電化製品の無線制御を可能にします。 そのシリーズには、さまざまな電源ユニット、さまざまな種類の制御パネルがあります。 Noolite製品の中には、Pc118アダプターがあります。

画像

USB経由でシリーズの電源ブロックを制御できます。 Nooliteは、デバイスに関する詳細でアクセス可能なドキュメントを提供します。 私たちの目標は、このアダプターを介して照明制御システムと対話できるアプリケーションを作成することでした。

何をしたかった


「スムーズオン」シナリオの実装を試みました-ライトの明るさを徐々に増加させます。これにより、たとえば、朝の快適な目覚めに貢献できます。 ブラウザーを介した照明制御の記事では、Webアプリケーションの動作について詳しく説明しています。 アプリケーションのソースコードは、 Google Codeで入手できます。

この記事では、USBアダプターとのやり取りを担当するシステムの部分について説明します。 つまり、コマンドを送信するデバイスの識別は、「スムーズスタート」シナリオを実装するサンプルコードも提供します。 ほとんどの場合、.NETで開発するため、コード例はC#になります。

.NETでUSBを使用する際の原則


今日、USBデバイスは非常に一般的です。 残念ながら、.NETには、すぐに使用できるUSBアクセス可能なコンポーネントはありません。 FileStreamクラスを使用してUSBを操作できます。 FileStreamの便利なラッパーを提供するサードパーティライブラリ(オープンソースを含む)があります。 HidLibraryライブラリーを使用しました 。 PC118アダプタはUSB経由で接続され、 HIDデバイスのように使用できます。 デバイスを識別してアクセスするには、ベンダーID(ベンダーID、VID)と製品ID(製品ID、PID)の2つの識別子を指定する必要があります。 これらの値は、デバイスのドキュメントに記載されています
HidLibraryライブラリのHidDevicesクラスには、静的なEnumerateメソッドがあります。 このメソッドは、PIDおよびVIDでリストをフィルタリングする機能を備えた、検出されたHIDデバイスのリストを返します。 目的のデバイスを選択し(フィルターされたリストから最初に取得しました)、OpenDeviceメソッドを呼び出してデバイスとの接続を確立します。

var device = HidDevices.Enumerate(VENDOR_ID, PRODUCT_ID).FirstOrDefault(); if (device != null) { device.OpenDevice(); } 

デバイスの準備が整いました。 これでコマンドを送信できます。

アダプターを使用する


デバイスのコマンドはバイトの配列です。

 var data = new byte[] { ... }; 

それらの値は、送信するコマンドのパラメーターに従って設定する必要があります:コマンドのタイプ(たとえば、オン/オフ/輝度レベルの設定)、チャンネル(PC118アダプターは、0から7までの数字で8チャンネルにコマンドを送信できます)、輝度レベルの値(コマンドが選択されている場合)輝度設定)。 これについては、ドキュメントで詳しく説明しています。

私たちのアプリケーションはいくつかのコマンドを使用します:
-ロードをオンにします(オン)
-負荷をオフにする(オフ)
-負荷状態の切り替え(Switch)
-輝度を設定します(SetLevel)。

デバイスにコマンドを送信するには、WriteFeatureDataメソッドを呼び出して、生成された配列をそれに渡す必要があります。

 device.WriteFeatureData(data); 

ドキュメントには、「使用するライブラリによって異なりますが、8バイトを送信する前に、値が0の最初のバイトを送信する必要がある場合があります」というメモがあります。
実験中に、これがまさに我々のケースであることが判明しました。 配列の先頭にコマンドを正しく送信するには、追加のゼロバイトを追加する必要があります(命令に記載されているように、アダプターに8配列ではなく9バイトの配列を送信します)。 どうやら、これはHidLibraryライブラリの機能です。
また、コマンドの送信の間に、200ミリ秒休止する必要がありました。そうでない場合、アダプターは最初のコマンドのみを実行します。 遅延時間は実験的に決定されました。

どうした


アダプターにコマンドを送信する方法を学習した後、IDisposableインターフェイスを実装するクラスにすべてがラップされ、コマンドの種類について列挙が説明されました。 コンパイルされたDLLをダウンロードし、それを使用して、独自の.NETアプリケーションからライトを制御できます。 たとえば、ライトをスムーズにオンにするコードは次のようになります。

 using (var adapter = new Pc118Adapter()) { if (adapter.OpenDevice()) { // 40 -   ,      for (var level = 40; level < 100; level++) { adapter.SendCommand( Pc118Command.SetLevel, //  2, //  level //   ); Thread.Sleep(60000); //    } } } 

また、デバイスにコマンドを送信できるコンソールユーティリティも作成しました。 このアプリケーションは、例として役に立つかもしれません。 さらに、デバイスのテストにも使用できます。

おわりに


結果を観察することに興味がありました。 この記事が誰かに役立つことを願っています。 家の照明やデバイスを制御するための新しい興味深いシナリオを作成するのに役立つかもしれません。

ご清聴ありがとうございました!

Source: https://habr.com/ru/post/J176141/


All Articles