LoginSignup
13
4

More than 3 years have passed since last update.

「ちゃんと在宅ワークしてますよ」ボタン作ってみた。

Last updated at Posted at 2020-05-07

あらすじ

SORACOM LTE-M Button を使って、勤務開始と勤務終了を知らせるボタンを作りました。
ボタンを押すと、 Lambda が動いて Slack が飛びます。

えっ、「そんなの Slack だけでいいじゃないか」って?

なんと SORACOM LTE-M Button を使うことで、ちゃんと自宅にいることが伝えられるのさ!
位置情報を取得できるからね!

さぁ、君もワンクリックで上司に連絡、はじめよう!
あっ、スマホでも位置情報取得はできるってツッコミは勘弁してね(・ω<)

なぜ SORACOM LTE-M Button ?

主な理由は2つです。

  • 最近 SORACOM LTE-M Button を買ったから試してみたかった。
  • ちょうど Try! SORACOM キャンペーンがやっていて、題材が Stay at Home だった(ホンネ)。

在宅ワークだと、毎朝上司に連絡取るじゃないですか?(うちだけ?)
SORACOM LTE-M Button を使えば、それをワンクリックで出来ちまうわけです!

機能概要

機能は2つのみ!

  1. 出勤の挨拶をする(位置情報付き)
  2. 退勤の挨拶をする(位置情報付き)

ちなみに LTE-M Button は、シングルクリック、ダブルクリック、ロングクリックを判断できるので、
もう一つ機能を足すことも出来ます。

構成

以下の図のような構成にしました。

スクリーンショット 2020-05-07 22.19.26.png

我ながらめっちゃ単純!
公式のチュートリアルやったから Slack の送り方も知ってるし、余裕だな〜
と、最初は思っていました...

簡易位置測位機能との戦い

※緯度と経度を送るのに手こずったのは、ぼくがドキュメントをちゃんと読まないせいです。
公式のドキュメントはちゃんと読もう!(教訓)

(ぼく)「位置情報を取得するにはどうすればいいのかな〜」

SORACOM ユーザーコンソールで「簡易位置測位機能」を ON に設定するだけです。
参考:https://blog.soracom.jp/blog/2019/08/01/location-function-release/

(ぼく)「それだけでいいのか!簡単ジャン!」

(ぼく)「...あれ?緯度と経度がどこにあるかわからないぞ、 event じゃ取り出せないし...ドコ?」

ここで2時間ぐらい格闘しました()

ドキュメントを読み直し、ようやく答えにたどり着きました...

lat と lon は context の中にあります。
参考:https://dev.soracom.io/jp/docs/location_service/
context.client_context.custom で json が取り出せます。
先駆者様:https://qiita.com/kkimura/items/c33962e426e84720dc31

公式様と先駆者様、いつもありがとうございます🙏

SORACOM の設定

簡易位置測位機能ON
バイナリパーサー には @button を選択!

SORACOM Funk の設定は、ほぼチュートリアルのままです!
参考:https://dev.soracom.io/jp/start/funk_aws_lambda/

Lambda の中身


import json
import urllib.request

def lambda_handler(event, context):

    customData = context.client_context.custom

    clickType = event["clickType"]
    lat = customData["location"]["lat"]
    lon = customData["location"]["lon"]

    if clickType == 1:
        post_slack_hello(lat, lon)
    elif clickType == 2:
        print(clickType)
    elif clickType == 3:
        post_slack_seeyou(lat, lon)
    else:
        print("No clickType")

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

def post_slack_hello(lat, lon):
    message = '''おはようございます。''' + '\n' + '''緯度: ''' + str(lat) + '''経度: ''' + str(lon) + '''の場所から仕事をしています。''' 

    send_data = {
        "username": "GabD",
        "text": message,
    }
    send_text = "payload=" + json.dumps(send_data)
    request = urllib.request.Request(
        "https://hooks.slack.com/services/{取得した Webhook URL}", 
        data = send_text.encode('utf-8'), 
        method = "POST"
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode('utf-8')

def post_slack_seeyou(lat, lon):
    message = '''お疲れ様でした。''' + '\n' + '''緯度: ''' + str(lat) + '''経度: ''' + str(lon) + '''の場所での仕事を終わります。''' 

    send_data = {
        "username": "{お名前}",
        "text": message,
    }
    send_text = "payload=" + json.dumps(send_data)
    request = urllib.request.Request(
        "https://hooks.slack.com/services/{取得した Webhook URL}", 
        data = send_text.encode('utf-8'), 
        method = "POST"
    )
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode('utf-8')

{お名前} と {Webhook URL} は適宜読み替えてください。
ランタイムは Python 3.7 です。


customData = context.client_context.custom

lat = customData["location"]["lat"]
lon = customData["location"]["lon"]

この部分で位置情報を取得しています(一番苦労したところなので何度も言います笑)。
それ以外はほぼチュートリアル通りです。

デモ

出勤時

スクリーンショット 2020-05-07 21.18.59.png

退勤時

スクリーンショット 2020-05-07 21.20.04.png

緯度と経度で場所を伝えるなんて、どんなプレイなんだ...?(我ながら)
送った緯度と経度は緯度経度地図を使って調べてもらいましょう笑
https://fukuno.jig.jp/app/printmap/latlngmap.html#5/35.362222/138.731389/&base=std&ls=std&disp=1&vs=c1j0l0u0f1

感想

初めて SORACOM LTE-M Button を使って「オリジナルモノづくり」してみましたが、 Funk の便利ですね!
FaaS サイコー!!
次は、もう少し凝ったモノづくりに挑戦するぞ〜

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4