EnOceanという通信方式をご存知でしょうか。
EnOceanは通信規格名であり、社名でもあって、極低消費電力で中〜長距離をカバーできるのが特徴です。
特にEnOceanスイッチは電源無しで、スイッチを押す物理的な力で発電して、その電力でデータを送ることができます。
電源無しでデータが送信できるのは魅力的ですよね。
また数十m以上は飛ぶという飛距離についても、無線LANだと複数台の基地局が必要になるケースで安価にシステムを構築できる可能性を秘めています。
EnOceanスイッチが押されたことを検知してCSVファイルに値と時刻を書き込み、それを共有ドライブに保存し、ネットワークにつながるパソコンやケータイなど他の機器から参照したり、ファイル取得できる環境を構築しましたので、その方法を紹介します。
使用機器
Raspberry Pi 4 Model B(8GB RAM)
EnOceanモジュールのIDを調べる
EnOceanのダウンロードサイトからDolphinViewをダウンロード(要登録)してインストールします。
Windows10のみ対応と書かれていますが、Windows11でも動きました。(すべての動作を確認した訳ではありません)
DolphinViewを起動し、下図のUSB400JをUSBポートに差し込みます。
正常に認識されると左上部のプルダウンでCOM〜として見えるようになるので、選択してConnect [F5]を押します。
EnOceanのスイッチを押します。
少し色が異なる端の部分2箇所が送信スイッチになっており、上部の4つ押せる箇所との組み合わせで送信する信号が変わります。
USB400Jがスイッチ信号を受信するとTelegram Logの部分に情報が表示されます。
上図のIDとData(どのボタンが何番か)は、以降のNode-REDのフローで使用するのでメモしておきます。
1回スイッチを押すと2行の情報が表示されます。
スイッチを離したときにも情報が送信されているためのようです。
OpenMediaVaultのインストール
EnOcean信号の受信結果のCSVファイルをファイル共有でPCなどから参照したい場合は、以下の記事に従い、ラズパイにOpenMediaVaultをインストールします。
Node-REDのインストールと起動
以下のコマンドでNode-REDをインストールします。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Python Shellノードをインストールします。
npm install node-red-contrib-pythonshell
設定ファイルpackage.jsonを作成します。
npm init
対話的に質問に回答して以下のようなpackage.jsonがホームディレクトリに作られました。
{ "name": "pi", "version": "1.0.0", "description": "pi user package", "main": "index.js", "dependencies": { "node-red-contrib-pythonshell": "^1.5.4" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "tak6uch1", "license": "MIT" }
GitHubからNode-REDフローサンプルとPythonサンプルスクリプトをダウンロードします。
sudo apt-get install git git clone https://github.com/tak6uch1/enocean_nodered
Node-REDを起動します。
node-red-pi --max-old-space-size=256
パソコンでブラウザを立ち上げ、ラズパイのIPアドレスの1880ポートにアクセスします。
URL例: http://192.168.1.12:1880
右上の三の字マーク→パレットの管理→ノードを追加 から検索窓にpythonなどと入力して、node-red-contrib-pythonshellを探し、ノードを追加を押します。
右上の三の字マーク→読み込み からGitHubからダウンロードしたflows.jsonを読み込むのですが、ここで読まれるファイルはPC上にあるファイルになるので、PCでも以下を実行しておきます。
git clone https://github.com/tak6uch1/enocean_nodered
エラーなくフローが表示できたら成功です。
IDノード内の以下の部分は、DolphinViewで調べたIDを入れます。
pythonshellノードは以下のようにしてあるので、ファイルパスなどをお使いの環境に合わせて変更してください。
addCsv.pyは以下のようになっているので、PASSWORDの部分をpiユーザのパスワードに、各種パスをお使いの環境に合わせて変更してお使いください。
import re import datetime import subprocess passwd = 'PASSWORD\n'.encode() s = str(input()) s = re.sub('^.*: *', '', s) s = re.sub(' *}$', '', s) if int(s) > 0: dt_now = datetime.datetime.now() dt_str = dt_now.strftime('%Y/%m/%d %H:%M:%S') out_str = dt_str + "," + s + "\n" with open('/home/pi/work/enocean_nodered/button.csv', mode='a') as f: f.write(out_str) subprocess.run(('sudo', '-S', 'cp', '/home/pi/work/enocean_nodered/button.csv', '/srv/dev-disk-by-uuid-57c7c9da-d3c7-4f6c-82ab-52a5fa017821/nas_user/nas_user/'), input=passwd, check=True)
subprocess.runでsudoでファイルコピーをしているのは、OpenMediaVaultのドライブに書き込むためにroot権限が必要になるためです。
/srv/dev-disk…で始まる共有ドライブのファイルパスはOpenMediaVaultのStorage→Shared Folders から確認できます。
フローができたら、デプロイを押します。
ラズパイ起動時に自動的にNode-REDを立ち上げるには以下のコマンドを実行してシャットダウンします。
sudo systemctl enable nodered.service
次回以降自動的にNode-REDが立ち上がります。
自動的に立ち上げないようにするには以下のコマンドを実行します。
sudo systemctl disable nodered.service
動作確認
USB400JをラズパイのUSB端子に差し込んで起動します。
パソコンのブラウザでNode-REDに接続し、右上の方にある虫のマークを押してデバッグモードにします。
EnOceanスイッチモジュールを押して { val: 1 } のようにスイッチに応じた値が表示されることを確認します。
そして、button.csvが以下のようにできていて、共有ドライブにもコピーされていて、ネットワークドライブからも参照できることを確認します。
$ cat button.csv 2022/02/14 01:19:05,2 2022/02/14 01:19:06,1 2022/02/14 01:19:12,1 2022/02/14 01:19:13,2 2022/02/14 01:19:25,1 2022/02/14 01:19:31,2
まとめ
EnOceanスイッチが押されたことを検知してCSVファイルに値と時刻を書き込み、それを共有ドライブに保存し、ネットワークにつながるパソコンやケータイなど他の機器から参照したり、ファイル取得できる環境を構築しました。
EnOceanスイッチは電源無しで、スイッチを押す物理的な力で発電して、その電力でデータを送るというのが、用途によっては非常に有用だと思います。
また数十mは飛ぶという飛距離についても、無線LANだと複数台の基地局が必要になるケースで安価にシステムを構築できる可能性を秘めていると感じます。
みなさまも、EnOceanを活かしてさまざまな工作にチャレンジしてみてはいかがでしょうか。
書籍紹介
サンプルが多数あり、初心者がNode-REDでビジュアルプログラミングを学びやすい作りになっています。
参考文献
Node-RED User Group Japan/Raspberry Piで実行する(https://nodered.jp/docs/getting-started/raspberrypi)
Node-RED+python-shellでNode-REDからpythonを呼び出すノードを自作する(https://qiita.com/yasunari_matsuo/items/411affc9893211a9b523)