インターネット在室表示灯
さて、前回作成した在室表示灯ですが、これをインターネットに接続して、在室状況をWebから見えるようにしてみましょう。
いわゆるIoT(Internet of Thing)というわけですが、IoTをする方法にもいろいろあり、センサに直接ハードとしてWi-Fiチップと比較的高性能なマイコンをつないで、自前でインターネットに接続方法もありますが、これは結構消費電力を食いますし、Wi-Fiがない場所では使えません。今回はこの方法は使わず、一度近くのPCにデータを取り込んで、PCからインターネット上のサーバに情報を送信するという手を使います。
センサからLEDにデータを飛ばすときに使ったTWE-Liteですが、このバリエーションとして、USB-シリアル変換チップを使って、USBに直接させるスティック上にした、ToCoStickがあります。これはPCに挿すとシリアルポート(昔はモデムをつないでいたアレ)のように認識され、そこにアクセスすることにより動作を指示したりデータを得ることができます。そして、すでに1台親機を用意しているので、先に作った在室表示灯に何も手を加えることなく、このToCoStickを子機に設定して近くに置くだけでデータを受診することができます。
ToCoStickの実物はこんな感じです。
まずはこれをPCにさして、ドライバーをインストールします。
これで、PCにシリアルポートが追加され、そこにアクセスをするとToCoStickとの入出力ができるようになります。Macの場合、/dev/tty.usbserial-XXXXXXにような名前で見えるようになるはずです。
通信するには、Macだとターミナルからscreenコマンドを使うのが便利でしょう。ToCoStickのデフォルトの通信速度は115200bpsなので、
screen /dev/tty.usbserial-XXXXXX 115200
とすると、データが次々と送られてきているのがわかります。
:7881150175810000380026C9000C04220000FFFFFFFFFFA7
:7881150175810000380026FF000C02220000FFFFFFFFFF73
...
この意味はこちらで解説されています。今回のPIRセンサの状態はDI1ピンで伝達しているので、34,35桁目を16進数として読んで、その最下位1ビットを読めばいいわけです。ただ、「1がOn(Lowレベル)。」とあるので、在室を検知した時は0、そうでない時に1となることに注意が必要です。
まず、ここから"+"記号を3回入力してインタラクティブモードにし、デバイスIDを125に設定して「子機間欠受信1秒モード」にします。これで、親機からのデータを1秒ごとに受信してくるモードになります。
あとはこのデータをインターネット上に送信するだけです。
こういう処理になるとやっぱりJavaScript、特に最近ではNode.js が便利ですね。でもセミコロンをたくさんタイプしたくないので、JavaScriptをさらに簡単にかけるようにした CoffeeScript を使ってみました。インデントが文法の一部なので気を使いますが、Rみたいな"->"という予約語があったり(向き逆ですけど)するあたりが好みです。
インターネット上のサーバとしては、IoTらしくMQTTを使います。自宅サーバにMQTTサーバを導入してあるので、Node.jsのmqttパッケージを使うと簡単に送信ができます。同じくNode.jsのserialportライブラリを使ってシリアルポートから情報を得て、PIRセンサーの状態を取り出し、それを30秒間分ためて1割以上が検出信号を出していれば、「在室」というステータスをMQTTに出すというスクリプトを書きました。1割取れていればいい、というのは経験から出した値で、やはり赤外線センサーなので目の前にいても動かないと信号が出ません。そこで30秒間にシリアルポートに出てきた信号のうち、1割ぐらいあればまぁ在室だろうとしています。
このスクリプトはこちらに掲載しました。
https://gist.github.com/mokjpn/988f697cfb95c85b4a36
MQTTはpub/sub型というプロトコルで、あるクライアントがデータを送信すると、同時に接続していた別のクライアントがその情報を一斉に受け取ることができる、というものです。使っているMQTTサーバはWebSocketでの接続にも対応しているので、JavaScriptを書けば、ブラウザ上からsubscribeすることで、MQTTのデータを直接Webページに埋め込むことができます。
そこで、それをやっていた Jan-Piet MensさんのThe Mosquitto MQTT broker gets Websockets supportのスクリプトとHTMLを使わせてもらい、今回作った在室表示灯のデータをWebから見られるようにしてみました。
http://www.okadajp.org/~mokada/status.html
で、現在の在室状況がわかるというわけです。そのうち気温/湿度/気圧などのセンサーもつないで表示させてみようと思います。