65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 Windows 上安装 Home Assistant Container 并发布 MQTT 消息

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2023 年 2 月 1 日

CPOL

17分钟阅读

viewsIcon

21292

在本文中,我将向您展示如何在 Windows 上使用 Docker 和 Portainer 安装 Home Assistant 容器,使其与 Agent DVR 配合使用,并使用 CodeProject.AI Server 从 Agent DVR 发送 MQTT 消息以检测到人。

简介 - 安装 Home Assistant 的多种方式

在 Windows 上安装 Home Assistant 的方式有很多种。您可以将其安装在虚拟机中(通过 VirtualBox、VMware、Linux KVM 或 Hyper-V),也可以通过 Windows Subsystem for Linux (WSL) 进行安装,或者将其安装在 Docker 容器中。

当我开始这个过程时,我开始使用 VirtualBox 进行安装,但无法为 Home Assistant 获取 IP 地址,也无法将其连接到互联网。一些非常友善、非常有耐心的朋友 **花了好几天** 来帮助我,但最终问题变成了我的网卡是否支持混杂模式?我给制造商发了邮件询问——我还在等回复。

我尝试安装 Wireshark 来强制我的网卡使用混杂模式,但没有成功。我尝试使用 VMware 设置 Home Assistant,但遇到了同样的问题;当我创建虚拟机时,Home Assistant CLI 没有生成 IP 地址。除非您是网络管理员,或者在网络方面有丰富的经验,否则我不建议尝试在 Windows 上使用虚拟机安装 Home Assistant。

这促使我安装 Home Assistant 容器,使用 Docker 和 Portainer。我也不认为这是理想的设置。如果您刚开始接触 Home Assistant,并且不是技术人员,这可能对您来说没有意义,但 Home Assistant 容器不附带 Home Assistant Supervisor,Supervisor 是一个允许您轻松安装附加组件的集成。没有 Supervisor,您可能需要安装单独的容器,并尝试弄清楚如何通过 SSH 命令行访问它们/Home Assistant 容器。我承认,我还没有弄清楚这一点。

我有点想把 Home Assistant 能安装的每一种方式都成功安装一遍,来向您展示如何操作,但我不知道我是否这么恨自己。我怀疑使用 WSL 安装 Home Assistant 可能是最理想的设置,所以我可能会在下一步尝试。

但是,在本文中,我将向您展示如何在 Windows 上使用 Docker 和 Portainer 安装 Home Assistant 容器,使其与 Agent DVR 配合使用,并使用 CodeProject.AI Server 从 Agent DVR 发送 MQTT 消息以检测到人。

我的设置

在本文中,我正在使用

我们使用的工具以及它们如何协同工作

本文中使用了许多工具。这可能看起来有点令人困惑,但这是所有工具协同工作的基本布局。

  • Docker 包含我们 Home Assistant 所需的一切。它允许我们创建一个 Portainer 容器,并通过 Portainer 创建 Home Assistant 容器,以及创建一个 Eclipse Mosquitto 容器。
  • Portainer 帮助管理和创建容器系统。在这里,我们使用它来创建 Home Assistant 容器。
  • Home Assistant 容器。这是 Home Assistant 的容器化版本。我们在这里的其他所有内容都在某种程度上是为了与 Home Assistant 进行交互。
  • Mosquitto Eclipse。这是一个 MQTT Broker,我们将其包装在容器中,以便我们可以从 Agent DVR 发送 MQTT 消息到 Home Assistant。
  • Agent DVR 是摄像头安全软件,它让我们能够方便地将 Wyze 摄像头与 Home Assistant 一起使用,并且它还与 CodeProject.AI Server 集成以进行对象检测。Agent DVR 还允许我们创建一个操作,将 MQTT 消息发送到 Home Assistant。
  • CodeProject.AI Server 负责 AI 检测。在这里,我们使用 CodeProject.AI Server 检测到人,并通过 Agent DVR 将此检测作为 MQTT 消息发送到 Home Assistant。

设置 Portainer

当我开始研究安装 Home Assistant 容器时,我错误地认为所有内容都必须通过 Portainer 安装,但这个假设是错误的。尽管如此,Portainer 是一个常用的工具,用于安装 Home Assistant。如果您正在安装 Home Assistant 容器,我猜测一个可能的原因是您不想从命令行安装所有东西。Portainer 提供了许多功能来避免使用命令行,并且是一个很好的可视化界面,可以查看容器内部和外部,检查 YAML 文件的格式,或者如果您正在使用 Docker Compose,可以将内容复制到“堆栈”页面。那么,让我们开始吧。

