|
| 1 | +# 🌈🦄 Mini Workshop 3: Particle Photon デバイスをライトアップする Rainbow/Unicorn なモバイルアプリを作成する |
| 2 | + |
| 3 | +| **プロジェクトのゴール** | NativeScript-Vue を作成して、Photon の組み込み LED がユーザーの選択に基づいて異なる色で点滅するようにします。 | |
| 4 | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
| 5 | +| **このワークショップで学ぶこと** | NativeScript と Vue.js でのモバイルアプリの作り方、Particle Photon をセットアップして構成する方法、そして 2 つを繋げてアプリがデバイスを制御する方法 | |
| 6 | +| **必要なツール** | Wi-Fi へのアクセス<br><br>Chrome のようなモダンブラウザ<br><br>[NativeScript Playground](https://play.nativescript.org) へのアクセス —バージョン管理のためアカウント作成を推奨します。iOS または Android のスマートフォンと NativeScript Playground、Preview アプリのインストール<br><br>プレイグラウンド用の 2 つの NativeScript コンパニオンアプリ(NativeScript Viewer と NativeScript Playground)Android の場合: [NativeScript Playground](https://play.google.com/store/apps/details?id=org.nativescript.play) と [NativeScript Preview](https://play.google.com/store/apps/details?id=org.nativescript.preview)。iOS の場合: [NativeScript Playground](https://itunes.apple.com/us/app/nativescript-playground/id1263543946) と [NativeScript Preview](https://itunes.apple.com/us/app/nativescript-preview/id1264484702)<br><br>[Particle Photon device](https://store.particle.io/collections/photon)。 | |
| 7 | +| **かかる時間** | 1 時間 | |
| 8 | +| **アプリケーションを試してみたいですか?** | [Playground アプリでこのリンクを開きます](https://play.nativescript.org/?template=play-vue&id=E9hBGf&v=21) | |
| 9 | + |
| 10 | +# イントロダクション |
| 11 | + |
| 12 | +## Photon をセットアップする |
| 13 | + |
| 14 | +### 1. Photon を Wi-Fi に接続します: |
| 15 | + |
| 16 | +このワークショップに付属のキットを開梱するか、用意しているあなたのデバイスを使用して、mini-USB コードを Photon とコンピューターの USB ポートまたは USB 対応の充電器に接続して、デバイスに電力を供給します。 |
| 17 | + |
| 18 | +- [Photon setup page](https://setup.particle.io/) にアクセスしてデバイスをセットアップします。ログインを求められますが、先に進み、Particle アカウントを作成します |
| 19 | +- アカウントを作成すると、デバイスのセットアップにリダイレクトされます。「Setup a Photon」と「next」をクリックして開始します。次のページにすべての要件がある場合は、「next」をクリックします。生成されたローカルファイルをコンピューターにダウンロードします。ブラウザで `photonsetup.html` ファイルを開きます |
| 20 | +- Photon の箱の裏面を見てどの Photon かを特定します。左側にデバイスの ID が記載されたステッカーがあります。その番号の最初の 6 文字は、コンピューターに表示される最初の Wi-Fi アドレスと一致します |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | +- リストされている手順に従って Photon の Wi-Fi ネットワークに接続します。接続すると、「青くピカピカ」するはずです(中央の青色のライトがゆっくりと点滅します) |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +デバイスに名前をつけてセットアップを完了します。これで、Photon のコードを書くための特別な IDE である [Particle Build](https://build.particle.io) でデバイスを使用することができます。 |
| 29 | + |
| 30 | +::: tip 💡 |
| 31 | +参加者は、Particle Build で Photon を見つけるのに苦労することがあります。IDE に表示されない場合は、手動で追加してください。 |
| 32 | + |
| 33 | +- デバイスがまだ青色に点滅していない場合は、メインステータス LED が濃い青色に点滅するまで Photon のセットアップボタンを押し続けます。これには約 3 秒かかります。 |
| 34 | + |
| 35 | + |
| 36 | + |
| 37 | +- 上記の手順に従って Photon の Wi-Fi に接続し、Web ブラウザで [http://192.168.0.1/device-id](http://192.168.0.1/device-id) を開きます。そのページには、次のような ID が表示されます: |
| 38 | + |
| 39 | +``` |
| 40 | +{"id":"30003F000347363339343638","c":"1"} |
| 41 | +``` |
| 42 | + |
| 43 | +- その ID をメモしてください。あとで使用します |
| 44 | +- [Particle Build](https://build.particle.io) を開き、「Add New Device」をクリックします |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | +- メモしておいたデバイス ID をボックスに入力します。これでデバイスが IDE で使用できるようになります |
| 49 | + |
| 50 | +::: |
| 51 | + |
| 52 | +### 2. Particle Build について学ぶ |
| 53 | + |
| 54 | +Photon のアカウントはすでに作成しており、ログインしているはずです(ログインしていない場合は、[ここからログインしてください](https://login.particle.io/login)) |
| 55 | +これで [Particle Build](https://build.particle.io/build/new) に移動できます。左のバーの下部にある下から 3 番目のアイコンをクリックして、デバイスがリストされていることを確認します。スターがついていることを確認します(スターがついていない場合はスターをクリックします) —Wi-Fi 経由でこのデバイスにコードをフラッシュします。 |
| 56 | + |
| 57 | +Particle Build を見てみましょう。これはブラウザベースの IDE であり、ブラウザから左側で選択した Photon デバイスにコードを「フラッシュ」、つまり公開できます。 |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +現在、この新しいファイルには、setup() と loop() 関数以外は何もありません。このファイルにコードを追加してみましょう。 |
| 62 | + |
| 63 | +::: tip 💡 |
| 64 | +Photon は基本的に Wi-Fi 接続された Arduino であるため、Arduino 開発の経験があれば、このコードはなじみ深いものになります。Arduino の「スケッチ」、つまりハードウェアデバイスに書き込まれるファームウェアは、一般的に C または C++ で書かれています。はんだ付けや余分な配線を避けて、デバイスの中央の LED ライトを制御するための C++ コードを少し書きます。ただし、Particle キットにはいくつかの追加機能が付属しているので、後でもっと自由に探ってみてください! |
| 65 | +::: |
| 66 | + |
| 67 | +現時点では、Photon は中央の LED が点灯しており、すべてが順調に進んでいる場合は、「青くピカピカしている」か、緑がかった青色のパルスを発しているはずです。いくつかのコードをフラッシュして、中央のライトを白くしましょう。 |
| 68 | + |
| 69 | +### 3. いくつかのコードをフラッシュする |
| 70 | + |
| 71 | +Build IDE の右側に、いくつかのコード行を含む黒いウィンドウが表示されます。loop() 関数の波かっこ内に、次のコードを貼り付けます: |
| 72 | + |
| 73 | +```js |
| 74 | +RGB.control(true); |
| 75 | +// 色を変える |
| 76 | +RGB.color(RGB_COLOR_WHITE); |
| 77 | +RGB.control(false); |
| 78 | +``` |
| 79 | + |
| 80 | +このコードは、Particle API を使用して中央の RGB LED の制御を取得し、その色を変更してから、制御を放棄します。 |
| 81 | + |
| 82 | +この新しいファイルは、Particle Build では「アプリ」と見なされます。アプリのコードをスター付きのデバイスにフラッシュする前に、左側のパネルで名前を付ける必要があります。 |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | +Particle Build の左側のナビゲーションストリップにあるフォルダアイコンをクリックして、変更を保存します。その上にある、丸で囲まれたチェックマークをクリックして、コードを「確認」します。これは基本的にコードをテストして、コンパイルできることを確認しています。最後に、Photon にスターが付けられていることを確認し、上部の稲妻アイコンをクリックして、このコードをデバイスにフラッシュします。Photon が更新され、いくつかの色が数秒間点滅した後、中央の LED が白色に変わるはずです。コードをループ関数に配置しているので、白のままです。 |
| 87 | + |
| 88 | +このスニペットを少しいじってみてください。LED を赤くできますか? |
| 89 | + |
| 90 | +### 4. Photon コードを完成させる |
| 91 | + |
| 92 | +私たちのモバイルアプリでは、LED ライトの 3 つの「モード」を作成します —LED がレインボーシリーズを点滅させる「レインボーモード」、LED が青と白を交互に点滅させる「ユニコーンモード」、そして「停止」モードで LED が白色に留まります。 |
| 93 | + |
| 94 | +ご想像のとおり、これらのルーチンを loop() 関数に配置します。 |
| 95 | + |
| 96 | +このファイルの先頭に変数を追加し、初期のライトスタイルを 0 にリストします: |
| 97 | + |
| 98 | +`int style = 0;` |
| 99 | + |
| 100 | +次に、 loop() 関数で、追加したスニペットを次のコードで上書きします: |
| 101 | + |
| 102 | +```js |
| 103 | +if (style == 0) { |
| 104 | + RGB.control(true); |
| 105 | + // 色を変える |
| 106 | + RGB.color(RGB_COLOR_WHITE); |
| 107 | + RGB.control(false); |
| 108 | +} else if (style == 1) { |
| 109 | + RGB.control(true); |
| 110 | + // 色を変える |
| 111 | + RGB.color(RGB_COLOR_RED); |
| 112 | + // 1秒遅らせる |
| 113 | + delay(500); |
| 114 | + RGB.color(RGB_COLOR_ORANGE); |
| 115 | + delay(500); |
| 116 | + RGB.color(RGB_COLOR_YELLOW); |
| 117 | + delay(500); |
| 118 | + RGB.color(RGB_COLOR_GREEN); |
| 119 | + delay(500); |
| 120 | + RGB.color(RGB_COLOR_BLUE); |
| 121 | + delay(500); |
| 122 | + RGB.color(RGB_COLOR_MAGENTA); |
| 123 | + delay(500); |
| 124 | + // 通常の操作を再開する |
| 125 | + RGB.control(false); |
| 126 | +} else if (style == 2) { |
| 127 | + RGB.control(true); |
| 128 | + // 色を変える |
| 129 | + RGB.color(RGB_COLOR_WHITE); |
| 130 | + // 1秒遅らせる |
| 131 | + delay(500); |
| 132 | + RGB.color(RGB_COLOR_MAGENTA); |
| 133 | + delay(500); |
| 134 | + // 通常の操作を再開する |
| 135 | + RGB.control(false); |
| 136 | +} |
| 137 | +``` |
| 138 | + |
| 139 | +このコードを検証し、デバイスにフラッシュします。何も変更されていないようです —スタイルが 0 に設定されているため、まだ白いままです。整数値を 1 に変更して、デバイスにフラッシュし、何が起こるかを見てみましょう。Rainbow が見えますか? |
| 140 | + |
| 141 | +これでスタイルを 0 に戻すことができるので、LED は白で初期化されます: |
| 142 | + |
| 143 | +`int style = 0;` |
| 144 | + |
| 145 | +### 5. モバイルアプリで Photon の REST API を使用する準備をする |
| 146 | + |
| 147 | +では、Photon のクールな REST API 機能を使用して、モバイルアプリが Photon を制御できるようにする必要があります。これを行うには、次の行を中かっこの間にある setup() 関数に追加します: |
| 148 | + |
| 149 | +`Particle.function("launchMode",launchMode);` |
| 150 | + |
| 151 | +モバイルアプリから利用できる `launchMode` という名前の Particle 関数を追加しました。これは、Photon のコードで同様の名前の関数を呼び出します。 |
| 152 | + |
| 153 | +loop() 関数の最後にその関数を追加します: |
| 154 | + |
| 155 | +```js |
| 156 | +int launchMode(String mode) { |
| 157 | + style = 0; |
| 158 | + |
| 159 | + if(mode=="rainbow"){ |
| 160 | + style = 1; |
| 161 | + }else if(mode=="unicorn"){ |
| 162 | + style = 2; |
| 163 | + } |
| 164 | +} |
| 165 | +``` |
| 166 | + |
| 167 | +これで、モバイルアプリは内部の `launchMode` 関数を呼び出す `launchMode` という Particle 関数を呼び出すことができ、LED フラッシュスタイルの制御に使用するモードを示す文字列を渡します。 |
| 168 | + |
| 169 | +保存して確認し、このコードをデバイスにフラッシュします。LED は白に戻ります。 |
| 170 | + |
| 171 | +### 6. 最終的な Photon コード |
| 172 | + |
| 173 | +最終的なコードは次のようになります: |
| 174 | + |
| 175 | +```js |
| 176 | +int style = 0; |
| 177 | + |
| 178 | +void setup(){ |
| 179 | + Particle.function("launchMode",launchMode); |
| 180 | +} |
| 181 | +void loop(){ |
| 182 | + if(style == 0){ |
| 183 | + RGB.control(true); |
| 184 | + // 色を変える |
| 185 | + RGB.color(RGB_COLOR_WHITE); |
| 186 | + RGB.control(false); |
| 187 | + } |
| 188 | + else if (style == 1){ |
| 189 | + RGB.control(true); |
| 190 | + // 色を変える |
| 191 | + RGB.color(RGB_COLOR_RED); |
| 192 | + // 1秒遅らせる |
| 193 | + delay(500); |
| 194 | + RGB.color(RGB_COLOR_ORANGE); |
| 195 | + delay(500); |
| 196 | + RGB.color(RGB_COLOR_YELLOW); |
| 197 | + delay(500); |
| 198 | + RGB.color(RGB_COLOR_GREEN); |
| 199 | + delay(500); |
| 200 | + RGB.color(RGB_COLOR_BLUE); |
| 201 | + delay(500); |
| 202 | + RGB.color(RGB_COLOR_MAGENTA); |
| 203 | + delay(500); |
| 204 | + // 通常の操作を再開する |
| 205 | + RGB.control(false); |
| 206 | + } |
| 207 | + else if (style == 2){ |
| 208 | + RGB.control(true); |
| 209 | + // 色を変える |
| 210 | + RGB.color(RGB_COLOR_WHITE); |
| 211 | + // 1秒遅らせる |
| 212 | + delay(500); |
| 213 | + RGB.color(RGB_COLOR_MAGENTA); |
| 214 | + delay(500); |
| 215 | + // 通常の操作を再開する |
| 216 | + RGB.control(false); |
| 217 | + } |
| 218 | +} |
| 219 | + |
| 220 | +int launchMode(String mode) { |
| 221 | + style = 0; |
| 222 | + |
| 223 | + if (mode=="rainbow") { |
| 224 | + style = 1; |
| 225 | + } else if (mode=="unicorn") { |
| 226 | + style = 2; |
| 227 | + } |
| 228 | + |
| 229 | +} |
| 230 | +``` |
| 231 | + |
| 232 | +## アプリを Scaffold する |
| 233 | + |
| 234 | +次に、JavaScript を使用してネイティブなモバイルアプリを作成します。NativeScript を使用してアプリを作成します。このアプリは、先ほどフラッシュしたコードを介して Photon と通信します。 |
| 235 | + |
| 236 | +[NativeScript Playground](https://play.nativescript.org) を開いてみてください。最初の訪問では、いくつかの「コーチマーク」が表示され、主要な機能がある場所が示されます。 |
| 237 | + |
| 238 | +「Play Now」をクリックして、メインエディタを開きます。QR コードが表示されます — NativeScriptPlay アプリでスキャンしてください。これにより、コーディング時にスマートフォンを自動的に更新できます。これで、NativeScript-Vue アプリを Scaffold する準備ができました! |
| 239 | + |
| 240 | + |
| 241 | + |
| 242 | +デフォルトでは、最初のプレイグラウンドアプリは Angular を使用して作成されます。上部の「new」をクリックし、テンプレートとして「NS-Vue」を選択します。 別の QR コードを取得するので、そのコードをスキャンしてください。スマートフォンが更新され、基本のアプリが表示されます: |
| 243 | + |
| 244 | + |
| 245 | + |
| 246 | +## ベースのマークアップを作成する |
| 247 | + |
| 248 | +`template` で少しだけ XML マークアップを使って、ActionBar、ナビゲーション用の SegmentedBar、そしてタップされると変化するパネルを備えた SegmentedBar のシンプルなレイアウトを構築します。 |
| 249 | + |
| 250 | +::: tip 💡 |
| 251 | +NativeScript レイアウトは、Web で作成した HTML とは異なります。GridLayouts や StackLayouts などのネイティブ UI に変換される NativeScript XML マークアップを使用しています。 |
| 252 | +::: |
| 253 | + |
| 254 | +`app/components/HelloWorld.vue` を開き、テンプレートの `<Page>` タグの間のすべてを削除して、以下を追加します: |
| 255 | + |
| 256 | +```html |
| 257 | +<ActionBar class="action-bar" title="Awesome Photons!" /> |
| 258 | +<StackLayout> |
| 259 | + <SegmentedBar |
| 260 | + color="white" |
| 261 | + backgroundColor="blueviolet" |
| 262 | + selectedBackgroundColor="hotpink" |
| 263 | + class="bar" |
| 264 | + :items="segmentedBarItems" |
| 265 | + v-model="selectedBarIndex" |
| 266 | + /> |
| 267 | + <StackLayout height="100%" :class="mode"></StackLayout> |
| 268 | +</StackLayout> |
| 269 | +``` |
| 270 | + |
| 271 | +バインドされた値 `:items` と `v-model` がまだ設定されていないため、SegmentedBar はまだ表示されていません。データブロック(テンプレートブロックの下、スクリプトブロック内)を見つけ、 `data()` メソッドを上書きして、SegmentedBar の値を追加します。また、デフォルトの SelectedBarIndex を設定し、 `mode` のプレースホルダー値を作成します。後者は、バーがタップされたときに UI を変更するために使われます: |
| 272 | + |
| 273 | +```js |
| 274 | +data() { |
| 275 | + return { |
| 276 | + segmentedBarItems: function () { |
| 277 | + var segmentedBarModule = require("ui/segmented-bar"); |
| 278 | + let rainbow = new segmentedBarModule.SegmentedBarItem(); |
| 279 | + rainbow.title = "Rainbows"; |
| 280 | + let unicorn = new segmentedBarModule.SegmentedBarItem(); |
| 281 | + unicorn.title = "Unicorns"; |
| 282 | + let stop = new segmentedBarModule.SegmentedBarItem(); |
| 283 | + stop.title = "Stop!"; |
| 284 | + return [rainbow, unicorn, stop]; |
| 285 | + }(), |
| 286 | + selectedBarIndex: 2, |
| 287 | + mode: '' |
| 288 | + }; |
| 289 | + }, |
| 290 | +``` |
| 291 | + |
| 292 | +これで、SegmentedBar がうまく表示されるはずです! |
| 293 | + |
| 294 | +## CSS を追加する |
| 295 | + |
| 296 | +NativeScript は、UI のスタイルを設定するために、通常の CSS および SASS のサブセットをサポートしています。それを活用して UI を改善しましょう。 |
| 297 | + |
| 298 | +`<script>` タグの下に、 `<style>` タグがあります。このブロックの 2 つのスタイルを次のように上書きします: |
| 299 | + |
| 300 | +```css |
| 301 | +.action-bar { |
| 302 | + color: white; |
| 303 | + background-color: blueviolet; |
| 304 | +} |
| 305 | +.bar { |
| 306 | + margin: 20; |
| 307 | +} |
| 308 | +.rainbow { |
| 309 | + background: linear-gradient( |
| 310 | + to bottom, |
| 311 | + red, |
| 312 | + orange, |
| 313 | + yellow, |
| 314 | + green, |
| 315 | + blue, |
| 316 | + purple |
| 317 | + ); |
| 318 | +} |
| 319 | +.unicorn { |
| 320 | + background-image: url("~/images/unicorn.jpg"); |
| 321 | + background-repeat: no-repeat; |
| 322 | + background-size: cover; |
| 323 | + background-position: center; |
| 324 | +} |
| 325 | +``` |
| 326 | + |
| 327 | +このプロジェクトに画像も追加する必要があります。この画像は、Unicorn SegmentedBarItem がタップされたときに表示されます。 |
| 328 | + |
| 329 | +「Explorer」という単語の横にある小さな「+」をクリックし、「images」というタイトルのフォルダを追加します。以下のファイルをローカルに保存し、「.jpg」ファイルとしてアップロードし、ドロップダウンで「Upload resources」ユーティリティを使用します。 |
| 330 | + |
| 331 | +::: tip 💡 |
| 332 | +ファイル名を `unicorn.jpg` に変更し、アップロード後に保存してください。 |
| 333 | +::: |
| 334 | + |
| 335 | + |
| 336 | + |
| 337 | +## メソッドの作成(1) |
| 338 | + |
| 339 | +`Rainbows` 、`Unicorns` 、または `Stop!` をタップするかどうかに応じて、UI を変更します。 |
| 340 | + |
| 341 | +SegmentedBar の動作を管理するために、 `data` メソッドの最後のコンマのあと(まだない場合はコンマを追加します)に `methods` ブロックを作成します: |
| 342 | + |
| 343 | +```js |
| 344 | +methods: { |
| 345 | + onSelectedIndexChange(args) { |
| 346 | + let segmentedBarIndex = args.object.selectedIndex; |
| 347 | + if (segmentedBarIndex == 0) { |
| 348 | + this.mode = 'rainbow' |
| 349 | + //this.launchMode(this.mode); |
| 350 | + } |
| 351 | + else if (segmentedBarIndex == 1) { |
| 352 | + this.mode = 'unicorn' |
| 353 | + //this.launchMode(this.mode); |
| 354 | + } |
| 355 | + else { |
| 356 | + this.mode = 'stop' |
| 357 | + //this.launchMode(this.mode); |
| 358 | + } |
| 359 | + } |
| 360 | + } |
| 361 | +``` |
| 362 | + |
| 363 | +::: tip 💡 |
| 364 | +貼り付けで JavaScript を追加すると、NativeScript Playground がめちゃくちゃになる場合があります。修正するには、 `<command><X>` (切り取り)を押します。 |
| 365 | +::: |
| 366 | + |
| 367 | +次に、このメソッドを監視するために `<SegmentedBar>` 自体を編集します。@selectedIndexChange を `<template>` の `<SegmentedBar>` マークアップに追加します: |
| 368 | + |
| 369 | +```html |
| 370 | +@selectedIndexChange="onSelectedIndexChange($event)" |
| 371 | +``` |
| 372 | + |
| 373 | +完成したテンプレートブロックは次のようになります: |
| 374 | + |
| 375 | +```html |
| 376 | +<template> |
| 377 | + <Page> |
| 378 | + <ActionBar class="action-bar" title="Awesome Photons!" /> |
| 379 | + <StackLayout> |
| 380 | + <SegmentedBar |
| 381 | + color="white" |
| 382 | + backgroundColor="blueviolet" |
| 383 | + selectedBackgroundColor="hotpink" |
| 384 | + class="bar" |
| 385 | + :items="segmentedBarItems" |
| 386 | + v-model="selectedBarIndex" |
| 387 | + @selectedIndexChange="onSelectedIndexChange($event)" |
| 388 | + /> |
| 389 | + <StackLayout height="100%" :class="mode"></StackLayout> |
| 390 | + </StackLayout> |
| 391 | + </Page> |
| 392 | +</template> |
| 393 | +``` |
| 394 | + |
| 395 | +これで、SegmentedBar をタップすると、UI が変更されます。 |
| 396 | + |
| 397 | +## Photon を接続する |
| 398 | + |
| 399 | +これで、SegmentedBar をタップしたときに Photon が点灯するようになりました。 |
| 400 | + |
| 401 | +プレイグラウンドの `<script>` のすぐ下で、いくつかの `const` の値を設定します。 |
| 402 | + |
| 403 | +```js |
| 404 | +const http = require("http"); |
| 405 | +const baseUrl = "https://api.particle.io/v1/devices/xxxxx"; |
| 406 | +const token = "yyyyy"; |
| 407 | +const endpoint = "launchMode"; |
| 408 | +``` |
| 409 | + |
| 410 | +これらを見ていきましょう。まず、Particle の REST API に対して http 呼び出しを行う必要があるため、 `http` モジュールが必要です。 |
| 411 | + |
| 412 | +次に、REST API にどのデバイスを呼び出してトークンを送信するかを通知する必要があります。ここで 2 つの値を変更する必要があります。Particle Build IDE に戻り、下から 3 番目のアイコンをクリックします(ターゲットのように見えます)。デバイス ID は次のとおりです: |
| 413 | + |
| 414 | + |
| 415 | + |
| 416 | +その値をコピーし、baseUrl const の `xxxxx` の値をデバイス ID に変更します。 |
| 417 | + |
| 418 | +次に、REST API 自体を使用するためのトークンが必要です。Particle Build の下部にある「歯車」アイコンをクリックし、アクセストークンの値をコピーして、 `yyyyy` をトークンに置きかえます。 |
| 419 | + |
| 420 | + |
| 421 | + |
| 422 | +追加した最後の値は、呼び出すエンドポイントの名前です。上で設定した Particle 関数を覚えていますか?これはモバイルアプリで呼び出す方法です。 |
| 423 | + |
| 424 | +## メソッドの作成(2) |
| 425 | + |
| 426 | +`onSelectedIndexChange` 呼び出しの閉じかっこの後にコンマを追加し、REST API を呼び出すメソッドを追加して、Photon の色を変更します: |
| 427 | + |
| 428 | +```js |
| 429 | +launchMode(mode) { |
| 430 | + http.request({ |
| 431 | + url: `${baseUrl}/${endpoint}?access_token=${token}`, |
| 432 | + method: "POST", |
| 433 | + headers: { 'content-type': 'application/json' }, |
| 434 | + content: JSON.stringify({ |
| 435 | + mode: mode |
| 436 | + }) |
| 437 | + }).then((response) => { |
| 438 | + console.log(JSON.stringify(response)) |
| 439 | + }, (e) => { |
| 440 | + alert("error") |
| 441 | + }); |
| 442 | + } |
| 443 | +``` |
| 444 | + |
| 445 | +ここでは、Particle 関数として設定したエンドポイントで baseUrl に http リクエストを送信し、文字列を渡して、フラッシュするカラーシーケンスを関数に伝えています。 |
| 446 | + |
| 447 | +最後に、SegmentedBar がタップされたときに実際に `launchMode` を呼び出す必要があります。 `onSelectedIndexChange` メソッドの `// this.launchMode(this.mode)` コメントコードを外してください。 |
| 448 | + |
| 449 | +HelloWorld.vue ファイル全体は次のようになり、個人用デバイスの ID とトークンが入力されます: |
| 450 | + |
| 451 | +```js |
| 452 | +<template> |
| 453 | + <Page> |
| 454 | + <ActionBar class="action-bar" title="Awesome Photons!" /> |
| 455 | + <StackLayout> |
| 456 | + <SegmentedBar color="white" backgroundColor="blueviolet" |
| 457 | + selectedBackgroundColor="hotpink" class="bar" |
| 458 | + :items="segmentedBarItems" v-model="selectedBarIndex" |
| 459 | + @selectedIndexChange="onSelectedIndexChange($event)" /> |
| 460 | + <StackLayout height="100%" :class="mode"></StackLayout> |
| 461 | + </StackLayout> |
| 462 | + </Page> |
| 463 | +</template> |
| 464 | + |
| 465 | +<script> |
| 466 | + const http = require("http"); |
| 467 | + const baseUrl = |
| 468 | + "https://api.particle.io/v1/devices/<your device id>"; |
| 469 | + const token = "<your token>"; |
| 470 | + const endpoint = "launchMode"; |
| 471 | + export default { |
| 472 | + data() { |
| 473 | + return { |
| 474 | + segmentedBarItems: (function() { |
| 475 | + var segmentedBarModule = require( |
| 476 | + "ui/segmented-bar"); |
| 477 | + let rainbow = new segmentedBarModule |
| 478 | + .SegmentedBarItem(); |
| 479 | + rainbow.title = "Rainbows"; |
| 480 | + let unicorn = new segmentedBarModule |
| 481 | + .SegmentedBarItem(); |
| 482 | + unicorn.title = "Unicorns"; |
| 483 | + let stop = new segmentedBarModule |
| 484 | + .SegmentedBarItem(); |
| 485 | + stop.title = "Stop!"; |
| 486 | + return [rainbow, unicorn, stop]; |
| 487 | + })(), |
| 488 | + selectedBarIndex: 2, |
| 489 | + mode: "" |
| 490 | + }; |
| 491 | + }, |
| 492 | + methods: { |
| 493 | + onSelectedIndexChange(args) { |
| 494 | + let segmentedBarIndex = args.object.selectedIndex; |
| 495 | + if (segmentedBarIndex == 0) { |
| 496 | + this.mode = "rainbow"; |
| 497 | + this.launchMode(this.mode); |
| 498 | + } else if (segmentedBarIndex == 1) { |
| 499 | + this.mode = "unicorn"; |
| 500 | + this.launchMode(this.mode); |
| 501 | + } else { |
| 502 | + this.mode = "stop"; |
| 503 | + this.launchMode(this.mode); |
| 504 | + } |
| 505 | + }, |
| 506 | + launchMode(mode) { |
| 507 | + http.request({ |
| 508 | + url: `${baseUrl}/${endpoint}?access_token=${token}`, |
| 509 | + method: "POST", |
| 510 | + headers: { |
| 511 | + "content-type": "application/json" |
| 512 | + }, |
| 513 | + content: JSON.stringify({ |
| 514 | + mode: mode |
| 515 | + }) |
| 516 | + }).then( |
| 517 | + response => { |
| 518 | + console.log(JSON.stringify(response)); |
| 519 | + }, |
| 520 | + e => { |
| 521 | + alert("error"); |
| 522 | + } |
| 523 | + ); |
| 524 | + } |
| 525 | + } |
| 526 | + }; |
| 527 | +</script> |
| 528 | + |
| 529 | +<style scoped> |
| 530 | + .action-bar { |
| 531 | + color: white; |
| 532 | + background-color: blueviolet; |
| 533 | + } |
| 534 | + |
| 535 | + .bar { |
| 536 | + margin: 20; |
| 537 | + } |
| 538 | + |
| 539 | + .rainbow { |
| 540 | + background: linear-gradient(to bottom, red, orange, yellow, green, blue, purple); |
| 541 | + } |
| 542 | + .unicorn { |
| 543 | + background-image: url('~/images/unicorn.jpg'); |
| 544 | + background-repeat: no-repeat; |
| 545 | + background-size: cover; |
| 546 | + background-position: center; |
| 547 | + } |
| 548 | +</style> |
| 549 | +``` |
| 550 | + |
| 551 | +これで、正しいコードがフラッシュされた状態で Photon が Wi-Fi に接続されている場合、モバイルアプリでのジェスチャが Photon の中央の LED を点灯しているのを確認できます! |
| 552 | + |
| 553 | + |
| 554 | + |
| 555 | +NativeScript Playground でモバイルデバイス用の Vue.js アプリを作成することは本当に興味深いです。やり方がわかったので、他にどんなものを作れますか?このアプリを拡張して、さまざまな照明モードを作成できるのではないでしょうか? |
| 556 | + |
| 557 | +## Author |
| 558 | + |
| 559 | +Made with 📱❤️ by Jen Looper |
0 commit comments