最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。
前回は環境センサBME280を使ってRubyで気温、湿度、気圧を取得するまでやりました。
最終回は取得した気温、湿度、気圧をslackに通知してみます。前々回ですでにRubyをつかってslackへの通知はやっていたのでそのスクリプトにBME280の気温、湿度、気圧取得をいれこみます。
RubyでBME280から値を取得する
rubyでi2cを経由してbme280のデータを読み込むスクリプトがRaspberryPiフォーラムありましたのでそれを使わせてもらいます。
1 2 3 4 5 6 7 8 9 |
$ cd ~ $ mkdir -p ~/bin/ruby-bme280/lib/rpi cd ~/bin/ruby-bme280/lib/rpi $ wget https://gist.githubusercontent.com/jvalencia80/b947bd23cf9b1025531bc41a81658d15/raw/df43bf10fe1e478d4a11b35648522ddccae80ddc/bme280.rb $ wget https://gist.githubusercontent.com/jvalencia80/3631d8823d8a24ebc09c9c93cb272dbd/raw/e4f9ac705abf8967a4f1297f5582506f8742f69b/i2cbus.rb $ wget https://gist.githubusercontent.com/jvalencia80/a48c61c62501395298e58f2a16987d6c/raw/30fe6eebbee17f6ee2ecd2546c70d115da2e358f/validations.rb $ cd ~/bin/ruby-bme280 $ wget https://gist.githubusercontent.com/jvalencia80/589dae8954dbe4eca128d385542987dc/raw/61c51ad8b9b13fb97eaf68805c4891644e61d25e/sample.rb |
このうち bme280.rb にセンサのアドレスが書かれているのでこれを 0x77
に変更します。
あとでライブラリを読み解いてみたところ RPi::BME280.new(i2cbus)
するときにプロパティを設定して、
RPi::BME280.new(i2cbus, 0x77)
とするのがいいかもしれません。
1 2 3 |
$ vi lib/rpi/bme280.rb ADDRESS = 0x77 |
ライブラリの読み込みパスを指定するためにsample.rbを編集します。
1 2 3 4 5 6 |
- require "rpi" + lib = File.expand_path('../lib', __FILE__) + $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) + + require "rpi/i2cbus" + require "rpi/bme280" |
保存したら実行してみます。
1 2 3 4 5 |
$ ruby sample.rb Temperature: 30.36 ºC Pressure: 1002.72 mb Humidity: 66.42 % |
お、前回の Python スクリプトと同じように取得することができました。
前々回のslackへの通知スクリプトに気温、湿度、気温取得を組み込む
まずは前々回テストしたときの post_to_slack.rb を ruby-bme280 にコピーしてきます。
コピーしてきた post_to_slack.rb に sample.rb を移植してきます。
sample.rb では puts
で標準出力していましたが、そのときに bme.temperature
で気温、 bme.humidity
で湿度、 bme.pressure
で気圧が取得できていました。
なので、あとはslackに通知する内容にこれらを追加すればOKです。
attachment
オブジェクトのなかで、 text
プロパティがslackに通知されるテキストなのでそこを
text: "気温: #{bme.temperature}, 湿度: #{bme.humidity}, 気圧: #{bme.pressure}",
とするとslackには次のように通知が届きます。
slack-notifier を使うといろいろな通知の送り方がカスタマイズできますのでいろいろ試してみるといいと思います。
ちなみに、私はこんな感じにしています。
attachment を使うことで気温、湿度、気圧を並べて表示して見やすくしています。
あと ts
プロパティを追加することでメッセージフッター部分の時刻表示を追加しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# slackに通知 attachment = { color: "good", text: "#{Time.now().strftime('%F %T')}の気温: #{bme.temperature} ℃", fields: [ { title: "気温", value: "#{bme.temperature} ℃", short: true, }, { title: "湿度", value: "#{bme.humidity} %", short: true, }, { title: "気圧", value: "#{bme.pressure} hPa", short: true, }, ], ts: Time.now.to_i, } attachment[:color] = 'danger' if bme.temperature > 35; attachment[:color] = 'warning' if bme.temperature > 30; notifier = Slack::Notifier.new WEBHOCKURL, channel: CHANNEL, username: '気温湿度計' notifier.ping '', attachments: [ attachment ], icon_emoji: ":thermometer:" |
実際に届く内容はこんな感じです。
左側の緑色のところですが、温度が30度を越えたらオレンジ色に、35度をこえたら赤になるようにしています。
それと、アイコンが温度計のものになるように icon_emoji: ":themometer:"
を追加しています。
スクリプト全体は GitHub で公開しています。
crontab に追加して定期実行する
あとはこれをcrontabについかして定期的(30分ごと)にslackへ通知できるようにします。
1 2 |
$ crontab -e */30 * * * * /bin/bash -lc "cd ~/bin/ruby-bme280 && ruby post_to_slack.rb 2>post_to_slack.err" |
ポイントは rbenvを使っているため、bashコマンドを経由して実行しています。
あと、エラーについてはエラーログに書き込むように 2>post_to_slac.err
を追加しています。
ときおり、うまく通知されないことがあったのですが、エラーログのおかげでGPIOのエラーが起きていたのがわかりました。
あとはこれを1週間くらい放置しておけば30分毎にあなたのslackにラズパイからの通知がとどきます。
コメント
いろいろみましたが、このページが一番わかりやすかったです。結局、pythonでSlack通知をできるように改良しました。お世話になりました。