知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

MozillaのWebThinghsはホームIoTの主役となり得るか

少し前にたまたまMozillaのIoTプラットフォームWebThingsについての記事を読んで非常に興味を持ち、もしかしたらホームIoTのメインプラットフォームとして使えるのではないかと試してみることにしました。

今はホームIoTの主役はAmazon EchoGoogle Homeなどのスマートスピーカーになっていますが、「これは違うな」っと感じていて結局これらのデバイスは買わずじまいだったんです。

そのため、ベランダや部屋に付けたセンサーデータの表示にはBlynkを使っていましたが、Blynkは簡単に使えるもののスマホアプリの呪縛から逃れることができないことや、プロジェクト単位で画面を切り替える方式からホームIoTとして使うには無理がある感じでした。

 

細かいことは置いておいて、ちょっと作って見たホーム画面がこれです。

この画面で次の3つのことができます。

  • Broadlink RM mini 3(赤外線学習リモコン)を使った部屋の照明のオン・オフ
  • AccuWeather APIを使った秋葉の天候情報表示
  • ESP8266+BME280を使った部屋の温度・湿度・気圧の表示

 

部屋の照明のオン・オフはRoom Lightボタンで直接操作できます。
f:id:IntellectualCuriosity:20190803210459p:plain
Weather(Akiba)ボタンで表示される秋葉の天候情報はこんな感じ。
f:id:IntellectualCuriosity:20190803212206p:plain
Roomボタンで表示される部屋の温度・湿度・気圧はこんな感じ。
f:id:IntellectualCuriosity:20190803212725p:plain

WebThingsのGatewayRaspberry 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 FrameworkInstallationに次のように書いてあります。

f:id:IntellectualCuriosity:20190808113744p:plain

webthing-arduino

なぜかArduino IDEのライブラリマネージャーでは「webthing」が出てきません。

そのため、まず、ページの下のほうにあるMozilla WebThings LibrariesArduinoリンクで、ライブラリのGitHubリポジトリを開いて

f:id:IntellectualCuriosity:20190808120145p:plain

右上の緑色のボタン「Clone or download」でZIPファイルをダウンロードします。

f:id:IntellectualCuriosity:20190808122223p:plain

Arduino IDEの「.ZIP形式のライブラリをインストール」で、ダウンロードしたファイルを選べばライブラリをインストールすることができます。

f:id:IntellectualCuriosity:20190808124148p:plain

ArduinoJson

ライブラリマネージャーからインストールできますが、バージョンを5.x.xにしないとコンパイルでエラーが出るので気を付ける必要があります。

f:id:IntellectualCuriosity:20190808124458p:plain

 

プログラムを書き込んだ後、シリアルモニタでログを表示するとこんな感じで表示されます。 

 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}


WebThings Gateway

ゲートウェイはラズパイとTurris OmniaというWiFiルーターで動かすことができますが、迷いなくラズパイで作りました。

f:id:IntellectualCuriosity:20190808143526p:plain

ダウンロードリンクでイメージをダウンロードしてSDカードに焼くだけです。解凍したファイルサイズが3GBちょいあるので、SDカードは8GBあれば十分だと思います。

ダウンロードリンクの下のGetting Started Guideに従って、6つぐらいの手順を実行するだけでセットアップが完了します。

 

バイスの追加

ゲートウェイにアクセスするとこのようなホーム画面が表示されるので、右下の「+」をクリックしてデバイスを追加します。

f:id:IntellectualCuriosity:20190808151328p:plain

「Add by URL」をクリック!

f:id:IntellectualCuriosity:20190808152426p:plain

シリアルモニタに表示されていたURLを入力して「Submit」!

f:id:IntellectualCuriosity:20190808153629p:plain

ESP8266+BME280の設置場所を入力して「Save」&「Done」!

f:id:IntellectualCuriosity:20190808154509p:plain

追加したデバイスがホーム画面に表示されます。(値が0になっているときは画面をリロードすると表示されます。)

赤丸の部分をクリックすると、温度以外の値も表示されます。

f:id:IntellectualCuriosity:20190808154858p:plain

温度以外の湿度や気圧はスキーマにプロパティが登録されていないため、単位が表示されません。この辺りはまだまだ発展途上のようです。

f:id:IntellectualCuriosity:20190808155354p:plain

 

アドオン

ホーム画面のバーガーメニューから「Settings」-「Add-ons」で「BroadLink」と「Weather」を追加しています。

f:id:IntellectualCuriosity:20190808162524p:plain

BroadLinkの設定画面。

なぜかMAC Addressの並びが「b4:43:0d」の筈が「0d:43:b4」で表示されます。対応デバイスは赤外線リモコンのみのようです。

f:id:IntellectualCuriosity:20190808162800p:plain

Weatherの設定画面。

天気情報のプロバイダーにはaccuwatherの他に「openweathermap」と「darksky」が選べます。accuwatherでは1日50回までの制限がある「Limited Trial」でアカウントを作ってAPI Keyを取得しました。

f:id:IntellectualCuriosity:20190808164533p:plain

アドオンの設定後、ホーム画面の右下の「+」をクリックすると自動的にデバイスが検出されるので「Save」&「Done」でホーム画面に追加します。

f:id:IntellectualCuriosity:20190808172845p:plain

ホーム画面でRoom Lihgtアイコンの右上の部分をクリックして、リモコンの学習を行います。

右側のスイッチアイコンをクリックしてOFFからONにした後、リモコンのオンボタンを押します。同様に右側のスイッチアイコンをクリックしてONからOFFした後、リモコンのオフボタンを押すとONとOFFの学習が終了します。

f:id:IntellectualCuriosity:20190808173309p:plain

 

結論
まだまだ発展途上感が強い状態で、機能やプロパティがスキーマ登録されていなければいけない柔軟性の無さが、今後の発展に悪影響を及ぼす気がします。

しかし、エッジデバイス側をRESTで叩きに行ってデータを取得するWoT (Web of Things)の考え方は非常にいいので、期待は持てると感じました。

 

おまけ

ESP8266+BME280のハードウェアのことを書いていなかったので、使用パーツや結線などを少々。

使用パーツ

f:id:IntellectualCuriosity:20190810094128p:plain

結線


おしまい