Home Assistant

Home Assistant: cài đặt thông qua Docker

Docker & Hass

Cài mới Home Assistant sử dụng Docker trên Raspian/Armbian/Linux

38 phút để đọc hết nội dung

Đây là phần 2 của bài viết Home Assistant: Cài đặt mới. Trong phần này ta sẽ cài đặt Home Assistant (có Supervisor) trên các hệ điều hành Linux thông dụng như Raspbian, Armbian, Ubuntu v.v.. (cách cài đặt này được gọi là Home Assistant Supervised)

Các yêu cầu cần có

Để làm theo hướng dẫn này, bạn cần:

  • Một máy tính chạy MacOS/Windows/Linux để thao tác cài đặt, điều khiển (có thể là máy tính bạn đang dùng đọc bài này)
  • Kết nối Internet ổn định
  • Bo mạch Raspberry Pi hoặc mạch tương tự, Intel NUC, laptop v.v.. để làm máy chủ Home Assistant
  • Thẻ nhớ MicroSD/USB Drive (hay gọi là USB) dung lượng tối thiểu 16GB khuyến cáo ít nhất 32GB (và bộ chuyển đổi thẻ để sử dụng với đầu đọc thẻ nhớ)
  • Kĩ năng cài và chạy phần mềm trên máy tính của bạn

Bạn cũng có thể cần thêm: cáp ethernet (cáp Lan) nếu muốn kết nối máy chủ Hass vào mạng nội bộ bằng cáp; đầu đọc thẻ nhớ nếu máy tính không có sẵn.

Máy chủ Hass: được hiểu là bao gồm Thiết bị vật lý (vd: Pi), hệ điều hành và Home Assistant Core hay Home Asistant/Hassio chạy trên đó. Trong bài này, máy chủ Hass chạy Home Assistant với đầy đủ tính năng của nó (như Supervisor và Addon)
(có thể bạn muốn xem lại: các khái niệm cơ bản trong Hass)

! Use At Your Own Risk/Lưu ý Trách Nhiệm

I. Mọi thao tác trên thiết bị điện hay thiết bị là nguồn nguy hiểm phải được tiến hành bởi người có chuyên môn và chứng chỉ phù hợp.

II. Bạn phải tuân theo mọi chỉ dẫn an toàn (Safety Instruction/Safety Information) đi kèm với thiết bị.

