at_yukari.hara
2021年2月1日 12時55分
Armadillo-640で、ドングルタイプのEnOcean受信機を使って開閉センサのデータを取得してみました。
Node-REDを使う方法は以下のブログをご参照ください。
Armadillo-640:ドングルタイプのEnOcean受信機を使って開閉センサのデータを取得してみた(Node-RED編)
使用するもの
手順
1.必要なパッケージ、ライブラリのインストール
以下のコマンドを実行し、必要なパッケージをインストールします。
root@armadillo:~# apt-get update
root@armadillo:~# apt-get upgrade
root@armadillo:~# apt-get install python
root@armadillo:~# apt-get install python-pip
root@armadillo:~# pip install pyserial
2.Pythonプログラムの作成
下記の内容のファイルを作成します。
(後述の説明上、このファイル名を"enocean.py"とします。)
以下のコードはPythonでEnOceanの電文を読み取るを参考にさせていただきました。
from serial import *
from sys import exit
from datetime import datetime
port = '/dev/ttyUSB0'
try:
ser = Serial(port, 57600)
print('open serial port: %s' % port)
except:
print('cannot open serial port: %s' % port)
exit(1)
cnt,dataLen,optLen = 0,0,0
telegraph,headList,dataList,optList = [],[],[],[]
ready = True
while True:
s = ser.read().encode('hex')
if s == '55' and ready:
cnt,dataLen,optLen = 0,0,0
telegraph,headList,dataList,optList = [],[],[],[]
ready = False
print '=========='
cnt += 1
telegraph.append(s)
if 2 <= cnt <= 5: # header
headList.append(s)
if cnt == 5:
dataLen = int(headList[1],16)
optLen = int(headList[2],16)
if 7 <= cnt <= (6+dataLen): # data
dataList.append(s)
if (7+dataLen) <= cnt <= (6+dataLen+optLen): # optional data
optList.append(s)
if cnt == (6+dataLen+optLen+1):
ready = True
dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print dt
print ':'.join(telegraph)
print 'head...', ':'.join(headList)
print 'data...', ':'.join(dataList), '(length=%d)' % dataLen
print 'opt ...', ':'.join(optList), '(length=%d)' % optLen
sensorId = ':'.join(dataList[1:5])
print 'sid ...', sensorId
if sensorId == 'XX:XX:XX:XX': #センサーのSIDを入力
if dataList[5] == '08':
action = 'open'
elif dataList[5] == '09':
action = 'close'
else:
action = 'non'
print ('door...', action)
else:
continue
3.実行
作成した"enocean.py"を下記のようにpythonで実行し、 開閉センサーを動作させると、センサーの情報と、開閉情報がコンソールに表示されます。
root@armadillo:~# python enocean.py
==========
2021-01-25 16:36:02
55:00:07:02:0a:0a:21:05:17:9a:02:09:c1:01:29:ca
head... 00:07:02:0a
data... 21:05:17:9a:02:09:c1 (length=7)
opt ... 01:29 (length=2)
sid ... 05:17:9a:02
('door...', 'close')
==========
2021-01-25 16:36:02
55:00:07:02:0a:0a:21:05:17:9a:02:08:c6:01:29:ca
head... 00:07:02:0a
data... 21:05:17:9a:02:08:c6 (length=7)
opt ... 01:29 (length=2)
sid ... 05:17:9a:02
('door...', 'open')