

そして今、Z-Waveテクノロジーに基づいたオートメーションシステム用の待望の「レゴキューブ」が登場しました。これは、望ましい柔軟性と、優れた機能性と低価格を兼ね備えています。
Raspberry Pi用のRaZberry拡張ボードは、最も人気があり最も安価なミニコンピューターをZ-Waveホームオートメーションコントローラーに変えます。
RaZberryは3つのソリューションです:
- トランシーバーを搭載したボードZ-Wave ZM3102
- ZM3102のファームウェア、スティックの標準ファームウェアの機能を拡張
- Z-Wayソフトウェア

鉄
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ソフトウェアを詳しく見てみましょう。 いくつかの部分で構成されています。
- libzwayライブラリはZ-Waveエンジンの基礎であり、Z-Waveとの簡単な作業のためのC APIを提供します(pthreads、zlib、opensslに依存)
- libzwayjsライブラリ-CとGoogle V8のJavaScriptエンジン間のバインド。 Z-Waveネットワークを操作するためのシンプルなJS APIを提供します(libv8およびlibzwayに依存)
- libzwayhttpライブラリ-ユーザーインターフェイスを含む外部クライアントにサービスを提供するHTTPサービス。 JSON APIを提供します(libmicrohttpd、openssl、libzwayjsおよびlibzwayに依存)
- main.cpp-すべてのサービスを一緒に開始するためのバインディング、設定とコマンドラインパラメーターの読み取り
この構造により、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関数を使用して、イベントからサブスクライブ解除できます。
構文を簡素化するために、 commandClasses 、 instances [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コードをどこに埋め込むのですか? このコードを実行するにはいくつかの方法があります。
- コードをファイルに書き込み、Raspberry Pi SDカードの/ opt / z-way-server / [your folder]フォルダーに配置します。 さらに、このコードはAutomation / main.jsから実行できます:executeFile(pathToJavaScriptFile)。
- ネイティブのRaZberryファイルの代わりに、config.xmlに独自のJavaScriptファイルを記述することもできます。
- Z-Way JSON APIを介してHTTPで送信する
次に、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の形式で返します。
他のコマンドについては、ドキュメントで説明されています。
いくつかの例:
-
localhost:8083/ZWaveAPI/Run/devices[2].SwitchMultilvel.data.level.value
localhost:8083/ZWaveAPI/Run/devices[2].SwitchMultilvel.data.level.value
デバイスから最後に受信した輝度レベルを返します(読み取り前にSwitchMultilevel.Get()を送信する価値があります) -
localhost:8083/ZWaveAPI/Run/devices[3].instances[1].SensorMultilvel.data.level.value
localhost:8083/ZWaveAPI/Run/devices[3].instances[1].SensorMultilvel.data.level.value
デバイスから受信した最後のセンサー値を返します(読み取り前にSensorMultilevel.Get()を送信) -
localhost:8083/ZWaveAPI/Run/devices[2].Basic.Set(0)
localhost:8083/ZWaveAPI/Run/devices[2].Basic.Set(0)
-デバイスをオフにします
インスタンス[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に基づく予算自動化システムを構築するための便利なソリューションになると確信しています。