ChinoDuino(Chino × Arduino)

自発性のないプログラマーがArduinoと出会って悪戦苦闘する様を綴っていく⇒今はいろいろ(^^;

SORACOM UG 信州を通じてWebエンジニアが農業と関わってます!

こんにちは! SORACOM Advent Calendar 2018 9日目 担当のchinoppyこと知野です。

Webエンジニアが、SORACOM UG 信州を通じて、農業と関わり、そこでSORACOMを使用してシステム構築等おこなったお話しです。

本業もあり、動ける範囲での構築だったので、エラー処理などちょっと怪しいところもありますが、、、便利なサービス/機能/ライブラリなどを使ってなるべく「つくらない」こともとりいれながらやってみましたので、そのあたりで使用したものなども紹介していきたいと思います!(だいたいはみんな知っているものばかりかもしれませんが、、、)

なお、この内容は SORACOM UG 信州 #5SORACOM UG 農業活用コミュニティ #1 で私が発表したものをあわせたような内容になってます!

【目次】

きっかけ

今年3月に開催された SORACOM UG 信州 #3 に参加し、懇親会も参加してくださった農業従事者の浦野さんから

  • 農業仲間からハウス内の環境データ収集をしたい!
  • できればスマホで遠隔監視もしたい

と要望をうけ、

  • センサ/ハード側(以降、IoTボックスと記載)はできる
  • でもクラウド側/Webの知識がなくどうやっていけばよいかわからない

とお話しがあり、私も含め、クラウド/Web側の知識はあるので、SORACOM UG 信州のひとつの企画としてサポートしていこうと決定しました!

私の担当は

  • ハード側の制御プログラム(一部)
  • クラウド/Web側

ですので、このあたりを中心に書いていきます!

IoTボックス

浦野さんが作成したIoTボックスのこと

仕様等

  • 3G対応データ通信端末 AK-020を使用
  • もちろんSIMは「SORACOM Air
  • Raspberry Pi 3 Model Bを使用
  • 収集データ
    • 気温(2地点)
    • 湿度
    • 地温
    • 葉音
    • 日射量
    • 土壌水分(pF)

制御プログラム

  • 言語:Python3
  • 主な処理(★が私が担当分)
    • 各センサのデータ収集
    • 10秒ごとに取得したデータをLCDに表示
    • 毎正時10分ごと取得したデータをクラウドへ送信(★)
    • 送信できなかった場合は、次回の送信時に再送信(★)
    • 1時間毎に再起動(※ここはちょっと頻度が多いので伸ばす予定・・・)(★)
送信処理について

Pythonのライブラリの「requests」を使用して、SORACOM Funnel経由で、AWS IoTへ送信してます。

    db_manager = SqliteDbManager()
    with db_manager.transaction() as session_pq:

        # 再送信データを取得
        send_data_obj = SendData()
        send_data_list = send_data_obj.get_retry_data(session_pq)
        send_data_list.append(payload_str)

        for d in send_data_list:
            try:
                res = requests.post('http://funnel.soracom.io',
                                    data=d, headers=headers, timeout=5)
                res.raise_for_status()
            except Exception as e:
                # 未送信データを保存
                entry = SendData(payload=d)
                session_pq.add(entry)

これを直接、AWS IoTへ送信するとなると、

  • 証明書をラズパイに置かないといけない
  • AWS IoT Device SDK for Pythonがあるが、もっと処理が複雑になってしまう

ことなどあり、SORACOM Airを使用することにより、requests一発で送信できるのは本当に便利!

Tips

最初、Funnelに送信すると以下のエラーが発生

Response:400 
message:Failed to get credentials for OP0063709878, aws-iot" 

全然、わからず寝る前にソラコム・サポートへ問い合わせ(リクエストを送信)。

次の日に丁寧な返信があり、無事解決(TT)

SIMグループにSORACOM Beamの設定もあったことが原因だったもよう。最初はSORACOM Beamを使用しようと思ったけど、途中でSORACOM Funnelにかえたので、設定が残っていた。。。

新しくSIMグループを作成、そこでSORACOM Funnelを設定。無事、送信できました!

迅速なご対応ありがとうございました!(TT)

クラウド(IoTボックス→データ保存のあたり)

こんな構成になってます

f:id:chinoppy:20190123233346p:plain

SORACOM

SORACOM FunnleとSORACOM Gateの「Public Gate機能」を使用してます。

SORACOM Funnel

AWS IoTへ送信してます

f:id:chinoppy:20181209161726p:plain
SORACOM Funnle

Public Gate機能

Mitsuyoshi Okiさんに教えていただいた便利機能です!

メンテンナス時に、この機能を利用して、自宅→ハウスのRaspberry Piに接続してメンテナンス等しています

SORACOMが用意しているVPGを利用して、デバイス間通信が可能です

ただし、Public Gate は他のSORACOMユーザと VPG を共用するモデルになっていて、他のユーザの所有する SORACOM Air SIM からもお客様のデバイスに対する通信が可能となるため、デバイスへの意図しないアクセスを防ぐためにセキュリティ対策を十分に行ってください。(こちらのデバイスのセキュリティ対策から抜粋)

こんな感じで

  • 接続したいSIM同士を同じグループにする

f:id:chinoppy:20181209163222p:plain
SIM管理

  • SORACOM Air for Cellular設定で「ON」にする

f:id:chinoppy:20190123231623p:plain

f:id:chinoppy:20181209163522p:plain
SIM詳細

もし、接続できない場合は、セッションの切断してみましょう。

★ご注意

  • 指定の料金が発生しますので、使用するとき以外はOFFにしておくことをおすすめします(VPG料金表 参照)
  • OFFにした後も、セッションの切断をしておいたほうがよいそうです(セッションが残っていると課金となってしまっている場合がある)

AWS

AWS IoT、DynamoDB

AWS IoTのルールを使用して、DynamoDBへ送信データを書き込んでいます

これもノンプログラミングで書き込みできて便利!

CloudWatch、Lambda、S3

毎朝9時にLambdaを実行して、DynamoDBへ書き込んだデータを前日1日分ずつファイルに出力し保存(バックアップ)するようにしてます

クラウド/Web(AWS⇔Webあたり)

構成はこんな感じ

f:id:chinoppy:20181209165945p:plain
クラウドAWS、Webあたり)