在 Windows 上转到 **开始** 按钮并开始输入“PowerShell”。点击 **Windows PowerShell**。输入以下命令:

docker volume create portainer_data

这会创建一个用于 Portainer 的卷,用于存储其数据库。接下来,运行:

docker run -d -p 9443:9443 --name portainer 
--restart=always -v /var/run/docker.sock:/var/run/docker.sock 
-v portainer_data:/data portainer/portainer-ce:latest

这将在 Windows Subsystem for Linux (WSL) 上安装 Portainer。

现在,在您的浏览器中输入 *https://:9443/*。您也可以(也可能必须)使用 *https://your_ip_address:9443*。如果您不知道您的 IP 地址,请转到 Windows 的 **开始** 按钮并开始键入“CMD”,然后选择 **命令提示符**。然后,输入 ipconfig。您需要的地址是 IPv4 地址。

一个令人担忧的警告。我想说,“别担心。”如果您真的想这样做,以后可以安装 SSL 证书,但我在这里不介绍。点击 **返回**,然后点击 **高级...**,然后点击 **接受风险并继续**。

现在是时候为 Portainer 创建用户名和密码了。我将 **用户名** 保留为 admin。输入一个至少十二个字符长的密码,并确保将其保存在某个地方。点击 **创建用户**。

这实际上让我不得不重新启动服务,然后重新输入密码,但之后,我进入了 Portainer.io 主页。

点击 **开始**。

然后点击 **local** 以进入我们的 Portainer 容器。

设置 Home Assistant 容器

现在是时候使用 Portainer 安装 Home Assistant 容器了。

点击左侧的 **Volumes**(卷)选项卡。然后点击 **+ Add Volume**(添加卷)。

这与我们在 Windows PowerShell 中刚做的事情类似。在 **Name**(名称)字段中,输入类似“homeassistant_data”的内容,然后点击 **Create the volume**(创建卷)。

接下来,点击左侧面板上的 **Containers**(容器)选项卡,这将带您到容器页面。这里 Portainer 容器正在正常运行。点击 **+ Add Container**(添加容器)。

在 **Name**(名称)字段中给容器起一个名字。我认为“homeassistant”是个不错的名字。然后,在 **Image**(镜像)字段中,输入“homeassistant/home-assistant:latest”。接下来,点击 **+ publish a new network port**(发布新网络端口),并在 **host**(主机)和 **container**(容器)字段中都输入“8123”。

**Image**(镜像)字段旁边有一个非常方便的搜索按钮,可以搜索 Docker Hub 中的所有可用镜像、扩展和插件。找到您想要的镜像后,粗体显示的标题就是您在 Portainer 的 **Image**(镜像)字段中需要输入的内容。

现在是时候进入 **Advanced container settings**(高级容器设置)了。首先,点击 **Volumes**(卷)标题,然后点击 **+ map additional volume**(映射额外卷)。在 **container**(容器)字段中,输入 **/config**,然后在 **volume**(卷)下拉列表中,选择我们刚刚创建的 homeassistant_data 卷。

然后点击 **Env**(环境变量)选项卡,点击 **+ Add an environment variable**(添加环境变量)。在 **name**(名称)字段中输入“TZ”,然后在 **value**(值)字段中输入您的国家/时区。我尝试输入“Canada/Edmonton”,但它被保存为“America/Edmonton”,所以我将把它放在 **value**(值)字段中。

我们需要下一个选项卡是 **Restart policy**(重启策略)选项卡。在这里简单点击 **Always**(始终)。

最后,点击 **Runtime and Resources**(运行时和资源)选项卡,并将 **Privileged mode**(特权模式)切换到开启状态。现在向上滚动并点击 **Deploy the container**(部署容器)。

如果输入一切正确,会有一个小弹出窗口显示“Success Container successfully created”(成功 容器已成功创建),并且 Home Assistant 容器现在运行并显示在容器列表中。

您可能会注意到这与可视化版本的 docker 命令拉取 Home Assistant 非常相似。如果您要运行 docker 命令来执行此操作,它看起来会像这样:

docker run -d --name homeassistant --privileged 
--restart=unless-stopped -e TZ=MY_TIME_ZONE 
-v /PATH_TO_YOUR_CONFIG:/config -p 8123:8123 home-assistant/home-assistant:stable

