Nếu bạn đang truy cập Home Assistant từ bên ngoài sử dụng các dịch vụ DDNS – Dynamic Domain Name System, nhằm cập nhật địa chỉ IP động do nhà cung cấp dịch vụ Internet cấp đến một tên miền, thì chắc hẳn có lúc bạn sẽ gặp phải vấn đề không truy cập được Home Assistant. Một trong các nguyên nhân là địa chỉ Wan IP (địa chỉ IP công khai do nhà cung cấp dịch vụ cấp – trong bài viết này được gọi tắt là IP) không được cập nhật đến domain, do vậy, truy cập Home Assistant của bạn không đến được địa chỉ máy chủ Hass.
Chúng tôi sẽ hướng dẫn cách nhanh nhất để khắc phục lỗi này với các bạn đang sử dụng dịch vụ DDNS miễn phí cung cấp bởi Duckdns.org.
Nguyên nhân gây ra lỗi:
- Địa chỉ IP bị thay đổi trong quá trình Hass đang hoạt động (thường được gọi là “rớt mạng”) nhưng công cụ dùng để cập nhật IP bị lỗi hoặc không nhận ra thay đổi sớm.
- Công cụ cập nhật IP bị lỗi trong quá trình khởi động do không có internet, thường gặp nhất là khi cả máy chủ Hass và Modem/Router cùng bị khởi động lại (mất điện).
Ở đây ta sẽ tạo ra thêm một phương thức nữa để chủ động cập nhật IP này đến DuckDns ngay khi phát hiện ra sự thay đổi. Đây có thể được xem là phương thức chính hoặc dự phòng cho công cụ cập nhật IP bạn đang sử dụng. Chỉ cần thực hiện 2 bước:
- Theo dõi địa chỉ Wan IP của máy chủ Hass
- Tiến hành khởi động lại công cụ cập nhật IP và chủ động cập nhật thủ công
Bạn cũng có thể sử dụng cách này để chạy các automation khác hoặc cập nhật IP cho các dịch vụ DDNS khác ngoài DuckDNS. Chi tiết tuỳ vào dịch vụ.
Về addon DuckDNS và cập nhật cưỡng bức
Mặc định, addon DuckDNS tự phát hiện sự thay đổi IP và chủ động cập nhật. Chu kỳ là 5 phút một lần, bạn có thể thay đổi trong tuỳ chọn seconds: của addon. Vấn đề là addon này thỉnh thoảng bị lỗi hoặc bị dừng nên không thể làm nhiệm vụ của nó.
Do vậy, có thể xem phương thức trong bài này là dự phòng trong tình huống xấu.
Bạn cũng có thể sử dụng một scrape hoặc rest sensor hay một automation để cập nhật “cưỡng bức” địa chỉ IP lên DuckDNS mỗi 60 giây hoặc tuỳ chọn, tuy nhiên, chúng tôi không khuyến khích sử dụng cách này do có thể làm quá tải dịch vụ DuckDNS nếu nhiều người thực hiện.
Theo dõi – track địa chỉ IP
Ta sẽ sử dụng một trong hai hoặc cả hai sensor platform dnsip và scrape để theo dõi IP. Sensor dnsip sử dụng truy vấn đến máy chủ DNS (mặc định là OpenDNS nhưng bạn có thể thay đổi) trong khi scrape sử dụng dịch vụ của checkip.dyndns.org (rất thường được dùng trên các router để nhận biết sự thay đổi WanIP).
Nếu chỉ chọn một trong hai, chúng tôi khuyến cáo bạn nên dùng dnsip.
Cấu hình cả 2 sensor này như bên dưới, bạn có thể dùng mặc định, không cần thay đổi. Thêm chúng vào /config/configuration.yaml hoặc file cấu hình sensor riêng tuỳ bạn.
sensor: - platform: dnsip scan_interval: 60 - platform: scrape name: 'myip_dyndns' resource: http://checkip.dyndns.org select: "body" scan_interval: 60 # - platform: rest # resource: http://ip.jsontest.com # name: External IP # value_template: '{{ value_json.ip }}'
Sau khi thêm cấu hình, bạn khởi động lại Hass để khởi tạo các sensor này.
Trong Hass sẽ xuất hiện thêm 2 sensor mới có entity_id là sensor.myip và sensor.myip_dyndns chứa địa chỉ IP của máy chủ Hass (và có thể nói là địa chỉ IP của nhà bạn). Ta không cần quan tâm đến địa chỉ này mà chỉ cần nhận biết khi nó thay đổi.
Cập nhật IP lên DuckDNS
Một khi phát hiện sự thay đổi IP, ta sẽ thực hiện 2 giải pháp: khởi động lại addon DuckDNS của Hass để “ép” nó cập nhật IP và cập nhật IP thủ công. Nếu bạn không dùng addon DuckDNS, chỉ cần làm bước cập nhật thủ công.
Ta cũng sẽ gửi một thông báo qua Telegram để cập nhật thay đổi cho quản trị viên.
Cập nhật thủ công DuckDNS
DuckDNS cho phép bạn cập nhật IP bằng cách truy cập vào một địa chỉ url – địa chỉ web với token. Mỗi khi bạn truy cập đến địa chỉ hợp lệ, IP nguồn sẽ tự động được ghi nhận.
Để lấy địa chỉ này, bạn hãy truy cập vào Duckdns.org rồi đăng nhập bằng tài khoản đã đăng ký domain đang dùng trên Hass.
Sau khi đăng nhập thành công, bạn chọn menu install hoặc truy cập vào địa chỉ:
https://www.duckdns.org/install.jsp
để lấy token.
Để các lựa chọn mặc định như ảnh rồi chọn domain đang dùng trên Hass ở ô choose domain.
Tiếp theo bạn hãy kéo xuống vào copy đoạn đằng sau url= cho đến hết dấu “, như trong ảnh minh hoạ bên dưới. Bạn cũng có thể dùng cùng URL này để cập nhật IP cho domain DuckDNS đã chọn từ bất cứ thiết bị nào có thể làm HTTPs client (như router, ESP32, ESP8266, TV Box, máy tính v.v..).
Bây giờ ta sẽ cấu hình một switch trong Hass để cập nhật IP thông qua địa chỉ này. Cấu hình mẫu như bên dưới. Bạn thay toàn bộ giá trị tuỳ chọn resource:
bằng url đã copy bên trên.
switch: - platform: rest name: Update DuckDNS resource: "https://www.duckdns.org/update?"
Hoặc bạn cũng có thể tạo một shell_command tương tự, bạn thay duckdns_url bằng địa chỉ url đã lấy bên trên. Sử dụng shell_command sẽ tránh được lỗi trong logs – nhật ký của Hass, tuy nhiên tác dụng không thay đổi.
shell_command: update_duckdns: '/usr/bin/curl -X GET duckdns_url'
Khởi động lại Hass để khởi tạo switch hoặc shell_command đã cấu hình. Switch sẽ có entity_id là switch.update_duckdns và shell_command sẽ có service là shell_command.update_duckdns.
Automation phát hiện và cập nhập IP
Sau khi đã khởi tạo sensor và switch, ta sẽ sử dụng automation bên dưới để phát hiện thay đổi IP và kích hoạt việc khởi động addon DuckDNS cũng như turn_on switch.update_duckdns.
- id: '1589903672729' alias: Hass Update Duckdns Domain description: Cập nhật địa chỉ IP đến Duckdns trigger: - entity_id: sensor.myip platform: state - entity_id: sensor.myip_dyndns platform: state condition: - condition: template value_template: '{{trigger.to_state.state|regex_search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")}}' action: - data: addon: core_duckdns service: hassio.addon_restart - service: shell_command.update_duckdns data: {} # - data: {} # entity_id: switch.update_duckdns # service: switch.turn_on - data: message: 'New IP: {{states(trigger.to_state.state)}}' title: Hass IP Change service: telegram_bot.send_message
Nếu bạn sử dụng các cấu hình như trên mà không thay đổi gì, bạn không cần thay đổi automation trên. Nếu chỉ sử dụng 1 sensor, bạn loại bỏ phần cấu hình của sensor không dùng. Tương tự với các action không dùng đến.
Bạn có thể execute automation trên để xem kết quả.
Về một số lỗi
Sẽ xuất hiện lỗi Can’t turn on Duckdns_url trong Logs – Nhật ký của Hass khi bạn sử dụng switch.update_duckdns, tuy nhiên không ảnh hưởng đến hiệu quả của switch.update_duckdns. Vì ta không thường xuyên phải cập nhật IP nên cũng không quá quan trọng.
Để khắc phục, bạn có thể sử dụng shell_command như trên hoặc command_line switch: ‘/usr/bin/curl -X GET duckdns_url‘.
Automation cũng sẽ bị kích hoạt nếu có lỗi kết nối đến DNS server hoặc checkip.dyndns.org, do vậy bạn có thể nhận được thông báo không cần thiết mặc dù không ảnh hưởng đến tính năng của automation hay IP của tên miền Duckdns. Bạn có thể thêm các condition vào automation trên để hạn chế gửi nhầm thông báo hoặc chuyển sang sử dụng DNS server khác hoặc dịch vụ kiểm tra IP khác.
Chủ động phát hiện sai khác IP
Bổ sung ngày 05/08/2020
Các bước bên trên là đủ và thừa trong hầu hết các tình huống, tuy nhiên nếu muốn “hơn cả chắc chắn”, bạn có thể làm thêm bước này.
Với bước bổ sung này, ta sẽ thực hiện so sánh giữa IP (công khai) hiện tại của máy chủ Hass và IP đang được “gắn” với tên miền. Nếu sai khác, ta sẽ chủ động cập nhật tương tự như bước ngay phía trên.
Để xác định IP đang được trả về gắn với tên miền, ta sử dụng sensor với cùng platform dnsip như trên. Lưu ý đây là sensor bổ sung, không thay thế sensor đã tạo ở trên.
Cấu hình sensor này như sau trong /config/configuration.yaml
sensor: - platform: dnsip name: 'domain ip' hostname: konnected.duckdns.org resolver: 208.67.222.222
Trong đó:
- 3
name:
tên bạn muốn đặt, ở đây ta đặt là ‘domain ip‘, sensor sẽ có entity_id làsensor.domain_ip
- 4
hostname
: tên miền bạn đang sử dụng để truy cập Hass từ bên ngoài - 5
resolver:
chỉ định địa chỉ IP của máy chủ DNS công cộng sẽ được dùng để phân giải tên miền, ở đây là máy chủ OpenDNS (xem thêm: Sử dụng DNS nội bộ cho Hass)
Sau khi khởi động lại để khởi tạo, sensor.domain_ip sẽ tự cập nhật 2 phút mỗi lần với trạng thái là địa chỉ ip đang gắn với tên miền bạn đã cấu hình.
Giờ ta sẽ bổ sung thêm automation tự động cập nhật IP (ngoài automation bên trên) bằng cách so sánh giữa sensor.domain_ip này và sensor.myip đã tạo ở các bước trước.
Cấu hình automation bổ sung như sau:
- id: '15899036727292' alias: Hass Update Duckdns Domain 2 description: Cập nhật địa chỉ IP đến Duckdns khi IP sai khác trigger: - platform: time_pattern minutes: '/5' condition: - condition: template value_template: '{{states(''sensor.myip'') != states(''sensor.domain_ip'')}}' - condition: template value_template: '{{states(''sensor.myip'')|regex_search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")}}' action: - data: addon: core_duckdns service: hassio.addon_restart - service: shell_command.update_duckdns data: {} # - data: {} # entity_id: switch.update_duckdns # service: switch.turn_on - data: message: 'New IP: {{trigger.to_state.state}}' title: Hass IP Change service: telegram_bot.send_message
Chúc bạn thành công và không bao giờ bị mất kết nối từ bên ngoài đến Hass!
Cảm ơn bạn đã xem bài viết này!
konnectED Team.