はじまる

適当な事を適当に書く

AWS IoT CLI or SDK で device shadow を更新したい

はじめに

とあるデバイスのなかで稼働する特定のミドルウェアの起動状態を AWS IoT の Shadow で管理している。

  • middleware.poweron のときにサービス起動
  • middleware.poweroff のときにサービス停止

といった感じ。ちなみにデバイスのなかに、AWS IoT のエージェントが常駐している。 下記のようなイメージ。

f:id:satorusangakoronda:20170331180726p:plain

非商用のデモ用デバイスで、使う機会はそんなになく、あまり厳密な管理はしていないのだけど、諸用でちょこちょこ再起動が必要になってきた。で、再起動には device shadow の middleware.poweroff してから on するといいんだけど、AWS IoT の管理画面をちょこちょこいじるのは面倒になってきたので、手元のPCから操作ちょっとしたスクリプトを書こうと思った。

アプローチ

aws iot-data コマンド

$aws iot-data update-thing-shadow help

~
SYNOPSIS
            update-thing-shadow
          --thing-name <value>
          --payload <value>
          outfile <value>

OPTIONS
       --thing-name (string)
          The name of the thing.

       --payload (blob)
          The state information, in JSON format.

       outfile (string) Filename where the content will be saved

OUTPUT
       payload -> (blob)
          The state information, in JSON format.

partial update は出来ないようだ。なので、divice shadow の一部分を更新したい、というときは、一度 aws iot-data get-thing-shadow でshadow の全文を取得し、書き換えてから改めてupdate-thing-shadowで全文を書き換えるということになる。なんか嫌だけど、そのくらい割り切った方がスッキリしていていいかもしれない。

実装

あとで書く

エンドポイント

ちなみに、AWS IoT はリージョンサービスで、エンドポイントはリージョン毎に異なる。 ただし、リージョンの前にくるサブドメインは、1 ルートアカウントにつき1つになる。 f:id:satorusangakoronda:20170331174403p:plain

JSON がらみの Webサイトまとめ

設計記述

JSON Schema の公式サイト json-schema.org

変換

JSON 形式の文字列を貼り付けると 整形(pretty print) してくれる jsonprettyprint.com

JSON Schema Editor JSONSchema.Net

JSON 形式の文字列を貼り付けると、以下の4つの形式に変換してくれる

  • Pretty
  • Plain
  • Mini
  • Web

検証

JSON Schema Online Validator www.jsonschemavalidator.net

pip が入ってなかったのでインストールする

pip が入ってなかったのでインストールする。 EC2 のインスタンスです。 OSはこんな感じ。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.2 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.2 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

pip のインストールには、 https://bootstrap.pypa.io/get-pip.py

を利用しました。

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 1.1MB/s
Collecting setuptools
  Downloading setuptools-34.3.3-py2.py3-none-any.whl (389kB)
    100% |████████████████████████████████| 399kB 3.3MB/s
Collecting wheel
  Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB)
    100% |████████████████████████████████| 71kB 11.1MB/s
Collecting appdirs>=1.4.0 (from setuptools)
  Downloading appdirs-1.4.3-py2.py3-none-any.whl
Collecting packaging>=16.8 (from setuptools)
  Downloading packaging-16.8-py2.py3-none-any.whl
Requirement already up-to-date: six>=1.6.0 in /usr/lib/python2.7/dist-packages (from setuptools)
Collecting pyparsing (from packaging>=16.8->setuptools)
  Downloading pyparsing-2.2.0-py2.py3-none-any.whl (56kB)
    100% |████████████████████████████████| 61kB 11.1MB/s
Installing collected packages: pip, appdirs, pyparsing, packaging, setuptools, wheel
Successfully installed appdirs-1.4.3 packaging-16.8 pip-9.0.1 pyparsing-2.2.0 setuptools-34.3.3 wheel-0.29.0

$ which pip
/usr/local/bin/pip

できました。

Python & OpenCV で 画像に含まれる円を検出する

元ネタはこれです。

Hough Circle Transform — OpenCV-Python Tutorials 1 documentation

#detect_circle.py

import sys
import cv2
import numpy as np

args = sys.argv

img = cv2.imread(args[1], 0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=0,maxRadius=0)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

cv2.imwrite('detected_' + args[1], cimg)

コマンドラインから下記のように使います。

$python detect_circle.py target.jpg

やってみた1

元画像

上記リンクでの例

f:id:satorusangakoronda:20170327214319p:plain

検出結果画像

検出された円が、線画で上書きされています。

f:id:satorusangakoronda:20170327214349p:plain

やってみた2

元画像

ぱくたそのやつ。ポンポンが丸として検出されることを期待。 f:id:satorusangakoronda:20170327214518p:plain

検出結果画像

ナンジャコリャ f:id:satorusangakoronda:20170327214553p:plain

得手不得手があるみたいですね。

Python & OpenCV で 画像を変換する

昨日OpenCVを入れてみたのでお試し。同じフォルダにあるPNGファイルを、グレースケールにして別ファイルとして保存する。

# python 2.7.12
# cv2.__version__ 3.2.0

import os
import cv2

pwd = os.getcwd() #現在のディレクトリパスを取得
ls = os.listdir(pwd) #現在のディレクトリにあるファイルの一覧を配列で取得
png_files = filter (lambda n:n[-3:]=="png", ls) #上記からPNGファイルだけ抜き出す

for png in png_files:
        grey  = cv2.imread(png, 0) #グレースケールで読み込む
        cv2.imwrite("gray_scale_" + png, grey) #別名で保存

あとで諸々整理しよう。

Debian 8 に OpenCV をインストールする

下記のサイトにある様に、 milq さんという方の書いたインストールスクリプトを使う。 milq.github.io

#!/bin/bash

sudo apt-get autoremove libopencv-dev python-opencv
cd /usr/local/src/
wget https://raw.githubusercontent.com/milq/milq/master/scripts/bash/install-opencv.sh
chmod +x ./install-opencv.sh
./install-opencv.sh

ちなみに debian 8 (Jessie) が動いている IoT ゲートウェイと、 Ubuntu 16.04 LTS が動いている EC2 両方に OpenCV をインストールしなきゃいけないという状況だったんですが、これでどちらもイケました。EBS のボリュームサイズが 8GB だと容量不足でエラーがでていた為、16GB にしたらOKでした。

高山羽根子『うどん キツネつきの』

 

うーん、面白いんだろうけど、シュールなので、読んでて疲れたのか、余り読み進められなかった。歳だろうか…。

 

気力のある時なら読めるかもしれない。