III. Tất cả nội dung trên trang web này (https://konnected.vn) đến từ KonnectED, KonnectED Team và nhóm tác giả đều được kiểm tra và kiểm nghiệm bởi những người có kiến thức và kinh nghiệm trong lĩnh vực đó, cũng như được áp dụng phổ biến bởi cộng đồng, tuy vậy chúng tôi không thể đảm bảo những chỉ dẫn hay nội dung này hoạt động tốt và an toàn trên tất cả các hệ thống, thiết bị hay tình huống. Vì vậy, tuyên bố này miễn cho KonnectED, KonnectED Team và các tác giả mọi trách nhiệm liên quan đến tai nạn hay sự cố hư hỏng thiết bị, hệ thống khi đọc giả làm theo các hướng dẫn hay nội dung được chia sẻ trên trang web này.
Tất cả các trách nhiệm khác của công ty Konnect ED đối với sản phẩm thương mại hay dịch vụ thương mại không bị miễn trừ bởi tuyên bố này.

Xem thêm Tuyên bố Pháp lý, Công bằng và Minh bạch

! Yêu cầu tối thiểu/khuyến nghị
  • Thẻ nhớ: nếu bạn định dùng Hass lâu dài trên thẻ nhớ/USB, dung lượng khuyến nghị là tối thiểu 32GB và thẻ nên đạt chuẩn A1. Xem thêm: thẻ nhớ nào thích hợp dùng cho Pi/Hass
    Nếu bạn đang sử dụng Raspberry Pi 3B+, thiết bị này có khả năng khởi động trực tiếp từ USB mà không cần thẻ microSD. Các thiết bị Pi khác cần một thẻ microSD để chỉnh sửa cài đặt trước khi khởi động được từ USB, Pi 4 chưa thể khởi động được từ USB đã có thể khởi động được từ USB. Thông tin từ Raspberry Pi (EN).
  • Raspberry Pi: nên là Pi 4B, Pi 3B+ hoặc Pi 3, Pi 2 trở về trước khá chậm để sử dụng Hass. Raspberry Pi 4 với 2GB bộ nhớ RAM là thiết bị lý tưởng để chạy Hass trong phần lớn tình huống.
    Xem thêm về các mẫu Raspberry Pi.
  • Bo mạch khác: các board mạch phát triển/SBC/máy tính nhúng/TV Box khác cũng có thể rất tốt để chạy Hass. Tuy nhiên khả năng vận hành, cộng đồng hỗ trợ và yêu cầu tối thiểu tuỳ thuộc vào từng bo mạch khác nhau. Konnect ED Team sẽ phát triển thêm các nội dung hỗ trợ từng loại cụ thể trong tương lai, tuy nhiên, để được hỗ trợ nhanh và dễ dàng nhất, Raspberry Pi là thiết bị được chúng tôi khuyên dùng nếu bạn mới bắt đầu sử dụng Hass.

Để cài đặt Hass lên Docker, ta cần 4 bước cơ bản như sau:

  1. Tải về file ảnh hệ điều hành – OS và flash lên thiết bị khởi động – boot như thẻ nhớ/USB.
  2. Khởi động và truy cập qua SSH (hoặc sử dụng console/GUI) để điều khiển máy chủ từ xa – remote control.
  3. Cài đặt Docker và một số gói – package hỗ trợ lên máy chủ.
  4. Cài đặt Hass lên máy chủ.
4 bước cài đặt Hass lên Docker
4 bước để cài đặt Hass qua Docker

Cài đặt Hệ điều hành lên thiết bị

Tải về Hệ Điều Hành

Trước hết bạn cần tải về Ảnh đĩa hệ điều hành. Tuỳ vào loại thiết bị đang có, hãy làm theo một trong các bước sau:

  • Nếu thiết bị của bạn là Raspberry Pi, lựa chọn tốt là cài đặt hệ điều hành chính thức do Raspberry Foundation phát hành, gọi là Raspbian tại đây: tải về Raspbian.
    Nếu bạn muốn sử dụng Pi với giao diện đồ hoạ cùng màn hình và bàn phím, chuột cắm trực tiếp vào Pi, hãy chọn phiên bản Buster with Desktop.
    Nếu bạn muốn sử dụng và điều khiển Pi chỉ từ các thiết bị khác (như điện thoại, máy tính) thông qua kết nối mạng (LAN/WiFi), hãy chọn phiên bản Buster Lite. Sau này, bạn cũng có thể cài đặt thêm giao diện người dùng như phiên bản Buster with Desktop mà không cần phải làm lại.
    Khuyến nghị của chúng tôi là hãy tải về phiên bản Buster Lite bằng phương thức tải trực tiếp (ZIP). Torrent là phương thức tải file ngang hàng chia sẻ với những người tải khác, đôi khi cần cài đặt thêm phần mềm (như uTorrent).
  • Nếu bạn đang sử dụng các thiết bị với bộ xử lý sử dụng kiến trúc ARM, khuyến nghị của chúng tôi là hãy tải về hệ điều hành Armbian, tại đây: tải về Armbian. Tìm tên thiết bị của bạn (chọn Nhà sản xuất – maker trước và bắt đầu tìm tên thiết bị) rồi tải về phiên bản hệ điều hành ổn định (Supported) mới nhất (Buster/Bionic). Tuy nhiên một phiên bản cũ hơn như Stretch cũng vẫn hoạt động tốt. Tương tự như Raspbian, tải về một phiên bản Server nếu bạn không dự định dùng thiết bị chủ yếu qua chuột, bàn phím và màn hình kết nối trực tiếp.
    Một số nhà sản xuất và thiết bị phổ biến được hỗ trợ bởi Armbian: Tinker board từ Asus, Orange Pi, Cubietech, BananaPi hay Olimex.
Orange Pi PC 2

Trang tải về file ảnh hệ điều hành Armbian cho Orange Pi PC 2 – một thiết bị khá tốt và rẻ để làm máy chủ Hass

Cài đặt hệ điều hành lên thiết bị

Sau khi tải về hệ điều hành phù hợp, giải nén file tải về nếu là file dạng .zip/.tar/.gz bằng cách mở file này trên MacOS hay bằng ứng dụng miễn phí 7-Zip trên Windows hay bằng lệnh gunzip filename trên Linux. Sau khi giải nén, với hầu hết trường hợp, bạn nhận được file ảnh chứa hệ điều hành với phần mở rộng là .img. Dung lượng thông thường từ 1 đến 2GB.

Tiếp theo, tải về ứng dụng balenaEtcher để ghi file ảnh này lên thẻ nhớ hay bộ nhớ USB bạn dự định dùng để cài đặt hệ điều hành lên đó. Cắm thẻ nhớ/USB vào máy tính, cài đặt và chạy ứng dụng Etcher, trên giao diện ứng dụng, chọn file ảnh đã tải về và giải nén ở trên. Kiểm tra lần nữa tên và dung lượng của thẻ nhớ được nhận diện tự động bởi Etcher để chắc chắn là không nhầm thẻ nhớ rồi nhấn nút Flash để bắt đầu ghi thẻ. Có thể bạn cần nhập mật khẩu quản trị máy tính để bắt đầu ghi thẻ.

Xem lại: tải và dùng Etcher

Sau khi ghi file hệ điều hành lên thẻ thành công, tháo thẻ nhớ/USB khỏi máy tính, tắt và ngắt nguồn thiết bị (Pi) của bạn rồi lắp đặt thẻ nhớ/USB này vào thiết bị sau đó nối nguồn điện và khởi động thiết bị. Nếu thiết bị khởi động thành công (xem hướng dẫn của nhà sản xuất để biết chi tiết), xin chúc mừng, bạn đã hoàn tất bước đầu: Cài đặt hệ điều hành lên thiết bị.

Từ lúc này trở đi, chúng ta sẽ gọi thiết bị với hệ điều hành này bằng máy chủ.

Lưu ý

Nếu đây là lần đầu tiên bạn khởi động thiết bị sau khi ghi hệ điều hành vào thẻ, hãy để thiết bị khởi động xong và chạy một lúc (khoảng 10p) trước khi tắt nguồn hay khởi động lại thiết bị. Ở lần khởi động đầu tiên, các hệ điều hành mới cần thực hiện một số thao tác cấu hình và cài đặt chuẩn bị trước, như mở rộng hệ thống file, cấu hình các gói cơ bản. Ngắt nguồn giữa quá trình này có thể gây ra lỗi, khi đó bạn phải ghi – flash lại thẻ.

Kết nối mạng và cài đặt cơ bản

Kết nối máy chủ vào mạng

Sau khi máy chủ của bạn khởi động thành công, kết nối máy chủ của bạn vào mạng nội bộ bằng cáp mạng (Lan cable) hoặc WiFi. Thông thường, kết nối bằng cáp không đòi hỏi cấu hình trước cũng như rất ổn định và ít bị lỗi do cấu hình sai hay do lỗi thiết bị. Tuy nhiên, nếu bạn không thể kết nối vào mạng bằng cáp, xem phần kết nối máy chủ vào mạng WiFi dưới đây, hướng dẫn này chỉ áp dụng cho máy chủ dùng Raspberry Pi và chạy hệ điều hành Raspbian. Với Armbian, bạn cần thao tác trên chính hệ điều hành này qua kết nối ssh (đòi hỏi có kết nối đến mạng bằng cáp trước) hoặc qua giao diện điều khiển – console (thông thường bằng cách kết nối máy chủ với màn hình và bàn phím) trước rồi mới khởi tạo được kết nối WiFi.

! Kết nối Raspberry Pi vào mạng WiFi bằng cấu hình trên thẻ nhớ

Cách kết nối Raspberry Pi chạy hệ điều hành Raspbian vào mạng WiFi bằng cách chuyển cấu hình từ thẻ nhớ.

  1. Cắm thẻ nhớ của bạn vào máy tính qua đầu đọc thẻ và chờ máy tính nhận dạng thẻ. Có thể sẽ có thông báo yêu cầu định dạng – format (Windows) hoặc khởi tạo – intitilize (MacOS) thẻ, bạn bỏ qua yêu cầu này. Máy tính chạy Linux nhận đầy đủ nội dung của thẻ nhớ.
  2. Nếu thẻ đang dùng để khởi động Pi, bạn sẽ truy cập được một phần của thẻ (phân vùng đầu tiên) với tên ổ đĩa là boot. Truy cập vào ổ đĩa này và tạo một file mới có tên wpa_supplicant.conf với nội dung như sau, nhớ thay NETWORK_NAME và NETWORK_KEY bằng tên và mật khẩu mạng WiFi của bạn.
    Bạn cũng có thể cần đổi cài đặt country cho đúng với thiết lập WiFi trên bộ phát WiFi của mình (AP/Router). Thông thường sẽ là VN hoặc US. Đặc biệt rất quan trọng với WiFi chuẩn ac trên băng tần 5GHz.
country=VN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="NETWORK-NAME"
    psk="NETWORK-PASSWORD"
}

