見出し画像

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

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

以前に記事にした方法だとSesameAPIを使用していたので、無料範囲で抑えようとするとどうしてもチェック回数が少なくなってしまいました。

そこで今回の方法はAPIを使わず制限のない方法でやってみようと思います。


はじめに試したのが、ホームオートメーションでセサミロックの状態を取得させる方法です。
これはSesameAPIを使わずに取得できるので何度でも状態確認出来ます。

ロジック的には解錠を起点にして希望の時間待機させ、時間が過ぎたら状態確認して通知するというもの。
ただ、この方法だと時間内に何度も開け閉めした場合に一番目のトリガーしか実行されないのと、そもそも実行されない時があるという問題がありました。

また、ホームオートメーションの場合は個人と違ってインポート/エクスポートができないんです。
※厳密にはiOS標準機能では無理なだけで「Controller for HomeKit」というサードパーティ製のアプリを使えばバックアップなどは行えるようです。
ただし、私が確認した時点では6000円/年のサブスク有料アプリとなっています。



他の記事で触れていますがセサミのMatter機器は既知の問題があります。

ホームオートメーションをどんなに作りこんだとしても、セサミのデバイスをトリガーにしていると、消えてしまう可能性があるんです。
これはあまりやりたくない。
※個人オートメーションの方でも試したのですが、そちらはそちらで問題がありました。

これ前の記事でも言ってますけど、個人もホームもそれぞれの制限があるんですよね。

できればAPIもラズパイも使用しなくても出来るようにしたかったのですが、結局はラズパイを使うことにしました。


概要


3カ所に分けて設定します。処理的にはすごくシンプルです。

・カギが開いた時にホームオートメーションでラズパイ上にフラグファイルを作成します。
・カギが閉まった時にホームオートメーションでラズパイ上のフラグファイルを削除します。
・ラズパイではチェックしたい任意の間隔(1分おきでも可)でファイルの有無を確認します。

APIにも触れないし、カギが開いているどうかさえ確認しませんw


ラズパイ上のファイル操作にはホームオートメーションに「SSH経由でスクリプトを実行」というのがあるのでこれを使います。

ここのスクリプトに設定した物がそのままラズパイで実行できるので、一気に自由度が跳ね上がります。
作り込みさえすれば色々な事ができますね。

個人オートメーションでは認証にSSHキーが使えるのですが、ホームオートメーションはパスワードのみです。SSHキーを選ぶとエラーがでます。
もしラズパイ側でパスワード認証を禁止にしている場合は許可する必要があります。

そもラズパイを使うならHome Assistantとか使えばもっとシンプルに出来そうな気もしなくはないのですが、試してないから分かりません。
ラズパイには色々なOSイメージがはじめから用意されています。
導入入口は恐ろしく簡単。ここら辺は興味ある方はお調べください。



私は現在Pi5を使用していますが個人的なおすすめはPi4です。
ラズパイの記事を過去に書いてるのでご参照ください。理由も書いています。
Pi5で使用できる電源自体はもう普通にうってるみたいですが。



手順

ホームオートメーションにファイル作成とファイル削除の2つを追加


解錠と施錠でそれぞれホームオートメーションを作成します。

トリガーをセサミの解錠/施錠を選択。2回分。
「ショートカットに変換」をタップ。
「ssh」で検索して「SSH経由でスクリプトを実行」をタップ。


・フラグファイル作成。(解錠時)

/usr/bin/touch /home/ユーザ名/src/flgfile/SESAME_FLGFILE.txt

・フラグファイル削除。(施錠時)

/usr/bin/rm /home/ユーザ名/src/flgfile/SESAME_FLGFILE.txt 

ユーザ名はラズパイのログインIDに要変更。
ディレクトリとファイル名はなんでもいいですが、この通りにやるなら事前にディレクトリは作成しておいてください。


左が作成。右が削除。コマンドがtouchかrmの違いなだけです。
スクリプトにコマンドを貼り付けます。
ホスト名、ポート番号、ユーザ名、パスワードをそれぞれラズパイ環境に合わせて設定してください。


解錠用と施錠用の2つのホームオートメーションができました。


2>> /home/ユーザ名/src/log/ERROR.log

これを末尾に追加してエラーを出力させてもいいかもしれません。

iPhone/iPadでの作業は終了。



次はラズパイでの作業


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

import os
from datetime import datetime,timedelta

