クランプオンパワーロガーから計測値を取得する

ある装置の消費電力を計測したいと思った場合、いろいろな計測方法があります。
測定対象が交流で、ある程度大きな電力を計測したいなら、電力計を用いるのが一般的です。
電力計は、装置への配線の電流と電圧を計測し、掛け合わせることで電力を算出できますが、この電圧計測をするには、一般的に電気が流れていて露出している箇所に電圧計測線を取り付ける必要があり、感電事故の危険があります。

感電事故を防ぎ安全に電力を計測するための計測器として、電力ケーブルの上から電圧を計測できる電力ロガーがあります。
それが、日置電機製のPW3365（クランプオンパワーロガー）です。
電圧も電流も、ケーブルの上からセンサーでクランプする（挟む）だけ計測できるのです。
※電圧計測をワニぐちクリップで行うタイプもあります

このクランプオンパワーロガーを遠方の実験場などに設置し、遠隔で計測する方法として以下があります。
1. GENNECT Oneを使い、LAN経由で管理する（あるいはGENNECT Cloud）
2. クランプオンパワーにWebアクセスする
3. TCP/IPでコマンド操作する

もっとも簡単なのは1のメーカ公式ソフトであるGENNECT Oneなのですが、現状Windowsにしか対応していません。
また、計測したデータをAWSやAzure等のクラウドサービスで連携するのが難しいです。

そこで、本稿では3のTCP/IPでクランプオンパワーをコマンド操作し、遠隔制御してみます。
また、リアルタイムの計測値を取得してみます。

## 本体の設置
とりあえず家の分電盤に設置してみました。
写真は分電盤のカバーを取り外した状態です。
3本の電線に対して、電圧計測センサ3本と、電流計測クランプ（先端がドーナツのセンサ）2本を使います。
計測器の取り付けには、（ChatGPTいわく）電気工事士の資格や低圧・高圧電気取扱業務特別教育の受講はいらないみたいですが、もしみなさんがこのような作業をされる際には十分に気をつけてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/9e689763-09f0-0d12-2127-ac0afe8d26f3.png)

最近の分電盤は、カバーを外しても、電気の流れている金属の露出が非常に少なくなっています。
そのため、電圧センサを金属に接触させるタイプであれば、どこに接触させればいいか迷ってしまいます。
このクランプオンパワーロガーであれば、ケーブルの上から挟むだけなので、非常に楽です。

## 電源をつけてIPアドレスを設定
計測器本体の電源をつけ、画面の表示の通り、センサを正しく取り付けされていることを確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/27623a48-d38c-2aa3-695c-e3143251980d.png)

次に、計測値の画面を表示し、それっぽい計測値になっているか確認しましょう。
この計測によると、現在の私の家の消費電力は約200Wということになります。
まあそんなもんでしょう。
位相（PF）が「進み」となっているのが気になりますが、正しい計測であると仮定して先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/06a54753-ba05-3307-08ea-e9f57e135aae.png)

このクランプオンパワーは、IPアドレスが自動的に割り当てられるDHCPに対応していません。
そのため、本体を操作してIPアドレスを適切に設定しましょう。
私の家のネットワーク上では、「192.168.0.31」としておきました。

## TCP/IPのコマンドをマニュアルで確認

TCP/IPを使った通信コマンドのマニュアルは以下にあります。

https://www.hioki.co.jp/file/cmw/hdInstructionManual/95011/pdf/?action=browser

基本的には、ASCIIコードを文字列でコマンドを記述し、最後に改行コードを付けて、TCP/IPで送信し、その後、応答を受信します。

例えば、クランプオンパワーロガーの本体IDを確認するには、
`*IDN?⏎`
と送信すると、
`HIOKI,PW3365-10,100000000,V2.11⏎`　（製造番号はダミーにしています）
と応答があります。（`⏎`は改行記号）

注意点として、必ずクランプオンパワーロガー本体のフォームウェアを最新にしてください。
いろいろ実験していたところ、昔のバージョンでは正常な応答をしてくれないケースがありました。

## PythonでTCP/IP
では、どのようにしてTCP/IPで送受信すればよろしいのでしょうか。
簡単にできるツールがあるか探したのですがなかったため、PythonでTCP/IP通信してみます。
コマンド自体は「IEEE488.2」を拡張したものですので、頑張って探せばあったかもしれません。

```Python:PW3365Tools.py
# -*- coding : UTF-8 -*-
import socket

HOST = "192.168.0.31"
PORT = 3365

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.connect((HOST, PORT))

    while True:
        # コマンドを受け取る
        # コマンド例: *IDN? MEASURE:POWER? :BATTERY?
        data = input('> ')
        if not data:
            break
        # コマンドを送信
        sock.send((data+'\n').encode('utf-8'))
        # コマンドを受信
        data = bytes()
        while True:
            buffer = sock.recv(512)
            data = data + buffer
            if buffer.find(b'\n') >= 0:
                break
        print(data.decode('utf-8'), end='')
```

プログラムに記載の`HOST`は環境に合わせて変えてください。
このプログラムを実行すると、コマンド入力画面になります。
ここで、`*IDN?`を入力し改行します。
すると、本体ID等の情報が応答されます。
何も入力せず改行すると、プログラムの実行が終了します。

```
> *IDN?                
HIOKI,PW3365-10,100000000,V2.11
>
```
（製造番号はダミーにしています）

## 計測値を取得する
TCP/IPで計測値を取得するには、まず通信でほしい計測項目を設定します。
詳細はコマンドマニュアルをご確認いただくとして、とりあえずマニュアルに載っていたコマンド例を実行してみます。
また、何の計測項目を示す値かを表示するため、ヘッダ表示をONにします。
最後に、`MEASURE:POWER?`コマンドで計測値を出力します。
```
> :MEAS:ITEM:POW 15,207,247,31,15,15
ALL RIGHT
> :HEADER ON
ALL RIGHT
> :MEAS:POW?      
Date 2023,12,17;Time 23,23,14;Status 00000000;U1_Ins 98.9E+00;以下2000文字以上続くため略
>
```

計測項目のヘッダの意味はマニュアルの最後のほうに載っています。
例えば、「U1_Ins」は「電圧実効値、瞬時値、U1線」を意味し、これが「98.9V」でした。
この計測項目やヘッダの設定は、電源ON/OFFの度にリセットされるため、再度設定が必要です。

このように取得した値を、あとはAWS IoT CoreやAzure IoT Hubに送信し、クラウド側でいい感じに処理すれば、電力を遠隔監視できるようになります。

ぜひ、ある装置の消費電力を計測するのに、クランプオンパワーロガーの計測値をTCP/IPで取得し、クラウドと連携してみてください。

## ちなみに
このクランプオンパワー自体が結構電気を消費します。
手元のワットチェッカーでは4Wくらいを示していたので、家の消費電力200Wのうち2%くらいを占めます。