利用 Home Assistant 搭建智能家居中枢

背景 随着智能家居的日益普及,各大互联网巨头纷纷进场,导致智能家居的平台和品牌越来越多,且各个平台和品牌间的产品无法互通。例如,你无法用米家的智能开关来控制 homekit 的智能灯,除非你的产品支持双平台,但目前同时支持两个以上平台的智能家居少之又少。 Home Assistant (以下简称 HA)很好地解决了智能家居平台不互通的问题,它是一个开源的智能家居集成平台,可将各个常见平台的产品接入,并通过网页、手机app 等多种客户端统一操控,实现真正的「万物互联」。并且最重要的是,这么好用的工具不仅支持 Windows、MacOS、Linux 等多种操作系统,其本身也是开源免费的,并且其极高的扩展性也为爱折腾的数码爱好者提供了全新的研究对象。 通过 Docker 部署 HA 容器 正如前文所述,HA 支持多种操作系统,但如果我们打算将其作为 7x24 小时待机的智能家庭中枢,那么最好的选择就是 Linux 系统,因为它可以运行在诸如树莓派 这类低功耗的设备上,随时准备着为我们提供服务。 提到 Linux,我们就不得不提 Docker,它是一种兼容性极高的容器系统,可以适应几乎所有 Linux 环境,做到即装即用。今天,我们将着重介绍通过 Docker 容器部署 HA 的方法。 我的这篇文章 详细介绍了 Portainer 这个非常好用的 Docker 管理容器,由于每位读者的系统环境不尽相同,因此本博客往后介绍的所有 Docker 容器安装,不再拘泥于群晖、威联通或者 Unraid,而是统一通过 Portainer 进行。 Portainer 本身的安装可以参考上面提到的文章,本文不再赘述。要安装 HA,我们首先需要登录 Portainer 后台,然后进入本地终端界面,也就是 Local,接着点击左侧的 Containers,进入本地容器管理界面。 点击 Add container,创建一个新容器,Name 随便填,Image 写 HA 官方提供的映像索引 homeassistant/home-assistant:latest,Always pull the image 可以打开,这样以后每次修改容器配置,都会从服务器重新拉取最新的映像。 接着点击下方 Advanced container settings 中的 Volumes,进入目录映射选项卡,点击 map additional volume 按钮新增一个目录映射,右侧的映射方式选 bind,container 里的目录只能写 /config,这是 HA 配置文件的所在目录,host 上的目录可以根据自己需要填写。 ...

2022-04-09 · Mason

利用 Portainer 实现 Docker 端 Jellyfin 硬件解码

原理及环境检测 随着版本的不断迭代,Jellyfin 已经逐渐超过 Plex 和自家兄弟 Emby ,成为用户数量最所的个人媒体管理方案,这不仅因为它的所有功能均为免费,更是因为它的源代码完全开源,具有极高的维护与拓展空间。 不论用于运行 Jellyfin 的具体是哪款操作系统,只要该系统是基于 Linux,我们就可以通过 Docker 容器来实现极为简单且方式一致的部署。但相比于原生套件,Docker 有一个显而易见的缺点,即无法直接调用各类系统资源,核显驱动就是其中之一。 要让 Jellyfin 的 Docker 容器实时调用核显驱动(也就是人们常说的开启硬解),要满足两个条件: 拥有支持视频解码的核心显卡,且核心显卡的驱动程序运行正常; 将核显驱动直通给 Docker 容器,并赋予 Docker 容器调用该驱动的权限。 对于系统是否满足上述第一个条件,可以通过以下方式进行检验:首先用 ssh 工具连接到服务器,确保登陆 ssh 的账户拥有系统管理权限,再输入以下命令: ls /dev/dri 如果返回的结果为 card0 renderD128 ,那么恭喜,核显驱动运行正常,硬件系统满足视频解码的基本条件。接下来便是将 renderD128 这个核显驱动直通给 Docker 容器的方法。 为什么必须用 Portainer? 无论是群辉、威联通还是 Unraid ,市场上绝大多数 NAS 系统都提供了图形化的 Docker 容器管理工具。但无论上述哪一个,都不支持核显驱动的直通功能。群辉的 Docker 套件无法编辑容器的系统资源参数,威联通的 Container Station 干脆无法编辑已经创建好的容器。 这里所说的“直通”,其实是将 /dev/dri/renderD128 这个驱动文件映射到 Docker 容器的相同位置。这一点利用命令行可以非常轻松地实现,即在 Jellyfin 容器的拉取命令中加入下列参数: --device=/dev/dri/renderD128 \ 因此,要快速拉取并创建一个开启硬件解码的 Jellyfin 容器,只要在 NAS 的命令行界面输入以下命令即可: sudo docker run -d --name jellyfin \ -v /share/Container/Jellyfin/config:/config \ #冒号左边为存放配置文件的目录 -v /share/Container/Jellyfin/cache:/cache \ #冒号左边为存放媒体缓存的目录 -v /share/Media/:/media \ #冒号左边为存放电影文件的目录 -p 8096:8096 \ #web界面访问端口(http) -p 8920:8920 \ #web界面访问端口(https) --device=/dev/dri/renderD128 \ #映射核显驱动 --restart=always \ #重启策略 jellyfin/jellyfin 但对许多轻度用户来说,命令行不仅不便理解,也断绝了后续对容器进行修改和自定义的空间。因此对于绝大多数日常用户来说,我个人强烈推荐使用 Portainer 。它本身也是一个运行在 Docker 容器里的程序,但它拥有强大的 Docker 管理功能,是目前市面上功能最完善的网页端 Docker 容器管理界面。 ...

