OpenMQTTGateway: Xây dựng smart home hub đa giao thức
Hướng dẫn thiết lập OpenMQTTGateway cho sensor BLE, Wi-Fi, RF và LoRa, sau đó đưa dữ liệu vào MQTT và Home Assistant mà không cần một bridge riêng cho từng thiết bị.
Chia sẻ

Các project smart home thường bắt đầu với một sensor rồi kết thúc bằng cả một ngăn kéo đầy bridge. Một bridge cho nhiệt kế BLE, một cái cho remote 433 MHz, thêm một cái cho cảm biến cửa, rồi mỗi hãng lại có một app riêng.
OpenMQTTGateway thú vị ở chỗ nó cho các thiết bị đó gặp nhau tại một chỗ: MQTT. Mình thích ranh giới này. Gateway xử lý các giao thức radio gần sensor, còn broker và Home Assistant lo việc lưu trữ, automation và giao diện.
Trong bài này, mình đi theo con đường thực tế nhất cho hub đầu tiên: bắt đầu với BLE qua Wi-Fi, kiểm tra một sensor, rồi chỉ thêm radio khác khi phần cứng và nhu cầu thật sự cần.
OpenMQTTGateway thực sự làm gì?
OpenMQTTGateway là firmware cho ESP32 và ESP8266. Tùy build environment và phần cứng, nó có thể chuyển BLE, RF 433/315/868/915 MHz, hồng ngoại và LoRa thành dữ liệu MQTT. Với các board ESP được hỗ trợ, nó cũng có Wi-Fi configuration portal và Home Assistant MQTT discovery.
Điểm quan trọng là một project firmware không có nghĩa là board nào cũng chạy được mọi radio cùng lúc. BLE hợp với ESP32. LoRa cần board đã có transceiver LoRa như một số board Heltec hoặc LilyGO tương thích. RF cần đúng phần receiver/transmitter. Hãy chọn environment theo danh sách board chính thức, đừng flash một build chung rồi hy vọng pinout tự khớp.
Con số “100+ sensor” nên được hiểu là khả năng decoder BLE của OpenMQTTGateway và Theengs Decoder nhận diện nhiều kiểu quảng bá BLE. Nó không có nghĩa là mọi sensor đều giữ kết nối liên tục, hay một gateway có vô hạn airtime, bộ nhớ và vùng phủ sóng.