其中 MY_TIME_ZONE 是您的时区(对我来说是 America/Edmonton),PATH_TO_YOUR_CONFIG 是您在计算机上创建的一个空文件夹的路径。但您可以看到此行中的每个元素都与我们在 Portainer 中刚刚完成的操作相匹配:容器名称、特权模式、重启策略、主机和容器端口以及镜像。您可以跳过设置 Portainer 并这样安装它,这只是一个不同的过程。

好了,让我们登录 Home Assistant。在浏览器中输入 *https://:8123*。这是我在尝试从虚拟机安装 Home Assistant 时 **几天** 都无法看到的屏幕,所以当我看到这个屏幕时,我有点兴奋。

输入您的 **Name**(姓名)(它会自动以小写字母开始输入为 **Username**(用户名)),然后选择一个密码。务必将此密码写下来,您将经常需要它。点击 **Create Account**(创建账户)。

接下来输入 Home Assistant 的更详细信息。您可以给 Home Assistant 起一个名字(我很有创意,叫它“Home”),然后选择国家、语言、时区和货币。点击 **Next**(下一步)。

然后是一个关于共享数据的屏幕。我没兴趣共享,所以点击 **Next**(下一步)。

这个下一页是如果您有物联网设备,它们会显示出来的地方。我这里什么都没显示。点击 **Finish**(完成)。

就是这样。这是 Home Assistant 容器概述页面。它难道不美吗?让我们添加我们的 Wyze 摄像头和 Agent DVR。首先,启动 Agent DVR。在浏览器中输入 *https://:8090/*。

回到 Home Assistant,点击左侧的 **Settings**(设置)选项卡。然后点击 **Devices & Services**(设备与服务)。

在此处,点击 **+ Add Integration**(添加集成)。

开始输入“Agent”,然后选择 **Agent DVR**。

这里,对于 **Host**(主机),您需要输入您的 IP 地址。如果您不知道您的 IP 地址,请转到 Windows 的 **开始** 按钮并开始键入“CMD”,然后选择 **命令提示符**。然后,输入 ipconfig。您需要的地址是 IPv4 地址。将 **Port**(端口)保留为 8090,然后点击 **Submit**(提交)。

当您集成 Agent DVR 到 Home Assistant 时,它会附带两个实体(取决于您的摄像头设置)。第一个是报警面板。我想如果您将其与 Agent DVR 集成,您可以使用它来布防。对我来说,它只是我办公室的一个摄像头,所以我点击下拉菜单,选择 **Add new area**(添加新区域),输入“Office”(办公室),然后点击 **Add**(添加)。我为报警面板和摄像头(我称我的摄像头为 Eye Spy)都选择了 Office,然后点击 **Finish**(完成)。

现在如果您回到 **Overview**(概览),瞧!我在这儿。

设置 MQTT Broker - Eclipse Mosquitto

现在让我们设置我们的 MQTT Broker。我实际上尝试使用 Portainer 设置 Mosquitto,但在尝试这样做时,我无法在 Home Assistant 容器中成功设置 Mosquitto。我收到一个错误:“Address not available”(地址不可用)。

有几种方法可以解决此错误。如果您确实使用 Portainer 安装了 Mosquitto,您可以通过 Portainer 进入 Mosquitto 的命令行并修改 mosquitto.conf 文件,将 listener 改为 1883,将 persistance 设置为 true,并将 allow_anonymous 设置为 true。但我没有走这条路。相反,我使用了一个使用了无身份验证配置的 Docker 命令来安装 Mosquitto。

打开 Windows PowerShell,然后输入:

docker run -it --name mosquitto 
-p 1883:1883 eclipse-mosquitto:2.0.15 mosquitto -c /mosquitto-no-auth.conf

需要注意的是,在您阅读本文时,Mosquitto 的版本是 2.0.15。这就是为什么该行显示 eclipse-mosquitto:2.0.15,但您只需将 2.0.15 替换为您想要的任何 Mosquitto 版本(eclipse-mosquitto:<version>)。

因为我们不是通过 Portainer 安装 Mosquitto,所以最重要的事情是确保此 mosquitto 容器与 Portainer 和 Home Assistant 在同一个网络上。要检查,请返回 Portainer 并转到左侧的 **Containers**(容器)标题。然后点击 **Name**(名称)字段中的 **mosquitto**,然后向下滚动到 **Connected Networks**(连接的网络)。在 **Network**(网络)下方,您可以看到它显示“bridge”。如果我们回到 **Containers**(容器)选项卡并点击 **homeassistant**,然后向下滚动到 **Connected Networks**(连接的网络)部分,我们可以看到 Home Assistant 也位于桥接网络上。

