Raspberry Pi + OpenECHOでECHOENT Lite機器を自作する【完全版】その①

同じような取り組みは過去に2回ほど取り組んでいるのですが、いずれも中途半端に終わってしまっていたので、ちゃんと最後までやりきって、『使えるもの』を作ってみたいと思います。具体的には、

  • Raspberry Piの電源を入れると、自動的にECHONET Lite機器として認識されるもの

を作ります。進め方としては、およそ以下の順でいこうと考えています。

  1. 普段使いのPCで、PCをECHONET Lite機器として認識させるためのJavaプログラムを作成
  2. 1.で作成したプログラムをRaspberry Piに移植、GPIO動作確認
  3. 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プロジェクトに追加します。自分は以下のようにしています。

  1. Eclipseのパッケージ・エクスプローラー内で、EchoDeviceフォルダ上で右クリック、新しいフォルダ”lib”を作成
  2. libフォルダ内に、echo.jarをコピペ。
  3. echo.jar上で右クリック、「ビルド・パス」→「ビルド・パスに追加」

これで開発準備が整ったので、プログラムを書いていきます。ダウンロードしてきた”OpenECHO-master”フォルダの中、”OpenECHO-master/Processing/Tutorial.pdf”を事前に読んで、OpenECHOの概要を軽く見ておくことをオススメします。

ちなみにこのチュートリアルはProcessing利用ベースで書かれていますが、Processingを利用する形でプログラムを書いてしまうと、Raspberry Pi上で動作させるときに使い勝手が悪くなってしまうので、ここでは純粋なJavaプログラムを作成していきます。

主に参照するのは、チュートリアルの第四章「機器オブジェクトの実装」です。ECHONET Lite機器も色々ありますが、このチュートリアルでも採用している”GeneralLighting(照明)”がなんだかんだで使い勝手がよいので、ここでもRaspberry Piを照明として認識させるように作っていきます。

全体のファイル構成は、こんな感じです。

echonet_eclipse

ファイルは二つだけ。

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にします。

kadecot_1

プログラム起動前だと、こんな感じで”AndroidSensorDevice”しか見えませんが、

kadecot_2

プログラムを起動してうまく動いていれば、こんな感じで”GeneralLighting”が見えるようになっているハズです。

右下のAppsから”Hexflick”アプリを選んで、ON/OFFのテストをすることもできます。

kadecot_3 kadecot_4 kadecot_5

ON/OFFをすると、Eclipseのコンソール上には、”Light ON!”や”Light OFF!”が表示されるハズです。

とりあえず、ここまで。次は、このプログラムを改修して、実際にRaspberry Piに繋いだLEDを点灯させるところまで持っていきたいと思います。