目的/要件
- Python2.7用で作成する
- ECHONET用電文のEDTを自動生成する
- EDTは0~99(0x00~0x63)まで
- 電文はSET用とGET用を交互に生成する
- 開発環境を書いておく
- code中に参考文献を入れてみる
環境
- Win10Pro 64bit 1909
- Anaconda 3
- Spyder 3.3.6
- 編集時最新版は4.0.1だが、なぜか起動後5秒ぐらいで落ちるのでダウングレード
- ダウングレード後は問題なく動作している
- Python 2.7.18
code
MsgGen4py2.py
#! /uer/bin/env python
# -*- coding: utf-8 -*-
from struct import *
# 初期値
setget_flag = True # True:set,False:getの時を表す、0or1のほうが判定速いのかは知らない。
i = 0 # カウンタ
ipv6Addr = "AAAAAAAA" # 適当なダミー値。本物はもっと長いけど今は特に関係ないのでこれでOK。
GET_E2 = "\x10\x81\x12\x34\x05\xFF\x01\x02\x88\x01\x62\x01\xE2\x00"
# 積算電力量計測値履歴1(正方向計測値)(EPC=0xE2, 必須)
# 変更点
# [前] HEX値をstrで書いておく。HEXの状態で結合する。
#SET_E5_base = "1081123405FF010288016201E501"
# [後] decodeされたバイナリをstrで書いておく。バイナリの状態で結合する。
# python3のstr, bytesはpython2ではunicode, strに基本的に対応するため、
# 参考文献:python2.7でint->bytes変換したい
# <https://teratail.com/questions/180228>
SET_E5_BASE = "\x10\x81\x12\x34\x05\xFF\x01\x02\x88\x01\x61\x01\xE2\x01"
# 積算履歴収集日1(0:当日 1~99:前日の日数)(EPC=E5)
# 適用先の都合でwhile文にしています。
while 1:
if setget_flag == True:
# set時の動作
# E5の電文を作成
# 変更点
# [前]bytes.fromhexは3.5から追加なので、2.7で使えない。
# 参考文献:Python 3 で16進数とバイト列の相互変換
# <https://qiita.com/masakielastic/items/21ba9f68ef6c4fd7692d>
#SET_E5 = bytes.fromhex(SET_E5_base + '{:02X}'.format(i))
# [後]packを使ってintからバイナリを生成
# 参考文献:7.3. struct --- 文字列データをパックされたバイナリデータとして解釈する
# <https://docs.python.org/ja/2.7/library/struct.html>
SET_E5 = SET_E5_BASE + pack('b',i) # pack('b',1) --> '\x01'
com1 = "SKSENDTO 1 {0} 0E1A 1 {1:04X} ".format(ipv6Addr, len(SET_E5))
command = com1 + SET_E5
setget_flag = False # フラグをFalse:getに
print(command)
else :
# get時の動作
# E2の電文は毎回一緒なのでそのまま
# set側と同様に修正
com1 = "SKSENDTO 1 {0} 0E1A 1 {1:04X} ".format(ipv6Addr, len(GET_E2))
command = com1 + GET_E2
setget_flag = True # フラグをFalse:getに
i += 1 # 後に送る電文側でインクリメントする
print(command)
# 電文作成が100回になったら糸冬了
if i == 100:
print("100回糸冬了")
# 実機環境でsys.exit()を実行すると、プロセスが残り続けるので気を付けること。
# 実機環境はexit()で良いかと思われる。
sys.exit() #### 糸冬了 ####
結果
SKSENDTO 1 AAAAAAAA 0E1A 1 000F �4��a�
SKSENDTO 1 AAAAAAAA 0E1A 1 000E �4��b�
~省略~
SKSENDTO 1 AAAAAAAA 0E1A 1 000F �4��a�c
SKSENDTO 1 AAAAAAAA 0E1A 1 000E �4��b�
考察
- python2.7用に改修ができた
- 2系と3系の闇を見た
- 開発環境は書いておいてOK。後で参考になる。
- コード中の参考文献は使い分けが肝心
- メリット :記事内を探し回らなくて良い
- デメリット:コードが長くなる⇒短いコードならイケる!
- TipsならばOK、ガッツリ書くならばGitに上げてどうぞ(Qiitaじゃない感)。
参考文献
- 文中参照