AWS

API Gateway

API Gateway、LambdaでDynamoDBからデータを取得できるようにしました

ちなみに

AWS側の構築では、「serverless framework」を使用してます

AWSコンソールからいちいち、ポチポチサービスの設定などする必要がなく、便利ですね

  • 毎日9時(JST)にLambdaを実行
functions:
  output_dynamodb_to_s3:
    handler: handler.output_dynamodb_to_s3
    description: DynamoDB to S3
    events:
      - schedule: cron(0 0 ? * * *)
  • S3、DynamoDBあたりの設定
resources:
  Resources:
    [Name]:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: [バケット名]
    [Name]:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: [テーブル名]
        AttributeDefinitions:
          - AttributeName: imsi
            AttributeType: S
          - AttributeName: timestamp
            AttributeType: N
        KeySchema:
          - AttributeName: imsi
            KeyType: HASH
          - AttributeName: timestamp
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 3
          WriteCapacityUnits: 3

Web

herokudjangoをデプロイして、IoTボックスから取得したデータを表示するようにしました

herokuもいちいちサーバ構築せず、Webページを公開できて便利!

画面構成

f:id:chinoppy:20181209172034p:plain
グラフ・表

CSVダウンロードもできますw

f:id:chinoppy:20181209172201p:plain
CSVダウンロード

グラフ部分

Chart.jsを使ってます

表示させるデータをリストにして、渡すだけで、きれいなグラフを描けて便利!