Để tạo file wpa_supplicant.conf:
+ Trên Mac, mở ứng dụng Terminal, và vào dòng lệnh sau: nano /Volumes/boot/wpa_supplicant.conf rồi ấn Enter để mở ra cửa sổ soạn thảo nội dung cho file. Copy và paste nội dung ở trên, sửa lại cho đúng với mạng của bạn rồi ấn đồng thời Ctrl-X, nhấn Y rồi Enter.
+ Trên Windows, mở ứng dụng Notepad, copy và paste nội dung ở trên, sửa lại cho đúng với mạng của bạn rồi ấn File, Save As. Chuyển đến ổ đĩa boot, gõ vào tên đầy đủ wpa_supplicant.conf rồi chọn All files ở ô Save as type. Ấn Enter để lưu lại file.

! Armbian: cấu hình mạng WiFi bằng armbian-config

armbian-config là một tiện ích để tinh chỉnh một số cài đặt cho hệ điều hành Armbian. Bạn truy cập tiện ích này bằng lệnh sudo armbian-config qua SSH hoặc console.

Để cấu hình WiFi, bạn chọn mục Network rồi WiFi, sau đó nhập tên kết nối (mặc định wlan0), tên mạng WiFi và mật khẩu WiFi rồi ấn OK.

Để cấu hình IP tĩnh, bạn quay lại giao diện ban đầu, chọn mục Network, IP rồi chọn kết nối cần thay đổi (như wlan0) và nhập IP tĩnh rồi ấn OK. Các mục khác để nguyên.

Cài đặt cơ bản cho hệ điều hành

