🚨

LTE-M Button で自宅の回転灯を制御し「これから帰る」を知らせる

2024/03/18に公開

要約

  1. LTE-M Button を押したら
  2. 家のパトライトを回して「これから帰ること」を家族にお知らせしつつ
  3. Discord に位置情報を投稿する

問題

会社を出るときにDiscordで連絡するのが我が家のルール。
「家事の都合があるので知らせてくれたらHAPPY」ということでそうしてるんだけど、以下の問題があって頭を悩ませておりました。

  • メッセージを打つのが 手間
    • 自転車通勤であり、乗る前には色々やることがあるのでスマホ出すのも手間
    • 夏は、蚊を避けながらやるのが手間
    • 冬は、手袋を外すのが手間
    • Discordのメンションは操作が手間
  • そもそも、Discord への投稿は 見逃されがち
    • 家事してると見逃す
    • メンションし忘れると見逃す

ゴール

今から帰るぞという情報を、簡単な操作で、家族に見過ごされることなく知らせるのがゴールです。
さらに言えば、通知の使い分けができ、通知先をカスタムでき、電池長持ちで、低コストであれば大変良いです。

そんな都合の良いデバイスは無いんでしょうか?
いいえ、あるんです。
そう、ソラコムならね。

https://soracom.jp/store/5206/

SORACOM UG

そんな折、 LTE-M Button を使ったハンズオンが近くで開催されるのを知り、渡りに船!と参加。

https://jawsug-tosa.doorkeeper.jp/events/159080

詳細は省きますが、ハンズオンもある程度達成でき、久しぶりの人も会えたし、AWS や SORACOM のアツい人達とから情熱を貰えたし、懇親会ではやりきったしで大変良かったです。
深酒でハンズオンの記憶が飛ぶかと思いましたが、なんとか大丈夫でした。

仕様検討

LTE-M Button は大変面白いプロダクトですが、これを使うことが目的ではありませんので 通知する方法から ボトムアップで決めていきます。

家での通知は回転灯

さて、肝心の通知は家で余ってた回転灯を使う事にします。工場によくあるアレです。
これなら見過ごされることもないでしょう!
子供たちにもウケそうです。

電池式LED警告灯 ニコカプセル

ON/OFFは接点で制御するタイプだったのでリレーが要ります。

回転灯ONはリレー

リレーはお蔵入りしてたモジュールを使います。
PCから接点制御したくて買ったけどOFFができない不良品でしたが、捨てずにおいてよかった。

LCUS-1 type 1/2 channel USB Relay Module Electronic Converter PCB USB Intelligent Control Switch
https://www.aliexpress.com/item/1005003629560852.html

もうPCから制御することはないので、VbusとA接点が連動するようにジャンパーしてしまいます。
あとは、これをUSB-ACアダプタに差してACをON/OFFすればよいでしょう。

リレーONはスマートプラグ

ACアダプタの制御はスマートプラグを使います。
今回のキモはこの製品です。

MSS110

このスマートプラグはアレクサやスマホから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