Python으로 EnOcean의 환경 발전형 문 개폐 센서(STM250J)의 정보를 수집하여 ESP3에 따라 설명합니다.

동기


목표


EnOcean의 환경 발전형 문 개폐 센서(STM250J)의 정보를 고무 파이로 주워 ESP3, ERP2 해석에 따라 주운 데이터입니다.

동기


요즘'환경발전'이라는 단어가 많이 들리기 때문에 환경발전을 이용해 어떤 서비스를 만들 수 있을지 논의하는 과정에서 엔오션의 제품을 소개했기 때문에 실제로 사용해보고 싶어요.

환경


Raspberry Pi 3 Model B
OS:Raspbian 9
전보 수신: USB400J(USB 수신 변환기)
센서: STM250J(도어 개폐 센서)
USB400J를 라즈파에 끼워 센서의 정보를 주워라.Raspbian을 설치하고 네트워크 설정을 완료한 후 각 패키지 업데이트가 완료된 후에 작업을 시작합니다.라즈파의 파이썬 버전은 2.7.13입니다.
물건은 여기에서 구입했습니다.

구현 내용


Python에서 받은 정보를 설명합니다.


다음 소스를 사용하여 USB400J에서 받은 정보를 확인하고 설명합니다.
"EnOcean Serial Protocol3(ESP3)"프로토콜에 따라 날아오는 데이터는 사양에 따라 해석됩니다.
USB400Jtest2.py
# coding: UTF-8

import serial
import binascii
import threading

class Esp3:
    data_length = 0
    data = bytearray(0)
    option_length = 0
    option = bytearray(0)
    packet_type = b'\x00'
    crc8_header = b'\x00'
    crc8_data = b'\x00'

    def print_data(self):
        print('data_length:%s' % self.data_length)
        print('data:%s' % binascii.hexlify(self.data))
        print('option length:%s' % self.option_length)
        print('option:%s' % binascii.hexlify(self.option))
        print('packet type:%s' % binascii.hexlify(self.packet_type))
        print('crc8 header:%s' % binascii.hexlify(self.crc8_header))
        print('crc8 data:%s' % binascii.hexlify(self.crc8_data))

class Erp2Thread(threading.Thread):

    def __init__(self, esp3):
        super(Erp2Thread, self).__init__()
        self.esp3 = esp3

    def run(self):

        sub_telegram = self.esp3.option[0] #オプションからSub Telegramを取り出す。Send: 3 / receive: 1
        dbm = self.esp3.option[1] * (-1) #オプションからdBmを取り出す。正負反転させる

        erp2_header = self.esp3.data[0] #データからヘッダーとなる1バイトを取り出す

        if erp2_header == ord(b'\x21'): #Originator-ID 32 bit nio Destination-ID、No extended header、1BS telegram のものだけ処理する
            originator_id = binascii.hexlify(self.esp3.data[1:5]) #データからセンサーIDを取り出す
            status_code = self.esp3.data[5] #データからセンサーのステータスを取り出す
            button_status = ""
            door_status = ""


            if status_code == ord(b'\x09'):  #センサーのステータスを人間が解る言葉に翻訳する。STM250Jはcloseとopenだけだが、ボタンのセンサーも同様のプロトコルらしい
                button_status = "押されていません。"
                door_status = "閉まっています。"
            elif status_code == ord(b'\x08'):
                button_status = "押されていません。"
                door_status = "開いています。"
            elif status_code == ord(b'\x01'):
                button_status = "押されています。"
                door_status = "閉まっています。"
            elif status_code == ord(b'\x00'):
                button_status = "押されています。"
                door_status = "開いています。"

            print( 'センサーID:%sは%s' % (originator_id , door_status) )