2021-09-09 · Mason

利用 Favicon 为 Hugo 静态站点添加图标

我们在使用 Hugo 生成静态站点时,经常会遇到一些虽不致命,但很不爽的小问题,例如没有自定义站点图标的问题。假如我们跟随了所用主题的默认配置,通常情况下生成的站点要么没有图标,要么直接套用主题自带的图标,这显然无法满足我那强烈的 DIY 欲望。 经常访问本博客的读者可能会注意到,我所使用的 Hugo 主题是一个支持自动切换明暗模式的第三方主题——AutoFuji . 今天在阅读这个主题的说明文档时,我发现原来它是支持 Favicon 图标代码的。于是经过一通简单的操作,我的博客终于有了自己的图标。 为 Hugo 站点添加 Favicon 代码的方法非常简单。首先访问这个网站 上传一张图片作为网站图标的母本。其实类似的 Favicon 生成器还有很多,大家可以根据自己的习惯或喜好自由选择,基本功能都是一样的。 图片上传完成后,会自动跳转到参数配置页面。如无特殊需求,保持默认配置即可。点击页面下方的生成按钮生成我们的图标和代码。 生成完成后,点击如图所示按钮下载各类格式的图标包,再将自动生成的 HTML 代码复制到剪贴板。 之后,来到 Hugo 站点的根目录,将刚刚下载的压缩包里的所有文件解压到 /static/ 文件夹下。 用文本编辑器打开 /layouts/partials/favicon.html 文件,清空原有代码,将刚刚复制到代码粘贴进去,保存并退出。 最后,打开 /themes/正在使用的主题名/layouts/partials/head.html 文件(不同主题需要编辑的文件可能不同,例如我所使用的 Fuji 主题就是直接编辑同一目录下的 favicon.html 文件),找到下列代码: <link rel="shortcut icon" href="xxx" /> 将 xxx 替换成 favicon.ico ,保存并退出即可。 此时,我们的 favicon 图标安装工作就宣告完成了。使用 hugo 命令重新生成站点,不出意外的话,就能看到我们刚才上传的站点图标了。

2021-05-27 · Mason

桥接模式下 Openwrt 软路由直接访问光猫后台

光猫开启桥接模式后,软路由作为默认网关进行拨号与 NAT,导致客户端设备无法获取与光猫相同网段的 IP 地址,进而也就无法登陆光猫的后台管理界面。虽然在日常使用的过程中,光猫的配置几乎是一次性的,其后台管理界面的使用频率很低,但是每次登陆光猫后台都要通过有线或无线(若有)的方式将设备直接与光猫相连也着实麻烦。因此需要通过一些简单的配置,实现桥接模式下,连接软路由的同时可以随时访问光猫后台。 实现原理其实很简单,只要在现有 DHCP 服务端正常工作的前提下,为软路由的 WAN 口再行分配一个与光猫网段相同的 IP 地址即可,前提是你的软路由支持多 WAN。 以 Openwrt 系统为例,在“网络—接口”界面点击“添加新接口”,进入新接口创建页面。 接口名称随意填写,接口协议选择“静态地址”,包括的接口选择当前 WAN 口绑定的物理接口。注意,接口协议尽量不要选择 DHCP,因为桥接模式下的光猫基本都会关闭自身的 DHCP 功能,不会给新接口自动分配 IP 地址,所以此时需要通过“静态地址”协议来手动指定新接口的 IP 地址。完成上述配置后,点击“提交”按钮进入新接口的详细配置页面。 IPv4 地址一定要设置成与光猫位于相同网段的地址。例如光猫连接软路由的 LAN 口的地址(即光猫后台地址)为 192.168.1.1,那么这里新接口的静态 IP 地址就要设置为 192.168.1.x。子网掩码设为 255.255.255.0,默认网关就是光猫 LAN 口的 IP 地址。有关 IP 网段和子网掩码的相关知识,可以参考这篇文章 。完成上述设置后,点击“保存&应用”按钮即可完成配置。 新接口配置完成后,DNS 缓存会有一定延迟,导致无法正常浏览网页,此时重启一下软路由即可解决问题。如果软路由之前配置了端口映射,则新接口创建完成后,所有的端口映射都将失效,此时仍需经过一番针对防火墙的额外设置才能恢复正常。 重新进入新接口的详细设置页面,在“防火墙设置”中,将原先 WAN 口的防火墙区域绑定到新接口。 然后进入“网络—防火墙—端口转发”页面,将原有的端口映射配置重新“保存&应用”一下即可。 至此,如果不出意外的话,我们便可在桥接模式下随时随地访问光猫的后台管理界面了。

