MajorDoMoでのスマートホームオブジェクトのプログラミングの基礎

画像

MajorDoMoシステムはさまざまなコンポーネントを組み合わせており、その多くのアクションにはデータの読み取りまたは変更が含まれます。 システムの部分間の効果的なデータ交換を整理するために、オブジェクトモデルが作成されました。 このモデルは、オブジェクト指向プログラミング(OOP)のパラダイムとほぼ一致しており、このパラダイムに精通している人は、既存のモデルを理解することは難しくありません。 ただし、OOP原則の知識はまったく必要ありません。 システムに組み込まれたモデルは非常に単純化されており、プログラミング言語の深い知識がなくても、またはこの概念を学ぶための最初のステップとして適用できます。 この記事では、このモデルの主要コンポーネントについて説明します。

パート1.理論。


クラス

クラスは、このクラスに属するすべてのオブジェクトが持つべき基本的なプロパティの説明です。 クラスはオブジェクトではないため、クラス自体にこれらのプロパティの値を含めることはできず、オブジェクトの兆候と動作のみを記述します。 物理的な類推は、単純な分類の例で表すことができます。たとえば、「Door to bathroom」オブジェクトは「Doors」クラスに属し、「Doors」は「Status」プロパティの説明(ドアは開閉)を持ちますが、その即時値は特定のオブジェクトにのみ設定し、クラスには設定しないでください。

クラスの重要な機能は、「親」クラスのすべてのプロパティとメソッドを継承し、同時に独自のプロパティとメソッドを持つことができるサブクラスを作成する機能です。 または、「親」メソッドの独自の特別な実装を持つ。

例:
画像

オブジェクト

オブジェクトは、実際の(または仮想の)オブジェクトの状態です。 オブジェクトのプロパティには、特定の値(「ステータス」、「温度」など)を設定できます。 さらに、オブジェクトが属するクラスのプロパティのセットを補完するプロパティをオブジェクト自体に設定できます。 また、オブジェクトには、クラスで記述されたメソッドの独自の実装を与えることができます。

例:
画像

サブクラスであるクラスに属するオブジェクトは、すべての親クラスのプロパティとメソッドを継承します。

プロパティ

プロパティは、オブジェクトの状態を記述する特定のパラメーターです。 前述のように、クラスはプロパティ(名前、説明など)のみを記述できますが、プロパティの値は特定のオブジェクトに対してのみ設定できます。

例(オブジェクトクラスのプロパティの説明):
画像

例(オブジェクトプロパティの設定/読み取り):
setGlobal('myObject.myProperty',12345); $value=getGlobal('myObject.myProperty'); 


方法

メソッドは、オブジェクトの可能なアクション(またはオブジェクトに対するアクション)の説明です。 物理的なアナロジーに戻ると、クラス「Doors」がメソッド「Open」および「Close」を持つことができることを示すことができます。 クラスのすべてのオブジェクトにもこのメソッドがあり、「Door to the bathroom。Open」メソッドを呼び出すことでドアを開くことができます。 メソッドの実装自体は、PHPプログラミング言語のスクリプトです。 この場合、スクリプトの一部がStatusプロパティをOpen状態に設定している可能性があります。

例(オブジェクトメソッド):
画像

例(メソッドコード):
 if ($this->getProperty('status')) { say("  "); } 


例(メソッド呼び出し):
 callMethod('myObject.myMethod',$params); // $params     


パート2.練習。


記事の第2部では、MajorDoMoオブジェクトシステムに実際の機器を「埋め込む」例を示します。 機器の例として、すでにHabréで繰り返し提示されているnooLiteシステムのコンポーネントを使用します。したがって、一般に、多くの人がこれらのコンポーネントの機能について知っています。 以下で説明するすべてのアクションは、ソースコードまたはシステム構成ファイルを変更せずに、[オブジェクト]セクションのMajorDoMoコントロールパネルで実行されます。

したがって、例として、次を使用します。



アイテムプラン:
  1. タスクの抽象クラスを作成します。
  2. サポートされている機器に対してより具体的なクラスを作成します。
  3. オブジェクトを追加する
  4. 私たちは管理しています!


ポイント1

スマートハウスでは、いくつかの機器をオン/オフするタスクが頻繁にあるという事実から進めます。したがって、非常に高いレベルで、ステータスプロパティ(1/0-オン/オフ)とともにRelaysクラスを作成します。メソッドturnOff、turnOn、switchおよびrefresh。

TurnOffメソッドコード(デバイスのシャットダウン):
 $this->setProperty("status",0); 


TurnOnメソッドコード(デバイスの電源を入れる):
 $this->setProperty("status",1); 


切り替え方法のコード(デバイスの切り替え):
 $status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOff'); } else { $this->callMethod('turnOn'); } 

更新メソッドのコード(デバイスステータスの更新):
 $status=$this->getProperty("status"); if ($status) { $this->callMethod('turnOn'); } else { $this->callMethod('turnOff'); } 


これは、すべての管理対象オブジェクトに固有の必要最小限であると想定しています。

ポイント2