項目の定義と「data」に表示したいデータのリストを指定

        var ctx = document.getElementById("id-chart").getContext('2d');
        var chart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: labels,
                datasets: [
                    {
                        label: '温度1',
                        data: dataTemp1,
                        backgroundColor: 'rgba(0, 0, 0, 0)',
                        borderColor: 'rgba(255, 99, 132, 1)',
                        borderWidth: 1
                    },
                    {
                        label: '湿度',
                        data: dataHumi,
                        backgroundColor: 'rgba(0, 0, 0, 0)',
                        borderColor: 'rgba(2, 99, 132, 1)',
                        borderWidth: 1
                    },
                    {
・・・

絞り込みの表示などもデフォルトでできるので、うれしい!上の項目をクリックすることにより選択可能(これは、浦野さんに言われて気がつきましたw)

f:id:chinoppy:20181209173543p:plain
絞り込み

表部分

Data Tables for jQueryを使用してます。

これも、Chart.jsのように項目を定義して表示するデータを渡せば、表ができて便利!

検索、ソート機能、ページングがデフォルトでついている!

コスト

今のところ、600円/月〜800円/月程度

  • 内訳
    • Air SIM(基本料金)
      • SIM2枚(ハウス用、VPG用)=600円
    • Air SIM(データ通信帳)
      • 350KB/日 × 30日 = 10,500KB = 2円くらいw
    • Funnelは無料利用枠内、タダ!(毎正時10分ごと)
      • 6回/時 × 24時間 × 30日 = 4,320リクエス
    • PrivateGarden
      • たまに使用
    • AWS
      • 12ヶ月無料期間中(終了したとしても数十円程度くらい)
    • Heroku
      • 無料枠内のためタダ

今後

SORACOM UG

この企画のことも含め今年でた課題などまた話しあっていきながら、本業もあるので、私のできる範囲で今後もゆる〜く関わっていきたいと思いますw

使いたい、試したい、活用したいSORACOMのサービス

SORACOM Beam

まだ、SORACOMを使ってのAWS Shadowを使ったことないので試したいと思っています。。。

SORACOM Inventory

こちらもAWS IoTでのデバイス管理(Just In Timeなど)は多少触ったことがあるので、SORACOMを使った場合、どのようになるか興味があります。

SORACOM Lagoon

今回、構築したようなシステムを簡単に構築できるSORACOM Lagoonというサービスもあるので、すぐ可視化したい、プロトタイピングのときや、すぐユーザにみせたいときなど、最適なサービスもあるので、活用したいです!

f:id:chinoppy:20181209174722p:plain
SORACOM Lagoon

最後に

正直、今年のはじめにここまで関わるとは思っていませんでした(^^;

この企画等、紹介できなかったことがたくさんあり、そしてたくさんのひとが関わっています。今、振り返ってみると、誰一人かけても実現していなかったんだなぁっと、すごく感じています。

このような、それぞれの得意分野でお互い補いながらできたことが、とてもうれしいですね。

本当に、SORACOM UG等を通じて、私に関わっていただいた方々に本当に感謝感謝です(TT)

来年もよろしくお願いします!

それでは、明日の zoe6120 さんにバトンタッチです!

Greengrass試してみたよ(chino × Greengrass)

AWS Greengrassを試してみようと思い、以下開発者ガイドに沿ってやってみたときの備忘録

docs.aws.amazon.com

【目次】

環境

やってみた感想など

  • Raspberry Pi のセットアップのやり方も書いてあり驚き!
  • Amazon EC2 インスタンスのセットアップがあったが、用途が理解できていない【要復習!】
  • Greengrass Core ソフトウェアをRaspberry Piへインストールするところが手間取ってしまった
    • でもインストール完了できれば、AWSコンソールからデプロイなどでき、ほぼRaspberry Piを触ることがなくなりそう
  • Lambdaで書いたソースがRaspberry Piで実行できることに驚き!
  • AWS IoT デバイス SDKより、AWS Greengrass コア SDKの方が簡単にpublishできた

Greengrass BlackBeltオンラインセミナー

こちら、すごく勉強になります

  • 一部内容を抜粋
    • LambdaはGreengrass用のLambdaを使用する
      • このLambdaには、long-liveモードという実行し続けられるモードがある
      • Python3系は非対応(TT)

aws.amazon.com

はまったところなど

sqlite3のインストール時

モジュール 1: Greengrass の環境設定 - AWS Greengrass

上記ページの「8.これで、AWS Greengrass の Raspberry Pi を・・・」の部分

  • エラー
pi@chinopi:~/greengrass $ sudo apt-get install sqlite3
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 sqlite3 : Depends: libsqlite3-0 (= 3.7.13-1+deb7u4) but 3.8.7.1-1+deb8u2 is to be installed
E: Unable to correct problems, you have held broken packages.
pi@chinopi:~/greengrass $
  • 解決策
pi@chinopi:~/greengrass $ sudo apt-get install libsqlite3-0=3.7.13-1+deb7u4
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  libsqlite3-dev
The following packages will be DOWNGRADED:
  libsqlite3-0
0 upgraded, 0 newly installed, 1 downgraded, 1 to remove and 99 not upgraded.
Need to get 415 kB of archives.
After this operation, 1,403 kB disk space will be freed.
Do you want to continue? [Y/n] Y
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libsqlite3-0 armhf 3.7.13-1+deb7u4 [415 kB]
Fetched 415 kB in 5s (70.1 kB/s)      
(Reading database ... 187757 files and directories currently installed.)
Removing libsqlite3-dev:armhf (3.8.7.1-1+deb8u2) ...
dpkg: warning: downgrading libsqlite3-0:armhf from 3.8.7.1-1+deb8u2 to 3.7.13-1+deb7u4
(Reading database ... 187746 files and directories currently installed.)
Preparing to unpack .../libsqlite3-0_3.7.13-1+deb7u4_armhf.deb ...
Unpacking libsqlite3-0:armhf (3.7.13-1+deb7u4) over (3.8.7.1-1+deb8u2) ...
Setting up libsqlite3-0:armhf (3.7.13-1+deb7u4) ...
Processing triggers for libc-bin (2.19-18+deb8u10) ...
pi@chinopi:~/greengrass $ 

バイスAWS Greengrass起動時

  • エラー
pi@chinopi:/greengrass/ggc/packages/1.5.0 $ sudo ./greengrassd start
Setting up greengrass daemon
Validating hardlink/softlink protection
Validating execution environment
Found cgroup subsystem: cpuset
Found cgroup subsystem: cpu
Found cgroup subsystem: cpuacct
Found cgroup subsystem: blkio
Found cgroup subsystem: devices
Found cgroup subsystem: freezer
Found cgroup subsystem: net_cls

Starting greengrass daemon
Greengrass daemon 3824 failed to start
[2018-04-14T11:02:57.600941406Z] Failed to invoke PutLogEvents on local Cloudwatch, logGroup: /GreengrassSystem/certmanager, error: RequestError: send request failed
caused by: Post http://localhost:8000/2016-11-01/cloudwatch/logs/: dial tcp 127.0.0.1:8000: getsockopt: connection refused, response: {

}
[2018-04-14T11:02:57.768114857Z] Failed to invoke PutLogEvents on local Cloudwatch, logGroup: /GreengrassSystem/syncmanager, error: RequestError: send request failed
caused by: Post http://localhost:8000/2016-11-01/cloudwatch/logs/: dial tcp 127.0.0.1:8000: getsockopt: connection refused, response: {

}
・・・・・・
  • 解決策

https://forums.aws.amazon.com/thread.jspa?threadID=264348

上記を参考に、デバイス側で以下コマンドを実行

$ sudo apt-get install --reinstall raspberrypi-bootloader raspberrypi-kernel

SORACOM Technology Camp 2018 参加記録

先月の26日に開催された SORACOM Technology Camp 2018 の参加記録です。

technology-camp2018.soracom.jp

トラックB IoT つないだ、その後に 〜be connected 〜 」側の発表を聞いていました。
試作から量産へ意識することや、デバイス管理、セキュリティなど、自分が知りたかったこと、知らなかったことなど、すごく勉強になりました!
あと、サービスごとの繋がりもみえてきて、こちらも勉強になりました。

今後、勉強していくうえで、振り返りたいセッションを中心に書いていきます!

★全スライド、発表等は @ko2a さんがまとめてくれたこちらをどうぞ!
ありがとうございます!

qiita.com

B1. SORACOM を API で 256 倍使いこなす方法

www.slideshare.net

「邪眼」の小熊さんのセッションです
パケットをみていると怪しい箇所がみえてくるそうです
すごい!

  • APIでできること、APIの特徴など基本的なことから実際にコンソールで試しながらのセッションでした
  • SORACOM APIを呼び出しているUser Agentの円グラフなど興味深かったですw
  • イベントハンドラー、メタデータの詳細はみる
  • SIM注文のAPIのテストは SORACOM API Sandbox が便利

B2. 通信モジュール内蔵デバイス制作のための心構え

www.slideshare.net

高橋さんとSeeedの坪井さんのセッションです
ソフトのエンジニアとしては普段、触れることのないことばかりですごく刺激になりました!

  • seeedさんの製造サービスはいつになるかわからないけど注文してみたい
  • 試作と量産は違う!
    • Seeedさんはノウハウがいる!
      • リフロー時の注意点:捨て板、間隔、部品感の距離
    • 量産に役立つ試作!
      • 調達できない部品を使うのは工作!
      • 再現性が大事!
    • 既にPoCができている=実現可能なモノ
    • 予算感($20,000〜)
  • アフターフォロー
    • 利用シーンを意識する
    • 設置環境
    • セルラー通信は「手軽」だが「確実」ではない
      • 「無線」は「線が無い」ことを意識する
      • 有線ではない!
      • 事例:
        • 冬は通信できるのに夏になると通信できなくなる
          • →樹木に葉が茂る→葉の水分が電波を通しにくい
          • →乾燥剤いれる
        • 毎日同じ時間に通信できないことがある
          • →フェリーが通り、乗船者がいるため通信量が増えた

B3. SORACOMで実現するデバイス管理

www.slideshare.net

今井さんのセッションです
バイス管理については、今回一番知りたかったこと
実例とケーススタディの部分がワークフロー形式でわかりやすく勉強になりました

  • SORACOMの各種APIは「SIM(IMSI)」に対して行う
    • →このため、デバイスごとにSIMを挿したほうがよい
  • バイスとSIMのひも付け
    • Beamなら自動でできる!
  • バイスの初期設定&動作確認
  • 利用開始
    • イベントハンドラを使ってSIMが利用開始されたら→別のサービス(Lambdaなど)に通知などできる!
  • 証明書や鍵の安全な交換
    • 暗号化用の鍵となる
    • AWS IoTのクライアント証明書
    • Beam
    • Endorse(※これはまた詳しいことを調べよう)
  • 設定値やフェームウェアの更新
    • Lightweight M2M(SORACOM Inventory)
  • 異常を防ぐには
    • 用途以外の利用を制約する
      • IMEIロック
      • 閉域網を利用
    • 用途以外の利用を検知する
      • パケットを監視
        • Junction(Mirroring)

B4. 後手に回りがちなIoTセキュリティをどうすべきなのか

www.slideshare.net

java好きな片山さんと、福島さんのセッションです

  • Mirai http://techfactory.itmedia.co.jp/tf/articles/1704/13/news010.html
  • 設計時からセキュリティのことを考える!
  • 費用対効果の観点も必要
  • 前提として盗まれてもよい構成にしておく!
  • SORACOM にビルドインされた機能をつかう
  • 閉域網での接続
  • 通信の監視/検知
    • Junction → トラフィック分析
      • 主の機能
        • Inspection
        • Mirroring
        • Redirection
      • 出力結果をFunnalで特定のAWSサービスにおくるなど可
  • バイス側の認証/認可
    • IMSI、IMEIを紐付けて、別の通信モジュールを使わせなくする!
    • プライベートガーデン
      • Beam以外の通信を制限するなどに利用できる
  • SORACOMアカウントの保護
    • MFA機能
  • バイス自体の保護
    • 参考:Platform Security Architecture(PSA)
    • 今後は必要不可欠になりそう

それと「SORACOM UG Tokyo #10 / SORACOM Technology Camp 夜の部!!」

以前、SORACOM UG 信州 #2 に参加してくださった ぼへぼへ さんと会えるというびっくりがあったり
SORACOM UGのアイコンができましたー

作:くろにゃんこたん f:id:chinoppy:20180426184232j:plain:w500

それと @ko2a さんがUG 信州の活動報告をしてくれました(>_<) f:id:chinoppy:20180426184232j:plain:w500

ぜひ、また参加したいです!
ありがとうございました(>_<)

Raspberry Pi設定メモ

自分のRaspberry Piにした設定等を残しておくメモ(随時更新)

環境

MacでRasbianインストール

qiita.com

Raspbianインストール後にssh接続

  • キーボード、ディスプレイがない場合は、SDカードをPCに接続し、「/boot」配下に「ssh」を配置
  • SDカードをRaspberry Piにいれ、起動
  • LANケーブルを接続して以下で接続
$ ssh pi@raspberrypi.local
  • 公開鍵認証を設定
    • ホスト名はデフォルトの「raspberrypi」
# 自PC
$ ssh-keygen -t rsa
$ 
$ scp ~/.ssh/id_rsa.pub pi@raspberrypi.local:/home/pi
$ vi ~/.ssh/config

# 以下を追加
Host raspberrypi
  HostName raspberrypi.local
  user pi
  IdentityFile ~/.ssh/id_rsa


# Raspberry PI
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys


# 自PCからログイン!
$ ssh raspberrypi

GrovePiをインストール

# gitをインストール
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install git
$ cd

# clone
$ git clone https://github.com/DexterInd/GrovePi.git

# install
$ cd GrovePi/Script
$ sudo curl -kL dexterindustries.com/update_grovepi | bash

$ sudo shutdown -r now


$  sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- 04 -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
$
# Firmwareアップデート
$ cd GrovePi/Firmware
$ sudo ./firmware_update.sh

wifi

sudo sh -c 'wpa_passphrase SSID PASS >> /etc/wpa_supplicant/wpa_supplicant.conf'

固定IPアドレス設定

$ sudo vi /etc/dhcpcd.conf

# 以下を追加し保存

interface eth0
static ip_address=192.168.0.10/24
# static routers=192.168.0.1
# static domain_name_servers=8.8.8.8

https://qiita.com/MarieKawasuji/items/b088ffb252a92eee8f5d

network のIFはこちらを変更

$ sudo vi /etc/network/interfaces

NTPサーバの変更

$ cd /etc/systemd/
$ pwd
/etc/systemd
$ ls -la
total 44
drwxr-xr-x  5 root root 4096 Sep  7 14:47 .
drwxr-xr-x 83 root root 4096 Sep  7 16:38 ..
-rw-r--r--  1 root root 1014 Jul  5 20:31 journald.conf
-rw-r--r--  1 root root 1022 Jul  5 20:31 logind.conf
drwxr-xr-x  2 root root 4096 Sep  7 14:59 network
-rw-r--r--  1 root root  642 Jul  5 20:31 resolved.conf
drwxr-xr-x 16 root root 4096 Sep  7 15:13 system
-rw-r--r--  1 root root 1601 Jul  5 20:31 system.conf
-rw-r--r--  1 root root  607 Jul  5 20:31 timesyncd.conf
drwxr-xr-x  2 root root 4096 Jul  5 20:31 user
-rw-r--r--  1 root root 1130 Jul  5 20:31 user.conf
$ sudo vi timesyncd.conf 

【timesyncd.conf】
・「NTP」「FallbackNTP」をアンコメントし、以下の内容とする
[Time]
NTP=ntp.nict.jp
FallbackNTP=0.jp.pool.ntp.org 1.jp.pool.ntp.org 2.jp.pool.ntp.org 3.jp.pool.ntp.org

timezon

$ timedatectl status
      Local time: Thu 2017-09-07 16:55:40 UTC
  Universal time: Thu 2017-09-07 16:55:40 UTC
        RTC time: n/a
       Time zone: Etc/UTC (UTC, +0000)
 Network time on: yes
NTP synchronized: no
 RTC in local TZ: no

# Network time on が「no」の場合は同期を有効にする
$ timedatectl set-ntp true

# timezone の変更
$ timedatectl list-timezones | grep Asia/Tokyo
Asia/Tokyo
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status
      Local time: Fri 2017-09-08 01:59:33 JST
  Universal time: Thu 2017-09-07 16:59:33 UTC
        RTC time: n/a
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: no
 RTC in local TZ: no

RAM領域を作成

# 現状(変更前)を確認
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        30G  8.9G   20G  32% /
devtmpfs        426M     0  426M   0% /dev
tmpfs           430M     0  430M   0% /dev/shm
tmpfs           430M  6.0M  425M   2% /run
tmpfs           5.0M  8.0K  5.0M   1% /run/lock
tmpfs           430M     0  430M   0% /sys/fs/cgroup
/dev/mmcblk0p1   63M   22M   42M  35% /boot
tmpfs            86M     0   86M   0% /run/user/1000
$ 
# fstabを変更
$ sudo vi /etc/fstab

# 以下4行を追加し保存
#### ramdisk
tmpfs           /tmp            tmpfs   defaults,size=32m 0       0
tmpfs           /var/tmp        tmpfs   defaults,size=16m 0       0
tmpfs           /var/log        tmpfs   defaults,size=32m 0       0

# 設定を反映のため再起動
$ sudo shutdown -r now

# 「/var/log」「/var/tmp」「/tmp」が「tmpfs」になっていることを確認
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        30G  8.9G   20G  32% /
devtmpfs        426M     0  426M   0% /dev
tmpfs           430M     0  430M   0% /dev/shm
tmpfs           430M  6.0M  425M   2% /run
tmpfs           5.0M  8.0K  5.0M   1% /run/lock
tmpfs           430M     0  430M   0% /sys/fs/cgroup
tmpfs            32M  196K   32M   1% /var/log
tmpfs            16M     0   16M   0% /var/tmp
tmpfs            32M  8.0K   32M   1% /tmp
/dev/mmcblk0p1   63M   22M   42M  35% /boot
tmpfs            86M     0   86M   0% /run/user/1000
$

ログ関連

Raspberry Pi(Raspbian)にやっといたほうがいい設定(マイクロSDカードの延命:swapやlog)

cron

# 1分ごとに実行
$ crontab -e

# 以下を追加し保存
*/1 * * * * python3 /home/pi/test.py

SQLAlchemyのインストール

SQLAlchemy - The Database Toolkit for Python

pipでインストールするとエラーとなってしまいできなかったので、ディストリビューションを使用してインストールしたときのメモ

# Pythonの仮想環境へインストールする場合はactivateしておく

$ cd /usr/local/src
# ファイルをダウンロード
$ sudo curl -L -O https://files.pythonhosted.org/packages/da/ef/f10a6892f8ff3c1fec1c25699a7379d1f72f291c8fa40b71c31cab3f779e/SQLAlchemy-1.2.6.tar.gz
$ 
$ sudo tar zxvf SQLAlchemy-1.2.6.tar.gz 
$ cd SQLAlchemy-1.2.6/
# インストール
$ python setup.py install
# 確認
$ pip freeze | grep SQLAlchemy
SQLAlchemy==1.2.6
$ 

SORACOM Airの設定

wvdial

https://dev.soracom.io/jp/start/device_setting/#raspi_usbdev.soracom.io

pppd

qiita.com

もしAK-020以外のUSBも挿して認識されない場合

AK-020 と他の USB デバイスを Raspberry Pi に取り付けると、AK-020 が認識されない

systemd

# serviceファイル
$ /etc/systemd/system/xxx.service

# 起動
$ sudo systemctl start xxx

# 状態確認
$ sudo systemctl status xxx

# 自動起動設定
$ sudo systemctl enable xxx

journalctl コマンドの使い方

SORACOM UG 信州 #2 とIoTの開発してみたよ

この記事は SORACOM Advent Calendar 2017 の17日目の記事です。

長野市にあるGEEKLAB.NAGANOというコミュニティスペースで管理やってますー

記事の内容について

昨日(12/16)、GEEKLAB.NAGANOで開催された「SORACOM UG 信州 #2」のことと、私が発表したIoTの開発のLTの内容を書きます!

SORACOM UG 信州 #2

前回の伊那開催からの2回目です!

f:id:chinoppy:20171217150207p:plain

SORACOM カラーでお出迎えです!

今回も

がきてくれましたー! 本当に遠いところありがとうございます。

オープニング

サンタ姿の発起人 @ko2aさんから

f:id:chinoppy:20171217141059p:plain

このあと、暑くて帽子脱いじゃいますがw

SORACOM 松下さんから

[IoT時代を生き抜くエンジニアに必要な技術とは](https://www.slideshare.net/SORACOM/soracom-ug-2-iot?utm_content=buffer4e490&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

例えがわかりやすくて、すごく勉強になりました!

「アイディア次第で勝負ができる環境が整っている」ってところはすごく実感してます。

それと、「器用貧乏」って言葉、ぐさっときました。。。

f:id:chinoppy:20171217144658p:plain

  • 新たな価値を生み出して収益増加
    • IoTってこの「新たな価値を生み出す」ってところ大事!
  • アイディア次第で勝負ができる環境が整っている
    • 本当にそう思います
  • エンジニアならSuicaの論文は読んだ方がよい

異種統合型情報サービスシステムにおける自律分散アシュアランス技術の研究 | 東京工業大学附属図書館 学位論文データベース

  • ピピンアットマーク
    • これ知らなかったです・・・(^^;
  • ハードウェアはサービスの部品の一つへ。価値は(見かけ上)限りなくゼロへ⇒ハードウェアは囲い込みに必要
  • クラウドエンジニアは生産性志向、ハードウェアエンジニアはH/W制約志向
  • バイスの「クラウド・ファースト」化
  • 200msの壁

t.co

  • 人間の歴史の中で、何かをはじめるのに今ほど最高の時はない
  • エッジ側でやることと、クラウドでやることを見極めてシンプルに実装する
深センに(弾丸で)行ってきたよ
  • 香港から深センへの交通手段
    • 電車(だいたいこれ)
    • フェリー(たいだいこれ)
    • バス(難易度:高)
    • リモ(相乗りタクシー)
  • オススメの交通手段:リモ
    • ドライブスルー感覚で国境を超えられる!
    • 注意!
      • シールなくすと乗れなくなるので失くさないでね
      • 定員(6名)揃わないと出発しない(朝ならだいたいすぐ集まるみたい)
  • WeChat Pay(必需品)したい場合はご連絡を!

Wio LTE ハンズオン

松下さん、UG 信州のフォローをもらいながら、Wio LTEハンズオン資料を進めました。

キット

f:id:chinoppy:20171216143819j:plain:w300

アンテナをつけるときはヒヤヒヤしました(^^;

f:id:chinoppy:20171217145746p:plain:w300

無事装着完了!

f:id:chinoppy:20171217145843p:plain:w300

みなさん、だいたいSORACOM Harvestのところまでは行けました(^^ でも、会場の位置的な問題か、なかなかオンラインにならず・・・またぎーらぼで試してみます(>_<)

LT発表

トップバッターは「ぼへぼへ」さんから
  • ソラコムデビューで学んだこと
2番手つとめさせていただきましたー
  • IoTの開発をしてみたよ
    • 3分の1を話したところでタイムアップ・・・
    • (そのまま話してしまいましたが・・・次は5分で収めます!(>_<))
3番手は「くろにゃんこたん」さんから
  • センサースケーリングの話

くろにゃんこたん.com

4番手は「kobayutapon」さんから
  • そんなデータで大丈夫か
    • センシングデータを公開することで罰せられる可能性があるのは知らなかった((((;゚Д゚))))ガクガクブルブル
    • マイナスの気温を測るのがすごく難しいということを知れました

クロージング

クロージングも発起人の@ko2aさんから。次回は2月〜3月中旬くらいですが、あくまでも予定ですー

ちなみに、松下さんのお話し、LTのお話しを聞いて、本当に技術、知識的にまだまだ未熟なところばかりだなぁっといつもながらに感じました・・・

いつも勉強になっています!(^^;

記念撮影

いつもの記念撮影!今回も「S」マーク+「SORACOM Beeeeeeeeeeeam」

f:id:chinoppy:20171217152754p:plain:w400

やばいSの字がちゃんとできていなかった・・・すみません(TT)

IoTの開発をしてみたよ

私が発表したLTのことを書いていきます!こまかな技術ややり方のことは、順々にQiitaに投稿していきます。

それと、まだまだ未熟なところばかりなので、こんなよいもの、技術ありますよってありましたら教えてください(>_<)

内容について

念願のIoT関係の開発をしましたので、その時に使った技術、ものなどをざっくりと紹介していきます!

ちなみにSORACOMのことが少なくごめんなさいです。。。

これから開発しようとしているひとなどの参考になれば幸いです!

まずは構成と私の担当

f:id:chinoppy:20171217165819p:plain:w300

遠隔地にある機器の状態や機器の周りの状況をセンシングしてAWSにアップするものです。

私が担当したのは、「Raspberry Pi」とAWS部分

  • Raspberry Piの役割
    • 機器の状態や周囲のセンシングデータはほぼArduinoで管理
    • そのArduinoからデータを取得し、AWSへアップする
  • AWS
    • 主にAWS IoT関係のところを担当
ハードについて
  • Raspberry Pi
  • センサー
    • レーザセンサ
    • 温度センサ
    • カメラ(可視光・赤外線)
  • 通信モジュール
    • SORACOM EC21-J
  • SIM
    • SORACOM A・・・ではないです(TT)
    • でも疎通時に使用しました!
    • コンソールでひと目でオンラインになったことが確認できて、わかりやすかったです!
  • Arduino
クラウド
使用したサービス

f:id:chinoppy:20171217160019p:plain:w300

  • AWS IoT
  • AWS IoTのルールで以下を使用
    • Lambda
    • DynamoDB
    • S3
    • IAM(STS
使用したパターンなど

こちらがすごく参考になりました!

www.slideshare.net

  • ラージデータアップロードパターン(P36)

  • バイスの証明書登録(P45)

    • バイス数が多くなるため、自動登録できるようにしました
  • モノの自動登録(これは自作)

    • バイスごとの独自の番号(ClientIDに使用)とデバイス証明書のIDを紐付けたかった
    • バイスの接続イベント(※)時にルールでLambdaを実行し、AWS IoTの「モノ」を自動作成、証明書へのアタッチを行うようにしました
    • クライアントの接続イベント(※)でClientIDと証明書番号がメッセージで受け取れる
    • ※「$aws/events/presence/connected/clientId」
  • センサデータなどの保存

    • これはAWS IoTのルールでDynamoDBへ保存

一日中、AWSを触れて幸せでした( ´∀`)

ソフト

本当にいろいろと便利なものがあり、開発中はずっと感動していました

f:id:chinoppy:20171217163539p:plain:w100

松下さんの言っていた「アイディア次第で勝負ができる環境が整った」と実感しました。

SORACOM Wio LTEも含めて、これからもいろいろ試していきます!

退屈なことをやらせてみた(Chino × Selenium)

サイトのSSL化対応があって、全ページで混合コンテンツ(Mixed Content)にならないことを確認しないといけなかった。。。

単純に「テストめんどくさいなぁ〜」って思ってSeleniumにやらせてみた話。

※本当に単純なことですが・・・(^^;

やらせてみたこ

  • テキストからURLを読み込む(1行に1URL)
  • ページをひらく(ブラウザはChrome
  • Developer Tools の「Console」に出力されるメッセージをprint

を繰り返し。これで、printされたメッセージに内に「Mixed Content」が出力されていなければOK!

こんなこともやらせてみた

  • 一応ログインもできる
    • インプットファイルでログインページのURLの次の行を以下とするとログイン
    • login,[アカウント],[パスワード]
    • ※でも入力対象の要素が固定指定なのでいまいち・・・
  • リンクのクリックもさせてみた
    • インプットファイルで以下とするとクリック
    • ◯,[URL],[クリックするリンクテキストorクラス名]

いまいちですけどソースはこちら

テストはあまり好きではないけど、何かツール使ったりすると、

  • その分時間短縮になるし
  • ツールのこと知れるし
  • コード書けるし

テストへのモチベーションがあがりますねー

参考サイト等

Selenium API(逆引き)

SORACOM UG 信州 #1(Chino × SORACOM UG)

昨日(9/23)、伊那で開催されたSORACOM UG 信州 #1 に参加しました!

soracomug-tokyo.connpass.com

SORACOM Airを使ったハンズオンをRaspberry Piを使ってやるということで、ホコリをかぶっているRaspberry Piをまた触るきっかけにしたいという思いもあり(^^

【目次】

会場

会場はADSL実証実験20周年を迎える伊那市伊那市有線放送 いなあいネットさん。

f:id:chinoppy:20170924175625j:plain:w300

SORACOMさんから

  • maxさん
    • SORACOMのことやLTのこと、いろいろとお話ししてくれました!(資料はこちら
    • それと僕は3月11日 JAWS-UGの転職発表の場にいましたw
  • なおさん
    • ハンズオンでいろいろとフォロー、SIMの説明などいろいろ教えていただきましたー

発起人

  • 沖さん
    • CoderDojo安曇野にも関わったり本当にいろいろと考えたり、している方。私はinahackでお知り合いになりましたー
  • 橋本さん
    • なにやらタッチパネルでおもしろいことを考えている方。信州ベンチャーコンテストで賞をとられたそうです!すごいっ!
  • 鄭さん
    • この方もいろいろしている方。本当にいろいろ。いろいろなことに通じていて、いろいろなことの黒幕らしい・・・( ̄ー ̄)
  • 宮下さん
  • 小穴さん

参加者

全員ではないですが、いろいろな方がいましたよw

  • 上田から原チャリで参加したおじいちゃん
    • イベント当日の朝5時くらいに「LPWA」などのキーワードで検索し、本イベントをみつけ参加
  • 富山から参加の会社員の方
    • なおさんが送っているDMメール?が送られてきて、「SORACOMってどんなものが」と思い参加したそうですw
  • 市議の方
    • 急遽、市議の方がきて、一緒にハンズオンしました。Raspberry Pi、超音波センサ、SORACOM使ってました。

ハンズオン

沖さん、maxさんのお話しのあと、

SORACOMのサービスは以下を使用し、ハンズオンしましたー

  • SORACOM Beam
  • SORACOM Harvest

ハンズオン資料はこちら

SORACOM bootcampという、技術者向けオンラインセミナーもあるそうです!うれしい(^^

LoRaWAN™ | SORACOM Bootcamp - YouTube

  • ハンズオンの様子

f:id:chinoppy:20170924193437j:plain:w300

  • 超音波センサ + Harvest

f:id:chinoppy:20170924193940j:plain:w300

ってことで

ハンズオン中に、AmazonUSBドングル注文しましたー

・・・次の日、キタ━━━━(゚∀゚)━━━━!!

f:id:chinoppy:20170924194532j:plain:w300

そして、早速、ほこりをかぶっていたchinopi(Chino の Raspberry Pi)に装着

f:id:chinoppy:20170924201118j:plain:w300

まだ、設定などしていないので、SORACOM Airで通信していませんが。。。少しずつだと思いますが、触っていきますー

maxさん、なおさん、沖さん、橋本さん、参加者の方ありがとうございました。ハンズオンを通して、SORACOMのサービスなど理解深まりました(^^ お疲れ様でした!次は◯ーらぼで開催予定です!

そうそう、最後に「SORACOM Beeeeeeeeeeeeam」で記念撮影しましたー

f:id:chinoppy:20170924202856j:plain