NervesにPhoenixを入れてHTTPのGETでLEDをウェブチカ〜Phoenix準備・確認編3/3〜

# 概要

NervesにPhoenixを入れてウェブチカできたので備忘録です。

- NervesにPhoenixを入れるとNerves起動時にPhoenixも起動します
- ウェブチカとは、とあるURLにアクセスするとNervesにつけているLEDをチカらせることを言ってます
- 前提としてNervesとPhoenixはインストール済みとします

```shell:fish
❯ mix nerves.new -v
Nerves Bootstrap v1.8.0

❯ mix phx.new -v
Phoenix v1.5.3
```

長編になりそうだったので3部作としました(^^ゞ
前回はNerves設定編だったので、今回はいよいよPhoenix設定・確認編です。

- [1/3　準備編](https://qiita.com/nishiuchikazuma/items/bfd04b36fb4524d49a59)
- [2/3　Nerves設定編（exineris）](https://qiita.com/nishiuchikazuma/items/175fdc4a646cbbfcc04d)
- [3/3　Phoenix設定・確認編（neosapi）](https://qiita.com/nishiuchikazuma/items/609c3faa4cfa36b77e90)　←いまここ

Nerves起動時に起動するPhoenixの設定と確認をおこないます。


# 関連ファイル

```
mix.exs
lib/
  neosapi/
    exi.ex
  neosapi_web/
    controllers/
      page_controller.ex
    templates/
      page/
        exineos.html.eex
    router.ex
```

## mix.exs

mix.exsファイルの`deps`に以下の行を追記して、ElixirからGPIOの操作をできるようにします。

```elixir:mix.exs
defp deps do
  [
    {:circuits_gpio, "~> 0.4"},
  ]
end
```

追記した後、`mix deps.get`コマンドを実行します。

```shell:fish
❯ mix deps.get
```


## lib/neosapi/exi.ex

LEDをチカチカさせたり、オン・オフするモジュールを作成します。

```elixir:lib/neosapi/exi.ex
defmodule Exi do
  @led_on 1
  @led_off 0

  def chika(sleep_msec) do
    {:ok, gpio} = Circuits.GPIO.open(25, :output)
    Circuits.GPIO.write(gpio, @led_on)
    :timer.sleep(sleep_msec)
    Circuits.GPIO.write(gpio, @led_off)
    Circuits.GPIO.close(gpio)
  end

  def led("on") do
    {:ok, gpio} = Circuits.GPIO.open(25, :output)
    Circuits.GPIO.write(gpio, @led_on)
    Circuits.GPIO.close(gpio)
  end

  def led("off") do
    {:ok, gpio} = Circuits.GPIO.open(25, :output)
    Circuits.GPIO.write(gpio, @led_off)
    Circuits.GPIO.close(gpio)
  end

  def led(_) do
    nil
  end
end
```


## lib/neosapi_web/router.ex

HTTP GETで受け取る設定などをおこないます。

```elixir:lib/neosapi_web/router.ex
defmodule NeosapiWeb.Router do
  scope "/", NeosapiWeb do
    get "/exineos/:device/:action", PageController, :exineos    # ←この行を追記
  end
end
```


## lib/neosapi_web/controllers/page_controller.ex

HTTP GETでアクセスされた場合の処理を記載します。

```elixir:lib/neosapi_web/controllers/page_controller.ex
defmodule NeosapiWeb.PageController do
  def exineos(conn, params) do    # ←この関数を追加
    device = params["device"]
    action = params["action"]

    led_onoff(device, action)

    render(conn, "exineos.html", device: device, action: action)
  end

  defp led_onoff(_device, action) do    # ←この関数も追加
    Exi.led(action)
  end

end
```


## lib/neosapi_web/templates/page/exineos.html.eex

HTTP GETでアクセスされた場合の画面を作ります。

```elixir:lib/neosapi_web/templates/page/exineos.html.eex
<h1>Exineos Page</h1>

<p>Exineosのページです</p>

Device => <%= @device %><br />
Action => <%= @action %>
```


# デプロイ

最後に、Nervesプロジェクトのディレクトリに移動してデプロイします。

```shell:fish
❯ pwd
/path/to/exineos
❯ cd exineris

❯ mix firmware
❯ ./upload.sh 192.168.5.55
```

ブラウザで`http://192.168.5.55/`にアクセスしてPhoenixの画面が表示されたことを確認後、以下のURLでLEDがオン・オフできるかどうかを確認します。

- LEDオン　→　http://192.168.5.55/exineos/led/on
- LEDオフ　→　http://192.168.5.55/exineos/led/off


# 動画

直線距離で18km離れたNervesのLEDをウェブチカできたのTweetはこちら。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Nerves?src=hash&amp;ref_src=twsrc%5Etfw">#Nerves</a> で <a href="https://twitter.com/hashtag/Phoenix?src=hash&amp;ref_src=twsrc%5Etfw">#Phoenix</a> 動かしてウェブチカできましたの動画╰( ^o^)╯＜直線距離で18km <a href="https://twitter.com/hashtag/kochiex?src=hash&amp;ref_src=twsrc%5Etfw">#kochiex</a> <a href="https://t.co/ItLyfBFUhq">pic.twitter.com/ItLyfBFUhq</a></p>&mdash; にしうちかずま (@nishiuchikazuma) <a href="https://twitter.com/nishiuchikazuma/status/1265181822545100801?ref_src=twsrc%5Etfw">May 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# まとめ

NervesにPhoenixを入れてHTTPのGETでLEDををウェブチカすることができました＼(^o^)／
次はLiveViewで、もにょもにょしたまとめを書こうと思ってます。