หลังจากใช้งาน Home Assistant (HA) กับ Tuya มาได้พักใหญ่ คิดว่าตกผลึกประมาณนึงละ เลยอยากเล่าหน่อย
Tuya เป็นบริษัทที่ขายอุปกรณ์ Iot + platform ของจีนเจ้าใหญ่ ที่มีบริษัทเอาไปผลิต device ออกมาเยอะมากที่ใช้งานบน platform ของ Tuya มีทั้งแบบที่เป็น Wi-Fi และ Zigbee
ก่อนจะไปต่อ ต้องบอกความคิดเบื้องหลังใช้งาน Tuya กับ Home Assistant ของตัวเอง ซึ่งก็คือ
- แอพ Tuya ต้องยังใช้งานกับอุปกรณ์ได้ปกติ
- ไม่อยากลง custom firmware – อยากให้สามารถใช้งานได้ปกติ ไม่อยากต้องตามข่าวของ library / breaking changes ต่างๆ ของแต่ละ component
- สามารถใช้งานกับ Google Assistant ได้ (เพื่อทำ voice commands)
- ถ้าสามารถไม่ต้องพึ่งพา internet ได้ก็จะดี (optional)
ในการ Integrate Tuya เข้ากับ Home Assistant นั้นมีด้วยการ 2 ท่า คือ
- Official Tuya Integration – https://www.home-assistant.io/integrations/tuya/
อันนี้ก็ตามตัว อันหลักของ Tuya built-in มาในระบบของ HA เอง มีข้อควรทราบคือ
- ต้องการ Tuya Iot platform account คือเราต้องไปสมัคร developer platform เพื่อให้ได้ client detail มากรอกใน Home Assistant
- ในการใช้งาน developer platform จะมีสิ่งที่เรียกว่า subscription อยู่ ซึ่งที่ผ่านมาจนถึงตอนนี้ ยังฟรีอยู่ (โดยเรียกว่า trial) ซึ่งเมื่อหมดอายุก็เข้ามากด ขอต่ออายุได้ … แต่แน่นอนว่าเราต้องขยันเข้ามากดขอต่ออายุนะ ไม่งั้นก็ใช้ไม่ได้
- การต่อกับ official add-on นั้น มี mechanism ที่เป็น messaging queue (MQTT) เพื่อส่งข้อมูลของ sensor / สถานะสวิตช์ และค่าต่างๆจาก server Tuya กลับมาให้เรา ซึ่ง add-on ปัจจุบันทำสิ่งนี้ได้แย่มาก กล่าวคือ ทุกๆ 2 ชม. ตัว messaging queue credential จะหมดอายุ และ add-on เองไม่สามารถขอ token ใหม่ได้ เลยต้องมีวิธี workaround (ทีเดี๋ยวจะเขียนไว้ด้านล่าง) เพื่อให้มันใช้งานได้อย่างต่อเนื่อง
- จากการอ่านค่าต่างๆจากตัว messaging queue ที่ว่า ทำให้ add-on ต้องพึ่งพา internet (ในการรับค่าสถานะ) ตลอดเวลา ส่วนการสั่งงานนั้น น่าจะสามารถสั่งตรงไปยัง Gateway/Hub ได้เลยโดยไม่ต้องออกอินเตอร์เน็ต
- Local Tuya Integration – https://github.com/rospogrigio/localtuya/
อันนี้ก็ตามตัวเหมือนกัน คือ เน้นไปที่การติดต่อกับ device แบบ local เป็นหลัก คือไม่ต้องพึ่งพาอินเตอร์เน็ตใดๆ (ยกเว้นการ setup device ครั้งแรกๆที่มี option ให้ต่อ Tuya cloud เพื่อช่วยในการ setup)
ข้อจำกัดของวิธีนี้คือ
- As of Sep 2023, add-on อันนี้ยังใช้ได้กับแค่ device ที่เป็น Wi-Fi ส่วน device ที่เป็น Zigbee หรือ device ที่วิ่งผ่าน Hub/Gateway นั้นยังใช้ไม่ได้
- Maintainer ของโปรเจคเริ่มดูแลไม่ค่อยไหว มี issues / pull request เปิดค้างไว้เยอะมาก มีการพยายามทำให้รองรับ zigbee ด้วยแต่ก็ยังไม่สำเร็จ
- เนื่องจากเป้าหมายของ Addon ตัวนี้คือการติดต่อทั้งหมดกับอุปกรณ์ต้องเป็น local network เท่านั้น เลยทำให้หลายๆ feature พัฒนาได้ช้า รวมถึงอาจจะมีปัญหาได้ถ้ามีการอัพเดท firmware ของตัว Hub ที่ทำให้การสื่อสารเปลี่ยนไป (Philips Hue เพิ่งทำสิ่งนี้คือบังคับอุปกรณ์ทุกอันต้องต่อ cloud ด้วย ทำเป็น local device only ไม่ได้อีกต่อไป)
หลังจากรู้จักวิธีการต่อกับ Tuya ทั้งสองแบบแล้วก็เลือกใช้กันตามสะดวก อาจจะใช้ทั้งสองแบบผสมๆกันไปก็ได้
มาถึงการแก้ปัญหา …
เราจะแก้ปัญหาเรื่อง Official Tuya Integration ไม่อัพเดทสถานะของอุปกรณ์ได้อย่างไร ?
ถ้าเราไปดู Logs ของ HA ของเรา ถ้าเป็นกรณีที่เกี่ยวกับการ authentication ของ message queue จะเห็นว่า ทุกๆประมาณ 2 ชม. จะมี error message ที่ว่า “error while get mqtt config” ตามรูปด้านล่างอยู่ คือ error ที่บอกว่าตัว mqtt ไม่สามารถอ่าน config เพื่อจะไปต่อ connection ได้
สิ่งแรกที่เราลองทำได้คือ ไป Reload ตัว Integration เพื่อให้ตัว Integration ไปดึงค่า configuration มาใหม่แล้วทำการเชื่อมต่อใหม่ … แล้วเราก็จะพบว่าอีกสองชม.มันก็จะเป็นอีก
ทั้งนี้การที่สถานะของอุปกรณ์ไม่อัพเดท สามารถเป็นไปได้จากสาเหตุอื่นๆเช่นกัน ซึ่งถ้าเราลอง reload integration แล้วตัวสถานะยังไม่กลับมาอัพเดทปกติ อาจจะเป็นไปได้ว่าเป็นจากสาเหตุอื่น เดี๋ยวมาว่ากันอีกที
หลังจากเราพบว่าการ reload integration นั้นทำให้มันเชื่อมต่อได้อีกครั้ง เราก็มาเพิ่งพาตัว HA feature ทำให้มันสามารถ reload integration นี้เองหลังจากที่มี error ดังกล่าว … ทำยังไงมาดูกัน
- เราให้ Home Assistant ทำการ Monitor System log ของตัวเอง
- เมื่อเจอ System Log ประโยคที่ว่าด้านบน เราจะให้ Home Assistant ทำการ Reload Tuya component
มาถึง steps ละเอียดกัน
- โดยปกติ HA จะ write log ลงไปเฉยๆ การจะทำให้ log สามารถสร้างเป็น event เพื่อไป trigger automation ได้นั้น จะต้องเพิ่ม configuration ด้านล่างเข้าไปที่ configuration.yaml
system_log:
fire_event: true - เมื่อเราได้ event ที่มาจาก system log แล้ว เราก็ไปสร้าง automation ให้ reload addon เมื่อเจอ error
เลือก event type เป็น system_log_event เพื่อให้ trigger automation นี้ ถ้าเจอ system log อันใหม่
ใส่ condition เป็น Template condition และ ใส่ template value เป็น “{{ \”mqtt config\” in trigger.event.data.message[0] }}” คือเช็คว่าถ้าในเนื้อข้อความมี error “mqtt config” ให้ trigger ทำงาน
ตรง action ให้เลือกเป็น homeassistant: Reload config entry ซึ่งมันคือการ reload ทั้ง integration ตอนเราเลือก target เลือก device ใน Tuya integration มาซักอันนึงก็ได้ มีผลเหมือนกัน - Save สำเร็จก็เป็นอันเสร็จสิ้น
หมายเหตุ:
- การเปิด system even log สามารถสร้างปัญหาเรื่อง performance ให้กับระบบได้ ถ้า HA ของคุณมี log error/warning เยอะมาก
- ระหว่างการ reload config entry จะทำให้ entity ต่างๆมีค่าเป็น Unavailable ชั่วคราว (ประมาณ 1-3 วินาที แล้วแต่ความเร็วในการ reload) ข้อเสียคือมันจะทำให้ history เพี้ยน เช่น เราต้องการรู้ว่าประตูเปิดมานานแค่ไหนแล้ว จะดูไม่ได้เพราะมันจะโดน unavailable มาแทรกทุกๆ 2 ชม. (ดูรูปอันถัดไป)
ด้านล่างเป็น Automation แบบ YAML สามารถเอาไป adapt ต่อได้
alias: Reload Tuya connection when required
description: ""
trigger:
- platform: event
event_type: system_log_event
event_data:
level: ERROR
condition:
- condition: template
value_template: "{{ \"mqtt config\" in trigger.event.data.message[0] }}"
action:
- service: homeassistant.reload_config_entry
data: {}
target:
device_id: (device id ของ tuya อันไหนก็ได้)
mode: single
นอกจากนี้แล้ว มีอีกสองปัญหาอีกอันที่ควรพูดถึงก็คือ
การใช้งาน Iot Platform ของ Tuya
ในขั้นตอนแรกของการติดตั้ง Tuya addon คือ การสมัคร Tuya Iot platform account ปัญหาอยู่ตรงนี้ล่ะ การใช้งาน Iot platform นั้น มีระบบ subscription license ถึงแม้ว่าในปัจจุบันทาง Tuya จะให้ใช้ฟรี 6 เดือน แล้วสามารถกดขอต่ออายุได้ (เรื่อย ๆ ?) แต่แปลว่าการใช้งาน platform ของเราจะขึ้นอยู่กับการขอต่อ subscription ดังกล่าว รวมถึงการใช้งาน mqtt เพื่อ subscribe event เอง ก็มี license ตังหาก และมีการจำกัดจำนวน message ต่อเดือนเอาไว้ด้วย ซึ่งถ้าเราใช้งานไปเรื่อย ๆ แล้วถึงข้อจำกัดเหล่านี้ Tuya device บน HA ของเราก็ไม่ทำงานไปซะเฉยๆ
Library Iot ของ Tuya ที่ไม่ค่อยอัพเดท
ตัว Official Tuya Integration เองนั้น พึ่งพา library อีกตัวนึง (ซึ่งเป็น official library ของ Tuya เช่นกัน) คือ https://github.com/tuya/tuya-iot-python-sdk ซึ่งถ้าเข้าไปดู จะเห็นได้ว่า ตัว library ดังกล่าวนั้น อัพเดทน้อยลงไปเยอะมาก ตัว library release ล่าสุดคือปลายปี 2021
ปัญหาเรื่อง message queue authentication โดนเปิดมาเป็นปีๆแล้วก็ยังไม่ได้รับการแก้ไข มีคนพยายามจะแก้โดยการสร้าง Pull Request เข้ามาก็ยังไม่ได้รับการ Merge … ปัญหา classic ของ opensource 😅
จบ .. Happy Home Automation 🏡
ปล. กำลังซุ่มทำ Home Assistant Integration สำหรับอุปกรณ์จาก LifeSmart อยู่
credit: https://github.com/home-assistant/core/issues/61854#issuecomment-997197175