Chữa bệnh lười tắt đèn ngủ bằng MQTT, Raspberry Pi và ESP32

Tôi thường để đèn đi ngủ vì lúc ngủ rất lười tắt đèn. Vì thế có nhiều đêm ngủ không ngon vì đèn sáng quá. Lựa chọn là vùng dậy khỏi chăn để tắt đèn hoặc là chùm kín mít mặt để không bị sáng nữa. Vì thế với tôi một trong những điều làm tôi rất ngứa ngáy khó chịu là tại sao cái đèn mà mình cũng không nằm trong chăn tắt được. 
Dù rằng ta thích hoa hồng, nhưng kẻ thù lại buộc ta ôm keyboard.
Nhân dịp có bão Cách mạng 4.0 tôi làm một cái dự án Cách mạng 0.4 với nhà mình. Chiếc đèn này, báo cáo, là đã được nối mạng. Bây giờ chỉ cần hỏi nhẹ nhàng bạn Siri là bạn ấy sẵn sàng bật tắt đèn ở đâu trong nhà cũng được.
Vì tôi cũng muốn dùng một công nghệ mở, không phụ thuộc qúa nhiều vào Apple nên tôi dựa tất cả trên nền tảng MQTT (đọc là mosquitto - con muỗi). Đây là nền tảng mở cho các hệ thống IoT và rất gọn nhẹ và được hỗ trợ rộng rãi trên hầu như tất cả các nền tảng nhúng.
Một sơ đồ đơn giản của hệ thống này như sau:
Xin lỗi vì vẽ nguệch ngoạc
Tôi có một chiếc Raspberry Pi 0 Wireless có tên là Pabbie làm một số việc trong căn nhà. Trên chiếc Raspberry Pi này tôi có cài Homebridge là chương trình chạy trên Node JS, nó đóng vai trò là người dẫn đường, và nói chuyện với điện thoại theo giao thức HomeKit của Apple. Có một trình cắm vào (plug-in) rất tốt cho Homebridge là homebridge-mqttthing. Cấu hình homebridge tương đối đơn giản, chỉ phải khai có một bóng đèn theo giao thức mqttthing là được.
Tất cả các thiết bị dùng giao thức MQTT chỉ có thể làm hai việc, một là "nghe" hai là "nói". Bất cứ thiết bị nào cũng có thể "nghe" và "nói" vào bao nhiêu chủ đề tùy thích. 
Ví dụ, để bật bóng đèn, bạn cần có một thiết bị bật chiếc bóng đèn thật (ở thiết lập này là chiếc bo mạch ESP32) "nghe" chủ đề "/phòngngủ/côngtắcđèn." Khi ai đó "nói" vào chủ đề này từ "bật", thì chiếc bo mạch đang nghe sẽ nhận ngay được lệnh này từ server trung gian (gọi là "Broker"). Vấn đề còn lại là ngắt hay cấp điện cho một chân của chiếc ESP32 này để bật đèn.
Điều hay của MQTT là tất cả dựa vào server trung gian (Broker) nên bạn không phải lo firewall mở cổng gì cả. Một khi broker hoạt động trên "đám mây" ví dụ broker miễn phí của Eclipse Foundation mở cổng rồi thì bạn muốn bao nhiêu thiết bị sau bao nhiêu tường lửa kết nối theo giao thức nào đều được (hai giao thức thịnh hành là mqtt và websocket). MQTT có cái lợi là ai nghe cũng được, ai nói cũng được, ở đâu không quan trọng miễn là nói được với broker. Vì thế mà nếu tôi có thiết bị IoT mà tôi không tin tưởng (ví dụ, chương trình chạy trên ESP32 của tôi viết trong 15 phút được chắc bị buffer overflow tùm lum) thì tôi có thể đặt nó trên một subnet biệt lập.
Đại khái để xử lý một tình huống bật đèn chúng ta cần đoạn mã như thế này:
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
{
    esp_mqtt_client_handle_t client = event->client;
    int msg_id;

    switch (event->event_id) {
        // ...
        case MQTT_EVENT_DATA:
            ESP_LOGI(TAG, "MQTT_EVENT_DATA");

            int desired_state = 0;

            if (strncmp(event->topic, "horseradix/bedroom/light/setOn", event->topic_len) == 0) {
                if (strncmp(event->data, "1", 1) == 0) {
                    desired_state = 1;
                }
                gpio_set_level(BLINK_GPIO, desired_state);
            }
            break;
    }
}
MQTT theo tôi là một giao thức rất có triển vọng và rất tuyệt vời, giải quyết được rất nhiều nhức đầu của các thiết bị IoT.
Việc còn lại là ESP32 kết nối vào broker và thực hiện lệnh. Tôi vô cùng ấn tượng với con chip ESP32. ESP32 có hướng dẫn rất tuyệt vời và ví dụ rất rõ ràng để người mới bắt đầu làm. Tôi không thể tưởng tượng công việc lại đơn giản như vậy, chỉ 1h là tôi theo xong được tutorial và bắt tay lập trình được yêu cầu của mình. Người viết thư viện MQTT cho ESP32 là anh Tuấn (tuanpmt), một lập trình viên người Việt có lẽ là đang làm việc cho espressif, và thư viện này chạy rất tốt. Tôi xin ngả mũ bái phục.
Cả hệ thống này an toàn, đơn giản, dễ mở rộng, và có thể sử dụng với các hệ sinh thái khác như của Amazon và Google. Tuy nhiên tôi tương đối hài lòng với thiết lập đơn giản hiện tại của mình.
Và tôi cũng sẽ ngủ ngon hơn mà vẫn được lười. Kế hoạch 5 ngày lần thứ nhất coi như là thành công.
51
1557 lượt xem
51
17
17 bình luận