少し前にたまたまMozillaのIoTプラットフォームWebThingsについての記事を読んで非常に興味を持ち、もしかしたらホームIoTのメインプラットフォームとして使えるのではないかと試してみることにしました。
今はホームIoTの主役はAmazon EchoやGoogle Homeなどのスマートスピーカーになっていますが、「これは違うな」っと感じていて結局これらのデバイスは買わずじまいだったんです。
そのため、ベランダや部屋に付けたセンサーデータの表示にはBlynkを使っていましたが、Blynkは簡単に使えるもののスマホアプリの呪縛から逃れることができないことや、プロジェクト単位で画面を切り替える方式からホームIoTとして使うには無理がある感じでした。
細かいことは置いておいて、ちょっと作って見たホーム画面がこれです。
この画面で次の3つのことができます。
- Broadlink RM mini 3(赤外線学習リモコン)を使った部屋の照明のオン・オフ
- AccuWeather APIを使った秋葉の天候情報表示
- ESP8266+BME280を使った部屋の温度・湿度・気圧の表示
Weather(Akiba)ボタンで表示される秋葉の天候情報はこんな感じ。
Roomボタンで表示される部屋の温度・湿度・気圧はこんな感じ。
WebThingsのGatewayはRaspberry Pi 3で部屋で動かしていますが、dataplicityのwormhole機能のようにxxx.mozilla-iot.org経由でトンネリングアクセスできるようになっているんです。素晴らしい!
いきなりスケッチ
今回は一番の核心、ESP8266+BME280のスケッチから公開します。
/* * BME280WebThings.ino * for ESP8266 * Auguest 3, 2019 * By Hiroyuki ITO * http://intellectualcuriosity.hatenablog.com/ * MIT Licensed. */ #include <Arduino.h> #include "Thing.h" #include "WebThingAdapter.h" #include <Wire.h> #include <Adafruit_BME280.h> Adafruit_BME280 bme; const char* ssid = "YourNetworkName"; const char* password = "YourPassword"; // Make WebThings Objects WebThingAdapter* adapter; const char* deviceTypes[] = {"TemperatureSensor", "Sensor", nullptr}; ThingDevice device("bme280", "BME280", deviceTypes); ThingProperty temperature("Temperature", "", NUMBER, "TemperatureProperty"); ThingProperty humidity("Humidity", "", NUMBER, "HumidityProperty"); ThingProperty pressure("Pressure", "", NUMBER, "PressureProperty"); void setup() { Serial.begin(74880); // Connect to WiFi Serial.print(String("Connecting to ") + ssid); WiFi.begin(ssid, password); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected."); // Setup WebThings Device IPAddress ip = WiFi.localIP(); adapter = new WebThingAdapter("bme280", ip); device.addProperty(&temperature); device.addProperty(&humidity); device.addProperty(&pressure); adapter->addDevice(&device); adapter->begin(); Serial.print("HTTP server started.\nhttp://"); Serial.print(ip); Serial.println(String("/things/") + device.id); // Setup BME280 bme.begin(); delay(100); // let sensor boot up } void loop() { // Get and set sensors value ThingPropertyValue t; ThingPropertyValue h; ThingPropertyValue p; t.number = round(bme.readTemperature()); // C h.number = round(bme.readHumidity()); // % p.number = round(bme.readPressure() / 100.0F); // hPa temperature.setValue(t); humidity.setValue(h); pressure.setValue(p); adapter->update(); // Print logs Serial.println(String("Temperature: ") + t.number); Serial.println(String("Humidity: ") + h.number); Serial.println(String("Pressure: ") + p.number); delay(1000); }
スケッチは「webthing-arduino」ライブラリのサンプル「LED」と「LevelSensor」を参考にして書きました。
ライブラリ
Arduinoで必要になるライブラリはWebThings FrameworkのInstallationに次のように書いてあります。
webthing-arduino
なぜかArduino IDEのライブラリマネージャーでは「webthing」が出てきません。
そのため、まず、ページの下のほうにあるMozilla WebThings LibrariesのArduinoリンクで、ライブラリのGitHubリポジトリを開いて
右上の緑色のボタン「Clone or download」でZIPファイルをダウンロードします。
Arduino IDEの「.ZIP形式のライブラリをインストール」で、ダウンロードしたファイルを選べばライブラリをインストールすることができます。
ArduinoJson
ライブラリマネージャーからインストールできますが、バージョンを5.x.xにしないとコンパイルでエラーが出るので気を付ける必要があります。
プログラムを書き込んだ後、シリアルモニタでログを表示するとこんな感じで表示されます。
ets Jan 8 2013,rst cause:2, boot mode:(3,6) load 0x4010f000, len 1384, room 16 tail 8 chksum 0x2d csum 0x2d v8b899c12 ~ld Connecting to YourNetworkName. Connected. MDNS responder started HTTP server started. http://192.168.55.210/things/bme280 Temperature: 26.00 Humidity: 73.00 Pressure: 1009.00
ここに表示されているURLhttp://192.168.55.210/things/bme280
にアクセスするとこのように表示されます。
{ "name":"BME280", "href":"/things/bme280", "@context":"https://iot.mozilla.org/schemas", "@type":["TemperatureSensor","Sensor"], "properties":{ "Temperature":{ "type":"number", "@type":"TemperatureProperty", "href":"/things/bme280/properties/Temperature" }, "Humidity":{ "type":"number", "@type":"HumidityProperty", "href":"/things/bme280/properties/Humidity" }, "Pressure":{ "type":"number", "@type":"PressureProperty", "href":"/things/bme280/properties/Pressure" } } }
また、各プロパティのhrefにアクセスすると次のように値が表示されます。
http://192.168.55.210/things/bme280/properties/Temperature
で
{"Temperature":28}
http://192.168.55.210/things/bme280/properties/Humidity
で
{"Humidity":62}
http://192.168.55.210/things/bme280/properties/Pressure
で
{"Pressure":1009}
ゲートウェイはラズパイとTurris OmniaというWiFiルーターで動かすことができますが、迷いなくラズパイで作りました。
ダウンロードリンクでイメージをダウンロードしてSDカードに焼くだけです。解凍したファイルサイズが3GBちょいあるので、SDカードは8GBあれば十分だと思います。
ダウンロードリンクの下のGetting Started Guideに従って、6つぐらいの手順を実行するだけでセットアップが完了します。
デバイスの追加
ゲートウェイにアクセスするとこのようなホーム画面が表示されるので、右下の「+」をクリックしてデバイスを追加します。
「Add by URL」をクリック!
シリアルモニタに表示されていたURLを入力して「Submit」!
ESP8266+BME280の設置場所を入力して「Save」&「Done」!
追加したデバイスがホーム画面に表示されます。(値が0になっているときは画面をリロードすると表示されます。)
赤丸の部分をクリックすると、温度以外の値も表示されます。
温度以外の湿度や気圧はスキーマにプロパティが登録されていないため、単位が表示されません。この辺りはまだまだ発展途上のようです。
アドオン
ホーム画面のバーガーメニューから「Settings」-「Add-ons」で「BroadLink」と「Weather」を追加しています。
BroadLinkの設定画面。
なぜかMAC Addressの並びが「b4:43:0d」の筈が「0d:43:b4」で表示されます。対応デバイスは赤外線リモコンのみのようです。
Weatherの設定画面。
天気情報のプロバイダーにはaccuwatherの他に「openweathermap」と「darksky」が選べます。accuwatherでは1日50回までの制限がある「Limited Trial」でアカウントを作ってAPI Keyを取得しました。
アドオンの設定後、ホーム画面の右下の「+」をクリックすると自動的にデバイスが検出されるので「Save」&「Done」でホーム画面に追加します。
ホーム画面でRoom Lihgtアイコンの右上の部分をクリックして、リモコンの学習を行います。
右側のスイッチアイコンをクリックしてOFFからONにした後、リモコンのオンボタンを押します。同様に右側のスイッチアイコンをクリックしてONからOFFした後、リモコンのオフボタンを押すとONとOFFの学習が終了します。
結論
まだまだ発展途上感が強い状態で、機能やプロパティがスキーマ登録されていなければいけない柔軟性の無さが、今後の発展に悪影響を及ぼす気がします。
しかし、エッジデバイス側をRESTで叩きに行ってデータを取得するWoT (Web of Things)の考え方は非常にいいので、期待は持てると感じました。
おまけ
ESP8266+BME280のハードウェアのことを書いていなかったので、使用パーツや結線などを少々。
使用パーツ
- ESP-WROOM-02開発ボード --- 秋月電子 ¥1,280(税込)
- BME280使用 温湿度・気圧センサモジュールキット --- 秋月電子 ¥1,080(税込)
結線
- ESP-WROOM-02 GPIO5 <--> AE-BME280 SCK(SCL)
- ESP-WROOM-02 GPIO4 <--> AE-BME280 SDI(SDA)
- ESP-WROOM-02 3V3 <--> AE-BME280 VDD
- ESP-WROOM-02 GND <--> AE-BME280 GND
- AE-BME280 VDD <--> AE-BME280 SDO
おしまい