一个可用于将所有可用 HomeKit 数据导出到 InfluxDB 的 Xcode 项目

HomekitDataExporter

HomeKit 是苹果用于管理所有智能家居配件的解决方案。这是一个简单实用程序,旨在存储 HomeKit 设备属性,以便可以轻松地将历史数据显示在图表中。

概述

HomeKit 非常适合集成各种设备,对于任何未得到官方支持的设备,你可能可以使用 HomeBridge 来添加它。使用这些工具,你可以获取各种温度传感器、灯泡、恒温器等数据。但是,没有简单的方法来直观地显示设备属性随时间变化的趋势(即每个房间的温度变化)。

此应用程序尝试通过定期轮询 HomeKit 来检测设备状态,然后将值存储在时序数据库中,以便可以将其可视化,进而提供解决方案。概述的数据库和可视化工具是 InfluxDB 和 Grafana。它们旨在存储和可视化海量数据,因此可以轻松应对单个家庭的需求。

此应用程序是一款 Mac Catalyst 应用程序,需要持续运行。如果你有一台备用的 Mac Mini 或已有一台运行 HomeBridge 的 Mac,那就完美了。

设置后,你可以在本地网络的任何位置访问 Grafana 控制台,还可以浏览你创建的所有仪表板。

一旦将新设备添加到家庭,应用程序应立即检测到它。同样,如果为 HomeKit 中的设备公开了新的数字属性,这些属性将开始显示为标记,无需进行任何更改。

InfluxDB 字段和标记

InfluxDB 将每个测量值作为字段和值存储,并带有相关的标记。标记允许创建过滤器,将具有不同属性的值分组。此应用程序提取其可以获取的每个可用设备的所有属性及其在家庭中的测量值。

示例字段包括:

  • 亮度
  • 色调
  • 当前温度
  • 目标温度

示例标记包括:

  • 家庭
  • 房间
  • 配件类型

安装并运行应用程序后,你可以探索 InfluxDB 或应用程序本身中的这些字段。

设置

安装 InfluxDB 和 Grafana

该应用程序已配置为将数据发送到任何 InfluxDB V2+ 实例。以下步骤指示如何同时为 InfluxDB 和 Grafana 使用 Docker 容器设置此应用

  1. 安装 Docker
  2. 安装 Homebrew —— 虽然不必非要这样做,但 Homebrew 使软件包管理变得更加简单。
  3. 打开一个终端并使用新安装的 Homebrew 安装 docker-compose —— brew install docker-compose
  4. 要运行 docker-compose,终端的路径上需要有许多 docker 可执行文件。它们可能位于以下位置: 1.- Apple Silicon /Applications/Docker.app/Contents/Resources/bin/ 1.- Intel Mac ~/.docker/bin/
  5. 要将该位置添加到终端的路径,只需运行 export PATH=$PATH:~/.docker/bin/(使用相应的位置)。
  6. 下载 docker-statsd-influxdb-grafana git 项目。如果你不经常使用 git,只需下载该项目的 zip 存档。
  7. 在终端中导航至“docker-statsd-influxdb-grafana”项目的根目录。
  8. 运行 COMPOSE_PROFILES=grafana docker-compose up -d 以启动容器。

配置 InfluxDB

InfluxDB 容器中的默认参数应该能正常工作。但是,如果你想要更改任何内容,你可以在 http://localhost:8086/ 上从任何浏览器访问 InfluxDB。默认用户名为 admin,密码为 admin123456

配置 Grafana

Grafana 应预先配置为将 InfluxDB 实例作为数据源。要访问 Grafana 实例,请从任何浏览器访问 http://localhost:3000。默认用户名为 admin,密码为 admin

构建应用程序

该应用程序尚未打包到 App Store 上分发。这样可以节省每年的 Apple 开发者订阅费。但是,很遗憾,这意味着任何想要运行该项目的人都需要自己构建。构建后,只能在 Xcode 内运行该项目。

  1. 在将运行该应用程序的计算机上下载 Xcode。可以在 Apple Appstore 上找到 Xcode。
  2. 打开 Xcode,当询问时选择安装 iOS 17 资源
  3. 你需要一个个人证书来对应用程序进行签名。 1.1. 转到“设置/帐户” 1.1. 你的 Apple ID 应已列出,或者你可以通过单击底部角落的 + 来添加它。 1.1. 选择 管理证书 并添加新开发者证书。 1.1. 你应该会看到“姓 名字(个人团队)”列出 1.1. 关闭设置并返回项目
  4. 单击项目导航器中的 HomekitDataExporter 以打开项目设置。
  5. 打开 签名与功能 标签
  6. 对于 团队,选择“姓 名字(个人团队)”
  7. 现在使用 Xcode 窗口顶部的播放按钮构建并运行该项目。如果没有预先选择,目标应该是“我的 Mac (Mac Catalyst)“
  8. 如果一切顺利,应用程序窗口应该会打开

使用应用程序

该应用程序的用户界面有点粗糙,但你可能不需要花太多时间去研究它。只有两个标签页:

  • Influx 导出设置
  • 家庭资源管理器

家庭资源管理器

“家庭资源管理器”允许你浏览设备和设备测量值,这些将导出到 InfluxDB。对于每个单独的测量值,你应该会看到测量值的当前值以及所有获得的与该测量值关联的标记和值。

Influx 导出设置

此标签页允许设置 InfluxDB 连接。如果你使用的是默认属性,则设置如下:

  • 存储桶 mybucket
  • 组织 myorganization
  • 令牌 myadmintoken
  • 网址 http://localhost:8086

添加这些内容后,单击 测试连接。结果将显示 成功 或列出的错误消息。

如果连接成功,应用程序将继续每 5 分钟向数据库发送 HomeKit 测量值。这些设置存储在本地,因此应该始终在应用程序重新启动之间维护。在任何重新启动的情况下,只要存在这些设置,应用程序将自动开始连接。

第一个图表

Grafana 是一个非常强大的可视化工具。如果你是第一次使用它,网上有很多不错的教程。在 Grafana 中创建图表时,你将使用 Flux 语言来定义查询。这是一个查询示例,用于绘制家庭中的所有恒温器和温度传感器:

from(bucket: "mybucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_field"] == "Current Temperature") |> drop(columns: ["_field", "Accessory", "AccessoryId", "AccessoryType", "Firmware Version", "Home", "Model", "Serial Number", "Manufacturer", "Room", "ServiceType"]) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean")

drop(columns: 行删除所有不必要的列,因此图表中的标签清晰简洁。

你可能想要使用 InfluxDB 控制台中的数据资源管理器,而不是从头创建查询。从那里,你可以导出查询,然后只需在 Grafana 中根据需要对其进行