Lúc này, máy chủ của bạn đã kết nối thành công vào mạng nội bộ. Tiếp theo, để cấu hình và cài đặt máy chủ, ta cần kết nối vào máy chủ thông qua SSH (một giao thức kết nối mạng mã hoá cho phép thực hiện một cách an toàn các dịch vụ mạng trên một hạ tầng không an toàn, xem thêm) hoặc dùng giao diện dòng lệnh Console bằng cách kết nối bàn phím, màn hình vào máy chủ. Để thực hiện điều này bạn cần đảm bảo máy tính của bạn đang được kết nối vào cùng một mạng nội bộ với máy chủ, dù qua 2 phương thức kết nối khác nhau (vd, máy tính kết nối vào mạng qua WiFi trong khi máy chủ kết nối sử dụng cáp), và:

SSH
  1. Mở/enable dịch vụ SSH trên máy chủ. Hệ điều hành Armbian mở dịch vụ này sẵn trong khi Raspbian đòi hỏi bạn phải mở thủ công bằng cách tạo một file với tên ssh (không có phần mở rộng) trên phân vùng boot của thẻ. May mắn là bạn chỉ cần làm điều này một lần mà không cần lặp lại sau mỗi lần khởi động lại.
    Để làm điều này, tắt Pi và tháo thẻ nhớ ra khỏi Pi, cắm thẻ nhớ vào máy tính của bạn, chờ máy tính nhận thẻ (từ chối mọi yêu cầu định dạng – format hay khởi tạo – initilize) của máy tính. Tìm ổ đĩa có tên boot rồi tạo file trống có tên ssh trên ổ đĩa này bằng cách:
    + Trên Mac, mở ứng dụng Terminal rồi nhập lệnh: touch /Volumes/boot/ssh
    + Trên Windows, mở ứng dụng cmd (Start > cmd) rồi nhập lệnh: type NUL >> E:\ssh với E: là ổ đĩa boot trên thẻ nhớ.
  2. Tải về ứng dụng SSH client trên máy tính. Trên Ubuntu và Mac, bạn có thể sử dụng ứng dụng Terminal có sẵn. Với Windows, Putty là ứng dụng phổ biến cho mục đích này. Xem thêm, kết nối đến máy chủ SSH từ Windows/Mac/Linux (Ubuntu).

Cài đặt Docker

Cập nhật và cài đặt package cần thiết

Trước khi cài đặt Docker, bạn nên làm một số bước cơ bản sau đây, thực hiện bằng cách chạy lệnh qua SSH. Ở lần đầu thực thi lệnh với chương trình sudo, có thể bạn phải nhập lại mật khẩu tài khoản hiện tại.

Cập nhật hệ điều hành

Cập nhật Hệ điều hành (Raspbian/Armbian)

sudo apt-get update && sudo apt-get upgrade -y

Đổi mật khẩu tài khoản

Sau đó bạn NÊN thay đổi mật khẩu mặc định cho tài khoản hiện tại (Pi/root). Với Armbian, có thể bạn sẽ bị bắt buộc phải thay đổi mật khẩu cho tài khoản root ngay ở lần đăng nhập đầu tiên, nếu bạn đã thực hiện, bỏ qua bước này.

sudo passwd pi

Với pi là tên người dùng bạn muốn thay đổi mật khẩu

Hãy chọn một mật khẩu tương đối an toàn và đừng quên nó. Bạn sẽ phải nhập mật khẩu một lần, ấn Enter rồi nhập lại lần nữa. Trong quá trình nhập mật khẩu, sẽ không có gì hiển thị trên màn hình, bạn cứ tiếp tục nhập bình thường.

Cài đặt package cần thiết

Cài đặt các gói cơ bản:

sudo apt-get install -y apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common \
    avahi-daemon \
    network-manager \
    apparmor-utils \
    dbus \
    jq

Và các gói tuỳ chọn nếu bạn muốn: (update 21/06/2020) (update gray icon Từ 20/09/2020, các gói network-managerapparmor-utils là yêu cầu bắt buộc khi sử dụng script cài đặt Hass đầy đủ, do vậy đã được gộp lên trên)

Trong đó,

  1. network-manager là một chương trình quản lý và hỗ trợ kết nối mạng hiện đại trên Linux, hỗ trợ cả mạng có dây và không dây. network-manager hỗ trợ khả năng chọn mạng ưu tiên, tự chuyển giữa các kết nối khi kết nối hiện tại bị mất v.v.. Tuy vậy, nếu cài đặt và sử dụng network-manager, các hướng dẫn phổ biến đối với cấu hình mạng trên Linux sẽ không còn dùng được nữa (ví dụ như hướng dẫn cố định IP sử dụng network-script sẽ không còn sử dụng được).
    Bạn sẽ phải thực hiện theo hướng dẫn tại ArchWiki để cấu hình network-manager.
  2. apparmor-utils là các tiện ích hỗ trợ cho ứng dụng AppArmor trên Linux. AppArmor là tiện ích hỗ trợ giúp bảo vệ hệ điều hành cũng như các ứng dụng khác khỏi nguy cơ bị tấn công thông qua phân quyền truy cập.