如果您需要为自己的使用安装其他容器,此过程可能会有所帮助。

在 Home Assistant 容器中设置 MQTT

现在让我们回到 Home Assistant。回到 **Settings -> Devices & Services**(设置 -> 设备与服务),然后点击 **+ Add Integration**(添加集成)。然后开始输入 MQTT,然后点击 **MQTT**。

会出现一个对话框,询问您想添加哪个 MQTT 集成。点击普通的 **MQTT**。

在 **Broker**(代理)字段中,输入您的 IP 地址。如果您不知道您的 IP 地址,请转到 Windows 的 **开始** 按钮并开始键入“CMD”,然后选择 **命令提示符**。然后,输入 ipconfig。您需要的地址是 IPv4 地址。端口保留为 1883,然后对于 **Username**(用户名),输入您的 Home Assistant 用户名,对我来说是“seancp”,然后输入 Home Assistant 的密码。然后点击 **Submit**(提交)。会出现一个小的 Success(成功)窗口,然后点击 **Finish**(完成)。

设置 Agent DVR 发送 MQTT 通知到 Home Assistant

现在让我们进行 MQTT 的实际应用。Agent DVR 与 Home Assistant 有出色的集成,所以启动 Agent DVR,在浏览器中输入 *https://:8090/*。

要将 Agent DVR 用于 MQTT 消息,您必须拥有商业许可证。前往 Agent DVR 的订阅页面并选择所需的许可证。为此,我只需要 Basic 计划。点击 **Choose this**(选择此项)。这会将您带到 Agent DVR 标签页。如果您已有账户,请点击 **Login**(登录),如果没有,请点击 **New Account**(新账户)。

然后通过支付方式(如 PayPal)完成支付!您已准备好发送 MQTT 消息。

第一步是在服务器菜单中设置 MQTT。点击左上角的服务器菜单按钮。

然后从 **Configuration**(配置)列中,选择 **Settings**(设置)。

从 **General**(常规)下拉菜单中,选择 **MQTT**。在这里,我们输入所有 MQTT 的设置并确保它已启用。在 **Server**(服务器)下,您需要再次输入您的 IP 地址。如果您不知道您的 IP 地址,请转到 Windows 的 **开始** 按钮并开始键入“CMD”,然后选择 **命令提示符**。然后,输入 ipconfig。您需要的地址是 IPv4 地址。在 **Port**(端口)字段中,您需要输入 1883。然后在 **Username**(用户名)和 **Password**(密码)字段中,您再次需要输入您的 Home Assistant 用户名和密码。点击 **OK**(确定)接受 MQTT 设置,然后再次点击 **OK**(确定)退出服务器设置。

我们将要检测到人,所以让我们确保 Agent DVR 设置为检测到人。

转到摄像头设置。

然后从 **General**(常规)下拉菜单中,选择 **Alerts**(警报)。并确保 **Alerts**(警报)已启用。

现在回到摄像头设置,从 **General**(常规)下拉菜单中,选择 **Detector**(检测器)。我希望检测到人变得非常容易,所以将 **Detector**(检测器)更改为 **Simple**(简单)。简单检测器意味着 AI 检测将在运动时触发。点击 **OK**(确定)。

现在回到摄像头设置,从 **General**(常规)下拉菜单中,选择 **Object Recognition**(对象识别)。确保它已启用,AI 服务器设置为 *https://:32168/*。然后点击 **...** 按钮进入 **Configure**(配置)设置。

确保在 **Find**(查找)字段中显示“person”(人),并将 **Confidence**(置信度)设置为 50。点击 **OK**(确定)接受配置设置,然后再次点击 **OK**(确定)接受对象识别设置。

现在回到摄像头设置,从 **General**(常规)下拉菜单中,选择 **Actions**(操作)。我们实际上要创建两个操作,一个操作是为了确认 Agent DVR 中检测到了人,另一个操作是将 MQTT 通知发送到 Home Assistant。点击 **Add**(添加)。

在 **If**(如果)下拉菜单中,选择 **Object Found**(找到对象)。在 **Then**(则)下拉菜单中,选择 **Trigger Object Recognition**(触发对象识别),这应该会自动选择您的 **Device**(设备),对我来说是我的 Wyze Cam v3,我称之为“Eye Spy”。点击 **OK**(确定)创建操作。

