技術1課でOJT中の濱岡です。 みかんが美味しい季節になりました。 最近毎日みかんを食べてます。
さて、今回はRaspberry Piを使って会議室の残り時間を通知してくれるものを作ってみました。
きっかけ
会社で会議はよくあると思うのですが 会議が時間通りに終わらず次の会議が押してしまう......なんてことありますよね。 5分前くらいには会議を終えて会議室を次の会議の人たちに明け渡すのが理想ですが...なかなか難しいですよね。
それなら一方的に会議室の残りの時間を伝えるものがあればいいのでは...??? と思い作成しました。
ざっくりと構成図
といっても単純でRaspberry Piにスピーカーをぶっさします。
スピーカーから音声が流れて会議室の残り時間を伝えてくれます。 今回は、1分ごとにプログラムを実行して実行した時の時間と通知したい時間が一致すれば音声を再生するというように構成していきます。
今回使用したもの
- Raspberry Pi 3
- スピーカー(ステレオミニで接続できるもの) 今回使用したスピーカーはこちら
言語はPython3を使用しました。
まずは会議室の予定を取得
サーバーワークスではGoogleカレンダーを利用して会議室の予約を行なっています。 そこでGoogleカレンダーAPIを使用して会議室の予定を取得します。
取得の方法は以下を参考にしてください。 【初心者でもできた!】Google カレンダーのAPIで「今日の残り時間bot」を作る
この中では個人のIDから自身のカレンダーの取得を行なっていますが 会議室のカレンダーIDを使用すれば会議室の予定を取得することが可能です。
確認方法は
Googleカレンダーのカレンダーを追加
からカレンダーに登録
を選択します。
会議室を検索して追加します。
下へスクロールするとカレンダーIDが書いてあります。
これをコピーして使用してください。
ここで注意していただきたいのがGoogleカレンダーAPIを最初に使用する際に
ブラウザ上で認証を行う必要がある ということです。
一度ローカルで実行し認証を行い、そこで生成されるtoken.pickle
を使用して予定を取得してください。
今回、Rasberry Piの構成に関しては/opt
配下に作成していくことを前提として書いていきますので必要なファイルは/opt
の中に入れておいてくださいね。
通知したい時間を計算
先ほどGoogleカレンダーから予定を取得することができたので その予定の開始時間と終了時間を計算していきます。 今回は全体の時間の半分の時間と会議終了を5分前を通知することを考えます。
from datetime import datetime, timedelta
#会議の全体の時間の半分の時間を計算
def get_half_time(start_time,end_time):
start_time_datetime = convert_datetime(start_time)
end_time_datetime = convert_datetime(end_time)
time_difference_sec = end_time_datetime - start_time_datetime
#秒から分に変換
time_difference_min = time_difference_sec.seconds // 60
half_time = start_time_str + timedelta(minutes=time_difference_min//2)
return half_time
#会議終了の5分前を計算
def get_5min_ago(end_time):
end_time_datetime = convert_datetime(end_time)
time_5min_ago = end_time_datetime - timedelta(minutes=5)
return time_5min_ago
#受け取ってくる値はStringなのでdatetimeに変換
def convert_datetime(time_str):
time_datetime = datetime.strptime(
time_datetime,
'%Y-%m-%dT%H:%M:%S+09:00'
)
return time_datetime
今回はdatetimeモジュールを使って時間の計算を行なっています。
音声を作成
音声をどう用意しようかと悩みました... そういえばAWSに音声を生成できるやつあったな!!! ということで今回はAmazon Pollyを使って音声を生成しその音声ファイルを使用しました。 AWSのマネージドコンソール画面からAmazon Pollyを選択します。
赤枠に喋らせたい言葉を入力します。
ダウンロードMP3
からmp3ファイルをダウンロードします。
このように会議室の残り時間の半分用の音声と5分前用の音声を作成しました。
音声の再生
まずは Raspberry PiのAudioの設定からやっていきます。
以下のコマンドから設定を開きます。
$ sudo raspi-config
7 Advanced Options を選択 A4 Audio を選択 1 Force 3.5mm を選択 Finish を選択
これでRaspberry Piの設定は完了です。
次はプログラムです。 今回は音声の再生にPygameを使用しました。 プログラムが実行した時間と通知したい時間が一致すれば音声を再生するというように書いていきます。
import pygame.mixer
import time
import os.path
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
#eventsはGoogleカレンダーAPIから取ってきた予定の情報,nowは現在時刻(datetime)
def time_notification(events, now):
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
end = event['end'].get('dateTime', event['end'].get('date'))
half_time = get_half_time(start,end)
time_5min_ago = get_5min_ago(end)
#会議の全体の時間の半分の通知
if (now.hour == half_time.hour
and now.minute == half_time.minute):
play_music(os.path.join(ROOT_PATH, '音声ファイル名'))
#会議終了5分前の通知
elif (now.hour == time_5min_ago.hour
and now.minute == time_5min_ago.minute):
play_music(os.path.join(ROOT_PATH, '音声ファイル名'))
#音の再生:今回は3回繰り返して流れるように設定
def play_music(file_name):
pygame.mixer.init()
pygame.mixer.music.load(file_name)
pygame.mixer.music.play(2)
time.sleep(8)
pygame.mixer.music.stop()
cronの設定
今回は1分ごとに実行をしていきます。 その設定をcronで行なっていきます。
とその前にRasberry PiだとデフォルトでPython2で実行してしまうのでPython3で動くように設定していきます
$ cd /usr/bin
$ sudo unlink python
$ sudo ln -s python3 python
いよいよcronの設定です。 以下のコマンドで設定ファイルを開きます。
$ sudo cron -e
設定ファイルが開いたら以下を記述します。
*/1 10-19 * * 1-5 /usr/bin/python /opt/実行したいPythonファイル名
1分ごとに月-金曜日10:00-19:00で実行するというように設定しました。
これであとは会議室にセッティングするだけ!
まとめ
いかがでしたでしょうか? Raspberry Piって色々できるんだなと思いましたね。
そういえば今回の実装をしている間にこんなものが登場しました。 Alexa for Business に会議終了リマインダー、インテリジェントルームリリース、および会議室活用メトリクスが追加されました。
( ゚д゚) ・・・・・・・・・・ (´・ω・`).;:…(´・ω...:.;::..(´・;::: .:.;: サラサラ..
興味がある方はこちらの記事もみてみてくださいね。
Alexa for Business(11)新機能(3)会議終了リマインダー
以上、濱岡でした!