開始之前
三件事,多數 TeslaMate 安裝已經具備前兩項。
- 帶 MQTT broker 的 TeslaMate。Mosquitto 就在 TeslaMate 預設的 Compose 檔案裡。
- 與 TeslaMate 同一台機器上的 Docker,或任何能連到 broker 的主機。
- 出站網路存取。無需入站埠,你的 TeslaMate 也不必公開。
安裝 Notifier
TeslaMate 無法自己聯絡到你的手機,iOS 通知也只能經由 Apple 送達。Notifier 就是那個監聽 MQTT 並把事件轉交出去的小容器。它執行在 TeslaMate 旁邊,不開放任何埠。
-
在 App 裡獲取令牌
開啟 HedgieMate,進入設定再進入推送通知並開啟。App 會顯示以 hm_ 開頭的關聯令牌,以及你當前連線的 TeslaMate 伺服器 ID。兩者都複製下來。
令牌把 App 和容器關聯起來。請當作密碼對待。
-
把容器加進 Compose 檔案
開啟你啟動 TeslaMate 用的 docker-compose.yml,加入下面的服務。放在同一個檔案裡就能和 broker 共享網路,MQTT_HOST 直接寫 broker 的服務名即可。
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
然後看日誌。正常啟動會列印 broker 連線情況和正在監聽的車輛 ID。
終端docker compose logs -f hedgiemate-notifier
-
在 App 中確認
App 會在幾秒內把該伺服器標記為已連線。之後就能按車輛逐項開關事件。
在車輛真正發生狀態變化之前不會有任何通知。插上充電線是看到第一個事件最快的方法。
不用 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。同一個關聯令牌在所有伺服器上都有效,App 裡區分它們靠的是伺服器 ID。
配置
全部透過環境變數設定。三個必填,其餘都有可用的預設值。
| 變數 | 預設值 | 說明 |
|---|---|---|
HEDGIEMATE_USER_TOKEN 必填 | 無 | App 提供的關聯令牌,以 hm_ 開頭。 |
MQTT_HOST 必填 | 無 | MQTT broker 的主機名。在 Compose 內就是服務名,通常是 mosquitto。 |
SERVER_ID 必填 | 無 | App 給出的伺服器 UUID。不填容器也能啟動,但 App 中按伺服器和按車輛的設定會被忽略。 |
MQTT_PORT | 1883 | broker 埠。 |
MQTT_USERNAME | 無 | broker 使用者名稱,如果你的 broker 需要認證。 |
MQTT_PASSWORD | 無 | broker 密碼。 |
MQTT_CLIENT_ID | hedgiemate-notifier | 在 broker 上使用的 client ID。若已有別的客戶端用同一個,請改掉。 |
MQTT_TLS | false | broker 使用 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 | 中繼地址。沒有理由改動。 |
全部事件
每一行在 App 中都是按車輛獨立的開關。即時動態的更新不屬於通知,因此不在列表裡。
| 通知 | 觸發條件 |
|---|---|
| 行駛 | |
| 行程開始 | 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 |
什麼都收不到
按順序排查。多數情況都在前三條裡。
App 仍顯示伺服器未連線
先用 docker compose ps 確認容器確實在執行,再看它的日誌。最常見的原因是 MQTT_HOST 寫錯:在 Compose 內應當是 broker 的服務名 mosquitto,而不是 localhost。
容器在跑,但從來沒有事件
CAR_IDS 必須與 TeslaMate 使用的車輛 ID 一致。TeslaMate 從 1 開始編號,多輛車時逐個列出:CAR_IDS=1,2。
MQTT 連上了,日誌卻很安靜
如果你在 TeslaMate 裡設定了 MQTT_NAMESPACE,Notifier 也要設成相同的值。否則主題名對不上,容器無從讀起。
有些事件能收到,有些從來收不到
每個事件在 App 中都是按車輛的開關。在設定中開啟該伺服器,檢查這輛車的事件列表。
電量相關通知從來不觸發
BATTERY_LOW_THRESHOLD 和 BATTERY_HIGH_THRESHOLD 預設是 20 和 90。它們每次充電只觸發一次,所以自開始充電起沒有越過閾值的車輛不會發出通知。
過幾天通知就停了
確認服務帶有 restart: unless-stopped,這樣它會隨主機一起恢復。然後檢查 iOS:專注模式或 App 的通知設定可能把它們攔下了。
即時動態不出現
需要在 iOS 設定中允許 HedgieMate 使用即時動態,並且要有正在進行的會話。動態島需要 iPhone 14 Pro 或更新機型。
broker 需要帳號或 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 broker。把 MQTT_HOST 指向那台主機,並確認從那裡能存取 broker 埠。
支援多輛車嗎?
支援。在 CAR_IDS 裡列出 ID,每輛車都有獨立的狀態跟蹤和 App 內獨立的開關。
中繼不可達時會怎樣?
容器會按遞增的間隔重試幾次,然後丟棄該事件。它會繼續執行,並正常處理下一次狀態變化。
它會儲存什麼嗎?
只有車輛名稱快取,而且僅在你掛載了可選卷時才會存。其餘內容只在容器執行期間儲存在記憶體中。
怎麼更新?
重新拉取映象並重建服務。釋出說明在 GitHub 的 releases 頁面。
怎麼關掉通知?
在 App 裡關閉,或者停止容器。任一方式單獨生效,TeslaMate 技術棧裡沒有其他部分依賴它。
原始碼
Notifier 是 MIT 許可的 Go 程式碼。可以直接讀程式碼,遇到問題也可以提 issue。