Home Assistant กับ Tuya Integration

หลังจากใช้งาน 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 ท่า คือ

  1. 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 ได้เลยโดยไม่ต้องออกอินเตอร์เน็ต
ในภาพตำแหน่งของ Home Assistant คือ Subscriber Backend System (ภาพจาก https://developer.tuya.com/)
  1. 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 ได้

Error message เวลา session ของ mqtt หมดอายุ

สิ่งแรกที่เราลองทำได้คือ ไป Reload ตัว Integration เพื่อให้ตัว Integration ไปดึงค่า configuration มาใหม่แล้วทำการเชื่อมต่อใหม่ … แล้วเราก็จะพบว่าอีกสองชม.มันก็จะเป็นอีก

Menu ในหน้า Integration สำหรับ Reload integration

ทั้งนี้การที่สถานะของอุปกรณ์ไม่อัพเดท สามารถเป็นไปได้จากสาเหตุอื่นๆเช่นกัน ซึ่งถ้าเราลอง reload integration แล้วตัวสถานะยังไม่กลับมาอัพเดทปกติ อาจจะเป็นไปได้ว่าเป็นจากสาเหตุอื่น เดี๋ยวมาว่ากันอีกที

หลังจากเราพบว่าการ reload integration นั้นทำให้มันเชื่อมต่อได้อีกครั้ง เราก็มาเพิ่งพาตัว HA feature ทำให้มันสามารถ reload integration นี้เองหลังจากที่มี error ดังกล่าว … ทำยังไงมาดูกัน

  1. เราให้ Home Assistant ทำการ Monitor System log ของตัวเอง
  2. เมื่อเจอ System Log ประโยคที่ว่าด้านบน เราจะให้ Home Assistant ทำการ Reload Tuya component

มาถึง steps ละเอียดกัน

  1. โดยปกติ HA จะ write log ลงไปเฉยๆ การจะทำให้ log สามารถสร้างเป็น event เพื่อไป trigger automation ได้นั้น จะต้องเพิ่ม configuration ด้านล่างเข้าไปที่ configuration.yaml
    system_log:
    fire_event: true
  2. เมื่อเราได้ 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 มาซักอันนึงก็ได้ มีผลเหมือนกัน
  3. Save สำเร็จก็เป็นอันเสร็จสิ้น

หมายเหตุ:

  • การเปิด system even log สามารถสร้างปัญหาเรื่อง performance ให้กับระบบได้ ถ้า HA ของคุณมี log error/warning เยอะมาก
  • ระหว่างการ reload config entry จะทำให้ entity ต่างๆมีค่าเป็น Unavailable ชั่วคราว (ประมาณ 1-3 วินาที แล้วแต่ความเร็วในการ reload) ข้อเสียคือมันจะทำให้ history เพี้ยน เช่น เราต้องการรู้ว่าประตูเปิดมานานแค่ไหนแล้ว จะดูไม่ได้เพราะมันจะโดน unavailable มาแทรกทุกๆ 2 ชม. (ดูรูปอันถัดไป)

รายละเอียดการสร้าง Automation เพื่อ reload tuya component อัตโนมัติเวลาเกิด error
อุปกรณ์จะมีสถานะเป็น unavailable เวลา reload integration

ด้านล่างเป็น 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

Scroll to top