空と山と暮らし

パラグライダーと山歩きの記録、ときどき家と暮らし。

SwitchBotのCO2センサで空き巣に不在がバレる?

9月に先行予約していたSwitchBotのCO2センサが10月13日に届きました。それから色々と試して11月の1ヵ月分のデータが蓄積できましたので、今回はこのCO2センサについて記事にしておきます。

─ 目次 ─

測定ファースト

仕事柄、「測定できないものは、改善できない」というワードをよく聞きます。ピーター・ドラッカーの言葉として紹介されることもありますが、元ネタは品質管理の祖であるウィリアム・エドワーズ・デミングと言われています。デミングは1946年にニューヨーク大学の教授になっており、1950年に同大学教授になったドラッカーの先輩ですね。

デミングの著書に、以下の記述があります。

It is wrong to suppose that if you can’t measure it, you can’t manage it – a costly myth.

センテンスの途中に「if you can’t measure it, you can’t manage it」という冒頭のワードが出てきますが・・・前後の文章をしっかり読むと、実は言いたいことは逆ですね。

Google翻訳

測定できないものは管理できないと考えるのは間違いであり、高くつく誤解です。

とはいえ、デミング博士も測定できるデータが不要と言っているわけではなく、測定できるものは定量管理しつつ、測定できないものは管理方法を考えろと言っているのです。つまり、回りまわって測定できるってことは大事。

・・・という、PDCA/OODAのテンプレ話を踏まえつつ、私も室内環境の管理のために、測定できるものは測定+記録する派です。

 

我が家では、今までもSwitchBotの温湿度計、開閉センサ、プラグ(電流計)やHEMS (AiSEG2)を利用して、データを取得し記録しています。このデータがあることで、思い込みに依らない空調管理や省エネ化ができます。ただし、CO2センサだけは測定値を記録できないデバイスを使っていました。今のデバイスもCO2濃度の表示やアラート通知はできるものの、測定したデータを取り出す手段がないのです。もちろんデータ収集できる機種もありましたが1万円以上と高価で、そのコストを払うほどのCO2濃度の不安が無かったこともあって、見合わせしていたのです。

SwitchBot CO2センサ

そこへ新たに登場したのが、安価なSwitchBot CO2センサ。(↓ 公式サイトの写真)

SwitchBotなら、間違いなくデータ収集/記録ができます。ここホント大事。ただ、家にCO2センサは2台もいらないので、古いものは無駄になります。熟慮の末に、もし妻に「またオモチャ増えた?」と言われたら、デミング博士のせいにしようと決めて、割引中の先行予約販売に申し込んだのでした。(博士、トバッチリすまん)

 

SwitchBotの公開仕様を見ると、CO2センサと言いつつ温湿度も測定/表示できます。NDIR方式のCO2センサモジュールを搭載しているため、温度補正のために温度測定は必要ですが、表示するかはコストのトレードオフで判断の分かれるところ。このデバイスのプロデューサーは、CO2濃度を知りたい人の大半が温湿度も知りたいことをよく理解しているのでしょう。

これなら今リビングに置いているSwitchBot温湿度計と交換して、余った温湿度計を水耕栽培レタス用の温室の飽差(VPD)測定に使えます。そんなことを考えながら、10月の正式販売を待ちました。

CO2センサがやってきた

右側が、我が家にやってきたSwitchBot CO2センサです。

左側が古いCO2センサ(こちらもNDIR方式)で、新/旧で微妙に数値が違いますが、校正機能のあるSwitchBotの方が正確だと思います。また、古いCO2センサは充電中になぜか湿度が高く表示されたのですが、SwitchBotはそもそも充電がなく、数値が安定しています。ロガーとしての機能面だけでなく、測定という基本機能もSwitchBotの方が良いです。

余ったCO2センサは、捨てるのも忍びないので、TV会議で籠りやすいDEN(私のリモートワーク部屋)に置くことにしました。

 

さて、SwitchBot CO2センサの使い方ですが、電池 or USB電源を接続してスマホ連携するとSwitchBotハブミニに繋がり、後は勝手に測定&記録が始まります。手間はかかりません。SwitchBotの情報はスマホのホーム画面のウィジェットでも表示でき、下図のように、温湿度計には無かったCO2濃度[ppm]が追加されていることが分かります。

いや、ホントお手軽ですね。

 

11月末まで放置してログを見ると、CO2が大きく変動していることが分かります。

