2023年12月26日火曜日

ダイソーのUSB Type Cケーブルを買ってみた。

 久しぶりにダイソーに行ったらUSB Type Cケーブルが売っていたので試しに買ってみた。

何種類かあったんだけど100円の5V3Aタイプにしてみた。
セリアで前に60Wタイプを購入したときはデータ転送ができなかったんだけど、これは5V3Aのかわりにデータ転送ができる感じかな。300円商品になるとどっちもできるのが売っていたけど、おそらくケーブルの太さ=銅の量で電流と値段が決まっていそう。
青とシルバーの在庫があった。ケーブルはツルツルしていて少し硬い感じ。やすいケーブルってこんな感じだよね。

そんでもって試しに60WなPD充電器でノートパソコンに繋いでみたら(良い子は真似しないほうがいいかも)ちゃんと充電できた。ってことはこのケーブルの中身は6本でUSB2.0が4本+CC1とCC2で2本結線されてそう。前に買った給電専用のセリアのケーブルは電源2本とCC1とCC2が結線されている感じだったので、おそらく通信用のケーブルが結線されている分電流控えめって感じなのかな。

コネクタ自体はカチッと挿さるのでとりあえずはUSB2.0デバイス用としてはまずまずかも。


2023年12月9日土曜日

PJ-1103Aをtinytuyaで使ってみた。

 前回登録したクランプ式電力計、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を直結することを考えてもすごくコスパ高いと思う。