! Lỗi máy chủ tự thay đổi địa chỉ MAC sau khi cài đặt network-manager

Trên một số hệ điều hành, ví dụ Raspbian, sau khi cài đặt network-manager, bạn sẽ gặp tình trạng máy chủ thay đổi địa chỉ MAC ngẫu nhiên sau mỗi lần khởi động, do vậy không thể cố định IP từ Router (sử dụng DHCP Reservation). Để dừng việc này, có thể thao tác theo các bước sau:

  • Sử dụng lệnh sudo nano /etc/NetworkManager/conf.d/100-disable-wifi-mac-randomization.conf để tạo và soạn file mới có tên như trong lệnh
  • Copy và paste nội dung bên dưới vào file trống vừa tạo:
[connection]
wifi.mac-address-randomization=1
 
[device]
wifi.scan-rand-mac-address=no
  • Lưu lại file này bằng cách ấn Ctrl-X rồi yEnter để lưu.

Cài đặt Docker

Tải về và chạy script cài đặt Docker:

curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh ./get-docker.sh && rm get-docker.sh

Đây là script do Docker cung cấp để tự động chuẩn bị, tải về và cài đặt phiên bản phù hợp. Sau khi hoàn tất, bạn có thể dùng lệnh docker -v để xem phiên bản đã được cài đặt.

update Retina Cập nhật ngày 14/08/2020
Sửa lỗi khi thực hiện lệnh trên

Nếu bạn gặp lỗi
curl: (6) Could not resolve host: download.docker.com
gpg: no valid OpenPGP data found.

Hãy chạy 2 lệnh bên dưới trước, sau đó thực hiện lại lệnh trên

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

sudo apt-key fingerprint 0EBFCD88

Thay debian (dùng cho Raspbian/Armbian) bằng ubuntu nếu bạn đang cài đặt trên Ubuntu.

Hướng dẫn cài đặt chính thức từ Docker, phòng trường hợp bạn không thành công với câu lệnh trên (do khác phiên bản Hệ điều hành).

Phiên bản mới nhất 19.03.8 trên Raspbian Buster.

Tiếp theo, để tiện quản lý Docker từ tài khoản người dùng hiện tại, ta thêm người dùng này vào user group Docker bằng lệnh sau, bạn thay pi bằng tên người dùng hiện tại. Lần nữa, lưu ý bạn NÊN thay đổi mật khẩu tài khoản hiện tại (ở bước trên).

sudo usermod -aG docker pi

Cài đặt Home Assistant (Supervised/Hassio)

Tải về script hỗ trợ cài đặt

Tải về script cài đặt từ github của Home Assistant:

curl -sL https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh -o hass_installer.sh
update Retina10/05/2020

Tạm thời, do vẫn chưa rõ ràng trong việc ngừng hay tiếp tục hỗ trợ Home Assistant Supervised trên các hệ thống Linux thông thường như Armbian, Raspbian, Ubuntu v.v.. (bạn xem chi tiết về việc này tại đây) khi chạy script trên bạn sẽ được cảnh báo về việc ngừng hỗ trợ và được yêu cầu nhập “not supported” (không có dấu “) để đồng ý tiếp tục cài đặt.
Nếu bạn không cài đặt được theo cách này, hãy sử dụng câu lệnh bên dưới, được sửa đổi tạm thời bởi konnectED.vn, loại bỏ phần xác nhận tiếp tục cài đặt. Các tính năng khác không ảnh hưởng.

curl -sL https://raw.githubusercontent.com/konnectedvn/hass-config/master/hassio_installer.sh/hassio_installer.sh -o hass_installer.sh

14/08/2020 Hoặc sử dụng script bên dưới (từ Home Assistant Community):

curl -sL "https://raw.githubusercontent.com/Kanga-Who/home-assistant/master/supervised-installer.sh" -o hass_installer.sh
! Nội dung của script từ Home Assistant (01/10/2020)
#!/usr/bin/env bash
set -e

declare -a MISSING_PACAKGES

function info { echo -e "\e[32m[info] $*\e[39m"; }
function warn  { echo -e "\e[33m[warn] $*\e[39m"; }
function error { echo -e "\e[31m[error] $*\e[39m"; exit 1; }

warn ""
warn "If you want more control over your own system, run"
warn "Home Assistant as a VM or run Home Assistant Core"
warn "via a Docker container."
warn ""
warn "If you want to abort, hit ctrl+c within 10 seconds..."
warn ""

sleep 10

ARCH=$(uname -m)

IP_ADDRESS=$(hostname -I | awk '{ print $1 }')

BINARY_DOCKER=/usr/bin/docker

DOCKER_REPO=homeassistant

SERVICE_DOCKER="docker.service"
SERVICE_NM="NetworkManager.service"

FILE_DOCKER_CONF="/etc/docker/daemon.json"
FILE_NM_CONF="/etc/NetworkManager/NetworkManager.conf"
FILE_NM_CONNECTION="/etc/NetworkManager/system-connections/default"

