如何在树莓派上使用 Home Assistant OS 设置 CodeProject.AI 服务器





5.00/5 (12投票s)
在这篇文章中,我将在树莓派 4 上设置 Home Assistant OS,然后使用 CodeProject.AI 服务器来检测一个人,并让 Home Assistant 发送带有图像的通知到手机。
在我之前的文章中,我演示了如何在 Windows 上安装 Home Assistant 容器。在那篇文章中,我讨论了安装 Home Assistant 容器和在 Windows 上安装都不是 Home Assistant 的最佳选择。Home Assistant 的理想设置是在专用的 Linux 设备上。所以这正是我要做的。在这篇文章中,我将在树莓派 4 上设置 Home Assistant OS,然后使用 CodeProject.AI 服务器来检测一个人,并让 Home Assistant 发送带有图像的通知到手机。
- 设置 Miuzei 外壳
- 在树莓派 4 上设置 Home Assistant OS
- 设置 CodeProject.AI 服务器和 Wyze Cam
- 在 Home Assistant OS 上设置 CodeProject.AI 服务器
- 使用 CodeProject.AI 服务器检测一个人并将快照发送到您的手机
我的设置
这个设置有点不寻常。当我开始写这篇文章时,我想把所有东西都放在树莓派上:Home Assistant OS、CodeProject.AI 服务器、Debian、Agent DVR 和 Docker。而且你“几乎”可以做到。问题在于 Home Assistant 的设置。如果你想使用 Home Assistant OS(这是目前最广泛使用的版本),你必须刷新 microSD 卡以安装 Home Assistant 操作系统。然后就没了。你不能在其上安装任何不能作为集成添加到 Home Assistant 的东西。
由于 Home Assistant OS 非常普及,这次我将在我的树莓派 4 上安装 Home Assistant OS。这意味着 CodeProject.AI 服务器将安装在我的 Windows 机器上,我还会运行 Docker Desktop 在我的 Windows 机器上包含 docker-wyze-bridge,这样我就可以使用我的 Wyze Cam v3。我实际上已经写了一部分关于在树莓派上设置 Debian 的文章,对 Pi 进行 CodeProject.AI 服务器的无头安装,在 Pi 上安装 Docker,以及在 Pi 上安装 Agent DVR。这些将分散到未来的文章中。你也可以在树莓派上的 Docker 中运行 CodeProject.AI 服务器,这只是不是最理想的设置。但我会在另一篇文章中演示这一点。我可能还会写一篇关于如何在 Python 虚拟环境中设置 Home Assistant Core 的文章。
但对于这篇文章,我使用的是
- CodeProject.AI 服务器。如果您需要帮助安装 CodeProject.AI 服务器,请参阅我的指南安装 CodeProject.AI 服务器。
- Wyze Cam v3。如果您需要帮助安装 Wyze Cam v3,请参阅我的指南设置您的 Wyze Cam。
- Docker Desktop。如果您需要帮助设置 Docker,请参阅我的指南安装 Docker Desktop。
- 树莓派 4。我使用的是 Model B,四核 64 位(4 GB)。我从Amazon.ca 购买,价格为 270.33 加元。
- Miuzei 树莓派 4 外壳。我从Amazon.ca 购买,价格为 17.00 加元。
- microSD 存储卡 - 您可能有一个相机带有这个,但我没有。我从Amazon 购买,价格为 9 美元。
- microSD 卡读卡器 - 大多数 microSD 卡都附带适配器,但您还需要一个 microSD 卡读卡器,因为您需要向其写入数据。我从Amazon 购买,价格为 8 美元。
- 一根以太网线。
设置 Miuzei 外壳
Miuzei 外壳带有一张小安装说明,但在这篇文章中,我提供了我自己的分步指南。如果您更喜欢视频,Steven Wang 的YouTube 视频相当不错。
为树莓派 4 选择带风扇的外壳的一个原因与任何计算机处理器都有风扇的原因相同——它会发热。选择外壳配件的另一个原因是树莓派 4 没有附带电源,而 Pi 外壳通常会附带。
安装指南的第一步是取下顶部和底部层的保护膜。这实际上跳过了几个步骤。首先,从包装中取出外壳。然后,因为外壳是组装好的,所以从外壳上取下螺丝和垫圈。Miuzei 外壳附带一个小型螺丝刀,以防您没有。每个螺丝底部都有一个垫圈。只需转动螺丝直到垫圈松开,然后您就可以取出螺丝。我实际上用手指按住垫圈同时拧下螺丝,它不是很牢固。
您会注意到外壳是分层的,就像枕头堡垒一样。这些层的顺序实际上很重要,所以在我们继续的过程中尽量记住顺序。下一步是取下顶部和底部层的保护膜。只从堆栈中取下这些层,然后剥掉两面的保护膜并丢弃薄膜。
那个有像脸一样裂缝的部件是底部。现在取下另外两层,并将它们放在底部部件的顶部。您会知道哪一块是下一块,因为它上面粘有泡沫塑料。
现在将树莓派 4 放在这些层中。注意第二层如何为 Pi 提供一个小的平台供其放置。将树莓派放置在 Pi 的 USB 和以太网端口侧朝向外壳的裂缝(我认为是为了通风)。
放上下一层。这一层有点棘手,但只有一种方式可以安装在 Pi 上。如果看起来可以那样安装,那么就是正确的。如果看起来一些塑料会碰到东西,那就是错误的方式。
这是散热器时间。应该有一个小袋子里有四个散热器。大的用于 CPU(那是中间的金属方块,在 Raspberry Pi 标志旁边),RAM(CPU 旁边的黑色矩形),然后两个小的用于以太网控制器和 USB 芯片(端口旁边的两个黑色小方块)。每个散热器背面都有粘合剂。亚马逊的图片比我自己的更具描述性,所以上面显示了。只需剥掉粘合剂,然后按照上面的说明将散热器贴在相应的位置。粘合剂部分实际上非常厚,所以剥掉塑料时要小心。不要撕掉粘合剂。如果您手指粗大,这可能会很棘手。我手指纤细,弹钢琴的手指,贴散热器时都遇到了麻烦。祝您好运。
现在添加下一层。这一层也只有一种正确的安装方式,大孔朝向以太网端口。
下一层是透明的,连接风扇。从小袋子里取出风扇和螺丝。这一层只有一种安装方式,您想将贴有“fan cooling”字样的风扇面朝下。将电线穿过那个圆孔。将螺丝穿过孔,然后一次从底部放入一个垫圈,这会使螺丝稍微弹出一点,然后拧紧螺丝时用手指按住垫圈。
好的,这是连接器时间。这部分有点棘手。这是 Steven Wang 视频的截图。我最喜欢他的图像。注意图像中,树莓派符号是颠倒的。树莓派网站实际上有一个很棒的GPIO 引脚图,如果您想了解这些引脚的含义,但现在,请理解我们将黑色电线放在底部一行从右边数第三个引脚上,这是一个接地引脚,红色电线放在底部一行从右边数第二个引脚上,这是一个 5V 电源。我不太确定如何处理电线本身,一旦您插入了引脚。无论您做什么,电线都会碍事。我试着把它们塞到风扇连接的风扇层下面,但效果不太好。它们很烦人。
现在将另外两层放在堆栈上。它们也只有一种安装方式。
最后,放上顶层,插入螺丝,将垫圈放在底部然后用手拧紧,拧紧螺丝时用手指按住垫圈。最后放置顶层的正确方法是将长方形开口与 GPIO 引脚板对齐,这样您以后就可以轻松地在此处插入其他东西。
搞定!您已经组装好了树莓派 4 的 Miuzei 外壳。您也可以在外壳底部放上那些小凸起——我猜是这样,这样 Pi 就不会滑动或损坏任何表面。但我不这样做,所以我把那些凸起放在一边。
在树莓派 4 上设置 Home Assistant
Home Assistant 有几种安装方式:Home Assistant 操作系统(Home Assistant OS,或 HAOS)、Home Assistant 容器、Home Assistant Supervised 和 Home Assistant Core。在我之前的文章中,我安装了 Home Assistant 容器。我的印象是,使用 Home Assistant 容器和其他 Home Assistant 安装,您可以完成 Home Assistant OS 可以做的所有事情(推荐的安装方法),只是完成您想要的工作可能需要更多步骤。Home Assistant OS 自带 Supervisor,它是一个集成,允许您轻松安装其他插件。这就是树莓派 4 的作用,因为 HAOS 的理想设置是在专用的 Linux 系统上。所以我们开始吧。
一个说明:这不是树莓派 4 上 Home Assistant OS 的最理想硬件设置。理想情况下,您会使用带 USB 3.0 适配器的 SSD,一根不错的 USB-C 转 SATA 线,以及可能更好的树莓派电源,您将获得一个更高效的设置。我只是使用我手头的东西进行演示。
第一步是取出 microSD 卡并将其插回 microSD 读卡器。
然后访问Home Assistant 安装页面,点击Raspberry Pi。
为了将 Home Assistant OS 安装到 Pi 上,我们需要将 OS 映像闪存到 microSD 卡上。一个流行的程序叫做 balena Etcher。访问balena Etcher 页面。我在 Windows 上,所以在“下载 Etcher”资产表中,我点击“Etcher for Windows (x86|x64) (Installer)”。对我来说,这会下载文件balenaEtcher-Setup-1.18.4.exe。右键单击文件并选择以管理员身份运行。
接受许可证,balena Etcher 会自动安装。
点击从 URL 闪存。
回到 Home Assistant 安装页面,向下滚动到“使用 Balena Etcher 写入映像”部分,并复制 Raspberry Pi 4 映像的 URL。对我来说,这是https://github.com/home-assistant/operating-system/releases/download/10.0/haos_rpi4-64-10.0.img.xz,然后将其粘贴到 balena Etcher 中。然后按OK。
balena Etcher 下载映像,然后询问您要将其放在哪里。将 microSD 读卡器插入 PC,然后点击选择目标。对我来说,这是 32 GB microSD。按选择 1。
最后,按Flash!。
balena Etcher 错误 - 注意:出现问题
*叹气*。通往 Home Assistant 的道路并非总是一帆风顺,我的朋友们。我第一次尝试安装 Home Assistant 时,花了一周时间设置虚拟机,以便在“Windows 上”安装 Home Assistant OS。我失败了。在安装 Home Assistant 容器时,我找不到创建 Docker 容器后的haconfig文件夹。现在 balena Etcher 无法将 Home Assistant OS 映像复制到我的 microSD 卡上。
它显示
Attention. Something went wrong. if it is a compressed image,
please check that the archive is no corrupted. Command failed: cmd /c
"C:\Users\AppData\Local\Temp\etcher\balena-etcher-electron-78afb6aee66.cmd"
少数幸运的您可能在设置 Home Assistant 时不会遇到错误或障碍。对于我们其他人来说,请谷歌搜索错误。如果无效,有一些很棒的资源,里面有奇怪的友善且敬业的人会提供帮助。对于 Home Assistant,我使用
- Home Assistant subreddit - 我发现能获得最快最好的帮助。
- Home Assistant 社区论坛 - 很棒的资源。超级知识渊博的人。以我有限的经验来看,响应速度略慢。
我谷歌搜索了这个错误。在 balena 论坛上,我找到了一个 2020 年的长帖子,里面充满了遇到类似/相同问题的人。在我查询的前七天,一位用户回复说他们下载了第一个映像而不是指向 Git URL。让我们试试这个。
将 URL https://github.com/home-assistant/operating-system/releases/download/10.0/haos_rpi4-64-10.0.img.xz 复制到浏览器窗口。它会自动下载。回到 balena Etcher。这次,选择从文件闪存而不是从 URL 闪存。选择自动下载的haos_rpi4-64-10.0.img.xz。
砰!自动成功了。谢谢你,来自 balenaEtcher 论坛的用户 DirkJam。谢谢你。一旦 balena Etcher 显示“闪存完成!”就表示 Home Assistant OS 映像已成功闪存到 microSD 卡上。
快速说一下,在 microSD 卡上安装 Linux OS 后,每当您将 microSD 读卡器插入 PC 时,都会弹出一个 Windows 警告。“您需要在格式化磁盘后才能使用它。”如果您在 Windows 资源管理器中查看驱动器,磁盘大小也将非常不正确。Windows 根本不理解 Linux 文件系统,并且正在崩溃。您可以安全地关闭窗口。
从读卡器中取出 microSD 卡,并将其插入树莓派底部的 microSD 插槽。确保带有 microSD 卡上文字的一面朝上,然后插入。
现在连接以太网线和 Miuzei 外壳附带的适配器。适配器插入 USB-C 端口。您不太可能插错,它不会插到其他地方。打开树莓派。
回到 PC,在浏览器中输入http://homeassistant.local:8123/。
成功!Home Assistant OS 正在准备中。请耐心等待,它说需要 20 分钟,但它从没花那么长时间(除非它没在工作)。
现在是时候设置 Home Assistant OS 了。输入一个名称,该名称也用作用户名。我称我的为“piha”。然后输入密码,并将用户名和密码都保存下来,因为您稍后会需要它们。然后点击创建账户。
在下一个屏幕上,输入您想称呼您的家。我称我的为“Home”。然后输入国家、语言、时区和货币。然后按下一步。
下一个屏幕询问您想共享哪些数据。对我来说,什么都不共享。我按下一步。
现在 Home Assistant 想知道您网络上的哪些设备您想集成。我们稍后可以做到。可能是在另一篇文章中。按完成。
我们首先要做的就是为 Home Assistant 设置一个静态 IP。无论您决定如何为您的 Pi 安装 Home Assistant,设置一个静态 IP 都是一个好主意。Home Assistant 的目的是连接到多个设备和服务,而且很多时候这个连接过程需要一个 IP 地址,因为http://homeassistant.local:8123/ 不会每次都起作用。要为 Home Assistant 设置静态 IP,请转到左侧面板上的设置。然后转到系统。
然后点击网络。
因为我通过以太网连接,所以我正在查看eth0选项卡。如果您使用的是无线连接,您将查看wlan0选项卡。点击IPv4以显示 IPv4 网络接口选项。
点击静态。在这里,您可以在IP 地址/Netmask字段中输入静态 IP 地址。对大多数人来说,这就像192.168.0.001。您可以更改001为您想要的任何数字,但建议选择大于100的数字,以防您的路由器为其他项目选择了较小的数字。
对我来说,我将使用自动弹出的 IP 地址。/24仅表示 IP 地址运行 24 小时。下一个是网关地址字段。对大多数人来说,它就像192.169.0.1。我可以看到 Home Assistant 已经正确输入了这个。我将保持DNS 服务器字段不变,因为 Home Assistant 显然是一个好的猜测者。按保存。
现在关闭选项卡,并在浏览器中输入staticIP:8123,其中staticIP是我们刚刚建立的静态 IP。并使用您的凭据登录。
设置 CodeProject.AI 服务器和 Wyze Cam
在我们将 CodeProject.AI 服务器设置到 Home Assistant OS 之前,我们需要确保 CodeProject.AI 服务器(以及我的情况下的 Wyze Cam v3)已经设置为与 Home Assistant OS 一起使用。正如我在文章开头提到的,在这篇文章中,我将在 Windows 上设置 CodeProject.AI 服务器,然后使用 Docker Desktop 在同一 Windows 机器上运行 docker-wyze-bridge。您可以在树莓派上直接安装 CodeProject.AI 服务器,或者在树莓派上安装 Docker 并在那里运行 CodeProject.AI 服务器和 docker-wyze-bridge 容器,但对于这篇文章,我想使用 Home Assistant OS,这意味着 Home Assistant OS 是我唯一可以安装在树莓派 4 上且不是 Home Assistant 插件或集成的东西。所有东西都在同一个网络上,所以一切都能正常工作。有些服务只是在不同的设备上运行。
安装 CodeProject.AI 服务器、设置 Docker Desktop 和设置 docker-wyze-bridge 都是我在之前的文章中做过的事情。所以在这篇文章中我不会重复。但如果您需要,以下是设置它们的所有链接。
- 如何在 Windows 上安装 CodeProject.AI 服务器
- 如何在 Windows 上安装 Docker Desktop
- 如何为 docker-wyze-bridge 创建 docker-compose.yml 文件
- 使用 Docker Compose 设置 docker-wyze-bridge
在下一节我们将在 HAOS 上设置 CodeProject.AI 服务器时,所有这些项目都需要在某个时候开启并运行,所以不妨现在就开始运行它们。
在 Home Assistant OS 上设置 CodeProject.AI 服务器
我们首先需要做一个快速步骤,那就是在 Home Assistant 中设置我的 Wyze Cam v3。在上一节中,我在我的 Windows 机器上创建了一个用于 docker-wyze-bridge 的容器,这就是如何将 Wyze Cam 用于任何版本的 Home Assistant。显然,如果您没有 Wyze Cam,您就不需要做这些。但我确实有 Wyze Cam,所以开始吧。
转到设置 -> 设备与服务 -> + 添加集成。
开始输入“camera”,然后选择通用摄像头。
现在回到 docker-wyze-bridge 选项卡。将鼠标悬停在RTSP上,右键单击,然后复制链接。它应该看起来像rtsp://ipaddress:8554/cameraname。这就是您在 Home Assistant 中需要的流源字段。
现在回到 docker-wyze-bridge 选项卡。点击摄像头详细信息图标。
向下滚动到snapshot_url。您应该看到snapshot/cameraname.jpg。但这只是 URL 的末尾。它实际上应该是http://ipaddress:5001/snapshot/cameraname.jpg。这就是您在 Home Assistant 中需要的静态图像字段。
回到 Home Assistant 选项卡。这就是您的最终通用摄像头设置。对于RTSP 传输协议,选择TCP。对于身份验证,选择基本。在用户名下,输入您为 Wyze Cam 本身创建的用户名,而不是您的 Wyze 电子邮件帐户,然后对于密码输入相同的密码。取消选中验证 SSL 证书。按提交。
如果一切顺利,会出现一个预览,询问图像是否看起来不错。勾选框,按提交,然后按完成。
现在点击 Home Assistant 设置左侧的概述,瞧,Wyze Cam v3 已添加到 Home Assistant OS。这很重要,要先做,因为稍后我们需要摄像头实体来设置 CodeProject.AI 服务器。所以让我们开始在 Home Assistant OS 上设置 CodeProject.AI 服务器。
CodeProject.AI 服务器在 Home Assistant 中作为自定义存储库可用。为了将自定义存储库添加到 Home Assistant,您需要 Home Assistant 社区商店 (HACS)。但是,当您安装 Home Assistant OS 时(与 Home Assistant 容器或 Home Assistant Core 不同),添加 HACS 并不容易,因为您没有命令行。所以为了让 CodeProject.AI 服务器作为自定义存储库工作,我们需要安装一个 SSH 插件,对其进行配置,然后访问 SSH 命令行,然后运行 HACS 下载脚本。
这些额外的步骤来在 Home Assistant OS 上获取 Home Assistant 社区商店是很有趣的,因为安装 HAOS 的原因之一就是 Supervisor 和插件商店使大多数事情更容易。
第一步是转到插件商店。在设置下,点击插件。然后点击右下角的插件商店按钮。
在搜索栏中,输入“ssh”。然后选择SSH & Web Terminal。
然后按安装。
一旦显示屏发生变化以显示设置选项,就表示已安装。然后点击顶部的配置选项卡。
This add-on does not expose configuration for you to mess with...
当我第一次点击这个时,我收到一个错误:“此插件不公开供您随意更改的配置…”如果发生这种情况,请刷新您的浏览器选项卡。
在username
中,输入您用于 Home Assistant 的用户名。对我来说,这是piha
。然后删除password
字段中的引号,并输入 Home Assistant 的密码。您也可以生成一个 SSH 密钥并将其放入authorized_keys
字段,但我这里不这样做。如果有人需要这方面的帮助,请在下面的评论中告诉我。按保存。然后点击日志选项卡,然后按刷新。
现在回到信息选项卡并按开始。如果有效,将显示主机名、CPU 和 RAM 使用情况。
从这里,您可以点击打开 Web UI打开终端,或者如果显示在侧边栏已打开(对我来说是这样),您可以点击左侧导航菜单中的终端。我点击终端。终于。我们到达了命令行。
wget -O - https://get.hacs.xyz | bash -
现在是时候运行 HACS 下载脚本了。在已打开的终端中,输入wget -O - https://get.hacs.xyz | bash -
,其中 -O 是“O”,如“Open”的“O”,而不是零。
如果一切顺利,HACS 已成功安装。
为了使用它,我们需要重新启动 Home Assistant。所以转到左侧导航窗格中的开发工具,然后点击重启。
出现一个对话框,询问您是想快速重新加载,还是重启 Home Assistant。点击重启 Home Assistant,然后再次点击重启。
从这里,点击设置,然后点击设备与服务。然后点击右下角的按钮+ 添加集成。
现在 Home Assistant 社区商店可以从搜索中找到。输入“HACS”然后选择它。
出现此窗口,要求您确认一系列项目。勾选所有框并按提交。
出现一个等待设备激活的屏幕。确保您已登录 GitHub,然后点击链接https://github.com/login/device并复制激活密钥。
在下一个窗口中,粘贴激活密钥。
然后点击授权 hacs。
好了!HACS 应该准备就绪。
回到 Home Assistant 选项卡,您应该会看到一个成功屏幕。选择您要为 HACS 使用的区域。我唯一的摄像头在我的办公室,所以我添加了一个名为“Office”的区域,然后按完成。
现在我们需要再次重启 Home Assistant。转到左侧导航窗格中的开发工具,然后点击重启。然后点击重启 Home Assistant,并再次点击重启。
现在我们可以最终将 CodeProject.AI 服务器集成到 Home Assistant 中了。点击左侧导航中的新HACS选项卡,然后点击集成。
在右上角,点击三个点以展开集成下拉菜单,然后选择自定义存储库。
在存储库字段中,输入CodeProject.AI-HomeAssist-ObjectDetect 存储库的 URL,即https://github.com/codeproject/CodeProject.AI-HomeAssist-ObjectDetect。然后从类别下拉列表中,选择集成。然后点击添加。
现在在 HACS 的集成选项卡下,出现了一个新存储库。那就是我们!点击CodeProject.AI 服务器对象自定义集成。
然后,在右下角,点击下载以安装它。
出现一个对话框,友好地提醒:“请记住,在应用集成(custom_components)的更改之前,您需要重启 Home Assistant。”谢谢 Home Assistant HACS 集成!但不是现在。点击下载以完成存储库的下载和安装。
在我们再次重启 Home Assistant 之前,我们需要 CodeProject.AI 服务器在 Home Assistant 中工作,我们需要文件编辑器插件来编辑configuration.yaml文件。我们将不得不重启 Home Assistant 来使用文件编辑器,所以我们最好节省一次重启。转到左侧导航窗格中的设置,然后选择插件。然后点击右下角的插件商店按钮,并在搜索字段中输入“File Editor”。点击出现的File editor。然后点击安装。
安装完成后,我们现在可以再次重启 Home Assistant。转到左侧导航窗格中的开发工具,然后点击重启。然后点击重启 Home Assistant,并再次点击重启。
现在回到设置 -> 插件 -> 插件商店,然后从列表中选择File editor,或者如果您看不到它,请在搜索字段中输入。确保启动时启动和显示在侧边栏已打开,然后点击左侧窗格中的File Editor。
首先,点击文件夹图标,即浏览文件系统按钮。既然我们在这里,在编辑configuration.yaml文件之前,我们需要创建一个www文件夹,这是我们存储快照的地方,我们将使用这些快照在检测到人时发送到我们手机上的 Home Assistant 应用。
要做到这一点,请点击新建文件夹按钮。
将新文件夹名称输入“www”,然后按OK。现在选择configuration.yaml。
# Loads default set of integrations. Do not remove.
default_config:
# Load frontend themes from the themes folder
frontend:
themes: !include_dir_merge_named themes
# Text to speech
tts:
- platform: google_translate
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
这是 Home Assistant 的默认configuration.yaml。为了在 Home Assistant 中设置 CodeProject.AI 服务器,我们需要向此文件添加内容。以下是我们想要添加到configuration.yaml的添加项。
image_processing:
- platform: codeproject_ai_object
ip_address: localhost
port: 32168
# custom_model: mask
# confidence: 80
save_file_folder: /config/www/
save_file_format: png
save_timestamped_file: True
always_save_latest_file: True
scale: 0.75
# roi_x_min: 0.35
roi_x_max: 0.8
#roi_y_min: 0.4
roi_y_max: 0.8
crop_to_roi: True
targets:
- target: person
- target: vehicle
confidence: 60
- target: car
confidence: 40
source:
- entity_id: camera.local_file
关于这一点有几点说明。首先,您会注意到ip_address
设置为localhost
。这可能会奏效,但我对此表示怀疑。Home Assistant OS 运行在自己的静态 IP 上,我们之前已经确定了。它可能默认使用该静态 IP,但我们需要ip_address
是我们的路由器使用的 IPv4 地址。如果您不知道您的 IP 地址,请转到 Windows 中的开始按钮并开始输入“CMD”,然后选择命令提示符。然后,输入ipconfig
。您想要的地址是 IPv4 地址。接下来,您需要更改entity_id
为您的摄像头的实体。我将向您展示如何做到这一点。最后,传统上save_file_folder: /config/www/
应该是save_file_folder: /config/snapshots/
。但稍后在文章中,我们将从摄像头发送快照到手机,而www是使图像可供互联网访问所需的文件夹,所以我们不妨现在省去一步。
这就是为什么我们在本节开始时将 Wyze Cam 添加到 Home Assistant OS。回到浏览器中的 Home Assistant 选项卡。然后转到设置,设备与服务,然后找到您的通用摄像头。点击实体链接。对我来说,这显示1 个实体。
您的摄像头实体 ID 列在实体 ID下。对我来说,这是camera.
然后是我的 IP 地址的某种变体,所以是camera.ipaddress
。复制此值,回到 Visual Studio Code 并将其粘贴到configuration.yaml中,替换camera.local_file
。
因此,了解了所有这些之后,请确保ip_address
和entity_id
在configuration.yaml中已更新,然后按保存按钮。
现在我们需要再次重启 Home Assistant。转到左侧导航窗格中的开发工具,然后点击重启。然后点击重启 Home Assistant,并再次点击重启。
好了!除了设置 Home Assistant Companion(Home Assistant 手机应用)之外,我们已经完成了在 Home Assistant 中设置 CodeProject.AI 服务器并准备好检测人以及在检测到人时发送通知和图像到手机所需的一切。
使用 CodeProject.AI 服务器检测一个人并将快照发送到您的手机
既然我们已经在 Home Assistant OS 上设置了 CodeProject.AI 服务器,让我们用它来做一个非常实用的应用。在本节中,我们将使用 CodeProject.AI 服务器来检测一个人,然后向 Home Assistant Companion(Home Assistant 手机应用)发送一个包含警报消息和检测到的人的图片的通知。
我实际上已经有一篇文章演示了如何使用 Home Assistant 容器执行此通知,该容器在 Windows 上的 Docker 容器中运行。我创建这篇文章是因为原始版本的文章变得越来越长,而且在我开始写作时,我甚至不确定我是否能检测到一个人,并将图像和通知发送到我的手机。所以我创建了那篇文章来测试这个概念,然后再在这里使用。您可以阅读那篇文章(如果您愿意),但我将复制相关的图像和文本在这里,所以您不必阅读。
但由于我之前已经写过那篇文章,我不想复制设置手机上 Home Assistant Companion 的部分。也许您已经在手机上设置好了。如果您没有,只需按照该文章中的设置 Home Assistant 手机应用部分进行操作。在我们在这篇文章中对 Home Assistant 所做的一切中,这是最简单的。这个过程的目的是让 Home Assistant OS 能够将您的手机作为一个实体,您可以在 Home Assistant 中将其用作设备和动作。
首先,我们需要在 Home Assistant 中建立codeproject_ai_object服务。我其实不确定我们是否必须这样做。但第一次调用image_processing
服务(这是您用于让 CodeProject.AI 服务器从图像中检测对象的服务)时,targets_found
摘要会返回空白。为了确保我能在手机上收到通知,我想确保image_processing
能正常工作。
要开始这个过程,请打开 CodeProject.AI 服务器(如果您还没有的话),在浏览器中输入https://:32168/。记住,在这个例子中,CodeProject.AI 服务器运行在我的 Windows 机器上。为此,我们真正需要的是对象检测(YOLOv5 6.2),所以我点击其他所有服务旁边的...,然后选择停止。
现在回到 Home Assistant 选项卡,转到开发工具,然后点击服务选项卡。在服务字段中,输入“image”,然后选择图像处理:扫描。然后点击选择实体按钮,并从列表中选择codeproject_ai_object。最后,按调用服务。出现一个小绿色的勾号,表示尝试调用服务已发生。
但唉,当我转到状态选项卡查看image_processing.codeproject_ai_object是否正常工作时,无论我调用多少次服务,都只有targets_found: summary: {}
,没有任何内容。我再次开始排查错误。
socket.gaierror: [Errno -2] 名称无法解析
这是 Home Assistant 的完整日志错误,home-assistant.log,可以在左侧导航窗格中的文件编辑器中找到,就在我们编辑configuration.yaml的同一个地方,通过点击浏览文件系统按钮。
2023-04-28 09:33:30.468 ERROR (MainThread) [homeassistant.helpers.entity] Update for image_processing.codeproject_ai_object_10_0_0 fails
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/urllib3/connection.py", line 174, in _new_conn
conn = connection.create_connection(
File "/usr/local/lib/python3.10/site-packages/urllib3/util/connection.py", line 72, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "/usr/local/lib/python3.10/socket.py", line 955, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name does not resolve
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/codeprojectai/core.py", line 103, in post_image
return requests.post(url, files={"image": image_bytes}, data=data, timeout=timeout)
File "/usr/local/lib/python3.10/site-packages/requests/api.py", line 115, in post
return request("post", url, data=data, json=json, **kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/adapters.py", line 565, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='http', port=80): Max retries exceeded with url: //10.0.0:32168/v1/vision/detection (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f9fd21990>: Failed to establish a new connection: [Errno -2] Name does not resolve'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/config/custom_components/codeproject_ai_object/image_processing.py", line 365, in process_image
predictions = self._cpai_object.detect(image)
File "/usr/local/lib/python3.10/site-packages/codeprojectai/core.py", line 209, in detect
response = process_image(
File "/usr/local/lib/python3.10/site-packages/codeprojectai/core.py", line 122, in process_image
response = post_image(url=url, image_bytes=image_bytes, timeout=timeout, data=data)
File "/usr/local/lib/python3.10/site-packages/codeprojectai/core.py", line 108, in post_image
raise CodeProjectAIException(f"CodeProject.AI Server connection error, check your IP and port: {exc}")
codeprojectai.core.CodeProjectAIException: CodeProject.AI Server connection error, check your IP and port: HTTPConnectionPool(host='http', port=80): Max retries exceeded with url: //10.0.0:32168/v1/vision/detection (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f9fd21990>: Failed to establish a new connection: [Errno -2] Name does not resolve'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 550, in async_update_ha_state
await self.async_device_update()
File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 755, in async_device_update
raise exc
File "/usr/src/homeassistant/homeassistant/components/image_processing/__init__.py", line 193, in async_update
await self.async_process_image(image.content)
File "/usr/src/homeassistant/homeassistant/components/image_processing/__init__.py", line 174, in async_process_image
return await self.hass.async_add_executor_job(self.process_image, image)
File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
File "/config/custom_components/codeproject_ai_object/image_processing.py", line 366, in process_image
except cpai.CodeProjectAIServerException as exc:
AttributeError: module 'codeprojectai.core' has no attribute 'CodeProjectAIServerException'
我开始谷歌搜索。我在Home Assistant subreddit和Home Assistant 社区页面上创建了帖子。没有回应。孤单无助,我将错误发送给了 Matthew。他说:“您可能需要在您的 Windows 机器上打开端口 32168。或者更简单的办法是将 CPAI 配置为在端口 80 上运行。”
因为在我的配置中,CodeProject.AI 服务器运行在我的 Windows 机器上作为一个服务,而不是在树莓派 4 本地运行,我需要打开端口 32168 才能与 Pi 通信。以下是在 Windows 10 上执行此操作的方法。
从 Windows 的开始按钮,选择设置。然后选择更新和安全。然后从左侧导航窗格中选择Windows 安全中心,然后点击打开 Windows 安全中心按钮。然后从左侧导航窗格中选择防火墙和网络保护,然后选择高级设置。点击是以允许应用程序进行更改。现在点击入站规则。
从这里,点击新建规则...。
我们要为端口 32168 创建一个规则,所以选择端口然后按下一步。
确保选择了TCP,然后在特定本地端口中输入“32168”并按下一步。
默认选择是允许连接,这是正确的。按下一步。
网络不是我的强项。我讨厌它,它也讨厌我。我不确定这里的正确选择是什么,适用于哪些网络。我几乎可以肯定它只是专用,这可能是最安全的选择,也是唯一必需的,但我只是想让它工作,所以我勾选了所有这些框并按下一步。
您可以随意命名规则。最好命名一个您以后能识别的名称。我称我的为“CPAI Rule”。按完成。好了!现在 CodeProject.AI 服务器可以从我树莓派 4 上的 Home Assistant OS 调用了。
让我们回到浏览器中的 Home Assistant 选项卡。如果我们点击调用服务。现在点击状态选项卡。如果成功,在属性列中,有targets_found: summary: {}
和all_objects: - person: 68.036
。前几次调用此服务时,摘要是空白的,但您执行的次数越多,它就会显示类似targets_found: - person: 83.589
和summary: person: 1
的内容。它奏效了!
现在是关键时刻了。接下来,我们将设置 Home Assistant,当检测到人时,将快照发送到我的手机。要做到这一点,我们将设置 Home Assistant 称为自动化。自动化将是我们使用 CodeProject.AI 服务器所做一切的基石。自动化是一系列基于触发器(如日期、设备、MQTT 消息、设备状态变化、Webhook 等)的触发器和动作,允许 Home Assistant 创建一个动作,例如关灯。在这种情况下,我们希望 Home Assistant 在 CodeProject.AI 服务器检测到人时触发,然后指示摄像头拍摄快照,该快照随后发送到 Home Assistant 手机应用。
在 Home Assistant 中,回到左侧的设置选项卡,然后点击自动化与场景。然后点击+ 创建自动化。
然后选择创建新自动化。
点击+添加触发器,然后选择事件。
实际上有两种方法可以创建这些自动化。Home Assistant 提供了可视化编辑器,如果用户不喜欢代码,但还有一个选项可以在 YAML 中编辑,如果您右键单击触发器、条件或操作右上角的三个点。或者,您可以单击新建自动化右上角的下拉菜单来在 YAML 中设置整个自动化。不幸的是,要将图像发送到您的手机,我们将不得不在每一步都在 YAML 中编辑。所以点击在 YAML 中编辑。
platform: event
event_type: ""
当您进入 YAML 时,它是空白的,因为我们还没有选择任何东西。这是我们想要输入的
platform: event
event_type: codeproject_ai.object_detected
event_data:
name: person
空格很重要。`name: person`之前是两个空格。不是一个,也不是三个——是两个。如果您不加两个空格,它就不会工作。YAML 非常精确。来自CodeProject.AI-HomeAssist-ObjectDetect GitHub,有关于codeproject_ai.object_detected
在负载中包含的内容的描述。在 YAML 中,我仅仅指出了事件正在寻找一个人,但我们也可以指定object_type
(人、车辆、动物等)、confidence
(CodeProject.AI 服务器对检测的确信度百分比)、save_file
(已保存的标注图像的路径)等等。查看GitHub 页面以获取有关codeproject_ai.object_detected
在其他自动化想法中可用的更多信息。
现在我们需要一些动作。首先,我们需要将 Wyze Cam 的快照保存到 Home Assistant。所以点击+添加动作,然后选择调用服务。
从服务下拉列表中,选择摄像头:拍摄快照。然后从目标字段中,点击选择实体,然后从下拉列表中选择我们用 docker-wyze-bridge 创建的 Wyze Cam 的摄像头实体。最后,在文件名中,输入/config/www/snapshot.jpg。这就是为什么我们之前创建了www文件夹,以便图像可以保存在这里,并可以从您的手机访问。这实际上是唯一可以使用可视化编辑器的触发器/动作。如果您想在 YAML 中实现,它看起来像这样
service: camera.snapshot
data:
filename: /config/www/snapshot.jpg
target:
entity_id: camera.10_0_0
其中entity_id
是我 Wyze Cam v3 的实体 ID,我从上一节的 docker-wyze-bridge 中获得。
最后,我们需要将此快照发送到 Home Assistant Companion,并附带一条消息。所以点击+添加动作,然后选择设备。从设备下拉列表中,选择您的摄像头。对我来说,这是 SM-A536W。然后在消息中输入您希望在检测到人时收到的消息。我想要一些警报性的信息,所以我输入“检测到人!”。然后,在标题下输入当此消息作为推送通知显示在您手机上时,您希望出现的标题。我称我的为“Home Assistant Alert”。
现在我们需要在 YAML 中编辑此动作,所以点击发送通知的下拉菜单,然后选择在 YAML 中编辑。
device_id: 656692a0734a65d3ce3df19b31783698
domain: mobile_app
type: notify
message: Person detected!
title: Home Assistant Alert
data:
image: /local/snapshot.jpg
在title: Home Assistant Alert
下方添加以下两行。同样,在image: /local/snapshot.jpg
之前有两个空格。我们的 Home Assistant 配置文件夹中实际上没有local文件夹,local表示的是www,我们的图像保存在那里。
就这些了!按保存。
Home Assistant 然后提示您命名您的自动化。我称我的为“Person detected”,但您可以随意命名。再次按保存。
最后一个您可能想添加的自动化是,如果您使用像我一样的 Wyze Cam,则触发image_processing
计时。如果您使用 Agent DVR 或 Blue Iris 等软件,摄像头可能一直在扫描图像。但使用我们的 docker-wyze-bridge 设置,摄像头只是在那里闲置。传统上,您会使用摄像头附带的运动传感器实体,并设置image_processing
,在检测到运动时触发图像扫描。但 Wyze Cam 的此设置不包含运动传感器实体,因此我们可以创建一个自动化来按设定的时间间隔运行image_processing
。
点击+ 创建自动化。然后点击+添加触发器。
我不知道您想多久检查一次门口是否有人,所以我任意选择了 30 秒。
现在我们想为image_processing
创建一个动作。点击+添加动作。然后从下拉列表中选择调用服务。然后,从服务下拉列表中,选择图像处理:扫描。然后从目标字段中,点击选择实体,然后从下拉列表中选择codeproject_ai_object_camera_ip_address
。
如果您想在 YAML 中这样做,它看起来像这样
service: image_processing.scan
entity_id: image_processing.codeproject_ai_object_10_0_0
好的,现在我们准备好了。按保存,给您的自动化起个名字,然后再次按保存。如果您创建了这个自动化以每 30 秒扫描一次,只需等待 30 秒。否则,您可以回到开发工具中的服务选项卡来调用图像处理。
转到左侧导航窗格中的文件编辑器,就在我们编辑configuration.yaml的同一个地方,浏览文件系统,然后打开www文件夹中的一个图像,以确保这些快照已保存。看!检测到人了!
现在检查手机。是的!警报就像我们写的一样。
点击小箭头下拉菜单,您会看到一个更大版本的快照。
好了,我们做到了。在这篇文章中,我们在树莓派 4 上设置了 Home Assistant 操作系统,然后将 CodeProject.AI 服务器添加为自定义存储库,并使用它来检测一个人并将通知发送到我们的手机。
CodeProject.AI 服务器还有很多其他的应用我们可以做,也有很多自动化可以设置。这只是我在这篇文章中设想的一个。在未来的文章中,我将演示如何在树莓派 4 上使用 Python 虚拟环境设置 Home Assistant,如何在树莓派上直接设置 CodeProject.AI 服务器进行无头安装,以及在 Docker 容器中设置,我将尝试创建不同的 Home Assistant 自动化。我还写了关于如何在 Windows 上的 Home Assistant 容器中设置 CodeProject.AI 服务器和在 Home Assistant Windows Portable (HassWP) 上设置 CodeProject.AI 服务器的文章。
但由于 Home Assistant OS 是 Home Assistant 最受欢迎的设置,我想在这上面演示如何设置 CodeProject.AI 服务器。我现在做到了。如果您有任何问题,请在下面的评论中提问。