RaZberry-Z-WaveとRaspberry Piに基づくスマートホーム

RaZberry拡張ボード付きRaspberri Pi 多くの人が自分の手で「スマートホーム」を構築しようとしています。 システムを選択するときは、エンドデバイスの範囲とコストだけでなく、コントローラーの機能も考慮する必要があります。 ほとんどのコントローラーはすぐに「すぐに使用可能」になりますが、機能が制限されています。 ただし、選択の基本的な基準であるのは、多くの場合、柔軟性と容易な統合の可能性です。



そして今、Z-Waveテクノロジーに基づいたオートメーションシステム用の待望の「レゴキューブ」が登場しました。これは、望ましい柔軟性と、優れた機能性と低価格を兼ね備えています。



Raspberry Pi用のRaZberry拡張ボードは、最も人気があり最も安価なミニコンピューターをZ-Waveホームオートメーションコントローラーに変えます。







RaZberryは3つのソリューションです:



ラズベリー



Linuxでは、RaZberryはcom-port / dev / ttyAMA0と見なされます。 このボードは基本的に、ZM3102トランシーバ、Z-Waveネットワークデータを保存するためのEEPROMメモリ、PCBAアンテナ、GPIO Raspberry Piレッグ用のUARTコネクタで構成されています。 Vcc、Gnd、TX、およびRXのレッグのみが実際に使用されます。 残りの脚はボードに使用されず、よりしっかりと固定するのに役立ちます。 理論的には、これらの脚は他のニーズに使用できます。



ファームウェア


このボードは、Sigma Designs Serial APIと完全に互換性のあるインターフェースを提供します。これにより、提供されたZ-Wayソフトウェアだけでなく、他のZ-Waveソフトウェア(Open Z-Wave、LinuxMCE、FHEM、または自作)、およびZクラウドサービスも使用できます-クラウド( 手順を参照)。 このボードは、Z-Wayソフトウェアが機能するために必要なZ-Wave.MeのSigma Designs Serial APIプロトコルの拡張機能も提供します。



ファームウェアでは、UARTを使用して自分で更新することもできます。これにより、将来発生する可能性のあるバグを修正するだけでなく、ファームウェアバージョンをデフォルトでインストールされているバージョン(SDK 4.54.01)から、便利なNWI、Explorerフレーム、およびランダムHomeId、ただしSUC / SIS機能を含む。 (注意深いため:はい、私は間違っていませんでした、4> 5;)



ソフトウェア


Z-Wayは、コマンドを実行してRaspbian wheezyの上にインストールします

wget ‐q ‐O ‐ razberry.z-wave.me/install | sudo bash







インストールスクリプトは、Z-Wayを/ opt / z-way-serverに配置し、実行するスクリプトを/etc/init.d/Z-Wayに書き込み、自動実行に追加して、ttyAMA0ポートを構成します。 再起動後(ttyAMA0のカーネル設定を適用する-デフォルトでは、RaspbianはコンソールにUARTを使用します)、サーバーは動作する準備ができています。 ブラウザで開きます IP_OF_RASPBERRY:8083



IP_OF_RASPBERRY:8083



およびZ-Waveネットワークの構築を開始します。



RaZberryにバンドルされているZ-Wayソフトウェアを詳しく見てみましょう。 いくつかの部分で構成されています。



この構造により、Z-Wayのコンポーネントとさまざまなレベルの統合を使用できます。 パフォーマンスが重要なプロジェクトでは、CレベルのAPIが利用可能です(libzwayの.hヘッダーファイルが含まれています)。運用開発が必要なプロジェクトでは、JS APIを使用する方が簡単です。 両方のインターフェイスの構造が似ていることが重要です。これにより、クイックプロトタイピング後にJavaScriptからCにコードを簡単に移植できます。



次に、JavaScriptレベルのAPIについて説明し、簡単な自動化ルールを作成する方法を示します。 Cレベルのインターフェースは、この記事の範囲外です。 サーバー側のJavaScript Z-Wayエンジンの構文は、クライアント側でZ-Cloudに実装されたものと似ていることに注意してください-Z-Cloud APIの説明を参照してください。 さらに読むために、読者はすでにZ-Waveプロトコルの機能に精通していることを前提としています(Z-Waveプロトコルの詳細な説明を参照してください)。



JavaScriptネームスペース内のZ-Waveに関連するすべてのものは、Z-Waveデバイス上のデータとメソッドの完全なツリーを提供するグローバルzwayオブジェクトにあります。



