EnOcean信号をラズパイで受信してCSVに保存、OpenMediaVaultでファイル共有

スポンサーリンク
EnOcean

EnOceanという通信方式をご存知でしょうか。

EnOceanは通信規格名であり、社名でもあって、極低消費電力で中〜長距離をカバーできるのが特徴です。

特にEnOceanスイッチは電源無しで、スイッチを押す物理的な力で発電して、その電力でデータを送ることができます。

電源無しでデータが送信できるのは魅力的ですよね。

また数十m以上は飛ぶという飛距離についても、無線LANだと複数台の基地局が必要になるケースで安価にシステムを構築できる可能性を秘めています。

EnOceanスイッチが押されたことを検知してCSVファイルに値と時刻を書き込み、それを共有ドライブに保存し、ネットワークにつながるパソコンやケータイなど他の機器から参照したり、ファイル取得できる環境を構築しましたので、その方法を紹介します。

使用機器

Raspberry Pi 4 Model B(8GB RAM)

EnOcean USB400J 受信用USBモジュール

EnOcean PTM210J スイッチモジュール

EnOceanモジュールのIDを調べる

EnOceanのダウンロードサイトからDolphinViewをダウンロード(要登録)してインストールします。

Windows10のみ対応と書かれていますが、Windows11でも動きました。(すべての動作を確認した訳ではありません)

DolphinViewを起動し、下図のUSB400JをUSBポートに差し込みます。

USB400J

正常に認識されると左上部のプルダウンでCOM〜として見えるようになるので、選択してConnect [F5]を押します。

DolphinView Top

EnOceanのスイッチを押します。

少し色が異なる端の部分2箇所が送信スイッチになっており、上部の4つ押せる箇所との組み合わせで送信する信号が変わります。

EnOcean Switch

USB400Jがスイッチ信号を受信するとTelegram Logの部分に情報が表示されます。

DolphinView ID

上図のIDとData(どのボタンが何番か)は、以降のNode-REDのフローで使用するのでメモしておきます。

1回スイッチを押すと2行の情報が表示されます。

スイッチを離したときにも情報が送信されているためのようです。

OpenMediaVaultのインストール

EnOcean信号の受信結果のCSVファイルをファイル共有でPCなどから参照したい場合は、以下の記事に従い、ラズパイにOpenMediaVaultをインストールします。

OpenMediaVaultを使用するにはRaspbian OS Liteをインストールする必要がありますのでご注意ください。

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を探し、ノードを追加を押します。

Install pythonshell node

右上の三の字マーク→読み込み からGitHubからダウンロードしたflows.jsonを読み込むのですが、ここで読まれるファイルはPC上にあるファイルになるので、PCでも以下を実行しておきます。

git clone https://github.com/tak6uch1/enocean_nodered
Read flows.json

エラーなくフローが表示できたら成功です。

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 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

タイトルとURLをコピーしました