2024年5月3日金曜日

ESP32でクランプ式電力計のデータを吸い出してみた。

 前に設定を頼まれたWiFiクランプ式電力計なんだけどアプリだと使いづらいということでESP32を使ってデータをクラウドに蓄積できないかという検討をしてみることに。tuyaのクラウドでAPI使おうとすると有料だし…

tinytuyaがESP32で動くと良かったんだけど、暗号化系のライブラリの問題で厳しいようで、ESP8266からtinytuyaみたいにローカルでデータを取得できるようにしている人がいたのでESP32で試してみた。

使用させてもらったのはEspTuya。ほかにCryptoArduinoJsonが必要だけど全部IDEからインストールできた。

このスケッチ、ところどころ不完全なのでそのままではビルドできなかった。

195行目のところで、"while (WiFi.status() != WL_CONNECTED"ってなってるところは次の行に.............ってなってるレベルで不完全なのでこの部分は

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print('.');
  }

のように通常よくあるサンプルみたいに修正。

そんでもって201行目のloctimestamp  = epochTime ....;  ってところも中途半端なのでNTPから時間を取得するように修正。

const long gmtOffset_sec = 9 * 3600;
const int daylightOffset_sec = 0;
const char* ntpServer = "ntp.nict.jp";

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
loctimestamp = time(NULL);

48行目の#include <ESP8266WiFi.h>はESP32用に#include <WiFi.h>に変更。そうするとFunctions.inoの272行目の

while ( _client.connected() && _client.availableForWrite() < len ) delay(10);

ってところで使われてるavailableForWrite()がESP32だと未実装なのでこの行をまるっと

while ( !_client.connected() ) delay(10);

のように変更。

あとはデバイスに合わせてEspTuya.inoのsDev disj1のところにLocal KeyをAscciからHEXに変換したものを入力するのとIPを修正。ほかのsDevの行はコメントアウト(loopの中のTest device2と3もコメントアウト)

とりあえずこれでWiFiのSSIDとパスワードをPJ-1103Aと同じにしてESP32に書き込んでみたらうまく動いた。getStatus()だとtinytuyaでDPSをプリントするのと同じ感じでプリントされるのであとはDPSとデータの対比表をつかってデータを抽出すればいけそう。

ESP32ならLCDつけて常時モニタリングしてもいいし、ついでにAmbientにアップロードもできたりして便利そう。PJ-1103AとLCD付きのESP32を組み合わせればデマンドとかを確認できるスマートメーターみたいなのを作れそう。

とりあえずデータをパースできるようにちょっと研究中。

0 件のコメント:

コメントを投稿