Raspberry Pi + OpenECHOでECHOENT Lite機器を自作する【完全版】その①
同じような取り組みは過去に2回ほど取り組んでいるのですが、いずれも中途半端に終わってしまっていたので、ちゃんと最後までやりきって、『使えるもの』を作ってみたいと思います。具体的には、
- Raspberry Piの電源を入れると、自動的にECHONET Lite機器として認識されるもの
を作ります。進め方としては、およそ以下の順でいこうと考えています。
- 普段使いのPCで、PCをECHONET Lite機器として認識させるためのJavaプログラムを作成
- 1.で作成したプログラムをRaspberry Piに移植、GPIO動作確認
- Raspberry Piで起動時に2.のプログラムが自動で立ち上がるように設定
では早速。
オープンソースのOpenECHOライブラリ(Java版)を使ってプログラムを組んでいきますが、Raspberry Pi上で組んでいくのは性能的にしんどいので、使い慣れたPC上でまずは開発します。せっかくJavaを使うことですし、移植性の良さを利用します。
Javaの統合開発環境があった方がラクなので、とりあえずEclipseを入れます。ここから自分のPCに合ったバージョンをダウンロードしてください。Windowsをご利用の方は、ここから『Pleiades All in One』をダウンロードした方が手っ取り早いかもしれません。日本語化されているので、使いやすいと思います。
Macの人は、eclipseをダウンロードした後、pleiadesプラグインを使って、必要に応じて日本語化してください。こちらが参考になります。
無事Eclipseが準備できたら、新規のJavaプロジェクトを作ります。とりあえず”EchoDevice”というプロジェクト名にしておきます。
次に、OpenEchoのライブラリをこちらからダウンロードしてきます。必要なファイルは、”OpenECHO-master/bin/echo.jar”です。
ライブラリ(echo.jar)をEchoDeviceプロジェクトに追加します。自分は以下のようにしています。
- Eclipseのパッケージ・エクスプローラー内で、EchoDeviceフォルダ上で右クリック、新しいフォルダ”lib”を作成
- libフォルダ内に、echo.jarをコピペ。
- echo.jar上で右クリック、「ビルド・パス」→「ビルド・パスに追加」
これで開発準備が整ったので、プログラムを書いていきます。ダウンロードしてきた”OpenECHO-master”フォルダの中、”OpenECHO-master/Processing/Tutorial.pdf”を事前に読んで、OpenECHOの概要を軽く見ておくことをオススメします。
ちなみにこのチュートリアルはProcessing利用ベースで書かれていますが、Processingを利用する形でプログラムを書いてしまうと、Raspberry Pi上で動作させるときに使い勝手が悪くなってしまうので、ここでは純粋なJavaプログラムを作成していきます。
主に参照するのは、チュートリアルの第四章「機器オブジェクトの実装」です。ECHONET Lite機器も色々ありますが、このチュートリアルでも採用している”GeneralLighting(照明)”がなんだかんだで使い勝手がよいので、ここでもRaspberry Piを照明として認識させるように作っていきます。
全体のファイル構成は、こんな感じです。
ファイルは二つだけ。
package jp.weblike.makemuda.echodevice; import java.io.IOException; import com.sonycsl.echo.Echo; import com.sonycsl.echo.eoj.device.DeviceObject; import com.sonycsl.echo.processing.defaults.DefaultNodeProfile; import jp.weblike.makemuda.echodevice.devices.*; public class Main { static private LightEmulator light; public static void main(String[] args) { Echo.addEventListener( new Echo.Logger(System.out)); // ログ出力 light = new LightEmulator(); try { Echo.start(new DefaultNodeProfile(), new DeviceObject[]{light}); } catch (IOException e) { e.printStackTrace(); } } }
package jp.weblike.makemuda.echodevice.devices; import java.io.IOException; import com.sonycsl.echo.eoj.device.housingfacilities.GeneralLighting; public class LightEmulator extends GeneralLighting { byte[] mStatus = {0x31}; // 電源状態を格納する変数です。デフォルトは OFF と仮定します。 byte[] mLocation = {0x00}; // 機器の置き場所を格納する変数です。 byte[] mFaultStatus = {0x42}; // 機器に問題が発生した時に、そのコードを格納します。 byte[] mManufacturerCode = {0, 0, 0}; // ベンダー固有のメーカーコードです。 @Override protected boolean setOperationStatus(byte[] edt) { mStatus[0] = edt[0] ; //電源状態が変化したことを他のノードに通知します try{ // ------------------------------------------------------------------ // この部分に、実際に照明を点灯/消灯させるためのコードを書く。 // (Raspberry PiのGPIOを操作するためのコード) // とりあえずは、ログだけ出すようにする if(mStatus[0] == 0x30){ System.out.println("Light ON!"); inform().reqInformOperationStatus().send(); }else if(mStatus[0] == 0x31){ System.out.println("Light OFF!"); inform().reqInformOperationStatus().send(); }else{ System.out.println("Parameter Error: Can NOT operate status"); } // ------------------------------------------------------------------ }catch(IOException e){ e.printStackTrace(); } return true; } @Override protected byte[] getOperationStatus() { return mStatus; } @Override protected byte[] getLightingModeSetting() { // TODO 自動生成されたメソッド・スタブ return null; } @Override protected boolean setLightingModeSetting(byte[] arg0) { // TODO 自動生成されたメソッド・スタブ return false; } @Override protected byte[] getFaultStatus() { // TODO 自動生成されたメソッド・スタブ return mFaultStatus; } @Override protected byte[] getInstallationLocation() { // TODO 自動生成されたメソッド・スタブ return mLocation; } @Override protected byte[] getManufacturerCode() { // TODO 自動生成されたメソッド・スタブ return mManufacturerCode; } @Override protected boolean setInstallationLocation(byte[] edt) { mLocation[0] = edt[0]; try{ inform().reqInformInstallationLocation().send(); }catch (IOException e) { e.printStackTrace(); } return true; } }
以上。ここまでできたら、PCのEclipse上で実行します。
millis:1420425582121,method:new,type:node,address:127.0.0.1 millis:1420425582121,method:new,type:eoj,groupCode:0e,classCode:f0,instanceCode:01,address:127.0.0.1 millis:1420425582135,method:new,type:eoj,groupCode:02,classCode:90,instanceCode:01,address:127.0.0.1 millis:1420425582137,method:send,tid:0000,esv:73,seoj:[class:0ef0,instance:01],deoj:[class:0ef0,instance:01],data:10 81 00 00 0e f0 01 0e f0 01 73 01 d5 04 01 02 90 01 millis:1420425582139,method:receive,tid:0000,esv:73,seoj:[class:0ef0,instance:01],deoj:[class:0ef0,instance:01],data:10 81 00 00 0e f0 01 0e f0 01 73 01 d5 04 01 02 90 01
こんな感じのログが出ていると思います。
あとは、このPCがちゃんとECHONET Lite機器としてネットワーク上に存在しているかを確認する必要があります。
Android端末を持っているなら、Kadecotアプリを使うのが手っ取り早いと思います。
Android端末をPCと同じローカルネットに接続し、Kadecotアプリを立ち上げて、KadecotのサーバーをONにします。
プログラム起動前だと、こんな感じで”AndroidSensorDevice”しか見えませんが、
プログラムを起動してうまく動いていれば、こんな感じで”GeneralLighting”が見えるようになっているハズです。
右下のAppsから”Hexflick”アプリを選んで、ON/OFFのテストをすることもできます。
ON/OFFをすると、Eclipseのコンソール上には、”Light ON!”や”Light OFF!”が表示されるハズです。
とりあえず、ここまで。次は、このプログラムを改修して、実際にRaspberry Piに繋いだLEDを点灯させるところまで持っていきたいと思います。
ディスカッション
ピンバック & トラックバック一覧
[…] 前回の続きで、Raspberry PiのGPIOを制御するコードを追加していきます。 […]
[…] ECHONET Liteのテストをするだけならその①までで十分だと思いますが、デモとかする必要があるときは、やっぱり実際に動かせるものを見せられる方が説得力も出てくるかなーと思います […]