def main():
    ser = serial.Serial('/dev/ttyUSB0',57600,timeout = 1)

    sync_start = False
    while True:

        denbun = ser.read()
        esp3 = Esp3()

        if sync_start or denbun == b'\x55':   #0x55で同期開始
            sync_start = True

            denbun = ser.read()    #データ長を読み込み
            data_length = 256 * ord(denbun)
            denbun = ser.read()
            data_length = data_length + ord(denbun)

            esp3.data_length = data_length

            denbun = ser.read()   #オプション長を読み込み
            option_length = ord(denbun)

            esp3.option_length = option_length

            denbun = ser.read()  #パケットタイプを読み込み
            packet_type = denbun

            esp3.packet_type = packet_type

            denbun = ser.read() #CRC8(Header)を読み込み
            crc8_header = denbun

            esp3.crc8_header = crc8_header

            data = bytearray(data_length)
            for loop_counter in range(data_length):
                denbun = ser.read() #データを読み込む、長さ分読み込む
                data[loop_counter ] = denbun

            esp3.data = data

            option = bytearray(option_length)
            for loop_counter in range(option_length):
                denbun = ser.read() #オプションんを読み込む、長さ分読み込む
                option[loop_counter] = denbun

            esp3.option = option

            denbun = ser.read() #CRC8(Data)を読み込み
            crc8_data = denbun

            esp3.crc8_data = crc8_data

            sync_start = False

        if esp3.packet_type == b'\x0A':  #パケットタイプがERP2のものだけスレッドで処理する

            erp2_thread = Erp2Thread(esp3)

            erp2_thread.start()

main()
실행 결과는 다음과 같다.센서와 자석에 접근하거나 멀리 떨어지면 표시됩니다.동시에 연결할 수도 있습니다.
センサーID:0400e559は閉まっています。
センサーID:0400e559は開いています。
センサーID:0400e559は閉まっています。
センサーID:0400e559は開いています。
センサーID:0400e6aeは閉まっています。
センサーID:0400e563は閉まっています。
センサーID:0400e559は閉まっています。
センサーID:0400e6aeは開いています。
センサーID:0400e563は開いています。
センサーID:0400e559は開いています。
センサーID:0400e559は閉まっています。
センサーID:0400e6aeは閉まっています。
センサーID:0400e6aeは開いています。
センサーID:0400e559は開いています。
センサーID:0400e6aeは閉まっています。
センサーID:0400e563は閉まっています。
センサーID:0400e559は閉まっています。
センサーID:0400e559は開いています。
センサーID:0400e563は開いています。
センサーID:0400e6aeは開いています。
センサーID:0400e6aeは閉まっています。
センサーID:0400e563は閉まっています。
センサーID:0400e6aeは開いています。
センサーID:0400e563は開いています。
センサーID:0400e563は閉まっています。
センサーID:0400e6aeは閉まっています。
センサーID:0400e559は閉まっています。
センサーID:0400e6aeは開いています。
センサーID:0400e563は開いています。
センサーID:0400e559は開いています。

해설


EnOcean 제품군은 여러 사양을 뛰어넘어 제작되었습니다.
층별 인상으로 포착하면 이해하기 쉬울 거예요.최상위 프로토콜은 ESP3입니다.
이번에 사용된 STM250J라는 센서는 ERP2(Enocean Radio Protocol2)라는 하위 프로토콜을 사용하기 때문에 패키지 유형을 식별하고 ERP2의 데이터만 처리한다.
센서가 보내는 데이터의 실현은 EEP(Enocean Equipment Profiles)의 규격에 따라 이루어지기 때문에 EEP에 따라 ERP2가 수신한 데이터를 해석한다.
도형으로 해석된 이미지가 이렇다.
자세한 내용은 공식 문서를 참조하십시오.

참조 문서


ESP3 사양
ERP2 사양
EEP 사양

소감·향후


생각보다 긴 소스가 됐어요.그리고 규격을 이해하는 데 시간이 오래 걸렸어요.
센서의 상태를 얻을 수 있기 때문에 그 후에 데이터를 서비스를 제공하는 서버로 날아간다.

좋은 웹페이지 즐겨찾기