(この記事は、「#NervesJP Advent Calendar 2019」の3日目です)
昨日は私の「Nervesを使ってRaspberry pi2からTwitterの投稿を行う」です!こちらもぜひぜひ!
はじめに
- Nervesを使ってRaspberry pi2からTwitterの投稿を行う の続きです
- 前回はsshでNerves on Raspberry Pi 2に接続して、手動で
HelloNerves.update
を実行して、日本の任意の場所の天気予報をTwitterに投稿しました - つぎは、cronっぽいやつを設定して、午前7:00に自動的に投稿するようにしてみます
結論
2020/6/16 追記
- Quantumを使いましょう
作品
Elixirのcron的なもの
- Awesome Elixir で調べました
Quantum
- こちらのほうが人気あるようです
- macOSでは簡単にうごきましたが、私がやった限り、Nerves on Raspberry Pi 2ではうんともすんともうごきませんでした
- おそらくこちらのIssueでうごかないよと言われている気がします
- ただしこちらが2019/12/3現在、OpenのようでそのうちNervesにも対応してくれるかもしれません
2020/6/16(火) 追記
- NervesでQuantumは使えます
- @nishiuchikazuma さんの Nervesでcronっぽい動作ができるQuantumを使って定期的にSlackにメッセージを投げた でその実績が記載されています
- 私のプロジェクトもQuantumを使うように切り替えました
- Raspberry Pi 2で動作することを確認しました
- この当時は本当に動かなかったのか、それともElixir力が足りなくて使い方が正しくなかったのかはわかりませんが、とにかくNervesでもQuantumは使えます
- たぶん当時はElixir力が足りなくて設定を間違えていたのだとおもいます。。。
Cronex
- 冒頭で述べた通り、Nerves on Raspberry Pi 2 で動作しました
- ただし、
mix.exs
の書き方をREADMEの通りにやると、runtime中にMix.env
を呼び出しているバージョンをdeps.get
してしまうようです- この場合、
Mix.env
がNerves on Raspberry Pi 2で実行できん! で、動きません
- この場合、
- そのため、
Mix.env
を使わないように対応されているリビジョンを指定します - また、とある1分以内に処理が2回実行される問題があるようです
- In Elixir 1.6.4 timing is not correct #14
- workaroundあります!
-
contributors に名を連ねています
- Fixes syntax error in Cronex.Every documentation
- 誤記修正だけですけどね
対応内容
- すべての対応内容はこちらです
- 以下、ポイントを示します
mix.exs
defp deps do
[
...
{:cronex, github: "jbernardo95/cronex", ref: "345b57e14667a08280d790afdfbb359f467649df"}
]
end
-
:ref
で、Mix.env
を使わないように対応されているリビジョンを指定しています
lib/hello_nerves/scheduler.ex
defmodule HelloNerves.Scheduler do
use Cronex.Scheduler
every :day, at: "22:00" do
HelloNerves.update()
end
end
- スケジュールの登録の仕方は、Cronex.Everyを参照してください
- UTCで指定しているので日本時間7:00になります
config/config.exs
config :cronex,
ping_interval: 60000
- とある1分以内に処理が2回実行される問題へのworkaroundです
- この対応は、あとで問題に気づいたのでコミットIDがちがっていて、こちらとこちらになります
ビルドしてmicroSDカードに焼く
- 詳しくは、Nervesを使ってRaspberry pi2からTwitterの投稿を行う をご参照ください
$ export MIX_TARGET=rpi2
$ export NERVES_NETWORK_SSID=ssid
$ export NERVES_NETWORK_PSK=secret
$ export TWITTER_CONSUMER_KEY=xxx
$ export TWITTER_CONSUMER_SECRET=yyy
$ export TWITTER_ACCESS_TOKEN=zzz
$ export TWITTER_ACCESS_TOKEN_SECRET=aaa
$ mix deps.get
$ mix firmware
$ mix firmware.burn
- あとは、microSDカードをRaspberry Pi 2にいれて電源投入
- Nerves on Raspberry Pi 2のiexにて
HelloNerves.Scheduler.start_link
を一度実行しておけばよいです -
注意としては、Nerves on Raspberry Pi 2のiexをexitで抜けないことです
- macOSの場合はiexでexitタイプしてもおこられるとおもいますが、Nerves on Raspberry Pi 2の場合はsshから抜けます
- これはたぶん、そうじゃないかというくらいで確証はないのですが、どうもexitで抜けると、
HelloNerves.Scheduler.start_link
自体も破棄されてしまってcron的な動きをしないようにおもいます - これは私の経験則みたいなものです
- はっきり言うと私は、全然わかっていません
-
mix firmware
で何が行われて、何が出来上がっているのか、そしてそれをmicroSDに焼き込んでRaspberry Pi 2に差し込んで、電源ONするとなぜiexが起動しているのかさっぱり理解していません - そのへんがわかると、NervesではMix.target()が使えない理由とか、ここであげたexitを実行したときに何が行われるのかといったあたりのことがちゃんと説明できるようになるとおもいます
- 次はこのへんの理解、もしかしたらNervesというよりはもっと前のところ、コンピュータの勉強を改めてちゃんと勉強しましょうということになるのかもしれませんが、理解していきたいとおもっています
- で、逆の言い方するとこういうことをなんとなくくらいしか知らなくても手軽にあつかえる**Nervesは、ナウでヤングなクールなすごいやつ**だとおもっています
最後に
- IoTつくるよ!2 2019/11/30(土)のNervesJPのブースにて、TAKASEhideki先生に使っていただきました!
- ありがとうございます!
次回
次回はzacky1972先生の「Pelemayを開発している時にわかった Nerves 対応のコツ」です!こちらも是非どうぞ~