LTE-M Button で自宅の回転灯を制御し「これから帰る」を知らせる
要約
- LTE-M Button を押したら
- 家のパトライトを回して「これから帰ること」を家族にお知らせしつつ
- Discord に位置情報を投稿する
問題
会社を出るときにDiscordで連絡するのが我が家のルール。
「家事の都合があるので知らせてくれたらHAPPY」ということでそうしてるんだけど、以下の問題があって頭を悩ませておりました。
- メッセージを打つのが 手間
- 自転車通勤であり、乗る前には色々やることがあるのでスマホ出すのも手間
- 夏は、蚊を避けながらやるのが手間
- 冬は、手袋を外すのが手間
- Discordのメンションは操作が手間
- そもそも、Discord への投稿は 見逃されがち
- 家事してると見逃す
- メンションし忘れると見逃す
ゴール
今から帰るぞという情報を、簡単な操作で、家族に見過ごされることなく知らせるのがゴールです。
さらに言えば、通知の使い分けができ、通知先をカスタムでき、電池長持ちで、低コストであれば大変良いです。
そんな都合の良いデバイスは無いんでしょうか?
いいえ、あるんです。
そう、ソラコムならね。
SORACOM UG
そんな折、 LTE-M Button を使ったハンズオンが近くで開催されるのを知り、渡りに船!と参加。
詳細は省きますが、ハンズオンもある程度達成でき、久しぶりの人も会えたし、AWS や SORACOM のアツい人達とから情熱を貰えたし、懇親会ではやりきったしで大変良かったです。
深酒でハンズオンの記憶が飛ぶかと思いましたが、なんとか大丈夫でした。
仕様検討
LTE-M Button は大変面白いプロダクトですが、これを使うことが目的ではありませんので 通知する方法から ボトムアップで決めていきます。
家での通知は回転灯
さて、肝心の通知は家で余ってた回転灯を使う事にします。工場によくあるアレです。
これなら見過ごされることもないでしょう!
子供たちにもウケそうです。
ON/OFFは接点で制御するタイプだったのでリレーが要ります。
回転灯ONはリレー
リレーはお蔵入りしてたモジュールを使います。
PCから接点制御したくて買ったけどOFFができない不良品でしたが、捨てずにおいてよかった。
もうPCから制御することはないので、VbusとA接点が連動するようにジャンパーしてしまいます。
あとは、これをUSB-ACアダプタに差してACをON/OFFすればよいでしょう。
リレーONはスマートプラグ
ACアダプタの制御はスマートプラグを使います。
今回のキモはこの製品です。
このスマートプラグはアレクサやスマホからON/OFFできるので何かしらAPIはあるはずです。
問題はそれが使えるか。使ってよいか。
スマートプラグONは非公式ライブラリ
困ったらググれとじっちゃが言ってたのでググると すぐに見つかりました。
ただ実際にやってみると、制御パケットはLAN内のIPに投げてまして、今回は外から叩きたいのでダメそうです。
もう少しググると 同様の方法を使って問題に直面し、非公式ライブラリを使って解決した 記事もみつけました。サンプルコードも載ってるので、これを利用させていただくことにしましょう。
やってみたところ、我が家はmeross機器が多いのかリストアップまで数秒かかり、なんだかイマイチです。充実したマニュアルがあったので調べたところ、 UUIDを指定できる ので、対象のスマートプラグを指定するようにしてシュっと終わるようになりました。
あとは Lambda にデプロイして SORACM Func で連携 すれば終わり。
import asyncio
import os
from meross_iot.http_api import MerossHttpClient
from meross_iot.manager import MerossManager
EMAIL = os.environ.get('MEROSS_EMAIL')
PASSWORD = os.environ.get('MEROSS_PASSWORD')
UUID = os.environ.get('MEROSS_UUID')
async def main():
# Setup the HTTP client API from user-password
http_api_client = await MerossHttpClient.async_from_user_password(api_base_url='https://iotx-ap.meross.com', email=EMAIL, password=PASSWORD)
# Setup and start the device manager
manager = MerossManager(http_client=http_api_client)
await manager.async_init()
# Retrieve UUID that are registered on this account
await manager.async_device_discovery(meross_device_uuid=UUID)
plugs = manager.find_devices()
if len(plugs) < 1:
print("{UUID} not found...")
else:
# Turn it on channel 0
# Note that channel argument is optional for MSS310 as they only have one channel
dev = plugs[0]
# The first time we play with a device, we must update its status
await dev.async_update()
await dev.async_toggle(channel=0)
manager.close()
await http_api_client.async_logout()
def lambda_handler(event, context):
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.stop()
Discord
見過ごされ続けてきた Discord ですが、せっかく LTE-M Button で簡易位置情報もとれるので Webhookを使って 投稿するようにしました。
この機能は上のコードに入ってませんので、やりたい人は適当にやっちゃってください。
できあがったのはこちら
派手にピカピカするので子供たちも大盛り上がり!
でしたが、数日も経つとすっかり慣れてしまい、回転灯が回るのが日常の風景になってしまいました。
工場か。
なお、消灯はアレクサにお願いする仕様。
今後
- 回転灯が接点制御だったのでやむなく
スマートプラグ -> USB-ACアダプタ -> USBリレー -> 回転灯
にしたけど、多段構成でイマイチなのでAC駆動の回転灯に変えてスマートプラグ -> 回転灯
にしたい - スマートプラグを買い足して、LTE Button の押し分けで光るライトを変えたい
- プラグのONを toggle にしちゃったのでこれも直したい
- どこかで発表できるようにスライドにまとめる
Discussion