[JAWS-UG CLI] IoT #16 ダミーデバイスでShadowを操作

前提条件
========

## MacOS X El Capitanでは動作しません。

- iot-dataコマンドは、OpenSSL 1.0.1以上が必要となるため、この手順はEC2インスタンス上などで実施してください。

```bash:変数の設定(EC2):
export AWS_ACCESS_KEY_ID='アクセスキーID'
export AWS_SECRET_ACCESS_KEY='シークレットアクセスキーID'
```


IoTへの権限
-----------

AWS IoTに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.47

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.11.49 Python/2.7.10 Darwin/15.6.0 botocore/1.5.12
```

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


## ダミーデバイス(EC2)の構築済み

http://qiita.com/tcsh/items/8ec8419b9170f2cc36f0





0. 準備
=======


0.1. リージョンの決定
---------------------

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージ
ョンも切り変わります。)

```bash:コマンド(東京リージョンの場合):
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. プロファイルの確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:コマンド:
aws configure list
```

```text:結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION
```

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 そ
れ以外のときにprofileが '<not set>' と表示される場合は、以下を実行して
ください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


## 0.3. モノ名の指定

```bash:変数の設定:
IOT_THING_NAME='handson-thing-20170220'
```


# 1. 事前作業


# 2. Shadowの中でdummy内の変数を制御

## 2.1. Shadowの確認

```bash:変数の設定:
FILE_OUTPUT='result-dummy-before.json'
```

```bash:コマンド:
aws iot-data get-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
```

```text:結果(例):
An error occurred (ResourceNotFoundException) when calling the GetThingShadow operation: No shadow exists with name: 'handson-thing-20170220'
```



## 2.2. Shadow作成

```bash:変数の設定:
FILE_OUTPUT='result-dummy-01.json'
IOT_DATA_PAYLOAD='{"state":{"reported":{"wait_time":20, "signal":"green"}}}'
```

```bash:コマンド:
echo ${IOT_DATA_PAYLOAD} | jsonlint
```

```json:結果:
{
  "state": {
    "reported": {
      "wait_time": 20,
      "signal": "green"
    }
  }
}
```

```bash:変数の確認:
cat << ETX

  IOT_THING_NAME:   ${IOT_THING_NAME}
  IOT_DATA_PAYLOAD: ${IOT_DATA_PAYLOAD}
  FILE_OUTPUT:      ${FILE_OUTPUT}

ETX
```


```bash:コマンド:
aws iot-data update-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  --payload "${IOT_DATA_PAYLOAD}" \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
```

```json:結果(例):
{"state":{"reported":{"wait_time":20,"signal":"green"}},"metadata":{"reported":{"wait_time":{"timestamp":1487505988},"signal":{"timestamp":1487505988}}},"version":1,"timestamp":1487505988}
```

## 2.3. shadow update 

```bash:変数の設定:
FILE_OUTPUT='result-shadow-01.json'
IOT_DATA_PAYLOAD='{"state":{"desired":{"wait_time":20, "signal":"green"}}}'
```

```bash:コマンド:
echo ${IOT_DATA_PAYLOAD} | jsonlint
```

```json:結果:
{
  "state": {
    "desired": {
      "wait_time": 20,
      "signal": "green"
    }
  }
}
```

```bash:変数の確認:
cat << ETX

  IOT_THING_NAME:   ${IOT_THING_NAME}
  IOT_DATA_PAYLOAD: ${IOT_DATA_PAYLOAD}
  FILE_OUTPUT:      ${FILE_OUTPUT}

ETX
```

```bash:コマンド:
aws iot-data update-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  --payload "${IOT_DATA_PAYLOAD}" \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
```


```text:結果(例):
{"state":{"desired":{"wait_time":20,"signal":"green"}},"metadata":{"desired":{"wait_time":{"timestamp":1487506160},"signal":{"timestamp":1487506160}}},"version":2,"timestamp":1487506160}
```


## 2.4. shadowの確認

```bash:変数の設定:
FILE_OUTPUT='result-shadow-after.json'
```


```bash:コマンド:
aws iot-data get-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
```

```text:結果(例):
{"state":{"desired":{"wait_time":20,"signal":"green"},"reported":{"wait_time":20,"signal":"green"}},"metadata":{"desired":{"wait_time":{"timestamp":1487506160},"signal":{"timestamp":1487506160}},"reported":{"wait_time":{"timestamp":1487505988},"signal":{"timestamp":1487505988}}},"version":2,"timestamp":1487506296}
```


# 2.5. ダミーデバイス (EC2)

```bash:コマンド(EC2):
cd ~/shadow/ \
  && python dummy_shadow.py
```

```text:結果:
start readConfig func
start connct shadow
shadow connect
satrt subscribe shadow
send currnet status to cloud-shadow
{"state":{"reported":{"wait_time":10, "signal":"green"}}}
```

ダミーデバイスのプログラム停止 (EC2)

Ctrl+Cでプログラムを停止します。



# 3. Shadowの変数でプログラムを終了させる(電源管理イメージ)


## 3.1. Thing名の変更

ここでは、Thing名を現時点で存在しない「handson-thing-20170220_power」に変更します。

```bash:変数の設定:
IOT_THING_NAME="${IOT_THING_NAME}_power"
```


## 3.2. Shadow更新

```bash:変数の設定:
FILE_OUTPUT='result-multi-01.json'
IOT_DATA_PAYLOAD='{"state":{"desired":{"power":"on"}}}'
```

```bash:コマンド:
echo ${IOT_DATA_PAYLOAD} | jsonlint
```

```json:結果:
{
  "state": {
    "desired": {
      "power": "on"
    }
  }
}
```

```bash:変数の確認:
cat << ETX

  IOT_THING_NAME:   ${IOT_THING_NAME}
  IOT_DATA_PAYLOAD: ${IOT_DATA_PAYLOAD}
  FILE_OUTPUT:      ${FILE_OUTPUT}

ETX
```


```bash:コマンド:
aws iot-data update-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  --payload "${IOT_DATA_PAYLOAD}" \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
```


```text:結果(例):
{"state":{"desired":{"power":"on"}},"metadata":{"desired":{"power":{"timestamp":1487506888}}},"version":3,"timestamp":1487506888}
```


## 3.3. shadowの確認

```bash:変数の設定:
FILE_OUTPUT='result-shadow-after.json'
```


```bash:コマンド:
aws iot-data get-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
```

```text:結果(例):
{"state":{"desired":{"wait_time":20,"signal":"green","power":"on"},"reported":{"wait_time":20,"signal":"green"},"delta":{"power":"on"}},"metadata":{"desired":{"wait_time":{"timestamp":1487506160},"signal":{"timestamp":1487506160},"power":{"timestamp":1487506888}},"reported":{"wait_time":{"timestamp":1487505988},"signal":{"timestamp":1487505988}}},"version":3,"timestamp":1487506913}
```


# 3.4. ダミーデバイス (EC2)

```bash:コマンド(EC2):
cd ~/shadow/ \
  && python multi_shadow.py
```

```text:結果:
start readConfig func
satrt subscribe power-shadow
start connct shadow tmp01_power
Send power on to shadow name
satrt subscribe config-shadow
start connct shadow tmp01
send currnet status to cloud-shadow
{"state":{"reported":{"wait_time":10, "signal":"green"}}}
```

ダミーデバイスのプログラム停止 (EC2)

Ctrl+Cでプログラムを停止します。


# 4. 事後作業


完了
====