Mackerelを使ってeject自動化

こんにちは!
2017年新卒インフラの戸田です!
日々、素敵な先輩方の下、インフラ業務を学んでおります。

今までの2017新卒はまじめなことをしていますが、
今回僕はmackerelを使ってちょっと遊んでみたいと思います。
やることはタイトルに書いてある通りです。

ejectの自動化をする意味があるのかどうかは、気にしないでください。
(そもそもejectって何だ?って人はググってもらえると助かります)

使うもの

  • エアコンのリモコン
  • mackerel
  • DVDROM
  • slack
  • raspberry pi (温度をとるため回路も使います)

どれも家にある身近なもの(?)ばかりですね。これらを使っていきたいと思います。

やってみる的な文言

部屋の温度を取得する

  • temperature.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import glob
from time import sleep

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos + 2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

try:
    while True:
        t = str(read_temp())
        f = open('room_log','w')
        f.write(t + '\n')
        f.close()
        sleep(30)

except KeyboardInterrupt:
    pass

30秒間に一回部屋の温度を取得し、room_logファイルに書き込みます。

Mackerlで温度のグラフを表示

次に、mackerelを使うために、mackerel-agentを使いますが、導入方法は割愛させていただきます。 mackerelにデータを送りますが、こんな感じです。

  • temper-agent.sh
#!/bin/bash
SECONDS=`date '+%s'`

NAME='room.temp'
VALUE=`cat room_log`

echo -e "${NAME}\t${VALUE}\t${SECONDS}"

先ほどのroom_logファイルをmackerelに送っています。

簡単ですね! これだけでグラフが表示されるなんて夢みたいです。

こうゆう具合で表示されます。

f:id:AdwaysEngineerBlog:20171025163452p:plain

今回は通知の設定を - WARNING 24度以下 - CRITICAL 23度以下

これでslackに通知される設定を加えれば、通知されます。

botを使ってコマンドを実行

後はejectをする環境さえできれば完成です。というわけで、肝心のDVDROMを動かすコマンドですが

  • eject.sh
#!/bin/sh
eject -T
eject -t

はい、これだけです。-Tで出して、-tで戻ります。

あとは、slackでAircon_ejectという文字列があればコマンドを実行するhubotを作って完成です。

  • aircon.coffee
module.exports = (robot) ->
  robot.catchAll (msg) ->
    r = new RegExp "(.*)(Aircon_eject)(.*)", "i"
    matches = msg.message.text.match(r)
    if matches == null or matches.length == 0
      return
    @exec = require('child_process').exec
    command = "sh eject.sh"
    msg.send "ejectしました"
    @exec command, (error, stdout, stderr) ->
      msg.send error if error?
      msg.send stdout if stdout?
      msg.send stderr if stderr?

以上で、完成となります。
長々と書いてしまいましたが、こちらが実機です。

f:id:AdwaysEngineerBlog:20171025163533j:plain

どんな角度でとっても写るのはTwitter映えする写真ばかり...
インスタ映えは難しいですね

動いている様子はこんな感じです。

f:id:AdwaysEngineerBlog:20171027174144g:plain

実際にslack上で動いてる画像

f:id:AdwaysEngineerBlog:20171025163558p:plain

こんな具合で簡単に作れちゃいます。

おわりに

10月は新卒が記事を投稿していましたが、私はネタがなかったので、最後にしてもらいました。
なんとかネタとしてはいいものができたのではないかと思っています。
mackerelを初めて触った人でも簡易的なグラフなら簡単に作れます。
自分で定義したものをグラフにできるのはちょっとした特別感がありますね。

これで一人暮らしでも「家に帰っても寒い!!」なんて状況がなくなるわけです!!
快適に冬を過ごせますね!!()