『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 26170|回复: 18

快速安装 Hass.io 的新姿势

[复制链接]

8

主题

47

帖子

757

积分

论坛技术达人

积分
757
金钱
705
HASS币
20
发表于 2018-3-16 22:12:53 | 显示全部楼层 |阅读模式
本帖最后由 tomczhen 于 2018-4-5 18:31 编辑

说明

提供一个不使用官方一键安装脚本的部署方法,适用于x86_64 平台、树莓派或可以运行 Docker 的 arm 设备。也可以用于在现有的可运行 Docker 的设备上进行安装,比如 OMV。
缺点是由于没有 generic-hc,所以不能通过 hass.io 面板重启,升级需要手动。


晒一下在 Orange Pi Zero 上跑的 Hass.io。

PS:纯好玩,这玩意内存只有 512MB,性能也很差,发热感人,不推荐,实在想要建议加钱买 Orange Pi Zero Plus H5。

Screenshot_20180316_220853.jpeg

环境依赖

Docker

直接看官方文档:

添加源的步骤时,可以修改成国内镜像地址,以 Ubuntu 为例:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

avahi-daemon & dbus-daemon

不同发行版的包名可能略有差别,不行就百度解决吧。

镜像加速

Docker 中国官方镜像加速

$ sudo nano /etc/docker/daemon.json

添加以下内容:

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

然后重启 Docker 服务:

$ sudo systemctl restart docker

Portainer

可选操作,不需要 Web UI 来管理 Docker 的话,可以跳过。

$ sudo docker volume create portainer_data

下一步需要根据运行环境做修改

  • 树莓派
$ sudo docker run -d --restart unless-stopped -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:linux-arm
  • x86_64 平台
$ sudo docker run -d --restart unless-stopped -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:linux-amd64

然后打开 Web 页面 http://your_device_ip:9000
添加帐号:

Screenshot_20180316_195934.jpeg

选择 Local 本地模式:

Screenshot_20180316_195959.jpeg

拉取镜像

终端

homeassistant 镜像可用版本可以以下地址查看:

https://hub.docker.com/r/homeassistant/armhf-homeassistant/tags/
https://hub.docker.com/r/homeassistant/qemux86-64-homeassistant/tags/

需要将 homeassistant 的标签替换为对应的版本

  • 树莓派
$ sudo docker pull homeassistant/armhf-hassio-supervisor:latest
$ sudo docker pull homeassistant/armhf-homeassistant:tag
  • x86_64
$ sudo docker pull homeassistant/amd64-hassio-supervisor:latest
$ sudo docker pull homeassistant/qemux86-64-homeassistant:tag

Portainer

进入 Images 管理页面,在 Pull image 中的 Name 中根据你的平台输入镜像名

  • 树莓派

    • homeassistant/armhf-hassio-supervisor:latest
    • homeassistant/armhf-homeassistant:tag
  • x86_64

    • homeassistant/amd64-hassio-supervisor:latest
    • homeassistant/qemux86-64-homeassistant:tag

注意:Portainer 中拉取镜像没有进度条,而 homeassistant 镜像还比较大,慢慢等,实在不行就用终端操作。

运行 Hass.io

首次运行hassio_supervisor容器时会创建一个名为 hassio 的 Docker Network ,但是有可能不会拉起 homeassistant 容器。

执行下面的的命令删除已经存在的 hassio-supervisor 容器。

$ sudo docker stop hassio_supervisor 
$ sudo docker rm hassio_supervisor

然后重新运行hassio_supervisor 容器。

Portainer 则只要在 hassio_supervisor 容器管理页面点击 Restart 按钮即可。

终端

  • 树莓派
$ sudo docker run -d --name hassio_supervisor \
        --restart unless-stopped \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /var/run/dbus:/var/run/dbus \
        -v /usr/share/hassio:/data \
        -e SUPERVISOR_SHARE=/usr/share/hassio \
        -e SUPERVISOR_NAME=hassio_supervisor \
        -e HOMEASSISTANT_REPOSITORY=homeassistant/armhf-homeassistant \
        homeassistant/armhf-hassio-supervisor:latest
  • x86_64
$ sudo docker run -d --name hassio_supervisor \
        --restart unless-stopped \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /var/run/dbus:/var/run/dbus \
        -v /usr/share/hassio:/data \
        -e SUPERVISOR_SHARE=/usr/share/hassio \
        -e SUPERVISOR_NAME=hassio_supervisor \
        -e HOMEASSISTANT_REPOSITORY=homeassistant/qemux86-64-homeassistant \
        homeassistant/amd64-hassio-supervisor:latest

Portainer

Containers 管理页面,点击 Add Container,进入创建容器页面。

第一个 Name 是容器名, 填写 hassio_supervisor

Image configuration 下的 Name 是指的镜像名,需要根据平台输入

  • 树莓派

    • homeassistant/armhf-hassio-supervisor:latest
  • x86_64

    • homeassistant/amd64-hassio-supervisor:latest

