LUA言語拡張ハンドラ
LUA言語は、C言語ベースのバイナリー実行モジュールに、高級言語並みのスクリプト実行環境をアドオンできるシステムです。
OpenBlocksのPD Handlerではシステムソフトウェアの決まった処理系の全てをC言語で用意しておき、あとちょっとしたプログラムをLUAスクリプトで追加可能にしてあります。
例えばEnOceanデバイスの様にプロファイルがあれば、そのプロファイルによってバイナリーデータ列が規則化されているので、EnOceanコミュニティからプロファイルの仕様を手に入れれば、容易にデータを抽出しjsonテキスト化ができます。
本章ではBLE(ビーコン型センサー)とEnOcean(EEP仕様)およびRS-232CやRS-485などのシリアル通信の機能拡張ハンドラの作成について解説しています。
BLE Lua
BLEハンドラは過去のOpenBlocksシステムの流れから、コネクションタイプのnode.js型のものから、現時点ではビーコン型を対象としたC言語+LUA言語版へと移行しています。
ビーコン型を選んでいる理由としているのは、IoTシステムとして何年もの間に安定してデータを受信し続けられる点が第一の理由です。
BT/BLEなどでのコネクションは非常に安定性が悪く、また、センサーメーカー毎のプロトコルの作りに互換性が無く、コネクション切断毎の処理系がマチマチでコネクション復旧方法の処理系が曖昧でした。
どちらかと言うとスマートフォンでデータを見たい時、一時的なコネクションで一気にデータを取り込むような使い方に、多機能なコネクション型は向いています。
このためぷらっとホームとして、BT/BLEのコネクションモードでのサポートをIoT機器向けには続けることが非常に難しい所があり、現時点ではコネクションモードの新規開発を行っていません。
BLEのビーコンモードと呼んでいるのは、BLEデバイスが一定期間毎に発生させるアドバタイジングで、ビーコンセンサーはこのアドバタイジングのデータにセンサーデータを乗せています。
通常このアドバタイジングによって、社員証にBLEデバイスを仕込んで出退勤を管理したり、社員の位置情報システムに利用しています。
このビーコンとして発せられるアドバタイジングデーターからセンサーデータを拾うだけの仕組みのため、通信プロトコル無しで非常に単純な仕組みであり、何年も安定したIoTデータ受信に非常に向いています。
BLEデバイスのLua対応
BLEから受信したアドバタイズのデータ部分であるペイロードには、デバイスメーカーが自由に使っていい領域があり、BLEハンドラではこのペイロード部分をLua言語に渡しています。
それぞれのBLEデバイスに対応したLua関数は、WEB-UIのIoTデータ
→BLE Lua
タブの操作画面の以下のディレクトリに保存されています。
Lua関数の保存ディレクトリは以下の様に分けられています。
ディレクトリ名 | 説明 |
---|---|
devices | 標準でサポートしているBLEデバイス毎のLuaハンドラの保存ディレクトリ |
devices_custom | ユーザーが独自に追加するLuaハンドラの保存ディレクトリ |
func | 標準のLua関数の保存ディレクトリ |
func_custom | ユーザーが独自に追加するLua関数の保存ディレクトリ |
この4つのディレクトリに保存されたLuaファイルと1つのLuaファイル(pd-handler-ble-init.lua)がPD Handler起動時に全てが読み込まれます。
起動後、PD HandlerがBLEビーコンを受信するとBLE登録で登録されたデバイスのみ選別されLuaに送り込まれます。
Lua言語内ではBLEデバイス毎のLua関数(デバイス毎のソースコード)を、BLEの種類がマッチングするまで全ての関数を順次呼び出します。
BLEデバイスの種類がマッチングで特定されると、必要なデータをバイナリデータ列から取り出して、jsonに変換される連想配列の規定単位(温度とか)に変換されたのち保存されます。
以下にナカヨ製ボタン付きBLEビーコンのハンドラソースコードをサンプルに説明します。
※このビーコンはiBeaconに互換です。
※仕様変更もありえる詳細はナカヨ様の最新仕様書で確認ください。
ナカヨ製ボタン付きBLEビーコンは、ボタンを長押しするとjo.pushの値が1
2
3
1
2
とこんな感じに変化します。
BLEビーコンセンサにはiBeacon規格以外のもあるので、デバイスマッチングについては他のソースコードも参考にしてください。
以上のコードでIoTクラウドへ送信されるjsonテキストは以下の通りになります。
その他のセンサーのjsonテキストはこちらを参照ください。
編集が終わったら、<デバイス名>.luaと名前を付けてdevices_customディレクトリにUPLOADしてください。
UPLOAD/DOWNLOAD操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
BLE Lua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択してください。 ※対象ディレクトリ配下がプルダウン対象です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行ってください。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。
Luaファイル以外を置かないでください。
EnOcean Lua
EnOceanはEEP(EnOcean Equipment Profile)というプロファイルでデバイスが定義されています。
また一部のGP(Generic Prpfile)のデバイスについても対応していますが、Tech-inデータを用いない為EEPデバイスと同様にGPから始まるプロファイルを使用します。
EnOcean登録とLua関数の関係
EnOceanデバイスはBLE機器に比べプロファイルと言う形式をとっているため、データ形式が規格化されているため扱い易いです。
デバイス毎のハンドラは以下の通り、devicesディレクトリにプロファイル名でLuaハンドラが登録されています。
WEB-UIのIoTデータ
→EnOcean Lua
タブの操作画面の以下のディレクトリです。
EnOceanを受信登録するする時はEnOcean登録でデバイスID
とEEP
の登録が必須です。
ここで登録されたEEPあわせて、devicesディレクトリに登録されたLuaハンドラーの中から該当するハンドラーが選択され実行します。
※EnOceanハンドラはBLEハンドラとは違ってLuaを呼ばれた時点でデバイスのプロファイルが決定しています。
ユーザースクリプトは以下のdevices_customディレクトリに保存するので、ここに置いてある"skelton.lua"をダウンロードして、テンプレートにすると良いです。
登録したいEEPは次のようなデバイスのものです。
EnOceanアライアンスのEEP仕様書から A50205 |
---|
最初に"skelton"文字列をデバイスのEEPに置換します。
かつ、クラウド送信用のjo配列のメンバーにtemperatureを追加しtemperaturen値を計算し代入します。
※元のskeltonは受け取ったデータをそのまま16進テキスト文字列でjsonで送るものです。
以上のコードでIoTクラウド送信用のjsonテキストは以下の様になります。
その他のセンサーのjsonテキストはこちらを参照ください。
編集が終わったら、<プロファイル名>.luaと名前を付けてdevices_customディレクトリにUPLOADしてください。
UPLOAD/DOWNLOAD操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
EnOcean Lua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択してください。 ※対象ディレクトリ配下がプルダウン対象です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行ってください。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。
そのため、ファイル内容については skelton.lua を参考に作成してください。
標準登録センサーのLuaハンドラ編集
例えば"EEP:A50205"と言うセンサーでクラウドに送信するキー名"temperature"となっているのを"temp"と変更したい場合、"devices"ディレクトリから"a50205.lua"というファイルをダウンロードします。
この行
を
と変更します。
そして変更したファイルを"devices_custom"ディレクトリにファイル名を変更せずに"a50205.lua"と言う名前のままアップロードしてください。
この作業だけでオリジナルの送信データを作成できます。
新規センサーのLuaハンドラ作成
未サポートのデバイスのハンドラを新規に追加する時は、"devices_custom"ディレクトリに"skelton.lua"というファイルが置いてあるので、このファイルをテンプレートとして使ってください。
このファイルの中の"skelton"と言う部分をEEPプロファイル名に変更して使います。
上記の"EEP:A50205"のソースコードが参考になると思います。
あとはxxxxxx.xxxxxx_decode関数の中にバイナリデータからの変換ルーチンを用意するだけです。
完成したらEEPプロファイル名.lua
というファイル名で"devices_custom"ディレクトリにアップロードしてください。
なお、"skelton.lua"テンプレートにあるxxxxxx.xxxxxx_decode関数内のルーチン
は、バイナリデータをそのまま16進数ASCII文字列に変えているだけなので、変換ルーチンを別途用意する場合は全て不要になります。
info
ファームウェア 1.x、2.x は、Lua に対応しておりません。
EEPタイプとGPタイプに対応しています。
EEPタイプはプロファイルコードで検索してください。
GPタイプはEEPの欄に"GP"から始まるプロファイル名を入力します。(GP_xxxx)
GPセンサーはファームウェア 4.xからのサポートになります。
RS-SERIAL Lua
PD Handler RS-SERIALでは、対向のシリアルデバイス(RS-232C/RS-485など)向けに処理内容をフルカスタムできるユーザー定義ハンドラです。
WEB-UIのIoTデータ
→SERIAL Lua
タブから、カスタマイズしたLuaファイルをアップロードし使用します。
info
- デフォルトでインストールされているrs-serial.luaはサンプルとなります。このファイルを参考に編集してください。
- PD Handler RS-SERIALはrs-serial.luaファイルを読み込み、LUA_main関数を実行します。
- PD Handler RS-SERIALはPD Repeaterへのアクセスするパスのデバイス名部をrs-serial.lua内にて定義しています。そのため、環境に合わせてluaファイルを編集する必要があります。
caution
rs-serial.luaファイルが不正(フォーマットエラーやシンタックスエラー等)の場合エラー終了となるので、ログを確認してください。
RS-SERIAL Lua のカスタマイズ(シリアルポート側)
基本的には一般の高級言語でシリアルインターフェース機器との通信全般を書くのと違いがありません。
※実際にはシリアル通信にこだわらずLuaだけで汎用的なアプリケーションもここで作れてしまいます。
システムの単純な流れとしては
この作り方になりますが、OpenBlocks上ではデーモンとして起動するので、シリアルポートのクローズはSTOPシグナルが入った時となるので、データ送受信部分で無限ループする作りになります。
このディレクトリにあるrs-serial.luaをテンプレートとしてダウンロードしてから編集して使ってください。
※利用開始前にはアプリ設定でPD Handler RS-Serialの起動を忘れずに!
以下はrs-serial.luaのデフォルトソースコードです。
OpenBlocksとパソコンをRS-232Cクロスケーブルで接続しテストを行ってください。
動作はパソコン側でTeraTermなどを使ってOpenBlocksと接続しキーボード入力するとその文字をエコーバックします。
そして"who?"と入力すると"I am openblocks"と返事し、"exit!"と入力すると"!!!!!! STOPING prcess !!!!!"と返事してからプロセスを停止します。
※本番用デーモンとして起動する時は無限ループを抜ける仕組みがない方が良いです。
これは非常に簡単なプログラムで、もう少し色々試したい時はsample.luaを一度ダウンロードでしてrs-serial.luaのファイル名でアップロードしてください。
IoTクラウド(PD Repeater)への送信サンプルなども用意されていますので参考にしてください。
RS-SERIAL Lua のカスタマイズ(クラウドとの通信側)
もともとはシリアルポート側の処理系と一緒のソースコードとして作成しますが、わかりやすく解説するためにクラウド側の処理を分けて説明します。
以下は簡単なサンプルです。
RS-SERIALのLua用関数
以下はOpenBlocksのLua言語用に実装している関数です。
sample.luaではこれら関数を一通り使っているので参考にしてください。
UPLOAD/DOWNLOAD操作
RS-SERIAL Luaの操作画面はWEB-UIのIoTデータ
→SERIAL Lua
タブの操作画面からアップロードやダウンロードを行います。
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後に、プロセスの再起動が必要となります。
HVSMC Lua
UPLOAD/DOWNLOAD操作
作成したLuaハンドラのアップロードや、参考にするLuaハンドラのダウンロード操作は以下の通りです。
HVSMC Lua メニューの操作項目
設定項目 | 説明 |
---|---|
更新 | Luaファイルのアップロード先のファイル一覧表示を更新します。 |
削除 | ファイルを選択後削除 ボタンで削除します。削除可能なファイルはカスタム用ディレクトリ配下のファイルです。 |
ダウンロード | ファイルを選択後ダウンロード ボタンでクライアントパソコンのダウンロードフォルダにファイルをダウンロードします。 |
実行権付与 | ファイルを選択後実行権付与 ボタンで実行権を付与します。通常では不要です。 |
アップロード先 | アップロードしたいディレクトリをプルダウンから選択してください。 対象ディレクトリ配下がプルダウン対象です。 |
アップロード | ファイルを選択 ボタンを押すと、クライアントパソコンのファイル一覧から指定のファイルを選択してアップロードできます。*1 |
info
- アップロード後にプロセスの再起動が必要なので、ダッシュボードから停止・起動の操作を行ってください。
caution
アップロード先にLuaファイル以外が存在している場合には正常に動作しません。