通知概覽

通知幫助

在你的 TeslaMate 旁邊跑起 Notifier 所需的一切,以及事件沒送達時該檢查什麼。

開始之前

三件事,多數 TeslaMate 安裝已經具備前兩項。

  • 帶 MQTT broker 的 TeslaMate。Mosquitto 就在 TeslaMate 預設的 Compose 檔案裡。
  • 與 TeslaMate 同一台機器上的 Docker,或任何能連到 broker 的主機。
  • 出站網路存取。無需入站埠,你的 TeslaMate 也不必公開。

安裝 Notifier

TeslaMate 無法自己聯絡到你的手機,iOS 通知也只能經由 Apple 送達。Notifier 就是那個監聽 MQTT 並把事件轉交出去的小容器。它執行在 TeslaMate 旁邊,不開放任何埠。

  1. 在 App 裡獲取令牌

    開啟 HedgieMate,進入設定再進入推送通知並開啟。App 會顯示以 hm_ 開頭的關聯令牌,以及你當前連線的 TeslaMate 伺服器 ID。兩者都複製下來。

    令牌把 App 和容器關聯起來。請當作密碼對待。

  2. 把容器加進 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 身份建立的主機目錄。

  3. 啟動它

    把新服務拉起來。技術棧裡的其他服務不需要重啟。

    終端
    docker compose up -d hedgiemate-notifier

    然後看日誌。正常啟動會列印 broker 連線情況和正在監聽的車輛 ID。

    終端
    docker compose logs -f hedgiemate-notifier
  4. 在 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。

LukStankovic/hedgiemate-notifier

Docker 映象 hedgiemate/notifier:latest Docker Hub

遇到困難?

配置過程不順暢?別擔心,我們隨時為您提供協助。