Advanced container settings 中配置运行参数

  1. 挂载参数,类型选择 bind 然后根据命令行中的 -v 参数内容填写,如图所示:
    Screenshot_20180316_203402.jpeg

  2. 环境变量,根据命令行中的 -e 参数填写,如图:
    Screenshot_20180316_203547.jpeg
    注意:HOMEASSISTANT_REPOSITORY 需要根据不同平台来决定值

  3. 重启策略:
    Screenshot_20180316_203616.jpeg
    Always 或者 Unless stopped 都行。

升级

这里手动 hassio-supervisor 升级操作会造成 homeassistant 无法访问 hassio-supervisor  提供的 API,会出现 Web 页面菜单没有 Hass.io 的情况。

首先需要等待hassio-supervisor 自己加入 hassio 的 Docker Network,然后重启 homeassistant 容器基本都能解决。

实际测试的结果,hass-supervisor 升级需要手动重建容器,homeassistant 升级正常,如果 supervisor 无法拉起 homeassistant 容器,可以通过重启 docker 服务,或者干脆直接重启系统解决。

终端

重新执行获取最新的 hassio-supervisor 镜像,停止并删除旧 hassio_supervisor 容器,然后重新运行 hassio_supervisor

Portainer

操作参考命令行的步骤。

问题

最大的问题就是 hassio_supervisor 拉不起来 homeassistant,由于原因比较复杂(其实是没完全弄明白),只讲一下无脑处理方案。

  • 一定要保证 avahi 和 dbus 安装成功

这个两个网络服务很重要,没有的话肯定会有问题的。

  • 查看 hassio_supervisor 容器日志
$ sudo docker logs -f hassio_supervisor

启动时有个拉取官方插件仓库的动作,这一步可能会卡住,可以选择等待或者重启容器。

$ sudo docker restart hassio_supervisor
  • 删除已经运行的容器,删除 /usr/share/hassio 目录然后重新启动容器

就是实在不行的话就全部删掉重来。

$ sudo docker stop hassio_supervisor homeassistant
$ sudo docker rm hassio_supervisor homeassistant
$ sudo rm -rf /usr/share/hassio

其他

由于近期忙于找工作,有其他问题只会不定期回复。在 Portainer 查看容器日志、进入容器内部终端可以看我以前在张大妈的投稿: 树莓派+Docker—轻松打造自己的智能家居控制中心

如果觉得内容能帮助到你,愿意的话可以通过赞赏码对我赞赏:
mm_reward_qrcode_1521204994813.png



评分

参与人数 3金钱 +31 收起 理由
euking + 3 赞!!感谢分享
neroxps + 10 十分满分
+ 18 谢谢分享!

查看全部评分

回复

使用道具 举报

123

主题

4661

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
16410
金钱
11664
HASS币
45
发表于 2018-3-16 23:11:07 | 显示全部楼层
赞一个!
回复

使用道具 举报

1

主题

80

帖子

449

积分

论坛积极会员

积分
449
金钱
369
HASS币
0
发表于 2018-3-17 00:10:14 | 显示全部楼层
排版感人!
回复

使用道具 举报

0

主题

143

帖子

4351

积分

论坛元老

Rank: 8Rank: 8

积分
4351
金钱
4208
HASS币
0
发表于 2018-3-17 01:36:40 | 显示全部楼层
写得很详细,赞
回复

使用道具 举报

1

主题

26

帖子

123

积分

论坛分享达人

积分
123
金钱
97
HASS币
0
发表于 2018-3-17 08:27:03 | 显示全部楼层
本帖最后由 mwh1987 于 2018-3-17 08:28 编辑

我昨天写的帖子,希望对您有用: 树莓派上部署HASS.IO详解及解决左侧Hass.io面板无法打开的问题
最后启动home-assistant的命令是这样的:
docker run -d --name="home-assistant" --restart=always  --net=host -e HASSIO=172.30.32.2 -v /home/pi/hass/config:/config -v /etc/localtime:/etc/localtime:ro homeassistant/armhf-homeassistant:latest
注意参数 : -e HASSIO=172.30.32.2 就是告诉homeassistant HASSIO 的正确地址,否则homeassistant无法使用 HASSIO 来管理,就会出现左侧Hass.io面板无法打开的问题。

回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2018-3-17 08:51:08 | 显示全部楼层

启动时有个拉取官方插件仓库的动作,这一步可能会卡住,可以选择等待或者重启容器。

其实这里不是卡住,是慢,即使是换了docker 源也十分慢(无法理解hassio为啥那么慢)

昨天在群里我跟 iLee 排查了下,有时候会发现 hassio 的容器 dns 无法解释,他进入 hassio 容器更换 dns 就好了。最终重启操作系统解决。

但如果会 hassio_supervisor 日志里面显示 Pull homessistant 的话,那么基本上不会有问题,就是等就是了,我的X86部署,这个过程也要等10分钟左右(换了docker cn源的情况下)。

