始める前に
3つあります。最初の2つは、ほとんどのTeslaMate環境にすでに揃っています。
- MQTTブローカーを備えたTeslaMate。MosquittoはTeslaMateの標準のComposeファイルに含まれています。
- TeslaMateと同じマシン上のDocker、またはブローカーに到達できる任意のホスト。
- 外向きのインターネット接続。受信ポートは不要で、TeslaMateを公開する必要もありません。
Notifierを導入する
TeslaMateは自力ではあなたの端末に届きません。またiOSの通知はAppleを通してしか届きません。Notifierは、MQTTを見張ってイベントを引き渡す小さなコンテナです。TeslaMateの隣に置かれ、ポートを開けることはありません。
-
アプリでトークンを取得する
HedgieMateを開き、設定、プッシュ通知の順に進んで通知をオンにします。hm_で始まる連携用トークンと、接続中のTeslaMateサーバーのサーバーIDが表示されます。両方をコピーしてください。
トークンはアプリとコンテナを結びつけます。パスワードと同じように扱ってください。
-
Composeファイルにコンテナを追加する
TeslaMateを動かしているdocker-compose.ymlを開き、下のサービスを追加します。同じファイルにあればブローカーとネットワークを共有するので、MQTT_HOSTはブローカーのサービス名だけで済みます。
docker-compose.yml# add under services: in the docker-compose.yml you run TeslaMate from hedgiemate-notifier: image: hedgiemate/notifier:latest restart: unless-stopped depends_on: - mosquitto environment: HEDGIEMATE_USER_TOKEN: "hm_your_token_here" SERVER_ID: "your-server-uuid" MQTT_HOST: "mosquitto" MQTT_PORT: "1883" CAR_IDS: "1" LOG_LEVEL: "info" volumes: - hedgiemate-notifier-data:/data # and under the top-level volumes: key, adding it if the file has none hedgiemate-notifier-data:ボリュームは任意です。再起動をまたいで車の名前を保持しますが、なくてもリレーが名前を補います。バインドマウントではなく名前付きボリュームを使ってください。コンテナは非rootユーザーで動くため、Dockerがrootで作成したホストのディレクトリには書き込めません。
-
起動する
新しいサービスを立ち上げます。スタックの他の部分を再起動する必要はありません。
ターミナルdocker compose up -d hedgiemate-notifier
その後ログを見てください。正常に起動すれば、ブローカーへの接続と、見張っている車のIDが表示されます。
ターミナルdocker compose logs -f hedgiemate-notifier
-
アプリで確認する
数秒でアプリがサーバーを接続済みとして表示します。そこから、イベントを車ごとに個別にオンとオフにできます。
車が実際に状態を変えるまで何も届きません。プラグを差すのが、最初のイベントを見る一番早い方法です。
Composeを使わない場合
TeslaMateをComposeで管理していない場合は、docker runでも同じことができます。MQTT_HOSTには、コンテナから到達できるホストを指定してください。
docker run -d \ --name hedgiemate-notifier \ --restart unless-stopped \ -e HEDGIEMATE_USER_TOKEN="hm_your_token_here" \ -e SERVER_ID="your-server-uuid" \ -e MQTT_HOST="your-mqtt-host" \ -e CAR_IDS="1" \ hedgiemate/notifier:latest
TeslaMateが複数ある場合
サーバーごとにNotifierを1つ動かします。同じ連携用トークンがどこでも使えます。アプリ上での区別はサーバーIDが行います。
設定
すべて環境変数で設定します。3つは必須で、残りには使える初期値があります。
| 変数 | 初期値 | 説明 |
|---|---|---|
HEDGIEMATE_USER_TOKEN 必須 | なし | アプリで表示される連携用トークン。hm_で始まります。 |
MQTT_HOST 必須 | なし | MQTTブローカーのホスト名。Compose内ではサービス名で、多くはmosquittoです。 |
SERVER_ID 必須 | なし | アプリで表示されるサーバーのUUID。なくてもコンテナは起動しますが、アプリで設定したサーバーごと、車ごとの設定は無視されます。 |
MQTT_PORT | 1883 | ブローカーのポート。 |
MQTT_USERNAME | なし | ブローカーのユーザー名。認証が必要な場合に指定します。 |
MQTT_PASSWORD | なし | ブローカーのパスワード。 |
MQTT_CLIENT_ID | hedgiemate-notifier | ブローカーに対して使うクライアントID。同じ名前で他のものがすでに接続している場合は変更してください。 |
MQTT_TLS | false | TLSのブローカーではtrueにします。初期値のポートは8883に変わります。 |
MQTT_NAMESPACE | なし | TeslaMateでMQTT_NAMESPACEを設定している場合は、同じ値にします。トピックはteslamate<namespace>/cars/#になります。 |
CAR_IDS | 1 | 見張る車のIDをカンマ区切りで指定します。例: 1,2。車ごとに独立した状態管理を持ちます。 |
LOG_LEVEL | info | debug、info、warn、errorのいずれか。 |
RELAY_URL | https://push.hedgiemate.com | リレーのエンドポイント。変更する理由はありません。 |
すべてのイベント
各行が、アプリでの車ごとの独立したスイッチです。ライブアクティビティの更新は通知ではないため、ここには含まれていません。
| 通知 | 送信される条件 |
|---|---|
| 走行 | |
| 走行開始 | state → driving |
| 走行終了 | state leaves driving |
| 充電 | |
| 充電開始 | charging_state → Charging |
| 充電完了 | charging_state → Complete |
| 充電中断 | charging_state leaves Charging without Complete |
| プラグ接続 | plugged_in → true |
| プラグ取り外し | plugged_in → false |
| バッテリー | |
| バッテリー低下 | battery_level ≤ BATTERY_LOW_THRESHOLD |
| 充電目標に到達 | battery_level ≥ BATTERY_HIGH_THRESHOLD |
| 位置 | |
| ジオフェンスへの進入 | geofence set |
| ジオフェンスからの退出 | geofence cleared or changed |
| セキュリティ | |
| セントリーモードの録画 | center_display_state = 7 |
| 車両 | |
| ソフトウェアアップデート | update_available → true |
| スリープ移行中 | state → asleep pending |
| スリープ中 | state → asleep |
| 起動 | state leaves asleep |
何も届かない
上から順に確かめてください。ほとんどは最初の3つのいずれかです。
アプリがまだサーバーに接続していないと表示する
docker compose psでコンテナが実際に動いているか確かめ、次にログを読んでください。MQTT_HOSTの誤りが最もよくある原因です。Compose内ではブローカーのサービス名、つまりmosquittoで、localhostではありません。
コンテナは動いているが、イベントが1つも発生しない
CAR_IDSはTeslaMateが使う車のIDと一致していなければなりません。TeslaMateは車を1から番号づけし、複数台ある場合は列挙します。CAR_IDS=1,2。
MQTTには接続するが、ログが静かなまま
TeslaMateでMQTT_NAMESPACEを設定している場合は、Notifierにも同じ値を設定してください。設定しないとトピック名が合わず、コンテナは読むものがないまま待ち続けます。
一部のイベントは届くが、他は届かない
イベントはそれぞれ、アプリでの車ごとのスイッチです。設定からサーバーを開き、その車のイベント一覧を確かめてください。
バッテリーの通知が一度も来ない
BATTERY_LOW_THRESHOLDとBATTERY_HIGH_THRESHOLDの初期値は20と90です。1回の充電につき一度だけ発生するので、充電開始以降しきい値を越えていない車からは送られません。
数日たつと通知が止まる
サービスにrestart: unless-stoppedを付けて、ホストと一緒に復帰するようにしてください。次にiOS側を確かめます。集中モードやアプリの通知設定が通知を抑えていることがあります。
ライブアクティビティが表示されない
iOSの設定でHedgieMateのライブアクティビティを許可し、進行中のセッションがある必要があります。Dynamic IslandにはiPhone 14 Pro以降が必要です。
ブローカーがログインまたはTLSを要求する
MQTT_USERNAMEとMQTT_PASSWORDを設定してください。TLSの場合はMQTT_TLSをtrueにすると、初期値のポートが8883に変わります。
動作の中身を見たい
LOG_LEVELをdebugにして事象を再現し、その後戻してください。debugではMQTTのメッセージと、そこから下した判断がすべて出力されます。
よくある質問
そもそもNotifierはなぜ必要なのですか
TeslaMateは自分のサーバー上にあり、あなたの端末に届く手段を持ちません。またiOSの通知はAppleだけが配信できます。Notifierはその隙間を埋めます。MQTTのトピックを見張り、状態の変化を捉えて、配信のためにイベントを外へ送り出します。
TeslaMateはインターネットから到達できる必要がありますか
いいえ。Notifierは外向きの接続だけを行うので、通知のために何かを公開したりポートを開けたりする必要はありません。
実際にサーバーから出ていくのは何ですか
イベントの種類、バッテリー残量、充電の状態、そしてジオフェンスを使っている場合はその名前です。座標と走行ルートはTeslaMateに残り、サーバーのアドレスが送られることはありません。イベントのデータは数時間後に削除されます。
TeslaMateとは別のマシンで動かせますか
はい、MQTTブローカーに到達できるなら可能です。MQTT_HOSTにそのホストを指定し、そこからブローカーのポートに到達できるようにしてください。
複数台の車でも動きますか
はい。CAR_IDSにIDを列挙すれば、車ごとに独立した状態の追跡と、アプリでの独立したスイッチを持ちます。
リレーに到達できない場合はどうなりますか
コンテナは間隔を広げながら数回やり直し、その後そのイベントを破棄します。動作は続き、次の状態変化は通常どおり扱います。
何か保存しますか
車の名前だけで、それも任意のボリュームをマウントした場合のみです。それ以外はコンテナが動いている間、メモリ上に保持されます。
更新はどうすればよいですか
イメージを再取得して、サービスを作り直してください。リリースノートはGitHubのreleasesページにあります。
通知を止めるにはどうすればよいですか
アプリでオフにするか、コンテナを停止してください。どちらも単独で機能し、TeslaMateのスタックの他の部分がこれに依存することはありません。
ソースコード
NotifierはMITライセンスのGoです。読んでいただくか、おかしなところがあればissueを立ててください。