目的
- Pyhon3で書く
- ECHONET用電文のEDTを自動生成する
- EDTは0~99(0x00~0x63)まで
- 電文はSET用とGET用を交互に生成する
- qiitaに投稿してみる
code
MessageGenerator4ECHONET-Lite.py
#! /uer/bin/env python
# -*- coding: utf-8 -*-
import sys
# 初期値
setget_flag = True # True:set,False:getの時を表す、0or1のほうが判定速いのかは知らない。
i = 0 # カウンタ
ipv6Addr = "AAAAAAAA" # ダミー値。本当はもっと長いけど、今は特に関係ないのでこのまま。
GET_E2 = b"\x10\x81\x12\x34\x05\xFF\x01\x02\x88\x01\x62\x01\xE2\x00"
# 積算電力量計測値履歴1(正方向計測値)(EPC=0xE2)
SET_E5_base = "1081123405FF010288016201E501"
# 積算履歴収集日1(0:当日 1~99:前日の日数)(EPC=E5)
# 適用先の都合でwhile文にしています
while 1:
if setget_flag == True:
# set時の動作
# E5の電文を作成
SET_E5 = bytes.fromhex(SET_E5_base + '{:02X}'.format(i))
command = "SKSENDTO 1 {0} 0E1A 1 {1:04X} {2}".format(ipv6Addr, len(SET_E5), SET_E5)
setget_flag = False # フラグをFalse:getに
print(command)
else :
# get時の動作
# E2の電文は毎回一緒なのでそのまま
command = "SKSENDTO 1 {0} 0E1A 1 {1:04X} {2}".format(ipv6Addr, len(GET_E2), GET_E2)
setget_flag = True # フラグをTrue:setに
i += 1 # 後に送る電文側でインクリメントする
print(command)
# 電文作成が100回になったら糸冬了
if i == 100:
print("100回糸冬了")
sys.exit() #### 糸冬了 ####
結果
SKSENDTO 1 AAAAAAAA 0E1A 1 000F b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe5\x01\x00'
SKSENDTO 1 AAAAAAAA 0E1A 1 000E b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe2\x00'
~省略~
SKSENDTO 1 AAAAAAAA 0E1A 1 000F b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe5\x01c'
SKSENDTO 1 AAAAAAAA 0E1A 1 000E b'\x10\x81\x124\x05\xff\x01\x02\x88\x01b\x01\xe2\x00'
100回糸冬了
考察
- ECHONET用電文のEDTを自動生成できた
- EDTは0~99(0x00~0x63)まで対応した
- 電文はSET用とGET用を交互に生成した
- qiitaに投稿した
- Markdown記法に少し慣れた
- はてブよりもコードは見やすい
- コメントの書き方がわからんかったので、資料を参考にしてみた
参考資料
追記
- 元のコードをPython3用に書き直したが動かず。
- Python3はバイナリデータの扱いが下手なのか・・・?