Nero
回复

使用道具 举报

8

主题

47

帖子

757

积分

论坛技术达人

积分
757
金钱
705
HASS币
20
 楼主| 发表于 2018-3-17 09:31:17 | 显示全部楼层
本帖最后由 tomczhen 于 2018-3-17 09:47 编辑
ret = self._docker.run(
            self.image,
            name=self.name,
            hostname=self.name,
            detach=True,
            privileged=True,
            init=True,
            devices=self.devices,
            network_mode='host',
            environment={
                'HASSIO': self._docker.network.supervisor,
                ENV_TIME: self._config.timezone,
                ENV_TOKEN: self._homeassistant.uuid,
            },
            volumes={
                str(self._config.path_extern_config):
                    {'bind': '/config', 'mode': 'rw'},
                str(self._config.path_extern_ssl):
                    {'bind': '/ssl', 'mode': 'ro'},
                str(self._config.path_extern_share):
                    {'bind': '/share', 'mode': 'rw'},
            }
        )

@property
def supervisor(self):
    return DOCKER_NETWORK_MASK[2]

DOCKER_NETWORK_MASK = ip_network('172.30.32.0/23')

从代码看确实是172.30.32.2,我只能说还是让 supervisor 自己拉起来更保险一些,而且那个 token 也还不知道有啥用。


回复

使用道具 举报

8

主题

47

帖子

757

积分

论坛技术达人

积分
757
金钱
705
HASS币
20
 楼主| 发表于 2018-3-17 09:33:15 | 显示全部楼层
本帖最后由 tomczhen 于 2018-3-17 09:54 编辑

看日志是从 Github 获取官方内置仓库的信息,应该是网络问题造成的。
    def _get_network(self):
        try:
            return self.docker.networks.get(DOCKER_NETWORK)
        except docker.errors.NotFound:
            _LOGGER.info("Can't find HassIO network, create new network")

        ipam_pool = docker.types.IPAMPool(
            subnet=str(DOCKER_NETWORK_MASK),
            gateway=str(self.gateway),
            iprange=str(DOCKER_NETWORK_RANGE)
        )

        ipam_config = docker.types.IPAMConfig(pool_configs=[ipam_pool])

        return self.docker.networks.create(
            DOCKER_NETWORK, driver='bridge', ipam=ipam_config,
            enable_ipv6=False, options={
                "com.docker.network.bridge.name": DOCKER_NETWORK,
            })

@property
def gateway(self):
    return DOCKER_NETWORK_MASK[1]

DOCKER_NETWORK = 'hassio'
DOCKER_NETWORK_MASK = ip_network('172.30.32.0/23')
DOCKER_NETWORK_RANGE = ip_network('172.30.33.0/24')

创建网络用到的参数,不过 supervisor 容器会自己加入 hassio,很多应用都是会缓存初次 dns 结果,估计是这里会出现 DNS 问题。


回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2018-3-17 09:55:54 | 显示全部楼层
本帖最后由 neroxps 于 2018-3-17 09:59 编辑
tomczhen 发表于 2018-3-17 09:33
看日志是从 Github 获取官方内置仓库的信息,应该是网络问题造成的。

他开始的时候会从 https://github.com/home-assistant/hassio/blob/dev/version.json 读取版本信息,根据版本信息来拉取 homeassistant 容器的 tage。

如果这里读取不了的话,就会卡主了。所以刷那个 hassio 如果这一步挂了,又没开 ssh 的话,等一万年都进不了 homeassistant。
另外群晖用你的办法做 hassio 的时候不知道为何,hassio 网路建立了,但 route 没有 hassio,导致 homeassistant 无法和 hassio 联系,这也是导致群晖跑 hassio 的时候 homeassistant 里面没有 hassio 的重要原因。

必须重新关掉 hassio 网路接口在启动才行。

if down hassio
if up hassio

Nero
回复

使用道具 举报

8

主题

47

帖子

757

积分

论坛技术达人

积分
757
金钱
705
HASS币
20
 楼主| 发表于 2018-3-17 09:59:42 | 显示全部楼层
本帖最后由 tomczhen 于 2018-3-17 10:08 编辑

原因我还是知道的,只是如果在帖子里写就会很麻烦,而且就算写了,也不能保证看的人会操作处理。

所以有些东西就简化一下,不用讲那么明白,毕竟无脑才更能解决问题。
你的群晖贴我看过了,不过我自己没有群晖,Docker 网络问题 Firewalld + Docker 有时都麻烦得要死。

Docker 网络主要还是靠 iptables 来做的,包括映射和内部路由,出现这种情况的可能我推测是虽然 hassio 创建了,但是相应的网络规则并没有添加或加载成功造成的,应该可以通过查看 iptables 规则确认,不过不知道群晖上具体是怎么回事,也许有用类似 firewalld 的应用管理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 08:31 , Processed in 0.380373 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表