前回登録したクランプ式電力計、PJ-1103AのデータをPythonから取ってみることに。tuyaのSmart Homeだけだとなんか使いにくいらしいし…
今回はThonnyを使ってPythonでtinytuyaライブラリを使用してワットチェッカーのデータを吸い出してみた。
まずはThonnyのシステムシェルからtinytuyaをインストール。Windowsのファイヤーウォールを一旦切った状態で
python -m tinytuya scan
をしてみる。するとデバイスが表示された。しかしLocal keyがないためデータが取得できない。iot.tuya.comで開発用アカウントを作ってやる必要があるっぽい。
登録したらCloudのCloud ServicesからIoT Coreを有効にして、CloudのDevelopmentで適当なプロジェクトを作成する。このときSmart Homeアプリのアカウントが日本になっている場合は"Western America Data Center"を選択する。
プロジェクトを開いたら右上のGuide ModeのCloseをクリックしてDevicesのLink App AccountでSmart HomeアカウントとQRコードでリンクさせる。これでデバイスのリストにWIFI dual meterが出てくるはず。
あとはpythonのシステムシェルに戻って
python -m tinytuya wizard
を実行して、先程のプロジェクトのAuthorization KeyとPJ-1103AのDevice IDをコピペ。サーバーはusと入力すればOK。そうするとJSON方式で色々表示される中、keyがゲットできるはず。ちなみにproduct_idはbbcg1hrkrj5rifsdで、modelはPJ1103Bになっていた。
あとはこれでPythonからデータが取れるようになった。
DPSとデータの対比表はこんな感じらしい。
これをベースに簡単なPythonツールを作成してみた。
# -*- coding:utf-8 -*-
import tinytuya
import tkinter
import time
import threading
# 更新する間隔
INTERVAL = 3
d = tinytuya.Device('Device ID', '192.168.x.xxx', 'Local Key', version=3.4)
def poll():
while 1:
data = d.status()
#print('Device status: %r' % data)
print(data["dps"]['112']/10)
label.config(text="電圧:" + str(data["dps"]['112']/10) + "V")
label1.config(text="周波数:" + str(data["dps"]['111']/100) + "Hz")
label2.config(text="電流:" + str(data["dps"]['113']/1000 + data["dps"]['114']/1000) + "A")
label3.config(text="(" + str(data["dps"]['113']/1000) + "A+" + str(data["dps"]['114']/1000) + "A)")
label4.config(text="電力:" + str(data["dps"]['115']/10) + "W")
time.sleep(INTERVAL)
def start():
global app
th = threading.Thread(target=poll)# スレッドインスタンス生成
th.start()# スレッドスタート
# メインウィンドウ作成
app = tkinter.Tk()
app.title("電力")
app.geometry("500x500")
label = tkinter.Label(
app,
text="0.00",
width=12,
font=("", 50, "bold"),
)
label.pack(padx=10)
label1 = tkinter.Label(
app,
text="0.00",
width=12,
font=("", 50, "bold"),
)
label1.pack(padx=10)
label2 = tkinter.Label(
app,
text="0.00",
width=12,
font=("", 50, "bold"),
)
label2.pack(padx=10)
label3 = tkinter.Label(
app,
text="0.00",
width=12,
font=("", 50, "bold"),
)
label3.pack(padx=10)
label4 = tkinter.Label(
app,
text="0.00",
width=12,
font=("", 50, "bold"),
)
label4.pack(padx=10)
start()
app.mainloop()
今回は単純にリアルタイムデータを確認するだけだけど、ラズパイとかを使ってAmbientとかに蓄積しても面白いかも。
たしかにこのクランプ電流計、Local Keyを取得するのはちょっと面倒かもしれないけど、ラズパイとかでCTセンサを直接繋いで電力測定するよりも安全で楽かもしれない。内部ではHLW8112という交流の電圧や電流をSPI通信で取得できるICを使ってるみたいだけど、絶縁してラズパイにそのICを直結することを考えてもすごくコスパ高いと思う。

0 件のコメント:
コメントを投稿