URL_RAW_BASE="https://raw.githubusercontent.com/home-assistant/supervised-installer/master/files"
URL_VERSION="https://version.home-assistant.io/stable.json"
URL_DOCKER_DAEMON="${URL_RAW_BASE}/docker_daemon.json"
URL_NM_CONF="${URL_RAW_BASE}/NetworkManager.conf"
URL_NM_CONNECTION="${URL_RAW_BASE}/system-connection-default"
URL_HA="${URL_RAW_BASE}/ha"
URL_BIN_HASSIO="${URL_RAW_BASE}/hassio-supervisor"
URL_BIN_APPARMOR="${URL_RAW_BASE}/hassio-apparmor"
URL_SERVICE_HASSIO="${URL_RAW_BASE}/hassio-supervisor.service"
URL_SERVICE_APPARMOR="${URL_RAW_BASE}/hassio-apparmor.service"
URL_APPARMOR_PROFILE="https://version.home-assistant.io/apparmor.txt"

# Check env
command -v systemctl > /dev/null 2>&1 || MISSING_PACAKGES+=("systemd")
command -v nmcli > /dev/null 2>&1 || MISSING_PACAKGES+=("NetworkManager")
command -v apparmor_parser > /dev/null 2>&1 || MISSING_PACAKGES+=("AppArmor")
command -v docker > /dev/null 2>&1 || MISSING_PACAKGES+=("docker")
command -v jq > /dev/null 2>&1 || MISSING_PACAKGES+=("jq")
command -v curl > /dev/null 2>&1 || MISSING_PACAKGES+=("curl")
command -v avahi-daemon > /dev/null 2>&1 || MISSING_PACAKGES+=("avahi")
command -v dbus-daemon > /dev/null 2>&1 || MISSING_PACAKGES+=("dbus")


if [ ! -z "${MISSING_PACAKGES}" ]; then
    warn "The folowing is missing on the host and needs "
    warn "to be installed and configured before running this script again"
    error "missing: ${MISSING_PACAKGES[@]}"
fi

# Check if Modem Manager is enabled
if systemctl list-unit-files ModemManager.service | grep enabled > /dev/null 2>&1; then
    warn "ModemManager service is enabled. This might cause issue when using serial devices."
fi

# Detect wrong docker logger config
if [ ! -f "$FILE_DOCKER_CONF" ]; then
  # Write default configuration
  info "Creating default docker deamon configuration $FILE_DOCKER_CONF"
  curl -sL ${URL_DOCKER_DAEMON} > "${FILE_DOCKER_CONF}"

  # Restart Docker service
  info "Restarting docker service"
  systemctl restart "$SERVICE_DOCKER"
else
  STORAGE_DRIVER=$(docker info -f "{{json .}}" | jq -r -e .Driver)
  LOGGING_DRIVER=$(docker info -f "{{json .}}" | jq -r -e .LoggingDriver)
  if [[ "$STORAGE_DRIVER" != "overlay2" ]]; then 
    warn "Docker is using $STORAGE_DRIVER and not 'overlay2' as the storage driver, this is not supported."
  fi
  if [[ "$LOGGING_DRIVER"  != "journald" ]]; then 
    warn "Docker is using $LOGGING_DRIVER and not 'journald' as the logging driver, this is not supported."
  fi
fi

# Check dmesg access
if [[ "$(sysctl --values kernel.dmesg_restrict)" != "0" ]]; then
    info "Fix kernel dmesg restriction"
    echo 0 > /proc/sys/kernel/dmesg_restrict
    echo "kernel.dmesg_restrict=0" >> /etc/sysctl.conf
fi

# Create config for NetworkManager
info "Creating NetworkManager configuration"
rm -f /etc/network/interfaces
curl -sL "${URL_NM_CONF}" > "${FILE_NM_CONF}"
if [ ! -f "$FILE_NM_CONNECTION" ]; then
    curl -sL "${URL_NM_CONNECTION}" > "${FILE_NM_CONNECTION}"
fi
info "Restarting NetworkManager"
systemctl restart "${SERVICE_NM}"

# Parse command line parameters
while [[ $# -gt 0 ]]; do
    arg="$1"

    case $arg in
        -m|--machine)
            MACHINE=$2
            shift
            ;;
        -d|--data-share)
            DATA_SHARE=$2
            shift
            ;;
        -p|--prefix)
            PREFIX=$2
            shift
            ;;
        -s|--sysconfdir)
            SYSCONFDIR=$2
            shift
            ;;
        *)
            error "Unrecognized option $1"
            ;;
    esac
    shift
done

PREFIX=${PREFIX:-/usr}
SYSCONFDIR=${SYSCONFDIR:-/etc}
DATA_SHARE=${DATA_SHARE:-$PREFIX/share/hassio}
CONFIG=$SYSCONFDIR/hassio.json