Giữ phần wireless đơn giản: sensor nói chuyện với gateway, còn broker và controller nằm trên mạng.
Kiến trúc mình sẽ dựng đầu tiên
sensor BLE / RF / LoRa
↓
OpenMQTTGateway trên đúng phần cứng radio
↓ Wi-Fi hoặc Ethernet
MQTT broker (Mosquitto)
↓
Home Assistant / Node-RED / service riêng
Gateway không nên trở thành nơi chứa toàn bộ automation rule. Nhiệm vụ đầu tiên của nó là nhận tín hiệu, decode và publish một message hữu ích. Home Assistant có thể quyết định khi nhiệt độ đổi thì bật quạt, ghi lịch sử hay gửi thông báo.
Cách tách này cũng làm debug dễ hơn. Khi sensor biến mất, mình hỏi ba câu riêng:
- Gateway có được quảng bá trên radio không?
- Gateway có publish MQTT message không?
- Controller có subscribe và tạo entity không?
Chọn phần cứng, đừng overbuild từ đầu
Nếu ưu tiên BLE, một board ESP32 thông thường với nguồn 5 V ổn định là đủ. Mình ưu tiên vị trí đặt và uptime hơn một con chip nhanh hơn. Đặt gateway gần trung tâm vùng sensor, tránh tủ kim loại, nhiễu USB 3 và mặt sau của access point Wi-Fi.
Nếu cần LoRa, mình dùng board đã có sẵn radio LoRa và connector ăng-ten phù hợp. Mình không gắn đại một module SX127x vào ESP32 rồi giả định pinout mặc định sẽ khớp. Băng tần cũng quan trọng: phần cứng 433, 868 và 915 MHz không thể đổi cho nhau chỉ vì hình dáng mô-đun tương tự.
Với nhà lớn, Ethernet có thể đáng cân nhắc vì gateway không phải cạnh tranh airtime Wi-Fi với các thiết bị khác. BLE vẫn diễn ra cục bộ; chỉ message MQTT đã decode mới đi lên mạng.
Quy trình cài đặt
Tài liệu OpenMQTTGateway hiện có flow upload bằng trình duyệt cho nhiều environment. Trình tự tổng quát là:
- Chọn đúng board/environment, ví dụ ESP32 BLE gateway.
- Flash firmware tương ứng.
- Kết nối vào Wi-Fi tạm hoặc mở configuration portal.
- Nhập Wi-Fi nhà và địa chỉ MQTT broker.
- Đặt tên gateway và MQTT base topic ổn định.
- Subscribe broker trước khi mang gateway tới vị trí cuối cùng.
Mình cố tình để bài test đầu tiên thật buồn tẻ: một sensor nhiệt độ BLE, một MQTT client và một topic đã biết. Chỉ thêm sensor sau khi message đầu tiên sống qua reboot và Wi-Fi reconnect.
MQTT topic: dữ liệu phải dễ tìm
OpenMQTTGateway dùng base topic, gateway name và suffix theo giao thức. Một BLE message thường có dạng:
home/OpenMQTTGateway/BTtoMQTT/AA11BB22CC33
Payload là JSON. Tùy nội dung advertisement, device có thể publish các field như id, rssi, brand, model, temperature hoặc humidity.
Khi setup, mình thường subscribe toàn bộ topic:
mosquitto_sub -h 192.168.1.10 -t 'home/OpenMQTTGateway/#' -v
Gateway name và topic prefix có thể đổi, nên topic trên chỉ là pattern, không phải giá trị phải copy nguyên xi. Hãy xem message thật trong broker trước.
Chiều ngược lại là command topic. Ví dụ trong BLE guide chính thức có command:
mosquitto_pub \
-h 192.168.1.10 \
-t 'home/OpenMQTTGateway/commands/MQTTtoBT/config' \
-m '{"enabled":true}'
Điều này hữu ích khi muốn đổi cách BLE hoạt động mà không cần flash lại. Tuy vậy, mình vẫn đặt command topic sau MQTT authentication và ACL; gateway nhận command không nên mở cho mọi thiết bị trong LAN.
Home Assistant discovery: tiện nhưng vẫn phải kiểm tra
Khi bật JSON publishing và Home Assistant discovery, các device được hỗ trợ có thể tự xuất hiện. Đây là bước khởi đầu tốt, nhưng automatic discovery không thay thế việc kiểm tra:
- Entity có unique ID ổn định không?
- Unit và device class có đúng không?
- Sensor publish đủ thường xuyên cho automation không?
- Battery value có thật sự được gửi không?
- Discovery data retain có còn sót sau khi đổi gateway name không?
Mình thường giữ raw MQTT topic ngay cạnh entity trong Home Assistant. Khi entity ngừng cập nhật, mình biết lỗi nằm ở radio reception hay discovery/configuration.
Scale lên hơn 100 sensor BLE
Lỗi scaling đầu tiên là để mọi sensor advertise nhanh nhất có thể. Cách đó tạo thêm radio traffic, message trùng và tải cho broker, nhưng không nhất thiết giúp automation tốt hơn.
Mình sẽ scale theo thứ tự:
- Đặt tên và vị trí rõ ràng cho từng sensor.
- Ghi MAC hoặc stable identifier vào một inventory đơn giản.
- Dùng advertising interval để tiết kiệm pin nếu sensor hỗ trợ.
- Đặt gateway gần trung tâm vùng phủ BLE.
- Bật filter hoặc
onlysensorsnếu không cần mọi beacon xung quanh. - Theo dõi free memory, message rate, RSSI và missed update trong cả ngày.
BLE xuyên tường bê tông không phải là hằng số trên spreadsheet. Gateway thấy 40 sensor trên bàn, có thể vẫn còn mất sensor nằm sau tủ lạnh. Nếu vấn đề là coverage, thêm một gateway nhỏ ở khu vực khác thường sạch hơn việc ép một board phủ cả căn nhà.

