chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

OpenECHOを使って照明用ECHONET Liteコントローラを試作

OpenECHOのサンプルを探していたが、大抵がProcessingを含む形式だった。一番シンプルな、Processingを含まないサンプルがarmadillo社様サイトで公開されていたので、それをベースに少し修正した。(オリジナルは2つのjavaだったが、それをうまくビルドする方法が分からず。antとか使うのだろうか)
実行環境は、Ubuntuです。

file: Ellight.java ( EL Light)

sumi@uburp4:~/lang/java$ cat  Ellight.java
import com.sonycsl.echo.Echo;
import com.sonycsl.echo.eoj.device.DeviceObject;
import com.sonycsl.echo.processing.defaults.DefaultNodeProfile;
import com.sonycsl.echo.eoj.device.housingfacilities.GeneralLighting;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

class MyLighting extends GeneralLighting {
    byte[] mStatus = {0x31};
    byte[] mMode = {0x41};
    byte[] mLocation = {0x39};
    byte[] mVersion = {0x01, 0x01, 0x61, 0x00};
    byte[] mFaultStatus = {0x42};
    byte[] mManufacturerCode = {0x12, 0x34, 0xFE};

    @Override
    protected boolean setOperationStatus(byte[] edt) {
        Runtime rt = Runtime.getRuntime();
        Process pr = null;
        try {
            /* LEDをON/OFF */
            if (edt[0] == 0x30)
                pr = rt.exec(new String[]
                             { "/bin/sh", "-c",
                               "echo 255 > /sys/class/leds/green/brightness" });
            else if (edt[0] == 0x31)
                pr = rt.exec(new String[]
                             { "/bin/sh", "-c",
                               "echo 0 > /sys/class/leds/green/brightness" });
            if (pr != null)
                pr.waitFor();
            inform().reqInformOperationStatus().send();
        } catch (InterruptedException | IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,null, ex);
        }
        return true;
    }
    @Override
    protected byte[] getOperationStatus() {
        try {
            Runtime rt = Runtime.getRuntime();
            Process pr = rt.exec("cat /sys/class/leds/green/brightness");
            InputStream is = pr.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if (line != null && line.equals("0"))
                mStatus[0] = 0x31;
            else
                mStatus[0] = 0x30;
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE, null, ex);
        }
        return mStatus;
    }
    @Override
    protected boolean setLightingModeSetting(byte[] edt) {
        mMode[0] = edt[0];
        try {
            inform().reqInformLightingModeSetting().send();
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }
    @Override
    protected byte[] getLightingModeSetting() {
        return mMode;
    }
    @Override
    protected boolean setInstallationLocation(byte[] edt) {
        mLocation[0] = edt[0];
        try {
            inform().reqInformInstallationLocation().send();
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }
    @Override
    protected byte[] getInstallationLocation() {
        return mLocation;
    }
    @Override
    protected byte[] getStandardVersionInformation() {
        return mVersion;
    }
    @Override
    protected byte[] getFaultStatus() {
        return mFaultStatus;
    }
    @Override
    protected byte[] getManufacturerCode() {
        return mManufacturerCode;
    }
}

public class Ellight {
    public static void main(String[] args)
            throws InterruptedException, IOException {
        Echo.start(new DefaultNodeProfile(),
                   new DeviceObject[]{new MyLighting()});
    }
}

同一ディレクトリに、OpenECHO.jarがあるとして、以下でビルドと実行

$  javac -cp OpenECHO.jar Ellight.java
$  java -cp /<path>/OpenECHO.jar:  Ellight

上記で照明デバイスとしてECHONET Liteプロトコルで待ち受けてくれる
別のPCから動作テストを実施. ECHONET Liteプロトコルで、上記デバイス
Location(機器設置場所)を問い合わせ(自作のEL通信ツール)
Javaソースで設定したLocation: 0x39が返却されるのを確認

$ ./elp.py get 029001@192.168.10.120  Location
GET(0x62) EPC... Location
108100010EF00102900162018100
|10|81|0001|0EF001|029001|62(Get)|01|81(Location)_00_|
waiting...
----------------------------------------
------------------------------
from ('192.168.10.120', 3610)
------------------------------
msg:
108100010290010ef0017201810139
|10|81|0001|029001|0ef001|72(Get_Res)|01|81(Location)_01_39|

■ソースを参照したサイト
https://armadillo.atmark-techno.com/howto/a400-openecho-howto
「Armadillo-400シリーズでECHONET Lite対応一般照明機器」
上記Javaソースは、上記armadillo社様サイトより引用、一部改修してテストしました。
シンプルなサンプルソースなので分かりやすい!!]


■メモ
kaden emulatorをソースから動かす方法

(1)Processingを落とす
(2)echonetフォルダ配下にechonet.pdeを置く
(3)走らせると、ライブラリがないと怒られる
   3-1controlP5がない・・・ライブラリのマネージ機能でContorlP5を入れる
          documents\Processing\libraries\contorolP5\library\controlP5.jar が入る
   3-2sonyのライブラリ(OpenECHO)はGitから落とす。
          Githubの  SonyCSL/OpenECHOの processing/libraryにOpenECHOのjarがあるのでそれを落として入れる
    documents\Processing\libraries\OpenECHOlibrary\OpenECHO.jar