質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

0回答

1386閲覧

スマートメータとラズパイで通信ができない

ryu422

総合スコア17

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

0グッド

1クリップ

投稿2020/01/13 06:17

ラズベリーパイ3に接続したWi-SUNドングルを用いてスマートメータから電力情報を取得しようと考えています。
「ラズパイ」「スマートメータ」「Wi-SUN」「エコーネット ライト」などのキーワードでヒットする情報を元に通信を試みました。(プログラム作成者は別)

以下の受信用プログラム「re.py」と電力の瞬時値を返すように要求するプログラム「e.py」を用いて
定時の電力積算値と瞬時値を取得しようとしていますが 取得できていない状況にあります。
前回は問題なく取得できていたのですが、測定環境を変えてから安定的に取得できなくなってしまいました。(稀に取得可能)
Bルート開通の申請は済ませてあり、スマートメータとの通信/PANAの認証はできています。
問題点として2点
1.瞬時値を要求するが応答がNot ERXUDP
2.積算値を取得した際「ascii code can't decode byte 0xff in position」のエラーが発生
(おそらく)アップデート後から発生するようになった

ご助言よろしくお願いします

[re.py]

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3# coding: UTF-8 4 5from __future__ import print_function 6 7import sys 8import serial 9import datetime 10import locale 11import time 12from time import sleep 13import commands 14import ConfigParser 15 16iniFile = ConfigParser.SafeConfigParser() 17iniFile.read('config.ini') 18 19 20serialPortDev = '/dev/ttyUSB0' 21ser = serial.Serial(serialPortDev, 115200) 22 23k = 0.1 24 25# url = iniFile.get('server', 'url') 26def influxUp(text) : 27 d = datetime.datetime.today() 28 f = open('power_tmp.txt', 'w') 29 f.write(text) 30 f.close() 31 # commands.getoutput("curl -i XPOST '{0}:8086/write?db=smartmeter' --data-binary @power_tmp.txt".format(url)) 32 commands.getoutput("cat power_tmp.txt >> power-{0:04d}{1:02d}{2:02d}.csv".format(d.year,d.month,d.day)) 33 34def influxUp2(text) : 35 d = datetime.datetime.today() 36 f = open('power_tmp2.txt', 'w') 37 f.write(text) 38 f.close() 39 # commands.getoutput("curl -i XPOST '{0}:8086/write?db=smartmeter' --data-binary @power_tmp.txt".format(url)) 40 commands.getoutput("cat power_tmp2.txt >> power2-{0:04d}{1:02d}{2:02d}.csv".format(d.year,d.month,d.day)) 41 42 43 44 45 46def rcv_e1(res) : 47 if len(res) < 2+1*2 : 48 return 0 49 PDC = res[0:0+2] 50 EDT = res[2:2+2] 51 if EDT == "00" : 52 k = 1 53 print("1kWh") 54 elif EDT == "01" : 55 k = 0.1 56 print("0.1kWh") 57 elif EDT == "02" : 58 k = 0.01 59 print("0.01kWh") 60 elif EDT == "03" : 61 k = 0.001 62 print("0.001kWh") 63 elif EDT == "04" : 64 k = 0.0001 65 print("0.0001kWh") 66 elif EDT == "0A" : 67 k = 10 68 print("10kWh") 69 elif EDT == "0B" : 70 k = 100 71 print("100kWh") 72 elif EDT == "0C" : 73 k = 1000 74 print("1000kWh") 75 elif EDT == "0D" : 76 k = 10000 77 print("10000kWh") 78 else : 79 print(u"unknown: {0}".format(hex)) 80 return 4 81 82def rcv_e7(res) : 83 if len(res) < 2+4*2 : 84 return 0 85 PDC = res[0:0+2] 86 EDT = res[2:] 87 88 89 hexPower = res[2:2+8] 90 intPower = int(hexPower, 16) 91 if intPower > 0x80000000 : 92 intPower = intPower - 0x100000000 93 print(u"瞬時電力計測値") 94 print(u":{0}[W]".format(intPower)) 95 timestamp = int(time.mktime(d.timetuple())) * 1000000000 96 influxUp2("{0:02d}:{1:02d}:{2:02d},{3},{4}\n".format(d.hour,d.minute,d.second,intPower,timestamp)) 97 return 10 98 99def rcv_eaeb(res,prefix) : 100 if len(res) < 2+11*2 : 101 return 0 102 PDC = res[0:0+2] 103 EDT = res[2:] 104 intYear = int(EDT[0:0+4],16) 105 intMonth = int(EDT[4:4+2],16) 106 intDay = int(EDT[6:6+2],16) 107 intHour = int(EDT[8:8+2],16) 108 intMin = int(EDT[10:10+2],16) 109 intSec = int(EDT[12:12+2],16) 110 intValue = int(EDT[14:14+8],16) 111 d = time.strptime(u"{0:04d}/{1:02d}/{2:02d} {3:02d}:{4:02d}:{5:02d}".format(intYear,intMonth,intDay,intHour,intMin,intSec), "%Y/%m/%d %H:%M:%S") 112 timestamp = int(time.mktime(d)) * 1000000000 113 print( u"正方向定時積算電力量") 114 print(u":{0:04d}/{1:02d}/{2:02d} {3:02d}:{4:02d}:{5:02d} {6:.1f}[kWh]".format(intYear,intMonth,intDay,intHour,intMin,intSec,float(intValue)*k)) 115 influxUp("{0}power,{1:02d}:{2:02d}:{3:02d},{4},{5}\n".format(prefix,intHour,intMin,intSec,float(intValue)*k,timestamp)) 116 return 24 117 118 119 120CONNECTION_RETRY = 10 121 122 123for i in range(1, CONNECTION_RETRY + 1): 124 try: 125 while True: 126 line = ser.readline() 127 print(line, end="") 128 d = datetime.datetime.today() 129 print(d) 130 if line.startswith("ERXUDP") : 131 cols = line.strip().split(' ') 132 res = cols[9] 133 ehd1 = res[0:0+2] 134 ehd2 = res[2:2+2] 135 tid = res[4:4+4] 136 EDATA = res[8:] 137 seoj = EDATA[0:0+6] 138 deoj = EDATA[6:6+6] 139 offset = 24 140 if seoj == "028801" : 141 ESV = EDATA[12:12+2] 142 if ESV == "72" or ESV == "73" : 143 OPC = EDATA[14:14+2] 144 iOPC = int(OPC, 16) 145 offset = 16 146 step = 0 147 for index in range(iOPC) : 148 EPC = EDATA[offset:offset+2] 149 offset = offset + 2 150 if EPC == "E7" : 151 step = rcv_e7(EDATA[offset:]) 152 elif EPC == "E1" : 153 step = rcv_e1(EDATA[offset:]) 154 elif EPC == "EA" : 155 step = rcv_eaeb(EDATA[offset:],"+") 156 elif EPC == "EB" : 157 step = rcv_eaeb(EDATA[offset:],"-") 158 else : 159 print(u"Other EPC: {0}".format(EPC)) 160 if step == 0 : 161 break 162 offset = offset + step 163 else : 164 print(u"Other ESV: {0}".format(ESV)) 165 else : 166 print(u"Other SEOJ: {0}".format(seoj)) 167 else : 168 print(u"Not ERXUDP") 169 sleep(3) 170 171 except Exception as e: 172 print("error:{e} retry:{i}/{max}".format(e=e, i=i, max=CONNECTION_RETRY)) 173 sleep(i * 10) 174 else: 175 print("critical") 176

