ความช่วยเหลือเรื่องการแจ้งเตือน
ทุกอย่างที่ต้องใช้เพื่อให้ Notifier ทำงานข้าง TeslaMate ของคุณ และสิ่งที่ต้องตรวจสอบเมื่อเหตุการณ์ไม่มาถึง
ก่อนเริ่ม
สามอย่าง และการติดตั้ง TeslaMate ส่วนใหญ่มีสองอย่างแรกอยู่แล้ว
- TeslaMate ที่มี MQTT broker โดย Mosquitto มาพร้อมไฟล์ Compose มาตรฐานของ TeslaMate
- Docker บนเครื่องเดียวกับ TeslaMate หรือโฮสต์ใดก็ได้ที่เข้าถึง broker ได้
- การเชื่อมต่ออินเทอร์เน็ตขาออก ไม่ต้องเปิดพอร์ตขาเข้า และ TeslaMate ไม่ต้องเปิดสู่สาธารณะ
ติดตั้ง Notifier
TeslaMate ติดต่อไปยังโทรศัพท์ของคุณเองไม่ได้ และการแจ้งเตือนบน iOS ต้องผ่าน Apple เท่านั้น Notifier คือคอนเทนเนอร์เล็ก ๆ ที่คอยดู MQTT แล้วส่งเหตุการณ์ต่อ มันทำงานข้าง ๆ TeslaMate และไม่เปิดพอร์ตใด ๆ
-
รับโทเคนในแอป
เปิด HedgieMate ไปที่การตั้งค่า จากนั้นไปที่การแจ้งเตือนแบบพุชแล้วเปิดใช้งาน แอปจะแสดงโทเคนเชื่อมต่อที่ขึ้นต้นด้วย hm_ และรหัสเซิร์ฟเวอร์ TeslaMate ที่คุณเชื่อมต่ออยู่ คัดลอกทั้งสองค่า
โทเคนคือสิ่งที่จับคู่แอปกับคอนเทนเนอร์ ให้ดูแลเหมือนรหัสผ่าน
-
เพิ่มคอนเทนเนอร์ลงไฟล์ Compose
เปิดไฟล์ docker-compose.yml ที่คุณใช้รัน TeslaMate แล้วเพิ่มเซอร์วิสด้านล่าง การอยู่ในไฟล์เดียวกันทำให้ใช้เครือข่ายร่วมกับ 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:volume เป็นตัวเลือกเสริม ช่วยเก็บชื่อรถไว้ข้ามการรีสตาร์ต ถ้าไม่ใส่ รีเลย์ก็เติมชื่อให้อยู่ดี ให้ใช้ named volume แทน bind mount เพราะคอนเทนเนอร์รันด้วยผู้ใช้ที่ไม่ใช่ root และเขียนลงไดเรกทอรีที่ Docker สร้างในฐานะ root ไม่ได้
-
สั่งรัน
สตาร์ตเซอร์วิสใหม่ ส่วนอื่นของสแตกไม่ต้องรีสตาร์ต
เทอร์มินัลdocker compose up -d hedgiemate-notifier
จากนั้นอ่านล็อก การเริ่มต้นที่ปกติจะแสดงการเชื่อมต่อ broker และรหัสรถที่กำลังเฝ้าดู
เทอร์มินัล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 หนึ่งตัวข้างแต่ละเซิร์ฟเวอร์ โทเคนเชื่อมต่อเดียวกันใช้ได้ทุกที่ สิ่งที่แยกความต่างในแอปคือรหัสเซิร์ฟเวอร์
การตั้งค่า
ทุกอย่างตั้งผ่านตัวแปรสภาพแวดล้อม สามตัวจำเป็น ที่เหลือมีค่าเริ่มต้นที่ใช้งานได้
| ตัวแปร | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|
HEDGIEMATE_USER_TOKEN จำเป็น | ไม่มี | โทเคนเชื่อมต่อจากแอป ขึ้นต้นด้วย hm_ |
MQTT_HOST จำเป็น | ไม่มี | ชื่อโฮสต์ของ MQTT broker ของคุณ ภายใน Compose คือชื่อเซอร์วิส ซึ่งมักเป็น mosquitto |
SERVER_ID จำเป็น | ไม่มี | UUID ของเซิร์ฟเวอร์จากแอป คอนเทนเนอร์เริ่มทำงานได้แม้ไม่มีค่านี้ แต่การตั้งค่ารายเซิร์ฟเวอร์และรายคันในแอปจะถูกละเลย |
MQTT_PORT | 1883 | พอร์ตของ broker |
MQTT_USERNAME | ไม่มี | ชื่อผู้ใช้ของ broker หากต้องยืนยันตัวตน |
MQTT_PASSWORD | ไม่มี | รหัสผ่านของ broker |
MQTT_CLIENT_ID | hedgiemate-notifier | client ID ที่ใช้กับ broker เปลี่ยนได้หากมีอย่างอื่นเชื่อมต่อด้วยค่านี้อยู่แล้ว |
MQTT_TLS | false | ตั้งเป็น true สำหรับ broker ที่ใช้ TLS พอร์ตเริ่มต้นจะเปลี่ยนเป็น 8883 |
MQTT_NAMESPACE | ไม่มี | ต้องตรงกับ MQTT_NAMESPACE ใน TeslaMate หากคุณตั้งไว้ หัวข้อจะกลายเป็น teslamate<namespace>/cars/# |
CAR_IDS | 1 | รหัสรถที่จะเฝ้าดู คั่นด้วยจุลภาค เช่น 1,2 รถแต่ละคันมีสเตตแมชชีนของตัวเอง |
LOG_LEVEL | info | debug, info, warn หรือ error |
RELAY_URL | https://push.hedgiemate.com | ที่อยู่ของรีเลย์ ไม่มีเหตุผลที่ต้องเปลี่ยน |
เหตุการณ์ทั้งหมด
แต่ละแถวคือสวิตช์แยกรายคันในแอป การอัปเดต Live Activities ไม่ใช่การแจ้งเตือนจึงไม่อยู่ในรายการนี้
| การแจ้งเตือน | ส่งเมื่อ |
|---|---|
| การขับขี่ | |
| เริ่มขับ | 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 |
| ความปลอดภัย | |
| การบันทึก Sentry | center_display_state = 7 |
| ตัวรถ | |
| อัปเดตซอฟต์แวร์ | update_available → true |
| กำลังเข้าสู่โหมดพัก | state → asleep pending |
| โหมดพัก | state → asleep |
| รถตื่นแล้ว | state leaves asleep |
ไม่มีอะไรมาเลย
ไล่ตามรายการจากบนลงล่าง ส่วนใหญ่เป็นหนึ่งในสามข้อแรก
แอปยังบอกว่าเซิร์ฟเวอร์ไม่ได้เชื่อมต่อ
ตรวจด้วย docker compose ps ว่าคอนเทนเนอร์ทำงานอยู่จริง แล้วอ่านล็อก สาเหตุที่พบบ่อยคือ MQTT_HOST ผิด ภายใน Compose ค่านี้คือชื่อเซอร์วิสของ broker คือ mosquitto ไม่ใช่ localhost
คอนเทนเนอร์ทำงาน แต่ไม่เคยมีเหตุการณ์เกิดขึ้น
CAR_IDS ต้องตรงกับรหัสรถที่ TeslaMate ใช้ TeslaMate เริ่มนับรถจาก 1 และถ้ามีหลายคันให้ระบุทั้งหมด: CAR_IDS=1,2
MQTT เชื่อมต่อได้แต่ล็อกเงียบ
ถ้าคุณตั้ง MQTT_NAMESPACE ใน TeslaMate ให้ตั้งค่าเดียวกันใน Notifier ด้วย ไม่เช่นนั้นชื่อหัวข้อจะไม่ตรงกันและคอนเทนเนอร์จะไม่มีอะไรให้อ่าน
บางเหตุการณ์มา บางเหตุการณ์ไม่มาเลย
ทุกเหตุการณ์เป็นสวิตช์รายคันในแอป เปิดเซิร์ฟเวอร์ในการตั้งค่าแล้วตรวจรายการเหตุการณ์ของรถคันนั้น
การแจ้งเตือนแบตเตอรี่ไม่เคยทำงาน
BATTERY_LOW_THRESHOLD และ BATTERY_HIGH_THRESHOLD มีค่าเริ่มต้น 20 และ 90 ทั้งคู่ส่งครั้งเดียวต่อรอบการชาร์จ ดังนั้นรถที่ยังไม่ข้ามเส้นตั้งแต่เริ่มชาร์จจะไม่ส่งอะไรออกมา
การแจ้งเตือนหยุดไปหลังผ่านไปไม่กี่วัน
ตรวจว่าเซอร์วิสมี restart: unless-stopped เพื่อให้กลับมาพร้อมเครื่อง จากนั้นตรวจฝั่ง iOS โหมดโฟกัสหรือการตั้งค่าการแจ้งเตือนของแอปอาจกลืนมันไป
Live Activities ไม่ปรากฏ
ต้องอนุญาต Live Activities ให้ HedgieMate ในการตั้งค่า iOS และต้องมีเซสชันที่กำลังทำงานอยู่ Dynamic Island ต้องใช้ 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 topic ของคุณ จับการเปลี่ยนสถานะ แล้วส่งเหตุการณ์ออกไปเพื่อให้ถูกส่งถึงคุณ
TeslaMate ของฉันต้องเข้าถึงได้จากอินเทอร์เน็ตไหม
ไม่ต้อง Notifier สร้างเฉพาะการเชื่อมต่อขาออก จึงไม่ต้องเปิดบริการใดสู่ภายนอกและไม่ต้องทำพอร์ตฟอร์เวิร์ดเพื่อให้การแจ้งเตือนทำงาน
อะไรบ้างที่ออกจากเซิร์ฟเวอร์ของฉันจริง ๆ
ประเภทเหตุการณ์ ระดับแบตเตอรี่ สถานะการชาร์จ และชื่อ geofence หากคุณใช้ geofence พิกัดและเส้นทางการขับขี่ยังอยู่ใน TeslaMate ของคุณ และที่อยู่เซิร์ฟเวอร์ไม่ถูกส่งออกไป ข้อมูลเหตุการณ์จะถูกลบหลังผ่านไปไม่กี่ชั่วโมง
รันบนเครื่องอื่นที่ไม่ใช่ TeslaMate ได้ไหม
ได้ ตราบใดที่เข้าถึง MQTT broker ของคุณได้ ตั้ง MQTT_HOST ให้ชี้ไปยังโฮสต์นั้นและตรวจว่าพอร์ตของ broker เข้าถึงได้จากที่นั่น
ใช้กับรถหลายคันได้ไหม
ได้ ใส่รหัสไว้ใน CAR_IDS แล้วรถแต่ละคันจะมีการติดตามสถานะของตัวเองและสวิตช์ของตัวเองในแอป
ถ้ารีเลย์ติดต่อไม่ได้จะเกิดอะไรขึ้น
คอนเทนเนอร์จะลองใหม่ไม่กี่ครั้งโดยเว้นระยะนานขึ้น แล้วทิ้งเหตุการณ์นั้นไป มันยังทำงานต่อและจัดการการเปลี่ยนสถานะครั้งถัดไปตามปกติ
มันเก็บข้อมูลอะไรไว้ไหม
เก็บเพียงแคชชื่อรถ และเฉพาะเมื่อคุณเมานต์ volume ที่เป็นตัวเลือกเสริม ส่วนที่เหลืออยู่ในหน่วยความจำตราบที่คอนเทนเนอร์ยังทำงาน
อัปเดตอย่างไร
ดึงอิมเมจใหม่แล้วสร้างเซอร์วิสขึ้นมาใหม่ บันทึกการเปลี่ยนแปลงอยู่ในหน้า releases บน GitHub
ปิดการแจ้งเตือนอย่างไร
ปิดในแอป หรือหยุดคอนเทนเนอร์ ทั้งสองวิธีทำงานได้ด้วยตัวเอง และไม่มีส่วนอื่นในสแตก TeslaMate ที่พึ่งพามัน
ซอร์สโค้ด
Notifier เขียนด้วย Go ภายใต้สัญญาอนุญาต MIT อ่านโค้ดได้ หรือเปิด issue ถ้าพบปัญหา
LukStankovic/hedgiemate-notifier
ต้องการความช่วยเหลือไหม
มีปัญหาในการตั้งค่าใช่ไหม เราพร้อมช่วยคุณเริ่มต้นใช้งาน