Home Assistant

Home Assistant: hướng dẫn nhanh khắc phục lỗi cập nhật IP Duckdns

DuckDNS

Hai bước ngắn gọn ngăn ngừa và khắc phục lỗi IP DuckDns

Photo: tinklr.net
13 phút để đọc hết nội dung

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:

  1. Theo dõi địa chỉ Wan IP của máy chủ Hass
  2. 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 dnsipscrape để 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.myipsensor.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.

DuckDNS Install

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.

DuckDNS Cron Install

Để 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..).

DuckDNS Url
Lưu lại đoạn đóng khung màu đỏ

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ó serviceshell_command.update_duckdns.

Automation phát hiện và cập nhập IP

Sau khi đã khởi tạo sensorswitch, 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

update Retina 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.

Lên Đầu
  • Đăng ký
Bạn quên mất mật khẩu? Vui lòng nhập tên đăng nhập và địa chỉ email đã đăng ký. Bạn sẽ nhận được liên kết tạo mật khẩu mới qua email (bạn nhớ kiểm tra hộp spam trong trường hợp email đi lạc).