[e.py]

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4from __future__ import print_function 5 6import sys 7sys.path.append("/home/pi") 8import serial 9import time 10#import echonet 11import ConfigParser 12 13iniFile = ConfigParser.SafeConfigParser() 14iniFile.read('/home/pi/pro/bp35c2/config.ini') 15 16# シリアルポート初期化 17serialPortDev = '/dev/ttyUSB0' 18ser = serial.Serial(serialPortDev, 115200) 19 20# コマンド送信 21#command = echonet.generateSmartMeterCommand("\xE7") 22address = iniFile.get('smartmeter', 'address') 23 24command = "SKSENDTO 1 {0} 0E1A 1 0 000E \x10\x81\x00\x01\x05\xFF\x01\x02\x88\x01b\x01\xE7\x00".format(address) 25 26ser.write(command) 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/01/20 10:09

「前回は問題なく取得できていたのですが、測定環境を変えてから安定的に取得できなくなってしまいました」というのですから、測定環境を前の状態に戻せば解決するのではないですか? プログラムで環境を変えることは不可能ですから、まず環境を変える方向で対処すべきだと思います。
ryu422

2020/01/21 02:06

ご対応ありがとうございます。 以前までのスマートメータは一時的に接続させていただいており,現在利用することはできません 接続先をいくつか用意して試しているのですが応答が返ってくるが電力情報として認識できていません 応答の解析を行おうと考えていますが、極力プログラムを変更せずに解決できないかと考えています。 スマートメータ関連で情報収集ができないかと投稿しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問