Nervesでcron的なことをする


(この記事は、「#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に自動的に投稿するようにしてみます

結論

  • Cronexは、Nerves on Raspberry Pi 2 で動作しました
  • NervesElixirのIoTでナウでヤングなクールなすごいやつ

2020/6/16 追記

作品

Elixirのcron的なもの

Quantum

2020/6/16(火) 追記

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回実行される問題があるようです
  • contributors に名を連ねています

対応内容

  • すべての対応内容はこちらです
  • 以下、ポイントを示します
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カードに焼く

$ 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は、ナウでヤングなクールなすごいやつだとおもっています

最後に

次回

次回はzacky1972先生の「Pelemayを開発している時にわかった Nerves 対応のコツ」です!こちらも是非どうぞ~