こんにちは。ぼへみあです。
今年の夏は暑かったですね。エアコンが大活躍だったわけですが、多くの家庭で 「設定27度なのにエアコン冷えすぎてない?」と感じる人がいたと思います。 個人差の場合もありますが、うちの場合は計測してみると、明らかに冷えすぎていました。
エアコンの制御の仕組み
エアコンはリモコンで設定温度を27度とかにして信号を送ると、その温度になるように稼働します。 エアコンの中に気温を計測するセンサがあり、部屋の気温を設定温度に近づけようと動きます。
以下は26度設定でエアコンをつけた場合の気温の推移です。計測方法などは後述します。
この場合、24.7度付近でギザギザしながら安定していることが分かります。 このときのエアコンの消費電力をグラフにすると、このようになります。
エアコン消費電力
稼働していないときは消費電力がほとんど0になり、稼働しているときは150W程度消費しているようです。 重ねてみるとはっきり分かりますが、気温が一定以上の時にエアコンが稼働し、そうでない時には稼働を止めていることが分かります。 またx軸とグラフで囲われた面積が消費電力になります。エアコンを付けっ放しにするほうが安いのは、こういうギザギザが続く状態の時かと思われます。
少なくとも自宅のエアコン(2013年ダイキン製)は、一定気温より暑い→冷やす、一定気温より寒い→何もしない、という 典型的なオンオフ制御という方式で制御されていることがわかります。そうじゃないときもありますが。
非常にシンプルな制御方法ですが、目標値が1つで制御するパラメータが1つならば十分な制御方法かと思います。 しかし自宅を計測していると、明らかにオンオフ制御が機能していない場合が多くありました。
エアコンの室温制御が働いてない!!
こちらをご覧ください。エアコン26度設定での、部屋の高さ1mでの気温とエアコンの消費電力です。
なぜか朝の8時ごろからエアコンが強く働き出し、気温が23度まで下がる状況が17時ごろまで続いています。 明らかに寒いです。オンオフ制御が効いていません。
なぜオンオフ制御が効いていないか考えたところ、
「エアコンの室温センサの値がおかしいのでは」という仮説にたどり着きます。
エアコンが高い場所にあることや、自室の日当たりなどがセンサに悪影響を及ぼしている可能性が十分に考えられます。
部屋の状況とセンサ
- 都内
- 鉄骨マンション
- 築35年ほど
- 1K 8畳
- 3階建ての3階
- 東南の2面採光の角部屋
- 日差しを遮るあまり高い建物がない
このようなステータスなので、日当たりが良すぎるので、夏は暑く、冬は温かい部屋です。
そこで、エアコンのセンサとほぼ同高度、同位置にも自作のセンサを設置し、エアコンのセンサが計測しているであろう気温を同時に計測しました。
うちのダイキンのエアコンは、この部分から空気を取り込み、気温を測定しているようです。
ですので、このようにエアコンの付近のカーテンレールに自作センサを置いて、5分おきに計測します。
計測に使用したデバイス
細かい技術に興味のない方は読み飛ばしてください。
こういうセンサで気温・湿度・大気圧を計測しました。
ESP8266というWifi接続が手軽にできるマイコン(650円)に、BME280というセンサ(1080円)を繋げています。
回路はこんな感じです。
ESP8266にはDeep Sleepモードというスリープがあり、電力消費を抑えて長時間電池駆動できます。 単三電池3本で動くようにしました。3.3V電源でも動きます。
このデバイスからAmbientというIoTデータの可視化してくれるサービスに投げて保存しておきます。 Ambientでは、データを投げておくといい感じでグラフにしてくれるので、モニタリングに便利です。
そして以下のコードを書き込むことで、5分に1回、Wifiに接続し、BME280で計測した気温・湿度・大気圧をAmbientに送信します。
#include <ESP8266WiFi.h> | |
#include <Wire.h> | |
#include <SPI.h> | |
#include "BME280_MOD-1022.h" | |
#include "Ambient.h" | |
extern "C" { | |
#include "user_interface.h" | |
} | |
const char* ssid = "xxxxxxxxxx"; // Wifiの SSID | |
const char* password = "xxxxxxxxxxxx"; // Wifiのパスワード | |
unsigned int channelId = xxxx; | |
const char* writeKey = "xxxxxxxxxxxx"; | |
void printFormattedFloat(float val) { | |
char buffer[10]; | |
dtostrf(val, 4, 2, buffer); | |
Serial.print(buffer); | |
} | |
void setup() { | |
Serial.begin(115200); | |
Wire.begin(13, 14); delay(10); // SDA=GPIO_13,SCL=GPIO_14 | |
BME280.readCompensationParams(); // read the NVM compensation parameters | |
BME280.writeOversamplingTemperature(os1x); // 1x over sampling | |
BME280.writeOversamplingHumidity(os1x); // 1x over sampling | |
BME280.writeOversamplingPressure(os1x); // 1x over sampling | |
Serial.println();Serial.println();Serial.print("Connecting to "); | |
Serial.println(ssid); | |
WiFi.begin(ssid, password); | |
while (WiFi.status() != WL_CONNECTED) { delay(500);Serial.print(".");} | |
Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: "); | |
Serial.println(WiFi.localIP()); | |
} | |
void loop() { | |
delay(5000); | |
WiFiClient client; // Use WiFiClient class to create TCP connections | |
Ambient ambient; | |
BME280.writeMode(smForced); // After taking the measurement the chip goes back to sleep | |
while (BME280.isMeasuring()){Serial.println("Measuring...");delay(50);} | |
Serial.println("Done!"); | |
BME280.readMeasurements(); // read out the data | |
float temperature = BME280.getTemperature(); // Temp | |
float humidity = BME280.getHumidity(); // Humidity | |
float pressure = BME280.getPressure(); // Pressure | |
Serial.print("Temperature: "); | |
printFormattedFloat(temperature); | |
Serial.println(""); | |
Serial.print("Humidity: "); | |
printFormattedFloat(humidity); | |
Serial.println(""); | |
Serial.print("Pressure: "); | |
printFormattedFloat(pressure); | |
Serial.println(""); | |
Serial.println(""); | |
ambient.begin(channelId, writeKey, &client); | |
Serial.println("Ambient start."); | |
ambient.set(1, temperature); | |
ambient.set(2, humidity); | |
ambient.set(3, pressure); | |
ambient.send(); | |
delay(10); | |
Serial.println();Serial.println("closing connection. going to sleep..."); | |
delay(1000); | |
system_deep_sleep_set_option(0); // go to deepsleep for 5 minutes | |
system_deep_sleep(5 * 60 * 1000000); // 5 min | |
} |
ESP8266とBME280でAmbientにデータを5分おきに送信するコード
送信したデータは、このように確認することができます。
https://ambidata.io/ch/channel.html?id=3781
エアコンの消費電力測定
消費電力の計測には、Wemo insightというスマートプラグを利用しています。
それをエアコンのプラグに噛ませた上で、こんなコードをcronで1分おきに実行しています。 https://gist.github.com/bohemian916/63bf346614a634c98113027f299f0abb
from ouimeaux.environment import Environment | |
import ambient | |
ambi = ambient.Ambient(xxxx, "xxxxxxxxxxxx") | |
def on_switch(switch): | |
print "Switch found!", switch.name | |
def on_motion(motion): | |
print "Motion found!", motion.name | |
env = Environment(on_switch, on_motion) | |
env.start() | |
# get device | |
env.discover(seconds=5) | |
insight = env.get_switch('WeMo Insight') | |
print(insight) | |
# get power | |
current_power = int(insight.current_power) / 1000.0 | |
print current_power | |
today_kwh = float(insight.today_kwh) | |
print today_kwh | |
# make data | |
tmp = {} | |
tmp["d1"] = current_power | |
tmp["d2"] = today_kwh | |
r = ambi.send(tmp) | |
print 'Status code: %d' % r.status_code |
エアコン付近の気温を追加するとこうなる
さて本題です。エアコン付近と生活エリアの2つの気温を測定した結果がこちらになります。
赤がエアコン付近の気温、青が高さ1mの気温です。
やはりエアコン付近は暑くなっており、フィードバック制御を行うための重要な指標がおかしく計測されていたようです。
エアコンとしては、「あっつ!! もっと気温下げんとだめやわ!」と思い必死に働くのですが
実際の室内はそこまで気温は高くなり、俺「寒い・・・」となっていたわけですね。
さらに暑い日では、エアコン付近の気温は38度もありました。
カーテンの影響はあるか?
今までの計測では、環境が変わらないようにカーテンをずっと閉めた状態で計測していましたが、 カーテンがエアコン付近の気温を上昇させている可能性もあると考えました。
エアコンを横から見ると、センサの通気口がある赤い部分にカーテンが影響していそうでした。
仮説としては、カーテンが日光を遮り、カーテンが発熱して暖められた空気が上昇、エアコンがその空気を吸い込みエアコンを狂わせる、というものです。
実は先ほどの図では、一時的にカーテンを開けた時間帯がありました。
カーテンを開けた時間だけ、前後の時間と比較すると2度ほどエアコン付近の気温が低下しています。そのためエアコンの稼働が減り、生活エリアの気温も少し上がっています。
考察
今住んでいるアパートは日当たりがよく、エアコンと窓の位置関係の影響で、主に日差しの強い日にエアコンが過度に冷えすぎる構造になっています。さらにカーテンを閉めると熱せられたカーテンにより過冷却を促進させます。
生活リズムが変わり、あまり朝早く起きなくなったので、目覚めないように遮光カーテンをして寝ていました。 そんな些細な変化でエアコンが効きすぎるようになるとは思ってもいませんでした。
そもそもエアコンは高い位置にあり、内臓されている気温センサは人が生活する場所よりも高くなってしまい、過度に冷やされてしまう問題を内因性として持っている。サーモカメラを内臓したエアコンもあるが、センサを生活空間に近い位置に設置することが対策として考えられます。別途無線で繋がるセンサーデバイスを設置するか、NetatmoのようなIoTなサーモスタットと連携できるようにし、今の本当の気温を計測できるようにするのがエアコン業界のIoT化の方向だと思います。
また賃貸住宅の観点からは、借りる前にこうしたセンシングの情報を提供してくれたらとても嬉しいと思います。
こちらのグラフは今日(2018/9/6)、カーテンを閉めた状態でエアコンOFFで1日家にいなかった日の気温です。
赤と青は部屋の気温、黒は気象庁発表の東京の気温データをプロットしてあります。
カーテンを閉めていても日当たりが良いのと最上階ということで、外の気温よりも高くなってしまう部屋です。 もし賃貸で借りる前にこの情報を知っていたら、 「エアコンがないとダメな部屋だな」「電気代が高くなりそう」ということが容易に分かり、この部屋を選ばなかったかもしれません。 今回は計測していませんが、照度や騒音も実際に暮らしてみないと分からない情報です。 賃貸業界としては、こうしたIoTを用いた住宅の快適度計測を積極的に行っていくべきです。 空き家になっている部屋にバッテリーで動くIoTセンサを数日置いておくだけで、こうした情報が取れるので、こうした情報を提供することが、良い暮らしを提供することにつながります。
最後にDIY的な観点から。 ビジネスやエンジニアリングにおいては、とにかくデータを計測してみて解決策を考えるということを当たり前にやりますが、 家庭内ではあまりやられていません。
家庭内での問題を解決するのに、地味に効いてくるのがIoTだと思います。家庭内で起きていることを正確に把握する材料になります。
例えば隣人との騒音問題も、データを取ってみて、何が相手に不快を与えている要因なのかを、印象だけでなくデータで考察し解決することもできると思います。
今回使ったようなセンサとマイコンもとても安く、とりあえずばらまいて計測してみると、いろんなことが分かってきます。
また自分の生活に関わるデータを見るのも楽しいです。皆さんもよかったら試してみてください。
おまけ
解析に使ったjupyter notebookのgist http://nbviewer.jupyter.org/gist/bohemian916/402291e08b5c3554b1a8472142891061
自室の気温・湿度・大気圧リアルタイムデータ https://ambidata.io/ch/channel.html?id=3781