LoginSignup
0
1

More than 3 years have passed since last update.

ECHONET用電文のEDTを自動生成(2回目)

Posted at

目的/要件

  • 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じゃない感)。

参考文献

  • 文中参照
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1