見出し画像

【セサミロック】鍵が一定時間以上開いたままなら通知する設定【パート1/4】

アフィリエイト広告を利用しています

オープンセンサー2には無効ボタンがあって、これを戻し忘れるとカギが何時間経っても閉まらないという状態になってしまいます。

そこでカギがずっと開いたままの状態だったら「閉め忘れ」を通知してくれるようにしてみます。

この方法はラズパイを使用していて人によっては敷居が高いかもしれません。また、ラズパイもここ最近のメモリ高騰の煽りを受けて高くなっています。

想定しているのは24時間稼働なので、できれば消費電力は少ない方がいいと思います。
Zero2は消費電力1W、Pi4は3W、Pi5は6Wくらいです。


Pi5は24時間稼働で160円/月くらい。Zero2なら26円/月です。

Zero2は一番ランニングコストが安いですが、Linuxもラズパイも触ったことが無い方だとZero2はかなり難しいと思います。タイプAのUSBポートもないし、GUI(デスクトップ)環境のイメージは用意はされているもののほぼ動きません。
Pi4はGUIで操作できますが、もっさりしていてYoutubeは見れません。
Pi5はブラウザでYoutubeも見れますが、消費電力が一番高いです。
※この設定をするだけならZero2で問題なく動作します。

やってる事は単純なんで、ラズパイを用意しなくてもGAS(Google Apps Script)でも良いし、スマホならAndroidだとTaskerやMacroDroidアプリを使えば同じことは実現できると思います。

消費電力を全く気にしないという方なら、LinuxがインストールされているPCでも良いですし、単純に試したいという方ならWindowsでも出来ます。
手元のPCにUSB起動(一時的)でUbuntuなどのディストリビューションを起動させてもいい。
ここで私がラズパイを選択しているのは、すでに所持してて家で24時間稼働しているからという理由なだけです。
WebAPIを叩けて、その結果を保存できる環境があるなら何でもいいです。


手順

SesameAPIを利用して鍵が開いてるかどうかを30分間隔で確認します。
もし「unlocked」状態であればカウントし、閾値を超えたら通知するという処理を入れます。
可能性としてこの方法だとチェック時にだけたまたま連続して鍵が開いていたというパターンは発生するかもしれません。
理想としては15分間隔で確認して、カウントが5以上(60分開いている)の場合に通知としたかったのですが、APIには使用制限があります。

2026年4月1日AM10時より、FreeプランのAPIリクエスト回数上限が3,000回から1,000回に改定されました。

https://jp.candyhouse.co/pages/sesame-biz-operation

最近、改悪されてしまいました。無料で使えるのは1000回のみ。
この記事を書いていてこの改悪を知りました。

4回/時間x24回/日x31回/月 = 2976回
2回/時間x24回/日x31回/月 = 1488回
2回/時間x18回/日x31回/月 = 1116回
2回/時間x16回/日x31回/月 = 992回 これか
1回/時間x24回/日x31回/月 = 744回 これ

無料回数内に抑えるには1時間のチェック回数を減らすか、24時間監視をやめるか等の考慮が必要ですね。
うちはAM1時~AM8時の監視はお休みでいいかな。



コードはPythonで書いています。

import requests

#環境に合わせて要変更------------------------------------------------
API_KEY_SESAME = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
UUID = 'XXXXXXXXX-XXXXX-XXXXXX-XXXXXXX-XXXXXXXXXXXX'

CURRENTDIR = '/home/ユーザー名/src/'
#通知するカウント閾値を設定
LIMIT_CNT = 3
#環境に合わせて要変更ここまで-----------------------------------------

url = f'https://app.candyhouse.co/api/sesame2/{UUID}'
headers = {'x-api-key': API_KEY_SESAME}
filepass = f'{CURRENTDIR}SESAME_CHECK_CNT.txt'

#カウントファイルを読み込み。lock_cntを初期化。
try:
    with open(filepass, encoding='utf-8_sig') as f:
        lock_cnt = int(f.read())
        f.close()
except FileNotFoundError:
    lock_cnt = 0  

#APIでセサミの状態を取得
res = requests.get(url, headers=headers, timeout=5.5)
resdict = res.json()  
sesame_status = resdict['CHSesame2Status']

#鍵が開いていたらカウントをプラスしてファイルに書き出し
if(sesame_status == 'unlocked'):
    lock_cnt+=1
    with open(filepass, 'w', encoding='utf-8_sig') as f:
        f.write(str(lock_cnt))
        f.close()
    #カウントが閾値を超えたら通知処理
    if(lock_cnt >= LIMIT_CNT):
        print('ここに通知処理を入れる')
#鍵が閉まっていたらカウントリセット
elif(lock_cnt >= 1):
    with open(filepass, 'w', encoding='utf-8_sig') as f:
        f.write('0')
        f.close()

注意箇所

APIキーとUUIDはhttps://biz.candyhouse.co/から取得できるので「XXXXXXX」部分を書き換えます。
requestsモジュールは初期は入ってないと思うのでLinux環境にインストールしてください。
環境に合わせて要変更と書いてある範囲を変更してください。

それから通知処理の場所の「printf」部分にEメールで通知するなり、DiscordのWebhookを利用するなりして通知処理を追加してください。
このコードには通知処理まで入れてません。


DiscordのWebhookを利用したプッシュ通知方法は別途記事にしようと思っていますが、すごい簡単にできるので調べればすぐにできるかと思います。
もちろんEメール通知でもOKです。

上の画像のようにエラーを出すようにしたり、タイムスタンプを入れてもいいと思います。見やすくなります。


これをCronの設定で30分ごとに実行します。

*/30 8-23,0 * * * /bin/python /home/ユーザー名/src/sesame_check.py 1>> /log/nomal.log 2>> /home/ユーザー名/src/log/error.log

pythonのファイルは「sesame_check.py」として保存。
8時から0時30分まで2回/時間 実行。
ここでは標準出力をnomal.logとして、エラー出力をerror.logとして排出しています。
各ディレクトリは事前に作成しておく必要があります。

無料で使えるAPI使用回数が大幅に減っていたのは盲点でした。
環境に合わせて閾値やチェック間隔を見直して下さい。


追記

Discord通知方法を記事にしました。

あと、後日APIを使用しない方法をUP予定です。(記事にしました)



今回は以上です。


いいなと思ったら応援しよう!