11月の全区間のCO2濃度の平均は636.7ppm、最低が401ppm、最高が931ppmでした。外泊して不在だった日のCO2濃度410~420ppm位が私の住む地域のベースCO2濃度ということでしょう。

今までのCO2センサは就寝後の値が分かりませんでしたが、記録が取れると全区間の状況が分かって良いですね。とりあえず、建築物環境衛生管理基準(CO2濃度1,000ppm以下)や新提案基準(外気+700ppm以下)は満たしていて、我が家の換気は問題ないようです。

このデータがあれば、省エネのために第1種換気の換気量をもう少し絞ってみる、という実験もできそうです。また、我が家は2Fでトマト栽培をしているので、植物の育成に適したCO2濃度(≧500ppm)のコントロールができるかもしれません。更に、例えば停電のテストとして24時間換気を止めて、CO2濃度がどう変化するのか/窓を開けてどの程度で回復するのか検証しておくのも面白いかもしれません。

 

ちなみに、CO2濃度は人の存在によって大きく変動します。人が多いとCO2濃度が900ppm以上に上がり、不在になると400ppm付近までガクッと落ちます。上図の11月初旬にグラフが大きく下がっている箇所は、11月2日~4日の3連休に北関東へ二泊三日の旅に行った日(紅葉の那須岳を歩く)です。11月下旬に下がっているのは、11/23日~24日に伊豆へ一泊二日の旅に行った日です。また平日にも、不定期の出社日には400ppmへの下パルスができています。外出した日数に応じて凹みサイズが大きくなっていて、在宅状況がかなり正確に掴めることが分かりますね。

 

さて、ここまではお馴染みの「試してみたブログ」でした。では、少し踏み込んでみましょう。

SwitchBot BLEのADデータを拾う

まず、自作の環境ロガーをカスタマイズして、Raspberry Pi Zero WからBluetooth経由でCO2データが取得できるか確認しました。(SwitchBot WebAPIはクラウドへのアクセス回数制限があるため、環境ロガーはローカル環境内からBLEでデータ取得しています)

SwitchBot CO2センサのBLE仕様は、まだ公式のSwitchBotAPI-BLEサイトに情報無し(24/11/30時点)ですが、既に作成済みのメータ系デバイスの仕様から、だいたい推測できます。そして、以下のようにBroadcast MessageのAdvertiseで送信されるManufacturer dataのオフセット[7:8]で、CO2濃度が取得できることを確認しました。(温湿度は他のMeter系のbotとフォーマット共通でした)


# メータ系共通Manufacturer data情報
def parse_meter_mnf(v):
    return {
        'type'  : 'meter',
        'seq'   : v[0],
        #'RFU1' : v[1],
        #'RFU2' : v[2] & 0xf0,
        'temp10': (1 if v[3] & 0x80 else -1) * ((v[3] & 0x7f) * 10 + (v[2] & 0xf)), # -127.9~+127.9[℃.]
        'humi'  : v[4] & 0x7F,              # 0-99[%]
    }

# CO2センサ
def parse_CO2(mnf, srv, size):
    if len(mnf) != size:
        g_logger.error("CO2: size error %s(%d)", mnf.hex(), len(mnf))
        return

    ret = parse_meter_mnf(mnf) | { # Meter共通のmanufacturer data解析
        'type'  : 'CO2',
        'CO2'   : mnf[7] * 0x100 + mnf[8],      # 0-65535
    }

    #if len(srv) > 5: # CO2は他のmeterとService data書式が違う
    #   ret |= parse_meter_srv(srv) # オプショナル追加(残電池容量など)

    return ret
 

暗号化なしで容易にデータ取得できることは過去デバイスから想像がついていたのですが、やはりCO2センサも同様でした。


(blepj) test1@raspi:~/envlog $ python switchbot.py
22:27:15 [switchbot] Mini-PC={'type': 'plug', 'seq': 164, 'on': 1, 'over': 0, 'power10': 8}
22:27:15 [switchbot] 暖炉電球={'type': 'bulb', 'seq': 199, 'on': 0, 'level': 100, 'net': 2}
22:27:15 [switchbot] DEN-PC={'type': 'plug', 'seq': 78, 'on': 1, 'over': 0, 'power10': 170}
22:27:15 [switchbot] リビングCO2={'type': 'CO2', 'seq': 9, 'temp10': 241, 'humi': 50, 'CO2': 623}
22:27:16 [switchbot] シャッタ={'type': 'contact', 'batt': 0, 'door': 0, 'light': 0, 'pir': 131071, 'hal': 25354}
22:27:16 [switchbot] レタス温室={'type': 'meter', 'seq': 110, 'temp10': 233, 'humi': 58, 'batt': 100}
22:27:16 [switchbot] 屋外温度={'type': 'meter', 'seq': 78, 'temp10': 157, 'humi': 36}
    :

