ElixirでIoT!!
高瀬 英希takase@i.kyoto-u.ac.jpIoT: Internet of Things• あらゆるモノやコトにヒトをインターネットに！
• デバイス／エッジ／クラウドの連携・集結で社会的価値を創出→ 特にデバイスとエッジにて開発生産性の向上が不可欠https://dzone.com/articles/what-is-an-iot-platform2組込み屋さんから見たElixir• 読み書きしやすい／生産性が高い• 関数型／並行処理プログラミング• 分散システム対応／スケールしやすい• 耐障害性が高い• 軽量（なのかな？？）IoTデバイスの開発にも使えるんじゃね？？
3fukuoka.ex でのこれまでの発表#8：2018年 春のElixir入学式『ElixirをIoTボードで動かしてみた～ラズパイ・Zynq・big.LITTLE編～』#11：DB／データサイエンスにコネクトするElixir『環境センシングとデータ表示をサクっと？やってみた』Qiitaにて記事を公開中！！
https://qiita.com/takasehideki/items/8f43f1853ce88cbbe82e4fukuoka.ex #8ElixirをIoTボードで動かしてみた～ラズパイ・big.LITTLE・Zynq編～お題目ElixirをIoTボードで動かしていろいろ調べてみよう今回のお話しのIoTボードの定義は“きびきびとLinuxが動いてさくっとネットに繋がる”モノ性能は？
メモリ量は？

takasehideki/EEloTコストは？
発熱は？

6

選手のご紹介takasehideki/EEloT7

Spec比較• マイクロアーキとかOSの違いは？？
Board

OSCoreMemory Network

RPi3B-RRaspbian 4.9

RPi3B-UUbuntu 16.04

4x 1.2GHzCortex-A531GBLPDDR2

150MbpsWiFiODROID-XU3 Ubuntu 16.04

4x 2.0GHzCortex-A154x 1.4GHzCortex-A72GBLPDDR3

300MbpsWiFiZYBOXillinux-2.0

2x 650MHzCortex-A9512MBDDR31GBit
EthernetMacBook PromacOS
10.13.4

2x 3.3GHzCore i7(4-threads)

16GBLPDDR3

433.3Mb
ps WiFitakasehideki/EEloT8評価用ツールキットhttps://github.com/takasehideki/EEloTEvaluation toolkit for Elixir on IoT board• 自動インストールスクリプト• 評価環境設定スクリプト：コンパイル・ビルド等• 基本的にはMIT Licenseですが，*.ex や git repos の著作権は各作者に帰属しますもうpullしてますよね！？？
starもください！！
takasehideki/EEloT9評価用ツールキット$ ./install.sh− Elixir&Erlangをbrew, apt等で自動インストール9OS環境を自動検知 (macOS, Raspbian, ubuntu, ...)− cleanモード：パッケージインストールをremove− sourceモード：ソースからErlang/Elixirをビルド9ソースビルドはErlang OTP 20.3 / Elixir 1.6.5$ ./setup.sh− *.exコンパイル，git repoのpullとビルド− cleanモード：.beamとgit dirsを削除takasehideki/EEloT10用意したベンチマークアプリ• ライプニッツ級数− 小数点演算の性能評価• フィボナッチ数列（シングルプロセス版）− 整数演算およびスタック使用時の性能評価• フィボナッチ数列の複数プロセス処理− 並列性能の評価• 大規模データのストリーム処理− CSVデータの処理時の性能評価• ロジスティック写像− 他言語モジュール(Rustler)を用いるNIF機能の性能評価• Phoenixサーバの接続負荷− サーバのレイテンシとスループットの評価takasehideki/EEloT11結果抜粋：fib_multi• fib_multi の並列プロセス数を変更− RP3BとZYBOはコア数で並列性能が頭打ち− ODROID-XU3では6並列で頭打ち（コア数は8）takasehideki/EEloT12結果抜粋：LogisticMap[単位：秒]Rustler不使用1

248RP3B/Raspbian46.989 23.486 14.020 14.370RP3B/Ubuntu49.799 25.134 14.821 15.200ODROID-XU323.884 12.726ZYBO

87.184Rustler使用

18.8956.8652.957 41.789 48.387
248RP3B/Raspbian24.318 21.584 13.745 14.550RP3B/Ubuntu24.065 21.550 14.613 14.948ODROID-XU3

13.769ZYBO50.701 40.436 38.454 39.2909.9227.619

6.920• Rustler不使用はbenchmarks3, 使用時はbenchmarks8• 並列数が小さい場合はNIF機能が性能向上に寄与できるtakasehideki/EEloT13結果抜粋：phoenix-showdown$ cd phoenix-showdown/phoenix/benchmarker/$ mix phoenix.serverBoardThroughput [req/s]Latency [ms]Consistency [σms]RP3B/Raspbian

