Androidのメモとか

ポキオの日記です。今日も遅延してない。

ESP8266で自宅での電力消費量を測ってみようと思った(パート5、追記あり)

前回。

relativelayout.hatenablog.com

今回はLINE通知機能を追加

前回から間が空いてしまいましたが、折角なので、ちょっと改造。消費電力が一定以上になったら、IFTTT経由でLINEに通知するようにしてみました。

回路はいつもどおりこんな感じ。

ESP8266

電源は3.3Vにアップコンして供給、イヤホンジャックにはクランプ電流センサーを接続します。

ESP8266

こんな感じで、家の分電盤に接続。

ESP8266 電力メーター

コーディングはこんな感じ

いつもどおりのクソコードです。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

char ssid[] = "xxxxxxxx";
char password[] = "yyyyyyyy";

char host[] = "maker.ifttt.com";
char url[] = "/trigger/TRIGGER_NAME/with/key/KEY";
int port = 80;
int power = D1;

double threshold = 20.0; // しきい値は20A。それ以上の場合はLINE通知する。
int trial = 0; // しきい値を超えていなくても、死活監視のため6時間おきくらいにLINE通知する。
int checkInterval = 60 * 1000; // 1分おきに計測
int notifyInterval = 6 * 60; // 6時間くらいおきには必ずLINE通知する

void setup() {
  pinMode(power, OUTPUT);
  digitalWrite(power, LOW);

  Serial.begin(115200);
  Serial.println("");
}

void loop() {
  trial++;

  digitalWrite(power, HIGH);
  double current = getCurrent();
  digitalWrite(power, LOW);

  Serial.println(current);

  if (current > threshold || trial >= notifyInterval) {
    connectWifi();
    httpPostJson(current);
    disconnectWifi();
    trial = 0;
  }

  delay(checkInterval);
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println("connected!");
}

void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("disconnected!");
}

double getCurrent() {
  Serial.println("get current...");
  long total = 0.0;
  int sample = 200;

  for (int i = 0; i < sample; i++) {
    int sensorValue = analogRead(A0);
    float voltage = sensorValue * (3.2 / 1023.0);
    int voltageInt = voltage * 100;
    int current = (voltageInt - 158) * 30;
    total += current * current;
  }

  float result = total / sample / 10000.0;

  return sqrt(result);
}

void httpPostJson(double data) {
  WiFiClient wifiClient;
  String json = "{\"value1\":\"" + String(data) + "\"}";


  if (!wifiClient.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }

  Serial.println("http post...");
  wifiClient.println(String("POST ")  + url + " HTTP/1.1");
  wifiClient.println(String("Host: ") + host);
  wifiClient.println("Cache-Control: no-cache");
  wifiClient.println("Content-Type: application/JSON");
  wifiClient.print("Content-Length: ");
  wifiClient.println(json.length());
  wifiClient.println();
  wifiClient.println(json);
}

IFTTT側の設定

IFTTT側も設定しておきます、予めLINEとIFTTTを連携しておいて、なにかIFTTTに大してHTTP POSTされたら、LINE通知がされるようにします。

ESP8266 電力メーター

いざ稼働開始

取り敢えず、しきい値を0Aにして、1分おきにLINE通知されるようにしてみます。

ESP8266 電力メーター

いっぱい来た・・・。ただ、リアルタイム性はなさそうな感じ・・・。試しに、しきい値を20Aに戻して、通常運転してみました。IFTTT→LINEに通知する際に、トリガーがあった時刻も含めるようにしてテスト・・・。

ESP8266 電力メーター

うーん、トリガーから30〜45分経って、やっとLINEに通知されました。ボトルネックは何処なのかはわかりませんが、やっぱりリアルタイム性は期待できそうにありません。

追記

IFTTTのKEYを更新したら、遅延がなくなりました。 快適快適!

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。