上記コマンドで、動作中のCO2センサの画面の表示(623ppm)と同じ値が取得できること(5行目)を確認できました。

 

自宅で自分のCO2センサの値を見れることには、特に疑問を抱かないと思います。ですが、注意しないといけないのは、この情報が暗号化なしのBluetooth BLE AdvertiseデータとしてCO2センサから常にブロードキャストされているという事と、CO2センサの精度が高いため在宅状況がかなり正確に分かる、ということです。

 

・・・勘の良い方なら、既にお気づきかと思います。

 

そう、街中でBLEパケットを収集し続けてCO2濃度が一定以下のデバイスが見つかったら通知を出す「不在チェッカー」端末が、簡単に作れてしまうのです。

 

空き巣に不在がバレるかも

ここで今回のタイトルに繋がります。

もしSwitchBot CO2センサーを、特に対策もせず道路側のLDKに置いておくと、空き巣が「不在チェッカー」を持って道を巡回することで、今まさに不在のお宅が分かってしまいます。

 

もちろん、住民が屋外にCO2センサを置いて外気をモニタしている可能性はあり、空き巣も屋内データであることに確信は持てませんし、家が密集していればどこのお宅のBLEパケットなのか特定しづらいです。ですが、このあたりはBLEのRSSI(信号レベル)を追うと推測できてしまいます。帰宅直後でCO2濃度が低い可能性もありますが、しばらく待ってCO2濃度が低いままならその心配もなくなります。さて、どうしましょうか。

一番確実なのは、CO2センサを電磁波シールド(アルミ箔)で囲う事ですが、これではロガーとしての機能が発揮できません。屋内だけに電波が届くような微調整ができれば良いのですが、これはなかなか難しいです。他に何か良い手はあるでしょうか?

 

案1:ゴールデン・レトリバーを飼う

あるいは、ベンガル猫や大きなカピバラでも良いでしょう。たぶん、カブトムシはダメです。人と同レベルの呼吸でCO2濃度が上がるまで育成しましょう。注意点は、ペットと一緒にお出かけするのはNGということです。

 

案2:シャッターを閉める

幸いなことに、我が家の場合は掃き出し窓のシャッターを閉めたら、道路からBLEスキャンできなくなりました。ただ、これはあくまで手持ちのRaspberry Pi Zero Wのアンテナでのテストであって、空き巣が高感度のアンテナを用意したら見つかるかもしれません。

あと気を付けないといけないのは、外出時に必ずシャッターを閉める必要があるという手間と、外出時だけ必ずシャッターを閉める習慣がありそれに気づかれると、それこそ空き巣にシャッターで不在がモロバレになるというデメリットです。(逆に言うと、もともと外出時のみ必ずシャッターを閉める人は、今回の不安は関係ないということ)

 

案3:在宅時にも窓を全開にして空き巣を攪乱する

あきらかに在宅なのに常にCO2が低いお宅なら空き巣もおかしいと思って侵入をあきらめるかもしれません。ただ、夏冬は暑さ寒さをしのぐ必要がありますし、常にCO2濃度が低い環境にするなら、そもそもCO2センサを置く意味がなくなりそうです。

 

案4:CO2センサの校正機能を使って、数値を底上げする

SwitchBotのCO2センサは、手動でCO2濃度を校正する方法が用意されています。これを利用して、400ppmが700ppm位になるように底上げ調整します。この場合、画面に表示されるCO2濃度を頭の中で読み替えないといけないというデメリットがありますが、データロガー主体でセンサを使うなら、ロガーソフト内で底上げされたCO2濃度を逆変換するように計算しておくことができます。今のことろ、これが一番簡単かも。

 

他に何か良いアイデアはあるかな?

 

まぁ、今はまだSwitchBot CO2センサの普及度が低すぎて、空き巣も在宅チェッカーを使う気が起こらないでしょう。(甘いかな?) とりあえず、CO2センサが普及するまでに対策しておけばよいかと思います。

・・・

もともとSwitchBotは外からミニプラグを勝手にOff/Onされるセキュリティリスクがあり、重要機器の電源の使用には慎重にならざるを得ませんでした。今回は犯罪被害に直結する可能性もありましたので、改めての整理になりました。この手の機器は、リスクと利便性から利用を判断しましょう。