# Generate hardware options
case $ARCH in
    "i386" | "i686")
        MACHINE=${MACHINE:=qemux86}
        HASSIO_DOCKER="$DOCKER_REPO/i386-hassio-supervisor"
    ;;
    "x86_64")
        MACHINE=${MACHINE:=qemux86-64}
        HASSIO_DOCKER="$DOCKER_REPO/amd64-hassio-supervisor"
    ;;
    "arm" |"armv6l")
        if [ -z $MACHINE ]; then
            error "Please set machine for $ARCH"
        fi
        HASSIO_DOCKER="$DOCKER_REPO/armhf-hassio-supervisor"
    ;;
    "armv7l")
        if [ -z $MACHINE ]; then
            error "Please set machine for $ARCH"
        fi
        HASSIO_DOCKER="$DOCKER_REPO/armv7-hassio-supervisor"
    ;;
    "aarch64")
        if [ -z $MACHINE ]; then
            error "Please set machine for $ARCH"
        fi
        HASSIO_DOCKER="$DOCKER_REPO/aarch64-hassio-supervisor"
    ;;
    *)
        error "$ARCH unknown!"
    ;;
esac

if [[ ! "${MACHINE}" =~ ^(intel-nuc|odroid-c2|odroid-n2|odroid-xu|qemuarm|qemuarm-64|qemux86|qemux86-64|raspberrypi|raspberrypi2|raspberrypi3|raspberrypi4|raspberrypi3-64|raspberrypi4-64|tinker)$ ]]; then
    error "Unknown machine type ${MACHINE}!"
fi

### Main

# Init folders
if [ ! -d "$DATA_SHARE" ]; then
    mkdir -p "$DATA_SHARE"
fi

# Read infos from web
HASSIO_VERSION=$(curl -s $URL_VERSION | jq -e -r '.supervisor')

##
# Write configuration
cat > "$CONFIG" <<- EOF
{
    "supervisor": "${HASSIO_DOCKER}",
    "machine": "${MACHINE}",
    "data": "${DATA_SHARE}"
}
EOF

##
# Pull supervisor image
info "Install supervisor Docker container"
docker pull "$HASSIO_DOCKER:$HASSIO_VERSION" > /dev/null
docker tag "$HASSIO_DOCKER:$HASSIO_VERSION" "$HASSIO_DOCKER:latest" > /dev/null

##
# Install Hass.io Supervisor
info "Install supervisor startup scripts"
curl -sL ${URL_BIN_HASSIO} > "${PREFIX}/sbin/hassio-supervisor"
curl -sL ${URL_SERVICE_HASSIO} > "${SYSCONFDIR}/systemd/system/hassio-supervisor.service"

sed -i "s,%%HASSIO_CONFIG%%,${CONFIG},g" "${PREFIX}"/sbin/hassio-supervisor
sed -i -e "s,%%BINARY_DOCKER%%,${BINARY_DOCKER},g" \
       -e "s,%%SERVICE_DOCKER%%,${SERVICE_DOCKER},g" \
       -e "s,%%BINARY_HASSIO%%,${PREFIX}/sbin/hassio-supervisor,g" \
       "${SYSCONFDIR}/systemd/system/hassio-supervisor.service"

chmod a+x "${PREFIX}/sbin/hassio-supervisor"
systemctl enable hassio-supervisor.service > /dev/null 2>&1;

#
# Install Hass.io AppArmor
info "Install AppArmor scripts"
mkdir -p "${DATA_SHARE}/apparmor"
curl -sL ${URL_BIN_APPARMOR} > "${PREFIX}/sbin/hassio-apparmor"
curl -sL ${URL_SERVICE_APPARMOR} > "${SYSCONFDIR}/systemd/system/hassio-apparmor.service"
curl -sL ${URL_APPARMOR_PROFILE} > "${DATA_SHARE}/apparmor/hassio-supervisor"

sed -i "s,%%HASSIO_CONFIG%%,${CONFIG},g" "${PREFIX}/sbin/hassio-apparmor"
sed -i -e "s,%%SERVICE_DOCKER%%,${SERVICE_DOCKER},g" \
    -e "s,%%HASSIO_APPARMOR_BINARY%%,${PREFIX}/sbin/hassio-apparmor,g" \
    "${SYSCONFDIR}/systemd/system/hassio-apparmor.service"

chmod a+x "${PREFIX}/sbin/hassio-apparmor"
systemctl enable hassio-apparmor.service > /dev/null 2>&1;
systemctl start hassio-apparmor.service


##
# Init system
info "Start Home Assistant Supervised"
systemctl start hassio-supervisor.service

##
# Setup CLI
info "Installing the 'ha' cli"
curl -sL ${URL_HA} > "${PREFIX}/bin/ha"
chmod a+x "${PREFIX}/bin/ha"

info
info "Home Assistant supervised is now installed"
info "First setup will take some time, when it's ready you can reach it here:"
info "http://${IP_ADDRESS}:8123"
info

Chạy script cài đặt

