初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
#初めに
BluemixのIDを取得します。
- FirefoxかChromeかSafariでBluemix.netへアクセスし、画面右上の「登録」を選択します。
- 登録画面で名前、メールIDなどを登録すると、指定したメールIDへ招待メールが届くので、そのリンクをクリックしてactivateします。
- Bluemixへログインします。
- "Successfully logged in"のメッセージが表示されるのみで画面が切り替わらない場合、ブラウザ(FirefoxまたはChromeまたはSafari)のURL入力欄にもう一度
bluemix.net
を入力し、[Cntl]+Rで画面を再読み込みしてみます。
作業する地域を確認します
-
Bluemixへログインしたら、画面右上の自分のユーザー名のアイコンをクリックしてプルダウンを開き、「地域」を「米国南部」へ変更します。
-
IoTのアプリを作るには「米国南部」のほうがいろいろ面白いためです。
-
「スペース名を作成」のプロンプトが表示された場合には、適当に入力します(例:開発用であれば「dev」など)。
#最初のIoTアプリを作成
-
再びBluemixの初期画面へ戻ったら、画面右上の六角形の「+」記号を選択します。画面右上にこの「+」記号が見つからない場合、
- 「ようこそ○○」と自分のログイン名が表示されている場合は、その下の「概要」が選択されているので、「すべての項目」を選択すると画面右上に六角形の「+」記号が表示されるようになります。
- クラシック画面になっている場合は、画面上部の「Try the new Bluemix」ボタンを押して新しいBluemix画面にします。もしくはクラシック画面のまま、画面右上の「カタログ」を選択し、次項のボイラープレートからのアプリ作成を行う事も可能です。
-
表示されるメニューの中から、先頭セクションにある「ボイラープレート」(テンプレート集)の中の「Internet of Things Platform Starter」を選択します。
-
画面をスクロールし、画面下部の「作成」ボタンを押します。
-
「概要」タブへ移動し、作成したアプリケーションが開始されるまで数分待ちます。「ログ」タブで進捗を確認できます。
-
「アプリは実行中です」と表示されたら「アプリの表示」ボタンを押します。クラシック画面を使用している場合は、「経路」の右に表示されたURLをクリックします。
-
「Node-RED in Bluemix」画面が表示されるので、画面右下の赤い「Go to your Node-RED flow editor」ボタンを押します。
-
上記フローが表示されない場合、Watson IoT Platform - Node-RED - フローをコピーする方法を参照して以下のフローをコピペで用意する事も可能です。
[{"id":"3e77d543.c1882a","type":"ibmiot in","z":"c5a69172.72d498","authentication":"quickstart","apiKey":"","inputType":"evt","deviceId":"","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"IBM IoT App In","service":"quickstart","allDevices":false,"allApplications":false,"allDeviceTypes":true,"allEvents":true,"allCommands":false,"allFormats":false,"x":100,"y":400,"wires":[["ae0082ac.51ff8","c0c482df.3f3b8"]]},{"id":"ae0082ac.51ff8","type":"function","z":"c5a69172.72d498","name":"temp","func":"return {payload:msg.payload.d.temp};","outputs":1,"x":290,"y":400,"wires":[["ff6ad0d9.00953"]]},{"id":"ff6ad0d9.00953","type":"switch","z":"c5a69172.72d498","name":"temp thresh","property":"payload","rules":[{"t":"lte","v":40,"v2":null},{"t":"gt","v":40,"v2":null}],"checkall":"true","outputs":2,"x":450,"y":400,"wires":[["80621eff.7f9de"],["8e1706a.f71e8f8"]]},{"id":"5dad02b7.a252fc","type":"debug","z":"c5a69172.72d498","name":"cpu status","active":true,"complete":"false","x":790,"y":400,"wires":[]},{"id":"c0c482df.3f3b8","type":"debug","z":"c5a69172.72d498","name":"device data","active":true,"console":"false","complete":"true","x":310,"y":480,"wires":[]},{"id":"80621eff.7f9de","type":"template","z":"c5a69172.72d498","name":"safe","template":"Temperature ({{payload}}) within safe limits","x":610,"y":380,"wires":[["5dad02b7.a252fc"]]},{"id":"8e1706a.f71e8f8","type":"template","z":"c5a69172.72d498","name":"danger","template":"Temperature ({{payload}}) critical","x":620,"y":420,"wires":[["5dad02b7.a252fc"]]},{"id":"cbe1a0b7.cd877","type":"ibmiot out","z":"c5a69172.72d498","authentication":"boundService","apiKey":"","outputType":"evt","deviceId":"LivingRoomThermo1","deviceType":"thermostat","eventCommandType":"update","format":"json","data":"temp:10","name":"Send to IBM IoT Platform","service":"registered","x":566,"y":120,"wires":[]},{"id":"5917a925.6a3c08","type":"inject","z":"c5a69172.72d498","name":"Send Data","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":false,"x":100,"y":120,"wires":[["6b4a591c.014b18"]]},{"id":"6b4a591c.014b18","type":"function","z":"c5a69172.72d498","name":"Device payload","func":"// Thermostat's location:\nvar longitude1 = -98.49;\nvar latitude1 = 29.42;\n\n// Array of pseudo random temperatures\nvar temp1 = [15,17,18.5,20,21.5,23,24,22.2,19,18];\n\n// Array of pseudo random relative humidities\nvar humidity1 = [50,55,61,68,65,60,53,49,45,47];\n\n// Counter to select from array.\nvar counter1 = context.get('counter1')||0;\ncounter1 = counter1+1;\nif(counter1 > 9) counter1 = 0;\ncontext.set('counter1',counter1);\n\n// Create MQTT message in JSON\nmsg = {\n payload: JSON.stringify(\n {\n d:{\n \"temp\" : temp1[counter1],\n \"humidity\" : humidity1[counter1],\n \"location\" :\n {\n \"longitude\" : longitude1,\n \"latitude\" : latitude1\n },\n }\n }\n )\n};\nreturn msg;\n","outputs":1,"noerr":0,"x":320,"y":120,"wires":[["cbe1a0b7.cd877","805c97ee.3ed9e8"]]},{"id":"805c97ee.3ed9e8","type":"debug","z":"c5a69172.72d498","name":"Debug output payload","active":true,"console":"false","complete":"payload","x":560,"y":180,"wires":[]},{"id":"86df0b6c.af90c8","type":"comment","z":"c5a69172.72d498","name":"Device Simulator","info":"Sends simulated device sensor data to IBM Watson IoT Plaform.\n\nCan be configured to send on click or on an automatic interval.\n\n\n#Prerequisite\nOutput node device type and device ID need to match a device that it registered in a running IBM Watson IoT Platform service.\n\n# Watson IoT Platform docs\n[Connecting devices](https://www.bluemix.net/docs/services/IoT/iotplatform_task.html)","x":100,"y":40,"wires":[]},{"id":"141b7c7.ad42a84","type":"comment","z":"c5a69172.72d498","name":"1. Configure target","info":"","x":550,"y":80,"wires":[]},{"id":"c2dd8ed5.7dd7f","type":"comment","z":"c5a69172.72d498","name":"2. Click to send data","info":"To automatically send data:\n1. Change *Repeat* to interval.\n2. Click Deploy button.\n","x":110,"y":160,"wires":[]},{"id":"7926c7b2.86d938","type":"comment","z":"c5a69172.72d498","name":"Temperature Monitor","info":"","x":110,"y":300,"wires":[]},{"id":"188a5e87.e775a1","type":"comment","z":"c5a69172.72d498","name":"Configure source","info":"","x":100,"y":360,"wires":[]}]
- 上記のフローのうち、上部のフロー("Device Simulator"と表記され灰色の"Send Data"ノードから始まるフロー)については、下記の6.で紹介しています。
- 上記のフローのうち、下部のフロー("Temperature Monitor"と表記され青い"IBM IoT App In"ノードから始まるフロー)については、下記の3、4で紹介しています。
#次のステップ
Node-REDを使って以下の操作が可能です。
#さらに次のステップ
上記のNode-REDフローを元にいろいろな操作をやってみます。
- IoTデータをデータベースに格納する
- IoTデータへSQLでアクセスする
- dashDBへ直接書き込む
- メーターで可視化する
- Bluemixのサービスを使えるようにする
- Watsonに喋らせてみる
- Twitterへつぶやいてみる
- TIセンサータグを使ってみる
- IFTTT経由でSMSメッセージを送ってみる
- デバイスを登録してデータを送信する
- アプリを登録してデータを受信する
- Watson IoT Platformでルールを使ってみる
- Watson IoT Platform APIを使ってみる
- Node-REDをローカル環境で稼働させる
#サンプル・フロー
- シミュレーターの値を閾値で判断
- センサーからの値を閾値で判断
- センサーからの値をリアルタイムで可視化
- データベースからのIoTデータを表示
- Watson Speech to Textで日本語でIoTしてみる
- ビーコンの位置情報を可視化する
- TensorFlowでIoTデータを人工知能してみる
Node-REDでシンプルなウェブサイトを作ってみる
#ダッシュボードを作ってみる
まずはお手軽にダッシュボードを作ってみたい、というかたはkuraokaさんのnode-red-dashboardでチャート表示IoTアプリ作成 がおすすめです。
いや、ガチで自分で作り込みたい、というかたは下記をどうぞ。
#他の達人たちの記事
- Node-REDのhttp inノードでBasic認証を有効にする (takeyanさんの記事)
- BluemixとカスタムドメインとSSLサーバー証明書とクライアント証明書 (takeyanさんの記事)
- BluemixのDockerコンテナ環境にTensorFlowをインストールする (takeyanさんの記事)
- (ほぼ)スマホ(だけ)を使ってIoTを始めてみよう (manamanaさんの記事)
- (ほぼ)スマホ(だけ)を使ってIoTを始めてみよう~応用アプリを作る~ (manamanaさんの記事)
- node-red-dashboardでチャート表示IoTアプリ作成 (kuraokaさんの記事)
- Node-REDに追加できるノード
#さらにその次のステップ
- Predictive Analyticsを使ってリアルタイム解析する
- Streamsを使ってリアルタイム解析してみる
- IBM Internet of Things Workbenchでアプリを作ってみる。- 紹介動画
#Node-RED小ワザ集
msg.payload
について- フロー内で共有する変数など
- 日付・時刻の追加
- 直近10件の平均や標準偏差を求める
- 自分のノード(サブフロー)を作成する
- 閾値によって判断する
- センサーからの最新値を入手する
- シミュレーターを作る
- Node-RED小ワザ集
- Bluemix小ワザ集
#MQTTを試してみる
- MessageSightを動かす
- MessagingTesterを使ってみる
- Publish/Subscribeしてみる
- MessageSightで使用状況を確認する
- Node-REDからpub/subしてみる
- Node-REDを使ってMQTT
- NodeREDからQuickstartへpublish
- サンプルアプリからQuickstartへpublish
- Topicの確認
- Retainの確認
- CleanSession=false(durable subscription)の確認
- pahoのsandboxとNode-REDでMQTTの練習
- 共用サブスクリプションを試してみる - Watson IoT Platform
- Message HubでKafkaしてみる