#環境に合わせて要変更------------------------------------------------
CRENDIR = '/home/ユーザー名/src/'
filepass = f'{CRENDIR}flgfile/SESAME_FLGFILE.txt'
#単位は分
limit_time = 30
#環境に合わせて要変更ここまで-----------------------------------------

try:
    #フラグファイルのタイムスタンプを取得
    filetime = os.path.getmtime(filepass)
except FileNotFoundError:
    #ファイルが無かったら終了
    os._exit(0)

#タイムスタンプにターゲットタイムを加算
filetime = datetime.fromtimestamp(filetime)
#引数には日(days)、秒(senconds)、分(minutes)、時(hours)、週(weeks)のいずれかを指定
filetime = filetime + timedelta(minutes=limit_time)

# 現在時刻がLIMITを超えたら通知処理
if (datetime.now() >= filetime):
    
    #通知処理
    print('ここに通知処理を入れる')

    #ファイルのタイムスタンプを更新
    with open(filepass, 'w', encoding='utf-8_sig') as f:
        f.write('')
        f.close()  

ざっくり処理内容ですが、ファイルの有無を確認して無ければ即終了。
あったらフラグファイルのタイムスタンプを取得してそれにlimit_timeをプラス。
現在時間と比較して設定した時間を超えると通知されます。単位は分。

通知処理と同時にファイルに更新処理を入れているので、時間のカウントはリセットされます。
例えばlimit_timeを30分に設定している場合で、1時間開き続けると30分後と60分後に通知がきます。

「環境に合わせて要変更」部分は変えてください。

例によって通知処理自体は入れてないので別記事を参照するなりして追加してください。


pythonのファイルは「sesame_check.py」として保存。
これをcronに登録して定期的に実行します。

*/5 * * * * /usr/bin/python /home/ユーザ名/src/sesame_check.py 1>> /tmp/nomal.log 2>> /home/ユーザ名/src/log/ERROR.log

5分おきにしていますが、1分おきでもOKです。
ここではNomalログとErrorログも出力されるようにしています。
同じように指定するなら上位のディレクトリは事前に作成しておく必要があります。


2026/06/14 19:12:01【SESAME】閉まっています
2026/06/14 19:13:01【SESAME】Target time ===> 2026-06-14 19:17:55
2026/06/14 19:14:01【SESAME】Target time ===> 2026-06-14 19:17:55
2026/06/14 19:15:01【SESAME】Target time ===> 2026-06-14 19:17:55
2026/06/14 19:16:01【SESAME】Target time ===> 2026-06-14 19:17:55
2026/06/14 19:17:01【SESAME】Target time ===> 2026-06-14 19:17:55
2026/06/14 19:18:01【SESAME】セサミが5分以上開いてたためDiscord通知しました
2026/06/14 19:19:01【SESAME】閉まっています

コード内にPrintで指定してNormalログに出力し、どんな動作していたのか確認しても良いかと思います。
Target timeはフラグファイルのタイムスタンプにlimit_timeをプラスした時間です。これを超えると通知処理が入ります。
※確認間隔を1分。リミット時間を5分にした時の例です。


API確認と違う想定される問題


APIで確認する方法と違ってカギの状態を確認しているわけではないので、例えばネットワークの問題でラズパイに接続できずにファイルが作成できないという事は発生するかもしれません。
Hub3、セサミロック、Matterコントローラー、ラズパイ、ルーター
この接続が正常に動作している必要があります。
その場合はファイルが無いのにカギが開いているという状態になります。

オートホームメーションの仕様として、SSHの実行結果を戻り値で返すことはできますが、レイヤ1ダウンによりそもそも接続できない場合はログも何も出さずに強制終了してしまう仕様らしいのです。

可能性としてはほぼ起きないとは思いますが、冗長性を持たせるため別系統でもファイル作成をさせても良いかもしれません。
例えばうちではセサミ関連の機器とは全く関係ない他社製のオープンセンサーを使用しているので、ドアを開けたタイミングで同じようにファイル作成/更新処理を入れます。
そうすればファイルスタンプも更新されるので、むしろ動作としてはそちらの方が好ましいとさえ思います。

※APIで取得する情報はキャンディハウスのサーバー上にあるものなので、厳密にはカギのリアルタイムの情報ではありません。
つまりは同様にネットワーク障害等が起きた場合は正確ではない可能性があります。


1週間ほどテストしましたが、いまのところ全く問題なく動作しています。
カギをかなり速く連続で開け閉めもしてみましたが期待通りの動作でした。

今回は以上です。

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