2021-05-05 · Mason

利用 Parsec 实现远程游戏串流

最近,我终于放弃了 Steam 或 Epic Games 等平台的买断制游戏模式,转而投靠了 Xbox Game Pass (XGP) 这样的订阅制模式。尽管买断制可以极大地满足“喜加一”式的收集欲,但自从开始实习之后,我已经很难抽出整块的时间来通关各类单机游戏,以致于我的游戏库中屯了大量已购买的但未通关的游戏,这不仅降低了我购买和尝试最新游戏的欲望,也在资金上造成了很大的浪费。不知从什么时候起,玩游戏竟也成了一种待完成的“任务”,失去了工作之余放松心情的初衷。 因此,我纠结许久,终于决定以后不再购买任何单机游戏。如果某段时间我不是那么忙了(例如辞职在家的现在),就去订阅一个月的 XGP,体验一下最新的单机游戏。事实上,Xbox 账户是可以随时切换区域的。因此我们可以简单地通过将 Win10 的系统区域切换成香港的方式来享受港区 XGP 79 港元每月(首月10港币)的优惠价格。在一个单机游戏动辄就要三百块以上的当下,XGP 确实是一种非常合算方案。毕竟,一个月的时间,完全够我通关一个中型单机游戏,而买断这款游戏的价格远远不止 79 港币。 开通了 XGP 之后,我又开始琢磨如何在出差的时候利用“零碎的时间”玩游戏。例如驻场期间每天下班以后,住在酒店里的我只有一台性能羸弱的 MacBook,如何利用现有设备在酒店里玩上 XGP 上的单机游戏呢?其实解决方案只有一个:远程桌面。只要在家里的 PC 上开启网络唤醒功能 ,在将某款远程桌面软件设置成开机自动启动,我就可以在任何地方,通过网络唤醒 + 远程操控的方式随时随地游玩家里电脑上的游戏。 思路虽然很简单,但找到合适的远程桌面软件着实费了我一番工夫。经过仔细的搜索,我发现了一款叫做 Parsec 的远程桌面软件。它不仅同时支持 Windows 和 macOS 双平台,还专门针对远程游戏进行了优化。不仅如此,Parsec 还支持 Hevc 编码 。只要客户端设备支持 Hevc 解码,就能大大降低串流数据体积,减少网络带宽和流量的消耗,提升远程游戏的体验。 Parsec 的使用方式非常简单,只要去官网注册一个账号并分别在服务端(用于运行游戏的设备)和客户端(用于远程操控的设备)下载安装 Parsec 客户端即可。在两台设备上同时安装并登陆软件后,软件界面应该是这样的: 此时只要点击相应设备上的 Connect 按钮即可建立远程连接了。但为了提升我们的游戏体验,在正式使用前还需要进行一些简单的设置。点击左侧的齿轮图标进入设置界面,将客户端设备的“硬件解码”和“Hevc 编码”功能打开即可。 连接成功后,软件会自动将被操控的设备调至静音,而将所有系统声音转到操控的设备上播放,这一细节非常人性化。经测试,在局域网(千兆带宽)环境下,两台设备基本可以实现零延迟的远程控制,但在广域网环境下,由于带宽和延迟的限制,远程控制略有延迟和卡顿,但仍能满足一些对操作要求不是那么高的游戏。例如,我最近正在补完的《歧路旅人》。这是一款“高清马赛克”游戏,且所有战斗均为回合制,非常适合远程游玩。 由于 macOS 原生支持 Xbox 和 switch pro 手柄,同时 Parsec 也能直接识别上述两款手柄的所有按键,因此在远程游戏时,可以直接通过将手柄连接客户端设备的方式来操控服务端的游戏。网络状况较好的时候,远程游戏的体验和本地几乎没有区别。 ...

2021-05-02 · Mason