MENU

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を照明として認識させるように作っていきます。

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

ファイルは二つだけ。

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を点灯させるところまで持っていきたいと思います。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (2件)

目次