Vị trí đặt sensor quan trọng hơn việc thêm plugin; hãy đặt gateway ở nơi đường truyền radio thực sự ổn.
Thêm RF, IR hoặc LoRa về sau
OpenMQTTGateway giúp MQTT side đồng nhất, nhưng radio side vẫn khác nhau:
| Giao thức | Thiết bị thường gặp | Phần cứng hoặc điểm cần chú ý |
|---|---|---|
| BLE | Nhiệt kế, tracker, cảm biến cửa | Vị trí ESP32 và tải scan |
| RF 433 MHz | Remote, weather station, chuông cửa | Receiver/transmitter và decoder đúng giao thức |
| Hồng ngoại | TV hoặc máy lạnh | Hướng IR LED, vị trí receiver, học mã |
| LoRa | Sensor ngoài trời, khoảng cách xa | Băng tần, ăng-ten và đúng board environment |
Mình thêm từng giao thức một và giữ sensor BLE đầu tiên chạy làm baseline. Như vậy, một thử nghiệm RF hoặc LoRa mới không âm thầm làm hỏng cấu hình ban đầu.
Các lỗi thường gặp
Gateway online nhưng không thấy sensor
Kiểm tra sensor trước. Nó có thật sự quảng bá không, và payload có thuộc kiểu OpenMQTTGateway decode được không? Sau đó xem RSSI tại gateway và subscribe home/+/BTtoMQTT/# để không phải đoán gateway name.
MQTT kết nối rồi một lúc sau dừng
Kiểm tra broker log, Wi-Fi signal, nguồn cấp và free memory. Adapter 5 V chập chờn có thể trông giống lỗi software vì board chỉ reset khi radio activity tăng.
Home Assistant tạo entity trùng
Đừng đổi gateway name hoặc base topic trong khi discovery data cũ vẫn được retain. Dọn discovery entry cũ và xác nhận device identifier vẫn ổn định.
LoRa chỉ chạy tốt trên bàn
Kiểm tra biến thể băng tần, connector ăng-ten, hướng ăng-ten và quy định địa phương. Đừng so sánh build 433 MHz với build 915 MHz như thể chúng là cùng một phần cứng.

Power meter và một giao diện MQTT gọn giúp khoanh vùng lỗi gateway chập chờn nhanh hơn.
Cấu hình khởi đầu mình thấy hợp lý
Với một căn hộ nhỏ, mình sẽ bắt đầu bằng:
- Một ESP32 environment cho BLE.
- Một Mosquitto broker trên home server hoặc Raspberry Pi luôn bật.
- Bật Home Assistant MQTT discovery.
- Ba sensor: nhiệt độ, cửa và chuyển động.
- Một MQTT user riêng, chỉ có ACL tới topic gateway cần.
- Một log nhỏ gồm sensor ID, room, battery behavior và last-seen time.
Sau một tuần dữ liệu ổn định, mình mới quyết định có cần LoRa, RF, Ethernet hay gateway thứ hai không. Mục tiêu của OpenMQTTGateway không phải là gom mọi protocol chỉ để cho đủ. Nó tạo ra một đường đi dễ hiểu từ sensor vật lý tới automation.
Kết luận
OpenMQTTGateway phù hợp khi bạn có nhiều sensor khác nhau và muốn MQTT làm ngôn ngữ chung. Một setup đáng tin cậy không chỉ nằm ở việc flash một firmware lớn, mà còn ở việc chọn đúng board, đặt topic rõ, đặt gateway đúng vị trí radio và đo những gì xảy ra sau demo đầu tiên.
Hãy bắt đầu với một sensor BLE, kiểm tra raw MQTT message để Home Assistant discover entity, rồi mới scale. Quy trình đó giúp hub vẫn dễ hiểu ngay cả khi số sensor vượt quá một trăm thiết bị.
Tài liệu tham khảo
Chia sẻ
Tiếp tục khám phá
Đọc tiếp
Bài viết liên quan
Màn hình HMI gắn gần tủ lạnh cho thực đơn và đồ sắp hết hạn
Ghi chú làm một màn hình HMI LCD/TFT gắn cạnh tủ lạnh, dùng Home Assistant để xem thực đơn tuần, đồ sắp hết hạn và cập nhật nhanh danh sách cần mua.
Remote giọng nói tiếng Việt cho Home Assistant chạy nội bộ
Ghi chú làm một remote giọng nói dùng ESP32-S3, ESPHome và Home Assistant Assist local để điều khiển nhà thông minh bằng tiếng Việt mà không phải gửi giọng nói lên cloud.
Thiết bị cảnh báo nhiệt độ tủ lạnh, tủ đông khi mất điện
Ghi chú thiết kế một hộp đo nhiệt độ đặt ngoài tủ lạnh, dùng ESP32, hai đầu dò DS18B20 và Home Assistant để biết sớm khi ngăn đông ấm lên sau mất điện.