Tiếp theo ta sẽ chạy script này với một số lựa chọn – options quan trọng như sau:

  1. -m raspberrypi4: bắt buộc, bạn thay raspberrypi4 bằng loại máy phù hợp theo danh sách dưới. Với Raspberry Pi 3B+ và Pi 4B thì bạn có thể chọn bản thường hoặc -64 (64bit). Lưu ý rằng hiện tại, với Raspbian, chỉ bản thường – 32bit mới hoạt động.
    – intel-nuc
    – odroid-c2
    – odroid-n2
    – odroid-xu
    – qemuarm (dành cho thiết bị arm 32bit như Orange Pi dùng cpu H3)
    – qemuarm-64 (hầu hết Armbian trên TV box và thiết bị chạy arm 64bit như cpu H5, H6 có thể chạy bản này hoặc bản raspberrypi4-64)
    – qemux86 (linux trên CPU Intel/Amd 32bit)
    – qemux86-64 (linux trên CPU Intel/Amd 64bit)
    – raspberrypi
    – raspberrypi2
    – raspberrypi3
    – raspberrypi4
    – raspberrypi3-64
    – raspberrypi4-64
    – tinker
    Nếu không chắc chắn về loại thiết bị và OS đang chạy, dùng lệnh uname -a để xem thông tin hệ điều hành và phần cứng. Ví dụ kết quả trả về như dưới đây, aarch64 có nghĩa là bạn có thể sử dụng lựa chọn – qemuarm-64.
    Linux opi2konnected 5.3.9-sunxi64 #19.11.3 SMP Mon Nov 18 19:12:54 CET 2019 aarch64 GNU/Linux
  2. -d /home/pi/hassio: tuỳ chọn, chuyển toàn bộ dữ liệu của Home Assistant sẽ cài vào trong thư mục của người dùng pi.
    Mặc định dữ liệu nằm ở /usr/share/hassio.

Giờ ta sẽ chạy script này để cài đặt Home Assistant, bạn nhớ thay các lựa chọn như ở trên.

sudo bash hass_installer.sh -m raspberrypi4
Kết quả của việc chạy script trên, như thế này là thành công

Từ lúc này, tuỳ theo tốc độ internet và tốc độ thiết bị, bạn có thể phải cần chờ từ 5 đến 10 phút trước khi truy cập được vào giao diện web của Home Assistant.

Bạn cũng có thể gộp 2 bước trên thành một câu lệnh duy nhất, nhớ thay các tuỳ chọn vào cuối lệnh:

curl -sL https://raw.githubusercontent.com/konnectedvn/hass-config/master/hassio_installer.sh/hassio_installer.sh | sudo bash -s -- -m raspberrypi4

Một số bước theo dõi và khắc phục khi lỗi

Trong quá trình chờ cài đặt, bạn có thể dùng lệnh docker ps -a như sau để xem tình trạng các container trong Docker:

H1. Đang cài đặt (đang tải về Home Assistant)

Không cài được phần core

Home Assistant Supervised Issue
H2. Chưa cài được phần Core chính

H2. script cài đặt được Supervisor và các thành phần cần thiết nhưng lại không có Home Assistant Core. Với trường hợp này bạn chỉ cần khởi động lại OS – hệ điều hành với lệnh:

sudo reboot now

Sau khi khởi động, quá trình cài đặt sẽ được tiếp tục, kết quả như ảnh bên dưới.

Home Assistant Docker
homeassistant (core) được cài đặt sau khi khởi động lại

Cài hoàn chỉnh nhưng không chạy được

H3. Đã cài nhưng chưa chạy

Lệnh để khởi động lại trong trường hợp ở ảnh H3.:

docker restart homeassistant

Nếu vẫn không được, bạn quay lại bước B4 và xem lại lựa chọn -m. Sau đó thử chạy lại script cài đặt với lựa chọn mới. Ví dụ nếu lệnh sudo bash hass_installer.sh -m raspberrypi4-64 gặp lỗi, hãy thử lại với sudo bash hass_installer.sh -m raspberrypi4, như sau:

sudo systemctl stop hassio-supervisor && docker rm -f homeassistant hassio_supervisor hassio_cli hassio_dns hassio_audio hassio_multicast
sudo bash hass_installer.sh -m raspberrypi4

Lệnh trên sẽ xoá bỏ các container đã tạo từ các bước trên trong Docker rồi tạo lại với cấu hình mới. Các image (ảnh đĩa) đã tạo sẽ vẫn còn trên thẻ nhớ/đĩa. Nếu không sử dụng nữa và muốn tiết kiệm dung lượng bộ nhớ, bạn có thể xoá sạch các image này đi. Chú ý lệnh sau sẽ xoá bỏ tất cả image không hoạt động/vô thừa nhận (không thuộc về một container nào).

docker image prune -a

Về Bài viết

Bài viết chưa đầy đủ hoặc bạn còn có ý kiến khác? Bạn có thắc mắc và cần thêm thông tin. Vui lòng đăng ý kiến vào mục bình luận để tác giả và Team có thêm thông tin cải thiện chất lượng bài viết. Chúng tôi sẽ giải đáp các thắc mắc ngay trong mục bình luận để giúp được nhiều đọc giả với cùng vấn đề hơn hoặc chúng tôi sẽ trả lời trong một bài viết riêng. Trân trọng cảm ơn bạn!

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