コントローラーの子オブジェクトには、Z-Waveコントローラーに固有のデータとデバイスデバイスのリストが含まれています。 各デバイスには、データ構造とデバイスチャネル(インスタンス)のリストが含まれています。 各チャネルには、デバイスでサポートされているZ-Waveコマンドクラスのリストがあります。 コマンドクラスには、関数(Set、Get、...)を呼び出すためのメソッドと、クラスに関するすべての情報が格納されるデータツリー(データ)があります。



グラフィカルに、これは次のように示すことができます(ドキュメントの写真):







API構造は非同期であり、2つの部分に分かれています。



コマンドは、 zway.devices[2].instances[0].commandClasses.Basic.Set(0)



の形式の要求によってzway.devices[2].instances[0].commandClasses.Basic.Set(0)



されます(この例では、ライトをオフにします)。 .Get()関数は、デバイスに値リクエストを送信します。 zway.devices[2].RequestNodeNeighbourUpdate()



はデバイスにネイバーの更新を要求し、 zway.AddNodeToNetwork(1)



コマンドzway.AddNodeToNetwork(1)



新しいデバイスをネットワークに追加するプロセスを開始します。 すべてのコマンドの詳細については、 RaZberryプロジェクトのドキュメントページのドキュメントを参照してください。 2つの追加パラメーターを各リクエストに追加できます:成功した送信と失敗した送信のコールバック関数。



適切なパケットを送信するためのチームのキュー。 送信は、RaZberry拡張ボードに実装されているSigma Designs Serial APIを介して実行されます。 Z-Waveのすべての魔法はこの抽象化レベルに隠されています:バッテリー駆動のデバイスでは、これらのパケットは覚醒待ちとしてマークされ、予備のキー交換が進行中です、バッテリー電力と通信時間を節約するために、いくつかのパケットは一緒にバンドルされます... 、Z-Waveにはゴキブリがたくさんありますが、これらはすべてZ-Way APIカーペットの下にあり、そこからはみ出しません。



デバイスから受信したすべてのデータは、デバイスまたはコマンドのクラスに関連するデータツリーに記録されます。 データツリーの各要素には、属性値(要素値)、updateTimeおよびinvalidateTime(更新日と値の有効期限のタイムスタンプ)、名前(名前)があります。 ツリー構造については、ドキュメントでも詳しく説明されています。 ツリー値の変更に関する通知を受信するために、イベントのサブスクリプションのシステムがあります。 ツリーの各要素のバインド関数を使用すると、コールバック関数をデータ変更にバインドできます。



zway.devices[2].instances[0].commandClasses.Basic.data.level.bind(function (type[, arg]) {}, [arg, [watchChildren=false]]);







bindに渡されるオプションのarg引数はコールバック関数に渡され、共通のコールバックハンドラーを共有する異なるイベントを分離するために追加のパラメーターを渡すのに役立ちます。 watchChildrenパラメーター(trueまたはfalse)を使用すると、このツリー要素だけでなく、子要素への変更も追跡できます。 コールバック関数のthisオブジェクトは、バインドが起動されるデータツリーの要素です。this.valueは値、this.updateTimeは最終更新日などです。 タイプ引数には、変更タイプのビットマスクが含まれています(変更、更新、削除、非推奨、...-すべての値は、ソフトウェアパッケージに含まれているZDefsPublic.hで詳細に説明されています)。



同様に、グローバルzwayオブジェクトにはバインド関数があり、デバイス、インスタンス、およびcommandClassesの配列の変更を追跡できます。



zway.bind(function(type, nodeId, instanceId, commandClassId) {}, [mask = 0xffff])







type引数は、変更の性質を示します(デバイス/チャネル/コマンドクラスが追加/削除されたか、ディスクへのデータツリーを持つファイル(ZDDXファイル)が保存されました。トリプレットnodeId、instanceId、commandClassIdは変更されたオブジェクトを指します。



unbind関数を使用して、イベントからサブスクライブ解除できます。



構文を簡素化するために、 commandClassesinstances [0] (つまり、チャンネルゼロ!) level.value == 0



level == 0



level.value == 0



似ていますが、 level.value == 0



なしのJSONシリアル化では、属性を持つツリーの要素全体がシリアル化されます、値だけではありません)。



zwayグローバルオブジェクトはv8でネイティブであることに注意してください。 これは通常のJavaScriptオブジェクトではありません。ツリー要素のデータのみを変更できます。 ツリー内の他のすべての変更は無視されます。