现在来操作,我们设置了这一切来创建。点击 **Add**(添加)以创建另一个操作。在 **If**(如果)下拉菜单中,选择 **Object Found**(找到对象)。在 **Then**(则)下拉菜单中,选择 **MQTT**。接下来的部分很有趣也很重要。在 **Topic**(主题)字段中,您需要输入一个主题和一个子主题。我的主题是“Agent”,我的子主题是“alerts”。您可以随意命名,但请务必记住它们是什么。输入为“Topic/Sub-topic”。所以就我的情况来说是“Agent/alerts”。在 **Post**(发布)字段中,我希望 MQTT 消息包含检测到的内容,所以我输入“{AI}”。点击 **OK**(确定)创建操作。再次点击 **OK**(确定)接受操作设置。

设置 Home Assistant 容器接收 MQTT 消息

现在让我们看看是否可以通过 Agent DVR 使用 CodeProject.AI Server 检测到人,并将 MQTT 消息从 Agent DVR 发送到 Home Assistant。

回到 Home Assistant,在浏览器中输入 *https://:8123* 并输入您的用户名和密码。然后从左侧面板转到 **Settings**(设置)面板,然后点击 **Devices & Services**(设备与服务)。

在这里,我们可以看到我们的 MQTT 集成。点击 **Configure**(配置)。

这里是我们需要 Agent DVR 中的主题和子主题的地方。在 **Topic**(主题)字段中,输入您的 Topic/Sub-topic。对我来说,这是“Agent/alerts”。在 Payload(有效负载)设置中,您可以输入一条消息来测试您的 MQTT Broker 是否可以共享一个数据包。如果您点击 **Publish**(发布),它会进行测试并显示“alert!”。我故意将其保留为“alert!”,以演示 MQTT 消息到来时,它是来自 Agent DVR。现在向下滚动到 **Listen to a topic**(监听一个主题),在 **Topic to subscribe to**(要订阅的主题)字段中输入“Agent/alerts”。

由于我们刚刚配置了这些 MQTT 设置,我们需要在 Home Assistant 中重新加载它。点击 **Developer Tools**(开发者工具),然后在 **YAML** 选项卡中点击 **Manually Configured MQTT Entities**(手动配置的 MQTT 实体)。一个绿色的按钮闪烁,表明 MQTT 实体已重新加载。

现在启动 CodeProject.AI Server,在浏览器中输入 *https://:32168/*。我之前安装了许多模块,如 Face Processing(人脸处理)和 License Plate Reader(车牌识别器),但对于这个,我们真正需要的是 **Object Detection (YOLOv5 6.2)**(对象检测 (YOLOv5 6.2)),所以我点击其他所有服务旁边的 **...**,然后选择 **Stop**(停止)。

现在让我们回到 Agent DVR,看看我们是否能收到检测到人的通知。看!右上角的标签上写着“person”(人)。那是我!

最后,是时候去 Home Assistant 看看我们的 MQTT 操作是否触发了。从 **Settings -> Devices & Services**(设置 -> 设备与服务)菜单中回到 **MQTT settings**(MQTT 设置)页面,然后点击 MQTT 集成的 **Configure**(配置)。点击 **Start Listening**(开始监听)。

正如您所看到的,MQTT 正在输出检测到的 AI 对象,也就是“person”(人)。有一系列消息开始涌入,因为如果您转到 CodeProject.AI Server 的 **Server logs**(服务器日志)

您可以看到每 512 毫秒或更短的时间就会检测到一个对象。

就这样!在本文中,我们已经介绍了如何设置 Portainer,并使用 Portainer 安装 Home Assistant 容器。使用 Home Assistant 容器,我们能够集成 Agent DVR 和 MQTT Broker,并使用 CodeProject.AI 检测到人,并将其作为 MQTT 消息发送到 Home Assistant。结果不尽如人意,但这是一个概念验证。

在没有 Home Assistant Supervisor 及其所有附加组件的情况下使用 Home Assistant 容器是有方法的,只是需要更多的工作。如果出于任何原因您“必须”在 Windows 上使用 Home Assistant 容器进行安装,那么这就是您应该做的方法。理想情况是在专用的 Linux 设备或 Raspberry Pi 上安装 Home Assistant OS。我们稍后会演示这一点。

感谢您的阅读,如果您有任何问题,请随时在下面的文章论坛中提问。

© . All rights reserved.