MQTT là giao thức chuyển tải thông điệp giữa máy và máy, rất nhanh và được sử dụng nhiều trong các ứng dụng IOT – Internet vạn vật. Trong Home Assistant, MQTT là một trong các giao thức để kết nối và điều khiển các thiết bị khác bên cạnh các giao thức như HTTP, Websocket. Các thiết bị thường được kết nối vào Home Assistant qua giao thức MQTT:
Là firmware được phát triển cho các thiết bị sử dụng chip ESP8266(5) thường được sử dụng trong các thiết bị đến từ SonOFF hay nền tảng Tuya. Tasmota sử dụng MQTT như giao thức chính để giao tiếp với các thiết bị khác.
Tasmota hỗ trợ mạnh mẽ máy chủ Hass và được sử dụng bởi hàng nghìn người dùng cùng hàng triệu thiết bị trên khắp thế giới.
zigbee2mqtt là firmware chạy trên các thiết bị sử dụng chip từ Texas Instrument, giúp kết nối các thiết bị Zigbee từ nhiều hãng sản xuất với nhau vào hạ tầng IOT/SmartHome thông qua giao thức MQTT.
Open ZWave to MQTT là một gateway dựa trên NodeJS giúp tự tạo mạng ZWave. ZWave to MQTT cũng sử dụng giao thức MQTT để kết nối với các hệ thống IOT/SmartHome khác.
Để sử dụng giao thức MQTT, bạn sẽ cần một máy chủ MQTT – mqtt broker làm nhiệm vụ quản lý, điều phối tin và các thiết bị con gọi là mqtt client. Máy chủ Home Assistant (Hass) có thể đảm nhiệm cả hai nhiệm vụ này, khi vừa làm broker vừa làm client.
Bạn cũng có thể cấu hình để máy chủ Hass kết nối vào bất cứ MQTT Broker nào khác (như CloudMQTT) chứ không bắt buộc phải sử dụng broker trên Hass. Tuy nhiên nếu chưa có sẵn MQTT Broker thì sử dụng ngay máy chủ Hass là phương án tiện lợi và tiết kiệm.
MQTT Broker trên Hass
Nếu bạn đang sử dụng máy chủ Hass đầy đủ, có Supervisor, bạn có thể sử dụng ngay Mosquitto broker có sẵn dưới dạng addon. Để cài đặt addon này, bạn vào Supervisor trên giao diện quản lý của Home Assistant, mục Add-on store, tìm MQTT trong ô tìm kiếm.
Sau đó bấm vào addon Mosquitto broker rồi chọn INSTALL để cài đặt. Sau khi hoàn tất, bạn có thể ấn START để khởi động Mosquitto broker với cài đặt mặc định hoặc chuyển sang tab Configuration để thay đổi cấu hình.
MQTT Broker nhúng trong Hass
Home Assistant từng kèm theo một embedded mqtt broker dựa trên HBMQTT nhưng đã bị loại bỏ trong phiên bản Home Assistant 0.92.
Để tránh nhầm lẫn, mặc dù bạn có thể cài đặt và quản lý Mosquitto mqtt broker từ Hass, nó vẫn là một “máy chủ” riêng biệt chứ không phải là một thành phần nhúng bên trong Hass.
Nếu đang sử dụng Home Assistant Core và không thể cài đặt addon hoặc bạn muốn cài đặt mosquitto broker riêng, bạn có thể làm theo hướng dẫn tại đây: Cài đặt Mosquitto MQTT Broker trên Linux
logins: - username: konnected password: a.342355565 - username: hass password: my93428899s anonymous: false customize: active: false folder: mosquitto certfile: fullchain.pem keyfile: privkey.pem require_certificate: false
Cấu hình mẫu của addon Mosquitto broker, trong đó:
logins:
chứa danh sách các cặp username/password để xác thực khi một client muốn kết nối vào broker.
Lý tưởng nhất là bạn nên cấu hình riêng biệt username/password cho từng thiết bị sẽ kết nối đến broker này.
Còn để đơn giản, bạn có thể cấu hình riêng một username/password cho Hass, một username/password dùng chung cho mọi thiết bị khác trong mạng nội bộ và từng username/password riêng cho các thiết bị có khả năng kết nối đến broker từ bên ngoài.anonymous:
cho phép kết nối ẩn danh tức thiết bị nào cũng kết nối được mà không cần xác thựccustomize:
cho phép tải các cấu hình phức tạp hơn từ các file trong một folder chỉ định trướcrequire_certificate:
tuỳ chọn bảo mật, yêu cầu các client phải cung cấp một chứng chỉ hợp lệ trước khi kết nối
Lúc này thì MQTT Broker của bạn đã sẵn sàng để tiếp nhận các client (như Tasmota) kết nối vào.
Lưu ý bảo mật
Dù giao thức MQTT cực kỳ nhanh và nhẹ, máy chủ Mosquitto cũng cực nhẹ nhưng nếu bị xâm nhập, hậu quả rất nghiêm trọng. Với cấu hình mặc định, bất cứ client nào cũng có thể gửi và nhận mọi thông tin có trên MQTT Broker và qua đó nắm được tình trạng cũng như điều khiển được toàn bộ thiết bị kết nối vào cùng mạng MQTT.
Bạn phải áp dụng các biện pháp bảo mật tương xứng cho mạng MQTT của mình và không bao giờ được mở tự do cho mọi client kết nối mà không cần xác thực.
MQTT Integration trong Hass
Khi bạn đã có MQTT Broker, tích hợp MQTT – MQTT Integration sẽ giúp Hass kết nối đến broker này, tức Hass lúc này đóng vai trò của một mqtt client.
Thêm mới qua giao diện UI
Bạn có thể cấu hình MQTT integration từ giao diện web – UI trong mục quản lý các tích hợp (Cấu hình > Các bộ tích hợp). Lưu ý là MQTT Broker phải được khởi động trước khi thêm MQTT integration vào Hass.
Chọn thêm tích hợp mới rồi tìm MQTT trong ô tìm kiếm để thêm hoặc nếu Hass tự nhận ra MQTT broker, bạn có thể chọn CẤU HÌNH ngay bên ngoài.
- Nếu bạn sử dụng addon Mosquitto broker với cấu hình mặc định, chọn Enable discovery rồi bấm SUBMIT để hoàn tất
- Nếu bạn cấu hình addon Mosquitto broker với thông tin username/password hoặc sử dụng MQTT broker khác, cấu hình như bên dưới.
Enable discovery kích hoạt tính năng tự nhận biết các thiết bị mới qua MQTT của Hass (xem thêm).
Broker
địa chỉ IP, domain của mqtt broker bạn muốn kết nối đến. Nếu bạn dùng addon Mosquitto broker, ưu tiên sử dụng core-mosquitto như trong ảnh.
Port, Username, Password
cổng và thông tin xác thực để kết nối vào broker.
Lưu ý, nếu muốn thay đổi cấu hình của MQTT Integration, bạn sẽ phải Xoá bỏ nó trước rồi lặp lại quá trình thêm mới như trên.
Cập nhật ngày 24/07/2020
Cập nhật cấu hình Mosquitto trên Home Assistant 0.113 trở về sau
Từ 0.113, bạn được yêu cầu cấu hình thêm các tuỳ chọn như trong ảnh. Nếu chưa rõ, bạn có thể để mặc định rồi sửa sau.
Cấu hình MQTT Integration thủ công sử dụng YAML
Cấu hình thủ công MQTT integration sử dụng ngôn ngữ YAML (là ngôn ngữ chính dùng cho cấu hình trong Hass) cho bạn cấu hình linh hoạt và nhiều tuỳ chọn hơn. Bạn sử dụng cấu hình mẫu bên dưới bên trong file cấu hình chính của Hass tại /config/configuration.yaml.
mqtt: discovery: true broker: core-mosquitto username: hass password: my93428899s
Trong đó,
discovery:
kích hoạt tính năng mqtt discovery của Home Assistant (xem bên dưới)broker:
địa chỉ ip hoặc domain của máy chủ mqtt. Nếu bạn dùng addon Mosquitto broker, ưu tiên sử dụng core-mosquitto.username:
/password:
tài khoản xác thực với mqtt broker (nếu bạn sử dụng addon Mosquitto broker với cấu hình mặc định thì không cần cấu hình này)
Các tuỳ chọn khác:
port:
cổng kết nối đến mqtt brokerclient_id:
mã client, được tạo ngẫu nhiên nếu không cấu hìnhkeepalive:
khoảng thời gian giữa hai lần “ping” để duy trì kết nối đến broker (xem thêm: LWT / Birth Message / Topic # và +)certificate:
chỉ định chứng chỉ mà Hass dùng kết nối đến brokertls_insecure:
vàtls_version:
xác thực chứng chỉ của broker trước khi kết nối và chỉ định phiên bản tls thấp nhất hỗ trợprotocol:
phiên bản giao thức
Sau khi cấu hình, khởi động lại Home Assistant để khởi tạo MQTT integration. Nếu bạn chuyển từ phương thức cấu hình UI sang, không cần phải xoá integration MQTT trước khi khởi động lại. Xoá integration MQTT trong mục quản lý tích hợp trên giao diện cũng sẽ không xoá bỏ cấu hình MQTT đã tạo và MQTT integration sẽ được khởi tạo mỗi lần khởi động lại Hass.
Thiết bị MQTT trong Home Assistant
Sau khi Home Assistant được cấu hình và kết nối vào mạng MQTT thành công, các thiết bị MQTT trong cùng mạng sẽ tự động được nhận dạng và thêm vào Home Assistant hoặc bạn có thể cấu hình thủ công (qua YAML) với các thiết bị không hỗ trợ tự động nhận dạng hoặc thiết bị mà bạn muốn kiểm soát thủ công cấu hình của nó.
Home Assistant MQTT Discovery
MQTT Discovery là tính năng giúp người dùng kết nối một thiết bị mqtt vào Hass mà không cần phải cấu hình phức tạp. Tính năng này phải được hỗ trợ và kích hoạt trước trên thiết bị. Zigbee2MQTT và Tasmota (phiên bản đầy đủ) đều hỗ trợ tính năng này, trên Tasmota bạn phải kích hoạt nó sau khi cài đặt (xem ở dưới).
Các loại thiết bị được hỗ trợ MQTT Discovery trong Home Assistant bao gồm: Bảng điều khiển báo động, cảm biến, công tắc, đèn, camera, rèm hay cửa gara, quạt, bộ điều hoà không khí, khoá, máy hút bụi, thiết bị kích hoạt. Như đã biết, các loại thiết bị này được đại diện trong Home Assistant bởi các domain.
Để xem các thiết bị và entity nào đang được tích hợp vào Hass qua MQTT Discovery, bạn vào mục Cấu hình > Các bộ tích hợp rồi tìm integration MQTT như ảnh dưới. Lưu ý rằng chỉ các thiết bị tích hợp qua Discovery mới xuất hiện ở đây.
Đôi khi tính năng Discovery hoạt động không đúng dù đã được kích hoạt trên cả Home Assistant và thiết bị. Khi đó bạn có thể thử các cách sau để giải quyết:
- Restart – khởi động lại MQTT broker (như addon trong Hass) rồi khởi động lại thiết bị
- Khởi động lại Hass rồi khởi động lại thiết bị
- Khởi động lại cả máy chủ Hass lẫn thiết bị
- Xem lại tính năng lưu dữ liệu của MQTT broker vì một số mqtt broker không lưu lại dữ liệu giữa 2 lần khởi động
- Trong Home Assistant, cấu hình MQTT integration thủ công bằng YAML thay vì sử dụng UI
Cấu hình thiết bị thủ công
Rất nhiều dạng thiết bị (domain) có thể được cấu hình MQTT thủ công trong Home Assistant như switch, light, sensor, binary_sensor, cover, HVACs, fan v.v..
Cấu hình đơn giản hay phức tạp tuỳ vào loại thiết bị và các chức năng mà nó hỗ trợ hay bạn muốn tích hợp vào Hass nhưng nguyên lý chung, cấu hình thường bao gồm:
-
state_topic:
topic mà thiết bị sẽ publish trạng thái của nó vào đó, Hass sẽ nhận dạng trạng thái này bằng cách subcribe vào cùng topic command_topic:
topic thiết bị subscribe vào để nhận lệnh, Hass sẽ gửi các lệnh vào topic này để thiết bị nhận đượcavailability_topic:
topic để nhận biết thiết bị có khả dụng (kết nối vào MQTT) hay khôngpayload_on:
,payload_off:
,payload_zzz:
v.v.. cấu hình để Hass nhận ra nội dung thông điệp tương ứng với trạng thái hay lệnh điều khiển
Bạn có thể tìm tất cả bài viết liên quan đến MQTT, trong đó có cả các bài hướng dẫn thiết lập MQTT device thủ công tại đây: Thẻ MQTT.
Giải quyết một số vấn đề với MQTT trên Home Assistant
Zigbee2MQTT
Các thiết bị Zigbee tích hợp vào Home Assistant qua Zigbee2mqtt có thể sẽ gặp lỗi không hiển thị trạng thái sau khi khởi động lại Hass. Thường thấy các thiết bị/entity này sẽ có trạng thái là unknown – không xác định hoặc unavailable – không khả dụng.
Để trả lại trạng thái bình thường, bạn sẽ phải chờ cho đến thời điểm thiết bị cập nhật trạng thái theo định kỳ (với cảm biến) hoặc điều khiển thiết bị (như bật/tắt công tắc Zigbee) hoặc khởi động lại thiết bị.
Điều này có thể khắc phục bằng cách cấu hình integration MQTT của Hass tự publish các message birth và lwt (will) sau khi Hass kết nối thành công vào MQTT broker như sau:
mqtt: discovery: true broker: core-mosquitto username: hass password: my93428899s birth_message: topic: 'hass/status' payload: 'online' will_message: topic: 'hass/status' payload: 'offline'
Các cấu hình tương đương như ở bước “cấu hình integration MQTT trong Hass” ngoại trừ một số bổ sung:
birth_message:
vàwill_message:
cấu hình topic và nội dung thông điệp – payload sẽ gửi đi.
Bạn có thể tìm hiểu thêm về birth_message và will_message (lwt) trong bài về Giao thức MQTT.
Lưu ý: Từ phiên bản Home Assistant 0.113, bạn không cần cấu hình thủ công bằng YAML mà có thể cấu hình qua giao diện khi lần đầu thêm MQTT Integration vào Hass (xem ở trên, phần Update trong mục MQTT Integration trong Hass). Nếu đã thêm, bạn có thể sửa lại bằng cách vào mục Cấu hình > Các bộ tích hợp > MQTT > Cấu hình lại.
Cấu hình này sẽ thiết lập cho Home Assistant gửi các gói tin với nội dung quy định trước đến topic hass/status. Topic này được subscribe bởi Zigbee2mqtt và khi nhận được, Zigbee2mqtt sẽ tự động gửi lại trạng thái cuối cùng nó nhận được của các thiết bị Zigbee trong mạng.
Điều này có nhược điểm là nếu cả Zigbee2mqtt cũng bị mất kết nối (như trong trường hợp khởi động lại cả máy chủ Hass) thì trạng thái này của các thiết bị Zigbee có thể không chính xác.
Tasmota
Home Assistant Discovery
Mặc định, Tasmota không hỗ trợ MQTT Discovery cho Home Assistant. Để mở tính năng này, bạn phải truy cập vào giao diện quản lý của Tasmota (trên web), vào mục Console rồi gõ lệnh sau:
SetOption19 1
Hoặc truy cập vào địa chỉ:
http://<ip>/cm?cmnd=SetOption19%201
với <ip> là địa chỉ IP của thiết bị Tasmota
Trạng thái các thiết bị Tasmota sau khi khởi động
Mặc định, trạng thái của các thiết bị chạy Tasmota sẽ được trả về trạng thái trước khi bị mất nguồn/khởi động lại. Ví dụ nếu đèn đang mở và bị mất điện thì sau khi có điện lại, đèn sẽ tự bật sáng như cũ. Tuỳ chọn này được thiết lập với option PowerOnState với 0 – luôn tắt, 1 – luôn mở và 3 – (mặc định) trả lại trạng thái trước, 2 – trả lại trạng thái ngược với trước. Bạn có thể thay đổi tuỳ chọn này bằng Tasmota Console tương tự như trên với lệnh PowerOnSate 0
để cài đặt giá trị 0.
Tuy nhiên khi đã liên kết vào Hass qua MQTT, đôi khi do cấu hình trên Hass mà trạng thái (thật) của thiết bị sẽ không tương ứng với tuỳ chọn trên. Đặc biệt trường hợp này hay xảy ra khi bạn cấu hình các công tắc – switch của thiết bị thủ công qua YAML thay vì sử dụng MQTT Discovery.
Nhầm lẫn hay gặp nhất là tuỳ chọn retain: true
trên cấu hình switch mqtt hoặc cấu hình script/automation gọi dịch vụ mqtt.publish của Home Assistant. Với tuỳ chọn này, lệnh điều khiển switch thiết bị sẽ được lưu lại trên mqtt broker (xem thêm Giao thức MQTT#Retain). Vì vậy sau khi thiết bị Tasmota khởi động xong và kết nối trở lại vào MQTT broker, broker sẽ gửi thông điệp này lần nữa trên chính topic nhận lệnh của Tasmota, sau đó thiết bị sẽ tự động điều khiển cho phù hợp với lệnh nhận được. Như vậy, nếu đây là lệnh Mở, thiết bị Tasmota sẽ tự động Mở lại mỗi khi kết nối lại vào MQTT bất kể các thiết lập khác.
Để khắc phục, bạn cần trước hết xoá bỏ câu lệnh đang lưu trên MQTT, sau đó điều chỉnh lại cấu hình của Hass.
- Để xoá bỏ một thông điệp gắn nhãn Retain, ta cần biết topic của nó. Topic này bạn có thể tìm thấy trong cấu hình của Home Assistant liên quan đến thiết bị, thường bắt đầu bằng
cmnd/<id thiết bị>/#
.
Nếu đây là thiết bị được tự động phát hiện, bạn có thể vào mục Công cụ nhà phát triển > MQTT > Listen to a topic, nhập topichomeassistant/switch/#
rồi ấn Listen để xem các giá trị trong đó, bao gồm cả topic nhận lệnh đã được khai báo.
Sau khi tìm được topic chính xác, ta tiến hành publish một thông điệp trống với tuỳ chọnretain: true
để xoá bỏ giá trị cũ.
Trong cùng mục Công cụ nhà phát triển, chọn mục DỊCH VỤ rồi tìm dịch vụ mqtt.publish. Điền nội dung – service data như sau, vớitopic:
là giá trị topic ra lệnh đã biết rồi gọi dịch vụ này.
topic: cmnd/tasmota_207324/POWER1 payload: '' retain: true
- Sau khi xoá bỏ thành công thông điệp trên MQTT broker, bạn cần điều chỉnh lại cấu hình liên quan trong Home Assistant bằng cách xoá tuỳ chọn
retain:
hoặc điều chỉnh giá trị thành false.
* Tính năng MQTT trong Công cụ nhà phát triển khá hạn chế. Bạn có thể sử dụng một công cụ khác trên máy tính, điện thoại nếu có nhu cầu cấu hình và sửa lỗi MQTT nhiều. Tham khảo ứng dụng nguồn mở miễn phí MQTT Explorer cho MacOS/Windows/Linux hoặc MQTTool trên iOS.