ブログ

Armadillo-640:ドングルタイプのEnOcean受信機を使って開閉センサのデータを取得してみた(Python編)

at_yukari.hara
2021年2月1日 12時55分

Armadillo-640で、ドングルタイプのEnOcean受信機を使って開閉センサのデータを取得してみました。 Node-REDを使う方法は以下のブログをご参照ください。
Armadillo-640:ドングルタイプのEnOcean受信機を使って開閉センサのデータを取得してみた(Node-RED編)

使用するもの

     
  • Armadillo-640
  •  
  • 開閉センサ:CS-EO429J
  •  
  • EnOcean受信機:ROHM USB400J

手順

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