以下に例を示します。



コントローラが他のネットワークデバイスからBasic Setイベントを受信したときにシェルコマンドを実行します(たとえば、スイッチはMultiChannelAssociationを使用してチャネル1のコントローラに関連付けられます)



 var instanceId = 1; var ctrlNodeId = zway.controller.data.nodeId.value; // Get controler Node Id if (zway.devices[ctrlNodeId] && zway.devices[ctrlNodeId].instances[instanceId]) { // Check that instance object exists var basicCC = zway.devices[ctrlNodeId].instances[instanceId].Basic; if (basicCC) { // check that Basic exists basicCC.data.level.bind(function() { // bind to Basic level value system("echo " + this.value); }); } }
      
      







スイッチを入れてから10秒後に調光器を自動的にオフにします(リレーの場合は、SwitchMultilevelではなくSwitchBinaryを使用します)。 (ここでは、デバイスがレポートを送信でき、コントローラーに関連付けられていると想定しています)



 var nodeId = 2; var instanceId = 0; var _tmr = null zway.devices[nodeId].instances[instanceId].SwitchMultilevel.data.level.bind(function() { var node = args[0]; var instance = args[1]; if (_tmr) { clearTimeout(_tmr); } _tmr = null; if (this.value > 0) { _tmr = setTimeout(function () { zway.devices[nodeId].instances[instanceId].SwitchMultilevel.Set(0); _tmr = null; }, 10*1000); } });
      
      







(ここで、このコードを数回実行するには、各デバイス/チャネルに_tmr配列を入力する必要があることに注意する価値があります)



JavaScriptコードの実行


このJavaScriptコードをどこに埋め込むのですか? このコードを実行するにはいくつかの方法があります。





次に、Z-Way HTTP / JSON APIについて説明します


Z-Wayサーバーとの対話のこのインターフェイスは、データ転送にHTTPプロトコルとJSON形式を使用します。 オートメーションサーバー用の独自のグラフィカルインターフェイスを作成することは難しくありません。



コマンドはURLリクエストに直接エンコードされ、レスポンスはAjaxer用の通常のJSON形式で送信されます。



要求/ ZWaveAPI / Data / <timestamp>は、 <timestamp>からの完全な更新ツリーのJSON構造を提供します。 彼女の形は

{

path1: object1,

path2: object2,

...

updateTime: <timestamp>

}







ここで、pathNはツリーの変更された要素へのパス、objectNはこの要素の新しい値です。 updateTime-更新の生成時間(更新を受信するには、次のリクエストで指定する必要があります)



/ ZWaveAPI / Data / 0をリクエストすると、サーバーは完全なデータ構造を返します。



要求/ ZWaveAPI / Run / <cmd>は、 zway.<cmd>



JavaScriptコードを起動します。 このリクエストは、より一般的な/ JS / Run /に似ており、Z-CloudサービスAPIとの互換性のために作成されました。



request / JS / Run / <cmd>はv8エンジンで<cmd>を実行し、このコマンドの結果をJSONの形式で返します。



他のコマンドについては、ドキュメントで説明されています。



いくつかの例:





インスタンス[0]commandClasses、およびvalueは省略できることを思い出してください。



一部の文字は、送信する前に明示的にエンコードする必要があることに注意してください(URLエンコード)。たとえば、+ {}。



ソフトウェアに加えて、ブラウザの基本的なインターフェイスが付属しています。 また、Z-Way JSON APIを使用してサーバーと対話します。 そのコードは、APIの操作を調べるのに便利です。 request / ZWaveAPI / Data / <timestamp>によって受信されたツリーの更新を追跡するjQueryの拡張も有用です



これは、システムのさまざまなレイヤーの相互作用がどのように見えるかです(ドキュメントの写真):







しばらくして、一般ユーザー向けの自動化用のJSスクリプトを作成する予定です(ワークピース曲線は既に自動化フォルダーにあります)。 これらは、独自のユーザースクリプトと組み合わせて使用​​できます。 独自のスクリプトをすでに作成して、プロジェクトで使用することができます。



入手先


Raspberry Piは、 RSコンポーネントまたはFarnellサイトで販売されています。

RaZberryボードおよびその他のZ-Wave機器は、 オンラインストアZ-Wave.Meなどで入手できます。



自動化する時が来ました!


RaZberryは、Z-Waveに基づく予算自動化システムを構築するための便利なソリューションになると確信しています。



All Articles