785.25351.47771.85RP3B/Ubuntu

878.89113.3031.68ODROID-XU3

859.60112.6725.82ZYBO

459.28216.72

83.10• ボード構成・接続形態よりもコア性能が重要とみられる− ODROID-XU3はUSB-WiFiアダプタで接続− ZYBOは有線接続だが性能を出すことはできない• RP3BのOS間で明らかな差が見られるtakasehideki/EEloT14残りはSlideShareと論文にて！

15ベンチマークのまとめ• Elixir並列処理はすごい！

マイクロアーキよりコア数！！

− XU3/A15は最大2.0GHzなのも効いている？
− ZYBOは健闘はしてるかな，，，− なお消費電力は？？
ZYBO << XU3 < RPi3 <<<(超えられない壁)<<< Mac• サーバ性能はNIC形態が効く？

− Ethernet接続で対決させたら違う傾向になりそう• Elixirは最新版にしましょう• バージョン毎・他言語／フレームワークの比較もしてみたら面白いのかなぁtakasehideki/EEloT16

(#8のオチ)ところでこれってIoT？？
ただのアーキ
比較じゃね??

性能は？
メモリ量は？

IoTデバイスでLinux動かせるなら苦労しないよ!!

takasehideki/EEloTエッジサーバに使うってなら分かるけど,,,コストは？
発熱は？
Zynqなら
FPGA/PL部
使わな損や!!

センサとかモータ繋ぎたい！
でもGPIOとかデバドラどうしよ??

17fukuoka.ex #11ElixirでIoT 第2回「環境センシングとデータ表示をサクっと？やってみた」高瀬 英希takase@i.kyoto-u.ac.jp世界の「ElixirでIoT」• ラズパイ等が(限定)対象• メモリサイズ数10MB！
• クロス開発はツラい,,,• HWもSWもセットでご提供!!
• Erlang VMがbare metalで動く• 300MHz Cortex-M7 & 64MB Flash• On-board WLAN & Pmodコネクタtakasehideki/fukuokaex1119

今回のお題目Elixirとラズパイ3Bで環境データをセンシングして表示させてみようIoTに限らないElixir/Phoenixアプリ開発のTIPS(a.k.a.ハマりどころ)も共有しますtakasehideki/fukuokaex1120やったこと1. GrovePiライブラリを調べて試してみた2. 温湿度センサDHT11を使ってみた3. LCD displayにデータを表示してみた

DB使えよｗ4. センサデータをCSVで書き出してみた5. Phoenixページにグラフを表示してみた6. 書き出したCSVデータをグラフ表示してみた7. 環境センシングしながらリアルタイムでグラフ表示してみた！

おもろかったらstarください！！
takasehideki/fukuokaex11GitHubのディレクトリ対応：1. grovepi_example/2. dht_sensor/3. home_weather_dislay_host/4. home_weather_csv/5. phx_chartjs/6. phx_csvchart/7. home_weather_phx/21

論より証拠！

takasehideki/fukuokaex11221. GrovePiライブラリ• Groveとは？：− IoTのセンサ・アクチュエータが画一化されたモジュール9最低でも86種類？（@mine820さんのQiita記事調べ）− 入出力ピンx4のGroveコネクタで簡単に付け替えできる− ラズパイやArduinoなどに適合するシールドもあり→ IoTシステムをお手軽にラピッドプロトタイピング！

takasehideki/fukuokaex11231. GrovePiライブラリ• nerves_grove− Elixirで使えるGroveライブラリ from Nerves− ブレッドボードで稲作の必要あり− 下回りは elixir_ale (Elixir Actor Library for Embedded)9ラズパイ用のGPIOs, I2C, SPIのライブラリ9MIX_ENV=prod で動かす必要あり？
9さらにその下は GenServer/SuperVisor− 2016年9月で開発止まってる，，，takasehideki/fukuokaex11241. GrovePiライブラリ• GrovePi− ラズパイのGrovePi+シールドに対応したライブラリ9田んぼを耕さなくていい！
− examples も用意されていて親切！
9alarm/9demo_pivotpi/9demo_rgblcd9home_weather_display/ Nervesアプリ,,,9led_fade/takasehideki/fukuokaex11Qiita「ElixirでIoT#5」にて導入方法などを解説してます!!
252. 温湿度センサ• Temperature&Humidity Sensor− DHT11を搭載したデジタル温度湿度センサ940ビットのビットフィールドで取得される 温度：0.0~50.0℃ / 1.0℃単位 / ±2.0℃誤差 湿度：20.0~90.0％ / 1.0％単位 / ±5.0％誤差− Elixirからの使い方はソース嫁 m(_ _)m93秒毎に値の差分があれば標準出力9ホスト上(nerves_runtime無し)で動くようにしてますtakasehideki/fukuokaex11263. LCDモジュールに表示• LCD RGB Backlight− 16x2の英数字が出力可能9API／サンプルが豊富で使いやすい！
− バックライトがRGBで制御できる（カッコイイtakasehideki/fukuokaex11274. センサデータをCSVに書き出し• DHTから取得した温度湿度データをCSVで保存• Timexで現在時刻も取得 ref. @kobataro, @piacerehome_weather_csv/lib/home_weather_csv.ex# Create CSV fileFile.write "dhtdata.csv", ""…Tips: 現在時刻の取得と変換# Get datedate = Timex.now("Asia/Tokyo")|> Timex.format!( "%Y-%m-%d %H:%M:%S", :strftime )# Write data to CSVFile.write "dhtdata.csv", "#{date},#{temp},#{humidity}¥n", [:append]#File.write "../phx_csvchart/priv/static/dhtdata.csv",#"#{date},#{temp},#{humidity}¥n", [:append]…
Tips: ファイル位置は任意でもOKtakasehideki/fukuokaex11(プロジェクトトップからの相対パス)285. Phoenixにグラフ表示• Chart.js を使用 (日本語ページもあり)− オフラインでも使えるはず？？

phx_chartjs/lib/phx_chartjs_web/templates/page/index.html.eex<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script><canvas id="myChart" width="400" height="400"></canvas><script>var ctx = document.getElementById("myChart");var myChart = new Chart(ctx, {Tips: Chart.jsのURLを直接指定じゃtype: 'bar',ないとPhoenixエラー？
data: {…

takasehideki/fukuokaex11295. Phoenixにグラフ表示takasehideki/fukuokaex11306. CSVをグラフ表示• 4. home_weather_csv/ で書き出したデータをChart.jsでグラフ表示− $ mix phx.new phx_csvchart --no-ecto --no-brunch− phx_csvchart/prliv/static/dhtdata.csv にあるとする− ソースは「アルゴリズム雑記」よりほぼパクリ^^;phx_csvchart/lib/phx_csvchart_web/endpoint.explug Plug.Static,#at: "/", from: :home_weather_phx, gzip: false,#only: ~w(css fonts images js favicon.ico robots.txt)at: "/", from: :home_weather_phx, gzip: falseTips: Static Fileをサーブするtakasehideki/fukuokaex11316. CSVをグラフ表示• TIPS: MIX_ENV=prod でPhoenix立ち上げ− $ cp config/dev.exs config/prod.exs して編集するconfig/prod.exsconfig :phx_csvchart, PhxCsvchartWeb.Endpoint,http: [port: 4000],debug_errors: true,code_reloader: false,Tips: prod だとreloadできないcheck_origin: false,server: true,watchers: [],secret_key_base: System.get_env("PhxCsvchart_SEC_KEY_BASE")

takasehideki/fukuokaex11327. リアルタイムに！
• 1つのElixir/Phoenixプロジェクトに統合− home_weather_phx/lib/home_weather_phx/application.ex とhome_weather_phx/lib/home_weather_phx.ex にGrovePiアプリ記述を追加MIX_ENV=dev でも9無駄に超音波センサも追加動くんかい！
config/dev.exsconfig :home_weather_phx, HomeWeatherPhxWeb.Endpoint,live_reload: [patterns: [~r{priv/static/.*(js|css|png|jpeg|jpg|gif|svg|csv)$},
Tips: phoenix_live_reloadでCSV変更時にページを自動更新takasehideki/fukuokaex11

33まとめ• 環境センシングとデータ表示をサクっと？やってみた9 「サクッと？」だったかどうかは議論の余地あり^^;− GrovePi: nerves_grove + elixir_ale, deps− Phoenix: live_reload, prod.exs, priv/• 「ElixirでIoT」の良さと課題− Phoenix連携はエッジサーバ向けにも良い！
− GenServer/Supervisor で polling だけはツラい− リアルタイム性の保証なんてあかんでしょうね，，，− 相も変わらずLinuxは必須です• fukuoka.ex の ecosystem はいいよ！！

− Very Thanks!! @piacere, @enpedasi, @tsuchro, @kobatarotakasehideki/fukuokaex1134

次回予告？？
fukuoka.ex #XXElixirでIoTロボットを開発してみた～ROS通信・FPGA編～

協力者を募集中！
Elixirで新しい世界へ！！
35