次に、nooLite子クラスを作成して、必要なnooLite機器のサポートを追加します。 親と異なるために、それはチャネル(実行モジュール制御チャネル)の特定のプロパティになります。 さらに、新しいsendCommandメソッド(コマンドの送信)が追加され、turnOffメソッドとturnOnメソッドのコードが再定義されます。

新しいsendCommandメソッドのコード(コマンドをNooliteデバイスに送信):
 $cmdline='"c:\Program Files\nooLite\nooLiteCMD.exe" -api '.$params['command']; safe_exec($cmdline); 


オーバーライドされたturnOffメソッドのコード:
 $this->setProperty("status",0); $this->callMethod("sendCommand",array('command'=>'-off_ch'.$this->getProperty("channel"))); 


オーバーライドされたメソッドturnOnのコード:
 $this->setProperty("status",1); $this->callMethod("sendCommand",array('command'=>'-on_ch'.$this->getProperty("channel"))); 


他のメソッドには触れません-それらは変更されないままで、新しいクラスで期待どおりに動作します(OOPに感謝!)。

実際には、それぞれの動作をプログラミングする追加コストなしで、必要な数の特定のクラスのオブジェクトを追加できます。

ポイント3

オブジェクトの説明で「リビングルームの天井を照らす」ことを示すオブジェクトnoo1を追加し、そのプロパティの設定に移動して、プロパティnoo1.channel = 1の値を示します。 この電源モジュールは最初の制御チャネルにあります。

ポイント4

次のコードを使用して、任意のスクリプトからこのモジュールを有効/無効にできます
 callMethod('noo1.turnOn'); //  callMethod('noo1.turnOff'); //  


または、次の形式のメニューからこのモジュールのコントロールを登録します。
画像

結果として次のコントロールを取得した:
画像

ポイント2から4を経て、別のデバイス(調光サポート付きのnooLiteパワーユニット)を追加することで、学んだことを修正します。

アイテム2

上記で作成したnooLiteクラスから、nooLiteDimmerという子クラスを作成し、追加のプロパティbrightnessを追加します。 また、新しいdimメソッドを追加し、refresh、turnOn、turnOffメソッドのコードを書き換えます

新しいdimメソッドのコード:
 if ($params['value']) { $this->setProperty("brightness",$params['value']); $this->callMethod("refresh"); } 


オーバーライドされた更新メソッドのコード:
 $value=$this->getProperty("brightness"); $this->callMethod("sendCommand",array('command'=>'-set_ch'.$this->getProperty("channel").' -'.$value)); if ($value>0) { $this->setProperty('status',1); } else { $this->setProperty('status',0); } 


オーバーライドされたturnOffメソッドのコード:
 $this->setProperty("status",0); $this->setProperty("brightness",0); $this->callMethod("refresh"); 


オーバーライドされたメソッドturnOnのコード:
 $this->setProperty("status",1); $this->setProperty("brightness",100); $this->callMethod("refresh"); 


アイテム3

前のオプションとほとんど同じです-noo2オブジェクトを追加し、プロパティにコントロールチャネル(2)を指定します。 オブジェクトの準備ができました。

アイテム4。

noo2オブジェクトはnoo1と同じ方法で制御できますが、これに加えて、dimメソッドを使用して明るさを設定できます。
 callMethod('noo2.dim',array('value'=>50)); //    50% 


メニューでランプを制御するには、次の要素を作成します。
画像

ユーザーのコントロールのタイプは、従来のパワーユニットのコントロールの例ですでに示しています。

Nootehnikaには、RGBバックライトを制御するためのこのような3チャンネル調光器もあります。

統合を舞台裏で(または必要に応じて「宿題」として)残しますが、上記のような簡単な操作の結果、このインターフェイスを取得できます。
画像

あとがきの代わりに

オブジェクトシステムは、同じプロパティと動作を持つ同じ種類のオブジェクト(センサーやアクチュエーターなど)が多数ある場合に特に便利です。 同時に、1つのクラスを指定し、名前またはいくつかの別個の機能が異なるオブジェクトのみを追加できますが、同時にクラスメソッドで説明されている動作シナリオの実装は1つだけです。

さらに、システムと特定の「鉄」(およびそうではない)プロトコルとの接続を提供するすべての利用可能なモジュールにより、サポートされる機器のパラメーターを特定のオブジェクトのプロパティまたはメソッドに「バインド」することができます。これにより、すべての接続システムの現在の状態(SNMP、 ZWave、1-wireなど)。

最後に、特定の実装の例で多くのことを学ぶのが最も簡単であると言いたいと思います。特別なプロジェクトCONNECTが起動され、Smart Homeの既成の構成を交換できます。 私のプロファイルの例では使用されているコンポーネント、コントロールメニューの構成、作成されたスクリプト、クラス、およびMajorDoMoオブジェクトを示しています。 このプロファイルは、オブジェクトのプロパティの値に関する情報を公開しません。もちろん、機器を管理する方法はありません。すべての情報は情報提供のみを目的として提供されます。

良い自動化!

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


All Articles